From 42105f07dd1ac0e04e28077754b6245a80d55597 Mon Sep 17 00:00:00 2001 From: brain Date: Sun, 15 Jul 2007 13:18:28 +0000 Subject: Fix for bug #349: NOTE there is important caveat about this in the example config, MAKE SURE TO READ IT. When you connect a cgi:irc client two different connect classes are checked at two different times (first the one that the website they are cgi'ing from, then later one for the user's real ip). READ THIS AND UNDERSTAND IT! git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7440 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_cgiirc.cpp | 14 +++++++++++++- src/users.cpp | 43 ++++++++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/modules/m_cgiirc.cpp b/src/modules/m_cgiirc.cpp index ec6d5d398..290f55d22 100644 --- a/src/modules/m_cgiirc.cpp +++ b/src/modules/m_cgiirc.cpp @@ -289,6 +289,7 @@ public: if(user->GetExt("cgiirc_webirc_ip", webirc_ip)) { bool valid=false; + user->RemoveCloneCounts(); #ifdef IPV6 valid = (inet_pton(AF_INET6, webirc_ip->c_str(), &((sockaddr_in6*)user->ip)->sin6_addr) > 0); @@ -302,6 +303,9 @@ public: delete webirc_ip; user->InvalidateCache(); user->Shrink("cgiirc_webirc_ip"); + ServerInstance->AddLocalClone(user); + ServerInstance->AddGlobalClone(user); + user->CheckClass(); } } @@ -316,6 +320,7 @@ public: user->InvalidateCache(); bool valid = false; + user->RemoveCloneCounts(); #ifdef IPV6 if (user->GetProtocolFamily() == AF_INET6) valid = (inet_pton(AF_INET6, user->password, &((sockaddr_in6*)user->ip)->sin6_addr) > 0); @@ -325,6 +330,10 @@ public: if (inet_aton(user->password, &((sockaddr_in*)user->ip)->sin_addr)) valid = true; #endif + ServerInstance->AddLocalClone(user); + ServerInstance->AddGlobalClone(user); + user->CheckClass(); + if (valid) { /* We were given a IP in the password, we don't do DNS so they get this is as their host as well. */ @@ -381,13 +390,16 @@ public: user->Extend("cgiirc_realhost", new std::string(user->host)); user->Extend("cgiirc_realip", new std::string(user->GetIPString())); + user->RemoveCloneCounts(); #ifdef IPV6 if (user->GetProtocolFamily() == AF_INET6) inet_pton(AF_INET6, newip, &((sockaddr_in6*)user->ip)->sin6_addr); else #endif inet_aton(newip, &((sockaddr_in*)user->ip)->sin_addr); - + ServerInstance->AddLocalClone(user); + ServerInstance->AddGlobalClone(user); + user->CheckClass(); try { strlcpy(user->host, newip, 16); diff --git a/src/users.cpp b/src/users.cpp index d83788566..7da7d6b09 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -344,6 +344,29 @@ userrec::userrec(InspIRCd* Instance) : ServerInstance(Instance) operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL; } +void userrec::RemoveCloneCounts() +{ + clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString()); + if (x != ServerInstance->local_clones.end()) + { + x->second--; + if (!x->second) + { + ServerInstance->local_clones.erase(x); + } + } + + clonemap::iterator y = ServerInstance->global_clones.find(this->GetIPString()); + if (y != ServerInstance->global_clones.end()) + { + y->second--; + if (!y->second) + { + ServerInstance->global_clones.erase(y); + } + } +} + userrec::~userrec() { this->InvalidateCache(); @@ -352,25 +375,7 @@ userrec::~userrec() free(operquit); if (ip) { - clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString()); - if (x != ServerInstance->local_clones.end()) - { - x->second--; - if (!x->second) - { - ServerInstance->local_clones.erase(x); - } - } - - clonemap::iterator y = ServerInstance->global_clones.find(this->GetIPString()); - if (y != ServerInstance->global_clones.end()) - { - y->second--; - if (!y->second) - { - ServerInstance->global_clones.erase(y); - } - } + this->RemoveCloneCounts(); if (this->GetProtocolFamily() == AF_INET) { -- cgit v1.2.3