]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/reject.c
Correct error message involving no fingerprint credentials or password credentials...
[irc/rqf/shadowircd.git] / src / reject.c
index b5035c6567f0854897a1625d6b201f16b2742359..ab9163b2ede9ae05005556cfccae4d35eb23e8a2 100644 (file)
@@ -20,7 +20,6 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
  *  USA
  *
- *  $Id: reject.c 25119 2008-03-13 16:57:05Z androsyn $
  */
 
 #include "stdinc.h"
@@ -122,6 +121,25 @@ init_reject(void)
        rb_event_add("throttle_expires", throttle_expires, NULL, 10);
 }
 
+unsigned long
+throttle_size(void)
+{
+       unsigned long count;
+       rb_dlink_node *ptr;
+       rb_patricia_node_t *pnode;
+       throttle_t *t;
+
+       count = 0;
+       RB_DLINK_FOREACH(ptr, throttle_list.head)
+       {
+               pnode = ptr->data;
+               t = pnode->data;
+               if (t->count > ConfigFileEntry.throttle_count)
+                       count++;
+       }
+
+       return count;
+}
 
 void
 add_reject(struct Client *client_p, const char *mask1, const char *mask2)
@@ -192,6 +210,31 @@ check_reject(rb_fde_t *F, struct sockaddr *addr)
        return 0;
 }
 
+int
+is_reject_ip(struct sockaddr *addr)
+{
+       rb_patricia_node_t *pnode;
+       reject_t *rdata;
+       int duration;
+
+       /* Reject is disabled */
+       if(ConfigFileEntry.reject_after_count == 0 || ConfigFileEntry.reject_duration == 0)
+               return 0;
+               
+       pnode = rb_match_ip(reject_tree, addr);
+       if(pnode != NULL)
+       {
+               rdata = pnode->data;
+
+               if(rdata->count > (unsigned long)ConfigFileEntry.reject_after_count)
+               {
+                       duration = rdata->time + ConfigFileEntry.reject_duration - rb_current_time();
+                       return duration > 0 ? duration : 1;
+               }
+       }       
+       return 0;
+}
+
 void 
 flush_reject(void)
 {
@@ -269,8 +312,10 @@ throttle_add(struct sockaddr *addr)
                t = pnode->data;
 
                if(t->count > ConfigFileEntry.throttle_count)
-                       return 1;                       
-
+               {
+                       ServerStats.is_thr++;
+                       return 1;
+               }
                /* Stop penalizing them after they've been throttled */
                t->last = rb_current_time();
                t->count++;
@@ -291,6 +336,43 @@ throttle_add(struct sockaddr *addr)
        return 0;
 }
 
+int
+is_throttle_ip(struct sockaddr *addr)
+{
+       throttle_t *t;
+       rb_patricia_node_t *pnode;
+       int duration;
+
+       if((pnode = rb_match_ip(throttle_tree, addr)) != NULL)
+       {
+               t = pnode->data;
+               if(t->count > ConfigFileEntry.throttle_count)
+               {
+                       duration = t->last + ConfigFileEntry.throttle_duration - rb_current_time();
+                       return duration > 0 ? duration : 1;
+               }
+       }
+       return 0;
+}
+
+void 
+flush_throttle(void)
+{
+       rb_dlink_node *ptr, *next;
+       rb_patricia_node_t *pnode;
+       throttle_t *t;
+       
+       RB_DLINK_FOREACH_SAFE(ptr, next, throttle_list.head)
+       {
+               pnode = ptr->data;
+               t = pnode->data;                
+
+               rb_dlinkDelete(ptr, &throttle_list);
+               rb_free(t);
+               rb_patricia_remove(throttle_tree, pnode);
+       }
+}
+
 static void
 throttle_expires(void *unused)
 {