[gdm/wip/rancell/autologin-accountsservice] Use automatic login configuration from AccountsService.
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/wip/rancell/autologin-accountsservice] Use automatic login configuration from AccountsService.
- Date: Wed, 10 Jan 2018 21:05:29 +0000 (UTC)
commit 9bdc8986c0a62a8f224cac1a4ca98e583de39c75
Author: Robert Ancell <robert ancell canonical com>
Date: Fri Dec 22 12:11:53 2017 +1300
Use automatic login configuration from AccountsService.
Currently the GDM autologin configuration is pulled from the GDM configuration.
AccountsService already manages the autologin configuration (writing to the GDM
custom.conf file). By using a new property in AccountsService [1] we can let
AccountsService migrate to storing the configuration itself. This allows
multiple display managers (e.g. LightDM) to share the same configuration.
https://bugzilla.gnome.org/show_bug.cgi?id=791860
[1] https://bugs.freedesktop.org/show_bug.cgi?id=104564
daemon/gdm-manager.c | 83 ++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 67 insertions(+), 16 deletions(-)
---
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 69bae91..804ffba 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -1241,8 +1241,8 @@ get_timed_login_details (GdmManager *manager,
}
static gboolean
-get_automatic_login_details (GdmManager *manager,
- char **usernamep)
+get_automatic_login_details_legacy (GdmManager *manager,
+ char **usernamep)
{
gboolean res;
gboolean enabled;
@@ -1282,6 +1282,64 @@ get_automatic_login_details (GdmManager *manager,
return enabled;
}
+static gchar *
+get_automatic_login_user (GdmManager *manager)
+{
+ g_autoptr(GDBusProxy) accountsservice_proxy = NULL;
+ g_autoptr(GVariant) result = NULL;
+ g_autoptr(GVariantIter) iter = NULL;
+ const gchar *path;
+ g_autoptr(GError) error = NULL;
+
+ accountsservice_proxy = g_dbus_proxy_new_sync (manager->priv->connection,
+ 0, NULL,
+ "org.freedesktop.Accounts",
+ "/org/freedesktop/Accounts",
+ "org.freedesktop.Accounts.User",
+ NULL,
+ &error);
+ if (!accountsservice_proxy) {
+ g_warning ("Failed to contact accountsservice: %s", error->message);
+ return NULL;
+ }
+
+ /* If AccountsService doesn't support this property, fall back to old method */
+ result = g_dbus_proxy_get_cached_property (accountsservice_proxy, "AutomaticLoginUsers");
+ if (!result) {
+ char *username;
+ if (!get_automatic_login_details_legacy (manager, &username)) {
+ return NULL;
+ }
+ return username;
+ }
+ if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("ao"))) {
+ return NULL;
+ }
+
+ g_variant_get (result, "ao", &iter);
+ if (g_variant_iter_next (iter, "&o", &path)) {
+ g_autoptr(GDBusProxy) proxy = NULL;
+ g_autoptr(GVariant) username = NULL;
+
+ proxy = g_dbus_proxy_new_sync (manager->priv->connection,
+ 0, NULL,
+ "org.freedesktop.Accounts",
+ path,
+ "org.freedesktop.Accounts.User",
+ NULL,
+ &error);
+ if (proxy == NULL) {
+ g_warning ("Failed to get automatic login details from AccountsService for user %s:
%s", path, error->message);
+ return NULL;
+ }
+
+ username = g_dbus_proxy_get_cached_property (proxy, "UserName");
+ return g_strdup (g_variant_get_string (username, NULL));
+ }
+
+ return NULL;
+}
+
static void
maybe_start_pending_initial_login (GdmManager *manager,
GdmDisplay *greeter_display)
@@ -1577,17 +1635,14 @@ set_up_session (GdmManager *manager,
ActUser *user;
gboolean loaded;
gboolean is_initial_display = FALSE;
- gboolean autologin_enabled = FALSE;
- char *username = NULL;
+ g_autofree gchar *username = NULL;
g_object_get (G_OBJECT (display), "is-initial", &is_initial_display, NULL);
if (!manager->priv->ran_once && is_initial_display)
- autologin_enabled = get_automatic_login_details (manager, &username);
-
- if (!autologin_enabled) {
- g_free (username);
+ username = get_automatic_login_user (manager);
+ if (username == NULL) {
#ifdef HAVE_LIBXDMCP
if (GDM_IS_XDMCP_CHOOSER_DISPLAY (display)) {
set_up_chooser_session (manager, display);
@@ -1612,7 +1667,7 @@ set_up_session (GdmManager *manager,
operation = g_new (UsernameLookupOperation, 1);
operation->manager = g_object_ref (manager);
operation->display = g_object_ref (display);
- operation->username = username;
+ operation->username = g_steal_pointer (&username);
g_signal_connect (user,
"notify::is-loaded",
@@ -2214,8 +2269,7 @@ on_session_conversation_started (GdmSession *session,
GdmManager *manager)
{
GdmDisplay *display;
- gboolean enabled;
- char *username;
+ g_autofree gchar *username = NULL;
g_debug ("GdmManager: session conversation started for service %s", service_name);
@@ -2234,9 +2288,8 @@ on_session_conversation_started (GdmSession *session,
return;
}
- enabled = get_automatic_login_details (manager, &username);
-
- if (! enabled) {
+ username = get_automatic_login_user (manager);
+ if (username == NULL) {
return;
}
@@ -2245,8 +2298,6 @@ on_session_conversation_started (GdmSession *session,
/* service_name will be "gdm-autologin"
*/
gdm_session_setup_for_user (session, service_name, username);
-
- g_free (username);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]