silc_schedule_one(client->schedule, 0);
}
-static void silc_client_entry_destructor(SilcIDCache cache,
- SilcIDCacheEntry entry)
-{
- silc_free(entry->name);
-}
-
/* Allocates and adds new connection to the client. This adds the allocated
connection to the connection table and returns a pointer to it. A client
can have multiple connections to multiple servers. Every connection must
conn->remote_port = port;
conn->context = context;
conn->internal->client_cache =
- silc_idcache_alloc(0, SILC_ID_CLIENT, silc_client_entry_destructor,
- FALSE, FALSE);
+ silc_idcache_alloc(0, SILC_ID_CLIENT, NULL, FALSE, TRUE);
conn->internal->channel_cache = silc_idcache_alloc(0, SILC_ID_CHANNEL, NULL,
- FALSE, FALSE);
+ FALSE, TRUE);
conn->internal->server_cache = silc_idcache_alloc(0, SILC_ID_SERVER, NULL,
- FALSE, FALSE);
+ FALSE, TRUE);
conn->internal->pending_commands = silc_dlist_init();
conn->internal->ftp_sessions = silc_dlist_init();
SilcClientConnection conn = (SilcClientConnection)sock->user_data;
int connecting = FALSE;
SilcClientID *client_id = silc_id_payload_get_id(idp);
+ char *nickname;
if (!conn->local_entry)
connecting = TRUE;
NULL, NULL, NULL,
TRUE);
- /* Put it to the ID cache */
- silc_idcache_add(conn->internal->client_cache,
- strdup(conn->nickname), conn->local_id,
+ /* Normalize nickname */
+ nickname = silc_identifier_check(conn->nickname, strlen(conn->nickname),
+ SILC_STRING_UTF8, 128, NULL);
+ if (!nickname)
+ return;
+
+ /* Put it to the ID cache */
+ silc_idcache_add(conn->internal->client_cache, nickname, conn->local_id,
(void *)conn->local_entry, 0, NULL);
if (connecting) {
{
SilcClientCommandContext cmd = (SilcClientCommandContext)context;
SilcClientConnection conn = cmd->conn;
- SilcIDCacheEntry id_cache = NULL;
SilcChannelEntry channel;
SilcBuffer buffer, idp = NULL;
- char *name;
if (!cmd->conn) {
SILC_NOT_CONNECTED(cmd->client, cmd->conn);
}
if (cmd->argc == 2) {
- name = cmd->argv[1];
-
/* Get the Channel ID of the channel */
- if (silc_idcache_find_by_name_one(conn->internal->channel_cache,
- name, &id_cache)) {
- channel = (SilcChannelEntry)id_cache->context;
- idp = silc_id_payload_encode(id_cache->id, SILC_ID_CHANNEL);
- }
+ channel = silc_client_get_channel(cmd->client, cmd->conn, cmd->argv[1]);
+ if (channel)
+ idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
}
if (!idp)
{
SilcClientCommandContext cmd = (SilcClientCommandContext)context;
SilcClientConnection conn = cmd->conn;
- SilcIDCacheEntry id_cache = NULL;
SilcChannelEntry channel;
SilcBuffer buffer, idp;
char *name;
}
/* Get the Channel ID of the channel */
- if (!silc_idcache_find_by_name_one(conn->internal->channel_cache,
- name, &id_cache)) {
+ channel = silc_client_get_channel(cmd->client, conn, name);
+ if (!channel) {
COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
goto out;
}
- channel = (SilcChannelEntry)id_cache->context;
-
/* Send TOPIC command to the server */
- idp = silc_id_payload_encode(id_cache->id, SILC_ID_CHANNEL);
+ idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
if (cmd->argc > 2)
buffer = silc_command_payload_encode_va(SILC_COMMAND_TOPIC,
++conn->cmd_ident, 2,
SilcClientCommandContext cmd = (SilcClientCommandContext)context;
SilcClient client = cmd->client;
SilcClientConnection conn = cmd->conn;
- SilcIDCacheEntry id_cache = NULL;
SilcChannelEntry channel;
SilcBuffer buffer, idp, idp2;
SilcClientEntry target;
}
/* Get the Channel ID of the channel */
- if (!silc_idcache_find_by_name_one(conn->internal->channel_cache,
- name, &id_cache)) {
+ channel = silc_client_get_channel(cmd->client, conn, name);
+ if (!channel) {
COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
goto out;
}
- channel = (SilcChannelEntry)id_cache->context;
-
/* Parse the typed nickname. */
if (client->internal->params->nickname_parse)
client->internal->params->nickname_parse(cmd->argv[2], &nickname);
}
/* Send KICK command to the server */
- idp = silc_id_payload_encode(id_cache->id, SILC_ID_CHANNEL);
+ idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
idp2 = silc_id_payload_encode(target->id, SILC_ID_CLIENT);
if (cmd->argc == 3)
buffer = silc_command_payload_encode_va(SILC_COMMAND_KICK,
SilcClientEntry entry, *clients;
int i = 0;
bool found = FALSE;
+ char *nicknamec;
assert(client && conn);
if (!nickname)
return NULL;
+ /* Normalize nickname for search */
+ nicknamec = silc_identifier_check(nickname, strlen(nickname),
+ SILC_STRING_UTF8, 128, NULL);
+ if (!nicknamec)
+ return NULL;
+
/* Find ID from cache */
- if (!silc_idcache_find_by_name(conn->internal->client_cache,
- (char *)nickname, &list))
+ if (!silc_idcache_find_by_name(conn->internal->client_cache, nicknamec,
+ &list)) {
+ silc_free(nicknamec);
return NULL;
+ }
if (!silc_idcache_list_count(list)) {
silc_idcache_list_free(list);
+ silc_free(nicknamec);
return NULL;
}
}
}
+ silc_free(nicknamec);
+
if (list)
silc_idcache_list_free(list);
SilcIDCacheEntry id_cache;
SilcIDCacheList list = NULL;
SilcClientEntry entry = NULL;
+ char *nicknamec;
SILC_LOG_DEBUG(("Start"));
+ /* Normalize nickname for search */
+ nicknamec = silc_identifier_check(nickname, strlen(nickname),
+ SILC_STRING_UTF8, 128, NULL);
+ if (!nicknamec)
+ return NULL;
+
/* Find ID from cache */
if (!silc_idcache_find_by_name(conn->internal->client_cache,
- (char *)nickname, &list)) {
+ nicknamec, &list)) {
identify:
if (query) {
if (list)
silc_idcache_list_free(list);
+ silc_free(nicknamec);
return NULL;
}
+
+ silc_free(nicknamec);
return NULL;
}
goto identify;
}
+ silc_free(nicknamec);
+
if (list)
silc_idcache_list_free(list);
client_entry->channels = silc_hash_table_alloc(1, silc_hash_ptr, NULL, NULL,
NULL, NULL, NULL, TRUE);
+ /* Normalize nickname */
+ if (client_entry->nickname) {
+ silc_free(nick);
+ nick = silc_identifier_check(client_entry->nickname,
+ strlen(client_entry->nickname),
+ SILC_STRING_UTF8, 128, NULL);
+ if (!nick) {
+ silc_free(client_entry->nickname);
+ silc_free(client_entry->username);
+ silc_free(client_entry->hostname);
+ silc_free(client_entry->server);
+ silc_hash_table_free(client_entry->channels);
+ silc_free(client_entry);
+ return NULL;
+ }
+ }
+
/* Format the nickname */
silc_client_nickname_format(client, conn, client_entry);
/* Add client to cache, the non-formatted nickname is saved to cache */
if (!silc_idcache_add(conn->internal->client_cache, nick, client_entry->id,
(void *)client_entry, 0, NULL)) {
+ silc_free(nick);
silc_free(client_entry->nickname);
silc_free(client_entry->username);
silc_free(client_entry->hostname);
if (!client_entry->nickname && nickname) {
silc_parse_userfqdn(nickname, &nick, &client_entry->server);
client_entry->nickname = strdup(nick);
+
+ /* Normalize nickname */
+ silc_free(nick);
+ nick = silc_identifier_check(client_entry->nickname,
+ strlen(client_entry->nickname),
+ SILC_STRING_UTF8, 128, NULL);
+ if (!nick)
+ return;
+
+ /* Format nickname */
silc_client_nickname_format(client, conn, client_entry);
}
client_entry->mode = mode;
SilcChannelID *channel_id)
{
SilcChannelEntry channel;
+ char *channel_namec;
SILC_LOG_DEBUG(("Start"));
channel->user_list = silc_hash_table_alloc(1, silc_hash_ptr, NULL, NULL,
NULL, NULL, NULL, TRUE);
+ /* Normalize channel name */
+ channel_namec = silc_identifier_check(channel_name, strlen(channel_name),
+ SILC_STRING_UTF8, 256, NULL);
+ if (!channel_namec) {
+ silc_free(channel->channel_name);
+ silc_hash_table_free(channel->user_list);
+ silc_free(channel);
+ return NULL;
+ }
+
/* Put it to the ID cache */
- if (!silc_idcache_add(conn->internal->channel_cache, channel->channel_name,
+ if (!silc_idcache_add(conn->internal->channel_cache, channel_namec,
(void *)channel->id, (void *)channel, 0, NULL)) {
+ silc_free(channel_namec);
silc_free(channel->channel_name);
silc_hash_table_free(channel->user_list);
silc_free(channel);
SilcChannelEntry channel,
SilcChannelID *new_id)
{
+ char *channel_namec;
+
if (!new_id)
return FALSE;
silc_idcache_del_by_id(conn->internal->channel_cache, channel->id);
silc_free(channel->id);
channel->id = new_id;
- return silc_idcache_add(conn->internal->channel_cache,
- channel->channel_name,
+
+ /* Normalize channel name */
+ channel_namec = silc_identifier_check(channel->channel_name,
+ strlen(channel->channel_name),
+ SILC_STRING_UTF8, 256, NULL);
+ if (!channel_namec)
+ return FALSE;
+
+ return silc_idcache_add(conn->internal->channel_cache, channel_namec,
(void *)channel->id, (void *)channel, 0, NULL);
}
SILC_LOG_DEBUG(("Start"));
+ /* Normalize name for search */
+ channel = silc_identifier_check(channel, strlen(channel), SILC_STRING_UTF8,
+ 256, NULL);
+ if (!channel)
+ return NULL;
+
if (!silc_idcache_find_by_name_one(conn->internal->channel_cache, channel,
- &id_cache))
+ &id_cache)) {
+ silc_free(channel);
return NULL;
+ }
entry = (SilcChannelEntry)id_cache->context;
SILC_LOG_DEBUG(("Found"));
+ silc_free(channel);
+
return entry;
}
SILC_LOG_DEBUG(("Start"));
+ /* Normalize server name for search */
+ server_name = silc_identifier_check(server_name, strlen(server_name),
+ SILC_STRING_UTF8, 256, NULL);
+ if (!server_name)
+ return NULL;
+
if (!silc_idcache_find_by_name_one(conn->internal->server_cache,
- server_name, &id_cache))
+ server_name, &id_cache)) {
+ silc_free(server_name);
return NULL;
+ }
entry = (SilcServerEntry)id_cache->context;
+ silc_free(server_name);
+
return entry;
}
SilcServerID *server_id)
{
SilcServerEntry server_entry;
+ char *server_namec = NULL;
SILC_LOG_DEBUG(("Start"));
if (server_info)
server_entry->server_info = strdup(server_info);
+ /* Normalize server name */
+ if (server_name) {
+ server_namec = silc_identifier_check(server_name, strlen(server_name),
+ SILC_STRING_UTF8, 256, NULL);
+ if (!server_namec) {
+ silc_free(server_entry->server_id);
+ silc_free(server_entry->server_name);
+ silc_free(server_entry->server_info);
+ silc_free(server_entry);
+ return NULL;
+ }
+ }
+
/* Add server to cache */
- if (!silc_idcache_add(conn->internal->server_cache,
- server_entry->server_name,
+ if (!silc_idcache_add(conn->internal->server_cache, server_namec,
server_entry->server_id, server_entry, 0, NULL)) {
+ silc_free(server_namec);
silc_free(server_entry->server_id);
silc_free(server_entry->server_name);
silc_free(server_entry->server_info);
const char *server_name,
const char *server_info)
{
+ char *server_namec = NULL;
+
SILC_LOG_DEBUG(("Start"));
if (server_name &&
silc_idcache_del_by_context(conn->internal->server_cache, server_entry);
silc_free(server_entry->server_name);
server_entry->server_name = strdup(server_name);
- silc_idcache_add(conn->internal->server_cache, server_entry->server_name,
- server_entry->server_id,
- server_entry, 0, NULL);
+
+ /* Normalize server name */
+ if (server_name) {
+ server_namec = silc_identifier_check(server_name, strlen(server_name),
+ SILC_STRING_UTF8, 256, NULL);
+ if (!server_namec)
+ return;
+
+ silc_idcache_add(conn->internal->server_cache, server_namec,
+ server_entry->server_id,
+ server_entry, 0, NULL);
+ }
}
if (server_info &&