]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cloaking.cpp
Fix all typos (not as fun as 'kill all humans' but meh, beggers cant be choosers)
[user/henk/code/inspircd.git] / src / modules / m_cloaking.cpp
index c48ff7b9c7ce9ab5c21501edd083d3a0ccb09ef8..21e275c1eaa230df2b7063372f14d1f38bbc8541 100644 (file)
@@ -33,6 +33,7 @@ using namespace std;
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <stdint.h>
 #include "users.h"
 #include "channels.h"
 #include "modules.h"
@@ -48,7 +49,7 @@ using namespace std;
 #define F4(x, y, z) (y ^ (x | ~z))
 #define MD5STEP(f,w,x,y,z,in,s) (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
 
-typedef unsigned long word32;
+typedef uint32_t word32; /* NOT unsigned long. We don't support 16 bit platforms, anyway. */
 typedef unsigned char byte;
 
 struct xMD5Context {
@@ -61,7 +62,12 @@ class ModuleCloaking : public Module
 {
  private:
 
-        Server *Srv;
+       Server *Srv;
+       std::string prefix;
+       word32 key1;
+       word32 key2;
+       word32 key3;
+       word32 key4;
 
        void byteSwap(word32 *buf, unsigned words)
        {
@@ -77,10 +83,10 @@ class ModuleCloaking : public Module
 
        void xMD5Init(struct xMD5Context *ctx)
        {
-               ctx->buf[0] = 0x67452301;
-               ctx->buf[1] = 0xefcdab89;
-               ctx->buf[2] = 0x98badcfe;
-               ctx->buf[3] = 0x10325476;
+               ctx->buf[0] = key1;
+               ctx->buf[1] = key2;
+               ctx->buf[2] = key3;
+               ctx->buf[3] = key4;
 
                ctx->bytes[0] = 0;
                ctx->bytes[1] = 0;
@@ -280,17 +286,9 @@ class ModuleCloaking : public Module
                // we must create a new mode. Set the parameters so the
                // mode doesn't require oper, and is a client usermode
                // with no parameters (actually, you cant have params for a umode!)
-               if (!Srv->AddExtendedMode('x',MT_CLIENT,false,0,0))
-               {
-                       // we couldn't claim mode x... possibly anther module has it,
-                       // this might become likely to happen if there are a lot of 3rd
-                       // party modules around in the future -- any 3rd party modules
-                       // SHOULD implement a system of configurable mode letters (e.g.
-                       // from a config file)
-                       Srv->Log(DEFAULT,"*** m_cloaking: ERROR, failed to allocate user mode +x!");
-                       printf("Could not claim usermode +x for this module!");
-                       return;
-               }
+               Srv->AddExtendedMode('x',MT_CLIENT,false,0,0);
+
+               OnRehash("");
        }
        
        virtual ~ModuleCloaking()
@@ -304,9 +302,34 @@ class ModuleCloaking : public Module
                return Version(1,0,0,1,VF_STATIC|VF_VENDOR);
        }
 
+       virtual void OnRehash(const std::string &parameter)
+       {
+               ConfigReader* Conf = new ConfigReader();
+               key1 = key2 = key3 = key4 = 0;
+               key1 = Conf->ReadInteger("cloak","key1",0,false);
+               key2 = Conf->ReadInteger("cloak","key2",0,false);
+               key3 = Conf->ReadInteger("cloak","key3",0,false);
+               key4 = Conf->ReadInteger("cloak","key4",0,false);
+               prefix = Conf->ReadValue("cloak","prefix",0);
+               if (prefix == "")
+               {
+                       prefix = Srv->GetNetworkName();
+               }
+               if (!key1 && !key2 && !key3 && !key4)
+               {
+                       ModuleException ex("You have not defined cloak keys for m_cloaking!!! THIS IS INSECURE AND SHOULD BE CHECKED!");
+                       throw (ex);
+               }
+
+               /*ctx->buf[0] = 0x67452301;
+               ctx->buf[1] = 0xefcdab89;
+               ctx->buf[2] = 0x98badcfe;
+               ctx->buf[3] = 0x10325476;*/
+       }
+
        void Implements(char* List)
        {
-               List[I_OnExtendedMode] = List[I_OnUserConnect] = 1;
+               List[I_OnRehash] = List[I_OnExtendedMode] = List[I_OnUserConnect] = 1;
        }
        
        virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params)
@@ -346,15 +369,21 @@ class ModuleCloaking : public Module
                                        this->GenHash(dest->host,ra);
                                        std::string b = "";
                                        in_addr testaddr;
-                                       if (!inet_aton(dest->host,&testaddr))
+                                       std::string hostcloak = prefix + "-" + std::string(ra) + a;
+                                       /* Fix by brain - if the cloaked host is > the max length of a host (64 bytes
+                                        * according to the DNS RFC) then tough titty, they get cloaked as an IP. 
+                                        * Their ISP shouldnt go to town on subdomains, or they shouldnt have a kiddie
+                                        * vhost.
+                                        */
+                                       if ((!inet_aton(dest->host,&testaddr)) && (hostcloak.length() < 64))
                                        {
                                                // if they have a hostname, make something appropriate
-                                               b = Srv->GetNetworkName() + "-" + std::string(ra) + a;
+                                               b = hostcloak;
                                        }
                                        else
                                        {
                                                // else, they have an ip
-                                               b = std::string(ra) + "." + Srv->GetNetworkName() + ".cloak";
+                                               b = std::string(ra) + "." + prefix + ".cloak";
                                        }
                                        Srv->Log(DEBUG,"cloak: allocated "+b);
                                        Srv->ChangeHost(dest,b);