From c866e047f08af0d9c67de5c4be5ac51f05f0dee9 Mon Sep 17 00:00:00 2001 From: Perry Lorier Date: Mon, 17 Sep 2001 09:01:00 +0000 Subject: [PATCH] Author: Isomer 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 | 2 +- ircd/ircd_relay.c | 15 +++++++++++++-- ircd/ircd_string.c | 10 +++++++--- ircd/m_create.c | 13 ++++++++++--- ircd/m_kill.c | 5 +++-- ircd/m_links.c | 4 ++-- ircd/m_map.c | 3 ++- ircd/m_nick.c | 17 +++++++++-------- ircd/m_whois.c | 4 ++-- ircd/s_user.c | 5 +++++ ircd/send.c | 21 +++++++++++++++++++++ 11 files changed, 75 insertions(+), 24 deletions(-) diff --git a/ircd/ircd.c b/ircd/ircd.c index 9253860..151f459 100644 --- a/ircd/ircd.c +++ b/ircd/ircd.c @@ -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; diff --git a/ircd/ircd_relay.c b/ircd/ircd_relay.c index 0953568..eae5e6f 100644 --- a/ircd/ircd_relay.c +++ b/ircd/ircd_relay.c @@ -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; } diff --git a/ircd/ircd_string.c b/ircd/ircd_string.c index 359d36e..2914f89 100644 --- a/ircd/ircd_string.c +++ b/ircd/ircd_string.c @@ -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; } diff --git a/ircd/m_create.c b/ircd/m_create.c index fcedeb0..0892850 100644 --- a/ircd/m_create.c +++ b/ircd/m_create.c @@ -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; diff --git a/ircd/m_kill.c b/ircd/m_kill.c index 214c3c8..7605b13 100644 --- a/ircd/m_kill.c +++ b/ircd/m_kill.c @@ -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); } diff --git a/ircd/m_links.c b/ircd/m_links.c index 7814a51..5c23c1a 100644 --- a/ircd/m_links.c +++ b/ircd/m_links.c @@ -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 diff --git a/ircd/m_map.c b/ircd/m_map.c index ee3dce2..589c37f 100644 --- a/ircd/m_map.c +++ b/ircd/m_map.c @@ -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 diff --git a/ircd/m_nick.c b/ircd/m_nick.c index 4307160..bc15ee9 100644 --- a/ircd/m_nick.c +++ b/ircd/m_nick.c @@ -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)) diff --git a/ircd/m_whois.c b/ircd/m_whois.c index 45ac83b..20835b5 100644 --- a/ircd/m_whois.c +++ b/ircd/m_whois.c @@ -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), diff --git a/ircd/s_user.c b/ircd/s_user.c index 78b1b0f..cf34ba2 100644 --- a/ircd/s_user.c +++ b/ircd/s_user.c @@ -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); diff --git a/ircd/send.c b/ircd/send.c index 6f7e1d3..b7014d7 100644 --- a/ircd/send.c +++ b/ircd/send.c @@ -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 + * except for - 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 */ -- 2.20.1