]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configreader.cpp
Allow for skipping clone checking before DNS is complete.
[user/henk/code/inspircd.git] / src / configreader.cpp
index 32e8966fadfbdcaf02e77adefdc7df3c397a95dc..31287b396c27348cbf5d967e32f05df706d88408 100644 (file)
@@ -23,7 +23,6 @@
 
 
 #include "inspircd.h"
-#include <fstream>
 #include "xline.h"
 #include "listmode.h"
 #include "exitcodes.h"
@@ -50,8 +49,7 @@ static void range(T& value, V min, V max, V def, const char* msg)
 {
        if (value >= (T)min && value <= (T)max)
                return;
-       ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT,
-               "WARNING: %s value of %ld is not between %ld and %ld; set to %ld.",
+       ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "WARNING: %s value of %ld is not between %ld and %ld; set to %ld.",
                msg, (long)value, (long)min, (long)max, (long)def);
        value = def;
 }
@@ -135,8 +133,6 @@ void ServerConfig::CrossCheckOperClassType()
                std::string name = tag->getString("name");
                if (name.empty())
                        throw CoreException("<type:name> is missing from tag at " + tag->getTagLocation());
-               if (!ServerInstance->IsNick(name, Limits.NickMax))
-                       throw CoreException("<type:name> is invalid (value '" + name + "')");
                if (oper_blocks.find(" " + name) != oper_blocks.end())
                        throw CoreException("Duplicate type block with name " + name + " at " + tag->getTagLocation());
 
@@ -313,6 +309,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
                        me->maxchans = tag->getInt("maxchans", me->maxchans);
                        me->maxconnwarn = tag->getBool("maxconnwarn", me->maxconnwarn);
                        me->limit = tag->getInt("limit", me->limit);
+                       me->nouserdns = tag->getBool("nouserdns", me->nouserdns);
 
                        ClassMap::iterator oldMask = oldBlocksByMask.find(typeMask);
                        if (oldMask != oldBlocksByMask.end())
@@ -334,24 +331,25 @@ struct DeprecatedConfig
 {
        /** Tag name. */
        std::string tag;
-       
+
        /** Attribute key. */
        std::string key;
-       
+
        /** Attribute value. */
        std::string value;
-       
+
        /** Reason for deprecation. */
        std::string reason;
 };
 
 static const DeprecatedConfig ChangedConfig[] = {
-       { "bind",   "transport",   "",                 "has been moved to <bind:ssl> as of 2.0" },
-       { "die",    "value",       "",                 "you need to reread your config" },
-       { "link",   "autoconnect", "",                 "2.0+ does not use this attribute - define <autoconnect> tags instead" },
-       { "link",   "transport",   "",                 "has been moved to <link:ssl> as of 2.0" },
-       { "module", "name",        "m_chanprotect.so", "has been replaced with m_customprefix as of 2.2" },
-       { "module", "name",        "m_halfop.so",      "has been replaced with m_customprefix as of 2.2" },
+       { "bind",        "transport",   "",                 "has been moved to <bind:ssl> as of 2.0" },
+       { "die",         "value",       "",                 "you need to reread your config" },
+       { "link",        "autoconnect", "",                 "2.0+ does not use this attribute - define <autoconnect> tags instead" },
+       { "link",        "transport",   "",                 "has been moved to <link:ssl> as of 2.0" },
+       { "module",      "name",        "m_chanprotect.so", "has been replaced with m_customprefix as of 2.2" },
+       { "module",      "name",        "m_halfop.so",      "has been replaced with m_customprefix as of 2.2" },
+       { "performance", "nouserdns",   "",                 "has been moved to <connect:nouserdns> as of 2.2" }
 };
 
 void ServerConfig::Fill()
@@ -369,10 +367,15 @@ void ServerConfig::Fill()
        else
        {
                if (ServerName != ConfValue("server")->getString("name"))
-                       throw CoreException("You must restart to change the server name or SID");
+                       throw CoreException("You must restart to change the server name");
+
                std::string nsid = ConfValue("server")->getString("id");
                if (!nsid.empty() && nsid != sid)
-                       throw CoreException("You must restart to change the server name or SID");
+                       throw CoreException("You must restart to change the server id");
+
+               if (Limits.MaxLine != static_cast<size_t>(ConfValue("limits")->getInt("maxline", 512)))
+                       throw CoreException("You must restart to change the maximum line length");
+
        }
        diepass = ConfValue("power")->getString("diepass");
        restartpass = ConfValue("power")->getString("restartpass");
@@ -384,6 +387,7 @@ void ServerConfig::Fill()
        SuffixPart = options->getString("suffixpart");
        FixedPart = options->getString("fixedpart");
        SoftLimit = ConfValue("performance")->getInt("softlimit", ServerInstance->SE->GetMaxFds());
+       CCOnConnect = ConfValue("performance")->getBool("clonesonconnect", true);
        MaxConn = ConfValue("performance")->getInt("somaxconn", SOMAXCONN);
        MoronBanner = options->getString("moronbanner", "You're banned!");
        ServerDesc = ConfValue("server")->getString("description", "Configure Me");
@@ -425,11 +429,11 @@ void ServerConfig::Fill()
        Limits.MaxKick = ConfValue("limits")->getInt("maxkick", 255);
        Limits.MaxGecos = ConfValue("limits")->getInt("maxgecos", 128);
        Limits.MaxAway = ConfValue("limits")->getInt("maxaway", 200);
+       Limits.MaxLine = ConfValue("limits")->getInt("maxline", 512);
        InvBypassModes = options->getBool("invitebypassmodes", true);
        NoSnoticeStack = options->getBool("nosnoticestack", false);
 
        range(SoftLimit, 10, ServerInstance->SE->GetMaxFds(), ServerInstance->SE->GetMaxFds(), "<performance:softlimit>");
-       range(MaxConn, 0, SOMAXCONN, SOMAXCONN, "<performance:somaxconn>");
        range(MaxTargets, 1, 31, 20, "<security:maxtargets>");
        range(NetBufferSize, 1024, 65534, 10240, "<performance:netbuffersize>");
 
@@ -592,14 +596,14 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
                ServerInstance->BindPorts(pl);
                if (pl.size())
                {
-                       errstr << "Not all your client ports could be bound.\nThe following port(s) failed to bind:\n";
+                       errstr << "Not all your client ports could be bound." << std::endl
+                               << "The following port(s) failed to bind:" << std::endl;
 
                        int j = 1;
                        for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
                        {
-                               char buf[MAXBUF];
-                               snprintf(buf, MAXBUF, "%d.   Address: %s   Reason: %s\n", j, i->first.empty() ? "<all>" : i->first.c_str(), i->second.c_str());
-                               errstr << buf;
+                               errstr << j << ".\tAddress: " << (i->first.empty() ? "<all>" : i->first.c_str()) << "\tReason: "
+                                       << i->second << std::endl;
                        }
                }
        }
@@ -607,7 +611,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
        User* user = useruid.empty() ? NULL : ServerInstance->FindNick(useruid);
 
        if (!valid)
-               ServerInstance->Logs->Log("CONFIG",LOG_DEFAULT, "There were errors in your configuration file:");
+               ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "There were errors in your configuration file:");
 
        while (errstr.good())
        {
@@ -689,9 +693,6 @@ void ServerConfig::ApplyModules(User* user)
                }
        }
 
-       if (ConfValue("options")->getBool("allowhalfop") && removed_modules.erase("m_halfop.so") == 0)
-               added_modules.push_back("m_halfop.so");
-
        for (std::set<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
        {
                // Don't remove cmd_*.so, just remove m_*.so
@@ -749,7 +750,7 @@ ConfigTag* ServerConfig::ConfValue(const std::string &tag)
        ConfigTag* rv = found.first->second;
        found.first++;
        if (found.first != found.second)
-               ServerInstance->Logs->Log("CONFIG",LOG_DEFAULT, "Multiple <" + tag + "> tags found; only first will be used "
+               ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "Multiple <" + tag + "> tags found; only first will be used "
                        "(first at " + rv->getTagLocation() + "; second at " + found.first->second->getTagLocation() + ")");
        return rv;
 }
@@ -768,14 +769,31 @@ bool ServerConfig::FileExists(const char* file)
        if ((sb.st_mode & S_IFDIR) > 0)
                return false;
 
-       FILE *input = fopen(file, "r");
-       if (input == NULL)
-               return false;
-       else
+       return !access(file, F_OK);
+}
+
+std::string ServerConfig::Escape(const std::string& str, bool xml)
+{
+       std::string escaped;
+       for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
        {
-               fclose(input);
-               return true;
+               switch (*it)
+               {
+                       case '"':
+                               escaped += xml ? "&quot;" : "\"";
+                               break;
+                       case '&':
+                               escaped += xml ? "&amp;" : "&";
+                               break;
+                       case '\\':
+                               escaped += xml ? "\\" : "\\\\";
+                               break;
+                       default:
+                               escaped += *it;
+                               break;
+               }
        }
+       return escaped;
 }
 
 const char* ServerConfig::CleanFilename(const char* name)
@@ -785,11 +803,6 @@ const char* ServerConfig::CleanFilename(const char* name)
        return (p != name ? ++p : p);
 }
 
-const std::string& ServerConfig::GetSID()
-{
-       return sid;
-}
-
 void ConfigReaderThread::Run()
 {
        Config->Read();
@@ -799,7 +812,7 @@ void ConfigReaderThread::Run()
 void ConfigReaderThread::Finish()
 {
        ServerConfig* old = ServerInstance->Config;
-       ServerInstance->Logs->Log("CONFIG",LOG_DEBUG,"Switching to new configuration...");
+       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Switching to new configuration...");
        ServerInstance->Config = this->Config;
        Config->Apply(old, TheUserUID);