]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_error.c
Make this compile, but lots of warnings.
[irc/rqf/shadowircd.git] / modules / core / m_error.c
index a58d1b151d51325e6d14cfcf603ceb44d4e21266..0310eca8e345c106f96c3f47180fab6b70567995 100644 (file)
@@ -50,6 +50,36 @@ mapi_clist_av1 error_clist[] = {
 
 DECLARE_MODULE_AV1(error, NULL, NULL, error_clist, NULL, NULL, "$Revision: 494 $");
 
+/* Determine whether an ERROR message is safe to show (no IP address in it) */
+static int
+is_safe_error(const char *message)
+{
+       char prefix2[100];
+       const char *p;
+
+       if (!strncmp(message, "Closing Link: 127.0.0.1 (", 25))
+               return 1;
+       snprintf(prefix2, sizeof prefix2,
+                       "Closing Link: 127.0.0.1 %s (", me.name);
+       if (!strncmp(message, prefix2, strlen(prefix2)))
+               return 1;
+       if (!strncmp(message, "Restart by ", 11))
+               return 1;
+       if (!strncmp(message, "Terminated by ", 14))
+               return 1;
+
+       if (!ircncmp(message, "Closing Link", 12))
+               return 0;
+       if (strchr(message, '['))
+               return 0;
+       p = strchr(message, '.');
+       if (p != NULL && p[1] != '\0')
+               return 0;
+       if (strchr(message, ':'))
+               return 0;
+
+       return 1;
+}
 
 /*
  * Note: At least at protocol level ERROR has only one parameter,
@@ -63,22 +93,25 @@ int
 m_error(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) && 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 : (is_remote_connect(client_p) ? L_NETWIDE : L_ALL),
+                                       "ERROR :from %s -- %s",
+                                       get_server_name(client_p, HIDE_IP), para);
+               if (hideit > 0)
+                       sendto_realops_snomask(SNO_GENERAL, (hideit == 1 ? L_OPER : L_ALL) | (is_remote_connect(client_p) ? L_NETWIDE : L_ALL),
+                                       "ERROR :from %s -- <hidden>",
+                                       get_server_name(client_p, HIDE_IP));
        }
 
        exit_client(client_p, source_p, source_p, "ERROR");
@@ -90,35 +123,27 @@ static int
 ms_error(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)
+       if(is_safe_error(para))
+               hideit = 0;
+       if(hideit == 2)
                return 0;
 
        if(client_p == source_p)
        {
-               sendto_realops_snomask(SNO_GENERAL, L_ADMIN, "ERROR :from %s -- %s",
+               sendto_realops_snomask(SNO_GENERAL, hideit ? L_ADMIN : L_ALL, "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);
        }
        else
        {
-               sendto_realops_snomask(SNO_GENERAL, L_ADMIN, "ERROR :from %s via %s -- %s",
+               sendto_realops_snomask(SNO_GENERAL, hideit ? L_ADMIN : L_ALL, "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);
        }
 
        return 0;