X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fserver.cpp;h=39d30e37a395ea6d3f3780c31af22fd722ea1874;hb=b443df39386c77cf2d027e2b45c4d629261e0100;hp=256ccfc4c0540a1e2f06c3d914f5b68ce8757a14;hpb=b8d32b75cd8d7d70058706122239d2814d5f6487;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/server.cpp b/src/server.cpp index 256ccfc4c..39d30e37a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -20,9 +20,9 @@ */ -#include -#include "exitcodes.h" #include "inspircd.h" +#include "exitcodes.h" +#include void InspIRCd::SignalHandler(int signal) { @@ -46,13 +46,9 @@ void InspIRCd::Exit(int status) #ifdef _WIN32 SetServiceStopped(status); #endif - if (this) - { - this->SendError("Exiting with status " + ConvToStr(status) + " (" + std::string(ExitCodes[status]) + ")"); - this->Cleanup(); - ServerInstance = NULL; - delete this; - } + this->Cleanup(); + ServerInstance = NULL; + delete this; exit (status); } @@ -68,8 +64,8 @@ void InspIRCd::Rehash(const std::string& uuid) std::string InspIRCd::GetVersionString(bool getFullVersion) { if (getFullVersion) - return INSPIRCD_VERSION " " + Config->ServerName + " :" INSPIRCD_SYSTEM " [" INSPIRCD_REVISION "," INSPIRCD_SOCKETENGINE_NAME "," + Config->sid + "]"; - return INSPIRCD_BRANCH " " + Config->ServerName + " :" + Config->CustomVersion; + return INSPIRCD_VERSION ". " + Config->ServerName + " :[" + Config->sid + "] " + Config->CustomVersion; + return INSPIRCD_BRANCH ". " + Config->ServerName + " :" + Config->CustomVersion; } std::string UIDGenerator::GenerateSID(const std::string& servername, const std::string& serverdesc) @@ -159,6 +155,27 @@ std::string UIDGenerator::GetUID() return current_uid; } +void ISupportManager::AppendValue(std::string& buffer, const std::string& value) +{ + // If this token has no value then we have nothing to do. + if (value.empty()) + return; + + // This function implements value escaping according to the rules of the ISUPPORT draft: + // https://tools.ietf.org/html/draft-brocklesby-irc-isupport-03 + buffer.push_back('='); + for (std::string::const_iterator iter = value.begin(); iter != value.end(); ++iter) + { + // The value must be escaped if: + // (1) It is a banned character in an IRC parameter (NUL, LF, CR, SPACE). + // (2) It has special meaning within an ISUPPORT token (EQUALS, BACKSLASH). + if (*iter == '\0' || *iter == '\n' || *iter == '\r' || *iter == ' ' || *iter == '=' || *iter == '\\') + buffer.append(InspIRCd::Format("\\x%X", *iter)); + else + buffer.push_back(*iter); + } +} + void ISupportManager::Build() { /** @@ -168,14 +185,14 @@ void ISupportManager::Build() std::map tokens; tokens["AWAYLEN"] = ConvToStr(ServerInstance->Config->Limits.MaxAway); - tokens["CASEMAPPING"] = "rfc1459"; + tokens["CASEMAPPING"] = ServerInstance->Config->CaseMapping; + tokens["CHANLIMIT"] = InspIRCd::Format("#:%u", ServerInstance->Config->MaxChans); tokens["CHANMODES"] = ServerInstance->Modes->GiveModeList(MODETYPE_CHANNEL); tokens["CHANNELLEN"] = ConvToStr(ServerInstance->Config->Limits.ChanMax); tokens["CHANTYPES"] = "#"; - tokens["ELIST"] = "MU"; + tokens["HOSTLEN"] = ConvToStr(ServerInstance->Config->Limits.MaxHost); tokens["KICKLEN"] = ConvToStr(ServerInstance->Config->Limits.MaxKick); - tokens["MAXBANS"] = "64"; // TODO: make this a config setting. - tokens["MAXCHANNELS"] = ConvToStr(ServerInstance->Config->MaxChans); + tokens["LINELEN"] = ConvToStr(ServerInstance->Config->Limits.MaxLine); tokens["MAXTARGETS"] = ConvToStr(ServerInstance->Config->MaxTargets); tokens["MODES"] = ConvToStr(ServerInstance->Config->Limits.MaxModes); tokens["NETWORK"] = ServerInstance->Config->Network; @@ -183,8 +200,7 @@ void ISupportManager::Build() tokens["PREFIX"] = ServerInstance->Modes->BuildPrefixes(); tokens["STATUSMSG"] = ServerInstance->Modes->BuildPrefixes(false); tokens["TOPICLEN"] = ConvToStr(ServerInstance->Config->Limits.MaxTopic); - - tokens["FNC"] = tokens["VBANLIST"]; + tokens["USERLEN"] = ConvToStr(ServerInstance->Config->Limits.IdentMax); // Modules can add new tokens and also edit or remove existing tokens FOREACH_MOD(On005Numeric, (tokens)); @@ -198,35 +214,31 @@ void ISupportManager::Build() } // Transform the map into a list of lines, ready to be sent to clients - std::string line; + Numeric::Numeric numeric(RPL_ISUPPORT); unsigned int token_count = 0; cachedlines.clear(); for (std::map::const_iterator it = tokens.begin(); it != tokens.end(); ++it) { - line.append(it->first); - - // If this token has a value then append a '=' char after the name and then the value itself - if (!it->second.empty()) - line.append(1, '=').append(it->second); + numeric.push(it->first); + std::string& token = numeric.GetParams().back(); + AppendValue(token, it->second); - // Always append a space, even if it's the last token because all lines will be suffixed - line.push_back(' '); token_count++; if (token_count % 13 == 12 || it == --tokens.end()) { // Reached maximum number of tokens for this line or the current token // is the last one; finalize the line and store it for later use - line.append(":are supported by this server"); - cachedlines.push_back(line); - line.clear(); + numeric.push("are supported by this server"); + cachedlines.push_back(numeric); + numeric.GetParams().clear(); } } } void ISupportManager::SendTo(LocalUser* user) { - for (std::vector::const_iterator i = cachedlines.begin(); i != cachedlines.end(); ++i) - user->WriteNumeric(RPL_ISUPPORT, *i); + for (std::vector::const_iterator i = cachedlines.begin(); i != cachedlines.end(); ++i) + user->WriteNumeric(*i); }