X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/9834d3d5baa75cf46ab8c6fbadd7ddc337728abd..c1f9603bba04de9f1bac1fa70145c9f0dfe22277:/ircd/client.c diff --git a/ircd/client.c b/ircd/client.c index 7b68f949..a1187399 100644 --- a/ircd/client.c +++ b/ircd/client.c @@ -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 */