]> 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 31f9eea5d9cc7fdc1d0cc38a8b22a098f6d5abfa..2fa3b9e6359618d294ea9b747ee97508c093e51a 100644 (file)
@@ -3,7 +3,7 @@
  *       +------------------------------------+
  *
  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
  *         the file COPYING for details.
@@ -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 */
@@ -250,16 +250,14 @@ class CloakUser : public ModeHandler
 class ModuleCloaking : public Module
 {
  private:
-
        CloakUser* cu;
-       Module* HashModule;
 
  public:
        ModuleCloaking(InspIRCd* Me)
                : Module(Me)
        {
                /* Attempt to locate the md5 service provider, bail if we can't find it */
-               HashModule = ServerInstance->Modules->Find("m_md5.so");
+               Module* HashModule = ServerInstance->Modules->Find("m_md5.so");
                if (!HashModule)
                        throw ModuleException("Can't find m_md5.so. Please load m_md5.so before m_cloaking.so.");
 
@@ -267,7 +265,7 @@ class ModuleCloaking : public Module
 
                try
                {
-                       OnRehash(NULL,"");
+                       OnRehash(NULL);
                }
                catch (ModuleException &e)
                {
@@ -284,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()
@@ -312,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;
@@ -323,20 +318,20 @@ 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()
        {
                /* Needs to be after m_banexception etc. */
-               ServerInstance->Modules->SetPriority(this, I_OnCheckBan, PRIO_LAST);
+               ServerInstance->Modules->SetPriority(this, I_OnCheckBan, PRIORITY_LAST);
 
                /* but before m_conn_umodes, so host is generated ready to apply */
                Module *um = ServerInstance->Modules->Find("m_conn_umodes.so");
-               ServerInstance->Modules->SetPriority(this, I_OnUserConnect, PRIO_AFTER, &um);
+               ServerInstance->Modules->SetPriority(this, I_OnUserConnect, PRIORITY_AFTER, &um);
        }
 
        virtual void OnUserDisconnect(User* user)
@@ -369,7 +364,7 @@ class ModuleCloaking : public Module
                return Version("$Id$", VF_COMMON|VF_VENDOR,API_VERSION);
        }
 
-       virtual void OnRehash(User* user, const std::string &parameter)
+       virtual void OnRehash(User* user)
        {
                cu->DoRehash();
        }
@@ -410,35 +405,21 @@ class ModuleCloaking : public Module
                                 * Their ISP shouldnt go to town on subdomains, or they shouldnt have a kiddie
                                 * vhost.
                                 */
-#ifdef IPV6
-                               in6_addr testaddr;
-                               in_addr testaddr2;
-                               if ((dest->GetProtocolFamily() == AF_INET6) && (inet_pton(AF_INET6,dest->host.c_str(),&testaddr) < 1) && (hostcloak.length() <= 64))
-                                       /* Invalid ipv6 address, and ipv6 user (resolved host) */
-                                       b = hostcloak;
-                               else if ((dest->GetProtocolFamily() == AF_INET) && (inet_aton(dest->host.c_str(),&testaddr2) < 1) && (hostcloak.length() <= 64))
-                                       /* Invalid ipv4 address, and ipv4 user (resolved host) */
-                                       b = hostcloak;
-                               else
-                                       /* Valid ipv6 or ipv4 address (not resolved) ipv4 or ipv6 user */
-                                       b = ((!strchr(dest->host.c_str(),':')) ? cu->Cloak4(dest->host.c_str()) : cu->Cloak6(dest->host.c_str()));
-#else
-                               in_addr testaddr;
-                               if ((inet_aton(dest->host.c_str(),&testaddr) < 1) && (hostcloak.length() <= 64))
-                                       /* Invalid ipv4 address, and ipv4 user (resolved host) */
+                               std::string testaddr;
+                               int testport;
+                               if (!irc::sockets::satoap(&dest->client_sa, testaddr, testport) && (hostcloak.length() <= 64))
+                                       /* not a valid address, must have been a host, so cloak as a host */
                                        b = hostcloak;
+                               else if (dest->client_sa.sa.sa_family == AF_INET6)
+                                       b = cu->Cloak6(dest->GetIPString());
                                else
-                                       /* Valid ipv4 address (not resolved) ipv4 user */
-                                       b = cu->Cloak4(dest->host.c_str());
-#endif
+                                       b = cu->Cloak4(dest->GetIPString());
                        }
                        else
                        {
-#ifdef IPV6
-                               if (dest->GetProtocolFamily() == AF_INET6)
+                               if (dest->client_sa.sa.sa_family == AF_INET6)
                                        b = cu->Cloak6(dest->GetIPString());
-#endif
-                               if (dest->GetProtocolFamily() == AF_INET)
+                               else
                                        b = cu->Cloak4(dest->GetIPString());
                        }