X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.c;h=110fa3cf5f3e20123ad0e1c23a64715789f7e4b7;hp=cb18b18b559dbf596477061e1abf02ea7fa27372;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hpb=e7bb7daaa8a471ddafbd3774c6aed541a5ecdb41 diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index cb18b18b..110fa3cf 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -36,14 +36,19 @@ void silc_idlist_add_data(void *entry, SilcIDListData idata) SilcIDListData data = (SilcIDListData)entry; data->send_key = idata->send_key; data->receive_key = idata->receive_key; - data->rekey = idata->rekey; - data->hash = idata->hash; data->hmac_send = idata->hmac_send; data->hmac_receive = idata->hmac_receive; + data->psn_send = idata->psn_send; + data->psn_receive = idata->psn_receive; + data->hash = idata->hash; data->public_key = idata->public_key; + memcpy(data->fingerprint, idata->fingerprint, sizeof(data->fingerprint)); + data->rekey = idata->rekey; data->last_receive = idata->last_receive; data->last_sent = idata->last_sent; - data->registered = idata->registered; + data->status = idata->status; + + data->created = time(0); /* Update creation time */ } /* Free's all data in the common ID entry data structure. */ @@ -62,8 +67,12 @@ void silc_idlist_del_data(void *entry) } silc_free(idata->rekey); } - if (idata->hmac_send) /* Same as idata->hmac_receive */ + if (idata->hmac_send) silc_hmac_free(idata->hmac_send); + if (idata->hmac_receive) + silc_hmac_free(idata->hmac_receive); + if (idata->hash) + silc_hash_free(idata->hash); if (idata->public_key) silc_pkcs_public_key_free(idata->public_key); } @@ -79,7 +88,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge) silc_idcache_purge(i->cache); silc_schedule_task_add(i->schedule, 0, silc_idlist_purge, - (void *)i, 600, 0, + (void *)i, i->timeout, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW); } @@ -112,7 +121,7 @@ silc_idlist_add_server(SilcIDList id_list, server->connection = connection; if (!silc_idcache_add(id_list->servers, server->server_name, - (void *)server->id, (void *)server, FALSE)) { + (void *)server->id, (void *)server, 0, NULL)) { silc_free(server); return NULL; } @@ -144,7 +153,8 @@ silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id, if (ret_entry) *ret_entry = id_cache; - if (server && registered && !server->data.registered) + if (server && registered && + !(server->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; SILC_LOG_DEBUG(("Found")); @@ -171,7 +181,8 @@ silc_idlist_find_server_by_name(SilcIDList id_list, char *name, if (ret_entry) *ret_entry = id_cache; - if (server && registered && !server->data.registered) + if (server && registered && + !(server->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; SILC_LOG_DEBUG(("Found")); @@ -222,7 +233,8 @@ silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname, if (ret_entry) *ret_entry = id_cache; - if (server && registered && !server->data.registered) + if (server && registered && + !(server->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; SILC_LOG_DEBUG(("Found")); @@ -258,7 +270,7 @@ silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id, server->id = new_id; silc_idcache_add(id_list->servers, server->server_name, server->id, - server, FALSE); + server, 0, NULL); SILC_LOG_DEBUG(("Found")); @@ -278,10 +290,8 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) return FALSE; /* Free data */ - if (entry->server_name) - silc_free(entry->server_name); - if (entry->id) - silc_free(entry->id); + silc_free(entry->server_name); + silc_free(entry->id); memset(entry, 'F', sizeof(*entry)); silc_free(entry); @@ -309,7 +319,8 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) SilcClientEntry silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, char *userinfo, SilcClientID *id, - SilcServerEntry router, void *connection) + SilcServerEntry router, void *connection, + int expire) { SilcClientEntry client; @@ -326,7 +337,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, NULL, NULL, NULL, NULL, TRUE); if (!silc_idcache_add(id_list->clients, nickname, (void *)client->id, - (void *)client, FALSE)) { + (void *)client, expire, NULL)) { silc_hash_table_free(client->channels); silc_free(client); return NULL; @@ -349,14 +360,11 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry) return FALSE; /* Free data */ - if (entry->nickname) - silc_free(entry->nickname); - if (entry->username) - silc_free(entry->username); - if (entry->userinfo) - silc_free(entry->userinfo); - if (entry->id) - silc_free(entry->id); + silc_free(entry->nickname); + silc_free(entry->username); + silc_free(entry->userinfo); + silc_free(entry->id); + silc_hash_table_free(entry->channels); memset(entry, 'F', sizeof(*entry)); silc_free(entry); @@ -373,11 +381,10 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry) int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname, char *server, SilcClientEntry **clients, - uint32 *clients_count) + SilcUInt32 *clients_count) { SilcIDCacheList list = NULL; SilcIDCacheEntry id_cache = NULL; - int i; SILC_LOG_DEBUG(("Start")); @@ -388,18 +395,15 @@ int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname, (silc_idcache_list_count(list) + *clients_count) * sizeof(**clients)); - i = 0; silc_idcache_list_first(list, &id_cache); - (*clients)[i++] = (SilcClientEntry)id_cache->context; + (*clients)[(*clients_count)++] = (SilcClientEntry)id_cache->context; while (silc_idcache_list_next(list, &id_cache)) - (*clients)[i++] = (SilcClientEntry)id_cache->context; + (*clients)[(*clients_count)++] = (SilcClientEntry)id_cache->context; silc_idcache_list_free(list); - *clients_count += i; - - SILC_LOG_DEBUG(("Found %d clients", *clients_count)); + SILC_LOG_DEBUG(("Found total %d clients", *clients_count)); return TRUE; } @@ -410,12 +414,11 @@ int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname, int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, SilcHash md5hash, SilcClientEntry **clients, - uint32 *clients_count) + SilcUInt32 *clients_count) { SilcIDCacheList list = NULL; SilcIDCacheEntry id_cache = NULL; unsigned char hash[32]; - int i; SilcClientID client_id; SILC_LOG_DEBUG(("Start")); @@ -435,18 +438,15 @@ int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, (silc_idcache_list_count(list) + *clients_count) * sizeof(**clients)); - i = 0; silc_idcache_list_first(list, &id_cache); - (*clients)[i++] = (SilcClientEntry)id_cache->context; + (*clients)[(*clients_count)++] = (SilcClientEntry)id_cache->context; while (silc_idcache_list_next(list, &id_cache)) - (*clients)[i++] = (SilcClientEntry)id_cache->context; + (*clients)[(*clients_count)++] = (SilcClientEntry)id_cache->context; silc_idcache_list_free(list); - *clients_count += i; - - SILC_LOG_DEBUG(("Found %d clients", *clients_count)); + SILC_LOG_DEBUG(("Found total %d clients", *clients_count)); return TRUE; } @@ -481,7 +481,8 @@ silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id, if (ret_entry) *ret_entry = id_cache; - if (client && registered && !client->data.registered) + if (client && registered && + !(client->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; SILC_LOG_DEBUG(("Found")); @@ -522,8 +523,7 @@ silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id, silc_free(client->id); client->id = new_id; - silc_idcache_add(id_list->clients, client->nickname, client->id, - client, FALSE); + silc_idcache_add(id_list->clients, NULL, client->id, client, 0, NULL); SILC_LOG_DEBUG(("Replaced")); @@ -537,18 +537,13 @@ void silc_idlist_client_destructor(SilcIDCache cache, { SilcClientEntry client; - SILC_LOG_DEBUG(("Start")); - client = (SilcClientEntry)entry->context; if (client) { - if (client->nickname) - silc_free(client->nickname); - if (client->username) - silc_free(client->username); - if (client->userinfo) - silc_free(client->userinfo); - if (client->id) - silc_free(client->id); + silc_free(client->nickname); + silc_free(client->username); + silc_free(client->userinfo); + silc_free(client->id); + silc_hash_table_free(client->channels); memset(client, 'F', sizeof(*client)); silc_free(client); @@ -567,7 +562,8 @@ void silc_idlist_client_destructor(SilcIDCache cache, SilcChannelEntry silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, SilcChannelID *id, SilcServerEntry router, - SilcCipher channel_key, SilcHmac hmac) + SilcCipher channel_key, SilcHmac hmac, + int expire) { SilcChannelEntry channel; @@ -580,8 +576,9 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, channel->router = router; channel->channel_key = channel_key; channel->hmac = hmac; + channel->created = time(0); if (!channel->hmac) - if (!silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac)) { + if (!silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac)) { silc_free(channel); return NULL; } @@ -590,7 +587,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->channel_name, - (void *)channel->id, (void *)channel, FALSE)) { + (void *)channel->id, (void *)channel, expire, NULL)) { silc_hmac_free(channel->hmac); silc_hash_table_free(channel->user_list); silc_free(channel); @@ -608,6 +605,9 @@ static void silc_idlist_del_channel_foreach(void *key, void *context, { SilcChannelClientEntry chl = (SilcChannelClientEntry)context; + SILC_LOG_DEBUG(("Removing client %s from channel %s", + chl->client->nickname, chl->channel->channel_name)); + /* Remove the context from the client's channel hash table as that table and channel's user_list hash table share this same context. */ silc_hash_table_del(chl->client->channels, chl->channel); @@ -626,32 +626,28 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry) if (!silc_idcache_del_by_id(id_list->channels, (void *)entry->id)) return FALSE; + /* Free all client entrys from the users list. The silc_hash_table_free + will free all the entries so they are not freed at the foreach + callback. */ + silc_hash_table_foreach(entry->user_list, silc_idlist_del_channel_foreach, + NULL); + silc_hash_table_free(entry->user_list); + /* Free data */ - if (entry->channel_name) - silc_free(entry->channel_name); - if (entry->id) - silc_free(entry->id); - if (entry->topic) - silc_free(entry->topic); + silc_free(entry->channel_name); + silc_free(entry->id); + silc_free(entry->topic); if (entry->channel_key) silc_cipher_free(entry->channel_key); if (entry->key) { memset(entry->key, 0, entry->key_len / 8); silc_free(entry->key); } - if (entry->cipher) - silc_free(entry->cipher); - if (entry->hmac_name) - silc_free(entry->hmac_name); - if (entry->rekey) - silc_free(entry->rekey); - - /* Free all client entrys from the users list. The silc_hash_table_free - will free all the entries so they are not freed at the foreach - callback. */ - silc_hash_table_foreach(entry->user_list, silc_idlist_del_channel_foreach, - NULL); - silc_hash_table_free(entry->user_list); + silc_free(entry->cipher); + if (entry->hmac) + silc_hmac_free(entry->hmac); + silc_free(entry->hmac_name); + silc_free(entry->rekey); memset(entry, 'F', sizeof(*entry)); silc_free(entry); @@ -670,7 +666,7 @@ silc_idlist_find_channel_by_name(SilcIDList id_list, char *name, { SilcIDCacheEntry id_cache = NULL; - SILC_LOG_DEBUG(("Channel by name")); + SILC_LOG_DEBUG(("Channel by name %s", name)); if (!silc_idcache_find_by_name_one(id_list->channels, name, &id_cache)) return NULL; @@ -740,7 +736,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id, channel->id = new_id; silc_idcache_add(id_list->channels, channel->channel_name, channel->id, - channel, FALSE); + channel, 0, NULL); SILC_LOG_DEBUG(("Replaced")); @@ -752,7 +748,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id, SilcChannelEntry * silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id, - uint32 *channels_count) + SilcUInt32 *channels_count) { SilcIDCacheList list = NULL; SilcIDCacheEntry id_cache = NULL;