]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_error.c
Do not install ban .conf files (like kline.conf, rsv.conf, etc) as they aren't used...
[irc/rqf/shadowircd.git] / modules / core / m_error.c
index a58d1b151d51325e6d14cfcf603ceb44d4e21266..07426b5f0856c1c6c50be54303156d2f930472f9 100644 (file)
@@ -21,7 +21,6 @@
  *  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"
@@ -31,9 +30,8 @@
 #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 **);
@@ -50,35 +48,70 @@ 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;
+       rb_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,
  * 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[])
 {
        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 : (is_remote_connect(client_p) ? L_NETWIDE : L_ALL),
+                                       "ERROR :from %s -- %s",
+                                       client_p->name, 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>",
+                                       client_p->name);
        }
 
        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",
-                                    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_ALL, "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_ALL, "ERROR :from %s via %s -- %s",
+                                    source_p->name, client_p->name, para);
        }
 
        return 0;