X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fserver.cpp;h=dbc51e37c3ee971d5c502c58c4f98ced4e33618b;hb=23b8d6bbed74a44bef4936b1f92d0376a974bf76;hp=42dce137230ad892c743cb456d94c7a702aa132a;hpb=8f5efbc7aa33b792e02d01e3288f553e6e98ccaa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/server.cpp b/src/server.cpp index 42dce1372..dbc51e37c 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1,8 +1,15 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2019 nia + * Copyright (C) 2013-2014, 2016 Attila Molnar + * Copyright (C) 2013, 2016-2017, 2020 Sadie Powell + * Copyright (C) 2013 Adam + * Copyright (C) 2012 Robby + * Copyright (C) 2012 ChrisTX + * Copyright (C) 2009 Uli Schlachter * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2008 Craig Edwards + * Copyright (C) 2008, 2010 Craig Edwards * Copyright (C) 2007-2008 Robin Burchell * Copyright (C) 2007 Dennis Friis * @@ -20,9 +27,9 @@ */ -#include -#include "exitcodes.h" #include "inspircd.h" +#include "exitcodes.h" +#include void InspIRCd::SignalHandler(int signal) { @@ -46,7 +53,6 @@ void InspIRCd::Exit(int status) #ifdef _WIN32 SetServiceStopped(status); #endif - this->SendError("Exiting with status " + ConvToStr(status) + " (" + std::string(ExitCodes[status]) + ")"); this->Cleanup(); ServerInstance = NULL; delete this; @@ -65,8 +71,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->GetServerName() + " :" + Config->CustomVersion; } std::string UIDGenerator::GenerateSID(const std::string& servername, const std::string& serverdesc) @@ -156,6 +162,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() { /** @@ -165,23 +192,22 @@ void ISupportManager::Build() std::map tokens; tokens["AWAYLEN"] = ConvToStr(ServerInstance->Config->Limits.MaxAway); - tokens["CASEMAPPING"] = "rfc1459"; - tokens["CHANMODES"] = ServerInstance->Modes->GiveModeList(MODETYPE_CHANNEL); + tokens["CASEMAPPING"] = ServerInstance->Config->CaseMapping; + tokens["CHANLIMIT"] = InspIRCd::Format("#:%u", ServerInstance->Config->MaxChans); 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["NAMELEN"] = ConvToStr(ServerInstance->Config->Limits.MaxReal); tokens["NETWORK"] = ServerInstance->Config->Network; tokens["NICKLEN"] = ConvToStr(ServerInstance->Config->Limits.NickMax); 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)); @@ -195,35 +221,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); }