static int flood_attack_channel(int p_or_n, struct Client *source_p,
struct Channel *chptr, char *chname);
+/* Fifteen seconds should be plenty for a client to reply a ctcp */
+#define LARGE_CTCP_TIME 15
+
#define ENTITY_NONE 0
#define ENTITY_CHANNEL 1
#define ENTITY_CHANNEL_OPMOD 2
if(result == CAN_SEND_OPV ||
!flood_attack_channel(p_or_n, source_p, chptr, chptr->chname))
{
+ if (p_or_n != NOTICE && *text == '\001' &&
+ strncasecmp(text + 1, "ACTION", 6))
+ {
+ if (chptr->mode.mode & MODE_NOCTCP)
+ {
+ sendto_one_numeric(source_p, ERR_CANNOTSENDTOCHAN,
+ form_str(ERR_CANNOTSENDTOCHAN), chptr->chname);
+ return;
+ }
+ else if (rb_dlink_list_length(&chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2))
+ source_p->large_ctcp_sent = rb_current_time();
+ }
sendto_channel_flags(client_p, ALL_MEMBERS, source_p, chptr,
"%s %s :%s", command, chptr->chname, text);
}
}
}
+ if (do_floodcount && p_or_n == NOTICE && *text == '\001' &&
+ target_p->large_ctcp_sent + LARGE_CTCP_TIME >= rb_current_time())
+ do_floodcount = 0;
+
if (do_floodcount &&
flood_attack_client(p_or_n, source_p, target_p))
return;
nick + 1,
(*nick == '#') ? MATCH_HOST : MATCH_SERVER,
"%s $%s :%s", command, nick, text);
+ if (p_or_n != NOTICE && *text == '\001')
+ source_p->large_ctcp_sent = rb_current_time();
return;
}
}