]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
A few anti-flood features
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 4a5b3cba375c8814ba5ae929b267dea0577e9655..2558f3efc57a6c40d828adcb7a087318b0c5969e 100644 (file)
@@ -850,6 +850,12 @@ void WriteCommon(userrec *u, char* text, ...)
                         }
                 }
         }
+       // if the user was not in any channels, no users will receive the text. Make sure the user
+       // receives their OWN message for WriteCommon
+       if (!already_sent.size())
+       {
+               WriteFrom(u->fd,u,"%s",textbuffer);
+       }
 }
 
 /* write a formatted string to all users who share at least one common
@@ -2689,7 +2695,7 @@ std::string GetVersionString()
         v2 = strtok_r(s1," ",&savept);
         s1 = savept;
        snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s (O=%lu)",VERSION,v2,ServerName,SYSTEM,(unsigned long)OPTIMISATION);
-       
+       return versiondata;
 }
 
 void handle_version(char **parameters, int pcnt, userrec *user)
@@ -3857,7 +3863,7 @@ int InspIRCd(void)
         tvs.tv_sec = 0;
        tv.tv_sec = 0;
        tv.tv_usec = 10000L;
-        char data[10240];
+        char data[65535];
        timeval tval;
        fd_set sfd;
         tval.tv_usec = 10000L;
@@ -4059,9 +4065,7 @@ int InspIRCd(void)
                                result = EAGAIN;
                                if ((count2a->second->fd != FD_MAGIC_NUMBER) && (count2a->second->fd != -1) && (FD_ISSET (count2a->second->fd, &sfd)))
                                {
-                                       memset(data, 0, 10240);
-                                       result = read(count2a->second->fd, data, 10240);
-                                       
+                                       result = read(count2a->second->fd, data, 65535);
                                        if (result)
                                        {
                                                // perform a check on the raw buffer as an array (not a string!) to remove
@@ -4072,40 +4076,67 @@ int InspIRCd(void)
                                                        if ((data[checker] == 0) || (data[checker] == 7))
                                                                data[checker] = ' ';
                                                }
+                                               if (result > 0)
+                                                       data[result] = '\0';
                                                userrec* current = count2a->second;
                                                int currfd = current->fd;
-                                               char* l = strtok(data,"\n");
                                                int floodlines = 0;
-                                               while (l)
+                                               current->AddBuffer(data);
+                                               if (current->recvq.length() > NetBufferSize)
+                                               {
+                                                       if (current->registered == 7)
+                                                       {
+                                                               kill_link(current,"RecvQ exceeded");
+                                                       }
+                                                       else
+                                                       {
+                                                               WriteOpers("*** Excess flood from %s",current->ip);
+                                                               log(DEFAULT,"Excess flood from: %s",current->ip);
+                                                               add_zline(120,ServerName,"Flood from unregistered connection",current->ip);
+                                                               apply_lines();
+                                                       }
+                                                       goto label;
+                                               }
+                                               // while there are complete lines to process...
+                                               while (current->BufferIsReady())
                                                {
                                                        floodlines++;
-                                                       if ((floodlines > current->flood) && (current->flood != 0))
+                                                       if (TIME > current->reset_due)
+                                                       {
+                                                               current->reset_due = TIME+3;
+                                                               current->lines_in = 0;
+                                                       }
+                                                       current->lines_in++;
+                                                       if (current->lines_in > current->flood)
                                                        {
-                                                               log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
-                                                               WriteOpers("*** Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
+                                                               log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
+                                                               WriteOpers("*** Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
                                                                kill_link(current,"Excess flood");
-                                                               goto label;
                                                        }
-                                                       char sanitized[NetBufferSize];
-                                                       memset(sanitized, 0, NetBufferSize);
-                                                       int ptt = 0;
-                                                       for (int pt = 0; pt < strlen(l); pt++)
+                                                       if ((floodlines > current->flood) && (current->flood != 0))
                                                        {
-                                                               if (l[pt] != '\r')
+                                                               if (current->registered == 7)
                                                                {
-                                                                       sanitized[ptt++] = l[pt];
+                                                                       log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
+                                                                       WriteOpers("*** Excess flood from: %s!%s@%s",current->nick,current->ident,current->host);
+                                                                       kill_link(current,"Excess flood");
                                                                }
+                                                               else
+                                                               {
+                                                                       add_zline(120,ServerName,"Flood from unregistered connection",current->ip);
+                                                                       apply_lines();
+                                                               }
+                                                               goto label;
                                                        }
-                                                       sanitized[ptt] = '\0';
+                                                       char sanitized[MAXBUF];
+                                                       // use GetBuffer to copy single lines into the sanitized string
+                                                       strlcpy(sanitized,current->GetBuffer().c_str(),MAXBUF);
                                                        if (*sanitized)
                                                        {
-
-
                                                                // we're gonna re-scan to check if the nick is gone, after every
                                                                // command - if it has, we're gonna bail
                                                                bool find_again = false;
                                                                process_buffer(sanitized,current);
-       
                                                                // look for the user's record in case it's changed
                                                                for (user_hash::iterator c2 = clientlist.begin(); c2 != clientlist.end(); c2++)
                                                                {
@@ -4121,7 +4152,6 @@ int InspIRCd(void)
                                                                        goto label;
 
                                                        }
-                                                       l = strtok(NULL,"\n");
                                                }
                                                goto label;
                                        }