X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/17d00839b3821b7b41212b3ed2b3da2711f24618..e5847c3ef379e4e5a3c0ecfc5ddd60628f446050:/src/client.c diff --git a/src/client.c b/src/client.c index 458247b..e94e393 100644 --- a/src/client.c +++ b/src/client.c @@ -77,6 +77,7 @@ static rb_bh *lclient_heap = NULL; static rb_bh *pclient_heap = NULL; static rb_bh *user_heap = NULL; static rb_bh *away_heap = NULL; +static rb_bh *metadata_heap = NULL; static char current_uid[IDLEN]; struct Dictionary *nd_dict = NULL; @@ -120,6 +121,7 @@ init_client(void) lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap"); pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap"); user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE, "user_heap"); + metadata_heap = rb_bh_create(sizeof(struct MetadataEntry), USER_HEAP_SIZE, "metadata_heap"); away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap"); rb_event_addish("check_pings", check_pings, NULL, 30); @@ -235,8 +237,14 @@ free_local_client(struct Client *client_p) 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); - ssld_decrement_clicount(client_p->localClient->ssl_ctl); + if(IsSSL(client_p)) + ssld_decrement_clicount(client_p->localClient->ssl_ctl); + + if(IsCapable(client_p, CAP_ZIP)) + ssld_decrement_clicount(client_p->localClient->z_ctl); rb_bh_free(lclient_heap, client_p->localClient); client_p->localClient = NULL; @@ -441,84 +449,9 @@ notify_banned_client(struct Client *client_p, struct ConfItem *aconf, int ban) void check_banned_lines(void) { - struct Client *client_p; /* current local client_p being examined */ - struct ConfItem *aconf = NULL; - rb_dlink_node *ptr, *next_ptr; - - RB_DLINK_FOREACH_SAFE(ptr, next_ptr, lclient_list.head) - { - client_p = ptr->data; - - if(IsMe(client_p)) - continue; - - /* if there is a returned struct ConfItem then kill it */ - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip, client_p->localClient->ip.ss_family))) - { - if(aconf->status & CONF_EXEMPTDLINE) - continue; - - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "DLINE active for %s", - get_client_name(client_p, HIDE_IP)); - - notify_banned_client(client_p, aconf, D_LINED); - continue; /* and go examine next fd/client_p */ - } - - if(!IsPerson(client_p)) - continue; - - if((aconf = find_kline(client_p)) != NULL) - { - if(IsExemptKline(client_p)) - { - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "KLINE over-ruled for %s, client is kline_exempt [%s@%s]", - get_client_name(client_p, HIDE_IP), - aconf->user, aconf->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, aconf, K_LINED); - continue; - } - else if((aconf = find_xline(client_p->info, 1)) != NULL) - { - if(IsExemptKline(client_p)) - { - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "XLINE over-ruled for %s, client is kline_exempt [%s]", - get_client_name(client_p, HIDE_IP), - aconf->name); - continue; - } - - sendto_realops_snomask(SNO_GENERAL, L_ALL, "XLINE active for %s", - get_client_name(client_p, HIDE_IP)); - - (void) exit_client(client_p, client_p, &me, "Bad user info"); - continue; - } - } - - /* also check the unknowns list for new dlines */ - RB_DLINK_FOREACH_SAFE(ptr, next_ptr, unknown_list.head) - { - client_p = ptr->data; - - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family))) - { - if(aconf->status & CONF_EXEMPTDLINE) - continue; - - notify_banned_client(client_p, aconf, D_LINED); - } - } - + check_dlines(); + check_klines(); + check_xlines(); } /* check_klines_event() @@ -560,8 +493,9 @@ check_klines(void) if(IsExemptKline(client_p)) { sendto_realops_snomask(SNO_GENERAL, L_ALL, - "KLINE over-ruled for %s, client is kline_exempt", - get_client_name(client_p, HIDE_IP)); + "KLINE over-ruled for %s, client is kline_exempt [%s@%s]", + get_client_name(client_p, HIDE_IP), + aconf->user, aconf->host); continue; } @@ -651,8 +585,9 @@ check_xlines(void) if(IsExemptKline(client_p)) { sendto_realops_snomask(SNO_GENERAL, L_ALL, - "XLINE over-ruled for %s, client is kline_exempt", - get_client_name(client_p, HIDE_IP)); + "XLINE over-ruled for %s, client is kline_exempt [%s]", + get_client_name(client_p, HIDE_IP), + aconf->name); continue; } @@ -1724,8 +1659,10 @@ make_user(struct Client *client_p) { user = (struct User *) rb_bh_alloc(user_heap); user->refcnt = 1; + user->metadata = irc_dictionary_create(irccmp); client_p->user = user; } + return user; } @@ -1811,6 +1748,36 @@ free_away(struct Client *client_p) } } +void +set_metadata(struct Client *client_p, const char *key, const char *value) +{ + struct MetadataEntry *md; + + if(client_p->user != NULL) + { + md = rb_bh_alloc(metadata_heap); + rb_strlcpy(md->key, key, NICKLEN); + rb_strlcpy(md->value, value, TOPICLEN); + + irc_dictionary_add(client_p->user->metadata, key, md); + } +} + +void +delete_metadata(struct Client *client_p, const char *key) +{ + struct MetadataEntry *md; + + if(client_p->user != NULL) + { + md = irc_dictionary_delete(client_p->user->metadata, key); + if (md == NULL) + return; + + rb_free(md); + } +} + void init_uid(void) {