summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2017-12-22 12:11:53 +1300
committerRobert Ancell <robert.ancell@canonical.com>2018-01-11 10:18:14 +1300
commitbb8b68c5c09b1b9b3edf91ece1779dee4797f1fe (patch)
tree2c4db44e78aa95d56e1a132e35f0ff0ca87e22e4
parente7fdf1899cfeb5fbd512f2ea48ad18623f6a7732 (diff)
downloadgdm-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.c83
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