[gnome-keyring/dbus-api] [dbus] Implement Service.GetSecrets().
- From: Stefan Walter <stefw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-keyring/dbus-api] [dbus] Implement Service.GetSecrets().
- Date: Mon, 14 Dec 2009 01:58:19 +0000 (UTC)
commit 6aee0b1973d4591d3e925b01289cc7b1e52bbd06
Author: Stef Walter <stef memberwebs com>
Date: Sun Dec 13 00:42:00 2009 +0000
[dbus] Implement Service.GetSecrets().
daemon/dbus/gkd-secret-objects.c | 115 ++++++++++++++++++++++++++++++++++++++
daemon/dbus/gkd-secret-objects.h | 7 ++
daemon/dbus/gkd-secret-service.c | 4 +
3 files changed, 126 insertions(+), 0 deletions(-)
---
diff --git a/daemon/dbus/gkd-secret-objects.c b/daemon/dbus/gkd-secret-objects.c
index 662cdc3..43be196 100644
--- a/daemon/dbus/gkd-secret-objects.c
+++ b/daemon/dbus/gkd-secret-objects.c
@@ -1062,6 +1062,51 @@ gkd_secret_objects_lookup_collection (GkdSecretObjects *self, const gchar *calle
return object;
}
+GP11Object*
+gkd_secret_objects_lookup_item (GkdSecretObjects *self, const gchar *caller,
+ const gchar *path)
+{
+ GP11Object *object = NULL;
+ GError *error = NULL;
+ GList *objects;
+ GP11Session *session;
+ gchar *collection;
+ gchar *identifier;
+
+ g_return_val_if_fail (GKD_SECRET_IS_OBJECTS (self), NULL);
+ g_return_val_if_fail (caller, NULL);
+ g_return_val_if_fail (path, NULL);
+
+ if (!parse_object_path (self, path, &collection, &identifier))
+ return NULL;
+
+ /* The session we're using to access the object */
+ session = gkd_secret_service_get_pkcs11_session (self->service, caller);
+ g_return_val_if_fail (session, NULL);
+
+ objects = gp11_session_find_objects (session, &error,
+ CKA_CLASS, GP11_ULONG, CKO_SECRET_KEY,
+ CKA_ID, strlen (identifier), identifier,
+ CKA_G_COLLECTION, strlen (collection), collection,
+ GP11_INVALID);
+
+ g_free (identifier);
+ g_free (collection);
+
+ if (error != NULL) {
+ g_warning ("couldn't lookup item: %s: %s", path, error->message);
+ g_clear_error (&error);
+ }
+
+ if (objects) {
+ object = g_object_ref (objects->data);
+ gp11_object_set_session (object, session);
+ }
+
+ gp11_list_unref_free (objects);
+ return object;
+}
+
void
gkd_secret_objects_append_item_paths (GkdSecretObjects *self, const gchar *base,
DBusMessageIter *iter, DBusMessage *message)
@@ -1228,6 +1273,76 @@ gkd_secret_objects_handle_search_items (GkdSecretObjects *self, DBusMessage *mes
return reply;
}
+DBusMessage*
+gkd_secret_objects_handle_get_secrets (GkdSecretObjects *self, DBusMessage *message)
+{
+ DBusError derr = DBUS_ERROR_INIT;
+ GkdSecretSession *session;
+ GkdSecretSecret *secret;
+ DBusMessage *reply;
+ GP11Object *item;
+ DBusMessageIter iter, array, dict;
+ const char *session_path;
+ const char *caller;
+ char **paths;
+ int n_paths, i;
+
+ if (!dbus_message_get_args (message, NULL,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &n_paths,
+ DBUS_TYPE_OBJECT_PATH, &session_path,
+ DBUS_TYPE_INVALID))
+ return NULL;
+
+ caller = dbus_message_get_sender (message);
+ g_return_val_if_fail (caller, NULL);
+
+ session = gkd_secret_service_lookup_session (self->service, session_path, caller);
+ if (session == NULL)
+ return dbus_message_new_error (message, SECRET_ERROR_NO_SESSION,
+ "No such session exists");
+
+ reply = dbus_message_new_method_return (message);
+ dbus_message_iter_init_append (reply, &iter);
+ dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{o(oayay)}", &array);
+
+ for (i = 0; i < n_paths; ++i) {
+
+ /* Try to find the item, if it doesn't exist, just ignore */
+ item = gkd_secret_objects_lookup_item (self, caller, paths[i]);
+ if (!item)
+ continue;
+
+ secret = gkd_secret_session_get_item_secret (session, item, &derr);
+ g_object_unref (item);
+
+ if (secret == NULL) {
+ /* We ignore is locked, and just leave out from response */
+ if (dbus_error_has_name (&derr, SECRET_ERROR_IS_LOCKED)) {
+ dbus_error_free (&derr);
+ continue;
+
+ /* All other errors stop the operation */
+ } else {
+ dbus_message_unref (reply);
+ reply = dbus_message_new_error (message, derr.name, derr.message);
+ dbus_error_free (&derr);
+ break;
+ }
+ }
+
+ dbus_message_iter_open_container (&array, DBUS_TYPE_DICT_ENTRY, NULL, &dict);
+ dbus_message_iter_append_basic (&dict, DBUS_TYPE_OBJECT_PATH, &(paths[i]));
+ gkd_secret_secret_append (secret, &dict);
+ gkd_secret_secret_free (secret);
+ dbus_message_iter_close_container (&array, &dict);
+ }
+
+ if (i == n_paths)
+ dbus_message_iter_close_container (&iter, &array);
+ dbus_free_string_array (paths);
+
+ return reply;
+}
const gchar*
gkd_secret_objects_get_alias (GkdSecretObjects *self, const gchar *alias)
diff --git a/daemon/dbus/gkd-secret-objects.h b/daemon/dbus/gkd-secret-objects.h
index 8b4dcda..485f830 100644
--- a/daemon/dbus/gkd-secret-objects.h
+++ b/daemon/dbus/gkd-secret-objects.h
@@ -52,6 +52,9 @@ DBusMessage* gkd_secret_objects_handle_search_items (GkdSecretObjec
DBusMessage *message,
const gchar *base);
+DBusMessage* gkd_secret_objects_handle_get_secrets (GkdSecretObjects *self,
+ DBusMessage *message);
+
void gkd_secret_objects_append_collection_paths (GkdSecretObjects *self,
DBusMessageIter *iter,
DBusMessage *message);
@@ -67,6 +70,10 @@ GP11Object* gkd_secret_objects_lookup_collection (GkdSecretObjec
const gchar *caller,
const gchar *path);
+GP11Object* gkd_secret_objects_lookup_item (GkdSecretObjects *self,
+ const gchar *caller,
+ const gchar *path);
+
const gchar* gkd_secret_objects_get_alias (GkdSecretObjects *self,
const gchar *alias);
diff --git a/daemon/dbus/gkd-secret-service.c b/daemon/dbus/gkd-secret-service.c
index 96e5496..ace3e6e 100644
--- a/daemon/dbus/gkd-secret-service.c
+++ b/daemon/dbus/gkd-secret-service.c
@@ -631,6 +631,10 @@ service_message_handler (GkdSecretService *self, DBusMessage *message)
if (dbus_message_is_method_call (message, SECRET_SERVICE_INTERFACE, "SearchItems"))
return gkd_secret_objects_handle_search_items (self->objects, message, NULL);
+ /* org.freedesktop.Secret.Service.GetSecrets() */
+ if (dbus_message_is_method_call (message, SECRET_SERVICE_INTERFACE, "GetSecrets"))
+ return gkd_secret_objects_handle_get_secrets (self->objects, message);
+
/* org.freedesktop.Secret.Service.Unlock() */
if (dbus_message_is_method_call (message, SECRET_SERVICE_INTERFACE, "Unlock"))
return service_method_unlock (self, message);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]