diff --git a/include/channel.h b/include/channel.h index 22f9d53..37751d7 100644 --- a/include/channel.h +++ b/include/channel.h @@ -231,6 +231,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, diff --git a/modules/core/m_message.c b/modules/core/m_message.c index 670a609..506dc54 100644 --- a/modules/core/m_message.c +++ b/modules/core/m_message.c @@ -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 @@ -969,63 +967,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) && (!IsOper(source_p) || !ConfigFileEntry.true_no_oper_flood)) - { - 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 * diff --git a/src/channel.c b/src/channel.c index 88f1870..a2e6fa6 100644 --- a/src/channel.c +++ b/src/channel.c @@ -987,6 +987,62 @@ can_send(struct Channel *chptr, struct Client *source_p, struct membership *mspt return CAN_SEND_NONOP; } +/* + * 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) && (!IsOper(source_p) || !ConfigFileEntry.true_no_oper_flood)) + { + 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