]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cloaking.cpp
Add config <options:disablehmac> to support disabling of HMAC, and tidy up to detect...
[user/henk/code/inspircd.git] / src / modules / m_cloaking.cpp
index ae28075c00bb2e0867719aae2b8c89c007380e8a..f9b6734ce89f3f5a478ea81c5e060bfd835f3f1c 100644 (file)
@@ -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 >= 3)
+                               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 */