Allow ctcp replies through floodcount after ctcp'ing a large group.

A large group is any $$ or $# or a channel with more than
floodcount/2 local members, checked on each server separately.
Note that floodcount checks are done on the sender's server.

The special treatment is active for 15 seconds.
This commit is contained in:
Jilles Tjoelker 2009-05-17 20:52:16 +02:00
parent cf09122bf7
commit aa9c9ed268
2 changed files with 14 additions and 0 deletions

View file

@ -175,6 +175,8 @@ struct Client
local_user_t *localClient; local_user_t *localClient;
pre_client_t *preClient; pre_client_t *preClient;
time_t large_ctcp_sent; /* ctcp to large group sent, relax flood checks */
}; };
struct LocalUser struct LocalUser

View file

@ -95,6 +95,9 @@ static int flood_attack_client(int p_or_n, struct Client *source_p, struct Clien
static int flood_attack_channel(int p_or_n, struct Client *source_p, static int flood_attack_channel(int p_or_n, struct Client *source_p,
struct Channel *chptr, char *chname); 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_NONE 0
#define ENTITY_CHANNEL 1 #define ENTITY_CHANNEL 1
#define ENTITY_CHANNEL_OPMOD 2 #define ENTITY_CHANNEL_OPMOD 2
@ -512,6 +515,9 @@ msg_channel(int p_or_n, const char *command,
{ {
sendto_channel_flags(client_p, ALL_MEMBERS, source_p, chptr, sendto_channel_flags(client_p, ALL_MEMBERS, source_p, chptr,
"%s %s :%s", command, chptr->chname, text); "%s %s :%s", command, chptr->chname, text);
if (p_or_n != NOTICE && *text == '\001' &&
rb_dlink_list_length(&chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2))
source_p->large_ctcp_sent = rb_current_time();
} }
} }
else if(chptr->mode.mode & MODE_OPMODERATE && else if(chptr->mode.mode & MODE_OPMODERATE &&
@ -766,6 +772,10 @@ msg_client(int p_or_n, const char *command,
} }
} }
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 && if (do_floodcount &&
flood_attack_client(p_or_n, source_p, target_p)) flood_attack_client(p_or_n, source_p, target_p))
return; return;
@ -1089,6 +1099,8 @@ handle_special(int p_or_n, const char *command, struct Client *client_p,
nick + 1, nick + 1,
(*nick == '#') ? MATCH_HOST : MATCH_SERVER, (*nick == '#') ? MATCH_HOST : MATCH_SERVER,
"%s $%s :%s", command, nick, text); "%s $%s :%s", command, nick, text);
if (p_or_n != NOTICE && *text == '\001')
source_p->large_ctcp_sent = rb_current_time();
return; return;
} }
} }