aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy/empathy-keyring.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy/empathy-keyring.c')
-rw-r--r--libempathy/empathy-keyring.c162
1 files changed, 115 insertions, 47 deletions
diff --git a/libempathy/empathy-keyring.c b/libempathy/empathy-keyring.c
index 4923a9463..f8422c151 100644
--- a/libempathy/empathy-keyring.c
+++ b/libempathy/empathy-keyring.c
@@ -24,15 +24,31 @@
#include <gnome-keyring.h>
+#include "empathy-utils.h"
+
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include "empathy-debug.h"
-static GnomeKeyringPasswordSchema keyring_schema =
+static GnomeKeyringPasswordSchema account_keyring_schema =
{ GNOME_KEYRING_ITEM_GENERIC_SECRET,
{ { "account-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
{ "param-name", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
{ NULL } } };
+static GnomeKeyringPasswordSchema room_keyring_schema =
+ { GNOME_KEYRING_ITEM_GENERIC_SECRET,
+ { { "account-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
+ { "room-id", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
+ { NULL } } };
+
+gboolean
+empathy_keyring_is_available (void)
+{
+ return gnome_keyring_is_available ();
+}
+
+/* get */
+
static void
find_items_cb (GnomeKeyringResult result,
GList *list,
@@ -63,7 +79,7 @@ find_items_cb (GnomeKeyringResult result,
}
void
-empathy_keyring_get_password_async (TpAccount *account,
+empathy_keyring_get_account_password_async (TpAccount *account,
GAsyncReadyCallback callback,
gpointer user_data)
{
@@ -75,7 +91,7 @@ empathy_keyring_get_password_async (TpAccount *account,
g_return_if_fail (callback != NULL);
simple = g_simple_async_result_new (G_OBJECT (account), callback,
- user_data, empathy_keyring_get_password_async);
+ user_data, empathy_keyring_get_account_password_async);
account_id = tp_proxy_get_object_path (account) +
strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
@@ -93,27 +109,60 @@ empathy_keyring_get_password_async (TpAccount *account,
gnome_keyring_attribute_list_free (match);
}
-const gchar *
-empathy_keyring_get_password_finish (TpAccount *account,
- GAsyncResult *result,
- GError **error)
+void
+empathy_keyring_get_room_password_async (TpAccount *account,
+ const gchar *id,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GSimpleAsyncResult *simple;
+ GnomeKeyringAttributeList *match;
+ const gchar *account_id;
+
+ g_return_if_fail (TP_IS_ACCOUNT (account));
+ g_return_if_fail (id != NULL);
+ g_return_if_fail (callback != NULL);
- g_return_val_if_fail (TP_IS_ACCOUNT (account), NULL);
- g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), NULL);
+ simple = g_simple_async_result_new (G_OBJECT (account), callback,
+ user_data, empathy_keyring_get_room_password_async);
- simple = G_SIMPLE_ASYNC_RESULT (result);
+ account_id = tp_proxy_get_object_path (account) +
+ strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
- if (g_simple_async_result_propagate_error (simple, error))
- return NULL;
+ DEBUG ("Trying to get password for room '%s' on account '%s'",
+ id, account_id);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (account), empathy_keyring_get_password_async), NULL);
+ match = gnome_keyring_attribute_list_new ();
+ gnome_keyring_attribute_list_append_string (match, "account-id",
+ account_id);
+ gnome_keyring_attribute_list_append_string (match, "room-id", id);
- return g_simple_async_result_get_op_res_gpointer (simple);
+ gnome_keyring_find_items (GNOME_KEYRING_ITEM_GENERIC_SECRET,
+ match, find_items_cb, simple, NULL);
+
+ gnome_keyring_attribute_list_free (match);
}
+const gchar *
+empathy_keyring_get_account_password_finish (TpAccount *account,
+ GAsyncResult *result,
+ GError **error)
+{
+ empathy_implement_finish_return_pointer (account,
+ empathy_keyring_get_account_password_async);
+}
+
+const gchar *
+empathy_keyring_get_room_password_finish (TpAccount *account,
+ GAsyncResult *result,
+ GError **error)
+{
+ empathy_implement_finish_return_pointer (account,
+ empathy_keyring_get_room_password_async);
+}
+
+/* set */
+
static void
store_password_cb (GnomeKeyringResult result,
gpointer user_data)
@@ -134,7 +183,7 @@ store_password_cb (GnomeKeyringResult result,
}
void
-empathy_keyring_set_password_async (TpAccount *account,
+empathy_keyring_set_account_password_async (TpAccount *account,
const gchar *password,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -147,7 +196,7 @@ empathy_keyring_set_password_async (TpAccount *account,
g_return_if_fail (password != NULL);
simple = g_simple_async_result_new (G_OBJECT (account), callback,
- user_data, empathy_keyring_set_password_async);
+ user_data, empathy_keyring_set_account_password_async);
account_id = tp_proxy_get_object_path (account) +
strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
@@ -157,7 +206,7 @@ empathy_keyring_set_password_async (TpAccount *account,
name = g_strdup_printf ("IM account password for %s (%s)",
tp_account_get_display_name (account), account_id);
- gnome_keyring_store_password (&keyring_schema, NULL, name, password,
+ gnome_keyring_store_password (&account_keyring_schema, NULL, name, password,
store_password_cb, simple, NULL,
"account-id", account_id,
"param-name", "password",
@@ -166,27 +215,59 @@ empathy_keyring_set_password_async (TpAccount *account,
g_free (name);
}
-gboolean
-empathy_keyring_set_password_finish (TpAccount *account,
- GAsyncResult *result,
- GError **error)
+void
+empathy_keyring_set_room_password_async (TpAccount *account,
+ const gchar *id,
+ const gchar *password,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GSimpleAsyncResult *simple;
+ const gchar *account_id;
+ gchar *name;
- g_return_val_if_fail (TP_IS_ACCOUNT (account), FALSE);
- g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
+ g_return_if_fail (TP_IS_ACCOUNT (account));
+ g_return_if_fail (id != NULL);
+ g_return_if_fail (password != NULL);
+
+ simple = g_simple_async_result_new (G_OBJECT (account), callback,
+ user_data, empathy_keyring_set_room_password_async);
+
+ account_id = tp_proxy_get_object_path (account) +
+ strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
- simple = G_SIMPLE_ASYNC_RESULT (result);
+ DEBUG ("Remembering password for room '%s' on account '%s'", id, account_id);
- if (g_simple_async_result_propagate_error (simple, error))
- return FALSE;
+ name = g_strdup_printf ("Password for chatroom '%s' on account %s (%s)",
+ id, tp_account_get_display_name (account), account_id);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (account), empathy_keyring_set_password_async), FALSE);
+ gnome_keyring_store_password (&room_keyring_schema, NULL, name, password,
+ store_password_cb, simple, NULL,
+ "account-id", account_id,
+ "room-id", id,
+ NULL);
- return TRUE;
+ g_free (name);
+}
+
+gboolean
+empathy_keyring_set_account_password_finish (TpAccount *account,
+ GAsyncResult *result,
+ GError **error)
+{
+ empathy_implement_finish_void (account, empathy_keyring_set_account_password_async);
+}
+
+gboolean
+empathy_keyring_set_room_password_finish (TpAccount *account,
+ GAsyncResult *result,
+ GError **error)
+{
+ empathy_implement_finish_void (account, empathy_keyring_set_room_password_async);
}
+/* delete */
+
static void
item_delete_cb (GnomeKeyringResult result,
gpointer user_data)
@@ -234,7 +315,7 @@ find_item_to_delete_cb (GnomeKeyringResult result,
}
void
-empathy_keyring_delete_password_async (TpAccount *account,
+empathy_keyring_delete_account_password_async (TpAccount *account,
GAsyncReadyCallback callback,
gpointer user_data)
{
@@ -245,7 +326,7 @@ empathy_keyring_delete_password_async (TpAccount *account,
g_return_if_fail (TP_IS_ACCOUNT (account));
simple = g_simple_async_result_new (G_OBJECT (account), callback,
- user_data, empathy_keyring_delete_password_async);
+ user_data, empathy_keyring_delete_account_password_async);
account_id = tp_proxy_get_object_path (account) +
strlen (TP_ACCOUNT_OBJECT_PATH_BASE);
@@ -262,23 +343,10 @@ empathy_keyring_delete_password_async (TpAccount *account,
}
gboolean
-empathy_keyring_delete_password_finish (TpAccount *account,
+empathy_keyring_delete_account_password_finish (TpAccount *account,
GAsyncResult *result,
GError **error)
{
- GSimpleAsyncResult *simple;
-
- g_return_val_if_fail (TP_IS_ACCOUNT (account), FALSE);
- g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
-
- simple = G_SIMPLE_ASYNC_RESULT (result);
-
- if (g_simple_async_result_propagate_error (simple, error))
- return FALSE;
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (account), empathy_keyring_delete_password_async), FALSE);
-
- return TRUE;
+ empathy_implement_finish_void (account, empathy_keyring_delete_account_password_async);
}