X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/fb87421d0e13c6e62a7c7a62a597e3b53ef772ed..d25c6eb1b223d1a0993dde9a28c97ef95e54bceb:/src/client.c diff --git a/src/client.c b/src/client.c index d22c7ef..1cc32b4 100644 --- a/src/client.c +++ b/src/client.c @@ -1146,6 +1146,9 @@ exit_generic_client(struct Client *client_p, struct Client *source_p, struct Cli if(IsOper(source_p)) rb_dlinkFindDestroy(source_p, &oper_list); + /* get rid of any metadata the user may have */ + user_metadata_clear(source_p); + sendto_common_channels_local(source_p, ":%s!%s@%s QUIT :%s", source_p->name, source_p->username, source_p->host, comment); @@ -1709,14 +1712,6 @@ free_user(struct User *user, struct Client *client_p) { free_away(client_p); - /* get rid of any metadata the user may have */ - if(IsOper(client_p)) - { - user_metadata_delete(client_p, "swhois", 0); - user_metadata_delete(client_p, "operstring", 0); - } - user_metadata_delete(client_p, "OACCEPT", 0); - if(--user->refcnt <= 0) { if(user->away) @@ -1954,9 +1949,6 @@ user_metadata_add(struct Client *target, const char *name, const char *value, in { struct Metadata *md; - if(irc_dictionary_find(target->user->metadata, name) != NULL) - return NULL; - md = rb_malloc(sizeof(struct Metadata)); md->name = rb_strdup(name); md->value = rb_strdup(value); @@ -1965,7 +1957,7 @@ user_metadata_add(struct Client *target, const char *name, const char *value, in if(propegate) sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * METADATA ADD %s %s :%s", - target->name, name, value); + target->id, name, value); return md; } @@ -1993,7 +1985,7 @@ user_metadata_delete(struct Client *target, const char *name, int propegate) if(propegate) sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * METADATA DELETE %s %s", - target->name, name); + target->id, name); } /* @@ -2015,3 +2007,21 @@ user_metadata_find(struct Client *target, const char *name) return irc_dictionary_retrieve(target->user->metadata, name); } +/* + * user_metadata_clear + * + * inputs - pointer to user struct + * output - none + * side effects - metadata is cleared from the user in question + */ +void +user_metadata_clear(struct Client *target) +{ + struct Metadata *md; + struct DictionaryIter iter; + + DICTIONARY_FOREACH(md, &iter, target->user->metadata) + { + user_metadata_delete(target, md->name, 0); + } +}