libpurple/plugins/keyrings/internalkeyring.c

Tue, 06 Aug 2013 16:05:47 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Tue, 06 Aug 2013 16:05:47 +0200
changeset 34281
ad957d0a467a
parent 34252
4ca80adc2a4d
child 34304
faf0414a8b51
child 34874
e03d555394c5
permissions
-rw-r--r--

Keyring (and some GTK): fix translation callbacks

33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1 /**
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
2 * @file internalkeyring.c internal keyring
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
3 * @ingroup plugins
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
4 */
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
5
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
6 /* purple
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
7 *
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
8 * Purple is the legal property of its developers, whose names are too numerous
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
9 * to list here. Please refer to the COPYRIGHT file distributed with this
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
10 * source distribution.
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
11 *
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
12 * This program is free software; you can redistribute it and/or modify
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
13 * it under the terms of the GNU General Public License as published by
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
15 * (at your option) any later version.
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
16 *
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
17 * This program is distributed in the hope that it will be useful,
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
20 * GNU General Public License for more details.
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
21 *
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
23 * along with this program ; if not, write to the Free Software
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
25 */
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
26
34076
64e389ae5cc3 Clean up headers and stuff.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34052
diff changeset
27 #include "internal.h"
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
28 #include "account.h"
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
29 #include "cipher.h"
34076
64e389ae5cc3 Clean up headers and stuff.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34052
diff changeset
30 #include "debug.h"
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
31 #include "keyring.h"
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
32 #include "plugin.h"
34076
64e389ae5cc3 Clean up headers and stuff.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34052
diff changeset
33 #include "version.h"
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
34
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
35 #define INTKEYRING_NAME N_("Internal keyring")
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
36 #define INTKEYRING_DESCRIPTION N_("This plugin provides the default password " \
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
37 "storage behaviour for libpurple.")
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
38 #define INTKEYRING_AUTHOR "Tomek Wasilczyk (tomkiewicz@cpw.pidgin.im)"
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
39 #define INTKEYRING_ID PURPLE_DEFAULT_KEYRING
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
40
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
41 #define INTKEYRING_VERIFY_STR "[verification-string]"
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
42 #define INTKEYRING_PBKDF2_ITERATIONS 10000
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
43 #define INTKEYRING_PBKDF2_ITERATIONS_MIN 1000
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
44 #define INTKEYRING_PBKDF2_ITERATIONS_MAX 1000000000
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
45 #define INTKEYRING_KEY_LEN (256/8)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
46 #define INTKEYRING_ENCRYPT_BUFF_LEN 1000
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
47 #define INTKEYRING_ENCRYPTED_MIN_LEN 50
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
48 #define INTKEYRING_ENCRYPTION_METHOD "pbkdf2-sha256-aes256"
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
49
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
50 #define INTKEYRING_PREFS "/plugins/keyrings/internal/"
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
51
34200
5c47b9fa4a5b Fix win32 build
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34199
diff changeset
52 /* win32 build defines such macro to override read() routine */
5c47b9fa4a5b Fix win32 build
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34199
diff changeset
53 #undef read
5c47b9fa4a5b Fix win32 build
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34199
diff changeset
54
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
55 typedef struct
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
56 {
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
57 enum
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
58 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
59 INTKEYRING_REQUEST_READ,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
60 INTKEYRING_REQUEST_SAVE
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
61 } type;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
62 PurpleAccount *account;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
63 gchar *password;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
64 union
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
65 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
66 PurpleKeyringReadCallback read;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
67 PurpleKeyringSaveCallback save;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
68 } cb;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
69 gpointer cb_data;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
70 } intkeyring_request;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
71
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
72 typedef struct
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
73 {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
74 guchar *data;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
75 size_t len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
76 } intkeyring_buff_t;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
77
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
78 static intkeyring_buff_t *intkeyring_key;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
79 static GHashTable *intkeyring_passwords = NULL;
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
80 static GHashTable *intkeyring_ciphertexts = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
81
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
82 static gboolean intkeyring_opened = FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
83 static gboolean intkeyring_unlocked = FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
84
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
85 static GList *intkeyring_pending_requests = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
86 static void *intkeyring_masterpw_uirequest = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
87
34034
f508fa47f2ac Reformat many things.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34033
diff changeset
88 static PurpleKeyring *keyring_handler = NULL;
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
89
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
90 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
91 intkeyring_read(PurpleAccount *account, PurpleKeyringReadCallback cb,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
92 gpointer data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
93 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
94 intkeyring_save(PurpleAccount *account, const gchar *password,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
95 PurpleKeyringSaveCallback cb, gpointer data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
96 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
97 intkeyring_reencrypt_passwords(void);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
98 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
99 intkeyring_unlock(const gchar *message);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
100
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
101 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
102 intkeyring_request_free(intkeyring_request *req)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
103 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
104 g_return_if_fail(req != NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
105
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
106 purple_str_wipe(req->password);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
107 g_free(req);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
108 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
109
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
110 static intkeyring_buff_t *
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
111 intkeyring_buff_new(guchar *data, size_t len)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
112 {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
113 intkeyring_buff_t *ret = g_new(intkeyring_buff_t, 1);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
114
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
115 ret->data = data;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
116 ret->len = len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
117
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
118 return ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
119 }
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
120
34032
2eeafc43c7f2 Rearrange code so we can drop the prototypes. Most of it was already
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34031
diff changeset
121 static void
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
122 intkeyring_buff_free(intkeyring_buff_t *buff)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
123 {
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
124 if (buff == NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
125 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
126
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
127 memset(buff->data, 0, buff->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
128 g_free(buff->data);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
129 g_free(buff);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
130 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
131
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
132 static intkeyring_buff_t *
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
133 intkeyring_buff_from_base64(const gchar *base64)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
134 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
135 guchar *data;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
136 gsize len;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
137
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
138 data = purple_base64_decode(base64, &len);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
139
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
140 return intkeyring_buff_new(data, len);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
141 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
142
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
143 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
144 /* Generic encryption stuff */
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
145 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
146
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
147 static intkeyring_buff_t *
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
148 intkeyring_derive_key(const gchar *passphrase, intkeyring_buff_t *salt)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
149 {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
150 PurpleCipherContext *context;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
151 gboolean succ;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
152 intkeyring_buff_t *ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
153
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
154 g_return_val_if_fail(passphrase != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
155
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
156 context = purple_cipher_context_new_by_name("pbkdf2", NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
157 g_return_val_if_fail(context != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
158
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
159 purple_cipher_context_set_option(context, "hash", "sha256");
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
160 purple_cipher_context_set_option(context, "iter_count",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
161 GUINT_TO_POINTER(purple_prefs_get_int(INTKEYRING_PREFS
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
162 "pbkdf2_iterations")));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
163 purple_cipher_context_set_option(context, "out_len", GUINT_TO_POINTER(
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
164 INTKEYRING_KEY_LEN));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
165 purple_cipher_context_set_salt(context, salt->data, salt->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
166 purple_cipher_context_set_key(context, (const guchar*)passphrase,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
167 strlen(passphrase));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
168
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
169 ret = intkeyring_buff_new(g_new(guchar, INTKEYRING_KEY_LEN),
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
170 INTKEYRING_KEY_LEN);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
171 succ = purple_cipher_context_digest(context, ret->data, ret->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
172
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
173 purple_cipher_context_destroy(context);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
174
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
175 if (!succ) {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
176 intkeyring_buff_free(ret);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
177 return NULL;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
178 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
179
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
180 return ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
181 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
182
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
183 static intkeyring_buff_t *
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
184 intkeyring_gen_salt(size_t len)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
185 {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
186 intkeyring_buff_t *ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
187 size_t filled = 0;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
188
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
189 g_return_val_if_fail(len > 0, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
190
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
191 ret = intkeyring_buff_new(g_new(guchar, len), len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
192
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
193 while (filled < len) {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
194 guint32 r = g_random_int();
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
195 int i;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
196
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
197 for (i = 0; i < 4; i++) {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
198 ret->data[filled++] = r & 0xFF;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
199 if (filled >= len)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
200 break;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
201 r >>= 8;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
202 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
203 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
204
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
205 return ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
206 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
207
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
208 /**
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
209 * Encrypts a plaintext using the specified key.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
210 *
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
211 * Random IV will be generated and stored with ciphertext.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
212 *
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
213 * Encryption scheme:
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
214 * [ IV ] ++ AES( [ plaintext ] ++ [ min length padding ] ++
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
215 * [ control string ] ++ [ pkcs7 padding ] )
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
216 * where:
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
217 * IV: Random, 128bit IV.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
218 * plaintext: The plaintext.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
219 * min length padding: The padding used to hide the rough length of short
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
220 * plaintexts, may have a length of 0.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
221 * control string: Constant string, verifies corectness of decryption.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
222 * pkcs7 padding: The padding used to determine total length of encrypted
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
223 * content (also provides some verification).
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
224 *
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
225 * @param key The AES key.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
226 * @param str The NUL-terminated plaintext.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
227 * @return The ciphertext with IV, encoded as base64. Must be g_free'd.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
228 */
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
229 static gchar *
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
230 intkeyring_encrypt(intkeyring_buff_t *key, const gchar *str)
34032
2eeafc43c7f2 Rearrange code so we can drop the prototypes. Most of it was already
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34031
diff changeset
231 {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
232 PurpleCipherContext *context;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
233 intkeyring_buff_t *iv;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
234 guchar plaintext[INTKEYRING_ENCRYPT_BUFF_LEN];
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
235 size_t plaintext_len, text_len, verify_len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
236 guchar encrypted_raw[INTKEYRING_ENCRYPT_BUFF_LEN];
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
237 ssize_t encrypted_size;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
238
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
239 g_return_val_if_fail(key != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
240 g_return_val_if_fail(str != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
241
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
242 text_len = strlen(str);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
243 verify_len = strlen(INTKEYRING_VERIFY_STR);
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
244 plaintext_len = INTKEYRING_ENCRYPTED_MIN_LEN;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
245 if (plaintext_len < text_len)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
246 plaintext_len = text_len;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
247
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
248 g_return_val_if_fail(plaintext_len + verify_len <= sizeof(plaintext),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
249 NULL);
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
250
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
251 context = purple_cipher_context_new_by_name("aes", NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
252 g_return_val_if_fail(context != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
253
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
254 memset(plaintext, 0, plaintext_len);
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
255 memcpy(plaintext, str, text_len);
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
256 memcpy(plaintext + plaintext_len, INTKEYRING_VERIFY_STR, verify_len);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
257 plaintext_len += verify_len;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
258
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
259 iv = intkeyring_gen_salt(purple_cipher_context_get_block_size(context));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
260 purple_cipher_context_set_iv(context, iv->data, iv->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
261 purple_cipher_context_set_key(context, key->data, key->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
262 purple_cipher_context_set_batch_mode(context,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
263 PURPLE_CIPHER_BATCH_MODE_CBC);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
264
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
265 memcpy(encrypted_raw, iv->data, iv->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
266
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
267 encrypted_size = purple_cipher_context_encrypt(context,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
268 plaintext, plaintext_len, encrypted_raw + iv->len,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
269 sizeof(encrypted_raw) - iv->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
270 encrypted_size += iv->len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
271
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
272 memset(plaintext, 0, plaintext_len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
273 intkeyring_buff_free(iv);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
274 purple_cipher_context_destroy(context);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
275
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
276 if (encrypted_size < 0)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
277 return NULL;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
278
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
279 return purple_base64_encode(encrypted_raw, encrypted_size);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
280
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
281 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
282
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
283 static gchar *
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
284 intkeyring_decrypt(intkeyring_buff_t *key, const gchar *str)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
285 {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
286 PurpleCipherContext *context;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
287 guchar *encrypted_raw;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
288 gsize encrypted_size;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
289 size_t iv_len, verify_len, text_len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
290 guchar plaintext[INTKEYRING_ENCRYPT_BUFF_LEN];
34202
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
291 const gchar *verify_str = NULL;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
292 ssize_t plaintext_len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
293 gchar *ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
294
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
295 g_return_val_if_fail(key != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
296 g_return_val_if_fail(str != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
297
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
298 context = purple_cipher_context_new_by_name("aes", NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
299 g_return_val_if_fail(context != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
300
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
301 encrypted_raw = purple_base64_decode(str, &encrypted_size);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
302 g_return_val_if_fail(encrypted_raw != NULL, NULL);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
303
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
304 iv_len = purple_cipher_context_get_block_size(context);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
305 if (encrypted_size < iv_len) {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
306 g_free(encrypted_raw);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
307 return NULL;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
308 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
309
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
310 purple_cipher_context_set_iv(context, encrypted_raw, iv_len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
311 purple_cipher_context_set_key(context, key->data, key->len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
312 purple_cipher_context_set_batch_mode(context,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
313 PURPLE_CIPHER_BATCH_MODE_CBC);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
314
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
315 plaintext_len = purple_cipher_context_decrypt(context,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
316 encrypted_raw + iv_len, encrypted_size - iv_len,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
317 plaintext, sizeof(plaintext));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
318
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
319 g_free(encrypted_raw);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
320 purple_cipher_context_destroy(context);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
321
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
322 verify_len = strlen(INTKEYRING_VERIFY_STR);
34202
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
323 /* Don't remove the len > 0 check! */
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
324 if (plaintext_len > 0 && plaintext_len > verify_len &&
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
325 plaintext[plaintext_len] == '\0')
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
326 {
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
327 verify_str = (gchar*)plaintext + plaintext_len - verify_len;
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
328 }
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
329
f588313334c8 Fix uninitialized read
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34200
diff changeset
330 if (g_strcmp0(verify_str, INTKEYRING_VERIFY_STR) != 0) {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
331 purple_debug_warning("keyring-internal",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
332 "Verification failed on decryption\n");
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
333 memset(plaintext, 0, sizeof(plaintext));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
334 return NULL;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
335 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
336
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
337 text_len = plaintext_len - verify_len;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
338 ret = g_new(gchar, text_len + 1);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
339 memcpy(ret, plaintext, text_len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
340 memset(plaintext, 0, plaintext_len);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
341 ret[text_len] = '\0';
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
342
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
343 return ret;
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
344 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
345
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
346 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
347 /* Password encryption */
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
348 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
349
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
350 static gboolean
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
351 intkeyring_change_masterpw(const gchar *new_password)
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
352 {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
353 intkeyring_buff_t *salt, *key;
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
354 gchar *verifier = NULL, *salt_b64 = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
355 int old_iter;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
356 gboolean succ = TRUE;;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
357
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
358 g_return_val_if_fail(intkeyring_unlocked, FALSE);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
359
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
360 old_iter = purple_prefs_get_int(INTKEYRING_PREFS "pbkdf2_iterations");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
361 purple_prefs_set_int(INTKEYRING_PREFS "pbkdf2_iterations",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
362 purple_prefs_get_int(INTKEYRING_PREFS
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
363 "pbkdf2_desired_iterations"));
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
364
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
365 salt = intkeyring_gen_salt(32);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
366 key = intkeyring_derive_key(new_password, salt);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
367
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
368 if (salt && key && key->len == INTKEYRING_KEY_LEN) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
369 /* In fact, verify str will be concatenated twice before
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
370 * encryption (it's used as a suffix in encryption routine),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
371 * but it's not a problem.
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
372 */
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
373 verifier = intkeyring_encrypt(key, INTKEYRING_VERIFY_STR);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
374 salt_b64 = purple_base64_encode(salt->data, salt->len);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
375 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
376
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
377 if (!verifier || !salt_b64) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
378 purple_debug_error("keyring-internal", "Failed to change "
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
379 "master password\n");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
380 succ = FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
381 purple_prefs_set_int(INTKEYRING_PREFS "pbkdf2_iterations",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
382 old_iter);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
383 } else {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
384 purple_prefs_set_string(INTKEYRING_PREFS "pbkdf2_salt",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
385 salt_b64);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
386 purple_prefs_set_string(INTKEYRING_PREFS "key_verifier",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
387 verifier);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
388
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
389 intkeyring_buff_free(intkeyring_key);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
390 intkeyring_key = key;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
391 key = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
392
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
393 intkeyring_reencrypt_passwords();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
394
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
395 purple_signal_emit(purple_keyring_get_handle(),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
396 "password-migration", NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
397 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
398
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
399 g_free(salt_b64);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
400 g_free(verifier);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
401 intkeyring_buff_free(salt);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
402 intkeyring_buff_free(key);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
403
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
404 return succ;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
405 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
406
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
407 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
408 intkeyring_process_queue(void)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
409 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
410 GList *requests, *it;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
411 gboolean open = intkeyring_unlocked;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
412
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
413 requests = g_list_first(intkeyring_pending_requests);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
414 intkeyring_pending_requests = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
415
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
416 for (it = requests; it != NULL; it = g_list_next(it))
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
417 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
418 intkeyring_request *req = it->data;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
419
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
420 if (open && req->type == INTKEYRING_REQUEST_READ) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
421 intkeyring_read(req->account, req->cb.read,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
422 req->cb_data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
423 } else if (open && req->type == INTKEYRING_REQUEST_SAVE) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
424 intkeyring_save(req->account, req->password,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
425 req->cb.save, req->cb_data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
426 } else if (open)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
427 g_assert_not_reached();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
428 else if (req->cb.read != NULL /* || req->cb.write != NULL */ ) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
429 GError *error = g_error_new(PURPLE_KEYRING_ERROR,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
430 PURPLE_KEYRING_ERROR_CANCELLED,
34199
73d122f25f2b Localize strings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34196
diff changeset
431 _("Operation cancelled."));
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
432 if (req->type == INTKEYRING_REQUEST_READ) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
433 req->cb.read(req->account, NULL, error,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
434 req->cb_data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
435 } else if (req->type == INTKEYRING_REQUEST_SAVE)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
436 req->cb.save(req->account, error, req->cb_data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
437 else
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
438 g_assert_not_reached();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
439 g_error_free(error);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
440 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
441
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
442 intkeyring_request_free(req);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
443 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
444 g_list_free(requests);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
445 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
446
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
447 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
448 intkeyring_decrypt_password(PurpleAccount *account, const gchar *ciphertext)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
449 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
450 gchar *plaintext;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
451
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
452 plaintext = intkeyring_decrypt(intkeyring_key, ciphertext);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
453 if (plaintext == NULL) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
454 purple_debug_warning("keyring-internal",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
455 "Failed to decrypt a password\n");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
456 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
457 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
458
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
459 g_hash_table_replace(intkeyring_passwords, account, plaintext);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
460 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
461
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
462 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
463 intkeyring_encrypt_password_if_needed(PurpleAccount *account)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
464 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
465 const gchar *plaintext;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
466 gchar *ciphertext;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
467
34252
4ca80adc2a4d Internal keyring: don't encrypt, when encryption is off; HTTP: remove unnecessary macros
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34202
diff changeset
468 if (intkeyring_key == NULL) {
4ca80adc2a4d Internal keyring: don't encrypt, when encryption is off; HTTP: remove unnecessary macros
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34202
diff changeset
469 g_hash_table_remove(intkeyring_ciphertexts, account);
4ca80adc2a4d Internal keyring: don't encrypt, when encryption is off; HTTP: remove unnecessary macros
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34202
diff changeset
470 return;
4ca80adc2a4d Internal keyring: don't encrypt, when encryption is off; HTTP: remove unnecessary macros
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34202
diff changeset
471 }
4ca80adc2a4d Internal keyring: don't encrypt, when encryption is off; HTTP: remove unnecessary macros
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34202
diff changeset
472
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
473 ciphertext = g_hash_table_lookup(intkeyring_ciphertexts, account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
474 if (ciphertext != NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
475 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
476
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
477 plaintext = g_hash_table_lookup(intkeyring_passwords, account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
478 if (plaintext == NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
479 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
480
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
481 ciphertext = intkeyring_encrypt(intkeyring_key, plaintext);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
482 g_return_if_fail(ciphertext != NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
483
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
484 g_hash_table_replace(intkeyring_ciphertexts, account, ciphertext);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
485 }
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
486
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
487 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
488 intkeyring_encrypt_passwords_if_needed_it(gpointer account, gpointer plaintext,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
489 gpointer _unused)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
490 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
491 intkeyring_encrypt_password_if_needed(account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
492 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
493
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
494 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
495 intkeyring_reencrypt_passwords(void)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
496 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
497 g_hash_table_remove_all(intkeyring_ciphertexts);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
498 g_hash_table_foreach(intkeyring_passwords,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
499 intkeyring_encrypt_passwords_if_needed_it, NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
500 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
501
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
502 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
503 intkeyring_unlock_decrypt(gpointer account, gpointer ciphertext,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
504 gpointer _unused)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
505 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
506 intkeyring_decrypt_password(account, ciphertext);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
507 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
508
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
509 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
510 /* Opening and unlocking keyring */
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
511 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
512
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
513 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
514 intkeyring_unlock_ok(gpointer _unused,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
515 PurpleRequestFields *fields)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
516 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
517 const gchar *masterpw;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
518 gchar *verifier;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
519 intkeyring_buff_t *salt, *key;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
520
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
521 intkeyring_masterpw_uirequest = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
522
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
523 if (g_strcmp0(purple_prefs_get_string(INTKEYRING_PREFS
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
524 "encryption_method"), INTKEYRING_ENCRYPTION_METHOD) != 0) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
525 purple_notify_error(NULL,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
526 _("Unlocking internal keyring"),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
527 _("Selected encryption method is not supported."),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
528 _("Most probably, your passwords were encrypted with "
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
529 "newer Pidgin/libpurple version, please update."));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
530 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
531 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
532
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
533 masterpw = purple_request_fields_get_string(fields, "password");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
534
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
535 if (masterpw == NULL || masterpw[0] == '\0') {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
536 intkeyring_unlock(_("No password entered."));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
537 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
538 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
539
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
540 salt = intkeyring_buff_from_base64(purple_prefs_get_string(
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
541 INTKEYRING_PREFS "pbkdf2_salt"));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
542 key = intkeyring_derive_key(masterpw, salt);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
543 intkeyring_buff_free(salt);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
544
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
545 verifier = intkeyring_decrypt(key, purple_prefs_get_string(
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
546 INTKEYRING_PREFS "key_verifier"));
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
547
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
548 if (g_strcmp0(verifier, INTKEYRING_VERIFY_STR) != 0) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
549 g_free(verifier);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
550 intkeyring_buff_free(key);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
551 intkeyring_unlock(_("Invalid master password entered, "
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
552 "try again."));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
553 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
554 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
555
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
556 g_free(verifier);
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
557 intkeyring_key = key;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
558 intkeyring_unlocked = TRUE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
559
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
560 g_hash_table_foreach(intkeyring_ciphertexts,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
561 intkeyring_unlock_decrypt, NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
562
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
563 intkeyring_process_queue();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
564 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
565
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
566 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
567 intkeyring_unlock_cancel(gpointer _unused,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
568 PurpleRequestFields *fields)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
569 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
570 intkeyring_masterpw_uirequest = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
571 intkeyring_process_queue();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
572 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
573
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
574 static void
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
575 intkeyring_unlock(const gchar *message)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
576 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
577 PurpleRequestFields *fields;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
578 PurpleRequestFieldGroup *group;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
579 PurpleRequestField *field;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
580 const gchar *primary_msg, *secondary_msg = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
581
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
582 if (intkeyring_unlocked || intkeyring_masterpw_uirequest != NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
583 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
584
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
585 if (!purple_prefs_get_bool(INTKEYRING_PREFS "encrypt_passwords")) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
586 intkeyring_unlocked = TRUE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
587 intkeyring_process_queue();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
588 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
589 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
590
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
591 fields = purple_request_fields_new();
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
592 group = purple_request_field_group_new(NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
593 purple_request_fields_add_group(fields, group);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
594
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
595 field = purple_request_field_string_new("password",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
596 _("Master password"), "", FALSE);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
597 purple_request_field_string_set_masked(field, TRUE);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
598 purple_request_field_group_add_field(group, field);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
599
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
600 primary_msg = _("Please, enter master password");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
601 if (message) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
602 secondary_msg = primary_msg;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
603 primary_msg = message;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
604 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
605
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
606 intkeyring_masterpw_uirequest = purple_request_fields(NULL,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
607 _("Unlocking internal keyring"),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
608 primary_msg, secondary_msg, fields,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
609 _("OK"), G_CALLBACK(intkeyring_unlock_ok),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
610 _("Cancel"), G_CALLBACK(intkeyring_unlock_cancel),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
611 NULL, NULL, NULL, NULL);
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
612 }
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
613
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
614 static void
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
615 intkeyring_open(void)
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
616 {
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
617 if (intkeyring_opened)
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
618 return;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
619 intkeyring_opened = TRUE;
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
620
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
621 intkeyring_passwords = g_hash_table_new_full(g_direct_hash,
34146
99bad5c80d1e More password wiping, better password management withing account.c, using actual UI name with KWallet
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34131
diff changeset
622 g_direct_equal, NULL, (GDestroyNotify)purple_str_wipe);
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
623 intkeyring_ciphertexts = g_hash_table_new_full(g_direct_hash,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
624 g_direct_equal, NULL, g_free);
34032
2eeafc43c7f2 Rearrange code so we can drop the prototypes. Most of it was already
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34031
diff changeset
625 }
2eeafc43c7f2 Rearrange code so we can drop the prototypes. Most of it was already
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34031
diff changeset
626
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
627 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
628 /* Keyring interface implementation */
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
629 /************************************************************************/
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
630
34033
910f2ed3988b Remove trailing whitespace.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34032
diff changeset
631 static void
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
632 intkeyring_read(PurpleAccount *account, PurpleKeyringReadCallback cb,
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
633 gpointer data)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
634 {
34041
75204e58b8ca Fix const-ness of strings, and silly strdups.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34036
diff changeset
635 const char *password;
34034
f508fa47f2ac Reformat many things.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34033
diff changeset
636 GError *error;
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
637
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
638 intkeyring_open();
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
639
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
640 if (!intkeyring_unlocked && g_hash_table_lookup(intkeyring_ciphertexts,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
641 account) != NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
642 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
643 intkeyring_request *req = g_new0(intkeyring_request, 1);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
644
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
645 req->type = INTKEYRING_REQUEST_READ;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
646 req->account = account;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
647 req->cb.read = cb;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
648 req->cb_data = data;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
649 intkeyring_pending_requests =
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
650 g_list_append(intkeyring_pending_requests, req);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
651
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
652 intkeyring_unlock(NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
653 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
654 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
655
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
656 password = g_hash_table_lookup(intkeyring_passwords, account);
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
657
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
658 if (password != NULL) {
34127
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
659 purple_debug_misc("keyring-internal",
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
660 "Got password for account %s (%s).\n",
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
661 purple_account_get_username(account),
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
662 purple_account_get_protocol_id(account));
34034
f508fa47f2ac Reformat many things.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34033
diff changeset
663 if (cb != NULL)
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
664 cb(account, password, NULL, data);
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
665 } else {
34129
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
666 if (purple_debug_is_verbose()) {
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
667 purple_debug_misc("keyring-internal",
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
668 "No password for account %s (%s).\n",
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
669 purple_account_get_username(account),
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
670 purple_account_get_protocol_id(account));
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
671 }
34047
c2e68ddbf27c Correctly namespace these keyring errors.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34041
diff changeset
672 error = g_error_new(PURPLE_KEYRING_ERROR,
34199
73d122f25f2b Localize strings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34196
diff changeset
673 PURPLE_KEYRING_ERROR_NOPASSWORD,
73d122f25f2b Localize strings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34196
diff changeset
674 _("Password not found."));
34034
f508fa47f2ac Reformat many things.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34033
diff changeset
675 if (cb != NULL)
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
676 cb(account, NULL, error, data);
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
677 g_error_free(error);
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
678 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
679 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
680
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
681 static void
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
682 intkeyring_save(PurpleAccount *account, const gchar *password,
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
683 PurpleKeyringSaveCallback cb, gpointer data)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
684 {
34129
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
685 void *old_password;
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
686
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
687 intkeyring_open();
34127
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
688
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
689 if (!intkeyring_unlocked) {
34200
5c47b9fa4a5b Fix win32 build
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34199
diff changeset
690 intkeyring_request *req;
5c47b9fa4a5b Fix win32 build
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34199
diff changeset
691
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
692 if (password == NULL) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
693 g_hash_table_remove(intkeyring_ciphertexts, account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
694 g_hash_table_remove(intkeyring_passwords, account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
695 if (cb)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
696 cb(account, NULL, data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
697 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
698 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
699
34200
5c47b9fa4a5b Fix win32 build
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34199
diff changeset
700 req = g_new0(intkeyring_request, 1);
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
701 req->type = INTKEYRING_REQUEST_SAVE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
702 req->account = account;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
703 req->password = g_strdup(password);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
704 req->cb.save = cb;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
705 req->cb_data = data;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
706 intkeyring_pending_requests =
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
707 g_list_append(intkeyring_pending_requests, req);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
708
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
709 intkeyring_unlock(NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
710 return;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
711 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
712
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
713 g_hash_table_remove(intkeyring_ciphertexts, account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
714
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
715 old_password = g_hash_table_lookup(intkeyring_passwords, account);
34129
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
716
34127
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
717 if (password == NULL)
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
718 g_hash_table_remove(intkeyring_passwords, account);
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
719 else {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
720 g_hash_table_replace(intkeyring_passwords, account,
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
721 g_strdup(password));
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
722 }
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
723
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
724 intkeyring_encrypt_password_if_needed(account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
725
34129
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
726 if (!(password == NULL && old_password == NULL)) {
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
727 purple_debug_misc("keyring-internal",
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
728 "Password %s for account %s (%s).\n",
34170
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
729 (password == NULL ? "removed" : (old_password == NULL ?
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
730 "saved" : "updated")),
34129
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
731 purple_account_get_username(account),
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
732 purple_account_get_protocol_id(account));
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
733 } else if (purple_debug_is_verbose()) {
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
734 purple_debug_misc("keyring-internal",
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
735 "Password for account %s (%s) was already removed.\n",
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
736 purple_account_get_username(account),
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
737 purple_account_get_protocol_id(account));
52b91b4b8314 Proper error handling when doing a password migration, fixes reverting it.
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34128
diff changeset
738 }
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
739
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
740 if (cb != NULL)
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
741 cb(account, NULL, data);
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
742 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
743
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
744 static void
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
745 intkeyring_close(void)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
746 {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
747 if (!intkeyring_opened)
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
748 return;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
749 intkeyring_opened = FALSE;
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
750 intkeyring_unlocked = FALSE;
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
751
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
752 if (intkeyring_masterpw_uirequest) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
753 purple_request_close(PURPLE_REQUEST_FIELDS,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
754 intkeyring_masterpw_uirequest);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
755 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
756 g_warn_if_fail(intkeyring_masterpw_uirequest == NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
757 g_warn_if_fail(intkeyring_pending_requests == NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
758
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
759 intkeyring_buff_free(intkeyring_key);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
760 intkeyring_key = NULL;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
761 g_hash_table_destroy(intkeyring_passwords);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
762 intkeyring_passwords = NULL;
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
763 g_hash_table_destroy(intkeyring_ciphertexts);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
764 intkeyring_ciphertexts = NULL;
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
765 }
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
766
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
767 static gboolean
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
768 intkeyring_import_password(PurpleAccount *account, const char *mode,
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
769 const char *data, GError **error)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
770 {
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
771 g_return_val_if_fail(account != NULL, FALSE);
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
772 g_return_val_if_fail(data != NULL, FALSE);
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
773
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
774 intkeyring_open();
34127
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
775
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
776 if (mode == NULL)
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
777 mode = "cleartext";
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
778
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
779 if (g_strcmp0(mode, "cleartext") == 0) {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
780 g_hash_table_replace(intkeyring_passwords, account,
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
781 g_strdup(data));
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
782 return TRUE;
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
783 } else if (g_strcmp0(mode, "ciphertext") == 0) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
784 if (intkeyring_unlocked)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
785 intkeyring_decrypt_password(account, data);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
786 else {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
787 g_hash_table_replace(intkeyring_ciphertexts, account,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
788 g_strdup(data));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
789 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
790 return TRUE;
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
791 } else {
34127
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
792 if (error != NULL) {
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
793 *error = g_error_new(PURPLE_KEYRING_ERROR,
34154
857c361d3791 Refine keyring error coded
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34146
diff changeset
794 PURPLE_KEYRING_ERROR_BACKENDFAIL,
34199
73d122f25f2b Localize strings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34196
diff changeset
795 _("Invalid password storage mode."));
34127
51c1bce7f52f Tidying debug messages, signals
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34116
diff changeset
796 }
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
797 return FALSE;
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
798 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
799 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
800
34033
910f2ed3988b Remove trailing whitespace.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34032
diff changeset
801 static gboolean
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
802 intkeyring_export_password(PurpleAccount *account, const char **mode,
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
803 char **data, GError **error, GDestroyNotify *destroy)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
804 {
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
805 gchar *ciphertext = NULL;
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
806 intkeyring_open();
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
807
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
808 if (!purple_prefs_get_bool(INTKEYRING_PREFS "encrypt_passwords")) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
809 gchar *cleartext = g_hash_table_lookup(intkeyring_passwords,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
810 account);
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
811
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
812 if (cleartext == NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
813 return FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
814
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
815 *mode = "cleartext";
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
816 *data = g_strdup(cleartext);
34146
99bad5c80d1e More password wiping, better password management withing account.c, using actual UI name with KWallet
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34131
diff changeset
817 *destroy = (GDestroyNotify)purple_str_wipe;
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
818 return TRUE;
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
819 }
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
820
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
821 ciphertext = g_strdup(g_hash_table_lookup(intkeyring_ciphertexts,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
822 account));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
823
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
824 if (ciphertext == NULL && intkeyring_unlocked) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
825 gchar *plaintext = g_hash_table_lookup(intkeyring_passwords,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
826 account);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
827
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
828 if (plaintext == NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
829 return FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
830
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
831 purple_debug_warning("keyring-internal", "Encrypted password "
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
832 "is missing at export (it shouldn't happen)\n");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
833 ciphertext = intkeyring_encrypt(intkeyring_key, plaintext);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
834 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
835
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
836 if (ciphertext == NULL)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
837 return FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
838
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
839 *mode = "ciphertext";
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
840 *data = ciphertext;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
841 *destroy = (GDestroyNotify)g_free;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
842 return TRUE;
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
843 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
844
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
845 static PurpleRequestFields *
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
846 intkeyring_read_settings(void)
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
847 {
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
848 PurpleRequestFields *fields;
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
849 PurpleRequestFieldGroup *group;
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
850 PurpleRequestField *field;
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
851
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
852 fields = purple_request_fields_new();
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
853 group = purple_request_field_group_new(NULL);
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
854 purple_request_fields_add_group(fields, group);
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
855
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
856 field = purple_request_field_bool_new("encrypt_passwords",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
857 _("Encrypt passwords"), purple_prefs_get_bool(
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
858 INTKEYRING_PREFS "encrypt_passwords"));
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
859 purple_request_field_group_add_field(group, field);
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
860
34188
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
861 group = purple_request_field_group_new(_("Master password"));
34186
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
862 purple_request_fields_add_group(fields, group);
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
863
34189
f6add03f75c5 Fix line breaking at col 80
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34188
diff changeset
864 field = purple_request_field_string_new("passphrase1",
f6add03f75c5 Fix line breaking at col 80
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34188
diff changeset
865 _("New passphrase:"), "", FALSE);
34186
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
866 purple_request_field_string_set_masked(field, TRUE);
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
867 purple_request_field_group_add_field(group, field);
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
868
34189
f6add03f75c5 Fix line breaking at col 80
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34188
diff changeset
869 field = purple_request_field_string_new("passphrase2",
f6add03f75c5 Fix line breaking at col 80
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34188
diff changeset
870 _("New passphrase (again):"), "", FALSE);
34186
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
871 purple_request_field_string_set_masked(field, TRUE);
1d9ea89d4934 Group and string support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34185
diff changeset
872 purple_request_field_group_add_field(group, field);
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
873
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
874 group = purple_request_field_group_new(_("Advanced settings"));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
875 purple_request_fields_add_group(fields, group);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
876
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
877 field = purple_request_field_int_new("pbkdf2_desired_iterations",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
878 _("Number of PBKDF2 iterations:"), purple_prefs_get_int(
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
879 INTKEYRING_PREFS "pbkdf2_desired_iterations"),
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
880 INTKEYRING_PBKDF2_ITERATIONS_MIN,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
881 INTKEYRING_PBKDF2_ITERATIONS_MAX);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
882 purple_request_field_group_add_field(group, field);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
883
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
884 return fields;
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
885 }
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
886
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
887 static gboolean
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
888 intkeyring_apply_settings(void *notify_handle,
34188
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
889 PurpleRequestFields *fields)
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
890 {
34188
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
891 const gchar *passphrase, *passphrase2;
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
892
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
893 intkeyring_unlock(_("You have to unlock the keyring first."));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
894 if (!intkeyring_unlocked)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
895 return FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
896
34188
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
897 passphrase = purple_request_fields_get_string(fields, "passphrase1");
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
898 if (g_strcmp0(passphrase, "") == 0)
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
899 passphrase = NULL;
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
900 passphrase2 = purple_request_fields_get_string(fields, "passphrase2");
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
901 if (g_strcmp0(passphrase2, "") == 0)
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
902 passphrase2 = NULL;
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
903
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
904 if (g_strcmp0(passphrase, passphrase2) != 0) {
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
905 purple_notify_error(notify_handle,
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
906 _("Internal keyring settings"),
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
907 _("Passphrases do not match"), NULL);
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
908 return FALSE;
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
909 }
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
910
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
911 if (purple_request_fields_get_bool(fields, "encrypt_passwords") &&
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
912 !passphrase && !intkeyring_key)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
913 {
34188
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
914 purple_notify_error(notify_handle,
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
915 _("Internal keyring settings"),
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
916 _("You have to set up a Master password, if you want "
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
917 "to enable encryption"), NULL);
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
918 return FALSE;
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
919 }
0680f2c10db3 Validation for internal keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34186
diff changeset
920
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
921 if (!purple_request_fields_get_bool(fields, "encrypt_passwords") &&
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
922 passphrase)
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
923 {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
924 purple_notify_error(notify_handle,
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
925 _("Internal keyring settings"),
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
926 _("You don't need any master password, if you won't "
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
927 "enable passwords encryption"), NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
928 return FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
929 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
930
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
931 purple_prefs_set_string(INTKEYRING_PREFS "encryption_method",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
932 INTKEYRING_ENCRYPTION_METHOD);
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
933
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
934 purple_prefs_set_int(INTKEYRING_PREFS "pbkdf2_desired_iterations",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
935 purple_request_fields_get_integer(fields,
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
936 "pbkdf2_desired_iterations"));
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
937
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
938 if (passphrase != NULL) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
939 if (!intkeyring_change_masterpw(passphrase))
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
940 return FALSE;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
941 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
942
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
943 purple_prefs_set_bool(INTKEYRING_PREFS "encrypt_passwords",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
944 purple_request_fields_get_bool(fields, "encrypt_passwords"));
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
945
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
946 purple_signal_emit(purple_keyring_get_handle(), "password-migration",
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
947 NULL);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
948
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
949
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
950 return TRUE;
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
951 }
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
952
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
953 static gboolean
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
954 intkeyring_load(PurplePlugin *plugin)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
955 {
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
956 keyring_handler = purple_keyring_new();
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
957
34281
ad957d0a467a Keyring (and some GTK): fix translation callbacks
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34252
diff changeset
958 purple_keyring_set_name(keyring_handler, _(INTKEYRING_NAME));
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
959 purple_keyring_set_id(keyring_handler, INTKEYRING_ID);
34170
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
960 purple_keyring_set_read_password(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
961 intkeyring_read);
34170
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
962 purple_keyring_set_save_password(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
963 intkeyring_save);
34170
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
964 purple_keyring_set_close_keyring(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
965 intkeyring_close);
34170
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
966 purple_keyring_set_import_password(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
967 intkeyring_import_password);
34170
94102637e7c7 Coding style and entry description for GNOME Keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34155
diff changeset
968 purple_keyring_set_export_password(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
969 intkeyring_export_password);
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
970 purple_keyring_set_read_settings(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
971 intkeyring_read_settings);
34185
cb2fe6b04447 Initial support for keyring settings
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34170
diff changeset
972 purple_keyring_set_apply_settings(keyring_handler,
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
973 intkeyring_apply_settings);
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
974
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
975 purple_keyring_register(keyring_handler);
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
976
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
977 return TRUE;
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
978 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
979
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
980 static gboolean
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
981 intkeyring_unload(PurplePlugin *plugin)
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
982 {
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
983 if (purple_keyring_get_inuse() == keyring_handler) {
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
984 purple_debug_warning("keyring-internal",
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
985 "keyring in use, cannot unload\n");
34096
3d28c3311ad0 Don't allow unloading a plugin if its keyring is active.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34095
diff changeset
986 return FALSE;
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
987 }
34096
3d28c3311ad0 Don't allow unloading a plugin if its keyring is active.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34095
diff changeset
988
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
989 intkeyring_close();
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
990
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
991 purple_keyring_unregister(keyring_handler);
33987
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
992 purple_keyring_free(keyring_handler);
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
993 keyring_handler = NULL;
9beebdbf44d6 Fixed many bugs and crashes in the keyring subsystem.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents: 33984
diff changeset
994
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
995 if (intkeyring_key != NULL) {
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
996 purple_debug_warning("keyring-internal", "Master key should be "
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
997 "cleaned up at this point\n");
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
998 intkeyring_buff_free(intkeyring_key);
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
999 intkeyring_key = NULL;
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
1000 }
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
1001
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1002 return TRUE;
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1003 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1004
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1005 PurplePluginInfo plugininfo =
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1006 {
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1007 PURPLE_PLUGIN_MAGIC, /* magic */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1008 PURPLE_MAJOR_VERSION, /* major_version */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1009 PURPLE_MINOR_VERSION, /* minor_version */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1010 PURPLE_PLUGIN_STANDARD, /* type */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1011 NULL, /* ui_requirement */
34116
825c98f8c7f6 Get rid of PURPLE_PLUGIN_FLAG_AUTOLOAD
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34110
diff changeset
1012 PURPLE_PLUGIN_FLAG_INVISIBLE, /* flags */
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1013 NULL, /* dependencies */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1014 PURPLE_PRIORITY_DEFAULT, /* priority */
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1015 INTKEYRING_ID, /* id */
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1016 INTKEYRING_NAME, /* name */
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1017 DISPLAY_VERSION, /* version */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1018 "Internal Keyring Plugin", /* summary */
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1019 INTKEYRING_DESCRIPTION, /* description */
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1020 INTKEYRING_AUTHOR, /* author */
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1021 PURPLE_WEBSITE, /* homepage */
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1022 intkeyring_load, /* load */
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1023 intkeyring_unload, /* unload */
34128
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1024 NULL, /* destroy */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1025 NULL, /* ui_info */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1026 NULL, /* extra_info */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1027 NULL, /* prefs_info */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1028 NULL, /* actions */
0cbd558ab5e7 Tidy up internal keyring
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34127
diff changeset
1029 NULL, NULL, NULL, NULL /* padding */
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1030 };
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1031
34033
910f2ed3988b Remove trailing whitespace.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34032
diff changeset
1032 static void
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1033 init_plugin(PurplePlugin *plugin)
34033
910f2ed3988b Remove trailing whitespace.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 34032
diff changeset
1034 {
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1035 purple_prefs_add_none("/plugins/keyrings");
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
1036 purple_prefs_add_none("/plugins/keyrings/internal");
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1037 purple_prefs_add_bool(INTKEYRING_PREFS "encrypt_passwords", FALSE);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1038 purple_prefs_add_string(INTKEYRING_PREFS "encryption_method",
34196
3ba4989ede79 Complete master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34195
diff changeset
1039 INTKEYRING_ENCRYPTION_METHOD);
34195
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1040 purple_prefs_add_int(INTKEYRING_PREFS "pbkdf2_desired_iterations",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1041 INTKEYRING_PBKDF2_ITERATIONS);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1042 purple_prefs_add_int(INTKEYRING_PREFS "pbkdf2_iterations",
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1043 INTKEYRING_PBKDF2_ITERATIONS);
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1044 purple_prefs_add_string(INTKEYRING_PREFS "pbkdf2_salt", "");
31202151cde1 Initial master password implementation
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents: 34189
diff changeset
1045 purple_prefs_add_string(INTKEYRING_PREFS "key_verifier", "");
33984
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1046 }
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1047
7459475b1495 Added the gnome keyring plugin, and finally got makefiles to work.
Vivien Bernet-Rollande <scrouaf@soc.pidgin.im>
parents:
diff changeset
1048 PURPLE_INIT_PLUGIN(internal_keyring, init_plugin, plugininfo)

mercurial