Author: Isomer <isomer@coders.net>
authorPerry Lorier <isomer@undernet.org>
Mon, 17 Sep 2001 09:01:00 +0000 (09:01 +0000)
committerPerry Lorier <isomer@undernet.org>
Mon, 17 Sep 2001 09:01:00 +0000 (09:01 +0000)
Log message:

Most of the updates from 2.10.10.pl16 and a few odds and ends I'd forgotten
about.  Thanks to my flatmate who learnt to code while I was cooking :)

git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@556 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ircd/ircd.c
ircd/ircd_relay.c
ircd/ircd_string.c
ircd/m_create.c
ircd/m_kill.c
ircd/m_links.c
ircd/m_map.c
ircd/m_nick.c
ircd/m_whois.c
ircd/s_user.c
ircd/send.c

index 92538605e82adb421a05d0d05144f278f255c6ae..151f45956fee3c4153a88baf0aeaa32628282bf6 100644 (file)
@@ -378,7 +378,7 @@ static void check_pings(struct Event* ev) {
                   ":Your client may not be compatible with this server.");
        send_reply(cptr, SND_EXPLICIT | ERR_BADPING,
                   ":Compatible clients are available at "
-                  "ftp://ftp.undernet.org/pub/irc/clients");
+                  URL_CLIENTS);
       }    
       exit_client_msg(cptr,cptr,&me, "Ping Timeout");
       continue;
index 0953568cccd7dfb76d3de6b5088b1e4fe6940627..eae5e6f40ca6fe07c9cf0dea17fe8f9a36b953b3 100644 (file)
@@ -178,9 +178,20 @@ void relay_directed_message(struct Client* sptr, char* name, char* server, const
   if ((host = strchr(name, '%')))
     *host++ = '\0';
 
+  /* As reported by Vampire-, it's possible to brute force finding users
+   * by sending a message to each server and see which one succeeded.
+   * This means we have to remove error reporting.  Sigh.  Better than
+   * removing the ability to send directed messages to client servers 
+   * Thanks for the suggestion Vampire=.  -- Isomer 2001-08-28
+   * Argh, /ping nick@server, disallow messages to non +k clients :/  I hate
+   * this. -- Isomer 2001-09-16
+   */
   if (!(acptr = FindUser(name)) || !MyUser(acptr) ||
-      (!EmptyString(host) && 0 != match(host, cli_user(acptr)->host))) {
+      (!EmptyString(host) && 0 != match(host, cli_user(acptr)->host)) ||
+      !IsChannelService(acptr)) {
+#if 0
     send_reply(sptr, ERR_NOSUCHNICK, name);
+#endif
     return;
   }
 
@@ -295,7 +306,7 @@ void server_relay_private_message(struct Client* sptr, const char* name, const c
    * nickname addressed?
    */
   if (0 == (acptr = findNUser(name)) || !IsUser(acptr)) {
-    send_reply(sptr, SND_EXPLICIT | ERR_NOSUCHNICK, "* :Target left UnderNet. "
+    send_reply(sptr, SND_EXPLICIT | ERR_NOSUCHNICK, "* :Target left " NETWORK ". "
               "Failed to deliver: [%.20s]", text);
     return;
   }
index 359d36edd0e4624367c71ff5b6dfe4d9dd78319e..2914f8953e100ad37996022b96760c4ce939c5f8 100644 (file)
@@ -300,9 +300,13 @@ int unique_name_vector(char* list, char token, char** vector, int size)
     }
     start = end;
   }
-  if (*start)
-    vector[count++] = start;
-
+  if (*start) {
+    for (i = 0; i < count; ++i) {
+      if (0 == ircd_strcmp(vector[i], start))
+        return count;
+      vector[count++] = start;
+    }
+  }
   return count;
 }
 
index fcedeb0e09196f4ab993344c125d0f275bb766d8..0892850310806d99df600626469ae41d9171ee3a 100644 (file)
@@ -132,9 +132,16 @@ int ms_create(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       MAGIC_REMOTE_JOIN_TS != chanTS)
     cli_serv(cli_user(sptr)->server)->lag = TStime() - chanTS;
 
-  /* If this server is >5 minutes fast, squit it */
-  if (TStime() - chanTS<-5*60*60)
-       return exit_client(sptr, sptr, &me, "Timestamp Drift/Bogus TS");
+  /* If this server is >1 minute fast, warn */
+  if (TStime() - chanTS<-60) {
+    static int rate;
+    sendto_opmask_butone_ratelimited(0,SNO_NETWORK,&rate,
+       "Timestamp drift from %s (%is)",cli_name(cptr),chanTS-TStime());
+
+    /* If this server is >5 minutes fast, squit it */
+    if (TStime() - chanTS<-5*60*60)
+      return exit_client(sptr, sptr, &me, "Timestamp Drift/Bogus TS");
+  }
 
   /* For each channel in the comma seperated list: */
   for (name = ircd_strtok(&p, parv[1], ","); name;
index 214c3c88faf3015008da9a953933087286e67fc6..7605b13dba3de733bbb4b8ca16daa9853917760c 100644 (file)
@@ -85,6 +85,7 @@
 #include "hash.h"
 #include "ircd.h"
 #include "ircd_log.h"
+#include "ircd_policy.h"
 #include "ircd_reply.h"
 #include "ircd_snprintf.h"
 #include "ircd_string.h"
@@ -202,11 +203,11 @@ int ms_kill(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
    */
   if (MyConnect(victim))
     sendcmdto_one(IsServer(sptr) ? &me : sptr, CMD_KILL, victim,
-                 "%C :%s%s", victim, IsServer(sptr) ? "*.undernet.org" :
+                 "%C :%s%s", victim, IsServer(sptr) ? HEAD_IN_SAND_SERVERNAME :
                  cli_name(sptr), comment);
 
   ircd_snprintf(0, buf, sizeof(buf), "Killed (%s%s)", IsServer(sptr) ?
-               "*.undernet.org" : cli_name(sptr), comment);
+               HEAD_IN_SAND_SERVERNAME : cli_name(sptr), comment);
 
   return exit_client(cptr, victim, sptr, buf);
 }
index 7814a512d3803a0292971d95a32587915b8e9392..5c23c1ab20fe4c97c8c3d9501586f87b95c00b2d 100644 (file)
@@ -83,6 +83,7 @@
 
 #include "client.h"
 #include "ircd.h"
+#include "ircd_defs.h"
 #include "ircd_policy.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
@@ -148,8 +149,7 @@ int m_links_redirect(struct Client* cptr, struct Client* sptr, int parc,
 
   send_reply(sptr, RPL_ENDOFLINKS, parc < 2 ? "*" : parv[1]);
   sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s", sptr,
-               "/LINKS has been disabled, from CFV-165.  "
-               "Visit http://www.undernet.org/servers.php");
+               "/LINKS has been disabled, from CFV-165.  Visit " URL_SERVERS );
   return 0;
 }
 #endif
index ee3dce2457f5066115eae3d01ca6573d4fe3a587..589c37ff0365079547cfd36b1513ed2d941399f6 100644 (file)
@@ -83,6 +83,7 @@
 
 #include "client.h"
 #include "ircd.h"
+#include "ircd_defs.h"
 #include "ircd_policy.h"
 #include "ircd_reply.h"
 #include "ircd_snprintf.h"
@@ -177,7 +178,7 @@ int m_map_redirect(struct Client* cptr, struct Client* sptr, int parc,
 {
   sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s", sptr,
                "/MAP has been disabled, from CFV-165.  "
-               "Visit http://www.undernet.org/servers.php");
+               "Visit " URL_SERVERS);
   return 0;
 }
 #endif
index 4307160c4a1f63cbe1b9767afb8cf097b04d7f07..bc15ee951ce780f54717ab8eb8904e33cead4257 100644 (file)
@@ -88,6 +88,7 @@
 #include "ircd_chattr.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
+#include "ircd_policy.h"
 #include "msg.h"
 #include "numeric.h"
 #include "numnicks.h"
@@ -338,7 +339,7 @@ int ms_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
      * if sptr is a server it is exited here, nothing else to do
      */
     return exit_client_msg(cptr, sptr, &me,
-                          "Killed (*.undernet.org (%s <- %s))",
+                          "Killed (" HEAD_IN_SAND_SERVERNAME " (%s <- %s))",
                           cli_name(cli_from(acptr)), cli_name(cptr));
   }
 
@@ -446,7 +447,7 @@ int ms_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 
         cli_flags(sptr) |= FLAGS_KILLED;
         exit_client(cptr, sptr, &me,
-                   "Killed (*.undernet.org (Nick collision))");
+                   "Killed (" HEAD_IN_SAND_SERVERNAME " (Nick collision))");
         /*
          * we have killed sptr off, zero out it's pointer so if it's used
          * again we'll know about it --Bleep
@@ -468,24 +469,24 @@ int ms_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     sendcmdto_serv_butone(&me, CMD_KILL, acptr, "%C :%s (older nick "
                          "overruled)", acptr, cli_name(&me));
     if (MyConnect(acptr)) {
-      sendcmdto_one(acptr, CMD_QUIT, cptr, ":Killed (*.undernet.org (older "
+      sendcmdto_one(acptr, CMD_QUIT, cptr, ":Killed (" HEAD_IN_SAND_SERVERNAME " (older "
                    "nick overruled))");
-      sendcmdto_one(&me, CMD_KILL, acptr, "%C :*.undernet.org (older nick "
+      sendcmdto_one(&me, CMD_KILL, acptr, "%C :" HEAD_IN_SAND_SERVERNAME " (older nick "
                    "overruled)", acptr);
     }
-    exit_client(cptr, acptr, &me, "Killed (*.undernet.org (older nick "
+    exit_client(cptr, acptr, &me, "Killed (" HEAD_IN_SAND_SERVERNAME " (older nick "
                "overruled))");
   }
   else {
     sendcmdto_serv_butone(&me, CMD_KILL, acptr, "%C :%s (nick collision from "
                          "same user@host)", acptr, cli_name(&me));
     if (MyConnect(acptr)) {
-      sendcmdto_one(acptr, CMD_QUIT, cptr, ":Killed (*.undernet.org (nick "
+      sendcmdto_one(acptr, CMD_QUIT, cptr, ":Killed (" HEAD_IN_SAND_SERVERNAME " (nick "
                    "collision from same user@host))");
-      sendcmdto_one(&me, CMD_KILL, acptr, "%C :*.undernet.org (older nick "
+      sendcmdto_one(&me, CMD_KILL, acptr, "%C :" HEAD_IN_SAND_SERVERNAME " (older nick "
                    "overruled)", acptr);
     }
-    exit_client(cptr, acptr, &me, "Killed (*.undernet.org (nick collision "
+    exit_client(cptr, acptr, &me, "Killed (" HEAD_IN_SAND_SERVERNAME " (nick collision "
                "from same user@host))");
   }
   if (lastnick == cli_lastnick(acptr))
index 45ac83bf6367142c9cc12b6b1f08a1cb8c8d85c6..20835b5d25e3687e6ece96989fd9bb1be4089a56 100644 (file)
@@ -185,8 +185,8 @@ static void do_whois(struct Client* sptr, struct Client *acptr, int parc)
 
 #ifdef HEAD_IN_SAND_WHOIS_SERVERNAME
   if (!IsAnOper(sptr) && sptr != acptr)
-    send_reply(sptr, RPL_WHOISSERVER, name, "*.undernet.org",
-              "The Undernet Underworld");
+    send_reply(sptr, RPL_WHOISSERVER, name, HEAD_IN_SAND_SERVERNAME,
+              HEAD_IN_SAND_SERVERINFO);
   else
 #endif
     send_reply(sptr, RPL_WHOISSERVER, name, cli_name(a2cptr),
index 78b1b0f35ca9334c64faf4d991751ee3d42595fe..cf34ba2566876e014f04807576f1cc42bc1f0c72 100644 (file)
@@ -191,6 +191,11 @@ int hunt_server_cmd(struct Client *from, const char *cmd, const char *tok,
   struct Client *acptr;
   char *to;
 
+  if (MustBeOper && !IsPrivileged(acptr))
+  {
+    send_reply(from, ERR_NOPRIVILEGES);
+    return HUNTED_NOSUCH;
+  }
   /* Assume it's me, if no server or an unregistered client */
   if (parc <= server || EmptyString((to = parv[server])) || IsUnknown(from))
     return (HUNTED_ISME);
index 6f7e1d3d8bfe4e02a86f0a8523b52dc00f2d64cb..b7014d70eb306b3ac90c7c83da089a79c5b7f91f 100644 (file)
@@ -600,6 +600,27 @@ void sendto_opmask_butone(struct Client *one, unsigned int mask,
   va_end(vl);
 }
 
+/*
+ * Send a server notice to all users subscribing to the indicated <mask>
+ * except for <one> - Ratelimited 1 / 30sec
+ */
+void sendto_opmask_butone_ratelimited(struct Client *one, unsigned int mask,
+                         time_t *rate, const char *pattern, ...)
+{
+  va_list vl;
+
+  if ((CurrentTime - *rate) < 30) 
+    return;
+  else 
+    *rate = CurrentTime;
+
+  va_start(vl, pattern);
+  vsendto_opmask_butone(one, mask, pattern, vl);
+  va_end(vl);
+    
+}
+
+
 /*
  * Same as above, except called with a variable argument list
  */