diff options
author | Attila Molnar <attilamolnar@hush.com> | 2013-08-12 09:20:46 -0700 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2013-08-12 09:20:46 -0700 |
commit | 9d4efff3957f1ad163f726bc44bed3a4870afb94 (patch) | |
tree | 85a67980fb21b7a61756761558fef396adad7dd7 | |
parent | dafa2f3031c4abc7f5506385770c4fc743669b17 (diff) | |
parent | 29822a263b3b408559257e9ef2bd29167e7573fa (diff) |
Merge pull request #591 from SaberUK/master+config-tweaks
Various patches relating to configuration.
-rw-r--r-- | docs/conf/inspircd.conf.example | 38 | ||||
-rw-r--r-- | docs/conf/modules.conf.example | 8 | ||||
-rw-r--r-- | include/configreader.h | 52 | ||||
-rw-r--r-- | include/users.h | 2 | ||||
-rw-r--r-- | src/channels.cpp | 7 | ||||
-rw-r--r-- | src/commands/cmd_hostname_lookup.cpp | 2 | ||||
-rw-r--r-- | src/commands/cmd_whowas.cpp | 6 | ||||
-rw-r--r-- | src/configparser.cpp | 32 | ||||
-rw-r--r-- | src/configreader.cpp | 60 | ||||
-rw-r--r-- | src/inspircd.cpp | 2 | ||||
-rw-r--r-- | src/logger.cpp | 2 | ||||
-rw-r--r-- | src/modmanager_dynamic.cpp | 4 | ||||
-rw-r--r-- | src/modules.cpp | 5 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_gnutls.cpp | 8 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_openssl.cpp | 8 | ||||
-rw-r--r-- | src/modules/m_blockcaps.cpp | 14 | ||||
-rw-r--r-- | src/modules/m_cgiirc.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_connectban.cpp | 15 | ||||
-rw-r--r-- | src/modules/m_nationalchars.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_xline_db.cpp | 2 | ||||
-rw-r--r-- | src/usermanager.cpp | 4 | ||||
-rw-r--r-- | src/users.cpp | 6 | ||||
-rw-r--r-- | src/xline.cpp | 4 |
23 files changed, 160 insertions, 125 deletions
diff --git a/docs/conf/inspircd.conf.example b/docs/conf/inspircd.conf.example index 2c75ddc7c..036a3ebfc 100644 --- a/docs/conf/inspircd.conf.example +++ b/docs/conf/inspircd.conf.example @@ -286,9 +286,9 @@ # maxconnwarn: Enable warnings when localmax or globalmax is hit (defaults to on) maxconnwarn="off" - # nouserdns: If enabled, no DNS lookups will be performed on connecting users + # resolvehostnames: If disabled, no DNS lookups will be performed on connecting users # in this class. This can save a lot of resources on very busy servers. - nouserdns="no" + resolvehostnames="yes" # usednsbl: Defines whether or not users in this class are subject to DNSBL. Default is yes. # This setting only has effect when m_dnsbl is loaded. @@ -395,9 +395,9 @@ # globalmax: Maximum global (network-wide) connections per IP. globalmax="3" - # nouserdns: If enabled, no DNS lookups will be performed on connecting users + # resolvehostnames: If disabled, no DNS lookups will be performed on connecting users # in this class. This can save a lot of resources on very busy servers. - nouserdns="no" + resolvehostnames="yes" # useident: Defines if users in this class must respond to a ident query or not. useident="no" @@ -439,11 +439,11 @@ # This file has all the information about oper classes, types and o:lines. # You *MUST* edit it. -<include file="conf/examples/opers.conf.example"> +<include file="examples/opers.conf.example"> # This file has all the information about server links and ulined servers. # You *MUST* edit it if you intend to link servers. -<include file="conf/examples/links.conf.example"> +<include file="examples/links.conf.example"> #-#-#-#-#-#-#-#-#-#- MISCELLANEOUS CONFIGURATION -#-#-#-#-#-#-#-#-#-# # # @@ -453,7 +453,7 @@ # motd - displayed on connect and when a user executes /MOTD # rules - displayed when the user executes /RULES # Modules can also define their own files -<files motd="conf/examples/motd.txt.example" rules="conf/examples/rules.txt.example"> +<files motd="examples/motd.txt.example" rules="examples/rules.txt.example"> # Example of an executable file include. Note this will be read on rehash, # not when the command is run. @@ -617,11 +617,11 @@ # defaultmodes: What modes are set on a empty channel when a user # joins it and it is unregistered. This is similar to Asuka's # autochanmodes. - defaultmodes="nt" + defaultmodes="not" - # moronbanner: This is the text that is sent to a user when they are + # xlinemessage: This is the text that is sent to a user when they are # banned from the server. - moronbanner="You're banned! Email haha@abuse.com with the ERROR line below for help." + xlinemessage="You're banned! Email irc@example.com with the ERROR line below for help." # exemptchanops: exemptions for channel access restrictions based on prefix. exemptchanops="nonick:v flood:o" @@ -729,8 +729,8 @@ # (Commands like /notice, /privmsg, /kick, etc) maxtargets="20" - # customversion: Displays a custom string when a user /version's - # the ircd. This may be set for security reasons or vanity reasons. + # customversion: A custom message to be displayed in the comments field + # of the VERSION command response. This does not hide the InspIRCd version. customversion="" # operspywhois: show opers (users/auspex) the +s channels a user is in. Values: @@ -807,6 +807,14 @@ # maxaway: Maximum length of an away message. maxaway="200"> +#-#-#-#-#-#-#-#-#-#-#-#-# PATHS CONFIGURATION #-#-#-#-#-#-#-#-#-#-#-#-# +# # +# This configuration tag defines the location that InspIRCd stores # +# various types of files such as configuration files, log files and # +# modules. You will probably not need to change these from the values # +# set when InspIRCd was built unless you are using a binary package # +# where you do not have the ability to set build time configuration. # +#<path configdir="conf" datadir="data" logdir="logs" moduledir="modules"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Logging @@ -976,7 +984,7 @@ # provide almost all the features of InspIRCd. :) # # # # The default does nothing -- we include it for simplicity for you. # -<include file="conf/examples/modules.conf.example"> +<include file="examples/modules.conf.example"> # Here are some pre-built modules.conf files that closely match the # default configurations of some popular IRCd's. You still may want to @@ -988,10 +996,10 @@ # recommended that you make your own modules file based on modules.conf.example. # Settings similar to UnrealIRCd defaults. -#<include file="conf/examples/modules/unrealircd.conf.example"> +#<include file="examples/modules/unrealircd.conf.example"> # Settings similar to Charybdis IRCd defaults. -#<include file="conf/examples/modules/charybdis.conf.example"> +#<include file="examples/modules/charybdis.conf.example"> ######################################################################### diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index 7e1a9f5ad..228d96312 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -314,7 +314,7 @@ # specify some censor tags. See also: # # http://wiki.inspircd.org/Modules/censor # # -#<include file="conf/examples/censor.conf.example"> +#<include file="examples/censor.conf.example"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # CGI:IRC module: Adds support for automatic host changing in CGI:IRC @@ -730,7 +730,7 @@ # specfiy below the path to the filter.conf file, or define some # # <filter> tags. # # # -#<include file="conf/examples/filter.conf.example"> +#<include file="examples/filter.conf.example"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Gecosban: Implements extended ban r:, which stops anyone matching @@ -783,7 +783,7 @@ # specify below the path to the helpop.conf file, or if you like to # # make a mess, define your helpop tags in this conf. # # # -#<include file="conf/examples/inspircd.helpop-full.example"> +#<include file="examples/inspircd.helpop-full.example"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # HIDECHANS module: Allows opers to hide their channels list from non- @@ -1232,7 +1232,7 @@ # Read the comment above <connect:allowmotdcolors> in # # inspircd.conf.example for details. # # # -#<opermotd file="conf/examples/opermotd.txt.example" onoper="yes" processcolors="false"> +#<opermotd file="examples/opermotd.txt.example" onoper="yes" processcolors="false"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Override module: Adds support for oper override diff --git a/include/configreader.h b/include/configreader.h index 33456d84b..bf5acbbc8 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -44,7 +44,7 @@ class CoreExport ConfigTag : public refcountbase /** Get the value of an option, using def if it does not exist */ std::string getString(const std::string& key, const std::string& def = ""); /** Get the value of an option, using def if it does not exist */ - long getInt(const std::string& key, long def = 0); + long getInt(const std::string& key, long def = 0, long min = LONG_MIN, long max = LONG_MAX); /** Get the value of an option, using def if it does not exist */ double getFloat(const std::string& key, double def = 0); /** Get the value of an option, using def if it does not exist */ @@ -184,6 +184,32 @@ class CoreExport ServerConfig void CrossCheckConnectBlocks(ServerConfig* current); public: + class ServerPaths + { + public: + /** Config path */ + std::string Config; + + /** Data path */ + std::string Data; + + /** Log path */ + std::string Log; + + /** Module path */ + std::string Module; + + ServerPaths() + : Config(CONFIG_PATH) + , Data(DATA_PATH) + , Log(LOG_PATH) + , Module(MOD_PATH) { } + + std::string PrependConfig(const std::string& fn) const { return ServerConfig::ExpandPath(Config, fn); } + std::string PrependData(const std::string& fn) const { return ServerConfig::ExpandPath(Data, fn); } + std::string PrependLog(const std::string& fn) const { return ServerConfig::ExpandPath(Log, fn); } + std::string PrependModule(const std::string& fn) const { return ServerConfig::ExpandPath(Module, fn); } + }; /** Get a configuration tag * @param tag The name of the tag to get @@ -220,6 +246,9 @@ class CoreExport ServerConfig */ ServerLimits Limits; + /** Locations of various types of file (config, module, etc). */ + ServerPaths Paths; + /** Configuration parsed from the command line. */ CommandLineConf cmdline; @@ -239,9 +268,9 @@ class CoreExport ServerConfig */ std::string ServerName; - /** Notice to give to users when they are Xlined + /** Notice to give to users when they are banned by an XLine */ - std::string MoronBanner; + std::string XLineMessage; /* Holds the network name the local server * belongs to. This is an arbitary field defined @@ -333,13 +362,6 @@ class CoreExport ServerConfig */ char DisabledCModes[64]; - /** The full path to the modules directory. - * This is either set at compile time, or - * overridden in the configuration file via - * the \<path> tag. - */ - std::string ModPath; - /** If set to true, then all opers on this server are * shown with a generic 'is an IRC operator' line rather * than the oper type. Oper types are still used internally. @@ -508,7 +530,7 @@ class CoreExport ServerConfig /** Returns true if the given string starts with a windows drive letter */ - bool StartsWithWindowsDriveLetter(const std::string &path); + static bool StartsWithWindowsDriveLetter(const std::string& path); bool ApplyDisabledCommands(const std::string& data); @@ -523,7 +545,13 @@ class CoreExport ServerConfig * @return True if the file exists and is readable. */ static bool FileExists(const char* file); - + + /** Expands a path fragment to a full path. + * @param base The base path to expand from + * @param fragment The path fragment to expand on top of base. + */ + static std::string ExpandPath(const std::string& base, const std::string& fragment); + /** Escapes a value for storage in a configuration key. * @param str The string to escape. * @param xml Are we using the XML config format? diff --git a/include/users.h b/include/users.h index aaf9b5cda..aa11a2b82 100644 --- a/include/users.h +++ b/include/users.h @@ -133,7 +133,7 @@ struct CoreExport ConnectClass : public refcountbase /** If set to true, no user DNS lookups are to be performed */ - bool nouserdns; + bool resolvehostnames; /** Create a new connect class with no settings. */ diff --git a/src/channels.cpp b/src/channels.cpp index d82ad6c23..c7913606f 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -162,6 +162,9 @@ void Channel::SetDefaultModes() ModeHandler* mode = ServerInstance->Modes->FindMode(*n, MODETYPE_CHANNEL); if (mode) { + if (mode->GetPrefixRank()) + continue; + if (mode->GetNumParams(true)) list.GetToken(parameter); else @@ -223,7 +226,7 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co if (!chan) { - privs = "o"; + privs = ServerInstance->Config->DefaultModes.substr(0, ServerInstance->Config->DefaultModes.find(' ')); if (override == false) { @@ -343,7 +346,7 @@ void Channel::ForceJoin(User* user, const std::string* privs, bool bursting, boo for (std::string::const_iterator i = privs->begin(); i != privs->end(); ++i) { ModeHandler* mh = ServerInstance->Modes->FindMode(*i, MODETYPE_CHANNEL); - if (mh) + if (mh && mh->GetPrefixRank()) { std::string nick = user->nick; /* Set, and make sure that the mode handler knows this mode was now set */ diff --git a/src/commands/cmd_hostname_lookup.cpp b/src/commands/cmd_hostname_lookup.cpp index 1352f0e78..f352443d0 100644 --- a/src/commands/cmd_hostname_lookup.cpp +++ b/src/commands/cmd_hostname_lookup.cpp @@ -199,7 +199,7 @@ class ModuleHostnameLookup : public Module void OnUserInit(LocalUser *user) { - if (!DNS || user->MyClass->nouserdns) + if (!DNS || !user->MyClass->resolvehostnames) { user->WriteNotice("*** Skipping host resolution (disabled by server administrator)"); return; diff --git a/src/commands/cmd_whowas.cpp b/src/commands/cmd_whowas.cpp index 28daf7311..8a1c9a820 100644 --- a/src/commands/cmd_whowas.cpp +++ b/src/commands/cmd_whowas.cpp @@ -342,12 +342,10 @@ class ModuleWhoWas : public Module void OnRehash(User* user) { ConfigTag* tag = ServerInstance->Config->ConfValue("whowas"); - int NewGroupSize = tag->getInt("groupsize"); - int NewMaxGroups = tag->getInt("maxgroups"); + int NewGroupSize = tag->getInt("groupsize", 10, 0, 10000); + int NewMaxGroups = tag->getInt("maxgroups", 10240, 0, 1000000); int NewMaxKeep = InspIRCd::Duration(tag->getString("maxkeep")); - RangeCheck(NewGroupSize, 0, 10000, 10, "<whowas:groupsize>"); - RangeCheck(NewMaxGroups, 0, 1000000, 10240, "<whowas:maxgroups>"); RangeCheck(NewMaxKeep, 3600, INT_MAX, 3600, "<whowas:maxkeep>"); if ((NewGroupSize == cmd.WhoWasGroupSize) && (NewMaxGroups == cmd.WhoWasMaxGroups) && (NewMaxKeep == cmd.WhoWasMaxKeep)) diff --git a/src/configparser.cpp b/src/configparser.cpp index 3289cf396..1783e901e 100644 --- a/src/configparser.cpp +++ b/src/configparser.cpp @@ -323,9 +323,10 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int if (exec && (flags & FLAG_NO_EXEC)) throw CoreException("Invalid <execfiles> tag in file included with noexec=\"yes\""); - FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(name.c_str(), "r"), exec); + std::string path = ServerInstance->Config->Paths.PrependConfig(name); + FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(path.c_str(), "r"), exec); if (!file) - throw CoreException("Could not read \"" + name + "\" for \"" + key + "\" file"); + throw CoreException("Could not read \"" + path + "\" for \"" + key + "\" file"); file_cache& cache = FilesOutput[key]; cache.clear(); @@ -345,23 +346,24 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int bool ParseStack::ParseFile(const std::string& name, int flags, const std::string& mandatory_tag) { - ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading file %s", name.c_str()); + std::string path = ServerInstance->Config->Paths.PrependConfig(name); + ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading file %s", path.c_str()); for (unsigned int t = 0; t < reading.size(); t++) { if (std::string(name) == reading[t]) { - throw CoreException("File " + name + " is included recursively (looped inclusion)"); + throw CoreException("File " + path + " is included recursively (looped inclusion)"); } } /* It's not already included, add it to the list of files we've loaded */ - FileWrapper file(fopen(name.c_str(), "r")); + FileWrapper file(fopen(path.c_str(), "r")); if (!file) - throw CoreException("Could not read \"" + name + "\" for include"); + throw CoreException("Could not read \"" + path + "\" for include"); - reading.push_back(name); - Parser p(*this, flags, file, name, mandatory_tag); + reading.push_back(path); + Parser p(*this, flags, file, path, mandatory_tag); bool ok = p.outer_parse(); reading.pop_back(); return ok; @@ -420,7 +422,7 @@ std::string ConfigTag::getString(const std::string& key, const std::string& def) return res; } -long ConfigTag::getInt(const std::string &key, long def) +long ConfigTag::getInt(const std::string &key, long def, long min, long max) { std::string result; if(!readString(key, result)) @@ -434,15 +436,21 @@ long ConfigTag::getInt(const std::string &key, long def) switch (toupper(*res_tail)) { case 'K': - res= res* 1024; + res = res * 1024; break; case 'M': - res= res* 1024 * 1024; + res = res * 1024 * 1024; break; case 'G': - res= res* 1024 * 1024 * 1024; + res = res * 1024 * 1024 * 1024; break; } + if (res < min || res > max) + { + ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "WARNING: <%s:%s> value of %ld is not between %ld and %ld; set to %ld.", + tag.c_str(), key.c_str(), res, min, max, def); + res = def; + } return res; } diff --git a/src/configreader.cpp b/src/configreader.cpp index 047a2b5cd..af7a8ca59 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -44,16 +44,6 @@ ServerConfig::ServerConfig() c_ipv6_range = 128; } -template<typename T, typename V> -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.", - msg, (long)value, (long)min, (long)max, (long)def); - value = def; -} - static void ValidHost(const std::string& p, const std::string& msg) { int num_dots = 0; @@ -309,7 +299,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); + me->resolvehostnames = tag->getBool("resolvehostnames", me->resolvehostnames); ClassMap::iterator oldMask = oldBlocksByMask.find(typeMask); if (oldMask != oldBlocksByMask.end()) @@ -350,7 +340,7 @@ static const DeprecatedConfig ChangedConfig[] = { { "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 <connect:nouserdns> as of 2.2" } + { "performance", "nouserdns", "", "has been moved to <connect:resolvehostnames> as of 2.2" } }; void ServerConfig::Fill() @@ -359,9 +349,10 @@ void ServerConfig::Fill() ConfigTag* security = ConfValue("security"); if (sid.empty()) { - ServerName = ConfValue("server")->getString("name"); - sid = ConfValue("server")->getString("id"); + 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."); } @@ -383,22 +374,21 @@ void ServerConfig::Fill() PrefixPart = options->getString("prefixpart"); SuffixPart = options->getString("suffixpart"); FixedPart = options->getString("fixedpart"); - SoftLimit = ConfValue("performance")->getInt("softlimit", ServerInstance->SE->GetMaxFds()); + SoftLimit = ConfValue("performance")->getInt("softlimit", ServerInstance->SE->GetMaxFds(), 10, ServerInstance->SE->GetMaxFds()); CCOnConnect = ConfValue("performance")->getBool("clonesonconnect", true); MaxConn = ConfValue("performance")->getInt("somaxconn", SOMAXCONN); - MoronBanner = options->getString("moronbanner", "You're banned!"); + 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"); - ModPath = ConfValue("path")->getString("moduledir", MOD_PATH); - NetBufferSize = ConfValue("performance")->getInt("netbuffersize", 10240); + 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", Network + " IRCd"); + CustomVersion = security->getString("customversion"); HideSplits = security->getBool("hidesplits"); HideBans = security->getBool("hidebans"); HideWhoisServer = security->getString("hidewhois"); @@ -409,8 +399,8 @@ void ServerConfig::Fill() CycleHostsFromUser = options->getBool("cyclehostsfromuser"); UndernetMsgPrefix = options->getBool("ircumsgprefix"); FullHostInTopic = options->getBool("hostintopic"); - MaxTargets = security->getInt("maxtargets", 20); - DefaultModes = options->getString("defaultmodes", "nt"); + 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); @@ -426,16 +416,16 @@ void ServerConfig::Fill() 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); 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."); - range(SoftLimit, 10, ServerInstance->SE->GetMaxFds(), ServerInstance->SE->GetMaxFds(), "<performance:softlimit>"); - range(MaxTargets, 1, 31, 20, "<security:maxtargets>"); - range(NetBufferSize, 1024, 65534, 10240, "<performance:netbuffersize>"); - std::string defbind = options->getString("defaultbind"); if (assign(defbind) == "ipv4") { @@ -461,6 +451,10 @@ void ServerConfig::Fill() std::string server; if (!tag->readString("server", server)) throw CoreException("<uline> 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"); } @@ -565,7 +559,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) { errstr << ' ' << ChangedConfig[index].key << "=\"" << ChangedConfig[index].value << "\""; } - errstr << "> - " << ChangedConfig[index].reason << " (at " << i->second->getTagLocation() << ")\n"; + errstr << "> - " << ChangedConfig[index].reason << " (at " << i->second->getTagLocation() << ")" << std::endl; } } } @@ -588,6 +582,11 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) if (valid) ServerInstance->WritePID(this->PID); + ConfigTagList binds = ConfTags("bind"); + if (binds.first == binds.second) + errstr << "Possible configuration error: you have not defined any <bind> blocks." << std::endl + << "You will need to do this if you want clients to be able to connect!" << std::endl; + if (old) { // On first run, ports are bound later on @@ -795,6 +794,15 @@ std::string ServerConfig::Escape(const std::string& str, bool xml) return escaped; } +std::string ServerConfig::ExpandPath(const std::string& base, const std::string& fragment) +{ + // The fragment is an absolute path, don't modify it. + if (fragment[0] == '/' || ServerConfig::StartsWithWindowsDriveLetter(fragment)) + return fragment; + + return base + '/' + fragment; +} + const char* ServerConfig::CleanFilename(const char* name) { const char* p = name + strlen(name); diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 59c65b931..f2095c4a2 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -207,7 +207,7 @@ void InspIRCd::WritePID(const std::string &filename) #ifndef _WIN32 std::string fname(filename); if (fname.empty()) - fname = DATA_PATH "/inspircd.pid"; + fname = ServerInstance->Config->Paths.PrependData("inspircd.pid"); std::ofstream outfile(fname.c_str()); if (outfile.is_open()) { diff --git a/src/logger.cpp b/src/logger.cpp index 47c726c51..61ac517c7 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -112,7 +112,7 @@ void LogManager::OpenFileLogs() loglevel = LOG_NONE; } FileWriter* fw; - std::string target = tag->getString("target"); + std::string target = ServerInstance->Config->Paths.PrependLog(tag->getString("target")); std::map<std::string, FileWriter*>::iterator fwi = logmap.find(target); if (fwi == logmap.end()) { diff --git a/src/modmanager_dynamic.cpp b/src/modmanager_dynamic.cpp index 92a7e0a32..750a1c448 100644 --- a/src/modmanager_dynamic.cpp +++ b/src/modmanager_dynamic.cpp @@ -37,7 +37,7 @@ bool ModuleManager::Load(const std::string& filename, bool defer) if (filename.find('/') != std::string::npos) return false; - const std::string moduleFile = ServerInstance->Config->ModPath + "/" + filename; + const std::string moduleFile = ServerInstance->Config->Paths.PrependModule(filename); if (!ServerConfig::FileExists(moduleFile.c_str())) { @@ -190,7 +190,7 @@ void ModuleManager::LoadAll() std::cout << std::endl << "Loading core commands"; fflush(stdout); - DIR* library = opendir(ServerInstance->Config->ModPath.c_str()); + DIR* library = opendir(ServerInstance->Config->Paths.Module.c_str()); if (library) { dirent* entry = NULL; diff --git a/src/modules.cpp b/src/modules.cpp index 5fc8ffc47..47c994088 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -577,7 +577,8 @@ FileReader::FileReader(const std::string& filename) void FileReader::Load(const std::string& filename) { // If the file is stored in the file cache then we used that version instead. - ConfigFileCache::iterator it = ServerInstance->Config->Files.find(filename); + std::string realName = ServerInstance->Config->Paths.PrependConfig(filename); + ConfigFileCache::iterator it = ServerInstance->Config->Files.find(realName); if (it != ServerInstance->Config->Files.end()) { this->lines = it->second; @@ -586,7 +587,7 @@ void FileReader::Load(const std::string& filename) { lines.clear(); - std::ifstream stream(filename.c_str()); + std::ifstream stream(realName.c_str()); if (!stream.is_open()) throw CoreException(filename + " does not exist or is not readable!"); diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp index a3502a57b..28755f05e 100644 --- a/src/modules/extra/m_ssl_gnutls.cpp +++ b/src/modules/extra/m_ssl_gnutls.cpp @@ -684,10 +684,10 @@ class ModuleSSLGnuTLS : public Module ConfigTag* Conf = ServerInstance->Config->ConfValue("gnutls"); - cafile = Conf->getString("cafile", CONFIG_PATH "/ca.pem"); - crlfile = Conf->getString("crlfile", CONFIG_PATH "/crl.pem"); - certfile = Conf->getString("certfile", CONFIG_PATH "/cert.pem"); - keyfile = Conf->getString("keyfile", CONFIG_PATH "/key.pem"); + cafile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("cafile", "ca.pem")); + crlfile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("crlfile", "crl.pem")); + certfile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("certfile", "cert.pem")); + keyfile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("keyfile", "key.pem")); int dh_bits = Conf->getInt("dhbits"); std::string hashname = Conf->getString("hash", "md5"); diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index 29f574fd0..c94527ab0 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -558,10 +558,10 @@ class ModuleSSLOpenSSL : public Module ConfigTag* conf = ServerInstance->Config->ConfValue("openssl"); - cafile = conf->getString("cafile", CONFIG_PATH "/ca.pem"); - certfile = conf->getString("certfile", CONFIG_PATH "/cert.pem"); - keyfile = conf->getString("keyfile", CONFIG_PATH "/key.pem"); - dhfile = conf->getString("dhfile", CONFIG_PATH "/dhparams.pem"); + cafile = ServerInstance->Config->Paths.PrependConfig(conf->getString("cafile", "ca.pem")); + certfile = ServerInstance->Config->Paths.PrependConfig(conf->getString("certfile", "cert.pem")); + keyfile = ServerInstance->Config->Paths.PrependConfig(conf->getString("keyfile", "key.pem")); + dhfile = ServerInstance->Config->Paths.PrependConfig(conf->getString("dhfile", "dhparams.pem")); std::string hash = conf->getString("hash", "md5"); iohook.digest = EVP_get_digestbyname(hash.c_str()); diff --git a/src/modules/m_blockcaps.cpp b/src/modules/m_blockcaps.cpp index 8e7d76f4a..f80c6d16d 100644 --- a/src/modules/m_blockcaps.cpp +++ b/src/modules/m_blockcaps.cpp @@ -104,22 +104,12 @@ public: void ReadConf() { ConfigTag* tag = ServerInstance->Config->ConfValue("blockcaps"); - percent = tag->getInt("percent", 100); - minlen = tag->getInt("minlen", 1); + percent = tag->getInt("percent", 100, 1, 100); + minlen = tag->getInt("minlen", 1, 1, ServerInstance->Config->Limits.MaxLine); 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; - } } Version GetVersion() CXX11_OVERRIDE diff --git a/src/modules/m_cgiirc.cpp b/src/modules/m_cgiirc.cpp index 65671632d..2352fa217 100644 --- a/src/modules/m_cgiirc.cpp +++ b/src/modules/m_cgiirc.cpp @@ -206,7 +206,7 @@ class ModuleCgiIRC : public Module RecheckClass(user); // Don't create the resolver if the core couldn't put the user in a connect class or when dns is disabled - if (user->quitting || !DNS || user->MyClass->nouserdns) + if (user->quitting || !DNS || !user->MyClass->resolvehostnames) return; CGIResolver* r = new CGIResolver(*this->DNS, this, cmd.notify, newip, user, (was_pass ? "PASS" : "IDENT"), waiting); diff --git a/src/modules/m_connectban.cpp b/src/modules/m_connectban.cpp index c730602a1..36e10ec5b 100644 --- a/src/modules/m_connectban.cpp +++ b/src/modules/m_connectban.cpp @@ -43,18 +43,9 @@ class ModuleConnectBan : public Module { 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; - + ipv4_cidr = tag->getInt("ipv4cidr", 32, 1, 32); + ipv6_cidr = tag->getInt("ipv6cidr", 128, 1, 128); + threshold = tag->getInt("threshold", 10, 1); banduration = InspIRCd::Duration(tag->getString("duration", "10m")); if (banduration == 0) banduration = 10*60; diff --git a/src/modules/m_nationalchars.cpp b/src/modules/m_nationalchars.cpp index 10347ac67..99e525398 100644 --- a/src/modules/m_nationalchars.cpp +++ b/src/modules/m_nationalchars.cpp @@ -298,7 +298,7 @@ class ModuleNationalChars : public Module /*so Bynets Unreal distribution stuff*/ void loadtables(std::string filename, unsigned char ** tables, unsigned char cnt, char faillimit) { - std::ifstream ifs(filename.c_str()); + std::ifstream ifs(ServerInstance->Config->Paths.PrependConfig(filename).c_str()); if (ifs.fail()) { ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "loadtables() called for missing file: %s", filename.c_str()); diff --git a/src/modules/m_xline_db.cpp b/src/modules/m_xline_db.cpp index df6f4c10c..63eb6d3ee 100644 --- a/src/modules/m_xline_db.cpp +++ b/src/modules/m_xline_db.cpp @@ -36,7 +36,7 @@ class ModuleXLineDB : public Module * ...and so is discarding all current in-memory XLines for the ones in the database. */ ConfigTag* Conf = ServerInstance->Config->ConfValue("xlinedb"); - xlinedbpath = Conf->getString("filename", DATA_PATH "/xline.db"); + xlinedbpath = ServerInstance->Config->Paths.PrependData(Conf->getString("filename", "xline.db")); // Read xlines before attaching to events ReadDatabase(); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 605bc1f69..538feaade 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -129,8 +129,8 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs { /* user banned */ ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCache: Positive hit for " + New->GetIPString()); - if (!ServerInstance->Config->MoronBanner.empty()) - New->WriteNotice("*** " + ServerInstance->Config->MoronBanner); + if (!ServerInstance->Config->XLineMessage.empty()) + New->WriteNotice("*** " + ServerInstance->Config->XLineMessage); this->QuitUser(New, b->Reason); return; } diff --git a/src/users.cpp b/src/users.cpp index b49587b38..21079f0cc 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -1308,7 +1308,7 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask) : config(tag), type(t), fakelag(true), name("unnamed"), registration_timeout(0), host(mask), pingtime(0), softsendqmax(0), hardsendqmax(0), recvqmax(0), penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxconnwarn(true), maxchans(0), - limit(0), nouserdns(false) + limit(0), resolvehostnames(true) { } @@ -1318,7 +1318,7 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, cons softsendqmax(parent.softsendqmax), hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax), penaltythreshold(parent.penaltythreshold), commandrate(parent.commandrate), maxlocal(parent.maxlocal), maxglobal(parent.maxglobal), maxconnwarn(parent.maxconnwarn), maxchans(parent.maxchans), - limit(parent.limit), nouserdns(parent.nouserdns) + limit(parent.limit), resolvehostnames(parent.resolvehostnames) { } @@ -1341,5 +1341,5 @@ void ConnectClass::Update(const ConnectClass* src) maxconnwarn = src->maxconnwarn; maxchans = src->maxchans; limit = src->limit; - nouserdns = src->nouserdns; + resolvehostnames = src->resolvehostnames; } diff --git a/src/xline.cpp b/src/xline.cpp index 44ae1e98e..bc8e596bd 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -533,8 +533,8 @@ void XLine::DefaultApply(User* u, const std::string &line, bool bancache) { const std::string banReason = line + "-Lined: " + reason; - if (!ServerInstance->Config->MoronBanner.empty()) - u->WriteNotice("*** " + ServerInstance->Config->MoronBanner); + if (!ServerInstance->Config->XLineMessage.empty()) + u->WriteNotice("*** " + ServerInstance->Config->XLineMessage); if (ServerInstance->Config->HideBans) ServerInstance->Users->QuitUser(u, line + "-Lined", banReason.c_str()); |