]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/userprocess.cpp
m_testcommand deletes its command handler manually, no modules should do this. Will...
[user/henk/code/inspircd.git] / src / userprocess.cpp
index dd6a4c24d697caa1f9914f820a315f8fd4673e49..3b9e717df2661dcc622b2eaffb5ec7038e9cda79 100644 (file)
  * ---------------------------------------------------
  */
 
+#include "inspircd.h"
 #include "configreader.h"
 #include "users.h"
 #include "modules.h"
 #include "wildcard.h"
 #include "xline.h"
 #include "socketengine.h"
-#include "inspircd.h"
 #include "command_parse.h"
 
+void InspIRCd::FloodQuitUser(userrec* current)
+{
+       this->Log(DEFAULT,"Excess flood from: %s@%s", current->ident, current->host);
+       this->SNO->WriteToSnoMask('f',"Excess flood from: %s%s%s@%s",
+                       current->registered == REG_ALL ? current->nick : "",
+                       current->registered == REG_ALL ? "!" : "", current->ident, current->host);
+       current->SetWriteError("Excess flood");
+       if (current->registered != REG_ALL)
+       {
+               XLines->add_zline(120,this->Config->ServerName,"Flood from unregistered connection",current->GetIPString());
+               XLines->apply_lines(APPLY_ZLINES);
+       }
+}
+
 void InspIRCd::ProcessUser(userrec* cu)
 {
        int result = EAGAIN;
@@ -98,43 +112,16 @@ void InspIRCd::ProcessUser(userrec* cu)
 
                                        current->lines_in++;
 
-                                       if (current->lines_in > current->flood)
-                                       {
-                                               this->Log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                               this->SNO->WriteToSnoMask('f',"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                               current->SetWriteError("Excess flood");
-                                               return;
-                                       }
+                                       if (current->flood && current->lines_in > current->flood)
+                                               FloodQuitUser(current);
                                        else
                                        {
                                                current->WriteServ("NOTICE %s :Your previous line was too long and was not delivered (Over %d chars) Please shorten it.", current->nick, MAXBUF-2);
-                                               current->recvq = "";
+                                               current->recvq.clear();
                                        }
                                }
                                else
-                               {
-                                       this->WriteOpers("*** Excess flood from %s",current->GetIPString());
-                                       this->SNO->WriteToSnoMask('f',"Excess flood from: %s",current->GetIPString());
-                                       XLines->add_zline(120,this->Config->ServerName,"Flood from unregistered connection",current->GetIPString());
-                                       XLines->apply_lines(APPLY_ZLINES);
-                               }
-
-                               return;
-                       }
-
-                       if (current->recvq.length() > (unsigned)this->Config->NetBufferSize)
-                       {
-                               if (current->registered == REG_ALL)
-                               {
-                                       current->SetWriteError("RecvQ exceeded");
-                               }
-                               else
-                               {
-                                       this->WriteOpers("*** Excess flood from %s",current->GetIPString());
-                                       this->SNO->WriteToSnoMask('f',"Excess flood from: %s",current->GetIPString());
-                                       XLines->add_zline(120,this->Config->ServerName,"Flood from unregistered connection",current->GetIPString());
-                                       XLines->apply_lines(APPLY_ZLINES);
-                               }
+                                       FloodQuitUser(current);
 
                                return;
                        }
@@ -148,28 +135,15 @@ void InspIRCd::ProcessUser(userrec* cu)
                                        current->lines_in = 0;
                                }
 
-                               if (++current->lines_in > current->flood)
+                               if (++current->lines_in > current->flood && current->flood)
                                {
-                                       this->Log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                       this->SNO->WriteToSnoMask('f',"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                       current->SetWriteError("Excess flood");
+                                       FloodQuitUser(current);
                                        return;
                                }
 
                                if ((++floodlines > current->flood) && (current->flood != 0))
                                {
-                                       if (current->registered == REG_ALL)
-                                       {
-                                               this->Log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                               SNO->WriteToSnoMask('f',"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                               current->SetWriteError("Excess flood");
-                                       }
-                                       else
-                                       {
-                                               XLines->add_zline(120,this->Config->ServerName,"Flood from unregistered connection",current->GetIPString());
-                                               XLines->apply_lines(APPLY_ZLINES);
-                                       }
-
+                                       FloodQuitUser(current);
                                        return;
                                }
 
@@ -200,7 +174,7 @@ void InspIRCd::ProcessUser(userrec* cu)
 
                if ((result == -1) && (errno != EAGAIN) && (errno != EINTR))
                {
-                       cu->SetWriteError(strerror(errno));
+                       cu->SetWriteError(errno ? strerror(errno) : "EOF from client");
                        return;
                }
        }
@@ -212,7 +186,7 @@ void InspIRCd::ProcessUser(userrec* cu)
        }
        else if (result == 0)
        {
-               cu->SetWriteError("Client exited");
+               cu->SetWriteError("Connection closed");
                return;
        }
 }
@@ -300,9 +274,10 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME)
                                        {
                                                /* Everybody loves boobies. */
                                                time_t time = this->Time(false) - (curr->nping - curr->pingmax);
-                                               std::string boobies = "Ping timeout: " + ConvToStr(time) + " second" + (time > 1 ? "s" : "");
+                                               char message[MAXBUF];
+                                               snprintf(message, MAXBUF, "Ping timeout: %ld second%s", time, time > 1 ? "s" : "");
                                                curr->muted = true;
-                                               GlobalCulls.AddItem(curr, boobies);
+                                               GlobalCulls.AddItem(curr, message);
                                                curr->lastping = 1;
                                                curr->nping = TIME+curr->pingmax;
                                                continue;