[libgnome-keyring] Implement password/schema related functions.
- From: Stefan Walter <stefw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgnome-keyring] Implement password/schema related functions.
- Date: Sun, 6 Dec 2009 01:17:04 +0000 (UTC)
commit 2b32b5e101c6b31752e05aba49270a9a755d1fe5
Author: Stef Walter <stef memberwebs com>
Date: Sun Dec 6 01:16:51 2009 +0000
Implement password/schema related functions.
library/gkr-callback.c | 34 ++--
library/gkr-callback.h | 4 +
library/gnome-keyring.c | 510 ++++++++++++++++++++++++++---------------------
3 files changed, 302 insertions(+), 246 deletions(-)
---
diff --git a/library/gkr-callback.c b/library/gkr-callback.c
index 590a856..0e7abd9 100644
--- a/library/gkr-callback.c
+++ b/library/gkr-callback.c
@@ -82,6 +82,19 @@ gkr_callback_invoke_op_session (GkrCallback *cb, GkrSession *session)
((OpSessionCallback)(cb->callback)) (cb->operation, session, cb->user_data);
}
+typedef void (*OpStringCallback) (GkrOperation*, const gchar*, gpointer);
+
+void
+gkr_callback_invoke_op_string (GkrCallback *cb, const gchar *value)
+{
+ g_assert (cb);
+ g_assert (cb->type == GKR_CALLBACK_OP_SESSION);
+ g_assert (cb->callback);
+ g_assert (cb->operation);
+ cb->type = 0;
+ ((OpStringCallback)(cb->callback)) (cb->operation, value, cb->user_data);
+}
+
void
gkr_callback_invoke_res (GkrCallback *cb, GnomeKeyringResult res)
{
@@ -89,9 +102,8 @@ gkr_callback_invoke_res (GkrCallback *cb, GnomeKeyringResult res)
g_assert (cb);
g_assert (cb->callback);
- g_assert (cb->operation);
- if (!gkr_operation_set_result (cb->operation, res))
+ if (cb->operation && !gkr_operation_set_result (cb->operation, res))
return;
/* When successful can only call one kind of callback */
@@ -134,9 +146,8 @@ gkr_callback_invoke_ok_string (GkrCallback *cb, const gchar *value)
{
g_assert (cb);
g_assert (cb->type == GKR_CALLBACK_RES_STRING);
- g_assert (cb->operation);
cb->type = 0;
- if (gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
+ if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
((GnomeKeyringOperationGetStringCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
}
@@ -147,9 +158,8 @@ gkr_callback_invoke_ok_uint (GkrCallback *cb, guint32 value)
g_assert (cb);
g_assert (cb->type == GKR_CALLBACK_RES_UINT);
g_assert (cb->callback);
- g_assert (cb->operation);
cb->type = 0;
- if (gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
+ if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
((GnomeKeyringOperationGetIntCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
}
@@ -159,9 +169,8 @@ gkr_callback_invoke_ok_list (GkrCallback *cb, GList *value)
g_assert (cb);
g_assert (cb->type == GKR_CALLBACK_RES_LIST);
g_assert (cb->callback);
- g_assert (cb->operation);
cb->type = 0;
- if (gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
+ if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
((GnomeKeyringOperationGetListCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
}
@@ -171,9 +180,8 @@ gkr_callback_invoke_ok_keyring_info (GkrCallback *cb, GnomeKeyringInfo *value)
g_assert (cb);
g_assert (cb->type == GKR_CALLBACK_RES_KEYRING_INFO);
g_assert (cb->callback);
- g_assert (cb->operation);
cb->type = 0;
- if (gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
+ if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
((GnomeKeyringOperationGetKeyringInfoCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
}
@@ -183,9 +191,8 @@ gkr_callback_invoke_ok_item_info (GkrCallback *cb, GnomeKeyringItemInfo *value)
g_assert (cb);
g_assert (cb->type == GKR_CALLBACK_RES_ITEM_INFO);
g_assert (cb->callback);
- g_assert (cb->operation);
cb->type = 0;
- if (gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
+ if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
((GnomeKeyringOperationGetItemInfoCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
}
@@ -195,8 +202,7 @@ gkr_callback_invoke_ok_attributes (GkrCallback *cb, GnomeKeyringAttributeList *v
g_assert (cb);
g_assert (cb->type == GKR_CALLBACK_RES_ATTRIBUTES);
g_assert (cb->callback);
- g_assert (cb->operation);
cb->type = 0;
- if (gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
+ if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
((GnomeKeyringOperationGetAttributesCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
}
diff --git a/library/gkr-callback.h b/library/gkr-callback.h
index e74247b..1c66cbf 100644
--- a/library/gkr-callback.h
+++ b/library/gkr-callback.h
@@ -36,6 +36,7 @@ typedef struct _GkrSession GkrSession;
typedef enum {
GKR_CALLBACK_OP_MSG = 1,
GKR_CALLBACK_OP_SESSION,
+ GKR_CALLBACK_OP_STRING,
GKR_CALLBACK_RES,
GKR_CALLBACK_RES_STRING,
GKR_CALLBACK_RES_UINT,
@@ -70,6 +71,9 @@ void gkr_callback_invoke_op_msg (GkrCallback *cb,
void gkr_callback_invoke_op_session (GkrCallback *cb,
GkrSession *session);
+void gkr_callback_invoke_op_string (GkrCallback *cb,
+ const gchar *value);
+
void gkr_callback_invoke_res (GkrCallback *cb,
GnomeKeyringResult res);
diff --git a/library/gnome-keyring.c b/library/gnome-keyring.c
index f369ec2..99638aa 100644
--- a/library/gnome-keyring.c
+++ b/library/gnome-keyring.c
@@ -101,6 +101,26 @@ prepare_property_getall (const gchar *path, const gchar *interface)
}
static DBusMessage*
+prepare_get_secret (GkrSession *session, const char *path)
+{
+ DBusMessage *req;
+ const gchar *spath;
+
+ g_assert (session);
+ g_assert (path);
+
+ req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+ ITEM_INTERFACE, "GetSecret");
+ g_return_val_if_fail (req, NULL);
+
+ spath = gkr_session_get_path (session);
+ if (!dbus_message_append_args (req, DBUS_TYPE_OBJECT_PATH, &spath, DBUS_TYPE_INVALID))
+ g_return_val_if_reached (NULL);
+
+ return req;
+}
+
+static DBusMessage*
prepare_get_secrets (GkrSession *session, char **paths, int n_paths)
{
DBusMessage *req;
@@ -135,6 +155,18 @@ prepare_xlock (const char *action, char **objects, int n_objects)
return req;
}
+static DBusMessage*
+prepare_delete (const char *path)
+{
+ DBusMessage *req;
+
+ req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+ COLLECTION_INTERFACE, "Delete");
+ g_return_val_if_fail (req, NULL);
+
+ return req;
+}
+
static void
encode_object_identifier (GString *string, const gchar* name, gssize length)
{
@@ -3540,14 +3572,18 @@ find_network_password_sync (GnomeKeyringResult res, GList *list, gpointer user_d
static void
find_network_password_filter (GnomeKeyringResult res, GList *found_list, gpointer user_data)
{
- GkrOperation *op = user_data;
+ GkrCallback *cb = user_data;
GnomeKeyringNetworkPasswordData *data;
GnomeKeyringFound *found;
GnomeKeyringAttribute *attributes;
GList *result, *l;
- GkrCallback *cb;
int i;
+ if (res != GNOME_KEYRING_RESULT_OK) {
+ gkr_callback_invoke_res (cb, res);
+ return;
+ }
+
result = NULL;
for (l = found_list; l != NULL; l = l->next) {
found = l->data;
@@ -3589,7 +3625,6 @@ find_network_password_filter (GnomeKeyringResult res, GList *found_list, gpointe
}
result = g_list_reverse (result);
- cb = gkr_operation_pop (op);
gkr_callback_invoke_ok_list (cb, result);
if (cb->callback != find_network_password_sync)
gnome_keyring_network_password_list_free (result);
@@ -3664,13 +3699,14 @@ gnome_keyring_find_network_password (const char
{
GnomeKeyringAttributeList *attributes;
GkrOperation *op;
+ GkrCallback *cb;
attributes = make_attribute_list_for_network_password (user, domain, server, object,
protocol, authtype, port);
+ cb = gkr_callback_new (NULL, callback, GKR_CALLBACK_RES_LIST, user_data, destroy_data);
op = gnome_keyring_find_items (GNOME_KEYRING_ITEM_NETWORK_PASSWORD, attributes,
- callback, user_data, destroy_data);
- gkr_operation_filter (op, find_network_password_filter, GKR_CALLBACK_RES_LIST);
+ find_network_password_filter, cb, gkr_callback_free);
gnome_keyring_attribute_list_free (attributes);
return op;
@@ -3953,7 +3989,6 @@ const GnomeKeyringPasswordSchema *GNOME_KEYRING_NETWORK_PASSWORD = &network_pass
* </para>
**/
-#if 0
static GnomeKeyringAttributeList*
schema_attribute_list_va (const GnomeKeyringPasswordSchema *schema, va_list args)
{
@@ -4006,7 +4041,13 @@ schema_attribute_list_va (const GnomeKeyringPasswordSchema *schema, va_list args
return attributes;
}
-#endif
+
+static void
+store_password_filter (GnomeKeyringResult res, guint32 item_id, gpointer user_data)
+{
+ GkrCallback *cb = user_data;
+ gkr_callback_invoke_res (cb, res);
+}
/**
* gnome_keyring_store_password:
@@ -4042,30 +4083,21 @@ gnome_keyring_store_password (const GnomeKeyringPasswordSchema* schema, const gc
GnomeKeyringOperationDoneCallback callback,
gpointer data, GDestroyNotify destroy_data, ...)
{
-#if 0
GnomeKeyringAttributeList *attributes;
- GnomeKeyringOperation *op;
+ GkrOperation *op;
+ GkrCallback *cb;
va_list args;
va_start (args, destroy_data);
attributes = schema_attribute_list_va (schema, args);
va_end (args);
- op = gkr_operation_new (FALSE, callback, GKR_CALLBACK_RES, data, destroy_data);
-
- /* Automatically secures buffer */
- if (!attributes || !attributes->len ||
- !gkr_proto_encode_create_item (&op->send_buffer, keyring, display_name,
- attributes, password, schema->item_type, TRUE))
- schedule_op_failed (op, GNOME_KEYRING_RESULT_BAD_ARGUMENTS);
+ cb = gkr_callback_new (NULL, callback, GKR_CALLBACK_RES, data, destroy_data);
+ op = gnome_keyring_item_create (keyring, schema->item_type, display_name, attributes,
+ password, TRUE, store_password_filter, cb, gkr_callback_free);
- op->reply_handler = standard_reply;
- g_array_free (attributes, TRUE);
- start_and_take_operation (op);
+ gnome_keyring_attribute_list_free (attributes);
return op;
-#endif
- g_assert (FALSE && "TODO");
- return NULL;
}
/**
@@ -4102,7 +4134,6 @@ GnomeKeyringResult
gnome_keyring_store_password_sync (const GnomeKeyringPasswordSchema* schema, const gchar *keyring,
const gchar *display_name, const gchar *password, ...)
{
-#if 0
GnomeKeyringAttributeList *attributes;
GnomeKeyringResult res;
guint32 item_id;
@@ -4120,9 +4151,6 @@ gnome_keyring_store_password_sync (const GnomeKeyringPasswordSchema* schema, con
g_array_free (attributes, TRUE);
return res;
-#endif
- g_assert (FALSE && "TODO");
- return 0;
}
#if 0
@@ -4152,6 +4180,188 @@ find_password_reply (GnomeKeyringOperation *op)
}
#endif
+static gboolean
+find_unlocked_first (const char *path, gpointer user_data)
+{
+ const char **result = user_data;
+ *result = path;
+ return FALSE;
+}
+
+static void
+find_unlocked_3_reply (GkrOperation *op, DBusMessage *reply, gpointer data)
+{
+ gboolean dismissed;
+ const char *item = NULL;
+
+ /* At this point Prompt has Completed, and should contain a list of unlocked items */
+
+ if (gkr_operation_handle_errors (op, reply))
+ return;
+
+ if (!decode_xlock_completed (reply, &dismissed, find_unlocked_first, &item)) {
+ gkr_operation_complete (op, decode_invalid_response (reply));
+ return;
+ }
+
+ gkr_callback_invoke_ok_string (gkr_operation_pop (op), item);
+}
+
+static void
+find_unlocked_2_reply (GkrOperation *op, DBusMessage *reply, gpointer data)
+{
+ const char *prompt;
+ const char *item = NULL;
+
+ /* At this point Unlock has returned a list of unlocked items, plus prompt? */
+
+ if (gkr_operation_handle_errors (op, reply))
+ return;
+
+ if (!decode_xlock_reply (reply, &prompt, find_unlocked_first, &item)) {
+ gkr_operation_complete (op, decode_invalid_response (reply));
+ return;
+ }
+
+ /* Need to show prompt to find an unlocked item */
+ if (!item && !g_str_equal (prompt, "/")) {
+ gkr_operation_push (op, find_unlocked_3_reply, GKR_CALLBACK_OP_MSG, NULL, NULL);
+ gkr_operation_prompt (op, prompt);
+ return;
+ }
+
+ gkr_callback_invoke_ok_string (gkr_operation_pop (op), item);
+}
+
+static void
+find_unlocked_1_reply (GkrOperation *op, DBusMessage *reply, gpointer data)
+{
+ char **unlocked, **locked;
+ int n_unlocked, n_locked;
+ DBusMessage *req;
+
+ /* At this point SearchItems has returned two lists of locked/unlocked items */
+
+ if (gkr_operation_handle_errors (op, reply))
+ return;
+
+ if (!dbus_message_get_args (reply, NULL,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &unlocked, &n_unlocked,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &locked, &n_locked)) {
+ gkr_operation_complete (op, decode_invalid_response (reply));
+ return;
+ }
+
+ /* Do we have an unlocked item? */
+ if (n_unlocked) {
+ gkr_callback_invoke_ok_string (gkr_operation_pop (op), unlocked[0]);
+
+ /* Do we have any to unlock? */
+ } else if (n_locked) {
+ req = prepare_xlock ("Unlock", locked, n_locked);
+ g_return_if_fail (req);
+ gkr_operation_push (op, find_unlocked_2_reply, GKR_CALLBACK_OP_MSG, NULL, NULL);
+ gkr_operation_request (op, req);
+
+ /* No passwords at all, complete */
+ } else {
+ gkr_callback_invoke_ok_string (gkr_operation_pop (op), NULL);
+ }
+
+ dbus_free_string_array (locked);
+ dbus_free_string_array (unlocked);
+}
+
+static void
+find_unlocked (GkrOperation *op, GnomeKeyringAttributeList *attributes)
+{
+ DBusMessageIter iter;
+ DBusMessage *req;
+
+ req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+ SERVICE_INTERFACE, "SearchItems");
+ g_return_if_fail (req);
+
+ /* Encode the attribute list */
+ dbus_message_iter_init_append (req, &iter);
+ encode_attribute_list (&iter, attributes);
+
+ gkr_operation_push (op, find_unlocked_1_reply, GKR_CALLBACK_OP_MSG, NULL, NULL);
+ gkr_operation_request (op, req);
+ dbus_message_unref (req);
+}
+
+static void
+find_password_sync (GnomeKeyringResult res, const gchar *secret, gpointer user_data)
+{
+ gchar **result = user_data;
+ *result = (gchar*)secret;
+}
+
+static void
+find_password_3_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data)
+{
+ GkrSession *session = user_data;
+ DBusMessageIter iter;
+ GkrCallback *cb;
+ gchar *secret;
+
+ if (!gkr_operation_handle_errors (op, reply))
+ return;
+
+ if (!dbus_message_iter_init (reply, &iter) ||
+ !gkr_session_decode_secret (session, &iter, &secret)) {
+ gkr_operation_complete (op, decode_invalid_response (reply));
+ return;
+ }
+
+ cb = gkr_operation_pop (op);
+ gkr_callback_invoke_ok_string (cb, secret);
+ if (cb->callback != find_password_sync)
+ egg_secure_strfree (secret);
+}
+
+static void
+find_password_2_reply (GkrOperation *op, GkrSession *session, gpointer user_data)
+{
+ gchar *path = user_data;
+ DBusMessage *req;
+
+ req = prepare_get_secret (session, path);
+ g_return_if_fail (req);
+
+ gkr_operation_push (op, find_password_3_reply, GKR_CALLBACK_OP_MSG,
+ gkr_session_ref (session), gkr_session_unref);
+ gkr_operation_request (op, req);
+ dbus_message_unref (req);
+}
+
+static void
+find_password_1_reply (GkrOperation *op, const char *path, gpointer user_data)
+{
+ /* We need a session to get the secret for this item */
+ gkr_operation_push (op, find_password_2_reply, GKR_CALLBACK_OP_SESSION,
+ g_strdup (path), g_free);
+ gkr_session_negotiate (op);
+}
+
+static GkrOperation*
+find_password_va (const GnomeKeyringPasswordSchema* schema, va_list va,
+ GnomeKeyringOperationGetStringCallback callback,
+ gpointer data, GDestroyNotify destroy_data)
+{
+ GnomeKeyringAttributeList *attributes;
+ GkrOperation *op;
+
+ attributes = schema_attribute_list_va (schema, va);
+
+ op = gkr_operation_new (callback, GKR_CALLBACK_RES_STRING, data, destroy_data);
+ gkr_operation_push (op, find_password_1_reply, GKR_CALLBACK_OP_STRING, NULL, NULL);
+ find_unlocked (op, attributes);
+ gkr_operation_unref (op);
+ return op;
+}
+
/**
* gnome_keyring_find_password:
* @schema: The password schema.
@@ -4182,29 +4392,14 @@ gnome_keyring_find_password (const GnomeKeyringPasswordSchema* schema,
GnomeKeyringOperationGetStringCallback callback,
gpointer data, GDestroyNotify destroy_data, ...)
{
-#if 0
- GnomeKeyringOperation *op;
- GnomeKeyringAttributeList *attributes;
- va_list args;
-
- op = gkr_operation_new (TRUE, callback, GKR_CALLBACK_RES_STRING, data, destroy_data);
-
- va_start (args, destroy_data);
- attributes = schema_attribute_list_va (schema, args);
- va_end (args);
+ GkrOperation *op;
+ va_list va;
- if (!attributes || !attributes->len ||
- !gkr_proto_encode_find (&op->send_buffer, schema->item_type, attributes))
- schedule_op_failed (op, GNOME_KEYRING_RESULT_BAD_ARGUMENTS);
+ va_start (va, destroy_data);
+ op = find_password_va (schema, va, callback, data, destroy_data);
+ va_end (va);
- g_array_free (attributes, TRUE);
-
- op->reply_handler = find_password_reply;
- start_and_take_operation (op);
return op;
-#endif
- g_assert (FALSE && "TODO");
- return NULL;
}
/**
@@ -4235,137 +4430,44 @@ gnome_keyring_find_password (const GnomeKeyringPasswordSchema* schema,
GnomeKeyringResult
gnome_keyring_find_password_sync(const GnomeKeyringPasswordSchema* schema, gchar **password, ...)
{
-#if 0
- GnomeKeyringAttributeList *attributes;
- GnomeKeyringResult res;
- GnomeKeyringFound *f;
- GList* found = NULL;
- va_list args;
-
- va_start (args, password);
- attributes = schema_attribute_list_va (schema, args);
- va_end (args);
-
- if (!attributes || !attributes->len)
- res = GNOME_KEYRING_RESULT_BAD_ARGUMENTS;
- else
- res = gnome_keyring_find_items_sync (schema->item_type, attributes, &found);
-
- g_array_free (attributes, TRUE);
+ GkrOperation *op;
+ va_list va;
- if (password && res == GNOME_KEYRING_RESULT_OK) {
- *password = NULL;
- if (g_list_length (found) > 0) {
- f = (GnomeKeyringFound*)(found->data);
- *password = f->secret;
- f->secret = NULL;
- }
- }
+ va_start (va, password);
+ op = find_password_va (schema, va, find_password_sync, password, NULL);
+ va_end (va);
- gnome_keyring_found_list_free (found);
- return res;
-#endif
- g_assert (FALSE && "TODO");
- return 0;
+ return gkr_operation_block (op);
}
-#if 0
-typedef struct _DeletePassword {
- GList *found;
- GList *at;
- guint non_session;
- guint deleted;
-} DeletePassword;
-
static void
-delete_password_destroy (gpointer data)
+delete_password_reply (GkrOperation *op, const char *path, gpointer user_data)
{
- DeletePassword *dp = (DeletePassword*)data;
- gnome_keyring_found_list_free (dp->found);
- g_free (dp);
-}
-
-static gboolean
-delete_password_reply (GnomeKeyringOperation *op)
-{
- GnomeKeyringResult result;
- GnomeKeyringOperationDoneCallback callback;
- GnomeKeyringFound *f;
- DeletePassword *dp;
-
- g_assert (op->user_callback_type == GKR_CALLBACK_RES);
- callback = op->user_callback;
-
- dp = op->reply_data;
- g_assert (dp);
-
- /* The result of the find */
- if (!dp->found) {
- if (!gkr_proto_decode_find_reply (&op->receive_buffer, &result, &dp->found))
- result = GNOME_KEYRING_RESULT_IO_ERROR;
-
- /* On the first item */
- dp->at = dp->found;
-
- /* The result of a delete */
- } else {
- if (!gkr_proto_decode_find_reply (&op->receive_buffer, &result, &dp->found))
- result = GNOME_KEYRING_RESULT_IO_ERROR;
-
- ++dp->deleted;
- }
-
- /* Stop on any failure */
- if (result != GNOME_KEYRING_RESULT_OK) {
- (*callback) (result, op->user_data);
- return TRUE; /* GkrOperation is done */
- }
-
- /* Iterate over list and find next item to delete */
- while (dp->at) {
- f = (GnomeKeyringFound*)(dp->at->data);
- dp->at = g_list_next (dp->at);
-
- /* If not an item in the session keyring ... */
- if (!f->keyring || strcmp (f->keyring, GNOME_KEYRING_SESSION) != 0) {
-
- ++dp->non_session;
-
- /* ... then we only delete one of those */
- if (dp->non_session > 1)
- continue;
- }
+ DBusMessage *req;
- /* Reset the operation into a delete */
- start_and_take_operation (op);
+ req = prepare_delete (path);
+ g_return_if_fail (req);
- egg_buffer_reset (&op->send_buffer);
- if (!gkr_proto_encode_op_string_int (&op->send_buffer, GNOME_KEYRING_OP_DELETE_ITEM,
- f->keyring, f->item_id)) {
- /*
- * This would happen if the server somehow sent us an invalid
- * keyring and item_id. Very unlikely, and it seems this is
- * the best error code in this case.
- */
- (*callback) (GNOME_KEYRING_RESULT_IO_ERROR, op->user_data);
- return TRUE;
- }
+ gkr_operation_request (op, req);
+ dbus_message_unref (req);
+}
- /*
- * The delete operation is ready for processing, by returning
- * FALSE we indicate that the operation is not complete.
- */
- return FALSE;
- }
+static GkrOperation*
+delete_password_va (const GnomeKeyringPasswordSchema* schema, va_list va,
+ GnomeKeyringOperationDoneCallback callback,
+ gpointer data, GDestroyNotify destroy_data)
+{
+ GnomeKeyringAttributeList *attributes;
+ GkrOperation *op;
- /* Nothing more to find */
- g_assert (!dp->at);
+ attributes = schema_attribute_list_va (schema, va);
- /* GkrOperation is done */
- (*callback) (dp->deleted > 0 ? GNOME_KEYRING_RESULT_OK : GNOME_KEYRING_RESULT_NO_MATCH, op->user_data);
- return TRUE;
+ op = gkr_operation_new (callback, GKR_CALLBACK_RES_STRING, data, destroy_data);
+ gkr_operation_push (op, delete_password_reply, GKR_CALLBACK_OP_STRING, NULL, NULL);
+ find_unlocked (op, attributes);
+ gkr_operation_unref (op);
+ return op;
}
-#endif
/**
* gnome_keyring_delete_password:
@@ -4394,31 +4496,14 @@ gnome_keyring_delete_password (const GnomeKeyringPasswordSchema* schema,
GnomeKeyringOperationDoneCallback callback,
gpointer data, GDestroyNotify destroy_data, ...)
{
-#if 0
- GnomeKeyringOperation *op;
- GnomeKeyringAttributeList *attributes;
- va_list args;
-
- op = gkr_operation_new (TRUE, callback, GKR_CALLBACK_RES, data, destroy_data);
-
- va_start (args, destroy_data);
- attributes = schema_attribute_list_va (schema, args);
- va_end (args);
- if (!attributes || !attributes->len ||
- !gkr_proto_encode_find (&op->send_buffer, schema->item_type, attributes))
- schedule_op_failed (op, GNOME_KEYRING_RESULT_BAD_ARGUMENTS);
-
- g_array_free (attributes, TRUE);
+ GkrOperation *op;
+ va_list va;
- op->reply_handler = delete_password_reply;
- op->reply_data = g_new0 (DeletePassword, 1);
- op->destroy_reply_data = delete_password_destroy;
+ va_start (va, destroy_data);
+ op = delete_password_va (schema, va, callback, data, destroy_data);
+ va_end (va);
- start_and_take_operation (op);
return op;
-#endif
- g_assert (FALSE && "TODO");
- return NULL;
}
/**
@@ -4447,51 +4532,12 @@ gnome_keyring_delete_password (const GnomeKeyringPasswordSchema* schema,
GnomeKeyringResult
gnome_keyring_delete_password_sync (const GnomeKeyringPasswordSchema* schema, ...)
{
-#if 0
- GnomeKeyringAttributeList *attributes;
- GnomeKeyringResult res;
- GnomeKeyringFound *f;
- GList *found, *l;
- va_list args;
- guint non_session;
-
- va_start (args, schema);
- attributes = schema_attribute_list_va (schema, args);
- va_end (args);
-
- if (!attributes || !attributes->len)
- res = GNOME_KEYRING_RESULT_BAD_ARGUMENTS;
-
- /* Find the item(s) in question */
- else
- res = gnome_keyring_find_items_sync (schema->item_type, attributes, &found);
-
- g_array_free (attributes, TRUE);
- if (res != GNOME_KEYRING_RESULT_OK)
- return res;
-
- non_session = 0;
- for (l = found; l; l = g_list_next (l)) {
- f = (GnomeKeyringFound*)(l->data);
-
- /* If not an item in the session keyring ... */
- if (!f->keyring || strcmp (f->keyring, GNOME_KEYRING_SESSION) != 0) {
-
- ++non_session;
-
- /* ... then we only delete one of those */
- if (non_session > 1)
- continue;
- }
+ GkrOperation *op;
+ va_list va;
- res = gnome_keyring_item_delete_sync (f->keyring, f->item_id);
- if (res != GNOME_KEYRING_RESULT_OK)
- break;
- }
+ va_start (va, schema);
+ op = delete_password_va (schema, va, gkr_callback_empty, NULL, NULL);
+ va_end (va);
- gnome_keyring_found_list_free (found);
- return res;
-#endif
- g_assert (FALSE && "TODO");
- return 0;
+ return gkr_operation_block (op);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]