X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/212380e3f42f585dc1ea927402252eb943f91f7b..24170ac312f9e042993a5377ed82769f4ae74e55:/modules/core/m_error.c diff --git a/modules/core/m_error.c b/modules/core/m_error.c index a58d1b1..df19a14 100644 --- a/modules/core/m_error.c +++ b/modules/core/m_error.c @@ -31,9 +31,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 +49,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 -- ", + client_p->name); } exit_client(client_p, source_p, source_p, "ERROR"); @@ -90,35 +124,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;