Forward port 2.10.11 fixes for pre-registration client timeouts
authorMichael Poole <mdpoole@troilus.org>
Sat, 15 May 2004 17:17:20 +0000 (17:17 +0000)
committerMichael Poole <mdpoole@troilus.org>
Sat, 15 May 2004 17:17:20 +0000 (17:17 +0000)
git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1058 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/ircd.c

index 64f8366d9608c604b3c44d0e2fadb4820d7f5718..e1950891ccce55d55227bcc7f22b3f469b460834 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2004-05-15  hikari <shadow@undernet.org>
+
+       [Original ChangeLog date: 2003-06-27 -MDP]
+       
+       * ircd/ircd.c: After thought, update the next check time based on
+       when an unregistered client should expire.
+
+2004-05-15   hikari <shadow@undernet.org>
+
+       [Original ChangeLog date: 2003-06-22 -MDP]
+
+       * ircd/ircd.c: Fixed check_pings() - shouldn't be any problem with
+       clients not being able to connect anymore.
+
 2004-05-15  Michael Poole <mdpoole@troilus.org>
 
        * ircd/channel.c (can_join): Revert to using IsInvited() rather
index 065487c61cd10d62cadf7427e758f9c0eb8812f6..4e1364bf7f71a33ee3873e9640b67f74a9323d30 100644 (file)
@@ -363,18 +363,54 @@ static void check_pings(struct Event* ev) {
           cli_name(cptr),
           IsPingSent(cptr) ? "[Ping Sent]" : "[]", 
           max_ping, (int)(CurrentTime - cli_lasttime(cptr))));
-          
 
     /* Ok, the thing that will happen most frequently, is that someone will
      * have sent something recently.  Cover this first for speed.
+     * -- 
+     * If it's an unregisterd client and hasn't managed to register within
+     * max_ping then it's obviously having problems (broken client) or it's
+     * just up to no good, so we won't skip it, even if its been sending
+     * data to us. 
+     * -- hikari
      */
-    if (CurrentTime-cli_lasttime(cptr) < max_ping) {
+    if ((CurrentTime-cli_lasttime(cptr) < max_ping) && IsRegistered(cptr)) {
       expire = cli_lasttime(cptr) + max_ping;
       if (expire < next_check) 
        next_check = expire;
       continue;
     }
 
+    /* Unregistered clients pingout after max_ping seconds, they don't
+     * get given a second chance - if they were then people could not quite
+     * finish registration and hold resources without being subject to k/g
+     * lines
+     */
+    if (!IsRegistered(cptr)) {
+      assert(!IsServer(cptr));
+      if ((CurrentTime-cli_firsttime(cptr) >= max_ping)) {
+       /* Display message if they have sent a NICK and a USER but no
+        * nospoof PONG.
+        */
+       if (*(cli_name(cptr)) && cli_user(cptr) && *(cli_user(cptr))->username) {
+         send_reply(cptr, SND_EXPLICIT | ERR_BADPING,
+           ":Your client may not be compatible with this server.");
+         send_reply(cptr, SND_EXPLICIT | ERR_BADPING,
+           ":Compatible clients are available at %s",
+         feature_str(FEAT_URL_CLIENTS));
+       }
+       exit_client_msg(cptr,cptr,&me, "Registration Timeout");
+       continue;
+      } else {
+        /* OK, they still have enough time left, so we'll just skip to the
+         * next client.  Set the next check to be when their time is up, if
+         * that's before the currently scheduled next check -- hikari */
+        expire = cli_firsttime(cptr) + max_ping;
+        if (expire < next_check)
+          next_check = expire;
+        continue;
+      }
+    }
+
     /* Quit the client after max_ping*2 - they should have answered by now */
     if (CurrentTime-cli_lasttime(cptr) >= (max_ping*2) )
     {
@@ -386,28 +422,6 @@ static void check_pings(struct Event* ev) {
       exit_client_msg(cptr, cptr, &me, "Ping timeout");
       continue;
     }
-
-    /* Unregistered clients pingout after max_ping seconds, they don't
-     * get given a second chance - if they were then people could not quite
-     * finish registration and hold resources without being subject to k/g
-     * lines
-     */
-    if (!IsRegistered(cptr))
-    {
-      /* Display message if they have sent a NICK and a USER but no
-       * nospoof PONG.
-       */
-      if (*(cli_name(cptr)) && cli_user(cptr) && *(cli_user(cptr))->username)
-      {
-       send_reply(cptr, SND_EXPLICIT | ERR_BADPING,
-                  ":Your client may not be compatible with this server.");
-       send_reply(cptr, SND_EXPLICIT | ERR_BADPING,
-                   ":Compatible clients are available at %s",
-                   feature_str(FEAT_URL_CLIENTS));
-      }    
-      exit_client_msg(cptr,cptr,&me, "Ping Timeout");
-      continue;
-    }
     
     if (!IsPingSent(cptr))
     {