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

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