X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/cedb7d05b47d00e29275cd8387669a4b4993cbb6..2ebef8d925d3dc3ec9ecaa4cd978a25201d1c099:/modules/m_kline.c diff --git a/modules/m_kline.c b/modules/m_kline.c index c532c0ad..f445ec6a 100644 --- a/modules/m_kline.c +++ b/modules/m_kline.c @@ -69,9 +69,7 @@ DECLARE_MODULE_AV1(kline, NULL, NULL, kline_clist, NULL, NULL, "$Revision$"); /* Local function prototypes */ static int find_user_host(struct Client *source_p, const char *userhost, char *user, char *host); -static int valid_comment(struct Client *source_p, char *comment); static int valid_user_host(struct Client *source_p, const char *user, const char *host); -static int valid_wild_card(struct Client *source_p, const char *user, const char *host); static void handle_remote_kline(struct Client *source_p, int tkline_time, const char *user, const char *host, const char *reason); @@ -108,7 +106,7 @@ mo_kline(struct Client *client_p, struct Client *source_p, int parc, const char struct ConfItem *aconf; int tkline_time = 0; int loc = 1; - int propagated = 1; + int propagated = ConfigFileEntry.use_propagated_bans; if(!IsOperK(source_p)) { @@ -167,10 +165,18 @@ mo_kline(struct Client *client_p, struct Client *source_p, int parc, const char (tkline_time > 0) ? SHARED_TKLINE : SHARED_PKLINE, CAP_KLN, "%lu %s %s :%s", tkline_time, user, host, reason); - if(!valid_user_host(source_p, user, host) || - !valid_wild_card(source_p, user, host) || !valid_comment(source_p, reason)) + if(!valid_user_host(source_p, user, host)) return 0; + if(!valid_wild_card(user, host)) + { + sendto_one_notice(source_p, + ":Please include at least %d non-wildcard " + "characters with the user@host", + ConfigFileEntry.min_nonwildcard); + return 0; + } + if(propagated && tkline_time == 0) { sendto_one_notice(source_p, ":Cannot set a permanent global ban"); @@ -189,6 +195,9 @@ mo_kline(struct Client *client_p, struct Client *source_p, int parc, const char aconf->port = 0; aconf->info.oper = operhash_add(get_oper_name(source_p)); + if(strlen(reason) > BANREASONLEN) + reason[BANREASONLEN] = '\0'; + /* Look for an oper reason */ if((oper_reason = strchr(reason, '|')) != NULL) { @@ -279,9 +288,17 @@ handle_remote_kline(struct Client *source_p, int tkline_time, (tkline_time > 0) ? SHARED_TKLINE : SHARED_PKLINE)) return; - if(!valid_user_host(source_p, user, host) || - !valid_wild_card(source_p, user, host) || !valid_comment(source_p, reason)) + if(!valid_user_host(source_p, user, host)) + return; + + if(!valid_wild_card(user, host)) + { + sendto_one_notice(source_p, + ":Please include at least %d non-wildcard " + "characters with the user@host", + ConfigFileEntry.min_nonwildcard); return; + } if(already_placed_kline(source_p, user, host, tkline_time)) return; @@ -294,6 +311,9 @@ handle_remote_kline(struct Client *source_p, int tkline_time, aconf->host = rb_strdup(host); aconf->info.oper = operhash_add(get_oper_name(source_p)); + if(strlen(reason) > BANREASONLEN) + reason[BANREASONLEN] = '\0'; + /* Look for an oper reason */ if((oper_reason = strchr(reason, '|')) != NULL) { @@ -567,32 +587,11 @@ static void apply_prop_kline(struct Client *source_p, struct ConfItem *aconf, const char *reason, const char *oper_reason, int tkline_time) { - rb_dlink_node *ptr; - struct ConfItem *oldconf; - aconf->flags |= CONF_FLAGS_MYOPER | CONF_FLAGS_TEMPORARY; aconf->hold = rb_current_time() + tkline_time; aconf->lifetime = aconf->hold; - ptr = find_prop_ban(aconf->status, aconf->user, aconf->host); - if(ptr != NULL) - { - oldconf = ptr->data; - /* Remember at least as long as the old one. */ - if(oldconf->lifetime > aconf->lifetime) - aconf->lifetime = oldconf->lifetime; - /* Force creation time to increase. */ - if(oldconf->created >= aconf->created) - aconf->created = oldconf->created + 1; - /* Leave at least one second of validity. */ - if(aconf->hold <= aconf->created) - aconf->hold = aconf->created + 1; - if(aconf->lifetime < aconf->hold) - aconf->lifetime = aconf->hold; - /* Tell deactivate_conf() to destroy it. */ - oldconf->lifetime = rb_current_time(); - deactivate_conf(oldconf, ptr); - } + replace_old_ban(aconf); rb_dlinkAddAlloc(aconf, &prop_bans); add_conf_by_address(aconf->host, CONF_KILL, aconf->user, NULL, aconf); @@ -673,6 +672,13 @@ find_user_host(struct Client *source_p, const char *userhost, char *luser, char rb_strlcpy(lhost, userhost, HOSTLEN + 1); } + /* would break the protocol */ + if (*luser == ':' || *lhost == ':') + { + sendto_one_notice(source_p, ":Invalid K-Line"); + return 0; + } + return 1; } @@ -695,87 +701,6 @@ valid_user_host(struct Client *source_p, const char *luser, const char *lhost) return 1; } -/* valid_wild_card() - * - * input - user buffer, host buffer - * output - 0 if invalid, 1 if valid - * side effects - - */ -static int -valid_wild_card(struct Client *source_p, const char *luser, const char *lhost) -{ - const char *p; - char tmpch; - int nonwild = 0; - int bitlen; - - /* user has no wildcards, always accept -- jilles */ - if(!strchr(luser, '?') && !strchr(luser, '*')) - return 1; - - /* check there are enough non wildcard chars */ - p = luser; - while((tmpch = *p++)) - { - if(!IsKWildChar(tmpch)) - { - /* found enough chars, return */ - if(++nonwild >= ConfigFileEntry.min_nonwildcard) - return 1; - } - } - - /* try host, as user didnt contain enough */ - /* special case for cidr masks -- jilles */ - if((p = strrchr(lhost, '/')) != NULL && IsDigit(p[1])) - { - bitlen = atoi(p + 1); - /* much like non-cidr for ipv6, rather arbitrary for ipv4 */ - if(bitlen > 0 - && bitlen >= - (strchr(lhost, ':') ? 4 * (ConfigFileEntry.min_nonwildcard - nonwild) : 6 - - 2 * nonwild)) - return 1; - } - else - { - p = lhost; - while((tmpch = *p++)) - { - if(!IsKWildChar(tmpch)) - if(++nonwild >= ConfigFileEntry.min_nonwildcard) - return 1; - } - } - - sendto_one_notice(source_p, - ":Please include at least %d non-wildcard " - "characters with the user@host", ConfigFileEntry.min_nonwildcard); - return 0; -} - -/* - * valid_comment - * inputs - pointer to client - * - pointer to comment - * output - 0 if no valid comment, 1 if valid - * side effects - NONE - */ -static int -valid_comment(struct Client *source_p, char *comment) -{ - if(strchr(comment, '"')) - { - sendto_one_notice(source_p, ":Invalid character '\"' in comment"); - return 0; - } - - if(strlen(comment) > BANREASONLEN) - comment[BANREASONLEN] = '\0'; - - return 1; -} - /* already_placed_kline() * * inputs - source to notify, user@host to check, tkline time