]> jfr.im git - solanum.git/blobdiff - ircd/client.c
filter: Filter only locally-sourced messages
[solanum.git] / ircd / client.c
index 3378bc4a7d30ea3f3de78de82b4cfa6f93b016e9..a19c664f3bf478784218dc76b2804de2bb004bbe 100644 (file)
@@ -80,12 +80,6 @@ static uint32_t current_connid = 0;
 
 rb_dictionary *nd_dict = NULL;
 
-enum
-{
-       D_LINED,
-       K_LINED
-};
-
 rb_dlink_list dead_list;
 #ifdef DEBUG_EXITED_CLIENTS
 static rb_dlink_list dead_remote_list;
@@ -306,10 +300,7 @@ free_local_client(struct Client *client_p)
        rb_free(client_p->localClient->auth_user);
        rb_free(client_p->localClient->challenge);
        rb_free(client_p->localClient->fullcaps);
-       rb_free(client_p->localClient->opername);
        rb_free(client_p->localClient->mangledhost);
-       if (client_p->localClient->privset)
-               privilegeset_unref(client_p->localClient->privset);
 
        if (IsSSL(client_p))
                ssld_decrement_clicount(client_p->localClient->ssl_ctl);
@@ -487,7 +478,7 @@ check_unknowns_list(rb_dlink_list * list)
        }
 }
 
-static void
+void
 notify_banned_client(struct Client *client_p, struct ConfItem *aconf, int ban)
 {
        static const char conn_closed[] = "Connection closed";
@@ -532,19 +523,6 @@ check_banned_lines(void)
        check_xlines();
 }
 
-/* check_klines_event()
- *
- * inputs      -
- * outputs     -
- * side effects - check_klines() is called, kline_queued unset
- */
-void
-check_klines_event(void *unused)
-{
-       kline_queued = false;
-       check_klines();
-}
-
 /* check_klines
  *
  * inputs       -
@@ -587,6 +565,74 @@ check_klines(void)
        }
 }
 
+
+/* check_one_kline()
+ *
+ * This process needs to be kept in sync with find_kline() aka find_conf_by_address().
+ *
+ * inputs       - pointer to kline to check
+ * outputs      -
+ * side effects - all clients will be checked against given kline
+ */
+void
+check_one_kline(struct ConfItem *kline)
+{
+       struct Client *client_p;
+       rb_dlink_node *ptr;
+       rb_dlink_node *next_ptr;
+
+       RB_DLINK_FOREACH_SAFE(ptr, next_ptr, lclient_list.head)
+       {
+               client_p = ptr->data;
+
+               if(IsMe(client_p) || !IsPerson(client_p))
+                       continue;
+
+               if(!match(kline->user, client_p->username))
+                       continue;
+
+               /* match one kline */
+               {
+                       int matched = 0;
+                       int masktype;
+                       int bits;
+                       struct rb_sockaddr_storage sockaddr;
+
+                       masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits);
+
+                       switch (masktype) {
+                       case HM_IPV4:
+                       case HM_IPV6:
+                               if(comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
+                                               (struct sockaddr *)&sockaddr, bits))
+                                       matched = 1;
+                       case HM_HOST:
+                               if (match(kline->host, client_p->orighost))
+                                       matched = 1;
+                       }
+
+                       if (!matched)
+                               continue;
+               }
+
+               if(IsExemptKline(client_p))
+               {
+                       sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
+                                                "KLINE over-ruled for %s, client is kline_exempt [%s@%s]",
+                                                get_client_name(client_p, HIDE_IP),
+                                                kline->user, kline->host);
+                       continue;
+               }
+
+               sendto_realops_snomask(SNO_GENERAL, L_ALL,
+                                        "KLINE active for %s",
+                                        get_client_name(client_p, HIDE_IP));
+
+               notify_banned_client(client_p, kline, K_LINED);
+       }
+}
+
+
 /* check_dlines()
  *
  * inputs       -
@@ -1871,6 +1917,9 @@ free_user(struct User *user, struct Client *client_p)
        {
                if(user->away)
                        rb_free((char *) user->away);
+               rb_free(user->opername);
+               if (user->privset)
+                       privilegeset_unref(user->privset);
                /*
                 * sanity check
                 */