2 * Copyright (C) 2010 Collabora Ltd.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "empathy-keyring.h"
25 #include <gnome-keyring.h>
27 #include "empathy-utils.h"
29 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
30 #include "empathy-debug.h"
32 static GnomeKeyringPasswordSchema account_keyring_schema =
33 { GNOME_KEYRING_ITEM_GENERIC_SECRET,
34 { { "account-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
35 { "param-name", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
38 static GnomeKeyringPasswordSchema room_keyring_schema =
39 { GNOME_KEYRING_ITEM_GENERIC_SECRET,
40 { { "account-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
41 { "room-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
45 empathy_keyring_is_available (void)
47 return gnome_keyring_is_available ();
53 find_items_cb (GnomeKeyringResult result,
57 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
58 GnomeKeyringFound *found;
60 if (result != GNOME_KEYRING_RESULT_OK)
62 GError *error = g_error_new_literal (TP_ERROR,
63 TP_ERROR_DOES_NOT_EXIST,
64 gnome_keyring_result_to_message (result));
65 g_simple_async_result_set_from_error (simple, error);
66 g_clear_error (&error);
72 g_simple_async_result_set_error (simple, TP_ERROR,
73 TP_ERROR_DOES_NOT_EXIST, "Password not found");
77 /* Get the first password returned. Ideally we should use the latest
78 * modified or something but we don't have this information from
79 * gnome-keyring atm. */
83 g_simple_async_result_set_op_res_gpointer (simple, found->secret, NULL);
86 g_simple_async_result_complete (simple);
87 g_object_unref (simple);
91 empathy_keyring_get_account_password_async (TpAccount *account,
92 GAsyncReadyCallback callback,
95 GSimpleAsyncResult *simple;
96 GnomeKeyringAttributeList *match;
97 const gchar *account_id;
99 g_return_if_fail (TP_IS_ACCOUNT (account));
100 g_return_if_fail (callback != NULL);
102 simple = g_simple_async_result_new (G_OBJECT (account), callback,
103 user_data, empathy_keyring_get_account_password_async);
105 account_id = tp_proxy_get_object_path (account) +
106 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
108 DEBUG ("Trying to get password for: %s", account_id);
110 match = gnome_keyring_attribute_list_new ();
111 gnome_keyring_attribute_list_append_string (match, "account-id",
113 gnome_keyring_attribute_list_append_string (match, "param-name", "password");
115 gnome_keyring_find_items (GNOME_KEYRING_ITEM_GENERIC_SECRET,
116 match, find_items_cb, simple, NULL);
118 gnome_keyring_attribute_list_free (match);
122 empathy_keyring_get_room_password_async (TpAccount *account,
124 GAsyncReadyCallback callback,
127 GSimpleAsyncResult *simple;
128 GnomeKeyringAttributeList *match;
129 const gchar *account_id;
131 g_return_if_fail (TP_IS_ACCOUNT (account));
132 g_return_if_fail (id != NULL);
133 g_return_if_fail (callback != NULL);
135 simple = g_simple_async_result_new (G_OBJECT (account), callback,
136 user_data, empathy_keyring_get_room_password_async);
138 account_id = tp_proxy_get_object_path (account) +
139 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
141 DEBUG ("Trying to get password for room '%s' on account '%s'",
144 match = gnome_keyring_attribute_list_new ();
145 gnome_keyring_attribute_list_append_string (match, "account-id",
147 gnome_keyring_attribute_list_append_string (match, "room-id", id);
149 gnome_keyring_find_items (GNOME_KEYRING_ITEM_GENERIC_SECRET,
150 match, find_items_cb, simple, NULL);
152 gnome_keyring_attribute_list_free (match);
156 empathy_keyring_get_account_password_finish (TpAccount *account,
157 GAsyncResult *result,
160 empathy_implement_finish_return_pointer (account,
161 empathy_keyring_get_account_password_async);
165 empathy_keyring_get_room_password_finish (TpAccount *account,
166 GAsyncResult *result,
169 empathy_implement_finish_return_pointer (account,
170 empathy_keyring_get_room_password_async);
176 store_password_cb (GnomeKeyringResult result,
179 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
181 if (result != GNOME_KEYRING_RESULT_OK)
183 GError *error = g_error_new_literal (TP_ERROR,
184 TP_ERROR_DOES_NOT_EXIST,
185 gnome_keyring_result_to_message (result));
186 g_simple_async_result_set_from_error (simple, error);
187 g_clear_error (&error);
190 g_simple_async_result_complete (simple);
191 g_object_unref (simple);
195 empathy_keyring_set_account_password_async (TpAccount *account,
196 const gchar *password,
197 GAsyncReadyCallback callback,
200 GSimpleAsyncResult *simple;
201 const gchar *account_id;
204 g_return_if_fail (TP_IS_ACCOUNT (account));
205 g_return_if_fail (password != NULL);
207 simple = g_simple_async_result_new (G_OBJECT (account), callback,
208 user_data, empathy_keyring_set_account_password_async);
210 account_id = tp_proxy_get_object_path (account) +
211 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
213 DEBUG ("Remembering password for %s", account_id);
215 name = g_strdup_printf ("IM account password for %s (%s)",
216 tp_account_get_display_name (account), account_id);
218 gnome_keyring_store_password (&account_keyring_schema, NULL, name, password,
219 store_password_cb, simple, NULL,
220 "account-id", account_id,
221 "param-name", "password",
228 empathy_keyring_set_room_password_async (TpAccount *account,
230 const gchar *password,
231 GAsyncReadyCallback callback,
234 GSimpleAsyncResult *simple;
235 const gchar *account_id;
238 g_return_if_fail (TP_IS_ACCOUNT (account));
239 g_return_if_fail (id != NULL);
240 g_return_if_fail (password != NULL);
242 simple = g_simple_async_result_new (G_OBJECT (account), callback,
243 user_data, empathy_keyring_set_room_password_async);
245 account_id = tp_proxy_get_object_path (account) +
246 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
248 DEBUG ("Remembering password for room '%s' on account '%s'", id, account_id);
250 name = g_strdup_printf ("Password for chatroom '%s' on account %s (%s)",
251 id, tp_account_get_display_name (account), account_id);
253 gnome_keyring_store_password (&room_keyring_schema, NULL, name, password,
254 store_password_cb, simple, NULL,
255 "account-id", account_id,
263 empathy_keyring_set_account_password_finish (TpAccount *account,
264 GAsyncResult *result,
267 empathy_implement_finish_void (account, empathy_keyring_set_account_password_async);
271 empathy_keyring_set_room_password_finish (TpAccount *account,
272 GAsyncResult *result,
275 empathy_implement_finish_void (account, empathy_keyring_set_room_password_async);
281 item_delete_cb (GnomeKeyringResult result,
284 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
286 if (result != GNOME_KEYRING_RESULT_OK)
288 GError *error = g_error_new_literal (TP_ERROR,
289 TP_ERROR_DOES_NOT_EXIST,
290 gnome_keyring_result_to_message (result));
291 g_simple_async_result_set_from_error (simple, error);
292 g_clear_error (&error);
295 g_simple_async_result_complete (simple);
296 g_object_unref (simple);
300 find_item_to_delete_cb (GnomeKeyringResult result,
304 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
305 GnomeKeyringFound *found;
307 if (result != GNOME_KEYRING_RESULT_OK || g_list_length (list) != 1)
309 GError *error = g_error_new_literal (TP_ERROR,
310 TP_ERROR_DOES_NOT_EXIST,
311 gnome_keyring_result_to_message (result));
312 g_simple_async_result_set_from_error (simple, error);
313 g_clear_error (&error);
315 g_simple_async_result_complete (simple);
316 g_object_unref (simple);
322 gnome_keyring_item_delete (NULL, found->item_id, item_delete_cb,
327 empathy_keyring_delete_account_password_async (TpAccount *account,
328 GAsyncReadyCallback callback,
331 GSimpleAsyncResult *simple;
332 GnomeKeyringAttributeList *match;
333 const gchar *account_id;
335 g_return_if_fail (TP_IS_ACCOUNT (account));
337 simple = g_simple_async_result_new (G_OBJECT (account), callback,
338 user_data, empathy_keyring_delete_account_password_async);
340 account_id = tp_proxy_get_object_path (account) +
341 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
343 match = gnome_keyring_attribute_list_new ();
344 gnome_keyring_attribute_list_append_string (match, "account-id",
346 gnome_keyring_attribute_list_append_string (match, "param-name", "password");
348 gnome_keyring_find_items (GNOME_KEYRING_ITEM_GENERIC_SECRET,
349 match, find_item_to_delete_cb, simple, NULL);
351 gnome_keyring_attribute_list_free (match);
355 empathy_keyring_delete_account_password_finish (TpAccount *account,
356 GAsyncResult *result,
359 empathy_implement_finish_void (account, empathy_keyring_delete_account_password_async);