X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=c93e37e1fc35f8a649e873af09cba4c481df5b02;hb=f5c631ef8641db6455bed23c02e5a39f63f7d6d0;hp=10913778776c4a399e6a6add5de968313704705b;hpb=7fdd55570ea6269c096e6a3c8eae30c1a1587533;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 109137787..c93e37e1f 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -11,20 +11,6 @@ * --------------------------------------------------- */ -/* $Core */ -/* $CopyInstall: conf/inspircd.quotes.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.rules.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.motd.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.helpop-full.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.helpop.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.censor.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.filter.example $(CONPATH) */ -/* $CopyInstall: conf/inspircd.conf.example $(CONPATH) */ -/* $CopyInstall: conf/modules.conf.example $(CONPATH) */ -/* $CopyInstall: conf/opers.conf.example $(CONPATH) */ -/* $CopyInstall: conf/links.conf.example $(CONPATH) */ -/* $CopyInstall: tools/gdbargs $(BASE)/.gdbargs */ - #include "inspircd.h" #include #include "xline.h" @@ -35,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; @@ -51,28 +37,29 @@ ServerConfig::ServerConfig() void ServerConfig::Update005() { std::stringstream out(data005); + std::vector data; std::string token; + while (out >> token) + data.push_back(token); + sort(data.begin(), data.end()); + std::string line5; - int token_counter = 0; isupport.clear(); - while (out >> token) + for(unsigned int i=0; i < data.size(); i++) { + token = data[i]; line5 = line5 + token + " "; - token_counter++; - if (token_counter >= 13) + if (i % 13 == 12) { - char buf[MAXBUF]; - snprintf(buf, MAXBUF, "%s:are supported by this server", line5.c_str()); - isupport.push_back(buf); + line5.append(":are supported by this server"); + isupport.push_back(line5); line5.clear(); - token_counter = 0; } } if (!line5.empty()) { - char buf[MAXBUF]; - snprintf(buf, MAXBUF, "%s:are supported by this server", line5.c_str()); - isupport.push_back(buf); + line5.append(":are supported by this server"); + isupport.push_back(line5); } } @@ -161,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; + } } } @@ -198,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"); @@ -207,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; @@ -360,8 +353,6 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) me->name = name; - tag->readString("password", me->pass); - tag->readString("hash", me->hash); me->registration_timeout = tag->getInt("timeout", me->registration_timeout); me->pingtime = tag->getInt("pingfreq", me->pingtime); std::string sendq; @@ -383,7 +374,6 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) me->fakelag = tag->getBool("fakelag", me->fakelag); me->maxlocal = tag->getInt("localmax", me->maxlocal); me->maxglobal = tag->getInt("globalmax", me->maxglobal); - me->port = tag->getInt("port", me->port); me->maxchans = tag->getInt("maxchans", me->maxchans); me->limit = tag->getInt("limit", me->limit); @@ -442,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"); @@ -454,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"); @@ -467,7 +471,7 @@ void ServerConfig::Fill() DisabledCommands = ConfValue("disabled")->getString("commands", ""); DisabledDontExist = ConfValue("disabled")->getBool("fakenonexistant"); UserStats = security->getString("userstats"); - CustomVersion = security->getString("customversion"); + CustomVersion = security->getString("customversion", Network + " IRCd"); HideSplits = security->getBool("hidesplits"); HideBans = security->getBool("hidebans"); HideWhoisServer = security->getString("hidewhois"); @@ -478,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); @@ -486,7 +491,6 @@ void ServerConfig::Fill() WhoWasGroupSize = ConfValue("whowas")->getInt("groupsize"); WhoWasMaxGroups = ConfValue("whowas")->getInt("maxgroups"); WhoWasMaxKeep = ServerInstance->Duration(ConfValue("whowas")->getString("maxkeep")); - DieValue = ConfValue("die")->getString("value"); MaxChans = ConfValue("channels")->getInt("users", 20); OperMaxChans = ConfValue("channels")->getInt("opers", 60); c_ipv4_range = ConfValue("cidr")->getInt("ipv4clone", 32); @@ -511,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) { @@ -590,8 +609,6 @@ void ServerConfig::Read() } if (valid) { - ReadFile(MOTD, ConfValue("files")->getString("motd")); - ReadFile(RULES, ConfValue("files")->getString("rules")); DNSServer = ConfValue("dns")->getString("server"); FindDNS(DNSServer); } @@ -600,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 @@ -630,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()) @@ -783,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) @@ -794,34 +818,6 @@ ConfigTagList ServerConfig::ConfTags(const std::string& tag) return config_data.equal_range(tag); } -/** Read the contents of a file located by `fname' into a file_cache pointed at by `F'. - */ -bool ServerConfig::ReadFile(file_cache &F, const std::string& fname) -{ - if (fname.empty()) - return false; - - char linebuf[MAXBUF]; - - F.clear(); - - FileWrapper file(fopen(fname.c_str(), "r")); - - if (!file) - return false; - while (!feof(file)) - { - if (fgets(linebuf, sizeof(linebuf), file)) - linebuf[strlen(linebuf)-1] = 0; - else - *linebuf = 0; - - F.push_back(*linebuf ? linebuf : " "); - } - - return true; -} - bool ServerConfig::FileExists(const char* file) { struct stat sb; @@ -863,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) @@ -886,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(); } }