diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2017-12-22 12:11:53 +1300 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2018-01-11 10:18:14 +1300 |
commit | bb8b68c5c09b1b9b3edf91ece1779dee4797f1fe (patch) | |
tree | 2c4db44e78aa95d56e1a132e35f0ff0ca87e22e4 | |
parent | e7fdf1899cfeb5fbd512f2ea48ad18623f6a7732 (diff) | |
download | gdm-wip/rancell/autologin-accountsservice.tar.gz |
Use automatic login configuration from AccountsService.wip/rancell/autologin-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
-rw-r--r-- | 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 69bae91b..d550cc5f 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", + 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_variant_dup_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 |