]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cgiirc.cpp
Set User::host before calling ChangeIP()
[user/henk/code/inspircd.git] / src / modules / m_cgiirc.cpp
index d26c0bca1afb2eb3e154816ef514c9716031c88c..482c6447c9a7378c4205d6c5f228ad2544bfe0da 100644 (file)
@@ -85,6 +85,7 @@ class CommandWebirc : public Command
                        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;
                        }
@@ -98,24 +99,21 @@ class CommandWebirc : public Command
                                                realhost.set(user, user->host);
                                                realip.set(user, user->GetIPString());
 
-                                               bool host_ok = (parameters[2].length() < 64);
+                                               // Check if we're happy with the provided hostname. If it's problematic then use the IP instead.
+                                               bool host_ok = (parameters[2].length() < 64) && (parameters[2].find_first_not_of("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.:-") == std::string::npos);
                                                const std::string& newhost = (host_ok ? parameters[2] : parameters[3]);
 
                                                if (notify)
                                                        ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", user->nick.c_str(), user->host.c_str(), newhost.c_str(), user->host.c_str());
 
-                                               // Check if we're happy with the provided hostname. If it's problematic then make sure we won't set a host later, just the IP
-                                               if (host_ok)
-                                                       webirc_hostname.set(user, parameters[2]);
-                                               else
-                                                       webirc_hostname.unset(user);
-
+                                               webirc_hostname.set(user, newhost);
                                                webirc_ip.set(user, parameters[3]);
                                                return CMD_SUCCESS;
                                        }
                                }
                        }
 
+                       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;
                }
@@ -203,8 +201,8 @@ class ModuleCgiIRC : public Module
        {
                cmd.realhost.set(user, user->host);
                cmd.realip.set(user, user->GetIPString());
-               ChangeIP(user, newip);
                user->host = user->dhost = user->GetIPString();
+               ChangeIP(user, newip);
                user->InvalidateCache();
                RecheckClass(user);
                // Don't create the resolver if the core couldn't put the user in a connect class or when dns is disabled
@@ -298,10 +296,10 @@ public:
                if (!webirc_ip)
                        return MOD_RES_PASSTHRU;
 
-               ChangeIP(user, *webirc_ip);
-
                std::string* webirc_hostname = cmd.webirc_hostname.get(user);
                user->host = user->dhost = (webirc_hostname ? *webirc_hostname : user->GetIPString());
+
+               ChangeIP(user, *webirc_ip);
                user->InvalidateCache();
 
                RecheckClass(user);