]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cloaking.cpp
Probably wont compile yet - purge_empty_channels refactor
[user/henk/code/inspircd.git] / src / modules / m_cloaking.cpp
index c6595eb6cf0967c6fba281b43a2d5c6ec5c3c560..95187864f458abb3c68bf2ce9859bcd5b4199f8b 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
  *                       E-mail:
  *                <brain@chatspike.net>
  *               <Craig@chatspike.net>
@@ -14,6 +14,8 @@
  * ---------------------------------------------------
  */
 
+using namespace std;
+
 // Hostname cloaking (+x mode) module for inspircd.
 // version 1.0.0.1 by brain (C. J. Edwards) Mar 2004.
 //
 // the server->server link, and all encoding of hosts is
 // done locally on the server by this module.
 
-#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
 #include "users.h"
 #include "channels.h"
 #include "modules.h"
@@ -56,13 +61,19 @@ class ModuleCloaking : public Module
 {
  private:
 
-        Server *Srv;
+       Server *Srv;
+       std::string prefix;
+       int key1;
+       int key2;
+       int key3;
+       int key4;
 
        void byteSwap(word32 *buf, unsigned words)
        {
                byte *p = (byte *)buf;
        
-               do {
+               do
+               {
                        *buf++ = (word32)((unsigned)p[3] << 8 | p[2]) << 16 |
                                ((unsigned)p[1] << 8 | p[0]);
                        p += 4;
@@ -71,10 +82,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;
@@ -91,7 +102,8 @@ class ModuleCloaking : public Module
                        ctx->bytes[1]++;        /* Carry from low to high */
 
                t = 64 - (t & 0x3f);    /* Space available in ctx->in (at least 1) */
-               if ((unsigned)t > (unsigned)len) {
+               if ((unsigned)t > (unsigned)len)
+               {
                        memcpy((byte *)ctx->in + 64 - (unsigned)t, buf, len);
                        return;
                }
@@ -103,7 +115,8 @@ class ModuleCloaking : public Module
                len -= (unsigned)t;
 
                /* Process data in 64-byte chunks */
-               while (len >= 64) {
+               while (len >= 64)
+               {
                        memcpy(ctx->in, buf, 64);
                        byteSwap(ctx->in, 16);
                        xMD5Transform(ctx->buf, ctx->in);
@@ -126,7 +139,8 @@ class ModuleCloaking : public Module
                /* Bytes of padding needed to make 56 bytes (-8..55) */
                count = 56 - 1 - count;
 
-               if (count < 0) {        /* Padding forces an extra block */
+               if (count < 0)
+               {       /* Padding forces an extra block */
                        memset(p, 0, count+8);
                        byteSwap(ctx->in, 16);
                        xMD5Transform(ctx->buf, ctx->in);
@@ -247,7 +261,7 @@ class ModuleCloaking : public Module
                int i = 0;
                unsigned char bytes[16];
                char hash[MAXBUF];
-               strcpy(hash,"");
+               *hash = 0;
                MyMD5((char*)bytes,src,strlen(src));
                for (i = 0; i < 16; i++)
                {
@@ -262,31 +276,22 @@ class ModuleCloaking : public Module
        }
         
  public:
-       ModuleCloaking()
+       ModuleCloaking(Server* Me)
+               : Module::Module(Me)
        {
-               // We must create an instance of the Server class to work with
-               Srv = new Server;
+               // We must take a copy of the Server class to work with
+               Srv = Me;
                
                // 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()
        {
-               // not really neccessary, but free it anyway
-               delete Srv;
        }
        
        virtual Version GetVersion()
@@ -295,6 +300,36 @@ class ModuleCloaking : public Module
                // listed in /MODULES
                return Version(1,0,0,1,VF_STATIC|VF_VENDOR);
        }
+
+       virtual void OnRehash(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_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)
        {
@@ -336,12 +371,12 @@ class ModuleCloaking : public Module
                                        if (!inet_aton(dest->host,&testaddr))
                                        {
                                                // if they have a hostname, make something appropriate
-                                               b = Srv->GetNetworkName() + "-" + std::string(ra) + a;
+                                               b = prefix + "-" + std::string(ra) + a;
                                        }
                                        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);
@@ -395,9 +430,9 @@ class ModuleCloakingFactory : public ModuleFactory
        {
        }
        
-       virtual Module * CreateModule()
+       virtual Module * CreateModule(Server* Me)
        {
-               return new ModuleCloaking;
+               return new ModuleCloaking(Me);
        }
        
 };