{
SilcClientConnection conn = (SilcClientConnection)sock->user_data;
SilcPrivateMessagePayload payload = NULL;
- SilcIDCacheEntry id_cache;
+ SilcIDCacheEntry id_cache = NULL;
SilcClientID *remote_id = NULL;
SilcClientEntry remote_client;
SilcMessageFlags flags;
goto out;
/* Check whether we know this client already */
- if (!silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)remote_id,
- NULL, NULL,
- silc_hash_client_id_compare, NULL,
- &id_cache)) {
+ remote_client = silc_client_get_client_by_id(client, conn, remote_id);
+ if (!remote_client ||
+ ((SilcClientEntry)id_cache->context)->nickname == NULL) {
+
+ if (remote_client) {
+ remote_client = (SilcClientEntry)id_cache->context;
+ if (remote_client->status & SILC_CLIENT_STATUS_RESOLVING) {
+ remote_client->status &= ~SILC_CLIENT_STATUS_RESOLVING;
+ goto out;
+ }
+ remote_client->status |= SILC_CLIENT_STATUS_RESOLVING;
+ }
+
/* Resolve the client info */
silc_client_get_client_by_id_resolve(client, conn, remote_id,
silc_client_private_message_cb,
return;
}
- remote_client = (SilcClientEntry)id_cache->context;
-
/* Parse the payload and decrypt it also if private message key is set */
- payload = silc_private_message_payload_parse(packet->buffer,
+ payload = silc_private_message_payload_parse(packet->buffer->data,
+ packet->buffer->len,
remote_client->receive_key);
if (!payload) {
silc_free(remote_id);
flags = silc_private_message_get_flags(payload);
/* Pass the private message to application */
- client->ops->private_message(client, conn, remote_client, flags,
- silc_private_message_get_message(payload,
- NULL));
+ client->internal->ops->private_message(
+ client, conn, remote_client, flags,
+ silc_private_message_get_message(payload,
+ NULL));
/* See if we are away (gone). If we are away we will reply to the
sender with the set away message. */
out:
if (payload)
silc_private_message_payload_free(payload);
- if (remote_id)
- silc_free(remote_id);
+ silc_free(remote_id);
}
/* Function that actually employes the received private message key */
goto out;
/* Print some info for application */
- client->ops->say(client, conn, SILC_CLIENT_MESSAGE_AUDIT,
- "Received private message key from %s%s%s %s%s%s",
- clients[0]->nickname,
- clients[0]->server ? "@" : "",
- clients[0]->server ? clients[0]->server : "",
- clients[0]->username ? "(" : "",
- clients[0]->username ? clients[0]->username : "",
- clients[0]->username ? ")" : "");
+ client->internal->ops->say(
+ client, conn, SILC_CLIENT_MESSAGE_AUDIT,
+ "Received private message key from %s%s%s %s%s%s",
+ clients[0]->nickname,
+ clients[0]->server ? "@" : "",
+ clients[0]->server ? clients[0]->server : "",
+ clients[0]->username ? "(" : "",
+ clients[0]->username ? clients[0]->username : "",
+ clients[0]->username ? ")" : "");
out:
silc_packet_context_free(packet);
/* Produce the key material as the protocol defines */
keymat = silc_calloc(1, sizeof(*keymat));
if (silc_ske_process_key_material_data(key, key_len, 16, 256, 16,
- client->md5hash, keymat)
+ client->internal->md5hash, keymat)
!= SILC_SKE_STATUS_OK)
return FALSE;