]> jfr.im git - solanum.git/blobdiff - ircd/client.c
Implement hook priorities
[solanum.git] / ircd / client.c
index 072d0a4cbf1d60420aebf4ea924ab1beebbaf1df..b333f44edd436f29a14087c676bc4cb18298512b 100644 (file)
@@ -583,6 +583,7 @@ check_one_kline(struct ConfItem *kline)
        int masktype;
        int bits;
        struct rb_sockaddr_storage sockaddr;
+       struct sockaddr_in ip4;
 
        masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits);
 
@@ -602,13 +603,24 @@ check_one_kline(struct ConfItem *kline)
                switch (masktype) {
                case HM_IPV4:
                case HM_IPV6:
-                       if (comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
-                                       (struct sockaddr *)&sockaddr, bits))
+                       if (IsConfDoSpoofIp(client_p->localClient->att_conf) &&
+                                       IsConfKlineSpoof(client_p->localClient->att_conf))
+                               continue;
+                       if (client_p->localClient->ip.ss_family == AF_INET6 && sockaddr.ss_family == AF_INET &&
+                                       rb_ipv4_from_ipv6((struct sockaddr_in6 *)&client_p->localClient->ip, &ip4)
+                                               && comp_with_mask_sock((struct sockaddr *)&ip4, (struct sockaddr *)&sockaddr, bits))
+                               matched = 1;
+                       else if (client_p->localClient->ip.ss_family == sockaddr.ss_family &&
+                                       comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
+                                               (struct sockaddr *)&sockaddr, bits))
                                matched = 1;
                        break;
                case HM_HOST:
                        if (match(kline->host, client_p->orighost))
                                matched = 1;
+                       if (IsConfDoSpoofIp(client_p->localClient->att_conf) &&
+                                       IsConfKlineSpoof(client_p->localClient->att_conf))
+                               continue;
                        if (match(kline->host, client_p->sockhost))
                                matched = 1;
                        break;