]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cloaking.cpp
Fix segfault in m_chanprotect when OnAccessCheck is called with a null channel
[user/henk/code/inspircd.git] / src / modules / m_cloaking.cpp
index a236300f18404bf623e7ad73a12b738862dd4530..2fa3b9e6359618d294ea9b747ee97508c093e51a 100644 (file)
@@ -28,7 +28,6 @@ class CloakUser : public ModeHandler
        unsigned int key3;
        unsigned int key4;
        bool ipalways;
-       Module* Sender;
        Module* HashProvider;
        const char *xtab[4];
 
@@ -63,11 +62,12 @@ class CloakUser : public ModeHandler
                        return host.substr(splitdot);
        }
 
-       CloakUser(InspIRCd* Instance, Module* source, Module* Hash) : ModeHandler(Instance, 'x', 0, 0, false, MODETYPE_USER, false), Sender(source), HashProvider(Hash)
+       CloakUser(InspIRCd* Instance, Module* source, Module* Hash) 
+               : ModeHandler(Instance, source, 'x', 0, 0, false, MODETYPE_USER, false), HashProvider(Hash)
        {
        }
 
-       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding, bool)
+       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
        {
                /* For remote clients, we dont take any action, we just allow it.
                 * The local server where they are will set their cloak instead.
@@ -100,7 +100,7 @@ class CloakUser : public ModeHandler
                                if (!dest->GetExt("cloaked_host", cloak))
                                {
                                        /* Force creation of missing cloak */
-                                       Sender->OnUserConnect(dest);
+                                       creator->OnUserConnect(dest);
                                }
                                if (dest->GetExt("cloaked_host", cloak))
                                {
@@ -145,14 +145,14 @@ class CloakUser : public ModeHandler
                octet[1] = octet[0] + "." + octet[1];
 
                /* Reset the Hash module and send it our IV */
-               HashResetRequest(Sender, HashProvider).Send();
-               HashKeyRequest(Sender, HashProvider, iv).Send();
+               HashResetRequest(creator, HashProvider).Send();
+               HashKeyRequest(creator, HashProvider, iv).Send();
 
                /* Send the Hash module a different hex table for each octet group's Hash sum */
                for (int k = 0; k < 4; k++)
                {
-                       HashHexRequest(Sender, HashProvider, xtab[(iv[k]+i[k]) % 4]).Send();
-                       ra[k] = std::string(HashSumRequest(Sender, HashProvider, octet[k]).Send()).substr(0,6);
+                       HashHexRequest(creator, HashProvider, xtab[(iv[k]+i[k]) % 4]).Send();
+                       ra[k] = std::string(HashSumRequest(creator, HashProvider, octet[k]).Send()).substr(0,6);
                }
                /* Stick them all together */
                return std::string().append(ra[0]).append(".").append(ra[1]).append(".").append(ra[2]).append(".").append(ra[3]);
@@ -166,8 +166,8 @@ class CloakUser : public ModeHandler
                int rounds = 0;
 
                /* Reset the Hash module and send it our IV */
-               HashResetRequest(Sender, HashProvider).Send();
-               HashKeyRequest(Sender, HashProvider, iv).Send();
+               HashResetRequest(creator, HashProvider).Send();
+               HashKeyRequest(creator, HashProvider, iv).Send();
 
                for (const char* input = ip; *input; input++)
                {
@@ -175,8 +175,8 @@ class CloakUser : public ModeHandler
                        if (item.length() > 7)
                        {
                                /* Send the Hash module a different hex table for each octet group's Hash sum */
-                               HashHexRequest(Sender, HashProvider, xtab[(key1+rounds) % 4]).Send();
-                               hashies.push_back(std::string(HashSumRequest(Sender, HashProvider, item).Send()).substr(0,8));
+                               HashHexRequest(creator, HashProvider, xtab[(key1+rounds) % 4]).Send();
+                               hashies.push_back(std::string(HashSumRequest(creator, HashProvider, item).Send()).substr(0,8));
                                item.clear();
                        }
                        rounds++;
@@ -184,8 +184,8 @@ class CloakUser : public ModeHandler
                if (!item.empty())
                {
                        /* Send the Hash module a different hex table for each octet group's Hash sum */
-                       HashHexRequest(Sender, HashProvider, xtab[(key1+rounds) % 4]).Send();
-                       hashies.push_back(std::string(HashSumRequest(Sender, HashProvider, item).Send()).substr(0,8));
+                       HashHexRequest(creator, HashProvider, xtab[(key1+rounds) % 4]).Send();
+                       hashies.push_back(std::string(HashSumRequest(creator, HashProvider, item).Send()).substr(0,8));
                        item.clear();
                }
                /* Stick them all together */
@@ -282,20 +282,17 @@ class ModuleCloaking : public Module
 
                ServerInstance->Modules->UseInterface("HashRequest");
 
-               Implementation eventlist[] = { I_OnRehash, I_OnUserDisconnect, I_OnCleanup, I_OnCheckBan, I_OnUserConnect, I_OnSyncUserMetaData, I_OnCleanup };
+               Implementation eventlist[] = { I_OnRehash, I_OnUserDisconnect, I_OnCleanup, I_OnCheckBan, I_OnUserConnect, I_OnSyncUser, I_OnCleanup };
                ServerInstance->Modules->Attach(eventlist, this, 6);
 
                CloakExistingUsers();
        }
 
-       void OnSyncUserMetaData(User* user, Module* proto,void* opaque, const std::string &extname, bool displayable)
+       void OnSyncUser(User* user, Module* proto,void* opaque)
        {
-               if ((displayable) && (extname == "cloaked_host"))
-               {
-                       std::string* cloak;
-                       if (user->GetExt("cloaked_host", cloak))
-                               proto->ProtoSendMetaData(opaque, TYPE_USER, user, extname, *cloak);
-               }
+               std::string* cloak;
+               if (user->GetExt("cloaked_host", cloak) && proto->ProtoTranslate(NULL) == "?")
+                       proto->ProtoSendMetaData(opaque, user, "cloaked_host", *cloak);
        }
 
        void CloakExistingUsers()
@@ -310,7 +307,7 @@ class ModuleCloaking : public Module
                }
        }
 
-       virtual int OnCheckBan(User* user, Channel* chan)
+       virtual ModResult OnCheckBan(User* user, Channel* chan)
        {
                char mask[MAXBUF];
                std::string* tofree;
@@ -321,10 +318,10 @@ class ModuleCloaking : public Module
                        for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
                        {
                                if (InspIRCd::Match(mask,i->data))
-                                       return -1;
+                                       return MOD_RES_DENY;
                        }
                }
-               return 0;
+               return MOD_RES_PASSTHRU;
        }
 
        void Prioritize()