File 00001-dbus-Automatically-register-objects.patch of Package gnome-keyring

From c741a66b67045159f428e2b92024de03190f9b36 Mon Sep 17 00:00:00 2001
From: Dan Nicholson <dbn@endlessos.org>
Date: Thu, 14 Mar 2024 10:40:57 -0600
Subject: [PATCH 1/2] dbus: Automatically register objects

When iterating collections and items, immediately register them if
needed. That way if a collection is added outside of the D-Bus service,
it will automatically be registered the next time a client requests the
`Collections` property.

Without this, the login keyring created by the PAM module is never
registered since it happens after the collection initialization. When
clients query `Collections`, they'll see the new keyring's object path.
However, attempting to use it will fail since the collection object
hasn't been registered.

Fixes: #137
---
 daemon/dbus/gkd-secret-objects.c | 34 +++++++++++++++++++++-----------
 daemon/dbus/gkd-secret-objects.h |  2 ++
 daemon/dbus/gkd-secret-service.c | 14 +------------
 3 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/daemon/dbus/gkd-secret-objects.c b/daemon/dbus/gkd-secret-objects.c
index 90493df7e..1f1023bc2 100644
--- a/daemon/dbus/gkd-secret-objects.c
+++ b/daemon/dbus/gkd-secret-objects.c
@@ -1130,6 +1130,10 @@ gkd_secret_objects_lookup_item (GkdSecretObjects *self, const gchar *caller,
 	return object;
 }
 
+static void
+gkd_secret_objects_register_item (GkdSecretObjects *self,
+				  const gchar *item_path);
+
 static void
 objects_foreach_item (GkdSecretObjects *self,
 		      GList *items,
@@ -1142,7 +1146,10 @@ objects_foreach_item (GkdSecretObjects *self,
 
 	for (l = items; l; l = g_list_next (l)) {
 		path = object_path_for_item (base, l->data);
-		(callback) (self, path, l->data, user_data);
+		if (!g_hash_table_contains (self->items_to_skeletons, path))
+			gkd_secret_objects_register_item (self, path);
+		if (callback != NULL)
+			(callback) (self, path, l->data, user_data);
 		g_free (path);
 	}
 }
@@ -1162,7 +1169,6 @@ gkd_secret_objects_foreach_item (GkdSecretObjects *self,
 
 	g_return_if_fail (GKD_SECRET_IS_OBJECTS (self));
 	g_return_if_fail (base != NULL);
-	g_return_if_fail (callback != NULL);
 
 	/* The session we're using to access the object */
 	if (caller == NULL) {
@@ -1206,7 +1212,6 @@ gkd_secret_objects_foreach_collection (GkdSecretObjects *self,
 	gchar *path;
 
 	g_return_if_fail (GKD_SECRET_IS_OBJECTS (self));
-	g_return_if_fail (callback);
 
 	/* The session we're using to access the object */
 	if (caller == NULL) {
@@ -1236,7 +1241,11 @@ gkd_secret_objects_foreach_collection (GkdSecretObjects *self,
 		path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, identifier, n_identifier);
 		g_free (identifier);
 
-		(callback) (self, path, l->data, user_data);
+		if (!g_hash_table_contains (self->collections_to_skeletons, path))
+			gkd_secret_objects_register_collection (self, path);
+
+		if (callback != NULL)
+			(callback) (self, path, l->data, user_data);
 		g_free (path);
 	}
 
@@ -1492,6 +1501,7 @@ gkd_secret_objects_register_item (GkdSecretObjects *self,
 	GkdExportedItem *skeleton;
 	GError *error = NULL;
 
+	g_debug ("registering item %s", item_path);
 	skeleton = g_hash_table_lookup (self->items_to_skeletons, item_path);
 	if (skeleton != NULL) {
 		g_warning ("asked to register item %s, but it's already registered", item_path);
@@ -1607,14 +1617,7 @@ static void
 gkd_secret_objects_init_collection_items (GkdSecretObjects *self,
 					  const gchar *collection_path)
 {
-	gchar **items;
-	gint idx;
-
-	items = gkd_secret_objects_get_collection_items (self, collection_path);
-	for (idx = 0; items[idx] != NULL; idx++)
-		gkd_secret_objects_register_item (self, items[idx]);
-
-	g_strfreev (items);
+	gkd_secret_objects_foreach_item (self, NULL, collection_path, NULL, NULL);
 }
 
 void
@@ -1624,6 +1627,7 @@ gkd_secret_objects_register_collection (GkdSecretObjects *self,
 	GkdExportedCollection *skeleton;
 	GError *error = NULL;
 
+	g_debug ("registering collection %s", collection_path);
 	skeleton = g_hash_table_lookup (self->collections_to_skeletons, collection_path);
 	if (skeleton != NULL) {
 		g_warning ("asked to register collection %s, but it's already registered", collection_path);
@@ -1660,3 +1664,9 @@ gkd_secret_objects_unregister_collection (GkdSecretObjects *self,
 		return;
 	}
 }
+
+void
+gkd_secret_objects_init_collections (GkdSecretObjects *self)
+{
+	gkd_secret_objects_foreach_collection (self, NULL, NULL, NULL);
+}
diff --git a/daemon/dbus/gkd-secret-objects.h b/daemon/dbus/gkd-secret-objects.h
index e9b61d4e4..e9f4619aa 100644
--- a/daemon/dbus/gkd-secret-objects.h
+++ b/daemon/dbus/gkd-secret-objects.h
@@ -102,4 +102,6 @@ void                gkd_secret_objects_register_collection       (GkdSecretObjec
 void                gkd_secret_objects_unregister_collection     (GkdSecretObjects *self,
                                                                   const gchar *collection_path);
 
+void                gkd_secret_objects_init_collections          (GkdSecretObjects *self);
+
 #endif /* __GKD_SECRET_OBJECTS_H__ */
diff --git a/daemon/dbus/gkd-secret-service.c b/daemon/dbus/gkd-secret-service.c
index a0cd9e80a..ca30bfdad 100644
--- a/daemon/dbus/gkd-secret-service.c
+++ b/daemon/dbus/gkd-secret-service.c
@@ -941,18 +941,6 @@ service_name_owner_changed (GDBusConnection *connection,
  * OBJECT
  */
 
-static void
-gkd_secret_service_init_collections (GkdSecretService *self)
-{
-	gchar **collections = gkd_secret_service_get_collections (self);
-	gint idx;
-
-	for (idx = 0; collections[idx] != NULL; idx++)
-		gkd_secret_objects_register_collection (self->objects, collections[idx]);
-
-	g_strfreev (collections);
-}
-
 static void
 gkd_secret_service_init_aliases (GkdSecretService *self)
 {
@@ -1052,7 +1040,7 @@ gkd_secret_service_constructor (GType type,
 							service_message_filter,
 							self, NULL);
 
-	gkd_secret_service_init_collections (self);
+	gkd_secret_objects_init_collections (self->objects);
 
 	return G_OBJECT (self);
 }
-- 
GitLab


From 47cb79e123e466a4b9eefcda668425e5c0cda68f Mon Sep 17 00:00:00 2001
From: Dan Nicholson <dbn@endlessos.org>
Date: Thu, 14 Mar 2024 20:41:18 -0600
Subject: [PATCH 2/2] build: Fix distcheck with systemd units

The user unit directory gathered from pkg-config is an absolute path and
doesn't follow the configured prefix. distcheck doesn't like that, so
set `systemduserunitdir` to follow the prefix even though that wouldn't
make sense on a real build.
---
 Makefile.am | 1 +
 1 file changed, 1 insertion(+)

-- 
GitLab

openSUSE Build Service is sponsored by