]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Fix the problems GreenReaper found with the windows select engine, this has never...
[user/henk/code/inspircd.git] / src / users.cpp
index 0dfe54f65d2ece1a7c43c2bfe6a1d8fac73493a1..108ce138559dfb4b6a0d9e76fb000a824d7d9ed6 100644 (file)
@@ -98,7 +98,7 @@ void User::StartDNSLookup()
        try
        {
                bool cached;
-               const char* sip = this->GetIPString();
+               const char* sip = this->GetIPString(false);
 
                /* Special case for 4in6 (Have i mentioned i HATE 4in6?) */
                if (!strncmp(sip, "0::ffff:", 8))
@@ -817,21 +817,6 @@ void User::UnOper()
        }
 }
 
-void User::QuitUser(InspIRCd* Instance, User *user, const std::string &quitreason, const char* operreason)
-{
-       Instance->Logs->Log("USERS", DEBUG,"QuitUser: %s '%s'", user->nick, quitreason.c_str());
-       user->Write("ERROR :Closing link (%s@%s) [%s]", user->ident, user->host, *operreason ? operreason : quitreason.c_str());
-       user->quietquit = false;
-       user->quitmsg = quitreason;
-
-       if (!*operreason)
-               user->operquitmsg = quitreason;
-       else
-               user->operquitmsg = operreason;
-
-       Instance->GlobalCulls.AddItem(user);
-}
-
 /* adds or updates an entry in the whowas list */
 void User::AddToWhoWas()
 {
@@ -853,18 +838,18 @@ void User::CheckClass()
 
        if ((!a) || (a->GetType() == CC_DENY))
        {
-               User::QuitUser(ServerInstance, this, "Unauthorised connection");
+               ServerInstance->Users->QuitUser(this, "Unauthorised connection");
                return;
        }
        else if ((a->GetMaxLocal()) && (ServerInstance->Users->LocalCloneCount(this) > a->GetMaxLocal()))
        {
-               User::QuitUser(ServerInstance, this, "No more connections allowed from your host via this connect class (local)");
+               ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (local)");
                ServerInstance->SNO->WriteToSnoMask('A', "WARNING: maximum LOCAL connections (%ld) exceeded for IP %s", a->GetMaxLocal(), this->GetIPString());
                return;
        }
        else if ((a->GetMaxGlobal()) && (ServerInstance->Users->GlobalCloneCount(this) > a->GetMaxGlobal()))
        {
-               User::QuitUser(ServerInstance, this, "No more connections allowed from your host via this connect class (global)");
+               ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (global)");
                ServerInstance->SNO->WriteToSnoMask('A', "WARNING: maximum GLOBAL connections (%ld) exceeded for IP %s", a->GetMaxGlobal(), this->GetIPString());
                return;
        }
@@ -874,6 +859,25 @@ void User::CheckClass()
        this->MaxChans = a->GetMaxChans();
 }
 
+void User::CheckLines()
+{
+       const char* check[] = { "G" , "K", NULL };
+
+       if (!this->exempt)
+       {
+               for (int n = 0; check[n]; ++n)
+               {
+                       XLine *r = ServerInstance->XLines->MatchesLine(check[n], this);
+
+                       if (r)
+                       {
+                               r->Apply(this);
+                               return;
+                       }
+               }
+       }
+}
+
 void User::FullConnect()
 {
        ServerInstance->stats->statsConnects++;
@@ -892,28 +896,11 @@ void User::FullConnect()
         */
        if (this->MyClass && !this->MyClass->GetPass().empty() && !this->haspassed)
        {
-               User::QuitUser(ServerInstance, this, "Invalid password");
+               ServerInstance->Users->QuitUser(this, "Invalid password");
                return;
        }
 
-       if (!this->exempt)
-       {
-               GLine *r = (GLine *)ServerInstance->XLines->MatchesLine("G", this);
-
-               if (r)
-               {
-                       r->Apply(this);
-                       return;
-               }
-
-               KLine *n = (KLine *)ServerInstance->XLines->MatchesLine("K", this);
-
-               if (n)
-               {
-                       n->Apply(this);
-                       return;
-               }
-       }
+       CheckLines();
 
        this->WriteServ("NOTICE Auth :Welcome to \002%s\002!",ServerInstance->Config->Network);
        this->WriteNumeric(001, "%s :Welcome to the %s IRC Network %s!%s@%s",this->nick, ServerInstance->Config->Network, this->nick, this->ident, this->host);
@@ -1001,12 +988,6 @@ bool User::ForceNickChange(const char* newnick)
                return false;
        }
 
-       if (ServerInstance->XLines->MatchesLine("Q",newnick))
-       {
-               ServerInstance->stats->statsCollisions++;
-               return false;
-       }
-
        std::deque<classbase*> dummy;
        Command* nickhandler = ServerInstance->Parser->GetHandler("NICK");
        if (nickhandler) // wtfbbq, when would this not be here
@@ -1093,7 +1074,7 @@ int User::GetProtocolFamily()
  * XXX the duplication here is horrid..
  * do we really need two methods doing essentially the same thing?
  */
-const char* User::GetIPString()
+const char* User::GetIPString(bool translate4in6)
 {
        static char buf[1024];
 
@@ -1117,6 +1098,12 @@ const char* User::GetIPString()
                        {
                                strlcpy(&temp[1], buf, sizeof(temp) - 1);
                                *temp = '0';
+                               if (translate4in6 && !strncmp(temp, "0::ffff:", 8))
+                               {
+                                       this->cachedip = temp + 8;
+                                       return temp + 8;
+                               }
+
                                this->cachedip = temp;
                                return temp;
                        }
@@ -1854,7 +1841,7 @@ void User::HandleEvent(EventType et, int errornum)
        {
                if (!WriteError.empty())
                {
-                       User::QuitUser(ServerInstance, this, GetWriteError());
+                       ServerInstance->Users->QuitUser(this, GetWriteError());
                }
        }
 }