X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/40a1d44606f86b7e4ffbd2c05bff826f4dff27e1..d3455e2c7e2f9040e1b7628d9cf52b26a24dcefc:/modules/m_kline.c diff --git a/modules/m_kline.c b/modules/m_kline.c index 401d600..c9b21ae 100644 --- a/modules/m_kline.c +++ b/modules/m_kline.c @@ -25,7 +25,6 @@ */ #include "stdinc.h" -#include "tools.h" #include "channel.h" #include "class.h" #include "client.h" @@ -35,17 +34,16 @@ #include "ircd.h" #include "hostmask.h" #include "numeric.h" -#include "commio.h" #include "s_conf.h" #include "s_newconf.h" -#include "s_log.h" +#include "logger.h" #include "send.h" #include "hash.h" #include "s_serv.h" #include "msg.h" #include "parse.h" #include "modules.h" -#include "event.h" +#include "reject.h" static int mo_kline(struct Client *, struct Client *, int, const char **); static int ms_kline(struct Client *, struct Client *, int, const char **); @@ -85,7 +83,7 @@ static void handle_remote_unkline(struct Client *source_p, const char *user, const char *host); static void remove_permkline_match(struct Client *, struct ConfItem *); static int flush_write(struct Client *, FILE *, const char *, const char *); -static int remove_temp_kline(struct ConfItem *); +static int remove_temp_kline(struct Client *, struct ConfItem *); /* mo_kline() * @@ -162,7 +160,7 @@ mo_kline(struct Client *client_p, struct Client *source_p, return 0; } /* if we have cluster servers, send it to them.. */ - else if(dlink_list_length(&cluster_conf_list) > 0) + else if(rb_dlink_list_length(&cluster_conf_list) > 0) cluster_generic(source_p, "KLINE", (tkline_time > 0) ? SHARED_TKLINE : SHARED_PKLINE, CAP_KLN, "%lu %s %s :%s", @@ -180,8 +178,8 @@ mo_kline(struct Client *client_p, struct Client *source_p, current_date = smalldate(); aconf = make_conf(); aconf->status = CONF_KILL; - DupString(aconf->host, host); - DupString(aconf->user, user); + aconf->host = rb_strdup(host); + aconf->user = rb_strdup(user); aconf->port = 0; /* Look for an oper reason */ @@ -191,21 +189,21 @@ mo_kline(struct Client *client_p, struct Client *source_p, oper_reason++; if(!EmptyString(oper_reason)) - DupString(aconf->spasswd, oper_reason); + aconf->spasswd = rb_strdup(oper_reason); } if(tkline_time > 0) { - ircsnprintf(buffer, sizeof(buffer), + rb_snprintf(buffer, sizeof(buffer), "Temporary K-line %d min. - %s (%s)", (int) (tkline_time / 60), reason, current_date); - DupString(aconf->passwd, buffer); + aconf->passwd = rb_strdup(buffer); apply_tkline(source_p, aconf, reason, oper_reason, current_date, tkline_time); } else { - ircsnprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date); - DupString(aconf->passwd, buffer); + rb_snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date); + aconf->passwd = rb_strdup(buffer); apply_kline(source_p, aconf, reason, oper_reason, current_date); } @@ -213,7 +211,7 @@ mo_kline(struct Client *client_p, struct Client *source_p, { if(kline_queued == 0) { - eventAddOnce("check_klines", check_klines_event, NULL, + rb_event_addonce("check_klines", check_klines_event, NULL, ConfigFileEntry.kline_delay); kline_queued = 1; } @@ -295,8 +293,8 @@ handle_remote_kline(struct Client *source_p, int tkline_time, aconf = make_conf(); aconf->status = CONF_KILL; - DupString(aconf->user, user); - DupString(aconf->host, host); + aconf->user = rb_strdup(user); + aconf->host = rb_strdup(host); /* Look for an oper reason */ if((oper_reason = strchr(reason, '|')) != NULL) @@ -305,23 +303,23 @@ handle_remote_kline(struct Client *source_p, int tkline_time, oper_reason++; if(!EmptyString(oper_reason)) - DupString(aconf->spasswd, oper_reason); + aconf->spasswd = rb_strdup(oper_reason); } current_date = smalldate(); if(tkline_time > 0) { - ircsnprintf(buffer, sizeof(buffer), + rb_snprintf(buffer, sizeof(buffer), "Temporary K-line %d min. - %s (%s)", (int) (tkline_time / 60), reason, current_date); - DupString(aconf->passwd, buffer); + aconf->passwd = rb_strdup(buffer); apply_tkline(source_p, aconf, reason, oper_reason, current_date, tkline_time); } else { - ircsnprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date); - DupString(aconf->passwd, buffer); + rb_snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date); + aconf->passwd = rb_strdup(buffer); apply_kline(source_p, aconf, reason, oper_reason, current_date); } @@ -329,7 +327,7 @@ handle_remote_kline(struct Client *source_p, int tkline_time, { if(kline_queued == 0) { - eventAddOnce("check_klines", check_klines_event, NULL, + rb_event_addonce("check_klines", check_klines_event, NULL, ConfigFileEntry.kline_delay); kline_queued = 1; } @@ -408,7 +406,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha if(match(parv[3], me.name) == 0) return 0; } - else if(dlink_list_length(&cluster_conf_list) > 0) + else if(rb_dlink_list_length(&cluster_conf_list) > 0) cluster_generic(source_p, "UNKLINE", SHARED_UNKLINE, CAP_UNKLN, "%s %s", user, host); @@ -419,16 +417,8 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha return 0; } - if(remove_temp_kline(aconf)) - { - sendto_one_notice(source_p, ":Un-klined [%s@%s] from temporary k-lines", user, host); - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "%s has removed the temporary K-Line for: [%s@%s]", - get_oper_name(source_p), user, host); - ilog(L_KLINE, "UK %s %s %s", - get_oper_name(source_p), user, host); + if(remove_temp_kline(source_p, aconf)) return 0; - } remove_permkline_match(source_p, aconf); @@ -486,20 +476,8 @@ handle_remote_unkline(struct Client *source_p, const char *user, const char *hos return; } - if(remove_temp_kline(aconf)) - { - sendto_one_notice(source_p, - ":Un-klined [%s@%s] from temporary k-lines", - user, host); - - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "%s has removed the temporary K-Line for: [%s@%s]", - get_oper_name(source_p), user, host); - - ilog(L_KLINE, "UK %s %s %s", - get_oper_name(source_p), user, host); + if(remove_temp_kline(source_p, aconf)) return; - } remove_permkline_match(source_p, aconf); } @@ -530,7 +508,7 @@ static void apply_tkline(struct Client *source_p, struct ConfItem *aconf, const char *reason, const char *oper_reason, const char *current_date, int tkline_time) { - aconf->hold = CurrentTime + tkline_time; + aconf->hold = rb_current_time() + tkline_time; add_temp_kline(aconf); /* no oper reason.. */ @@ -712,13 +690,16 @@ valid_comment(struct Client *source_p, char *comment) static int already_placed_kline(struct Client *source_p, const char *luser, const char *lhost, int tkline) { - const char *reason; - struct irc_sockaddr_storage iphost, *piphost; + const char *reason, *p; + struct rb_sockaddr_storage iphost, *piphost; struct ConfItem *aconf; - int t; - if(ConfigFileEntry.non_redundant_klines) + int t, bits; + + aconf = find_exact_conf_by_address(lhost, CONF_KILL, luser); + if (aconf == NULL && ConfigFileEntry.non_redundant_klines) { - if((t = parse_netmask(lhost, (struct sockaddr *)&iphost, NULL)) != HM_HOST) + bits = 0; + if((t = parse_netmask(lhost, (struct sockaddr *)&iphost, &bits)) != HM_HOST) { #ifdef IPV6 if(t == HM_IPV6) @@ -732,19 +713,31 @@ already_placed_kline(struct Client *source_p, const char *luser, const char *lho else piphost = NULL; - if((aconf = find_conf_by_address(lhost, NULL, NULL, (struct sockaddr *)piphost, CONF_KILL, t, luser))) + aconf = find_conf_by_address(lhost, NULL, NULL, (struct sockaddr *)piphost, CONF_KILL, t, luser); + if (aconf != NULL) { - /* setting a tkline, or existing one is perm */ - if(tkline || ((aconf->flags & CONF_FLAGS_TEMPORARY) == 0)) - { - reason = aconf->passwd ? aconf->passwd : ""; + /* The above was really a lookup of a single IP, + * so check if the new kline is wider than the + * existing one. + * -- jilles + */ + p = strchr(aconf->host, '/'); + if (bits > 0 && (p == NULL || bits < atoi(p + 1))) + aconf = NULL; + } + } + if (aconf != NULL) + { + /* setting a tkline, or existing one is perm */ + if(tkline || ((aconf->flags & CONF_FLAGS_TEMPORARY) == 0)) + { + reason = aconf->passwd ? aconf->passwd : ""; - sendto_one_notice(source_p, - ":[%s@%s] already K-Lined by [%s@%s] - %s", - luser, lhost, aconf->user, - aconf->host, reason); - return 1; - } + sendto_one_notice(source_p, + ":[%s@%s] already K-Lined by [%s@%s] - %s", + luser, lhost, aconf->user, + aconf->host, reason); + return 1; } } @@ -772,7 +765,7 @@ remove_permkline_match(struct Client *source_p, struct ConfItem *aconf) host = aconf->host; user = aconf->user; - ircsnprintf(temppath, sizeof(temppath), + rb_snprintf(temppath, sizeof(temppath), "%s.tmp", ConfigFileEntry.klinefile); filename = get_conf_name(KLINE_TYPE); @@ -866,6 +859,7 @@ remove_permkline_match(struct Client *source_p, struct ConfItem *aconf) ilog(L_KLINE, "UK %s %s %s", get_oper_name(source_p), user, host); + remove_reject_mask(aconf->user, aconf->host); delete_one_address_conf(aconf->host, aconf); return; @@ -913,18 +907,29 @@ flush_write(struct Client *source_p, FILE * out, const char *buf, const char *te * side effects - tries to unkline anything that matches */ static int -remove_temp_kline(struct ConfItem *aconf) +remove_temp_kline(struct Client *source_p, struct ConfItem *aconf) { - dlink_node *ptr; + rb_dlink_node *ptr; int i; for (i = 0; i < LAST_TEMP_TYPE; i++) { - DLINK_FOREACH(ptr, temp_klines[i].head) + RB_DLINK_FOREACH(ptr, temp_klines[i].head) { if (aconf == ptr->data) { - dlinkDestroy(ptr, &temp_klines[i]); + sendto_one_notice(source_p, + ":Un-klined [%s@%s] from temporary k-lines", + aconf->user, aconf->host); + sendto_realops_snomask(SNO_GENERAL, L_ALL, + "%s has removed the temporary K-Line for: [%s@%s]", + get_oper_name(source_p), aconf->user, aconf->host); + + ilog(L_KLINE, "UK %s %s %s", + get_oper_name(source_p), + aconf->user, aconf->host); + rb_dlinkDestroy(ptr, &temp_klines[i]); + remove_reject_mask(aconf->user, aconf->host); delete_one_address_conf(aconf->host, aconf); return YES; }