]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cgiirc.cpp
Merge pull request #1321 from SaberUK/insp20+permwarn
[user/henk/code/inspircd.git] / src / modules / m_cgiirc.cpp
index 63efd6bae8caf541b844c181cf800c8225b51ddc..09f6a4659d88e0d760a85d48166514ed825b68d8 100644 (file)
@@ -73,6 +73,7 @@ class CommandWebirc : public Command
                  realhost("cgiirc_realhost", Creator), realip("cgiirc_realip", Creator),
                  webirc_hostname("cgiirc_webirc_hostname", Creator), webirc_ip("cgiirc_webirc_ip", Creator)
                {
+                       allow_empty_last_param = false;
                        works_before_reg = true;
                        this->syntax = "password client hostname ip";
                }
@@ -81,6 +82,14 @@ class CommandWebirc : public Command
                        if(user->registered == REG_ALL)
                                return CMD_FAILURE;
 
+                       irc::sockets::sockaddrs ipaddr;
+                       if (!irc::sockets::aptosa(parameters[3], 0, ipaddr))
+                       {
+                               IS_LOCAL(user)->CommandFloodPenalty += 5000;
+                               ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s tried to use WEBIRC but gave an invalid IP address.", user->GetFullRealHost().c_str());
+                               return CMD_FAILURE;
+                       }
+
                        for(CGIHostlist::iterator iter = Hosts.begin(); iter != Hosts.end(); iter++)
                        {
                                if(InspIRCd::Match(user->host, iter->hostmask, ascii_case_insensitive_map) || InspIRCd::MatchCIDR(user->GetIPString(), iter->hostmask, ascii_case_insensitive_map))
@@ -108,6 +117,7 @@ class CommandWebirc : public Command
                                }
                        }
 
+                       IS_LOCAL(user)->CommandFloodPenalty += 5000;
                        ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s tried to use WEBIRC, but didn't match any configured webirc blocks.", user->GetFullRealHost().c_str());
                        return CMD_FAILURE;
                }
@@ -176,9 +186,9 @@ class ModuleCgiIRC : public Module
        CommandWebirc cmd;
        LocalIntExt waiting;
 
-       static void RecheckElineAndClass(LocalUser* user)
+       static void RecheckClass(LocalUser* user)
        {
-               user->exempt = (ServerInstance->XLines->MatchesLine("E", user) != NULL);
+               user->MyClass = NULL;
                user->SetClass();
                user->CheckClass();
        }
@@ -198,7 +208,7 @@ class ModuleCgiIRC : public Module
                ChangeIP(user, newip);
                user->host = user->dhost = user->GetIPString();
                user->InvalidateCache();
-               RecheckElineAndClass(user);
+               RecheckClass(user);
                // Don't create the resolver if the core couldn't put the user in a connect class or when dns is disabled
                if (user->quitting || ServerInstance->Config->NoUserDns)
                        return;
@@ -207,8 +217,8 @@ class ModuleCgiIRC : public Module
                {
                        bool cached;
                        CGIResolver* r = new CGIResolver(this, cmd.notify, newip, user, (was_pass ? "PASS" : "IDENT"), cached, waiting);
-                       ServerInstance->AddResolver(r, cached);
                        waiting.set(user, waiting.get(user) + 1);
+                       ServerInstance->AddResolver(r, cached);
                }
                catch (...)
                {
@@ -294,8 +304,9 @@ public:
 
                std::string* webirc_hostname = cmd.webirc_hostname.get(user);
                user->host = user->dhost = (webirc_hostname ? *webirc_hostname : user->GetIPString());
+               user->InvalidateCache();
 
-               RecheckElineAndClass(user);
+               RecheckClass(user);
                if (user->quitting)
                        return MOD_RES_DENY;