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 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
28 #include "empathy-debug.h"
30 static GnomeKeyringPasswordSchema keyring_schema =
31 { GNOME_KEYRING_ITEM_GENERIC_SECRET,
32 { { "account-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
33 { "param-name", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
37 find_items_cb (GnomeKeyringResult result,
41 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
43 if (result != GNOME_KEYRING_RESULT_OK)
45 GError *error = g_error_new_literal (TP_ERROR,
46 TP_ERROR_DOES_NOT_EXIST,
47 gnome_keyring_result_to_message (result));
48 g_simple_async_result_set_from_error (simple, error);
49 g_clear_error (&error);
52 if (g_list_length (list) == 1)
54 GnomeKeyringFound *found = list->data;
58 g_simple_async_result_set_op_res_gpointer (simple, found->secret, NULL);
61 g_simple_async_result_complete (simple);
62 g_object_unref (simple);
66 empathy_keyring_get_password_async (TpAccount *account,
67 GAsyncReadyCallback callback,
70 GSimpleAsyncResult *simple;
71 GnomeKeyringAttributeList *match;
72 const gchar *account_id;
74 g_return_if_fail (TP_IS_ACCOUNT (account));
75 g_return_if_fail (callback != NULL);
77 simple = g_simple_async_result_new (G_OBJECT (account), callback,
78 user_data, empathy_keyring_get_password_async);
80 account_id = tp_proxy_get_object_path (account) +
81 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
83 DEBUG ("Trying to get password for: %s", account_id);
85 match = gnome_keyring_attribute_list_new ();
86 gnome_keyring_attribute_list_append_string (match, "account-id",
88 gnome_keyring_attribute_list_append_string (match, "param-name", "password");
90 gnome_keyring_find_items (GNOME_KEYRING_ITEM_GENERIC_SECRET,
91 match, find_items_cb, simple, NULL);
93 gnome_keyring_attribute_list_free (match);
97 empathy_keyring_get_password_finish (TpAccount *account,
101 GSimpleAsyncResult *simple;
103 g_return_val_if_fail (TP_IS_ACCOUNT (account), NULL);
104 g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), NULL);
106 simple = G_SIMPLE_ASYNC_RESULT (result);
108 if (g_simple_async_result_propagate_error (simple, error))
111 g_return_val_if_fail (g_simple_async_result_is_valid (result,
112 G_OBJECT (account), empathy_keyring_get_password_async), NULL);
114 return g_simple_async_result_get_op_res_gpointer (simple);
118 store_password_cb (GnomeKeyringResult result,
121 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
123 if (result != GNOME_KEYRING_RESULT_OK)
125 GError *error = g_error_new_literal (TP_ERROR,
126 TP_ERROR_DOES_NOT_EXIST,
127 gnome_keyring_result_to_message (result));
128 g_simple_async_result_set_from_error (simple, error);
129 g_clear_error (&error);
132 g_simple_async_result_complete (simple);
133 g_object_unref (simple);
137 empathy_keyring_set_password_async (TpAccount *account,
138 const gchar *password,
139 GAsyncReadyCallback callback,
142 GSimpleAsyncResult *simple;
143 const gchar *account_id;
146 g_return_if_fail (TP_IS_ACCOUNT (account));
147 g_return_if_fail (password != NULL);
149 simple = g_simple_async_result_new (G_OBJECT (account), callback,
150 user_data, empathy_keyring_set_password_async);
152 account_id = tp_proxy_get_object_path (account) +
153 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
155 DEBUG ("Remembering password for %s", account_id);
157 name = g_strdup_printf ("account: %s; param: password", account_id);
159 gnome_keyring_store_password (&keyring_schema, NULL, name, password,
160 store_password_cb, simple, NULL,
161 "account-id", account_id,
162 "param-name", "password",
169 empathy_keyring_set_password_finish (TpAccount *account,
170 GAsyncResult *result,
173 GSimpleAsyncResult *simple;
175 g_return_val_if_fail (TP_IS_ACCOUNT (account), FALSE);
176 g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
178 simple = G_SIMPLE_ASYNC_RESULT (result);
180 if (g_simple_async_result_propagate_error (simple, error))
183 g_return_val_if_fail (g_simple_async_result_is_valid (result,
184 G_OBJECT (account), empathy_keyring_set_password_async), FALSE);
190 item_delete_cb (GnomeKeyringResult result,
193 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
195 if (result != GNOME_KEYRING_RESULT_OK)
197 GError *error = g_error_new_literal (TP_ERROR,
198 TP_ERROR_DOES_NOT_EXIST,
199 gnome_keyring_result_to_message (result));
200 g_simple_async_result_set_from_error (simple, error);
201 g_clear_error (&error);
204 g_simple_async_result_complete (simple);
205 g_object_unref (simple);
209 find_item_to_delete_cb (GnomeKeyringResult result,
213 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
214 GnomeKeyringFound *found;
216 if (result != GNOME_KEYRING_RESULT_OK || g_list_length (list) != 1)
218 GError *error = g_error_new_literal (TP_ERROR,
219 TP_ERROR_DOES_NOT_EXIST,
220 gnome_keyring_result_to_message (result));
221 g_simple_async_result_set_from_error (simple, error);
222 g_clear_error (&error);
224 g_simple_async_result_complete (simple);
225 g_object_unref (simple);
231 gnome_keyring_item_delete (NULL, found->item_id, item_delete_cb,
236 empathy_keyring_delete_password_async (TpAccount *account,
237 GAsyncReadyCallback callback,
240 GSimpleAsyncResult *simple;
241 GnomeKeyringAttributeList *match;
242 const gchar *account_id;
244 g_return_if_fail (TP_IS_ACCOUNT (account));
246 simple = g_simple_async_result_new (G_OBJECT (account), callback,
247 user_data, empathy_keyring_delete_password_async);
249 account_id = tp_proxy_get_object_path (account) +
250 strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
252 match = gnome_keyring_attribute_list_new ();
253 gnome_keyring_attribute_list_append_string (match, "account-id",
255 gnome_keyring_attribute_list_append_string (match, "param-name", "password");
257 gnome_keyring_find_items (GNOME_KEYRING_ITEM_GENERIC_SECRET,
258 match, find_item_to_delete_cb, simple, NULL);
260 gnome_keyring_attribute_list_free (match);
264 empathy_keyring_delete_password_finish (TpAccount *account,
265 GAsyncResult *result,
268 GSimpleAsyncResult *simple;
270 g_return_val_if_fail (TP_IS_ACCOUNT (account), FALSE);
271 g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
273 simple = G_SIMPLE_ASYNC_RESULT (result);
275 if (g_simple_async_result_propagate_error (simple, error))
278 g_return_val_if_fail (g_simple_async_result_is_valid (result,
279 G_OBJECT (account), empathy_keyring_delete_password_async), FALSE);