[gnome-keyring/dbus-api] [dbus] Implement Collections proprerty on Service.



commit 773eb970105edba605800465726d3fd7d5a237fb
Author: Stef Walter <stef memberwebs com>
Date:   Sun Aug 23 17:43:27 2009 +0000

    [dbus] Implement Collections proprerty on Service.
    
    Implement Service.Collections and reorganize how we look up
    object paths.

 daemon/dbus/gkd-secrets-objects.c |  235 ++++++++++++++++++++++---------------
 daemon/dbus/gkd-secrets-objects.h |   17 ++-
 daemon/dbus/gkd-secrets-service.c |   84 +++++++++++--
 3 files changed, 226 insertions(+), 110 deletions(-)
---
diff --git a/daemon/dbus/gkd-secrets-objects.c b/daemon/dbus/gkd-secrets-objects.c
index 5c57d65..c30b18e 100644
--- a/daemon/dbus/gkd-secrets-objects.c
+++ b/daemon/dbus/gkd-secrets-objects.c
@@ -583,89 +583,6 @@ collection_get_identifier (GP11Object *coll)
 	return g_object_get_data (G_OBJECT (coll), "coll-identifier");
 }
 
-static GList*
-collection_lookup_items (GP11Object *coll)
-{
-	GP11Session *session;
-	const gchar *coll_id;
-	GError *error = NULL;
-	GList *l, *objects;
-
-	session = gp11_object_get_session (coll);
-	coll_id = collection_get_identifier (coll);
-	g_return_val_if_fail (session && coll, NULL);
-
-	objects = gp11_session_find_objects (session, &error,
-	                                     CKA_CLASS, GP11_ULONG, CKO_SECRET_KEY,
-	                                     CKA_G_COLLECTION, strlen (coll_id), coll_id,
-	                                     GP11_INVALID);
-
-	if (error != NULL) {
-		g_warning ("couldn't lookup items in '%s' collection: %s", coll_id, error->message);
-		g_clear_error (&error);
-		return NULL;
-	}
-
-	for (l = objects; l; l = g_list_next (l))
-		gp11_object_set_session (l->data, session);
-
-	return objects;
-}
-
-static void
-collection_append_item_paths (DBusMessageIter *iter, GP11Object *coll)
-{
-	DBusMessageIter variant;
-	gchar *prefix, *suffix;
-	DBusMessageIter array;
-	const gchar *coll_id;
-	GError *error = NULL;
-	guchar *data;
-	gsize n_data;
-	gchar *path;
-	GList *items, *l;
-
-	g_assert (iter);
-	g_assert (coll);
-
-	items = collection_lookup_items (coll);
-
-	coll_id = collection_get_identifier (coll);
-	g_return_if_fail (coll);
-	prefix = encode_object_identifier (coll_id, -1);
-
-	dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "ao", &variant);
-	dbus_message_iter_open_container (&variant, DBUS_TYPE_ARRAY, "o", &array);
-
-	for (l = items; l; l = g_list_next (l)) {
-
-		/* Dig out the raw item identifier */
-		data = gp11_object_get_data (l->data, CKA_ID, &n_data, &error);
-		if (error != NULL) {
-			g_warning ("couldn't retrieve item id: %s", error->message);
-			g_clear_error (&error);
-			continue;
-		}
-
-		/* Build up the object path */
-		suffix = encode_object_identifier ((gchar*)data, n_data);
-		path = g_strconcat (SECRETS_COLLECTION_PREFIX, "/", prefix, "/", suffix, NULL);
-		g_free (suffix);
-
-		g_free (data);
-
-		dbus_message_iter_append_basic (&array, DBUS_TYPE_OBJECT_PATH, &path);
-		g_free (path);
-	}
-
-	dbus_message_iter_close_container (&variant, &array);
-	dbus_message_iter_close_container (iter, &variant);
-
-	g_free (prefix);
-
-	gp11_list_unref_free (items);
-}
-
 static GP11Object*
 collection_for_identifier (GP11Session *session, const gchar *coll_id)
 {
@@ -703,7 +620,7 @@ collection_for_identifier (GP11Session *session, const gchar *coll_id)
 }
 
 static DBusMessage*
-collection_property_get (GP11Object *object, DBusMessage *message)
+collection_property_get (GkdSecretsObjects *self, GP11Object *object, DBusMessage *message)
 {
 	DBusMessageIter iter;
 	DBusMessage *reply;
@@ -719,7 +636,8 @@ collection_property_get (GP11Object *object, DBusMessage *message)
 	if (g_str_equal (name, "Items")) {
 		reply = dbus_message_new_method_return (message);
 		dbus_message_iter_init_append (reply, &iter);
-		collection_append_item_paths (&iter, object);
+		gkd_secrets_objects_append_item_paths (self, &iter, message,
+		                                       collection_get_identifier (object));
 		return reply;
 	}
 
@@ -727,13 +645,13 @@ collection_property_get (GP11Object *object, DBusMessage *message)
 }
 
 static DBusMessage*
-collection_property_set (GP11Object *object, DBusMessage *message)
+collection_property_set (GkdSecretsObjects *self, GP11Object *object, DBusMessage *message)
 {
 	g_return_val_if_reached (NULL); /* TODO: Need to implement */
 }
 
 static DBusMessage*
-collection_property_getall (GP11Object *object, DBusMessage *message)
+collection_property_getall (GkdSecretsObjects *self, GP11Object *object, DBusMessage *message)
 {
 	GP11Attributes *attrs;
 	DBusMessageIter iter;
@@ -772,7 +690,8 @@ collection_property_getall (GP11Object *object, DBusMessage *message)
 	dbus_message_iter_open_container (&array, DBUS_TYPE_DICT_ENTRY, NULL, &dict);
 	name = "Items";
 	dbus_message_iter_append_basic (&dict, DBUS_TYPE_STRING, &name);
-	collection_append_item_paths (&dict, object);
+	gkd_secrets_objects_append_item_paths (self, &dict, message,
+	                                       collection_get_identifier (object));
 	dbus_message_iter_close_container (&array, &dict);
 
 	dbus_message_iter_close_container (&iter, &array);
@@ -780,19 +699,19 @@ collection_property_getall (GP11Object *object, DBusMessage *message)
 }
 
 static DBusMessage*
-collection_property_handler (GP11Object *object, DBusMessage *message)
+collection_property_handler (GkdSecretsObjects *self, GP11Object *object, DBusMessage *message)
 {
 	/* org.freedesktop.DBus.Properties.Get */
 	if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "Get"))
-		return collection_property_get (object, message);
+		return collection_property_get (self, object, message);
 
 	/* org.freedesktop.DBus.Properties.Set */
 	else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "Set"))
-		return collection_property_set (object, message);
+		return collection_property_set (self, object, message);
 
 	/* org.freedesktop.DBus.Properties.GetAll */
 	else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "GetAll"))
-		return collection_property_getall (object, message);
+		return collection_property_getall (self, object, message);
 
 	return NULL;
 }
@@ -967,7 +886,7 @@ gkd_secrets_objects_dispatch (GkdSecretsObjects *self, DBusMessage *message)
 		object = collection_for_identifier (session, coll_id);
 		if (object != NULL) {
 			if (dbus_message_has_interface (message, PROPERTIES_INTERFACE))
-				reply = collection_property_handler (object, message);
+				reply = collection_property_handler (self, object, message);
 			else
 				reply = collection_method_handler (object, message);
 			g_object_unref (object);
@@ -979,3 +898,133 @@ gkd_secrets_objects_dispatch (GkdSecretsObjects *self, DBusMessage *message)
 
 	return reply;
 }
+
+
+void
+gkd_secrets_objects_append_item_paths (GkdSecretsObjects *self, DBusMessageIter *iter,
+                                       DBusMessage *message, const gchar *coll_id)
+{
+	DBusMessageIter variant;
+	gchar *prefix, *part;
+	DBusMessageIter array;
+	GP11Session *session;
+	GError *error = NULL;
+	guchar *data;
+	gsize n_data;
+	gchar *path;
+	GList *items, *l;
+
+	g_return_if_fail (GKD_SECRETS_IS_OBJECTS (self));
+	g_return_if_fail (coll_id);
+	g_return_if_fail (iter && message);
+
+	/* The session we're using to access the object */
+	session = gkd_secrets_service_get_pkcs11_session (self->service, dbus_message_get_sender (message));
+	g_return_if_fail (session);
+
+	items = gp11_session_find_objects (session, &error,
+	                                   CKA_CLASS, GP11_ULONG, CKO_SECRET_KEY,
+	                                   CKA_G_COLLECTION, strlen (coll_id), coll_id,
+	                                   GP11_INVALID);
+
+	if (error != NULL) {
+		g_warning ("couldn't lookup items in '%s' collection: %s", coll_id, error->message);
+		g_clear_error (&error);
+		return;
+	}
+
+	dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "ao", &variant);
+	dbus_message_iter_open_container (&variant, DBUS_TYPE_ARRAY, "o", &array);
+	prefix = encode_object_identifier (coll_id, -1);
+
+	for (l = items; l; l = g_list_next (l)) {
+
+		/* Dig out the raw item identifier */
+		data = gp11_object_get_data (l->data, CKA_ID, &n_data, &error);
+		if (error != NULL) {
+			g_warning ("couldn't retrieve item id: %s", error->message);
+			g_clear_error (&error);
+
+		} else if (n_data) {
+
+			/* Build up the object path */
+			part = encode_object_identifier ((gchar*)data, n_data);
+			path = g_strconcat (SECRETS_COLLECTION_PREFIX, "/", prefix, "/", part, NULL);
+			g_free (part);
+
+			dbus_message_iter_append_basic (&array, DBUS_TYPE_OBJECT_PATH, &path);
+			g_free (path);
+		}
+
+		g_free (data);
+	}
+
+	dbus_message_iter_close_container (&variant, &array);
+	dbus_message_iter_close_container (iter, &variant);
+
+	g_free (prefix);
+
+	gp11_list_unref_free (items);
+}
+
+void
+gkd_secrets_objects_append_collection_paths (GkdSecretsObjects *self, DBusMessageIter *iter,
+                                             DBusMessage *message)
+{
+	DBusMessageIter variant;
+	DBusMessageIter array;
+	GError *error = NULL;
+	GP11Session *session;
+	GList *colls, *l;
+	guchar *data;
+	gsize n_data;
+	gchar *part;
+	gchar *path;
+
+	g_return_if_fail (GKD_SECRETS_IS_OBJECTS (self));
+	g_return_if_fail (iter && message);
+
+	/* The session we're using to access the object */
+	session = gkd_secrets_service_get_pkcs11_session (self->service, dbus_message_get_sender (message));
+	g_return_if_fail (session);
+
+	colls = gp11_session_find_objects (session, &error,
+	                                   CKA_CLASS, GP11_ULONG, CKO_G_COLLECTION,
+	                                   GP11_INVALID);
+
+	if (error != NULL) {
+		g_warning ("couldn't lookup collections: %s", error->message);
+		g_clear_error (&error);
+		return;
+	}
+
+	dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "ao", &variant);
+	dbus_message_iter_open_container (&variant, DBUS_TYPE_ARRAY, "o", &array);
+
+	for (l = colls; l; l = g_list_next (l)) {
+
+		/* Dig out the raw item identifier */
+		data = gp11_object_get_data (l->data, CKA_ID, &n_data, &error);
+		if (error != NULL) {
+			g_warning ("couldn't retrieve collection id: %s", error->message);
+			g_clear_error (&error);
+
+		} else if (n_data) {
+
+			/* Build up the object path */
+			part = encode_object_identifier ((gchar*)data, n_data);
+			path = g_strconcat (SECRETS_COLLECTION_PREFIX, "/", part, NULL);
+			g_free (part);
+
+			dbus_message_iter_append_basic (&array, DBUS_TYPE_OBJECT_PATH, &path);
+			g_free (path);
+		}
+
+		g_free (data);
+	}
+
+	dbus_message_iter_close_container (&variant, &array);
+	dbus_message_iter_close_container (iter, &variant);
+
+	gp11_list_unref_free (colls);
+}
diff --git a/daemon/dbus/gkd-secrets-objects.h b/daemon/dbus/gkd-secrets-objects.h
index 6bef63a..088bc9a 100644
--- a/daemon/dbus/gkd-secrets-objects.h
+++ b/daemon/dbus/gkd-secrets-objects.h
@@ -41,11 +41,20 @@ struct _GkdSecretsObjectsClass {
 	GObjectClass parent_class;
 };
 
-GType               gkd_secrets_objects_get_type               (void);
+GType               gkd_secrets_objects_get_type                 (void);
 
-DBusMessage*        gkd_secrets_objects_dispatch               (GkdSecretsObjects *self,
-                                                                DBusMessage *message);
+DBusMessage*        gkd_secrets_objects_dispatch                 (GkdSecretsObjects *self,
+                                                                  DBusMessage *message);
 
-GP11Slot*           gkd_secrets_objects_get_pkcs11_slot        (GkdSecretsObjects *self);
+void                gkd_secrets_objects_append_collection_paths  (GkdSecretsObjects *self,
+                                                                  DBusMessageIter *iter,
+                                                                  DBusMessage *message);
+
+void                gkd_secrets_objects_append_item_paths        (GkdSecretsObjects *self, 
+                                                                  DBusMessageIter *iter,
+                                                                  DBusMessage *message, 
+                                                                  const gchar *coll_id);
+
+GP11Slot*           gkd_secrets_objects_get_pkcs11_slot          (GkdSecretsObjects *self);
 
 #endif /* __GKD_SECRETS_OBJECTS_H__ */
diff --git a/daemon/dbus/gkd-secrets-service.c b/daemon/dbus/gkd-secrets-service.c
index 7ec5174..411f36f 100644
--- a/daemon/dbus/gkd-secrets-service.c
+++ b/daemon/dbus/gkd-secrets-service.c
@@ -262,26 +262,84 @@ initialize_service_client (GkdSecretsService *self, DBusMessage *message)
  */
 
 static DBusMessage*
+service_property_get (GkdSecretsService *self, DBusMessage *message)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const gchar *interface;
+	const gchar *name;
+
+	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, 
+	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID) ||
+	    !g_str_equal (interface, SECRETS_SERVICE_INTERFACE))
+		return NULL;
+
+	/* The "Collections" property */
+	if (g_str_equal (name, "Collections")) {
+		reply = dbus_message_new_method_return (message);
+		dbus_message_iter_init_append (reply, &iter);
+		gkd_secrets_objects_append_collection_paths (self->objects, &iter, message);
+
+	/* No such property */
+	} else {
+		reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
+		                                       "Object does not have the '%s' property", name);
+	}
+
+	return reply;
+}
+
+static DBusMessage*
+service_property_set (GkdSecretsService *self, DBusMessage *message)
+{
+	return NULL; /* TODO: Need to implement */
+}
+
+static DBusMessage*
+service_property_getall (GkdSecretsService *self, DBusMessage *message)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter array;
+	DBusMessageIter dict;
+	DBusMessageIter iter;
+	const gchar *interface;
+	const gchar *name;
+
+	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID) ||
+	    !g_str_equal (interface, SECRETS_SERVICE_INTERFACE))
+		return NULL;
+
+	reply = dbus_message_new_method_return (message);
+	dbus_message_iter_init_append (reply, &iter);
+	dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &array);
+
+	name = "Collections";
+	dbus_message_iter_open_container (&array, DBUS_TYPE_DICT_ENTRY, NULL, &dict);
+	dbus_message_iter_append_basic (&dict, DBUS_TYPE_STRING, &name);
+	gkd_secrets_objects_append_collection_paths (self->objects, &dict, message);
+	dbus_message_iter_close_container (&array, &dict);
+
+	dbus_message_iter_close_container (&iter, &array);
+
+	return reply;
+}
+
+static DBusMessage*
 service_property_handler (GkdSecretsService *self, DBusMessage *message)
 {
-	g_return_val_if_reached (NULL); /* TODO: Need to implement */
-#if 0
 	/* org.freedesktop.DBus.Properties.Get */
-	if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "Get") &&
-	    dbus_message_has_signature (message, "ss")) {
-		xxx;
+	if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "Get"))
+		return service_property_get (self, message);
 
 	/* org.freedesktop.DBus.Properties.Set */
-	} else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "Set") &&
-	           dbus_message_has_signature (message, "ssv")) {
-		xxx;
+	else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "Set"))
+		return service_property_set (self, message);
 
 	/* org.freedesktop.DBus.Properties.GetAll */
-	} else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "GetAll") &&
-	           dbus_message_has_signature (message, "s")) {
-		xxx;
-	}
-#endif
+	else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "GetAll"))
+		return service_property_getall (self, message);
+
+	return NULL;
 }
 
 static DBusMessage*



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]