diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/server.cpp b/src/server.cpp index 1a92c13a0..1eebdd9e0 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -155,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 <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() { /** @@ -200,10 +221,7 @@ void ISupportManager::Build() { 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++; |