mirror of
https://github.com/matrix-construct/construct
synced 2024-11-26 00:32:35 +01:00
Move flood_attack_channel to channel.c so it can be used outside m_message.c
This commit is contained in:
parent
87d38e8cf1
commit
15484f02bd
3 changed files with 58 additions and 59 deletions
|
@ -218,6 +218,8 @@ extern void destroy_channel(struct Channel *);
|
|||
|
||||
extern int can_send(struct Channel *chptr, struct Client *who,
|
||||
struct membership *);
|
||||
extern int flood_attack_channel(int p_or_n, struct Client *source_p,
|
||||
struct Channel *chptr, char *chname);
|
||||
extern int is_banned(struct Channel *chptr, struct Client *who,
|
||||
struct membership *msptr, const char *, const char *);
|
||||
extern int is_quieted(struct Channel *chptr, struct Client *who,
|
||||
|
|
|
@ -92,8 +92,6 @@ static int build_target_list(int p_or_n, const char *command,
|
|||
struct Client *source_p, const char *nicks_channels, const char *text);
|
||||
|
||||
static int flood_attack_client(int p_or_n, struct Client *source_p, struct Client *target_p);
|
||||
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
|
||||
|
@ -887,63 +885,6 @@ flood_attack_client(int p_or_n, struct Client *source_p, struct Client *target_p
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* flood_attack_channel
|
||||
* inputs - flag 0 if PRIVMSG 1 if NOTICE. RFC
|
||||
* says NOTICE must not auto reply
|
||||
* - pointer to source Client
|
||||
* - pointer to target channel
|
||||
* output - 1 if target is under flood attack
|
||||
* side effects - check for flood attack on target chptr
|
||||
*/
|
||||
static int
|
||||
flood_attack_channel(int p_or_n, struct Client *source_p, struct Channel *chptr, char *chname)
|
||||
{
|
||||
int delta;
|
||||
|
||||
if(GlobalSetOptions.floodcount && MyClient(source_p))
|
||||
{
|
||||
if((chptr->first_received_message_time + 1) < rb_current_time())
|
||||
{
|
||||
delta = rb_current_time() - chptr->first_received_message_time;
|
||||
chptr->received_number_of_privmsgs -= delta;
|
||||
chptr->first_received_message_time = rb_current_time();
|
||||
if(chptr->received_number_of_privmsgs <= 0)
|
||||
{
|
||||
chptr->received_number_of_privmsgs = 0;
|
||||
chptr->flood_noticed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if((chptr->received_number_of_privmsgs >= GlobalSetOptions.floodcount)
|
||||
|| chptr->flood_noticed)
|
||||
{
|
||||
if(chptr->flood_noticed == 0)
|
||||
{
|
||||
sendto_realops_snomask(SNO_BOTS, *chptr->chname == '&' ? L_ALL : L_NETWIDE,
|
||||
"Possible Flooder %s[%s@%s] on %s target: %s",
|
||||
source_p->name, source_p->username,
|
||||
source_p->orighost,
|
||||
source_p->servptr->name, chptr->chname);
|
||||
chptr->flood_noticed = 1;
|
||||
|
||||
/* Add a bit of penalty */
|
||||
chptr->received_number_of_privmsgs += 2;
|
||||
}
|
||||
if(MyClient(source_p) && (p_or_n != NOTICE))
|
||||
sendto_one(source_p,
|
||||
":%s NOTICE %s :*** Message to %s throttled due to flooding",
|
||||
me.name, source_p->name, chptr->chname);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
chptr->received_number_of_privmsgs++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* handle_special
|
||||
*
|
||||
|
|
|
@ -877,6 +877,62 @@ can_send(struct Channel *chptr, struct Client *source_p, struct membership *mspt
|
|||
return moduledata.approved;
|
||||
}
|
||||
|
||||
/*
|
||||
* flood_attack_channel
|
||||
* inputs - flag 0 if PRIVMSG 1 if NOTICE. RFC
|
||||
* says NOTICE must not auto reply
|
||||
* - pointer to source Client
|
||||
* - pointer to target channel
|
||||
* output - 1 if target is under flood attack
|
||||
* side effects - check for flood attack on target chptr
|
||||
*/
|
||||
int
|
||||
flood_attack_channel(int p_or_n, struct Client *source_p, struct Channel *chptr, char *chname)
|
||||
{
|
||||
int delta;
|
||||
|
||||
if(GlobalSetOptions.floodcount && MyClient(source_p))
|
||||
{
|
||||
if((chptr->first_received_message_time + 1) < rb_current_time())
|
||||
{
|
||||
delta = rb_current_time() - chptr->first_received_message_time;
|
||||
chptr->received_number_of_privmsgs -= delta;
|
||||
chptr->first_received_message_time = rb_current_time();
|
||||
if(chptr->received_number_of_privmsgs <= 0)
|
||||
{
|
||||
chptr->received_number_of_privmsgs = 0;
|
||||
chptr->flood_noticed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if((chptr->received_number_of_privmsgs >= GlobalSetOptions.floodcount)
|
||||
|| chptr->flood_noticed)
|
||||
{
|
||||
if(chptr->flood_noticed == 0)
|
||||
{
|
||||
sendto_realops_snomask(SNO_BOTS, *chptr->chname == '&' ? L_ALL : L_NETWIDE,
|
||||
"Possible Flooder %s[%s@%s] on %s target: %s",
|
||||
source_p->name, source_p->username,
|
||||
source_p->orighost,
|
||||
source_p->servptr->name, chptr->chname);
|
||||
chptr->flood_noticed = 1;
|
||||
|
||||
/* Add a bit of penalty */
|
||||
chptr->received_number_of_privmsgs += 2;
|
||||
}
|
||||
if(MyClient(source_p) && (p_or_n != 1))
|
||||
sendto_one(source_p,
|
||||
":%s NOTICE %s :*** Message to %s throttled due to flooding",
|
||||
me.name, source_p->name, chptr->chname);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
chptr->received_number_of_privmsgs++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* find_bannickchange_channel()
|
||||
* Input: client to check
|
||||
* Output: channel preventing nick change
|
||||
|
|
Loading…
Reference in a new issue