All pastes #941810 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-03-13 23:21 UTC
rendered paste body
Index: ircd/m_notice.c
===================================================================
--- ircd/m_notice.c	(revision 2068)
+++ ircd/m_notice.c	(working copy)
@@ -126,6 +126,7 @@
   int             found_g = 0; /* added by Vadtec 02/26/2008 */
   struct Client*  acptr; /* added by Vadtec 02/26/2008 */
   struct Channel* chptr; /* added by Vadtec 02/27/2008 */
+  int             sent = 0; /* added by Vadtec 03/13/2008 */
 
   assert(0 != cptr);
   assert(cptr == sptr);
@@ -145,8 +146,10 @@
 
   count = unique_name_vector(parv[1], ',', vector, MAXTARGETS);
 
-  /* Check here to make sure that the client is ours so we dont respond to NOTICES from other server's users. - Vadtec */
-  if (feature_bool(FEAT_CTCP_VERSIONING) && MyConnect(sptr)) {
+  /* Check here to make sure that the client is ours so we dont respond to NOTICES from other server's users. - Vadtec 02/25/2008 */
+  /* Also, check to make sure that the notice is actually destined for the *server* and not another user. That way we don't process
+     some user saying "what version do you use" to another user via notice. - Vadtec 03/13/2008 */
+  if (feature_bool(FEAT_CTCP_VERSIONING) && MyConnect(sptr) && !strcmp(parv[1], cli_name(&me))) {
     /*
      Added by Vadtec 02/25/2008.
      This is so that we can do version checking (and banning) of connecting clients.
@@ -156,20 +159,23 @@
            This should help against clients that like to send lower case CTCPs from slipping through as easily with only one
            function call.
     */
-    for (fd = HighestFd; fd >= 0; --fd) {
-      /*
-       * get the users!
-      */
+    for (fd = HighestFd; fd >= 0 && !sent; --fd) { /* Added the "sent" check here so that if we have already sent the notice
+                                                      we don't needlessly loop through *all* the users - Vadtec 03/13/2008 */
       if ((acptr = LocalClientArray[fd])) {
         if (!cli_user(acptr))
           continue;
 
         #ifdef _GNU_SOURCE
-        if ((temp = strcasestr(parv[2], "VERSION"))) {
+        if ((temp = strcasestr(parv[2], "\x01VERSION"))) { /* added \x01 to the string so that it will *only* respond to CTCP version
+                                                              replies. Seems redundant, but we dont want the users doing
+                                                              /notice <server> version (and getting away with it) - Vadtec 03/13/2008 */
+          temp = strchrnul(parv[2], ' '); /* Moved this here to take advantage of strchrnul - added by Vadtec 03/13/2008 */
         #else
-        if ((temp = strstr(parv[2], "VERSION")) || (temp = strstr(parv[2], "version"))) {
+        if ((temp = strstr(parv[2], "\x01VERSION")) || (temp = strstr(parv[2], "\x01version"))) { /* See above comment about \x01 - Vadtec */
+          temp = strchr(parv[2], ' '); /* Moved this here to take advantage of strchrnul - added by Vadtec 03/13/2008 */
+          if (temp == 0)
+            temp = parv[2] + strlen(parv[2]); /* This does the same thing as strchrnul - Vadtec */
         #endif
-          temp = strchr(parv[2], ' ');
           parv_temp = parv[2];
           j = 0;
           while (j <= (temp - parv[2])) { parv_temp++; j++; }
@@ -188,6 +194,7 @@
                 sendcmdto_channel_butone(&me, CMD_PRIVATE, chptr, cptr, SKIP_DEAF | SKIP_BURST, '\0', "%H :%s", chptr, temp);
               else
                 sendcmdto_channel_butone(&me, CMD_NOTICE, chptr, cptr, SKIP_DEAF | SKIP_BURST, '\0', "%H :%s", chptr, temp);
+              sent = 1;
             }
           }