X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=8263b8737c6156a1eab556a3e55f8be30d69ddf7;hb=ff3b706b2506d7614bce5e54bc88657bd62ebd4d;hp=b1cc746df06e93821369fde5edd795cf7f753bb3;hpb=a1d46b8bffb1dfce883d0a59b67a86934c260fba;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index b1cc746df..8263b8737 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -29,14 +29,37 @@ #include "configparser.h" #include +ServerLimits::ServerLimits(ConfigTag* tag) + : NickMax(tag->getInt("maxnick", 32)) + , ChanMax(tag->getInt("maxchan", 64)) + , MaxModes(tag->getInt("maxmodes", 20)) + , IdentMax(tag->getInt("maxident", 11)) + , MaxQuit(tag->getInt("maxquit", 255)) + , MaxTopic(tag->getInt("maxtopic", 307)) + , MaxKick(tag->getInt("maxkick", 255)) + , MaxGecos(tag->getInt("maxgecos", 128)) + , MaxAway(tag->getInt("maxaway", 200)) + , MaxLine(tag->getInt("maxline", 512)) + , MaxHost(tag->getInt("maxhost", 64)) +{ +} + +static ConfigTag* CreateEmptyTag() +{ + ConfigItems* items; + return ConfigTag::create("empty", "", 0, items); +} + ServerConfig::ServerConfig() + : EmptyTag(CreateEmptyTag()) + , Limits(EmptyTag) + , NoSnoticeStack(false) { - RawLog = HideBans = HideSplits = UndernetMsgPrefix = false; - WildcardIPv6 = InvBypassModes = true; + RawLog = HideBans = HideSplits = false; + WildcardIPv6 = true; dns_timeout = 5; MaxTargets = 20; NetBufferSize = 10240; - SoftLimit = ServerInstance->SE->GetMaxFds(); MaxConn = SOMAXCONN; MaxChans = 20; OperMaxChans = 30; @@ -44,6 +67,11 @@ ServerConfig::ServerConfig() c_ipv6_range = 128; } +ServerConfig::~ServerConfig() +{ + delete EmptyTag; +} + static void ValidHost(const std::string& p, const std::string& msg) { int num_dots = 0; @@ -70,17 +98,16 @@ bool ServerConfig::ApplyDisabledCommands(const std::string& data) std::string thiscmd; /* Enable everything first */ - for (Commandtable::iterator x = ServerInstance->Parser->cmdlist.begin(); x != ServerInstance->Parser->cmdlist.end(); x++) + const CommandParser::CommandMap& commands = ServerInstance->Parser.GetCommands(); + for (CommandParser::CommandMap::const_iterator x = commands.begin(); x != commands.end(); ++x) x->second->Disable(false); /* Now disable all the ones which the user wants disabled */ while (dcmds >> thiscmd) { - Commandtable::iterator cm = ServerInstance->Parser->cmdlist.find(thiscmd); - if (cm != ServerInstance->Parser->cmdlist.end()) - { - cm->second->Disable(true); - } + Command* handler = ServerInstance->Parser.GetHandler(thiscmd); + if (handler) + handler->Disable(true); } return true; } @@ -176,7 +203,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) for(ClassVector::iterator i = current->Classes.begin(); i != current->Classes.end(); ++i) { ConnectClass* c = *i; - if (c->name.substr(0, 8) != "unnamed-") + if (c->name.compare(0, 8, "unnamed-", 8)) { oldBlocksByMask["n" + c->name] = c; } @@ -193,9 +220,9 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) if (blk_count == 0) { // No connect blocks found; make a trivial default block - std::vector* items; + ConfigItems* items; ConfigTag* tag = ConfigTag::create("connect", "", 0, items); - items->push_back(std::make_pair("allow", "*")); + (*items)["allow"] = "*"; config_data.insert(std::make_pair("connect", tag)); blk_count = 1; } @@ -301,6 +328,14 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) me->limit = tag->getInt("limit", me->limit); me->resolvehostnames = tag->getBool("resolvehostnames", me->resolvehostnames); + std::string ports = tag->getString("port"); + if (!ports.empty()) + { + irc::portparser portrange(ports, false); + while (int port = portrange.GetToken()) + me->ports.insert(port); + } + ClassMap::iterator oldMask = oldBlocksByMask.find(typeMask); if (oldMask != oldBlocksByMask.end()) { @@ -335,12 +370,13 @@ struct DeprecatedConfig static const DeprecatedConfig ChangedConfig[] = { { "bind", "transport", "", "has been moved to as of 2.0" }, { "die", "value", "", "you need to reread your config" }, + { "gnutls", "starttls", "", "has been replaced with m_starttls as of 3.0" }, { "link", "autoconnect", "", "2.0+ does not use this attribute - define tags instead" }, { "link", "transport", "", "has been moved to 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" }, - { "options", "cyclehosts", "", "has been replaced with m_hostcycle as of 2.2" }, - { "performance", "nouserdns", "", "has been moved to as of 2.2" } + { "module", "name", "m_chanprotect.so", "has been replaced with m_customprefix as of 3.0" }, + { "module", "name", "m_halfop.so", "has been replaced with m_customprefix as of 3.0" }, + { "options", "cyclehosts", "", "has been replaced with m_hostcycle as of 3.0" }, + { "performance", "nouserdns", "", "has been moved to as of 3.0" } }; void ServerConfig::Fill() @@ -365,24 +401,12 @@ void ServerConfig::Fill() if (!nsid.empty() && nsid != sid) throw CoreException("You must restart to change the server id"); } - diepass = ConfValue("power")->getString("diepass"); - restartpass = ConfValue("power")->getString("restartpass"); - powerhash = ConfValue("power")->getString("hash"); - PrefixQuit = options->getString("prefixquit"); - SuffixQuit = options->getString("suffixquit"); - FixedQuit = options->getString("fixedquit"); - PrefixPart = options->getString("prefixpart"); - SuffixPart = options->getString("suffixpart"); - FixedPart = options->getString("fixedpart"); - SoftLimit = ConfValue("performance")->getInt("softlimit", ServerInstance->SE->GetMaxFds(), 10, ServerInstance->SE->GetMaxFds()); + SoftLimit = ConfValue("performance")->getInt("softlimit", (SocketEngine::GetMaxFds() > 0 ? SocketEngine::GetMaxFds() : LONG_MAX), 10); CCOnConnect = ConfValue("performance")->getBool("clonesonconnect", true); MaxConn = ConfValue("performance")->getInt("somaxconn", SOMAXCONN); XLineMessage = options->getString("xlinemessage", options->getString("moronbanner", "You're banned!")); ServerDesc = ConfValue("server")->getString("description", "Configure Me"); Network = ConfValue("server")->getString("network", "Network"); - AdminName = ConfValue("admin")->getString("name", ""); - AdminEmail = ConfValue("admin")->getString("email", "null@example.com"); - AdminNick = ConfValue("admin")->getString("nick", "admin"); NetBufferSize = ConfValue("performance")->getInt("netbuffersize", 10240, 1024, 65534); dns_timeout = ConfValue("dns")->getInt("timeout", 5); DisabledCommands = ConfValue("disabled")->getString("commands", ""); @@ -393,45 +417,35 @@ void ServerConfig::Fill() HideBans = security->getBool("hidebans"); HideWhoisServer = security->getString("hidewhois"); HideKillsServer = security->getString("hidekills"); + HideULineKills = security->getBool("hideulinekills"); RestrictBannedUsers = security->getBool("restrictbannedusers", true); GenericOper = security->getBool("genericoper"); SyntaxHints = options->getBool("syntaxhints"); CycleHostsFromUser = options->getBool("cyclehostsfromuser"); - UndernetMsgPrefix = options->getBool("ircumsgprefix"); FullHostInTopic = options->getBool("hostintopic"); MaxTargets = security->getInt("maxtargets", 20, 1, 31); DefaultModes = options->getString("defaultmodes", "not"); PID = ConfValue("pid")->getString("file"); MaxChans = ConfValue("channels")->getInt("users", 20); - OperMaxChans = ConfValue("channels")->getInt("opers", 60); + OperMaxChans = ConfValue("channels")->getInt("opers"); c_ipv4_range = ConfValue("cidr")->getInt("ipv4clone", 32); c_ipv6_range = ConfValue("cidr")->getInt("ipv6clone", 128); - Limits.NickMax = ConfValue("limits")->getInt("maxnick", 32); - Limits.ChanMax = ConfValue("limits")->getInt("maxchan", 64); - Limits.MaxModes = ConfValue("limits")->getInt("maxmodes", 20); - Limits.IdentMax = ConfValue("limits")->getInt("maxident", 11); - Limits.MaxQuit = ConfValue("limits")->getInt("maxquit", 255); - Limits.MaxTopic = ConfValue("limits")->getInt("maxtopic", 307); - 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); - Paths.Config = ConfValue("path")->getString("configdir", CONFIG_PATH); - Paths.Data = ConfValue("path")->getString("datadir", DATA_PATH); - Paths.Log = ConfValue("path")->getString("logdir", LOG_PATH); - Paths.Module = ConfValue("path")->getString("moduledir", MOD_PATH); - InvBypassModes = options->getBool("invitebypassmodes", true); + Limits = ServerLimits(ConfValue("limits")); + Paths.Config = ConfValue("path")->getString("configdir", INSPIRCD_CONFIG_PATH); + Paths.Data = ConfValue("path")->getString("datadir", INSPIRCD_DATA_PATH); + Paths.Log = ConfValue("path")->getString("logdir", INSPIRCD_LOG_PATH); + Paths.Module = ConfValue("path")->getString("moduledir", INSPIRCD_MODULE_PATH); NoSnoticeStack = options->getBool("nosnoticestack", false); if (Network.find(' ') != std::string::npos) throw CoreException(Network + " is not a valid network name. A network name must not contain spaces."); std::string defbind = options->getString("defaultbind"); - if (assign(defbind) == "ipv4") + if (stdalgo::string::equalsci(defbind, "ipv4")) { WildcardIPv6 = false; } - else if (assign(defbind) == "ipv6") + else if (stdalgo::string::equalsci(defbind, "ipv6")) { WildcardIPv6 = true; } @@ -442,20 +456,7 @@ void ServerConfig::Fill() if (socktest < 0) WildcardIPv6 = false; else - ServerInstance->SE->Close(socktest); - } - ConfigTagList tags = ConfTags("uline"); - for(ConfigIter i = tags.first; i != tags.second; ++i) - { - ConfigTag* tag = i->second; - std::string server; - if (!tag->readString("server", server)) - throw CoreException(" tag missing server at " + tag->getTagLocation()); - - if (ServerName == server) - throw CoreException("Servers should not uline themselves (at " + tag->getTagLocation() + ")"); - - ulines[assign(server)] = tag->getBool("silent"); + SocketEngine::Close(socktest); } ReadXLine(this, "badip", "ipmask", ServerInstance->XLines->GetFactory("Z")); @@ -482,11 +483,6 @@ void ServerConfig::Fill() DisabledCModes[*p - 'A'] = 1; } - memset(HideModeLists, 0, sizeof(HideModeLists)); - modes = ConfValue("security")->getString("hidemodes"); - for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) - HideModeLists[(unsigned char) *p] = true; - std::string v = security->getString("announceinvites"); if (v == "ops") @@ -580,14 +576,14 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) // write once here, to try it out and make sure its ok if (valid) - ServerInstance->WritePID(this->PID); + ServerInstance->WritePID(this->PID, !old); ConfigTagList binds = ConfTags("bind"); if (binds.first == binds.second) errstr << "Possible configuration error: you have not defined any blocks." << std::endl << "You will need to do this if you want clients to be able to connect!" << std::endl; - if (old) + if (old && valid) { // On first run, ports are bound later on FailedPortList pl; @@ -609,7 +605,10 @@ 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:"); + Classes.clear(); + } while (errstr.good()) { @@ -622,7 +621,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) std::cout << line << std::endl; // If a user is rehashing, tell them directly if (user) - user->SendText(":%s NOTICE %s :*** %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), line.c_str()); + user->WriteRemoteNotice(InspIRCd::Format("*** %s", line.c_str())); // Also tell opers ServerInstance->SNO->WriteGlobalSno('a', line); } @@ -636,11 +635,11 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) ConfigTag *tag = (*it)->config; // Make sure our connection class allows motd colors if(!tag->getBool("allowmotdcolors")) - continue; + continue; ConfigFileCache::iterator file = this->Files.find(tag->getString("motd", "motd")); if (file != this->Files.end()) - InspIRCd::ProcessColors(file->second); + InspIRCd::ProcessColors(file->second); } /* No old configuration -> initial boot, nothing more to do here */ @@ -662,8 +661,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) ApplyModules(user); if (user) - user->SendText(":%s NOTICE %s :*** Successfully rehashed server.", - ServerInstance->Config->ServerName.c_str(), user->nick.c_str()); + user->WriteRemoteNotice("*** Successfully rehashed server."); ServerInstance->SNO->WriteGlobalSno('a', "*** Successfully rehashed server."); } @@ -679,6 +677,7 @@ void ServerConfig::ApplyModules(User* user) std::string name; if (tag->readString("name", name)) { + name = ModuleManager::ExpandModName(name); // if this module is already loaded, the erase will succeed, so we need do nothing // otherwise, we need to add the module (which will be done later) if (removed_modules.erase(name) == 0) @@ -689,7 +688,7 @@ void ServerConfig::ApplyModules(User* user) for (ModuleManager::ModuleMap::iterator i = removed_modules.begin(); i != removed_modules.end(); ++i) { const std::string& modname = i->first; - // Don't remove cmd_*.so, just remove m_*.so + // Don't remove core_*.so, just remove m_*.so if (modname.c_str()[0] == 'c') continue; if (ServerInstance->Modules->Unload(i->second)) @@ -697,33 +696,33 @@ void ServerConfig::ApplyModules(User* user) ServerInstance->SNO->WriteGlobalSno('a', "*** REHASH UNLOADED MODULE: %s", modname.c_str()); if (user) - user->WriteNumeric(RPL_UNLOADEDMODULE, "%s :Module %s successfully unloaded.", modname.c_str(), modname.c_str()); + user->WriteNumeric(RPL_UNLOADEDMODULE, modname, InspIRCd::Format("Module %s successfully unloaded.", modname.c_str())); else ServerInstance->SNO->WriteGlobalSno('a', "Module %s successfully unloaded.", modname.c_str()); } else { if (user) - user->WriteNumeric(ERR_CANTUNLOADMODULE, "%s :Failed to unload module %s: %s", modname.c_str(), modname.c_str(), ServerInstance->Modules->LastError().c_str()); + user->WriteNumeric(ERR_CANTUNLOADMODULE, modname, InspIRCd::Format("Failed to unload module %s: %s", modname.c_str(), ServerInstance->Modules->LastError().c_str())); else - ServerInstance->SNO->WriteGlobalSno('a', "Failed to unload module %s: %s", modname.c_str(), ServerInstance->Modules->LastError().c_str()); + ServerInstance->SNO->WriteGlobalSno('a', "Failed to unload module %s: %s", modname.c_str(), ServerInstance->Modules->LastError().c_str()); } } for (std::vector::iterator adding = added_modules.begin(); adding != added_modules.end(); adding++) { - if (ServerInstance->Modules->Load(adding->c_str())) + if (ServerInstance->Modules->Load(*adding)) { ServerInstance->SNO->WriteGlobalSno('a', "*** REHASH LOADED MODULE: %s",adding->c_str()); if (user) - user->WriteNumeric(RPL_LOADEDMODULE, "%s :Module %s successfully loaded.", adding->c_str(), adding->c_str()); + user->WriteNumeric(RPL_LOADEDMODULE, *adding, InspIRCd::Format("Module %s successfully loaded.", adding->c_str())); else ServerInstance->SNO->WriteGlobalSno('a', "Module %s successfully loaded.", adding->c_str()); } else { if (user) - user->WriteNumeric(ERR_CANTLOADMODULE, "%s :Failed to load module %s: %s", adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str()); + user->WriteNumeric(ERR_CANTLOADMODULE, *adding, InspIRCd::Format("Failed to load module %s: %s", adding->c_str(), ServerInstance->Modules->LastError().c_str())); else ServerInstance->SNO->WriteGlobalSno('a', "Failed to load module %s: %s", adding->c_str(), ServerInstance->Modules->LastError().c_str()); } @@ -734,7 +733,7 @@ ConfigTag* ServerConfig::ConfValue(const std::string &tag) { ConfigTagList found = config_data.equal_range(tag); if (found.first == found.second) - return NULL; + return EmptyTag; ConfigTag* rv = found.first->second; found.first++; if (found.first != found.second) @@ -793,6 +792,7 @@ void ConfigReaderThread::Finish() * XXX: The order of these is IMPORTANT, do not reorder them without testing * thoroughly!!! */ + ServerInstance->Users.RehashCloneCounts(); ServerInstance->XLines->CheckELines(); ServerInstance->XLines->ApplyLines(); ChanModeReference ban(NULL, "ban"); @@ -805,6 +805,9 @@ void ConfigReaderThread::Finish() for (ModuleManager::ModuleMap::const_iterator i = mods.begin(); i != mods.end(); ++i) i->second->ReadConfig(status); + // The description of this server may have changed - update it for WHOIS etc. + ServerInstance->FakeClient->server->description = Config->ServerDesc; + ServerInstance->ISupport.Build(); ServerInstance->Logs->CloseLogs();