X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=c93e37e1fc35f8a649e873af09cba4c481df5b02;hb=f5c631ef8641db6455bed23c02e5a39f63f7d6d0;hp=6f576fcd7f4311a5f8460652be7c8651c76fd15a;hpb=7d1378e153be701768a656d42f0f6fbfe5ac5645;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 6f576fcd7..c93e37e1f 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -21,8 +21,8 @@ ServerConfig::ServerConfig() { WhoWasGroupSize = WhoWasMaxGroups = WhoWasMaxKeep = 0; - NoUserDns = OperSpyWhois = HideBans = HideSplits = UndernetMsgPrefix = false; - CycleHosts = InvBypassModes = true; + RawLog = NoUserDns = OperSpyWhois = HideBans = HideSplits = UndernetMsgPrefix = false; + WildcardIPv6 = CycleHosts = InvBypassModes = true; dns_timeout = 5; MaxTargets = 20; NetBufferSize = 10240; @@ -148,8 +148,11 @@ static void FindDNS(std::string& server) if (server == "nameserver") { resolv >> server; - ServerInstance->Logs->Log("CONFIG",DEFAULT," set to '%s' as first resolver in /etc/resolv.conf.",server.c_str()); - return; + if (server.find_first_not_of("0123456789.") == std::string::npos) + { + ServerInstance->Logs->Log("CONFIG",DEFAULT," set to '%s' as first resolver in /etc/resolv.conf.",server.c_str()); + return; + } } } @@ -185,6 +188,8 @@ void ServerConfig::CrossCheckOperClassType() std::string name = tag->getString("name"); if (name.empty()) throw CoreException(" missing from tag at " + tag->getTagLocation()); + if (operclass.find(name) != operclass.end()) + throw CoreException("Duplicate class block with name " + name + " at " + tag->getTagLocation()); operclass[name] = tag; } tags = ConfTags("type"); @@ -194,9 +199,10 @@ void ServerConfig::CrossCheckOperClassType() std::string name = tag->getString("name"); if (name.empty()) throw CoreException(" is missing from tag at " + tag->getTagLocation()); - if (!ServerInstance->IsNick(name.c_str(), Limits.NickMax)) throw CoreException(" is invalid (value '" + name + "')"); + if (oper_blocks.find(" " + name) != oper_blocks.end()) + throw CoreException("Duplicate type block with name " + name + " at " + tag->getTagLocation()); OperInfo* ifo = new OperInfo; oper_blocks[" " + name] = ifo; @@ -426,6 +432,22 @@ void ServerConfig::Fill() { ConfigTag* options = ConfValue("options"); ConfigTag* security = ConfValue("security"); + if (sid.empty()) + { + ServerName = ConfValue("server")->getString("name"); + sid = ConfValue("server")->getString("id"); + ValidHost(ServerName, ""); + if (!sid.empty() && !ServerInstance->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."); + } + else + { + if (ServerName != ConfValue("server")->getString("name")) + throw CoreException("You must restart to change the server name or SID"); + std::string nsid = ConfValue("server")->getString("id"); + if (!nsid.empty() && nsid != sid) + throw CoreException("You must restart to change the server name or SID"); + } diepass = ConfValue("power")->getString("diepass"); restartpass = ConfValue("power")->getString("restartpass"); powerhash = ConfValue("power")->getString("hash"); @@ -438,10 +460,8 @@ void ServerConfig::Fill() SoftLimit = ConfValue("performance")->getInt("softlimit", ServerInstance->SE->GetMaxFds()); MaxConn = ConfValue("performance")->getInt("somaxconn", SOMAXCONN); MoronBanner = options->getString("moronbanner", "You're banned!"); - ServerName = ConfValue("server")->getString("name"); ServerDesc = ConfValue("server")->getString("description", "Configure Me"); Network = ConfValue("server")->getString("network", "Network"); - sid = ConfValue("server")->getString("id", ""); AdminName = ConfValue("admin")->getString("name", ""); AdminEmail = ConfValue("admin")->getString("email", "null@example.com"); AdminNick = ConfValue("admin")->getString("nick", "admin"); @@ -462,6 +482,7 @@ void ServerConfig::Fill() NoUserDns = ConfValue("performance")->getBool("nouserdns"); SyntaxHints = options->getBool("syntaxhints"); CycleHosts = options->getBool("cyclehosts"); + CycleHostsFromUser = options->getBool("cyclehostsfromuser"); UndernetMsgPrefix = options->getBool("ircumsgprefix"); FullHostInTopic = options->getBool("hostintopic"); MaxTargets = security->getInt("maxtargets", 20); @@ -494,10 +515,25 @@ void ServerConfig::Fill() range(WhoWasMaxKeep, 3600, INT_MAX, 3600, ""); ValidIP(DNSServer, ""); - ValidHost(ServerName, ""); - if (!sid.empty() && !ServerInstance->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."); + std::string defbind = options->getString("defaultbind"); + if (assign(defbind) == "ipv4") + { + WildcardIPv6 = false; + } + else if (assign(defbind) == "ipv6") + { + WildcardIPv6 = true; + } + else + { + WildcardIPv6 = true; + int socktest = socket(AF_INET6, SOCK_STREAM, 0); + if (socktest < 0) + WildcardIPv6 = false; + else + close(socktest); + } ConfigTagList tags = ConfTags("uline"); for(ConfigIter i = tags.first; i != tags.second; ++i) { @@ -581,6 +617,15 @@ void ServerConfig::Read() void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) { valid = true; + if (old) + { + /* + * These values can only be set on boot. Keep their old values. Do it before we send messages so we actually have a servername. + */ + this->ServerName = old->ServerName; + this->sid = old->sid; + this->cmdline = old->cmdline; + } /* The stuff in here may throw CoreException, be sure we're in a position to catch it. */ try @@ -611,16 +656,9 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) // Check errors before dealing with failed binds, since continuing on failed bind is wanted in some circumstances. valid = errstr.str().empty(); - /* - * These values can only be set on boot. Keep their old values. Do it before we send messages so we actually have a servername. - */ if (old) { - this->ServerName = old->ServerName; - this->sid = old->sid; - this->cmdline = old->cmdline; - - // Same for ports... they're bound later on first run. + // On first run, ports are bound later on FailedPortList pl; ServerInstance->BindPorts(pl); if (pl.size()) @@ -764,10 +802,15 @@ bool ServerConfig::StartsWithWindowsDriveLetter(const std::string &path) ConfigTag* ServerConfig::ConfValue(const std::string &tag) { - ConfigDataHash::iterator iter = config_data.find(tag); - if (iter == config_data.end()) + ConfigTagList found = config_data.equal_range(tag); + if (found.first == found.second) return NULL; - return iter->second; + ConfigTag* rv = found.first->second; + found.first++; + if (found.first != found.second) + ServerInstance->Logs->Log("CONFIG",DEFAULT, "Multiple <" + tag + "> tags found; only first will be used " + "(first at " + rv->getTagLocation() + "; second at " + found.first->second->getTagLocation() + ")"); + return rv; } ConfigTagList ServerConfig::ConfTags(const std::string& tag) @@ -816,9 +859,7 @@ void ConfigReaderThread::Finish() { ServerConfig* old = ServerInstance->Config; ServerInstance->Logs->Log("CONFIG",DEBUG,"Switching to new configuration..."); - ServerInstance->Logs->CloseLogs(); ServerInstance->Config = this->Config; - ServerInstance->Logs->OpenFileLogs(); Config->Apply(old, TheUserUID); if (Config->valid) @@ -839,13 +880,17 @@ void ConfigReaderThread::Finish() FOREACH_MOD(I_OnRehash, OnRehash(user)); ServerInstance->BuildISupport(); + ServerInstance->Logs->CloseLogs(); + ServerInstance->Logs->OpenFileLogs(); + + if (Config->RawLog) + ServerInstance->Users->ServerNoticeAll("*** Raw I/O logging is enabled on this server. All messages, passwords, and commands are being recorded."); + Config = old; } else { // whoops, abort! - ServerInstance->Logs->CloseLogs(); ServerInstance->Config = old; - ServerInstance->Logs->OpenFileLogs(); } }