# HG changeset patch # User Stu Tomlinson # Date 1113530302 0 # Node ID cb625efd1071626446314d7eadada8a88f21579f # Parent 8d52201620d0d2b4cba46c6181dca8345215058e [gaim-migrate @ 12490] Multiple account support for SILC in HEAD too committer: Tailor Script diff -r 8d52201620d0 -r cb625efd1071 src/protocols/silc/silc.c --- a/src/protocols/silc/silc.c Fri Apr 15 00:28:54 2005 +0000 +++ b/src/protocols/silc/silc.c Fri Apr 15 01:58:22 2005 +0000 @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2004 Pekka Riikonen + Copyright (C) 2004 - 2005 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 @@ -260,6 +260,7 @@ SilcClient client; SilcClientParams params; GaimConnection *gc; + char pkd[256], prd[256]; gc = account->gc; if (!gc) @@ -281,7 +282,10 @@ /* Get username, real name and local hostname for SILC library */ if (gaim_account_get_username(account)) { - client->username = strdup(gaim_account_get_username(account)); + const char *u = gaim_account_get_username(account); + char **up = g_strsplit(u, "@", 2); + client->username = strdup(up[0]); + g_strfreev(up); } else { client->username = silc_get_username(); gaim_account_set_username(account, client->username); @@ -312,8 +316,10 @@ gaim_connection_update_progress(gc, _("Connecting to SILC Server"), 1, 5); /* Load SILC key pair */ - if (!silc_load_key_pair(gaim_prefs_get_string("/plugins/prpl/silc/pubkey"), - gaim_prefs_get_string("/plugins/prpl/silc/privkey"), + g_snprintf(pkd, sizeof(prd), "%s" G_DIR_SEPARATOR_S "public_key.pub", silcgaim_silcdir()); + g_snprintf(prd, sizeof(prd), "%s" G_DIR_SEPARATOR_S "private_key.pub", silcgaim_silcdir()); + if (!silc_load_key_pair((char *)gaim_account_get_string(account, "public-key", prd), + (char *)gaim_account_get_string(account, "private-key", prd), (gc->password == NULL) ? "" : gc->password, &client->pkcs, &client->public_key, &client->private_key)) { gaim_connection_error(gc, ("Could not load SILC key pair")); @@ -771,7 +777,11 @@ static void silcgaim_change_passwd(GaimConnection *gc, const char *old, const char *new) { - silc_change_private_key_passphrase(gaim_prefs_get_string("/plugins/prpl/silc/privkey"), old, new); + char prd[256]; + g_snprintf(prd, sizeof(prd), "%s" G_DIR_SEPARATOR_S "private_key.pub", silcgaim_silcdir()); + silc_change_private_key_passphrase(gaim_account_get_string(gc->account, + "private-key", + prd), old, new); } static void @@ -1473,19 +1483,6 @@ _("Verify all channel message signatures")); gaim_plugin_pref_frame_add(frame, ppref); - ppref = gaim_plugin_pref_new_with_label(_("Default SILC Key Pair")); - gaim_plugin_pref_frame_add(frame, ppref); - - ppref = gaim_plugin_pref_new_with_name_and_label( - "/plugins/prpl/silc/pubkey", - _("SILC Public Key")); - gaim_plugin_pref_frame_add(frame, ppref); - - ppref = gaim_plugin_pref_new_with_name_and_label( - "/plugins/prpl/silc/privkey", - _("SILC Private Key")); - gaim_plugin_pref_frame_add(frame, ppref); - return frame; } @@ -1592,10 +1589,14 @@ init_plugin(GaimPlugin *plugin) { GaimAccountOption *option; + GaimAccountUserSplit *split; char tmp[256]; silc_plugin = plugin; + split = gaim_account_user_split_new(_("Network"), "silcnet.org", '@'); + prpl_info.user_splits = g_list_append(prpl_info.user_splits, split); + /* Account options */ option = gaim_account_option_string_new(_("Connect server"), "server", @@ -1603,21 +1604,17 @@ prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); option = gaim_account_option_int_new(_("Port"), "port", 706); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - + g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S "public_key.pub", silcgaim_silcdir()); + option = gaim_account_option_string_new(_("Public Key file"), + "public-key", tmp); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S "private_key.prv", silcgaim_silcdir()); + option = gaim_account_option_string_new(_("Private Key file"), + "private-key", tmp); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); option = gaim_account_option_bool_new(_("Public key authentication"), "pubkey-auth", FALSE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); -#if 0 /* XXX Public key auth interface with explicit key pair is - broken in SILC Toolkit */ - g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S "public_key.pub", silcgaim_silcdir()); - option = gaim_account_option_string_new(_("Public Key File"), - "public-key", tmp); - prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S "private_key.prv", silcgaim_silcdir()); - option = gaim_account_option_string_new(_("Private Key File"), - "public-key", tmp); - prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); -#endif option = gaim_account_option_bool_new(_("Reject watching by other users"), "reject-watch", FALSE); @@ -1638,10 +1635,6 @@ gaim_prefs_add_bool("/plugins/prpl/silc/verify_im", FALSE); gaim_prefs_add_bool("/plugins/prpl/silc/sign_chat", FALSE); gaim_prefs_add_bool("/plugins/prpl/silc/verify_chat", FALSE); - g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S "public_key.pub", silcgaim_silcdir()); - gaim_prefs_add_string("/plugins/prpl/silc/pubkey", tmp); - g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S "private_key.prv", silcgaim_silcdir()); - gaim_prefs_add_string("/plugins/prpl/silc/privkey", tmp); gaim_prefs_add_string("/plugins/prpl/silc/vcard", ""); silcgaim_register_commands(); diff -r 8d52201620d0 -r cb625efd1071 src/protocols/silc/util.c --- a/src/protocols/silc/util.c Fri Apr 15 00:28:54 2005 +0000 +++ b/src/protocols/silc/util.c Fri Apr 15 01:58:22 2005 +0000 @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2004 Pekka Riikonen + Copyright (C) 2004 - 2005 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 @@ -71,6 +71,7 @@ { char filename[256], file_public_key[256], file_private_key[256]; char servfilename[256], clientfilename[256], friendsfilename[256]; + char pkd[256], prd[256]; struct stat st; struct passwd *pw; @@ -191,10 +192,12 @@ /* * Check Public and Private keys */ + g_snprintf(pkd, sizeof(pkd), "%s" G_DIR_SEPARATOR_S "public_key.pub", silcgaim_silcdir()); + g_snprintf(prd, sizeof(prd), "%s" G_DIR_SEPARATOR_S "private_key.prv", silcgaim_silcdir()); g_snprintf(file_public_key, sizeof(file_public_key) - 1, "%s", - gaim_prefs_get_string("/plugins/prpl/silc/pubkey")); + gaim_account_get_string(gc->account, "public-key", pkd)); g_snprintf(file_private_key, sizeof(file_public_key) - 1, "%s", - gaim_prefs_get_string("/plugins/prpl/silc/privkey")); + gaim_account_get_string(gc->account, "private-key", prd)); if ((g_stat(file_public_key, &st)) == -1) { /* If file doesn't exist */ @@ -304,8 +307,8 @@ s = g_string_new(""); if (ident->realname) - /* Hint for translators: Please check the tabulator width here and in - the next strings (short strings: 2 tabs, longer strings 1 tab, + /* Hint for translators: Please check the tabulator width here and in + the next strings (short strings: 2 tabs, longer strings 1 tab, sum: 3 tabs or 24 characters) */ g_string_append_printf(s, _("Real Name: \t%s\n"), ident->realname); if (ident->username)