File gnome-keyring-register-login-keyring.patch of Package gnome-keyring
diff --git a/daemon/control/gkd-control-server.c b/daemon/control/gkd-control-server.c
index 5ef307d6eeb40da055a3a90271a50f6c3ef96164..dcf6471e1922ee02f72e5ecfabb528931a78af57 100644
--- a/daemon/control/gkd-control-server.c
+++ b/daemon/control/gkd-control-server.c
@@ -25,6 +25,7 @@
#include "daemon/gkd-main.h"
#include "daemon/gkd-util.h"
+#include "daemon/dbus/gkd-dbus.h"
#include "egg/egg-buffer.h"
#include "egg/egg-cleanup.h"
@@ -85,10 +86,13 @@ control_unlock_login (EggBuffer *buffer)
if (!egg_buffer_get_string (buffer, offset, &offset, &master, egg_secure_realloc))
return GKD_CONTROL_RESULT_FAILED;
- if (gkd_login_unlock (master))
+ if (gkd_login_unlock (master)) {
res = GKD_CONTROL_RESULT_OK;
- else
+ if (gkd_main_secrets_started ())
+ gkd_dbus_ensure_login_collection_is_registered ();
+ } else {
res = GKD_CONTROL_RESULT_DENIED;
+ }
egg_secure_strfree (master);
return res;
diff --git a/daemon/dbus/gkd-dbus-secrets.c b/daemon/dbus/gkd-dbus-secrets.c
index 207524b2f75a1b4e4856f4298b53ad3e3569d482..7227dd83d27fcd125c1d5edebffb3ae420d5e7f0 100644
--- a/daemon/dbus/gkd-dbus-secrets.c
+++ b/daemon/dbus/gkd-dbus-secrets.c
@@ -156,3 +156,9 @@ gkd_dbus_secrets_cleanup (GDBusConnection *conn)
secrets_service = NULL;
}
}
+
+void
+gkd_dbus_ensure_login_collection_is_registered (void)
+{
+ gkd_secret_service_ensure_login_collection_is_registered (secrets_service);
+}
diff --git a/daemon/dbus/gkd-dbus.h b/daemon/dbus/gkd-dbus.h
index 8a9ca450fce5852ce2fb8166cdebe973cdb86f9c..9cd2a55b3994a201c6cbaaf6098a860d1df127f3 100644
--- a/daemon/dbus/gkd-dbus.h
+++ b/daemon/dbus/gkd-dbus.h
@@ -38,4 +38,6 @@ gchar* gkd_dbus_singleton_control (void);
gboolean gkd_dbus_invocation_matches_caller (GDBusMethodInvocation *invocation,
const char *caller);
+void gkd_dbus_ensure_login_collection_is_registered (void);
+
#endif /* GKD_DBUS_H */
diff --git a/daemon/dbus/gkd-secret-objects.c b/daemon/dbus/gkd-secret-objects.c
index af89601706d85d6f858659e853bc9d5d614358a3..5dda0f3f99b43d4b43e7a1030515094c1726c0c6 100644
--- a/daemon/dbus/gkd-secret-objects.c
+++ b/daemon/dbus/gkd-secret-objects.c
@@ -1660,3 +1660,10 @@ gkd_secret_objects_unregister_collection (GkdSecretObjects *self,
return;
}
}
+
+gboolean
+gkd_secret_objects_check_collection_is_registered (GkdSecretObjects *self,
+ const gchar *collection_path)
+{
+ return g_hash_table_lookup (self->collections_to_skeletons, collection_path) != NULL;
+}
diff --git a/daemon/dbus/gkd-secret-objects.h b/daemon/dbus/gkd-secret-objects.h
index e9b61d4e4063427ad0902d569bc74ca8f5ab70ea..905167438fd0e3a448713004481df8524baf6d70 100644
--- a/daemon/dbus/gkd-secret-objects.h
+++ b/daemon/dbus/gkd-secret-objects.h
@@ -102,4 +102,7 @@ void gkd_secret_objects_register_collection (GkdSecretObjec
void gkd_secret_objects_unregister_collection (GkdSecretObjects *self,
const gchar *collection_path);
+gboolean gkd_secret_objects_check_collection_is_registered (GkdSecretObjects *self,
+ const gchar *collection_path);
+
#endif /* __GKD_SECRET_OBJECTS_H__ */
diff --git a/daemon/dbus/gkd-secret-service.c b/daemon/dbus/gkd-secret-service.c
index 7a4458152243967a8092b378d36aa3143dfbd0f0..b36cbac9c316bebd8df1bb00049d734d57680d58 100644
--- a/daemon/dbus/gkd-secret-service.c
+++ b/daemon/dbus/gkd-secret-service.c
@@ -1447,3 +1447,16 @@ gkd_secret_service_emit_collection_changed (GkdSecretService *self,
gkd_exported_service_emit_collection_changed (self->skeleton, collection_path);
}
+
+void
+gkd_secret_service_ensure_login_collection_is_registered (GkdSecretService *self)
+{
+ g_return_if_fail (GKD_SECRET_IS_SERVICE (self));
+
+ gchar *collection_path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, "login", strlen("login"));
+ if (gkd_secret_objects_check_collection_is_registered (self->objects, collection_path)) {
+ return;
+ }
+
+ gkd_secret_objects_register_collection (self->objects, collection_path);
+}
diff --git a/daemon/dbus/gkd-secret-service.h b/daemon/dbus/gkd-secret-service.h
index f95ac9606e2c1696bae905bed978dd9f13f6b154..960da54685e7ea663ce0ae966fff0b3154549b30 100644
--- a/daemon/dbus/gkd-secret-service.h
+++ b/daemon/dbus/gkd-secret-service.h
@@ -84,4 +84,6 @@ void gkd_secret_service_emit_collection_changed (GkdSecretSer
gchar ** gkd_secret_service_get_collections (GkdSecretService *self);
+void gkd_secret_service_ensure_login_collection_is_registered (GkdSecretService *self);
+
#endif /* ___SECRET_SERVICE_H__ */
diff --git a/daemon/gkd-main.c b/daemon/gkd-main.c
index 6fab91fa6aeadfe98d8bf289705dbc7eac93f522..f6268bad3475b6b108f103f5b5c83a73b507070b 100644
--- a/daemon/gkd-main.c
+++ b/daemon/gkd-main.c
@@ -821,6 +821,12 @@ gkd_main_complete_initialization (const gchar *components)
gkr_daemon_initialize_steps (components);
}
+gboolean
+gkd_main_secrets_started (void)
+{
+ return secrets_started;
+}
+
static gboolean
on_login_timeout (gpointer data)
{
diff --git a/daemon/gkd-main.h b/daemon/gkd-main.h
index b847be6b2a1ea0e47574d5bdf1469f8ae3f49281..5e9ba153e13b4f686acba771104e250e35b0c25e 100644
--- a/daemon/gkd-main.h
+++ b/daemon/gkd-main.h
@@ -27,4 +27,6 @@ void gkd_main_quit (void);
void gkd_main_complete_initialization (const gchar *components);
+gboolean gkd_main_secrets_started (void);
+
#endif /* GKD_MAIN_H_ */