]> jfr.im git - solanum.git/blobdiff - modules/core/m_error.c
Keep propagated bans in a dictionary, not a list
[solanum.git] / modules / core / m_error.c
index a58d1b151d51325e6d14cfcf603ceb44d4e21266..69712363cfed5e1995699667c7db22a782894379 100644 (file)
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
- *
- *  $Id: m_error.c 494 2006-01-15 16:08:28Z jilles $
  */
 
 #include "stdinc.h"
 #include "client.h"
-#include "common.h"            /* FALSE */
 #include "ircd.h"
 #include "numeric.h"
 #include "send.h"
 #include "msg.h"
-#include "memory.h"
 #include "modules.h"
-#include "s_log.h"
+#include "logger.h"
 #include "s_conf.h"
 
-static int m_error(struct Client *, struct Client *, int, const char **);
-static int ms_error(struct Client *, struct Client *, int, const char **);
+static const char error_desc[] =
+       "Provides the ERROR command for clients and servers";
+
+static void m_error(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
+static void ms_error(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
 
 struct Message error_msgtab = {
-       "ERROR", 0, 0, 0, MFLG_SLOW | MFLG_UNREG,
+       "ERROR", 0, 0, 0, 0,
        {{m_error, 0}, mg_ignore, mg_ignore, {ms_error, 0}, mg_ignore, mg_ignore}
 };
 
@@ -48,78 +47,101 @@ mapi_clist_av1 error_clist[] = {
        &error_msgtab, NULL
 };
 
-DECLARE_MODULE_AV1(error, NULL, NULL, error_clist, NULL, NULL, "$Revision: 494 $");
+DECLARE_MODULE_AV2(error, NULL, NULL, error_clist, NULL, NULL, NULL, NULL, error_desc);
 
+/* Determine whether an ERROR message is safe to show (no IP address in it) */
+static bool
+is_safe_error(const char *message)
+{
+       char prefix2[100];
+       const char *p;
+
+       if (!strncmp(message, "Closing Link: 127.0.0.1 (", 25))
+               return true;
+       snprintf(prefix2, sizeof prefix2,
+                       "Closing Link: 127.0.0.1 %s (", me.name);
+       if (!strncmp(message, prefix2, strlen(prefix2)))
+               return true;
+       if (!strncmp(message, "Restart by ", 11))
+               return true;
+       if (!strncmp(message, "Terminated by ", 14))
+               return true;
+
+       if (!rb_strncasecmp(message, "Closing Link", 12))
+               return false;
+       if (strchr(message, '['))
+               return false;
+       p = strchr(message, '.');
+       if (p != NULL && p[1] != '\0')
+               return false;
+       if (strchr(message, ':'))
+               return false;
+
+       return true;
+}
 
 /*
  * Note: At least at protocol level ERROR has only one parameter,
  * although this is called internally from other functions
  * --msa
  *
- *      parv[0] = sender prefix
  *      parv[*] = parameters
  */
-int
-m_error(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+m_error(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        const char *para;
+       int hideit = ConfigFileEntry.hide_error_messages;
 
        para = (parc > 1 && *parv[1] != '\0') ? parv[1] : "<>";
 
-       ilog(L_SERVER, "Received ERROR message from %s: %s",
-            log_client_name(source_p, SHOW_IP), para);
+       if (IsAnyServer(client_p))
+       {
+               ilog(L_SERVER, "Received ERROR message from %s: %s",
+                    log_client_name(source_p, SHOW_IP), para);
+       }
 
-       if(IsAnyServer(client_p) && ConfigFileEntry.hide_error_messages < 2)
+       if(is_safe_error(para))
+               hideit = 0;
+       if(IsAnyServer(client_p))
        {
-               sendto_realops_snomask(SNO_GENERAL, L_ADMIN,
-                                    "ERROR :from %s -- %s",
-                                    get_server_name(client_p, HIDE_IP), para);
-
-               if(!ConfigFileEntry.hide_error_messages)
-                       sendto_realops_snomask(SNO_GENERAL, L_OPER,
-                                            "ERROR :from %s -- %s",
-                                            get_server_name(client_p, HIDE_IP), para);
+               if (hideit < 2)
+                       sendto_realops_snomask(SNO_GENERAL, hideit ? L_ADMIN : L_NETWIDE,
+                                       "ERROR :from %s -- %s",
+                                       client_p->name, para);
+               if (hideit > 0)
+                       sendto_realops_snomask(SNO_GENERAL, hideit == 1 ? L_OPER | L_NETWIDE : L_NETWIDE,
+                                       "ERROR :from %s -- <hidden>",
+                                       client_p->name);
        }
 
        exit_client(client_p, source_p, source_p, "ERROR");
-
-       return 0;
 }
 
-static int
-ms_error(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+ms_error(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        const char *para;
+       int hideit = ConfigFileEntry.hide_error_messages;
 
        para = (parc > 1 && *parv[1] != '\0') ? parv[1] : "<>";
 
        ilog(L_SERVER, "Received ERROR message from %s: %s",
             log_client_name(source_p, SHOW_IP), para);
 
-       if(ConfigFileEntry.hide_error_messages == 2)
-               return 0;
+       if(is_safe_error(para))
+               hideit = 0;
+       if(hideit == 2)
+               return;
 
        if(client_p == source_p)
        {
-               sendto_realops_snomask(SNO_GENERAL, L_ADMIN, "ERROR :from %s -- %s",
-                                    get_server_name(client_p, HIDE_IP), para);
-
-               if(!ConfigFileEntry.hide_error_messages)
-                       sendto_realops_snomask(SNO_GENERAL, L_OPER,
-                                            "ERROR :from %s -- %s",
-                                            get_server_name(client_p, HIDE_IP), para);
+               sendto_realops_snomask(SNO_GENERAL, hideit ? L_ADMIN : L_NETWIDE, "ERROR :from %s -- %s",
+                                    client_p->name, para);
        }
        else
        {
-               sendto_realops_snomask(SNO_GENERAL, L_ADMIN, "ERROR :from %s via %s -- %s",
-                                    source_p->name, get_server_name(client_p, HIDE_IP), para);
-
-               if(!ConfigFileEntry.hide_error_messages)
-                       sendto_realops_snomask(SNO_GENERAL, L_OPER,
-                                            "ERROR :from %s via %s -- %s",
-                                            source_p->name,
-                                            get_server_name(client_p, HIDE_IP), para);
+               sendto_realops_snomask(SNO_GENERAL, hideit ? L_ADMIN : L_NETWIDE, "ERROR :from %s via %s -- %s",
+                                    source_p->name, client_p->name, para);
        }
-
-       return 0;
 }