]> jfr.im git - solanum.git/blobdiff - ircd/client.c
Resolve shfit/reduce conflict in timespec production (#54)
[solanum.git] / ircd / client.c
index 7b68f9496109ddab53fc4ade82c340e7a69e0f8f..a11873991a2f40d98b043b7a71a67429f2e49aac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  charybdis: an advanced ircd.
+ *  Solanum: a slightly advanced ircd
  *  client.c: Controls clients.
  *
  *  Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
@@ -300,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);
@@ -570,6 +567,8 @@ 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      -
@@ -581,9 +580,17 @@ check_one_kline(struct ConfItem *kline)
        struct Client *client_p;
        rb_dlink_node *ptr;
        rb_dlink_node *next_ptr;
+       int masktype;
+       int bits;
+       struct rb_sockaddr_storage sockaddr;
+       struct sockaddr_in ip4;
+
+       masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits);
 
        RB_DLINK_FOREACH_SAFE(ptr, next_ptr, lclient_list.head)
        {
+               int matched = 0;
+
                client_p = ptr->data;
 
                if(IsMe(client_p) || !IsPerson(client_p))
@@ -593,29 +600,35 @@ check_one_kline(struct ConfItem *kline)
                        continue;
 
                /* match one kline */
-               {
-                       int matched = 0;
-                       int masktype;
-                       int bits;
-                       struct rb_sockaddr_storage sockaddr;
-
-                       masktype = parse_netmask(kline->host, (struct sockaddr *)&sockaddr, &bits);
-
-                       switch (masktype) {
-                       case HM_IPV4:
-                       case HM_IPV6:
-                               if(comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
+               switch (masktype) {
+               case HM_IPV4:
+               case HM_IPV6:
+                       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;
-                       case HM_HOST:
-                               if (match(kline->host, client_p->orighost))
-                                       matched = 1;
-                       }
-
-                       if (!matched)
+                               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;
                }
 
+               if (!matched)
+                       continue;
+
                if(IsExemptKline(client_p))
                {
                        sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
@@ -1134,7 +1147,7 @@ free_exited_clients(void *unused)
                                                target_p->name, (unsigned int) target_p->status,
                                                (unsigned long long)target_p->flags,  target_p->handler);
                                        sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                               "Please report this to the charybdis developers!");
+                                               "Please report this to the solanum developers!");
                                        found++;
                                }
                        }
@@ -1278,7 +1291,7 @@ exit_aborted_clients(void *unused)
                                        abt->client->name, (unsigned int) abt->client->status,
                                        (unsigned long long)abt->client->flags, abt->client->handler);
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "Please report this to the charybdis developers!");
+                                       "Please report this to the solanum developers!");
                                continue;
                        }
                }
@@ -1820,11 +1833,11 @@ show_ip(struct Client *source_p, struct Client *target_p)
                 * to local opers.
                 */
                if(!ConfigFileEntry.hide_spoof_ips &&
-                  (source_p == NULL || MyOper(source_p)))
+                  (source_p == NULL || (MyConnect(source_p) && HasPrivilege(source_p, "auspex:hostname"))))
                        return 1;
                return 0;
        }
-       else if(IsDynSpoof(target_p) && (source_p != NULL && !IsOper(source_p)))
+       else if(IsDynSpoof(target_p) && (source_p != NULL && !HasPrivilege(source_p, "auspex:hostname")))
                return 0;
        else
                return 1;
@@ -1918,6 +1931,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
                 */