Blame SOURCES/0001-display-ask-accountservice-if-there-are-users-rather.patch

81f0aa
From 781e865705b0c134271c9ec21655cd5d8ce37fec Mon Sep 17 00:00:00 2001
81f0aa
From: Ray Strode <rstrode@redhat.com>
81f0aa
Date: Sat, 14 Dec 2019 13:50:53 -0500
81f0aa
Subject: [PATCH] display: ask accountservice if there are users rather than
81f0aa
 enumerate users
81f0aa
81f0aa
At the moment we ask accountsservice to give us the list of users just
81f0aa
to find out if there is a list of users.
81f0aa
81f0aa
That's rather inefficient and might be wrong for directory server users
81f0aa
that have never logged in before.
81f0aa
81f0aa
This commit changes gdm to ask accountsservice the question we really
81f0aa
want to know the answer to; whether or not there are users.
81f0aa
---
81f0aa
 daemon/gdm-display.c | 55 ++++++++++++++++++--------------------------
81f0aa
 1 file changed, 22 insertions(+), 33 deletions(-)
81f0aa
81f0aa
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
81f0aa
index 878be88da..875534272 100644
81f0aa
--- a/daemon/gdm-display.c
81f0aa
+++ b/daemon/gdm-display.c
81f0aa
@@ -57,62 +57,60 @@
81f0aa
 struct GdmDisplayPrivate
81f0aa
 {
81f0aa
         char                 *id;
81f0aa
         char                 *seat_id;
81f0aa
         char                 *session_id;
81f0aa
         char                 *session_class;
81f0aa
         char                 *session_type;
81f0aa
 
81f0aa
         char                 *remote_hostname;
81f0aa
         int                   x11_display_number;
81f0aa
         char                 *x11_display_name;
81f0aa
         int                   status;
81f0aa
         time_t                creation_time;
81f0aa
         GTimer               *server_timer;
81f0aa
 
81f0aa
         char                 *x11_cookie;
81f0aa
         gsize                 x11_cookie_size;
81f0aa
         GdmDisplayAccessFile *access_file;
81f0aa
 
81f0aa
         guint                 finish_idle_id;
81f0aa
 
81f0aa
         xcb_connection_t     *xcb_connection;
81f0aa
         int                   xcb_screen_number;
81f0aa
 
81f0aa
         GDBusConnection      *connection;
81f0aa
         GdmDisplayAccessFile *user_access_file;
81f0aa
 
81f0aa
         GdmDBusDisplay       *display_skeleton;
81f0aa
         GDBusObjectSkeleton  *object_skeleton;
81f0aa
 
81f0aa
-        GDBusProxy           *accountsservice_proxy;
81f0aa
-
81f0aa
         /* this spawns and controls the greeter session */
81f0aa
         GdmLaunchEnvironment *launch_environment;
81f0aa
 
81f0aa
         guint                 is_local : 1;
81f0aa
         guint                 is_initial : 1;
81f0aa
         guint                 allow_timed_login : 1;
81f0aa
         guint                 have_existing_user_accounts : 1;
81f0aa
         guint                 doing_initial_setup : 1;
81f0aa
 };
81f0aa
 
81f0aa
 enum {
81f0aa
         PROP_0,
81f0aa
         PROP_ID,
81f0aa
         PROP_STATUS,
81f0aa
         PROP_SEAT_ID,
81f0aa
         PROP_SESSION_ID,
81f0aa
         PROP_SESSION_CLASS,
81f0aa
         PROP_SESSION_TYPE,
81f0aa
         PROP_REMOTE_HOSTNAME,
81f0aa
         PROP_X11_DISPLAY_NUMBER,
81f0aa
         PROP_X11_DISPLAY_NAME,
81f0aa
         PROP_X11_COOKIE,
81f0aa
         PROP_X11_AUTHORITY_FILE,
81f0aa
         PROP_IS_CONNECTED,
81f0aa
         PROP_IS_LOCAL,
81f0aa
         PROP_LAUNCH_ENVIRONMENT,
81f0aa
         PROP_IS_INITIAL,
81f0aa
         PROP_ALLOW_TIMED_LOGIN,
81f0aa
         PROP_HAVE_EXISTING_USER_ACCOUNTS,
81f0aa
         PROP_DOING_INITIAL_SETUP,
81f0aa
@@ -512,96 +510,88 @@ queue_finish (GdmDisplay *self)
81f0aa
         if (self->priv->finish_idle_id == 0) {
81f0aa
                 self->priv->finish_idle_id = g_idle_add ((GSourceFunc)finish_idle, self);
81f0aa
         }
81f0aa
 }
81f0aa
 
81f0aa
 static void
81f0aa
 _gdm_display_set_status (GdmDisplay *self,
81f0aa
                          int         status)
81f0aa
 {
81f0aa
         if (status != self->priv->status) {
81f0aa
                 self->priv->status = status;
81f0aa
                 g_object_notify (G_OBJECT (self), "status");
81f0aa
         }
81f0aa
 }
81f0aa
 
81f0aa
 static gboolean
81f0aa
 gdm_display_real_prepare (GdmDisplay *self)
81f0aa
 {
81f0aa
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
81f0aa
 
81f0aa
         g_debug ("GdmDisplay: prepare display");
81f0aa
 
81f0aa
         _gdm_display_set_status (self, GDM_DISPLAY_PREPARED);
81f0aa
 
81f0aa
         return TRUE;
81f0aa
 }
81f0aa
 
81f0aa
 static void
81f0aa
 look_for_existing_users_sync (GdmDisplay *self)
81f0aa
 {
81f0aa
-        GError *error = NULL;
81f0aa
-        GVariant *call_result;
81f0aa
-        GVariant *user_list;
81f0aa
-
81f0aa
-        self->priv->accountsservice_proxy = g_dbus_proxy_new_sync (self->priv->connection,
81f0aa
-                                                                   0, NULL,
81f0aa
-                                                                   "org.freedesktop.Accounts",
81f0aa
-                                                                   "/org/freedesktop/Accounts",
81f0aa
-                                                                   "org.freedesktop.Accounts",
81f0aa
-                                                                   NULL,
81f0aa
-                                                                   &error);
81f0aa
-
81f0aa
-        if (!self->priv->accountsservice_proxy) {
81f0aa
-                g_warning ("Failed to contact accountsservice: %s", error->message);
81f0aa
-                goto out;
81f0aa
-        }
81f0aa
-
81f0aa
-        call_result = g_dbus_proxy_call_sync (self->priv->accountsservice_proxy,
81f0aa
-                                              "ListCachedUsers",
81f0aa
-                                              NULL,
81f0aa
-                                              0,
81f0aa
+        g_autoptr (GVariant) result = NULL;
81f0aa
+        g_autoptr (GVariant) result_child = NULL;
81f0aa
+        g_autoptr (GError) error = NULL;
81f0aa
+        gboolean has_no_users = FALSE;
81f0aa
+
81f0aa
+        result = g_dbus_connection_call_sync (self->priv->connection,
81f0aa
+                                              "org.freedesktop.Accounts",
81f0aa
+                                              "/org/freedesktop/Accounts",
81f0aa
+                                              "org.freedesktop.DBus.Properties",
81f0aa
+                                              "Get",
81f0aa
+                                              g_variant_new ("(ss)", "org.freedesktop.Accounts", "HasNoUsers"),
81f0aa
+                                              G_VARIANT_TYPE ("(v)"),
81f0aa
+                                              G_DBUS_CALL_FLAGS_NONE,
81f0aa
                                               -1,
81f0aa
                                               NULL,
81f0aa
                                               &error);
81f0aa
 
81f0aa
-        if (!call_result) {
81f0aa
-                g_warning ("Failed to list cached users: %s", error->message);
81f0aa
-                goto out;
81f0aa
+        if (result == NULL) {
81f0aa
+                g_warning ("Failed to contact accountsservice: %s", error->message);
81f0aa
+                return;
81f0aa
         }
81f0aa
 
81f0aa
-        g_variant_get (call_result, "(@ao)", &user_list);
81f0aa
-        self->priv->have_existing_user_accounts = g_variant_n_children (user_list) > 0;
81f0aa
-        g_variant_unref (user_list);
81f0aa
-        g_variant_unref (call_result);
81f0aa
-out:
81f0aa
-        g_clear_error (&error);
81f0aa
+        g_variant_get (result, "(v)", &result_child);
81f0aa
+        has_no_users = g_variant_get_boolean (result_child);
81f0aa
+        self->priv->have_existing_user_accounts = !has_no_users;
81f0aa
+
81f0aa
+        g_debug ("GdmDisplay: machine does %shave existing user accounts",
81f0aa
+                 has_no_users? "not " : "");
81f0aa
 }
81f0aa
 
81f0aa
 gboolean
81f0aa
 gdm_display_prepare (GdmDisplay *self)
81f0aa
 {
81f0aa
         gboolean ret;
81f0aa
 
81f0aa
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
81f0aa
 
81f0aa
         g_debug ("GdmDisplay: Preparing display: %s", self->priv->id);
81f0aa
 
81f0aa
         /* FIXME: we should probably do this in a more global place,
81f0aa
          * asynchronously
81f0aa
          */
81f0aa
         look_for_existing_users_sync (self);
81f0aa
 
81f0aa
         self->priv->doing_initial_setup = wants_initial_setup (self);
81f0aa
 
81f0aa
         g_object_ref (self);
81f0aa
         ret = GDM_DISPLAY_GET_CLASS (self)->prepare (self);
81f0aa
         g_object_unref (self);
81f0aa
 
81f0aa
         return ret;
81f0aa
 }
81f0aa
 
81f0aa
 gboolean
81f0aa
 gdm_display_manage (GdmDisplay *self)
81f0aa
 {
81f0aa
         gboolean res;
81f0aa
 
81f0aa
@@ -1332,61 +1322,60 @@ gdm_display_init (GdmDisplay *self)
81f0aa
 
81f0aa
         self->priv = GDM_DISPLAY_GET_PRIVATE (self);
81f0aa
 
81f0aa
         self->priv->creation_time = time (NULL);
81f0aa
         self->priv->server_timer = g_timer_new ();
81f0aa
 }
81f0aa
 
81f0aa
 static void
81f0aa
 gdm_display_finalize (GObject *object)
81f0aa
 {
81f0aa
         GdmDisplay *self;
81f0aa
 
81f0aa
         g_return_if_fail (object != NULL);
81f0aa
         g_return_if_fail (GDM_IS_DISPLAY (object));
81f0aa
 
81f0aa
         self = GDM_DISPLAY (object);
81f0aa
 
81f0aa
         g_return_if_fail (self->priv != NULL);
81f0aa
 
81f0aa
         g_debug ("GdmDisplay: Finalizing display: %s", self->priv->id);
81f0aa
         g_free (self->priv->id);
81f0aa
         g_free (self->priv->seat_id);
81f0aa
         g_free (self->priv->session_class);
81f0aa
         g_free (self->priv->remote_hostname);
81f0aa
         g_free (self->priv->x11_display_name);
81f0aa
         g_free (self->priv->x11_cookie);
81f0aa
 
81f0aa
         g_clear_object (&self->priv->display_skeleton);
81f0aa
         g_clear_object (&self->priv->object_skeleton);
81f0aa
         g_clear_object (&self->priv->connection);
81f0aa
-        g_clear_object (&self->priv->accountsservice_proxy);
81f0aa
 
81f0aa
         if (self->priv->access_file != NULL) {
81f0aa
                 g_object_unref (self->priv->access_file);
81f0aa
         }
81f0aa
 
81f0aa
         if (self->priv->user_access_file != NULL) {
81f0aa
                 g_object_unref (self->priv->user_access_file);
81f0aa
         }
81f0aa
 
81f0aa
         if (self->priv->server_timer != NULL) {
81f0aa
                 g_timer_destroy (self->priv->server_timer);
81f0aa
         }
81f0aa
 
81f0aa
         G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object);
81f0aa
 }
81f0aa
 
81f0aa
 GDBusObjectSkeleton *
81f0aa
 gdm_display_get_object_skeleton (GdmDisplay *self)
81f0aa
 {
81f0aa
         return self->priv->object_skeleton;
81f0aa
 }
81f0aa
 
81f0aa
 static void
81f0aa
 on_launch_environment_session_opened (GdmLaunchEnvironment *launch_environment,
81f0aa
                                       GdmDisplay           *self)
81f0aa
 {
81f0aa
         char       *session_id;
81f0aa
 
81f0aa
         g_debug ("GdmDisplay: Greeter session opened");
81f0aa
         session_id = gdm_launch_environment_get_session_id (launch_environment);
81f0aa
-- 
81f0aa
2.21.0
81f0aa