From e49d8185794e0e5013f7aedfebf56de4846308ee Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Fri, 5 Mar 2010 22:51:47 +0100 Subject: [PATCH] Remove +/- from the BAN message, instead indicating unban with duration=0. A kline must now last at least one second since its creation time. Also add better logic for bans that have already expired when they come in. --- modules/core/m_ban.c | 74 ++++++++++++++++++++------------------------ modules/m_kline.c | 10 ++++-- src/s_serv.c | 3 +- 3 files changed, 42 insertions(+), 45 deletions(-) diff --git a/modules/core/m_ban.c b/modules/core/m_ban.c index fb19c57..9f26c1b 100644 --- a/modules/core/m_ban.c +++ b/modules/core/m_ban.c @@ -47,7 +47,7 @@ static int ms_ban(struct Client *client_p, struct Client *source_p, int parc, co struct Message ban_msgtab = { "BAN", 0, 0, 0, MFLG_SLOW, - {mg_unreg, mg_ignore, {ms_ban, 10}, {ms_ban, 10}, mg_ignore, mg_ignore} + {mg_unreg, mg_ignore, {ms_ban, 9}, {ms_ban, 9}, mg_ignore, mg_ignore} }; mapi_clist_av1 ban_clist[] = { &ban_msgtab, NULL }; @@ -55,15 +55,14 @@ DECLARE_MODULE_AV1(ban, NULL, NULL, ban_clist, NULL, NULL, "$Revision: 1349 $"); /* ms_ban() * - * parv[1] - +/- - * parv[2] - type - * parv[3] - username mask or * - * parv[4] - hostname mask - * parv[5] - creation TS - * parv[6] - duration (relative to creation) - * parv[7] - lifetime (relative to creation) - * parv[8] - oper or * - * parv[9] - reason (possibly with |operreason) + * parv[1] - type + * parv[2] - username mask or * + * parv[3] - hostname mask + * parv[4] - creation TS + * parv[5] - duration (relative to creation) + * parv[6] - lifetime (relative to creation) + * parv[7] - oper or * + * parv[8] - reason (possibly with |operreason) */ static int ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) @@ -76,21 +75,14 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p char *p; int act; - if (strcmp(parv[1], "+") && strcmp(parv[1], "-")) - { - sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, - "Unknown BAN operation %s from %s", - parv[1], source_p->name); - return 0; - } - if (strlen(parv[2]) != 1) + if (strlen(parv[1]) != 1) { sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Unknown BAN type %s from %s", - parv[2], source_p->name); + parv[1], source_p->name); return 0; } - switch (parv[2][0]) + switch (parv[1][0]) { case 'K': ntype = CONF_KILL; @@ -99,17 +91,17 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p default: sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Unknown BAN type %s from %s", - parv[2], source_p->name); + parv[1], source_p->name); return 0; } - created = atol(parv[5]); - hold = created + atoi(parv[6]); - lifetime = created + atoi(parv[7]); - if (!strcmp(parv[8], "*")) + created = atol(parv[4]); + hold = created + atoi(parv[5]); + lifetime = created + atoi(parv[6]); + if (!strcmp(parv[7], "*")) oper = IsServer(source_p) ? source_p->name : get_oper_name(source_p); else - oper = parv[8]; - ptr = find_prop_ban(ntype, parv[3], parv[4]); + oper = parv[7]; + ptr = find_prop_ban(ntype, parv[2], parv[3]); if (ptr != NULL) { aconf = ptr->data; @@ -124,7 +116,8 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p aconf->host); return 0; } - act = !(aconf->status & CONF_ILLEGAL) || !strcmp(parv[1], "+"); + act = !(aconf->status & CONF_ILLEGAL) || (hold != created && + hold > rb_current_time()); if (lifetime > aconf->lifetime) aconf->lifetime = lifetime; /* already expired, hmm */ @@ -148,12 +141,12 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p aconf->status = CONF_ILLEGAL | ntype; aconf->lifetime = lifetime; rb_dlinkAddAlloc(aconf, &prop_bans); - act = !strcmp(parv[1], "+"); + act = hold != created && hold > rb_current_time(); } aconf->flags &= ~CONF_FLAGS_MYOPER; aconf->flags |= CONF_FLAGS_TEMPORARY; - aconf->user = ntype == CONF_KILL ? rb_strdup(parv[3]) : NULL; - aconf->host = rb_strdup(parv[4]); + aconf->user = ntype == CONF_KILL ? rb_strdup(parv[2]) : NULL; + aconf->host = rb_strdup(parv[3]); aconf->info.oper = operhash_add(oper); aconf->created = created; aconf->hold = hold; @@ -165,7 +158,7 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p aconf->passwd = rb_strndup(parv[parc - 1], p - parv[parc - 1] + 1); aconf->spasswd = rb_strdup(p + 1); } - if (!strcmp(parv[1], "+")) + if (act && hold != created) { /* Keep the notices in sync with modules/m_kline.c etc. */ sendto_realops_snomask(SNO_GENERAL, L_ALL, @@ -173,18 +166,18 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p IsServer(source_p) ? source_p->name : get_oper_name(source_p), (hold - rb_current_time()) / 60, stype, - strcmp(parv[8], "*") ? " from " : "", - strcmp(parv[8], "*") ? parv[8] : "", + strcmp(parv[7], "*") ? " from " : "", + strcmp(parv[7], "*") ? parv[7] : "", aconf->user ? aconf->user : "", aconf->user ? "@" : "", aconf->host, parv[parc - 1]); - aconf->status &= ~CONF_ILLEGAL; - ilog(L_KLINE, "%s %s %d %s %s %s", parv[2], + ilog(L_KLINE, "%s %s %d %s %s %s", parv[1], IsServer(source_p) ? source_p->name : get_oper_name(source_p), (hold - rb_current_time()) / 60, aconf->user, aconf->host, parv[parc - 1]); + aconf->status &= ~CONF_ILLEGAL; } else if (act) { @@ -195,9 +188,9 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p aconf->user ? aconf->user : "", aconf->user ? "@" : "", aconf->host, - strcmp(parv[8], "*") ? " on behalf of " : "", - strcmp(parv[8], "*") ? parv[8] : ""); - ilog(L_KLINE, "U%s %s %s %s", parv[2], + strcmp(parv[7], "*") ? " on behalf of " : "", + strcmp(parv[7], "*") ? parv[7] : ""); + ilog(L_KLINE, "U%s %s %s %s", parv[1], IsServer(source_p) ? source_p->name : get_oper_name(source_p), aconf->user, aconf->host); } @@ -226,7 +219,7 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p break; } sendto_server(NULL, NULL, CAP_BAN|CAP_TS6, NOCAPS, - ":%s BAN %s %s %s %s %s %s %s %s :%s", + ":%s BAN %s %s %s %s %s %s %s :%s", source_p->id, parv[1], parv[2], @@ -235,7 +228,6 @@ ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *p parv[5], parv[6], parv[7], - parv[8], parv[parc - 1]); return 0; } diff --git a/modules/m_kline.c b/modules/m_kline.c index 4ba0561..c532c0a 100644 --- a/modules/m_kline.c +++ b/modules/m_kline.c @@ -584,6 +584,11 @@ apply_prop_kline(struct Client *source_p, struct ConfItem *aconf, /* 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); @@ -617,7 +622,7 @@ apply_prop_kline(struct Client *source_p, struct ConfItem *aconf, tkline_time / 60, aconf->user, aconf->host); sendto_server(NULL, NULL, CAP_BAN|CAP_TS6, NOCAPS, - ":%s BAN + K %s %s %lu %d %d * :%s%s%s", + ":%s BAN K %s %s %lu %d %d * :%s%s%s", source_p->id, aconf->user, aconf->host, (unsigned long)aconf->created, (int)(aconf->hold - aconf->created), @@ -922,11 +927,12 @@ remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) aconf->created = rb_current_time(); else aconf->created++; + aconf->hold = aconf->created; operhash_delete(aconf->info.oper); aconf->info.oper = operhash_add(get_oper_name(source_p)); aconf->flags |= CONF_FLAGS_MYOPER | CONF_FLAGS_TEMPORARY; sendto_server(NULL, NULL, CAP_BAN|CAP_TS6, NOCAPS, - ":%s BAN - K %s %s %lu %d %d * :*", + ":%s BAN K %s %s %lu %d %d * :*", source_p->id, aconf->user, aconf->host, (unsigned long)aconf->created, 0, diff --git a/src/s_serv.c b/src/s_serv.c index e71b1f3..2f8b6b5 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -439,9 +439,8 @@ burst_ban(struct Client *client_p) oper = operbuf; } } - sendto_one(client_p, ":%s BAN %c %s %s %s %lu %d %d %s :%s%s%s", + sendto_one(client_p, ":%s BAN %s %s %s %lu %d %d %s :%s%s%s", me.id, - aconf->status & CONF_ILLEGAL ? '-' : '+', type, aconf->user ? aconf->user : "*", aconf->host, (unsigned long)aconf->created,