X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/c71a6e3bed32689256460fb072d31696eb8cf4cc..5559c3cf176ea3451895f4bf0e8bcb577e803921:/modules/m_kline.c diff --git a/modules/m_kline.c b/modules/m_kline.c index 89ba2353..d11b59a9 100644 --- a/modules/m_kline.c +++ b/modules/m_kline.c @@ -46,20 +46,20 @@ #include "bandbi.h" #include "operhash.h" -static int mo_kline(struct Client *, struct Client *, int, const char **); -static int ms_kline(struct Client *, struct Client *, int, const char **); -static int me_kline(struct Client *, struct Client *, int, const char **); -static int mo_unkline(struct Client *, struct Client *, int, const char **); -static int ms_unkline(struct Client *, struct Client *, int, const char **); -static int me_unkline(struct Client *, struct Client *, int, const char **); +static int mo_kline(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int ms_kline(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int me_kline(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int mo_unkline(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int ms_unkline(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int me_unkline(struct MsgBuf *, struct Client *, struct Client *, int, const char **); struct Message kline_msgtab = { - "KLINE", 0, 0, 0, MFLG_SLOW, + "KLINE", 0, 0, 0, 0, {mg_unreg, mg_not_oper, {ms_kline, 5}, {ms_kline, 5}, {me_kline, 5}, {mo_kline, 3}} }; struct Message unkline_msgtab = { - "UNKLINE", 0, 0, 0, MFLG_SLOW, + "UNKLINE", 0, 0, 0, 0, {mg_unreg, mg_not_oper, {ms_unkline, 4}, {ms_unkline, 4}, {me_unkline, 3}, {mo_unkline, 2}} }; @@ -69,7 +69,6 @@ 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 void handle_remote_kline(struct Client *source_p, int tkline_time, @@ -96,7 +95,7 @@ static void remove_prop_kline(struct Client *, struct ConfItem *); * parv[5] - reason */ static int -mo_kline(struct Client *client_p, struct Client *source_p, int parc, const char **parv) +mo_kline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char **parv) { char def[] = "No Reason"; char user[USERLEN + 2]; @@ -166,8 +165,7 @@ 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_comment(source_p, reason)) + if(!valid_user_host(source_p, user, host)) return 0; if(!valid_wild_card(user, host)) @@ -197,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) { @@ -239,7 +240,7 @@ mo_kline(struct Client *client_p, struct Client *source_p, int parc, const char * parv[5] - reason */ static int -ms_kline(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +ms_kline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { int tkline_time = atoi(parv[2]); @@ -264,7 +265,7 @@ ms_kline(struct Client *client_p, struct Client *source_p, int parc, const char } static int -me_kline(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +me_kline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { /* : */ if(!IsPerson(source_p)) @@ -287,8 +288,7 @@ 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_comment(source_p, reason)) + if(!valid_user_host(source_p, user, host)) return; if(!valid_wild_card(user, host)) @@ -311,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) { @@ -349,7 +352,7 @@ handle_remote_kline(struct Client *source_p, int tkline_time, * parv[3] - optional target server */ static int -mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +mo_unkline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { const char *user; char *host; @@ -425,7 +428,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha sendto_one_notice(source_p, ":No K-Line for %s@%s", user, host); return 0; } - + if(aconf->lifetime) { if(propagated) @@ -450,7 +453,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha * parv[3] - host to unkline */ static int -ms_unkline(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +ms_unkline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { /* parv[0] parv[1] parv[2] parv[3] * oper target server user host */ @@ -467,7 +470,7 @@ ms_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha } static int -me_unkline(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +me_unkline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { /* user host */ if(!IsPerson(source_p)) @@ -506,7 +509,7 @@ handle_remote_unkline(struct Client *source_p, const char *user, const char *hos /* apply_kline() * - * inputs - + * inputs - * output - NONE * side effects - kline as given, is added to the hashtable * and conf file @@ -629,7 +632,7 @@ apply_prop_kline(struct Client *source_p, struct ConfItem *aconf, } /* find_user_host() - * + * * inputs - client placing kline, user@host, user buffer, host buffer * output - 0 if not ok to kline, 1 to kline i.e. if valid user host * side effects - @@ -669,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; } @@ -691,28 +701,6 @@ valid_user_host(struct Client *source_p, const char *luser, const char *lhost) return 1; } -/* - * 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 @@ -736,7 +724,7 @@ already_placed_kline(struct Client *source_p, const char *luser, const char *lho if(aconf == NULL && ConfigFileEntry.non_redundant_klines) { bits = 0; - if((t = parse_netmask(lhost, (struct sockaddr *) &iphost, &bits)) != HM_HOST) + if((t = parse_netmask(lhost, &iphost, &bits)) != HM_HOST) { #ifdef RB_IPV6 if(t == HM_IPV6) @@ -846,6 +834,7 @@ static void remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) { rb_dlink_node *ptr; + time_t now; ptr = rb_dlinkFind(aconf, &prop_bans); if (!ptr) @@ -860,8 +849,9 @@ remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) ilog(L_KLINE, "UK %s %s %s", get_oper_name(source_p), aconf->user, aconf->host); - if(aconf->created < rb_current_time()) - aconf->created = rb_current_time(); + now = rb_current_time(); + if(aconf->created < now) + aconf->created = now; else aconf->created++; aconf->hold = aconf->created; @@ -875,5 +865,5 @@ remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) 0, (int)(aconf->lifetime - aconf->created)); remove_reject_mask(aconf->user, aconf->host); - deactivate_conf(aconf, ptr); + deactivate_conf(aconf, ptr, now); }