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