X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/d7cff1d11ba8b6a5eb393911b8edda125b2f9bbb..8e3b2b85c7221f2f9f1ca6d5e48880d521d2a1a3:/src/reject.c diff --git a/src/reject.c b/src/reject.c index b5035c6..3453c7d 100644 --- a/src/reject.c +++ b/src/reject.c @@ -122,6 +122,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 +211,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 +313,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 +337,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) {