]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configreader.cpp
Fix weird typemask logic in the connect class reader.
[user/henk/code/inspircd.git] / src / configreader.cpp
index a43a9d78cd2f8a4e8c7ede9a13ac208d873dcb9d..2cd17e844bcd0b62e7f42281395ac1fd1f0d8461 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
  *   Copyright (C) 2013-2016 Attila Molnar <attilamolnar@hush.com>
- *   Copyright (C) 2013-2014, 2016-2019 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013-2014, 2016-2021 Sadie Powell <sadie@witchery.services>
  *   Copyright (C) 2013 Daniel Vassdal <shutter@canternet.org>
  *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2012 Justin Crawford <Justasic@Gmail.com>
@@ -15,6 +15,7 @@
  *   Copyright (C) 2007-2010 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
  *   Copyright (C) 2006-2008 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2006 Oliver Lupton <om@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 #include <iostream>
 
 ServerLimits::ServerLimits(ConfigTag* tag)
-       : NickMax(tag->getUInt("maxnick", 30))
-       , ChanMax(tag->getUInt("maxchan", 64))
-       , MaxModes(tag->getUInt("maxmodes", 20))
-       , IdentMax(tag->getUInt("maxident", 10))
-       , MaxQuit(tag->getUInt("maxquit", 255))
-       , MaxTopic(tag->getUInt("maxtopic", 307))
-       , MaxKick(tag->getUInt("maxkick", 255))
-       , MaxReal(tag->getUInt("maxreal", tag->getUInt("maxgecos", 128)))
-       , MaxAway(tag->getUInt("maxaway", 200))
-       , MaxLine(tag->getUInt("maxline", 512))
-       , MaxHost(tag->getUInt("maxhost", 64))
+       : MaxLine(tag->getUInt("maxline", 512, 512))
+       , NickMax(tag->getUInt("maxnick", 30, 1, MaxLine))
+       , ChanMax(tag->getUInt("maxchan", 64, 1, MaxLine))
+       , MaxModes(tag->getUInt("maxmodes", 20, 1))
+       , IdentMax(tag->getUInt("maxident", 10, 1))
+       , MaxQuit(tag->getUInt("maxquit", 255, 0, MaxLine))
+       , MaxTopic(tag->getUInt("maxtopic", 307, 1, MaxLine))
+       , MaxKick(tag->getUInt("maxkick", 255, 1, MaxLine))
+       , MaxReal(tag->getUInt("maxreal", tag->getUInt("maxgecos", 128), 1, MaxLine))
+       , MaxAway(tag->getUInt("maxaway", 200, 1, MaxLine))
+       , MaxHost(tag->getUInt("maxhost", 64, 1, MaxLine))
 {
 }
 
 ServerConfig::ServerPaths::ServerPaths(ConfigTag* tag)
-       : Config(tag->getString("configdir", INSPIRCD_CONFIG_PATH))
-       , Data(tag->getString("datadir", INSPIRCD_DATA_PATH))
-       , Log(tag->getString("logdir", INSPIRCD_LOG_PATH))
-       , Module(tag->getString("moduledir", INSPIRCD_MODULE_PATH))
+       : Config(tag->getString("configdir", INSPIRCD_CONFIG_PATH, 1))
+       , Data(tag->getString("datadir", INSPIRCD_DATA_PATH, 1))
+       , Log(tag->getString("logdir", INSPIRCD_LOG_PATH, 1))
+       , Module(tag->getString("moduledir", INSPIRCD_MODULE_PATH, 1))
+       , Runtime(tag->getString("runtimedir", INSPIRCD_RUNTIME_PATH, 1))
 {
 }
 
@@ -173,22 +175,23 @@ void ServerConfig::CrossCheckOperClassType()
 
 void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
 {
-       typedef std::map<std::string, ConnectClass*> ClassMap;
+       typedef std::map<std::pair<std::string, char>, ConnectClass*> ClassMap;
        ClassMap oldBlocksByMask;
        if (current)
        {
                for(ClassVector::iterator i = current->Classes.begin(); i != current->Classes.end(); ++i)
                {
                        ConnectClass* c = *i;
-                       if (c->name.compare(0, 8, "unnamed-", 8))
+                       switch (c->type)
                        {
-                               oldBlocksByMask["n" + c->name] = c;
-                       }
-                       else if (c->type == CC_ALLOW || c->type == CC_DENY)
-                       {
-                               std::string typeMask = (c->type == CC_ALLOW) ? "a" : "d";
-                               typeMask += c->host;
-                               oldBlocksByMask[typeMask] = c;
+                               case CC_ALLOW:
+                               case CC_DENY:
+                                       oldBlocksByMask[std::make_pair(c->host, c->type)] = c;
+                                       break;
+
+                               case CC_NAMED:
+                                       oldBlocksByMask[std::make_pair(c->name, c->type)] = c;
+                                       break;
                        }
                }
        }
@@ -236,24 +239,17 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
                        }
 
                        std::string name = tag->getString("name");
-                       std::string mask, typeMask;
+                       std::string mask;
                        char type;
 
                        if (tag->readString("allow", mask, false))
-                       {
                                type = CC_ALLOW;
-                               typeMask = 'a' + mask;
-                       }
                        else if (tag->readString("deny", mask, false))
-                       {
                                type = CC_DENY;
-                               typeMask = 'd' + mask;
-                       }
                        else if (!name.empty())
                        {
                                type = CC_NAMED;
                                mask = name;
-                               typeMask = 'n' + mask;
                        }
                        else
                        {
@@ -261,13 +257,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
                        }
 
                        if (name.empty())
-                       {
                                name = "unnamed-" + ConvToStr(i);
-                       }
-                       else
-                       {
-                               typeMask = 'n' + name;
-                       }
 
                        if (names.find(name) != names.end())
                                throw CoreException("Two connect classes with name \"" + name + "\" defined!");
@@ -321,7 +311,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
                                        me->ports.insert(port);
                        }
 
-                       ClassMap::iterator oldMask = oldBlocksByMask.find(typeMask);
+                       ClassMap::iterator oldMask = oldBlocksByMask.find(std::make_pair(me->name, me->type));
                        if (oldMask != oldBlocksByMask.end())
                        {
                                ConnectClass* old = oldMask->second;
@@ -335,7 +325,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
        }
 }
 
-static std::string GetServerName()
+static std::string GetServerHost()
 {
 #ifndef _WIN32
        char hostname[256];
@@ -359,13 +349,13 @@ void ServerConfig::Fill()
        ConfigTag* server = ConfValue("server");
        if (sid.empty())
        {
-               ServerName = server->getString("name", GetServerName(), InspIRCd::IsHost);
+               ServerName = server->getString("name", GetServerHost(), InspIRCd::IsHost);
 
                sid = server->getString("id");
                if (!sid.empty() && !InspIRCd::IsSID(sid))
                        throw CoreException(sid + " is not a valid server ID. A server ID must be 3 characters long, with the first character a digit and the next two characters a digit or letter.");
 
-               CaseMapping = options->getString("casemapping", "rfc1459");
+               CaseMapping = options->getString("casemapping", "rfc1459", 1);
                if (CaseMapping == "ascii")
                        national_case_insensitive_map = ascii_case_insensitive_map;
                else if (CaseMapping == "rfc1459")
@@ -394,8 +384,8 @@ void ServerConfig::Fill()
        MaxConn = ConfValue("performance")->getUInt("somaxconn", SOMAXCONN);
        TimeSkipWarn = ConfValue("performance")->getDuration("timeskipwarn", 2, 0, 30);
        XLineMessage = options->getString("xlinemessage", options->getString("moronbanner", "You're banned!"));
-       ServerDesc = server->getString("description", "Configure Me");
-       Network = server->getString("network", "Network");
+       ServerDesc = server->getString("description", "Configure Me", 1);
+       Network = server->getString("network", "Network", 1);
        NetBufferSize = ConfValue("performance")->getInt("netbuffersize", 10240, 1024, 65534);
        CustomVersion = security->getString("customversion");
        HideBans = security->getBool("hidebans");
@@ -437,7 +427,7 @@ void ServerConfig::Fill()
        ReadXLine(this, "badhost", "host", ServerInstance->XLines->GetFactory("K"));
        ReadXLine(this, "exception", "host", ServerInstance->XLines->GetFactory("E"));
 
-       const std::string restrictbannedusers = options->getString("restrictbannedusers", "yes");
+       const std::string restrictbannedusers = options->getString("restrictbannedusers", "yes", 1);
        if (stdalgo::string::equalsci(restrictbannedusers, "no"))
                RestrictBannedUsers = ServerConfig::BUT_NORMAL;
        else if (stdalgo::string::equalsci(restrictbannedusers, "silent"))
@@ -524,9 +514,9 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
                // On first run, ports are bound later on
                FailedPortList pl;
                ServerInstance->BindPorts(pl);
-               if (pl.size())
+               if (!pl.empty())
                {
-                       std::cout << "Warning! Some of your listener" << (pl.size() == 1 ? "s" : "") << " failed to bind:" << std::endl;
+                       errstr << "Warning! Some of your listener" << (pl.size() == 1 ? "s" : "") << " failed to bind:" << std::endl;
                        for (FailedPortList::const_iterator iter = pl.begin(); iter != pl.end(); ++iter)
                        {
                                const FailedPort& fp = *iter;