diff options
-rw-r--r-- | src/modules/m_cloaking.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp index ae28075c0..907026df7 100644 --- a/src/modules/m_cloaking.cpp +++ b/src/modules/m_cloaking.cpp @@ -38,6 +38,37 @@ class CloakUser : public ModeHandler unsigned int key4; Module* Sender; Module* HashProvider; + + /** This function takes a domain name string and returns just the last two domain parts, + * or the last domain part if only two are available. Failing that it just returns what it was given. + * + * For example, if it is passed "svn.inspircd.org" it will return ".inspircd.org". + * If it is passed "brainbox.winbot.co.uk" it will return ".co.uk", + * and if it is passed "localhost.localdomain" it will return ".localdomain". + * + * This is used to ensure a significant part of the host is always cloaked (see Bug #216) + */ + std::string LastTwoDomainParts(const std::string &host) + { + int dots = 0; + std::string::size_type splitdot = host.length(); + + for (std::string::size_type x = host.length() - 1; x; --x) + { + if (host[x] == '.') + { + splitdot = x; + dots++; + } + if (dots >= 2) + break; + } + + if (splitdot == host.length()) + return host; + else + return host.substr(splitdot); + } public: CloakUser(InspIRCd* Instance, Module* Source, Module* Hash) : ModeHandler(Instance, 'x', 0, 0, false, MODETYPE_USER, false), Sender(Source), HashProvider(Hash) @@ -81,7 +112,7 @@ class CloakUser : public ModeHandler */ unsigned int iv[] = { key1, key2, key3, key4 }; - std::string a = (n1 ? n1 : n2); + std::string a = LastTwoDomainParts(dest->host); std::string b; /** Reset the Hash module, and send it our IV and hex table */ |