Blame SOURCES/0027-manager-start-initial-setup-right-away.patch

400dab
From 3d4199f82136e7046b5b08fc7c583e3fce2d04a2 Mon Sep 17 00:00:00 2001
400dab
From: Ray Strode <rstrode@redhat.com>
400dab
Date: Fri, 31 Aug 2018 14:33:58 -0400
400dab
Subject: [PATCH 27/51] manager: start initial setup right away
400dab
400dab
We no longer restart the greeter as soon as it dies, since we
400dab
start the greeter on demand.  This means, we no longer need to
400dab
defer starting initial setup until after the greeter respawns.
400dab
400dab
Furthermore, it doesn't work anymore since it relied on the
400dab
respawn to trigger.
400dab
400dab
This commit removes that code and scaffolding and just starts
400dab
initial setup directly.
400dab
400dab
https://gitlab.gnome.org/GNOME/gdm/issues/415
400dab
---
400dab
 daemon/gdm-manager.c | 66 +-------------------------------------------
400dab
 1 file changed, 1 insertion(+), 65 deletions(-)
400dab
400dab
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
400dab
index c8197a043..fb7b1ec4b 100644
400dab
--- a/daemon/gdm-manager.c
400dab
+++ b/daemon/gdm-manager.c
400dab
@@ -62,62 +62,60 @@
400dab
 #define GDM_MANAGER_DISPLAYS_PATH GDM_DBUS_PATH "/Displays"
400dab
 
400dab
 #define INITIAL_SETUP_USERNAME "gnome-initial-setup"
400dab
 
400dab
 typedef struct
400dab
 {
400dab
         GdmManager *manager;
400dab
         GdmSession *session;
400dab
         char *service_name;
400dab
         guint idle_id;
400dab
 } StartUserSessionOperation;
400dab
 
400dab
 struct GdmManagerPrivate
400dab
 {
400dab
         GdmDisplayStore        *display_store;
400dab
         GdmLocalDisplayFactory *local_factory;
400dab
 #ifdef HAVE_LIBXDMCP
400dab
         GdmXdmcpDisplayFactory *xdmcp_factory;
400dab
 #endif
400dab
         GList                  *user_sessions;
400dab
         GHashTable             *transient_sessions;
400dab
         GHashTable             *open_reauthentication_requests;
400dab
         gboolean                xdmcp_enabled;
400dab
 
400dab
         gboolean                started;
400dab
         gboolean                show_local_greeter;
400dab
 
400dab
         GDBusConnection          *connection;
400dab
         GDBusObjectManagerServer *object_manager;
400dab
 
400dab
-        StartUserSessionOperation *initial_login_operation;
400dab
-
400dab
 #ifdef  WITH_PLYMOUTH
400dab
         guint                     plymouth_is_running : 1;
400dab
 #endif
400dab
         guint                     ran_once : 1;
400dab
 };
400dab
 
400dab
 enum {
400dab
         PROP_0,
400dab
         PROP_XDMCP_ENABLED,
400dab
         PROP_SHOW_LOCAL_GREETER
400dab
 };
400dab
 
400dab
 enum {
400dab
         DISPLAY_ADDED,
400dab
         DISPLAY_REMOVED,
400dab
         LAST_SIGNAL
400dab
 };
400dab
 
400dab
 typedef enum {
400dab
         SESSION_RECORD_LOGIN,
400dab
         SESSION_RECORD_LOGOUT,
400dab
         SESSION_RECORD_FAILED,
400dab
 } SessionRecord;
400dab
 
400dab
 static guint signals [LAST_SIGNAL] = { 0, };
400dab
 
400dab
 static void     gdm_manager_class_init  (GdmManagerClass *klass);
400dab
 static void     gdm_manager_init        (GdmManager      *manager);
400dab
 static void     gdm_manager_dispose     (GObject         *object);
400dab
 
400dab
@@ -1286,96 +1284,60 @@ get_automatic_login_details (GdmManager *manager,
400dab
         if (res && enabled) {
400dab
             res = gdm_settings_direct_get_string (GDM_KEY_AUTO_LOGIN_USER, &username);
400dab
         }
400dab
 
400dab
         if (enabled && res && username != NULL && username[0] != '\0') {
400dab
                 goto out;
400dab
         }
400dab
 
400dab
         g_free (username);
400dab
         username = NULL;
400dab
         enabled = FALSE;
400dab
 
400dab
  out:
400dab
         if (enabled) {
400dab
                 g_debug ("GdmDisplay: Got automatic login details for display: %d %s",
400dab
                          enabled,
400dab
                          username);
400dab
         } else {
400dab
                 g_debug ("GdmDisplay: Got automatic login details for display: 0");
400dab
         }
400dab
 
400dab
         if (usernamep != NULL) {
400dab
                 *usernamep = username;
400dab
         } else {
400dab
                 g_free (username);
400dab
         }
400dab
 
400dab
         return enabled;
400dab
 }
400dab
 
400dab
-static void
400dab
-maybe_start_pending_initial_login (GdmManager *manager,
400dab
-                                   GdmDisplay *greeter_display)
400dab
-{
400dab
-        StartUserSessionOperation *operation;
400dab
-        char *greeter_seat_id = NULL;
400dab
-        char *user_session_seat_id = NULL;
400dab
-
400dab
-        /* There may be a user session waiting to be started.
400dab
-         * This would happen if we couldn't start it earlier because
400dab
-         * the login screen X server was coming up and two X servers
400dab
-         * can't be started on the same seat at the same time.
400dab
-         */
400dab
-
400dab
-        if (manager->priv->initial_login_operation == NULL) {
400dab
-                return;
400dab
-        }
400dab
-
400dab
-        operation = manager->priv->initial_login_operation;
400dab
-
400dab
-        g_object_get (G_OBJECT (greeter_display),
400dab
-                      "seat-id", &greeter_seat_id,
400dab
-                      NULL);
400dab
-        g_object_get (G_OBJECT (operation->session),
400dab
-                      "display-seat-id", &user_session_seat_id,
400dab
-                      NULL);
400dab
-
400dab
-        if (g_strcmp0 (greeter_seat_id, user_session_seat_id) == 0) {
400dab
-                start_user_session (manager, operation);
400dab
-                manager->priv->initial_login_operation = NULL;
400dab
-        }
400dab
-
400dab
-        g_free (greeter_seat_id);
400dab
-        g_free (user_session_seat_id);
400dab
-}
400dab
-
400dab
 static const char *
400dab
 get_username_for_greeter_display (GdmManager *manager,
400dab
                                   GdmDisplay *display)
400dab
 {
400dab
         gboolean doing_initial_setup = FALSE;
400dab
 
400dab
         g_object_get (G_OBJECT (display),
400dab
                       "doing-initial-setup", &doing_initial_setup,
400dab
                       NULL);
400dab
 
400dab
         if (doing_initial_setup) {
400dab
                 return INITIAL_SETUP_USERNAME;
400dab
         } else {
400dab
                 return GDM_USERNAME;
400dab
         }
400dab
 }
400dab
 
400dab
 static void
400dab
 set_up_automatic_login_session (GdmManager *manager,
400dab
                                 GdmDisplay *display)
400dab
 {
400dab
         GdmSession *session;
400dab
         char       *display_session_type = NULL;
400dab
         gboolean is_initial;
400dab
 
400dab
         /* 0 is root user; since the daemon talks to the session object
400dab
          * directly, itself, for automatic login
400dab
          */
400dab
         session = create_user_session_for_display (manager, display, 0);
400dab
 
400dab
@@ -1498,131 +1460,115 @@ set_up_session (GdmManager *manager,
400dab
                         return;
400dab
                 }
400dab
 #endif
400dab
 
400dab
                 set_up_greeter_session (manager, display);
400dab
                 return;
400dab
         }
400dab
 
400dab
         /* Check whether the user really exists before committing to autologin. */
400dab
         user_manager = act_user_manager_get_default ();
400dab
         user = act_user_manager_get_user (user_manager, username);
400dab
         g_object_get (user_manager, "is-loaded", &loaded, NULL);
400dab
 
400dab
         if (loaded) {
400dab
                 set_up_automatic_login_session_if_user_exists (manager, display, user);
400dab
         } else {
400dab
                 UsernameLookupOperation *operation;
400dab
 
400dab
                 operation = g_new (UsernameLookupOperation, 1);
400dab
                 operation->manager = g_object_ref (manager);
400dab
                 operation->display = g_object_ref (display);
400dab
                 operation->username = username;
400dab
 
400dab
                 g_signal_connect (user,
400dab
                                   "notify::is-loaded",
400dab
                                   G_CALLBACK (on_user_is_loaded_changed),
400dab
                                   operation);
400dab
         }
400dab
 }
400dab
 
400dab
-static void
400dab
-greeter_display_started (GdmManager *manager,
400dab
-                         GdmDisplay *display)
400dab
-{
400dab
-        if (manager->priv->ran_once) {
400dab
-                return;
400dab
-        }
400dab
-
400dab
-        maybe_start_pending_initial_login (manager, display);
400dab
-}
400dab
-
400dab
 static void
400dab
 on_display_status_changed (GdmDisplay *display,
400dab
                            GParamSpec *arg1,
400dab
                            GdmManager *manager)
400dab
 {
400dab
         int         status;
400dab
         int         display_number = -1;
400dab
         char       *session_type = NULL;
400dab
 #ifdef WITH_PLYMOUTH
400dab
         gboolean    display_is_local = FALSE;
400dab
         gboolean    doing_initial_setup = FALSE;
400dab
         gboolean    quit_plymouth = FALSE;
400dab
 
400dab
         g_object_get (display,
400dab
                       "is-local", &display_is_local,
400dab
                       "doing-initial-setup", &doing_initial_setup,
400dab
                       NULL);
400dab
         quit_plymouth = display_is_local && manager->priv->plymouth_is_running;
400dab
 #endif
400dab
 
400dab
         g_object_get (display,
400dab
                       "x11-display-number", &display_number,
400dab
                       "session-type", &session_type,
400dab
                       NULL);
400dab
 
400dab
         status = gdm_display_get_status (display);
400dab
 
400dab
         switch (status) {
400dab
                 case GDM_DISPLAY_PREPARED:
400dab
                 case GDM_DISPLAY_MANAGED:
400dab
                         if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) ||
400dab
                             (display_number != -1 && status == GDM_DISPLAY_MANAGED)) {
400dab
                                 char *session_class;
400dab
 
400dab
                                 g_object_get (display,
400dab
                                               "session-class", &session_class,
400dab
                                               NULL);
400dab
                                 if (g_strcmp0 (session_class, "greeter") == 0)
400dab
                                         set_up_session (manager, display);
400dab
                                 g_free (session_class);
400dab
                         }
400dab
-
400dab
-                        if (status == GDM_DISPLAY_MANAGED) {
400dab
-                                greeter_display_started (manager, display);
400dab
-                        }
400dab
                         break;
400dab
                 case GDM_DISPLAY_FAILED:
400dab
                 case GDM_DISPLAY_UNMANAGED:
400dab
                 case GDM_DISPLAY_FINISHED:
400dab
 #ifdef WITH_PLYMOUTH
400dab
                         if (quit_plymouth) {
400dab
                                 plymouth_quit_without_transition ();
400dab
                                 manager->priv->plymouth_is_running = FALSE;
400dab
                         }
400dab
 #endif
400dab
 
400dab
                         if (!doing_initial_setup && (status == GDM_DISPLAY_FINISHED || g_strcmp0 (session_type, "x11") == 0)) {
400dab
                                 manager->priv->ran_once = TRUE;
400dab
                         }
400dab
-                        maybe_start_pending_initial_login (manager, display);
400dab
                         break;
400dab
                 default:
400dab
                         break;
400dab
         }
400dab
 
400dab
 }
400dab
 
400dab
 static void
400dab
 on_display_removed (GdmDisplayStore *display_store,
400dab
                     GdmDisplay      *display,
400dab
                     GdmManager      *manager)
400dab
 {
400dab
         char    *id;
400dab
 
400dab
         gdm_display_get_id (display, &id, NULL);
400dab
         g_dbus_object_manager_server_unexport (manager->priv->object_manager, id);
400dab
         g_free (id);
400dab
 
400dab
         g_signal_handlers_disconnect_by_func (display, G_CALLBACK (on_display_status_changed), manager);
400dab
 
400dab
         g_signal_emit (manager, signals[DISPLAY_REMOVED], 0, display);
400dab
 }
400dab
 
400dab
 static void
400dab
 destroy_start_user_session_operation (StartUserSessionOperation *operation)
400dab
 {
400dab
         g_object_set_data (G_OBJECT (operation->session),
400dab
                            "start-user-session-operation",
400dab
                            NULL);
400dab
         g_object_unref (operation->session);
400dab
@@ -1723,97 +1669,87 @@ on_start_user_session (StartUserSessionOperation *operation)
400dab
                 gdm_session_reset (operation->session);
400dab
                 destroy_start_user_session_operation (operation);
400dab
                 goto out;
400dab
         }
400dab
 
400dab
         display = get_display_for_user_session (operation->session);
400dab
 
400dab
         g_object_get (G_OBJECT (display), "doing-initial-setup", &doing_initial_setup, NULL);
400dab
 
400dab
         session_id = gdm_session_get_conversation_session_id (operation->session,
400dab
                                                               operation->service_name);
400dab
 
400dab
         if (gdm_session_get_display_mode (operation->session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) {
400dab
                 /* In this case, the greeter's display is morphing into
400dab
                  * the user session display. Kill the greeter on this session
400dab
                  * and let the user session follow the same display. */
400dab
                 gdm_display_stop_greeter_session (display);
400dab
                 g_object_set (G_OBJECT (display),
400dab
                                 "session-class", "user",
400dab
                                 "session-id", session_id,
400dab
                                 NULL);
400dab
         } else {
400dab
                 uid_t allowed_uid;
400dab
 
400dab
                 g_object_ref (display);
400dab
                 if (doing_initial_setup) {
400dab
                         g_debug ("GdmManager: closing down initial setup display");
400dab
                         gdm_display_stop_greeter_session (display);
400dab
                         gdm_display_unmanage (display);
400dab
                         gdm_display_finish (display);
400dab
-
400dab
-                        /* We can't start the user session until the finished display
400dab
-                         * starts to respawn (since starting an X server and bringing
400dab
-                         * one down at the same time is a no go)
400dab
-                         */
400dab
-                        g_assert (self->priv->initial_login_operation == NULL);
400dab
-                        self->priv->initial_login_operation = operation;
400dab
-                        starting_user_session_right_away = FALSE;
400dab
                 } else {
400dab
                         g_debug ("GdmManager: session has its display server, reusing our server for another login screen");
400dab
                 }
400dab
 
400dab
                 /* The user session is going to follow the session worker
400dab
                  * into the new display. Untie it from this display and
400dab
                  * create a new session for a future user login. */
400dab
                 allowed_uid = gdm_session_get_allowed_user (operation->session);
400dab
                 g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
400dab
                 g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
400dab
                 create_user_session_for_display (operation->manager, display, allowed_uid);
400dab
 
400dab
                 if ((g_strcmp0 (operation->service_name, "gdm-autologin") == 0) &&
400dab
                     !gdm_session_client_is_connected (operation->session)) {
400dab
                         /* remove the unused prepared greeter display since we're not going
400dab
                          * to have a greeter */
400dab
                         gdm_display_store_remove (self->priv->display_store, display);
400dab
                         g_object_unref (display);
400dab
                 }
400dab
 
400dab
                 /* Give the user session a new display object for bookkeeping purposes */
400dab
                 create_display_for_user_session (operation->manager,
400dab
                                                  operation->session,
400dab
                                                  session_id);
400dab
         }
400dab
 
400dab
-        if (starting_user_session_right_away) {
400dab
-                start_user_session (operation->manager, operation);
400dab
-        }
400dab
+        start_user_session (operation->manager, operation);
400dab
 
400dab
  out:
400dab
         return G_SOURCE_REMOVE;
400dab
 }
400dab
 
400dab
 static void
400dab
 queue_start_user_session (GdmManager *manager,
400dab
                           GdmSession *session,
400dab
                           const char *service_name)
400dab
 {
400dab
         StartUserSessionOperation *operation;
400dab
 
400dab
         operation = g_slice_new0 (StartUserSessionOperation);
400dab
         operation->manager = manager;
400dab
         operation->session = g_object_ref (session);
400dab
         operation->service_name = g_strdup (service_name);
400dab
 
400dab
         operation->idle_id = g_idle_add ((GSourceFunc) on_start_user_session, operation);
400dab
         g_object_set_data (G_OBJECT (session), "start-user-session-operation", operation);
400dab
 }
400dab
 
400dab
 static void
400dab
 start_user_session_if_ready (GdmManager *manager,
400dab
                              GdmSession *session,
400dab
                              const char *service_name)
400dab
 {
400dab
         gboolean start_when_ready;
400dab
 
400dab
         start_when_ready = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session), "start-when-ready"));
400dab
         if (start_when_ready) {
400dab
-- 
400dab
2.27.0
400dab