void OnRehash(User* user) { ConfigTag *tag = ServerInstance->Config->ConfValue("connthrottle"); throttle_num = tag->getInt("num", 1); throttle_time = tag->getInt("time", 1); }
void InitConf() { /* read configuration variables */ ConfigTag* tag = ServerInstance->Config->ConfValue("connflood"); /* throttle configuration */ seconds = tag->getInt("seconds"); maxconns = tag->getInt("maxconns"); timeout = tag->getInt("timeout"); quitmsg = tag->getString("quitmsg"); /* seconds to wait when the server just booted */ boot_wait = tag->getInt("bootwait"); first = ServerInstance->Time(); }
void SetPenalties() { ConfigTagList tags = ServerInstance->Config->ConfTags("penalty"); for (ConfigIter i = tags.first; i != tags.second; ++i) { ConfigTag* tag = i->second; std::string name = tag->getString("name"); int penalty = (int)tag->getInt("value", 1); Command* command = ServerInstance->Parser->GetHandler(name); if (command == NULL) { ServerInstance->Logs->Log("m_custompenalty", DEFAULT, "Warning: unable to find command: " + name); continue; } if (penalty < 0) { ServerInstance->Logs->Log("m_custompenalty", DEFAULT, "Warning: unable to set a negative penalty for " + name); continue; } ServerInstance->Logs->Log("m_custompenalty", DEBUG, "Setting the penalty for %s to %d", name.c_str(), penalty); command->Penalty = penalty; } }
void ListModeBase::DoRehash() { ConfigTagList tags = ServerInstance->Config->ConfTags(configtag); limitlist oldlimits = chanlimits; chanlimits.clear(); for (ConfigIter i = tags.first; i != tags.second; i++) { // For each <banlist> tag ConfigTag* c = i->second; ListLimit limit(c->getString("chan"), c->getInt("limit")); if (limit.mask.size() && limit.limit > 0) chanlimits.push_back(limit); } if (chanlimits.empty()) chanlimits.push_back(ListLimit("*", 64)); // Most of the time our settings are unchanged, so we can avoid iterating the chanlist if (oldlimits == chanlimits) return; for (chan_hash::const_iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); ++i) { ChanData* cd = extItem.get(i->second); if (cd) cd->maxitems = -1; } }
void OnRehash(User *user) { ConfigTag *tag = ServerInstance->Config->ConfValue("telegraf"); silent = tag->getBool("silent"); reconnectTimeout = tag->getInt("reconnect", 60); int new_port = tag->getInt("port"); if (port != new_port) { if (tSock) { StopMetrics(); } port = new_port; if (port > 0 && port < 65536) { StartMetrics(); } } }
virtual void OnRehash(User* user) { ConfigTag* tag = ServerInstance->Config->ConfValue("connectban"); ipv4_cidr = tag->getInt("ipv4cidr", 32); if (ipv4_cidr == 0) ipv4_cidr = 32; ipv6_cidr = tag->getInt("ipv6cidr", 128); if (ipv6_cidr == 0) ipv6_cidr = 128; threshold = tag->getInt("threshold", 10); if (threshold == 0) threshold = 10; banduration = InspIRCd::Duration(tag->getString("duration", "10m")); if (banduration == 0) banduration = 10*60; }
void ReadConf() { ConfigTag* tag = ServerInstance->Config->ConfValue("blockcaps"); percent = tag->getInt("percent", 100); minlen = tag->getInt("minlen", 1); std::string hmap = tag->getString("capsmap", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); memset(capsmap, 0, sizeof(capsmap)); for (std::string::iterator n = hmap.begin(); n != hmap.end(); n++) capsmap[(unsigned char)*n] = 1; if (percent < 1 || percent > 100) { ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "<blockcaps:percent> out of range, setting to default of 100."); percent = 100; } if (minlen < 1 || minlen > ServerInstance->Config->Limits.MaxLine) { ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "<blockcaps:minlen> out of range, setting to default of 1."); minlen = 1; } }
void OnRehash(User*) { ConfigTag* tag = ServerInstance->Config->ConfValue("flashpolicyd"); timeout = tag->getInt("timeout", 5); std::string file = tag->getString("file"); if (timeout == 0) timeout = 1; if (!file.empty()) { try { FileReader reader(file); policy_reply = reader.Contents(); } catch (CoreException&) { const std::string error_message = "A file was specified for FlashPD, but it could not be loaded."; ServerInstance->Logs->Log("m_flashpd", DEFAULT, error_message); ServerInstance->SNO->WriteGlobalSno('a', error_message); policy_reply.clear(); } return; } // A file was not specified. Set the default setting. // We allow access to all client ports by default std::string to_ports; for (std::vector<ListenSocket*>::const_iterator i = ServerInstance->ports.begin(); i != ServerInstance->ports.end(); ++i) { ListenSocket* ls = *i; if (ls->bind_tag->getString("type", "clients") != "clients" || ls->bind_tag->getString("ssl", "plaintext") != "plaintext") continue; to_ports += (ConvToStr(ls->bind_port) + ","); } if (to_ports.empty()) { policy_reply.clear(); return; } to_ports.erase(to_ports.size() - 1); policy_reply = "<?xml version=\"1.0\"?>\ <!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\">\ <cross-domain-policy>\ <site-control permitted-cross-domain-policies=\"master-only\"/>\ <allow-access-from domain=\"*\" to-ports=\"" + to_ports + "\" />\ </cross-domain-policy>"; }
virtual void OnRehash(User* user) { ConfigTag* tag = ServerInstance->Config->ConfValue("blockamsg"); ForgetDelay = tag->getInt("delay", -1); std::string act = tag->getString("action"); if(act == "notice") action = IBLOCK_NOTICE; else if(act == "noticeopers") action = IBLOCK_NOTICEOPERS; else if(act == "silent") action = IBLOCK_SILENT; else if(act == "kill") action = IBLOCK_KILL; else action = IBLOCK_KILLOPERS; }
virtual void OnRehash(User* user) { ConfigTag* conftag = ServerInstance->Config->ConfValue("antirandom"); this->ShowFailedConnects = conftag->getBool("showfailedconnects", true); this->DebugMode = conftag->getBool("debugmode"); this->Threshold = conftag->getInt("threshold", 10); // Sanity checks if (this->Threshold < 1) this->Threshold = 1; if (this->Threshold >= 100) this->Threshold = 100; this->BanAction = ANTIRANDOM_ACT_NONE; std::string tmp = conftag->getString("banaction"); if (tmp == "GLINE") { this->BanAction = ANTIRANDOM_ACT_GLINE; } if (tmp == "ZLINE") { this->BanAction = ANTIRANDOM_ACT_ZLINE; } else if (tmp == "KILL") { this->BanAction = ANTIRANDOM_ACT_KILL; } tmp = conftag->getString("banduration"); if (!tmp.empty()) { this->BanDuration = ServerInstance->Duration(tmp.c_str()); // Sanity check if ((int)this->BanDuration <= 0) this->BanDuration = 1; } else this->BanDuration = 86400; // One day. tmp = conftag->getString("banreason"); if (!tmp.empty()) this->BanReason = tmp; else this->BanReason = "You look like a bot. Change your nick/ident/gecos and try reconnecting."; Exempts.clear(); ConfigTagList exempts_list = ServerInstance->Config->ConfTags("antirandomexempt"); for (ConfigIter i = exempts_list.first; i != exempts_list.second; ++i) { ConfigTag* tag = i->second; std::string type = tag->getString("type"); std::string pattern = tag->getString("pattern"); if(pattern.length() && type.length()) { AntirandomExemptType exemptType; if (type == "nick") exemptType = NICK; else if (type == "ident") exemptType = IDENT; else if (type == "host") exemptType = HOST; else if (type == "fullname") exemptType = FULLNAME; else { ServerInstance->SNO->WriteGlobalSno('a', "m_antirandom: Invalid <antirandomexempt:type> value in config: %s", type.c_str()); ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_antirandom: Invalid <antirandomexempt:type> value in config: %s", type.c_str()); continue; } Exempts.push_back(AntirandomExempt(exemptType, pattern)); if (this->DebugMode) ServerInstance->SNO->WriteGlobalSno('a', "m_antirandom: Added exempt: %s (%s)", type.c_str(), pattern.c_str()); } else { ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_antirandom: Invalid block <antirandomexempt type=\"%s\" pattern=\"%s\">", type.c_str(), pattern.c_str()); ServerInstance->SNO->WriteGlobalSno('a', "m_antirandom: Invalid block <antirandomexempt type=\"%s\" pattern=\"%s\">", type.c_str(), pattern.c_str()); continue; } } }
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, "<server:name>"); 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."); } 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"); 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()); MaxConn = ConfValue("performance")->getInt("somaxconn", SOMAXCONN); MoronBanner = 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", "*****@*****.**"); AdminNick = ConfValue("admin")->getString("nick", "admin"); ModPath = ConfValue("path")->getString("moduledir", MOD_PATH); NetBufferSize = ConfValue("performance")->getInt("netbuffersize", 10240); dns_timeout = ConfValue("dns")->getInt("timeout", 5); DisabledCommands = ConfValue("disabled")->getString("commands", ""); DisabledDontExist = ConfValue("disabled")->getBool("fakenonexistant"); UserStats = security->getString("userstats"); CustomVersion = security->getString("customversion", Network + " IRCd"); HideSplits = security->getBool("hidesplits"); HideBans = security->getBool("hidebans"); HideWhoisServer = security->getString("hidewhois"); HideKillsServer = security->getString("hidekills"); RestrictBannedUsers = security->getBool("restrictbannedusers", true); GenericOper = security->getBool("genericoper"); 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); DefaultModes = options->getString("defaultmodes", "nt"); PID = ConfValue("pid")->getString("file"); MaxChans = ConfValue("channels")->getInt("users", 20); OperMaxChans = ConfValue("channels")->getInt("opers", 60); 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); InvBypassModes = options->getBool("invitebypassmodes", true); NoSnoticeStack = options->getBool("nosnoticestack", false); range(SoftLimit, 10, ServerInstance->SE->GetMaxFds(), ServerInstance->SE->GetMaxFds(), "<performance:softlimit>"); if (ConfValue("performance")->getBool("limitsomaxconn", true)) range(MaxConn, 0, SOMAXCONN, SOMAXCONN, "<performance:somaxconn>"); range(MaxTargets, 1, 31, 20, "<security:maxtargets>"); range(NetBufferSize, 1024, 65534, 10240, "<performance:netbuffersize>"); 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 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("<uline> tag missing server at " + tag->getTagLocation()); ulines[assign(server)] = tag->getBool("silent"); } ReadXLine(this, "badip", "ipmask", ServerInstance->XLines->GetFactory("Z")); ReadXLine(this, "badnick", "nick", ServerInstance->XLines->GetFactory("Q")); ReadXLine(this, "badhost", "host", ServerInstance->XLines->GetFactory("K")); ReadXLine(this, "exception", "host", ServerInstance->XLines->GetFactory("E")); memset(DisabledUModes, 0, sizeof(DisabledUModes)); std::string modes = ConfValue("disabled")->getString("usermodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) { // Complain when the character is not a-z or A-Z if ((*p < 'A') || (*p > 'z') || ((*p < 'a') && (*p > 'Z'))) throw CoreException("Invalid usermode " + std::string(1, *p) + " was found."); DisabledUModes[*p - 'A'] = 1; } memset(DisabledCModes, 0, sizeof(DisabledCModes)); modes = ConfValue("disabled")->getString("chanmodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) { if ((*p < 'A') || (*p > 'z') || ((*p < 'a') && (*p > 'Z'))) throw CoreException("Invalid chanmode " + std::string(1, *p) + " was found."); 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") AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_OPS; else if (v == "all") AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_ALL; else if (v == "dynamic") AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_DYNAMIC; else AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_NONE; v = security->getString("operspywhois"); if (v == "splitmsg") OperSpyWhois = SPYWHOIS_SPLITMSG; else if (v == "on" || v == "yes") OperSpyWhois = SPYWHOIS_SINGLEMSG; else OperSpyWhois = SPYWHOIS_NONE; }
void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) { typedef std::map<std::string, ConnectClass*> ClassMap; ClassMap oldBlocksByMask; if (current) { for(ClassVector::iterator i = current->Classes.begin(); i != current->Classes.end(); ++i) { ConnectClass* c = *i; if (c->name.substr(0, 8) != "unnamed-") { 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; } } } int blk_count = config_data.count("connect"); if (blk_count == 0) { // No connect blocks found; make a trivial default block std::vector<KeyVal>* items; ConfigTag* tag = ConfigTag::create("connect", "<auto>", 0, items); items->push_back(std::make_pair("allow", "*")); config_data.insert(std::make_pair("connect", tag)); blk_count = 1; } Classes.resize(blk_count); std::map<std::string, int> names; bool try_again = true; for(int tries=0; try_again; tries++) { try_again = false; ConfigTagList tags = ConfTags("connect"); int i=0; for(ConfigIter it = tags.first; it != tags.second; ++it, ++i) { ConfigTag* tag = it->second; if (Classes[i]) continue; ConnectClass* parent = NULL; std::string parentName = tag->getString("parent"); if (!parentName.empty()) { std::map<std::string,int>::iterator parentIter = names.find(parentName); if (parentIter == names.end()) { try_again = true; // couldn't find parent this time. If it's the last time, we'll never find it. if (tries >= blk_count) throw CoreException("Could not find parent connect class \"" + parentName + "\" for connect block at " + tag->getTagLocation()); continue; } parent = Classes[parentIter->second]; } std::string name = tag->getString("name"); std::string mask, typeMask; 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 { throw CoreException("Connect class must have allow, deny, or name specified at " + tag->getTagLocation()); } 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!"); names[name] = i; ConnectClass* me = parent ? new ConnectClass(tag, type, mask, *parent) : new ConnectClass(tag, type, mask); me->name = name; me->registration_timeout = tag->getInt("timeout", me->registration_timeout); me->pingtime = tag->getInt("pingfreq", me->pingtime); std::string sendq; if (tag->readString("sendq", sendq)) { // attempt to guess a good hard/soft sendq from a single value long value = atol(sendq.c_str()); if (value > 16384) me->softsendqmax = value / 16; else me->softsendqmax = value; me->hardsendqmax = value * 8; } me->softsendqmax = tag->getInt("softsendq", me->softsendqmax); me->hardsendqmax = tag->getInt("hardsendq", me->hardsendqmax); me->recvqmax = tag->getInt("recvq", me->recvqmax); me->penaltythreshold = tag->getInt("threshold", me->penaltythreshold); me->commandrate = tag->getInt("commandrate", me->commandrate); me->fakelag = tag->getBool("fakelag", me->fakelag); me->maxlocal = tag->getInt("localmax", me->maxlocal); me->maxglobal = tag->getInt("globalmax", me->maxglobal); 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()) { ConnectClass* old = oldMask->second; oldBlocksByMask.erase(oldMask); old->Update(me); delete me; me = old; } Classes[i] = me; } } }
void OnRehash(User* user) { ConfigTag *tag = ServerInstance->Config->ConfValue("bcrypt"); bcrypt.WorkFactor = tag->getInt("workfactor", 8); }
void LoadDatabase() { /* * Process config-defined list of permanent channels. * -- w00t */ ConfigTagList permchannels = ServerInstance->Config->ConfTags("permchannels"); for (ConfigIter i = permchannels.first; i != permchannels.second; ++i) { ConfigTag* tag = i->second; std::string channel = tag->getString("channel"); std::string modes = tag->getString("modes"); if ((channel.empty()) || (channel.length() > ServerInstance->Config->Limits.ChanMax)) { ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Ignoring permchannels tag with empty or too long channel name (\"" + channel + "\")"); continue; } Channel *c = ServerInstance->FindChan(channel); if (!c) { time_t TS = tag->getInt("ts", ServerInstance->Time(), 1); c = new Channel(channel, TS); unsigned int topicset = tag->getInt("topicts"); c->topic = tag->getString("topic"); if ((topicset != 0) || (!c->topic.empty())) { if (topicset == 0) topicset = ServerInstance->Time(); c->topicset = topicset; c->setby = tag->getString("topicsetby"); if (c->setby.empty()) c->setby = ServerInstance->Config->ServerName; } ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Added %s with topic %s", channel.c_str(), c->topic.c_str()); if (modes.empty()) continue; irc::spacesepstream list(modes); std::string modeseq; std::string par; list.GetToken(modeseq); // XXX bleh, should we pass this to the mode parser instead? ugly. --w00t for (std::string::iterator n = modeseq.begin(); n != modeseq.end(); ++n) { ModeHandler* mode = ServerInstance->Modes->FindMode(*n, MODETYPE_CHANNEL); if (mode) { if (mode->GetNumParams(true)) list.GetToken(par); else par.clear(); mode->OnModeChange(ServerInstance->FakeClient, ServerInstance->FakeClient, c, par, true); } } } } }
/** Fill our conf vector with data */ void ReadConf() { DNSBLConfEntries.clear(); ConfigTagList dnsbls = ServerInstance->Config->ConfTags("dnsbl"); for(ConfigIter i = dnsbls.first; i != dnsbls.second; ++i) { ConfigTag* tag = i->second; reference<DNSBLConfEntry> e = new DNSBLConfEntry(); e->name = tag->getString("name"); e->ident = tag->getString("ident"); e->host = tag->getString("host"); e->reason = tag->getString("reason"); e->domain = tag->getString("domain"); if (tag->getString("type") == "bitmask") { e->type = DNSBLConfEntry::A_BITMASK; e->bitmask = tag->getInt("bitmask"); } else { memset(e->records, 0, sizeof(e->records)); e->type = DNSBLConfEntry::A_RECORD; irc::portparser portrange(tag->getString("records"), false); long item = -1; while ((item = portrange.GetToken())) e->records[item] = 1; } e->banaction = str2banaction(tag->getString("action")); e->duration = tag->getDuration("duration", 60, 1); /* Use portparser for record replies */ /* yeah, logic here is a little messy */ if ((e->bitmask <= 0) && (DNSBLConfEntry::A_BITMASK == e->type)) { std::string location = tag->getTagLocation(); ServerInstance->SNO->WriteGlobalSno('a', "DNSBL(%s): invalid bitmask", location.c_str()); } else if (e->name.empty()) { std::string location = tag->getTagLocation(); ServerInstance->SNO->WriteGlobalSno('a', "DNSBL(%s): Invalid name", location.c_str()); } else if (e->domain.empty()) { std::string location = tag->getTagLocation(); ServerInstance->SNO->WriteGlobalSno('a', "DNSBL(%s): Invalid domain", location.c_str()); } else if (e->banaction == DNSBLConfEntry::I_UNKNOWN) { std::string location = tag->getTagLocation(); ServerInstance->SNO->WriteGlobalSno('a', "DNSBL(%s): Invalid banaction", location.c_str()); } else { if (e->reason.empty()) { std::string location = tag->getTagLocation(); ServerInstance->SNO->WriteGlobalSno('a', "DNSBL(%s): empty reason, using defaults", location.c_str()); e->reason = "Your IP has been blacklisted."; } /* add it, all is ok */ DNSBLConfEntries.push_back(e); } } }
void SpanningTreeUtilities::ReadConfiguration() { ConfigTag* security = ServerInstance->Config->ConfValue("security"); ConfigTag* options = ServerInstance->Config->ConfValue("options"); FlatLinks = security->getBool("flatlinks"); HideULines = security->getBool("hideulines"); AnnounceTSChange = options->getBool("announcets"); AllowOptCommon = options->getBool("allowmismatch"); ChallengeResponse = !security->getBool("disablehmac"); quiet_bursts = ServerInstance->Config->ConfValue("performance")->getBool("quietbursts"); PingWarnTime = options->getInt("pingwarning"); PingFreq = options->getInt("serverpingfreq"); if (PingFreq == 0) PingFreq = 60; if (PingWarnTime < 0 || PingWarnTime > PingFreq - 1) PingWarnTime = 0; AutoconnectBlocks.clear(); LinkBlocks.clear(); ConfigTagList tags = ServerInstance->Config->ConfTags("link"); for(ConfigIter i = tags.first; i != tags.second; ++i) { ConfigTag* tag = i->second; reference<Link> L = new Link(tag); std::string linkname = tag->getString("name"); L->Name = linkname.c_str(); irc::spacesepstream sep = tag->getString("allowmask"); for (std::string s; sep.GetToken(s);) L->AllowMasks.push_back(s); L->IPAddr = tag->getString("ipaddr"); L->Port = tag->getInt("port"); L->SendPass = tag->getString("sendpass", tag->getString("password")); L->RecvPass = tag->getString("recvpass", tag->getString("password")); L->Fingerprint = tag->getString("fingerprint"); L->HiddenFromStats = tag->getBool("statshidden"); L->Timeout = tag->getDuration("timeout", 30); L->Hook = tag->getString("ssl"); L->Bind = tag->getString("bind"); L->Hidden = tag->getBool("hidden"); if (L->Name.empty()) throw ModuleException("Invalid configuration, found a link tag without a name!" + (!L->IPAddr.empty() ? " IP address: "+L->IPAddr : "")); if (L->Name.find('.') == std::string::npos) throw ModuleException("The link name '"+assign(L->Name)+"' is invalid as it must contain at least one '.' character"); if (L->Name.length() > 64) throw ModuleException("The link name '"+assign(L->Name)+"' is invalid as it is longer than 64 characters"); if (L->RecvPass.empty()) throw ModuleException("Invalid configuration for server '"+assign(L->Name)+"', recvpass not defined"); if (L->SendPass.empty()) throw ModuleException("Invalid configuration for server '"+assign(L->Name)+"', sendpass not defined"); if ((L->SendPass.find(' ') != std::string::npos) || (L->RecvPass.find(' ') != std::string::npos)) throw ModuleException("Link block '" + assign(L->Name) + "' has a password set that contains a space character which is invalid"); if ((L->SendPass[0] == ':') || (L->RecvPass[0] == ':')) throw ModuleException("Link block '" + assign(L->Name) + "' has a password set that begins with a colon (:) which is invalid"); if (L->IPAddr.empty()) { L->IPAddr = "*"; ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Configuration warning: Link block '" + assign(L->Name) + "' has no IP defined! This will allow any IP to connect as this server, and MAY not be what you want."); } if (!L->Port) ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Configuration warning: Link block '" + assign(L->Name) + "' has no port defined, you will not be able to /connect it."); L->Fingerprint.erase(std::remove(L->Fingerprint.begin(), L->Fingerprint.end(), ':'), L->Fingerprint.end()); LinkBlocks.push_back(L); } tags = ServerInstance->Config->ConfTags("autoconnect"); for(ConfigIter i = tags.first; i != tags.second; ++i) { ConfigTag* tag = i->second; reference<Autoconnect> A = new Autoconnect(tag); A->Period = tag->getDuration("period", 60, 1); A->NextConnectTime = ServerInstance->Time() + A->Period; A->position = -1; irc::spacesepstream ss(tag->getString("server")); std::string server; while (ss.GetToken(server)) { A->servers.push_back(server); } if (A->servers.empty()) { throw ModuleException("Invalid configuration for autoconnect, server cannot be empty!"); } AutoconnectBlocks.push_back(A); } for (server_hash::const_iterator i = serverlist.begin(); i != serverlist.end(); ++i) i->second->CheckULine(); RefreshIPCache(); }
void ServerConfig::Fill() { ConfigTag* options = ConfValue("options"); ConfigTag* security = ConfValue("security"); if (sid.empty()) { ServerName = ConfValue("server")->getString("name", "irc.example.com"); ValidHost(ServerName, "<server:name>"); sid = ConfValue("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."); } else { if (ServerName != ConfValue("server")->getString("name")) 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 id"); } 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"); NetBufferSize = ConfValue("performance")->getInt("netbuffersize", 10240, 1024, 65534); dns_timeout = ConfValue("dns")->getInt("timeout", 5); DisabledCommands = ConfValue("disabled")->getString("commands", ""); DisabledDontExist = ConfValue("disabled")->getBool("fakenonexistant"); UserStats = security->getString("userstats"); CustomVersion = security->getString("customversion"); HideSplits = security->getBool("hidesplits"); HideBans = security->getBool("hidebans"); HideWhoisServer = security->getString("hidewhois"); HideKillsServer = security->getString("hidekills"); 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"); 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.MaxHost = ConfValue("limits")->getInt("maxhost", 64); 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", 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); InvBypassModes = options->getBool("invitebypassmodes", true); 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") { 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 SocketEngine::Close(socktest); } ReadXLine(this, "badip", "ipmask", ServerInstance->XLines->GetFactory("Z")); ReadXLine(this, "badnick", "nick", ServerInstance->XLines->GetFactory("Q")); ReadXLine(this, "badhost", "host", ServerInstance->XLines->GetFactory("K")); ReadXLine(this, "exception", "host", ServerInstance->XLines->GetFactory("E")); memset(DisabledUModes, 0, sizeof(DisabledUModes)); std::string modes = ConfValue("disabled")->getString("usermodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) { // Complain when the character is not a-z or A-Z if ((*p < 'A') || (*p > 'z') || ((*p < 'a') && (*p > 'Z'))) throw CoreException("Invalid usermode " + std::string(1, *p) + " was found."); DisabledUModes[*p - 'A'] = 1; } memset(DisabledCModes, 0, sizeof(DisabledCModes)); modes = ConfValue("disabled")->getString("chanmodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) { if ((*p < 'A') || (*p > 'z') || ((*p < 'a') && (*p > 'Z'))) throw CoreException("Invalid chanmode " + std::string(1, *p) + " was found."); 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") AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_OPS; else if (v == "all") AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_ALL; else if (v == "dynamic") AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_DYNAMIC; else AnnounceInvites = ServerConfig::INVITE_ANNOUNCE_NONE; v = security->getString("operspywhois"); if (v == "splitmsg") OperSpyWhois = SPYWHOIS_SPLITMSG; else if (v == "on" || v == "yes") OperSpyWhois = SPYWHOIS_SINGLEMSG; else OperSpyWhois = SPYWHOIS_NONE; }