1. uranium
  2. shadowircd

Commits

Jilles Tjoelker  committed cbea54e

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.

  • Participants
  • Parent commits 580437f
  • Branches trunk

Comments (0)

Files changed (3)

File modules/core/m_ban.c

View file
 
 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 };
 
 /* 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[])
 	char *p;
 	int act;
 
-	if (strcmp(parv[1], "+") && strcmp(parv[1], "-"))
+	if (strlen(parv[1]) != 1)
 	{
 		sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
-				"Unknown BAN operation %s from %s",
+				"Unknown BAN type %s from %s",
 				parv[1], source_p->name);
 		return 0;
 	}
-	if (strlen(parv[2]) != 1)
-	{
-		sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
-				"Unknown BAN type %s from %s",
-				parv[2], source_p->name);
-		return 0;
-	}
-	switch (parv[2][0])
+	switch (parv[1][0])
 	{
 		case 'K':
 			ntype = CONF_KILL;
 		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;
 						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 */
 		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;
 		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,
 				       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)
 	{
 				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);
 	}
 			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],
 			parv[5],
 			parv[6],
 			parv[7],
-			parv[8],
 			parv[parc - 1]);
 	return 0;
 }

File modules/m_kline.c

View file
 		/* 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);
 			  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),
 		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,

File src/s_serv.c

View file
 				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,