mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 07:54:05 +01:00
ratelimit: Add rate-limiting to MOTD, WHO, and remote WHOIS.
This commit is contained in:
parent
e88a1f1b15
commit
7e132ff005
4 changed files with 21 additions and 3 deletions
|
@ -41,6 +41,7 @@
|
||||||
#include "modules.h"
|
#include "modules.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "chmode.h"
|
#include "chmode.h"
|
||||||
|
#include "ratelimit.h"
|
||||||
|
|
||||||
static int m_join(struct Client *, struct Client *, int, const char **);
|
static int m_join(struct Client *, struct Client *, int, const char **);
|
||||||
static int ms_join(struct Client *, struct Client *, int, const char **);
|
static int ms_join(struct Client *, struct Client *, int, const char **);
|
||||||
|
@ -325,6 +326,9 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
|
||||||
}
|
}
|
||||||
chptr->join_count++;
|
chptr->join_count++;
|
||||||
|
|
||||||
|
/* credit user for join */
|
||||||
|
credit_client_join(source_p);
|
||||||
|
|
||||||
/* we send the user their join here, because we could have to
|
/* we send the user their join here, because we could have to
|
||||||
* send a mode out next.
|
* send a mode out next.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "modules.h"
|
#include "modules.h"
|
||||||
#include "s_conf.h"
|
#include "s_conf.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
#include "ratelimit.h"
|
||||||
|
|
||||||
static int m_motd(struct Client *, struct Client *, int, const char **);
|
static int m_motd(struct Client *, struct Client *, int, const char **);
|
||||||
static int mo_motd(struct Client *, struct Client *, int, const char **);
|
static int mo_motd(struct Client *, struct Client *, int, const char **);
|
||||||
|
@ -66,7 +67,7 @@ m_motd(struct Client *client_p, struct Client *source_p, int parc, const char *p
|
||||||
{
|
{
|
||||||
static time_t last_used = 0;
|
static time_t last_used = 0;
|
||||||
|
|
||||||
if((last_used + ConfigFileEntry.pace_wait) > rb_current_time())
|
if((last_used + ConfigFileEntry.pace_wait) > rb_current_time() || !ratelimit_client(source_p, 6))
|
||||||
{
|
{
|
||||||
/* safe enough to give this on a local connect only */
|
/* safe enough to give this on a local connect only */
|
||||||
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "modules.h"
|
#include "modules.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "s_newconf.h"
|
#include "s_newconf.h"
|
||||||
|
#include "ratelimit.h"
|
||||||
|
|
||||||
#define FIELD_CHANNEL 0x0001
|
#define FIELD_CHANNEL 0x0001
|
||||||
#define FIELD_HOP 0x0002
|
#define FIELD_HOP 0x0002
|
||||||
|
@ -177,8 +178,18 @@ m_who(struct Client *client_p, struct Client *source_p, int parc, const char *pa
|
||||||
{
|
{
|
||||||
/* List all users on a given channel */
|
/* List all users on a given channel */
|
||||||
chptr = find_channel(parv[1] + operspy);
|
chptr = find_channel(parv[1] + operspy);
|
||||||
|
|
||||||
if(chptr != NULL)
|
if(chptr != NULL)
|
||||||
{
|
{
|
||||||
|
if (!IsOper(source_p) && !ratelimit_client_who(source_p, rb_dlink_list_length(&chptr->members)/50))
|
||||||
|
{
|
||||||
|
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
||||||
|
me.name, source_p->name, "WHO");
|
||||||
|
sendto_one(source_p, form_str(RPL_ENDOFWHO),
|
||||||
|
me.name, source_p->name, "*");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if(operspy)
|
if(operspy)
|
||||||
report_operspy(source_p, "WHO", chptr->chname);
|
report_operspy(source_p, "WHO", chptr->chname);
|
||||||
|
|
||||||
|
@ -187,6 +198,7 @@ m_who(struct Client *client_p, struct Client *source_p, int parc, const char *pa
|
||||||
else if(!SecretChannel(chptr))
|
else if(!SecretChannel(chptr))
|
||||||
do_who_on_channel(source_p, chptr, server_oper, NO, &fmt);
|
do_who_on_channel(source_p, chptr, server_oper, NO, &fmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendto_one(source_p, form_str(RPL_ENDOFWHO),
|
sendto_one(source_p, form_str(RPL_ENDOFWHO),
|
||||||
me.name, source_p->name, parv[1] + operspy);
|
me.name, source_p->name, parv[1] + operspy);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -233,7 +245,7 @@ m_who(struct Client *client_p, struct Client *source_p, int parc, const char *pa
|
||||||
/* it has to be a global who at this point, limit it */
|
/* it has to be a global who at this point, limit it */
|
||||||
if(!IsOper(source_p))
|
if(!IsOper(source_p))
|
||||||
{
|
{
|
||||||
if((last_used + ConfigFileEntry.pace_wait) > rb_current_time())
|
if((last_used + ConfigFileEntry.pace_wait) > rb_current_time() || !ratelimit_client(source_p, 1))
|
||||||
{
|
{
|
||||||
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
||||||
me.name, source_p->name, "WHO");
|
me.name, source_p->name, "WHO");
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
#include "s_newconf.h"
|
#include "s_newconf.h"
|
||||||
#include "ipv4_from_ipv6.h"
|
#include "ipv4_from_ipv6.h"
|
||||||
|
#include "ratelimit.h"
|
||||||
|
|
||||||
static void do_whois(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
|
static void do_whois(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
|
||||||
static void single_whois(struct Client *source_p, struct Client *target_p, int operspy);
|
static void single_whois(struct Client *source_p, struct Client *target_p, int operspy);
|
||||||
|
@ -89,7 +90,7 @@ m_whois(struct Client *client_p, struct Client *source_p, int parc, const char *
|
||||||
if(!IsOper(source_p))
|
if(!IsOper(source_p))
|
||||||
{
|
{
|
||||||
/* seeing as this is going across servers, we should limit it */
|
/* seeing as this is going across servers, we should limit it */
|
||||||
if((last_used + ConfigFileEntry.pace_wait_simple) > rb_current_time())
|
if((last_used + ConfigFileEntry.pace_wait_simple) > rb_current_time() || !ratelimit_client(source_p, 2))
|
||||||
{
|
{
|
||||||
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
sendto_one(source_p, form_str(RPL_LOAD2HI),
|
||||||
me.name, source_p->name, "WHOIS");
|
me.name, source_p->name, "WHOIS");
|
||||||
|
|
Loading…
Reference in a new issue