X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fsilc%2Fcore%2Fclient_ops.c;h=5da2cea29017314d1cdee99b6bd993928fe992be;hb=HEAD;hp=e64b6fbac7d8335dd72e280af49841b325d36c3f;hpb=012cd63beb399ed61ca268556f7e6803f24e7849;p=silc.git diff --git a/apps/irssi/src/silc/core/client_ops.c b/apps/irssi/src/silc/core/client_ops.c index e64b6fba..5da2cea2 100644 --- a/apps/irssi/src/silc/core/client_ops.c +++ b/apps/irssi/src/silc/core/client_ops.c @@ -185,13 +185,13 @@ static void silc_parse_channel_public_keys(SILC_SERVER_REC *server, if (silc_pkcs_get_type(pubkey) != SILC_PKCS_SILC) continue; - pk = silc_pkcs_public_key_encode(pubkey, &pk_len); + pk = silc_pkcs_public_key_encode(NULL, pubkey, &pk_len); if (!pk) continue; fingerprint = silc_hash_fingerprint(NULL, pk, pk_len); babbleprint = silc_hash_babbleprint(NULL, pk, pk_len); - silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, pubkey); + silc_pubkey = silc_pkcs_public_key_get_pkcs(SILC_PKCS_SILC, pubkey); printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_CHANNEL_PK_LIST_ENTRY, @@ -236,6 +236,12 @@ void silc_say_error(char *msg, ...) va_end(va); } +void static verify_message_signature_verified(SilcBool success, + void *context) +{ + *(SilcBool *)context = success; +} + /* Try to verify a message using locally stored public key data */ int verify_message_signature(SilcClientEntry sender, @@ -248,6 +254,7 @@ int verify_message_signature(SilcClientEntry sender, SilcUInt32 pk_datalen; struct stat st; int ret = SILC_MSG_SIGNED_VERIFIED, i; + SilcBool verified = FALSE; /* get public key from the signature payload and compare it with the one stored in the client entry */ @@ -292,7 +299,7 @@ int verify_message_signature(SilcClientEntry sender, SilcPublicKey cached_pk=NULL; /* try to load the file */ - if (!silc_pkcs_load_public_key(filename, &cached_pk)) { + if (!silc_pkcs_load_public_key(filename, SILC_PKCS_ANY, &cached_pk)) { printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_PUBKEY_COULD_NOT_LOAD, "client"); if (pk == NULL) @@ -309,9 +316,12 @@ int verify_message_signature(SilcClientEntry sender, } /* the public key is now in pk, our "level of trust" in ret */ - if ((pk) && silc_message_signed_verify(message, pk, - sha1hash) != SILC_AUTH_OK) - ret = SILC_MSG_SIGNED_FAILED; + if (pk) { + silc_message_signed_verify(message, pk, sha1hash, + verify_message_signature_verified, &verified); + if (!verified) + ret = SILC_MSG_SIGNED_FAILED; + } if (pk) silc_pkcs_public_key_free(pk); @@ -729,11 +739,10 @@ void silc_notify(SilcClient client, SilcClientConnection conn, name = va_arg(va, char *); client_entry = va_arg(va, SilcClientEntry); - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s@%s", - client_entry->username, client_entry->hostname); - signal_emit("message invite", 4, server, channel ? channel->channel_name : - name, client_entry->nickname, buf); + silc_snprintf(buf, sizeof(buf) - 1, "%s@%s", + client_entry->username, client_entry->hostname); + signal_emit("message invite", 4, server, name, + client_entry->nickname, buf); break; case SILC_NOTIFY_TYPE_JOIN: @@ -1418,7 +1427,7 @@ void silc_getkey_cb(bool success, void *context) ((SilcServerEntry)getkey->entry)->public_key); SilcSILCPublicKey silc_pubkey; - silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, public_key); + silc_pubkey = silc_pkcs_public_key_get_pkcs(SILC_PKCS_SILC, public_key); if (success) { if (getkey->id_type == SILC_ID_CLIENT) @@ -1737,6 +1746,20 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, NICK_REC *ownnick; if (SILC_STATUS_IS_ERROR(status)) { + if (status == SILC_STATUS_ERR_NO_SUCH_SERVER) { + char *tmp = va_arg(vp, char *); + if (tmp) + silc_say_error("JOIN: %s: %s", tmp, + silc_get_status_message(status)); + return; + } + if (status == SILC_STATUS_ERR_NO_SUCH_CHANNEL) { + char *tmp = va_arg(vp, char *); + if (tmp) + silc_say_error("JOIN: %s: %s", tmp, + silc_get_status_message(status)); + return; + } silc_say_error("JOIN: %s", silc_get_status_message(status)); return; } @@ -2270,24 +2293,35 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, { SilcChannelEntry channel_entry; SilcDList chpks; + SilcPublicKey founder_key; channel_entry = va_arg(vp, SilcChannelEntry); (void)va_arg(vp, SilcUInt32); - (void)va_arg(vp, SilcPublicKey); + founder_key = va_arg(vp, SilcPublicKey); chpks = va_arg(vp, SilcDList); - if (SILC_STATUS_IS_ERROR(status) || !cmode_list_chpks || - !channel_entry || !channel_entry->channel_name) + if (SILC_STATUS_IS_ERROR(status) || !channel_entry || + !channel_entry->channel_name) return; - /* Print the channel public key list */ - if (chpks) - silc_parse_channel_public_keys(server, channel_entry, chpks); - else + /* If founder was changed successfully, tell it to user */ + if (founder_key && channel_entry->founder_key && + !silc_pkcs_public_key_compare(founder_key, + channel_entry->founder_key)) { printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_CHANNEL_PK_NO_LIST, - channel_entry->channel_name); + MSGLEVEL_CRAP, SILCTXT_CHANNEL_FOUNDER_CHANGED, + channel_entry->channel_name); + } + /* Print the channel public key list */ + if (cmode_list_chpks) { + if (chpks) + silc_parse_channel_public_keys(server, channel_entry, chpks); + else + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_CHANNEL_PK_NO_LIST, + channel_entry->channel_name); + } } break; @@ -2420,14 +2454,14 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn, } /* Encode public key */ - pk = silc_pkcs_public_key_encode(public_key, &pk_len); + pk = silc_pkcs_public_key_encode(NULL, public_key, &pk_len); if (!pk) { if (completion) completion(FALSE, context); return; } - silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, public_key); + silc_pubkey = silc_pkcs_public_key_get_pkcs(SILC_PKCS_SILC, public_key); pw = getpwuid(getuid()); if (!pw) { @@ -2531,8 +2565,9 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn, SilcUInt32 encpk_len; /* Load the key file, try for both IP filename and hostname filename */ - if (!silc_pkcs_load_public_key(ipf, &local_pubkey) && - (!hostf || (!silc_pkcs_load_public_key(hostf, &local_pubkey)))) { + if (!silc_pkcs_load_public_key(ipf, SILC_PKCS_ANY, &local_pubkey) && + (!hostf || (!silc_pkcs_load_public_key(hostf, SILC_PKCS_ANY, + &local_pubkey)))) { printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_PUBKEY_RECEIVED,verify->entity_name ? verify->entity_name : entity); @@ -2561,7 +2596,7 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn, } /* Encode the key data */ - encpk = silc_pkcs_public_key_encode(local_pubkey, &encpk_len); + encpk = silc_pkcs_public_key_encode(NULL, local_pubkey, &encpk_len); if (!encpk) { printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_PUBKEY_RECEIVED,verify->entity_name ?