*/
-#include <signal.h>
-#include "exitcodes.h"
#include "inspircd.h"
+#include "exitcodes.h"
+#include <signal.h>
void InspIRCd::SignalHandler(int signal)
{
std::string InspIRCd::GetVersionString(bool getFullVersion)
{
if (getFullVersion)
- return INSPIRCD_VERSION " " + Config->ServerName + " :" INSPIRCD_SYSTEM " [" 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)
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 <middle> 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()
{
/**
std::map<std::string, std::string> 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["LINELEN"] = ConvToStr(ServerInstance->Config->Limits.MaxLine);
tokens["MAXTARGETS"] = ConvToStr(ServerInstance->Config->MaxTargets);
tokens["MODES"] = ConvToStr(ServerInstance->Config->Limits.MaxModes);
tokens["NETWORK"] = ServerInstance->Config->Network;
tokens["PREFIX"] = ServerInstance->Modes->BuildPrefixes();
tokens["STATUSMSG"] = ServerInstance->Modes->BuildPrefixes(false);
tokens["TOPICLEN"] = ConvToStr(ServerInstance->Config->Limits.MaxTopic);
- 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));
{
numeric.push(it->first);
std::string& token = numeric.GetParams().back();
-
- // If this token has a value then append a '=' char after the name and then the value itself
- if (!it->second.empty())
- token.append(1, '=').append(it->second);
+ AppendValue(token, it->second);
token_count++;