X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/40232936744bba4ca2e347dc8cafeb36f30bb35b..255130dde8eed921fea4b23786a5743fbd50cbda:/src/channel.c?ds=sidebyside 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