X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.c;h=1c75d7181bf0b8a73af4a9ed3c5562771a8ec2eb;hb=a939f27e19b8084ef2acd25156b19d26d1440ace;hp=24aa5934411da2e56c5b6c00e03b00a9e5f2178c;hpb=cbc144f6d31ef9d08feb0c8d1b938519f5d450e0;p=silc.git diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index 24aa5934..1c75d718 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2005, 2007 Pekka Riikonen + Copyright (C) 1997 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -55,30 +55,11 @@ void silc_idlist_del_data(void *entry) if (idata->hash) silc_hash_free(idata->hash); - if (idata->public_key) - silc_pkcs_public_key_free(idata->public_key); idata->hash = NULL; idata->public_key = NULL; } -/* Purges ID cache */ - -SILC_TASK_CALLBACK(silc_idlist_purge) -{ - SilcServer server = app_context; - SilcIDListPurge i = (SilcIDListPurge)context; - - SILC_LOG_DEBUG(("Purging cache")); - -#if 0 - /* XXX */ - silc_idcache_purge(i->cache); - silc_schedule_task_add_timeout(server->schedule, silc_idlist_purge, i, - i->timeout, 0); -#endif -} - /****************************************************************************** Server entry functions @@ -162,7 +143,8 @@ silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id, SilcServerEntry silc_idlist_find_server_by_name(SilcIDList id_list, char *name, - SilcBool registered, SilcIDCacheEntry *ret_entry) + SilcBool registered, + SilcIDCacheEntry *ret_entry) { SilcIDCacheEntry id_cache = NULL; SilcServerEntry server; @@ -295,6 +277,16 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) return FALSE; } +/* ID Cache destructor */ + +void silc_idlist_server_destructor(SilcIDCache cache, + SilcIDCacheEntry entry, + void *dest_context, + void *app_context) +{ + silc_free(entry->name); +} + /****************************************************************************** Client entry functions @@ -334,7 +326,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, int ret; ret = silc_parse_userfqdn(username, u, sizeof(u), h, sizeof(h)); - if (!u) + if (!ret) return NULL; if (!silc_identifier_verify(u, strlen(u), SILC_STRING_UTF8, 128)) return NULL; @@ -344,6 +336,8 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, } client = silc_calloc(1, sizeof(*client)); + if (!client) + return NULL; client->nickname = nickname; client->username = username ? strdup(username) : NULL; client->userinfo = userinfo; @@ -369,7 +363,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry) { - SILC_LOG_DEBUG(("Start")); + SILC_LOG_DEBUG(("Delete client %p", entry)); if (entry) { /* Delete client, destructor will free data */ @@ -390,15 +384,15 @@ void silc_idlist_client_destructor(SilcIDCache cache, void *dest_context, void *app_context) { - SilcServer server = app_context; + SilcServer server = dest_context; SilcClientEntry client; client = (SilcClientEntry)entry->context; if (client) { - /* Remove this client from the public key hash list */ + /* Remove client's public key from repository, this will free it too. */ if (client->data.public_key) - silc_hash_table_del_by_context(server->pk_hash, - client->data.public_key, client); + silc_skr_del_public_key(server->repository, client->data.public_key, + client); assert(!silc_hash_table_count(client->channels)); silc_free(client->nickname); @@ -407,8 +401,6 @@ void silc_idlist_client_destructor(SilcIDCache cache, silc_free(client->userinfo); silc_free(client->id); silc_free(client->attrs); - if (client->data.public_key) - silc_pkcs_public_key_free(client->data.public_key); silc_hash_table_free(client->channels); memset(client, 'A', sizeof(*client)); @@ -450,7 +442,8 @@ int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname, is returned to `clients_count'. Caller must free the returned table. The 'nickname' must be normalized already. */ -int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, +int silc_idlist_get_clients_by_hash(SilcIDList id_list, + char *nickname, char *server, SilcHash md5hash, SilcClientEntry **clients, SilcUInt32 *clients_count) @@ -459,6 +452,7 @@ int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, SilcIDCacheEntry id_cache = NULL; unsigned char hash[SILC_HASH_MAXLEN]; SilcClientID client_id; + SilcClientEntry client_entry; SILC_LOG_DEBUG(("Start")); @@ -473,6 +467,21 @@ int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, if (!silc_idcache_find_by_id(id_list->clients, &client_id, &list)) return FALSE; + /* If server is specified, narrow the search with it. */ + if (server) { + silc_list_start(list); + while ((id_cache = silc_list_get(list))) { + client_entry = id_cache->context; + if (!client_entry->servername) + continue; + if (!silc_utf8_strcasecmp(client_entry->servername, server)) + silc_list_del(list, id_cache); + } + } + + if (!silc_list_count(list)) + return FALSE; + *clients = silc_realloc(*clients, (silc_list_count(list) + *clients_count) * sizeof(**clients)); @@ -549,18 +558,17 @@ silc_idlist_replace_client_id(SilcServer server, client = (SilcClientEntry)id_cache->context; - /* Remove the old entry and add a new one */ - - if (!silc_idcache_del_by_context(id_list->clients, client, server)) - return NULL; - /* Check if anyone is watching old nickname */ if (server->server_type == SILC_ROUTER) silc_server_check_watcher_list(server, client, nickname, SILC_NOTIFY_TYPE_NICK_CHANGE); + /* Replace */ + if (!silc_idcache_update(id_list->clients, id_cache, new_id, nicknamec, + TRUE)) + return NULL; + silc_free(client->nickname); - *client->id = *new_id; client->nickname = nickname ? strdup(nickname) : NULL; /* Check if anyone is watching new nickname */ @@ -568,10 +576,6 @@ silc_idlist_replace_client_id(SilcServer server, silc_server_check_watcher_list(server, client, nickname, SILC_NOTIFY_TYPE_NICK_CHANGE); - if (!silc_idcache_add(id_list->clients, nicknamec, client->id, - client)) - return NULL; - SILC_LOG_DEBUG(("Replaced")); return client; @@ -625,7 +629,7 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, NULL, NULL, NULL, TRUE); if (!silc_idcache_add(id_list->channels, channel_namec, - (void *)channel->id, (void *)channel /*XXX, expire */)) { + (void *)channel->id, (void *)channel)) { silc_hmac_free(channel->hmac); silc_hash_table_free(channel->user_list); silc_free(channel); @@ -636,6 +640,16 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, return channel; } +/* ID Cache destructor */ + +void silc_idlist_channel_destructor(SilcIDCache cache, + SilcIDCacheEntry entry, + void *dest_context, + void *app_context) +{ + silc_free(entry->name); +} + /* Foreach callbcak to free all users from the channel when deleting a channel entry. */