]> jfr.im git - solanum.git/commitdiff
ratelimit: Add rate-limiting to MOTD, WHO, and remote WHOIS.
authorKeith Buck <redacted>
Sat, 18 Feb 2012 03:56:47 +0000 (03:56 +0000)
committerKeith Buck <redacted>
Sat, 18 Feb 2012 03:56:47 +0000 (03:56 +0000)
modules/core/m_join.c
modules/m_motd.c
modules/m_who.c
modules/m_whois.c

index 1257fb585944f4888cf9c7105ae58437798494ec..99daee4e18e53d8c41c409cc1383bb76b9cf3112 100644 (file)
@@ -41,6 +41,7 @@
 #include "modules.h"
 #include "packet.h"
 #include "chmode.h"
+#include "ratelimit.h"
 
 static int m_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++;
 
+               /* credit user for join */
+               credit_client_join(source_p);
+
                /* we send the user their join here, because we could have to
                 * send a mode out next.
                 */
index cb4b171389602640513f81acb43cde94c4aeb837..f798029a5bec78ce574787e69686719417b82102 100644 (file)
@@ -36,6 +36,7 @@
 #include "modules.h"
 #include "s_conf.h"
 #include "cache.h"
+#include "ratelimit.h"
 
 static int m_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;
 
-       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 */
                sendto_one(source_p, form_str(RPL_LOAD2HI),
index b8ffc873d99ac14aec01ae5c634dee74048a40e5..8bb05afe3ccea1fde5490ace53f1e38e60095192 100644 (file)
@@ -40,6 +40,7 @@
 #include "modules.h"
 #include "packet.h"
 #include "s_newconf.h"
+#include "ratelimit.h"
 
 #define FIELD_CHANNEL    0x0001
 #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 */
                chptr = find_channel(parv[1] + operspy);
+
                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)
                                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))
                                do_who_on_channel(source_p, chptr, server_oper, NO, &fmt);
                }
+
                sendto_one(source_p, form_str(RPL_ENDOFWHO),
                           me.name, source_p->name, parv[1] + operspy);
                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 */
        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),
                                        me.name, source_p->name, "WHO");
index 102a0836e29745c4d2505d6505733c5be8a545e9..f06329cd1c8c85c10d999ef0ed5cc23053e0b259 100644 (file)
@@ -44,6 +44,7 @@
 #include "hook.h"
 #include "s_newconf.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 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))
                {
                        /* 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),
                                           me.name, source_p->name, "WHOIS");