Mercurial > pidgin
diff libpurple/protocols/silc/pk.c @ 17568:980a104267da
Patch from Pekka Riikonen to update the SILC protocol plugin to work with
SILC Toolkit 1.1
I added the fallback to SILC Toolkit 1.0 support (silc10 protocol
directory) and configure.ac adjustments, any problems with this are 100%
my fault.
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Sat, 09 Jun 2007 17:31:28 +0000 |
parents | a5176db228b7 |
children | 285bb637a2b7 6b02dba5bf41 |
line wrap: on
line diff
--- a/libpurple/protocols/silc/pk.c Sat Jun 09 16:39:00 2007 +0000 +++ b/libpurple/protocols/silc/pk.c Sat Jun 09 17:31:28 2007 +0000 @@ -4,7 +4,7 @@ Author: Pekka Riikonen <priikone@silcnet.org> - Copyright (C) 2004 Pekka Riikonen + Copyright (C) 2004 - 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 @@ -17,7 +17,7 @@ */ -#include "silcincludes.h" +#include "silc.h" #include "silcclient.h" #include "silcpurple.h" @@ -31,18 +31,16 @@ char *entity_name; char *fingerprint; char *babbleprint; - unsigned char *pk; - SilcUInt32 pk_len; - SilcSKEPKType pk_type; + SilcPublicKey public_key; SilcVerifyPublicKey completion; void *context; gboolean changed; } *PublicKeyVerify; static void silcpurple_verify_ask(const char *entity, - const char *fingerprint, - const char *babbleprint, - PublicKeyVerify verify); + const char *fingerprint, + const char *babbleprint, + PublicKeyVerify verify); static void silcpurple_verify_cb(PublicKeyVerify verify, gint id) { @@ -54,8 +52,8 @@ verify->completion(TRUE, verify->context); /* Save the key for future checking */ - silc_pkcs_save_public_key_data(verify->filename, verify->pk, - verify->pk_len, SILC_PKCS_FILE_PEM); + silc_pkcs_save_public_key(verify->filename, verify->public_key, + SILC_PKCS_FILE_BASE64); } silc_free(verify->filename); @@ -63,7 +61,7 @@ silc_free(verify->entity_name); silc_free(verify->fingerprint); silc_free(verify->babbleprint); - silc_free(verify->pk); + silc_pkcs_public_key_free(verify->public_key); silc_free(verify); } @@ -74,27 +72,23 @@ should have option for the dialogs whether the buttons close them or not. */ silcpurple_verify_ask(verify->entity, verify->fingerprint, - verify->babbleprint, verify); + verify->babbleprint, verify); } static void silcpurple_verify_details(PublicKeyVerify verify, gint id) { - SilcPublicKey public_key; PurpleConnection *gc = verify->client->application; SilcPurple sg = gc->proto_data; - silc_pkcs_public_key_decode(verify->pk, verify->pk_len, - &public_key); - silcpurple_show_public_key(sg, verify->entity_name, public_key, - G_CALLBACK(silcpurple_verify_details_cb), - verify); - silc_pkcs_public_key_free(public_key); + silcpurple_show_public_key(sg, verify->entity_name, verify->public_key, + G_CALLBACK(silcpurple_verify_details_cb), + verify); } static void silcpurple_verify_ask(const char *entity, - const char *fingerprint, - const char *babbleprint, - PublicKeyVerify verify) + const char *fingerprint, + const char *babbleprint, + PublicKeyVerify verify) { PurpleConnection *gc = verify->client->application; char tmp[256], tmp2[256]; @@ -114,18 +108,17 @@ "%s\n%s\n"), entity, fingerprint, babbleprint); purple_request_action(gc, _("Verify Public Key"), tmp, tmp2, - PURPLE_DEFAULT_ACTION_NONE, - purple_connection_get_account(gc), entity, NULL, verify, 3, - _("Yes"), G_CALLBACK(silcpurple_verify_cb), - _("No"), G_CALLBACK(silcpurple_verify_cb), - _("_View..."), G_CALLBACK(silcpurple_verify_details)); + PURPLE_DEFAULT_ACTION_NONE, + purple_connection_get_account(gc), entity, NULL, verify, 3, + _("Yes"), G_CALLBACK(silcpurple_verify_cb), + _("No"), G_CALLBACK(silcpurple_verify_cb), + _("_View..."), G_CALLBACK(silcpurple_verify_details)); } void silcpurple_verify_public_key(SilcClient client, SilcClientConnection conn, - const char *name, SilcSocketType conn_type, - unsigned char *pk, SilcUInt32 pk_len, - SilcSKEPKType pk_type, - SilcVerifyPublicKey completion, void *context) + const char *name, SilcConnectionType conn_type, + SilcPublicKey public_key, + SilcVerifyPublicKey completion, void *context) { PurpleConnection *gc = client->application; int i; @@ -133,14 +126,18 @@ char *fingerprint, *babbleprint; struct passwd *pw; struct stat st; - char *entity = ((conn_type == SILC_SOCKET_TYPE_SERVER || - conn_type == SILC_SOCKET_TYPE_ROUTER) ? + char *entity = ((conn_type == SILC_CONN_SERVER || + conn_type == SILC_CONN_ROUTER) ? "server" : "client"); PublicKeyVerify verify; + const char *ip, *hostname; + SilcUInt16 port; + unsigned char *pk; + SilcUInt32 pk_len; - if (pk_type != SILC_SKE_PK_TYPE_SILC) { + if (silc_pkcs_get_type(public_key) != SILC_PKCS_SILC) { purple_notify_error(gc, _("Verify Public Key"), - _("Unsupported public key type"), NULL); + _("Unsupported public key type"), NULL); if (completion) completion(FALSE, context); return; @@ -157,17 +154,22 @@ memset(filename2, 0, sizeof(filename2)); memset(file, 0, sizeof(file)); - if (conn_type == SILC_SOCKET_TYPE_SERVER || - conn_type == SILC_SOCKET_TYPE_ROUTER) { + silc_socket_stream_get_info(silc_packet_stream_get_stream(conn->stream), + NULL, &hostname, &ip, &port); + + pk = silc_pkcs_public_key_encode(public_key, &pk_len); + + if (conn_type == SILC_CONN_SERVER || + conn_type == SILC_CONN_ROUTER) { if (!name) { g_snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity, - conn->sock->ip, conn->sock->port); + ip, port); g_snprintf(filename, sizeof(filename) - 1, "%s" G_DIR_SEPARATOR_S "%skeys" G_DIR_SEPARATOR_S "%s", silcpurple_silcdir(), entity, file); g_snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity, - conn->sock->hostname, conn->sock->port); + hostname, port); g_snprintf(filename2, sizeof(filename2) - 1, "%s" G_DIR_SEPARATOR_S "%skeys" G_DIR_SEPARATOR_S "%s", silcpurple_silcdir(), entity, file); @@ -176,7 +178,7 @@ hostf = filename2; } else { g_snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity, - name, conn->sock->port); + name, port); g_snprintf(filename, sizeof(filename) - 1, "%s" G_DIR_SEPARATOR_S "%skeys" G_DIR_SEPARATOR_S "%s", silcpurple_silcdir(), entity, file); @@ -206,12 +208,10 @@ verify->conn = conn; verify->filename = strdup(ipf); verify->entity = strdup(entity); - verify->entity_name = (conn_type != SILC_SOCKET_TYPE_CLIENT ? - (name ? strdup(name) : strdup(conn->sock->hostname)) + verify->entity_name = (conn_type != SILC_CONN_CLIENT ? + (name ? strdup(name) : strdup(hostname)) : NULL); - verify->pk = silc_memdup(pk, pk_len); - verify->pk_len = pk_len; - verify->pk_type = pk_type; + verify->public_key = silc_pkcs_public_key_copy(public_key); verify->completion = completion; verify->context = context; fingerprint = verify->fingerprint = silc_hash_fingerprint(NULL, pk, pk_len); @@ -221,7 +221,7 @@ if (g_stat(ipf, &st) < 0 && (!hostf || g_stat(hostf, &st) < 0)) { /* Key does not exist, ask user to verify the key and save it */ silcpurple_verify_ask(name ? name : entity, - fingerprint, babbleprint, verify); + fingerprint, babbleprint, verify); return; } else { /* The key already exists, verify it. */ @@ -230,14 +230,8 @@ SilcUInt32 encpk_len; /* Load the key file, try for both IP filename and hostname filename */ - if (!silc_pkcs_load_public_key(ipf, &public_key, - SILC_PKCS_FILE_PEM) && - !silc_pkcs_load_public_key(ipf, &public_key, - SILC_PKCS_FILE_BIN) && - (!hostf || (!silc_pkcs_load_public_key(hostf, &public_key, - SILC_PKCS_FILE_PEM) && - !silc_pkcs_load_public_key(hostf, &public_key, - SILC_PKCS_FILE_BIN)))) { + if (!silc_pkcs_load_public_key(ipf, &public_key) && + (!hostf || (!silc_pkcs_load_public_key(hostf, &public_key)))) { silcpurple_verify_ask(name ? name : entity, fingerprint, babbleprint, verify); return; @@ -266,9 +260,9 @@ silc_free(verify->filename); silc_free(verify->entity); silc_free(verify->entity_name); - silc_free(verify->pk); silc_free(verify->fingerprint); silc_free(verify->babbleprint); + silc_pkcs_public_key_free(verify->public_key); silc_free(verify); } }