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:
parent
cf09122bf7
commit
aa9c9ed268
2 changed files with 14 additions and 0 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue