]> 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 1d21871655f758e8d1aa9209caa926bbbb237c46..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 512chars) Please shorten it.", current->nick);
-                                               current->recvq = "";
+                                               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.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;
                                }
 
@@ -177,8 +151,8 @@ void InspIRCd::ProcessUser(userrec* cu)
                                std::string single_line = current->GetBuffer();
                                current->bytes_in += single_line.length();
                                current->cmds_in++;
-                               if (single_line.length() > 512)
-                                       single_line.resize(512);
+                               if (single_line.length() > MAXBUF - 2)  /* MAXBUF is 514 to allow for neccessary line terminators */
+                                       single_line.resize(MAXBUF - 2); /* So to trim to 512 here, we use MAXBUF - 2 */
 
                                EventHandler* old_comp = this->SE->GetRef(currfd);
 
@@ -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;
        }
 }
@@ -266,7 +240,11 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME)
                                bool ready = AllModulesReportReady(curr);
                                if ((TIME > curr->signon) && (curr->registered == REG_NICKUSER) && (ready))
                                {
-                                       curr->dns_done = true;
+                                       if (!curr->dns_done)
+                                       {
+                                               curr->WriteServ("NOTICE Auth :*** Could not resolve your hostname: Request timed out; using your IP address (%s) instead.", curr->GetIPString());
+                                               curr->dns_done = true;
+                                       }
                                        this->stats->statsDnsBad++;
                                        curr->FullConnect();
                                        continue;
@@ -296,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;