Blame SOURCES/0002-manager-session-Add-some-debugging-around-starting-r.patch

4dd5a8
From d3b60b5211d804e23c663d053c5b511dede22a28 Mon Sep 17 00:00:00 2001
4dd5a8
From: Iain Lane <iainl@gnome.org>
4dd5a8
Date: Thu, 31 Jan 2019 10:52:35 +0000
4dd5a8
Subject: [PATCH 2/4] manager,session: Add some debugging around starting
4dd5a8
 reauthentication
4dd5a8
4dd5a8
There's a bug right now dealing with timed login and reauthentication,
4dd5a8
but it's not clear what's going on by looking at the logs.
4dd5a8
4dd5a8
This commit sprinkles some more logging throughout the code, to make
4dd5a8
the bug easier to track.
4dd5a8
---
4dd5a8
 daemon/gdm-manager.c | 46 ++++++++++++++++++++++++++++++++++++++------
4dd5a8
 daemon/gdm-session.c | 25 ++++++++++++++++++++----
4dd5a8
 2 files changed, 61 insertions(+), 10 deletions(-)
4dd5a8
4dd5a8
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
4dd5a8
index b2d0578f5..0cc06a978 100644
4dd5a8
--- a/daemon/gdm-manager.c
4dd5a8
+++ b/daemon/gdm-manager.c
4dd5a8
@@ -340,77 +340,94 @@ session_unlock (GdmManager *manager,
4dd5a8
                                              "org.freedesktop.login1.Manager",
4dd5a8
                                              "UnlockSession",
4dd5a8
                                              g_variant_new ("(s)", ssid),
4dd5a8
                                              NULL, /* expected reply */
4dd5a8
                                              G_DBUS_CALL_FLAGS_NONE,
4dd5a8
                                              -1,
4dd5a8
                                              NULL,
4dd5a8
                                              &error);
4dd5a8
         if (reply == NULL) {
4dd5a8
                 g_debug ("GdmManager: logind 'UnlockSession' %s raised:\n %s\n\n",
4dd5a8
                          g_dbus_error_get_remote_error (error), error->message);
4dd5a8
                 g_error_free (error);
4dd5a8
                 return FALSE;
4dd5a8
         }
4dd5a8
 
4dd5a8
         g_variant_unref (reply);
4dd5a8
 
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static GdmSession *
4dd5a8
 find_session_for_user_on_seat (GdmManager *manager,
4dd5a8
                                const char *username,
4dd5a8
                                const char *seat_id,
4dd5a8
                                GdmSession *dont_count_session)
4dd5a8
 {
4dd5a8
         GList *node;
4dd5a8
 
4dd5a8
         for (node = manager->priv->user_sessions; node != NULL; node = node->next) {
4dd5a8
                 GdmSession *candidate_session = node->data;
4dd5a8
-                const char *candidate_username, *candidate_seat_id;
4dd5a8
+                const char *candidate_username, *candidate_seat_id, *candidate_session_id;
4dd5a8
 
4dd5a8
-                if (candidate_session == dont_count_session)
4dd5a8
+                candidate_session_id = gdm_session_get_session_id (candidate_session);
4dd5a8
+
4dd5a8
+                if (candidate_session == dont_count_session) {
4dd5a8
+                        g_debug ("GdmSession: Ignoring session %s as requested",
4dd5a8
+                                 candidate_session_id);
4dd5a8
                         continue;
4dd5a8
+                }
4dd5a8
 
4dd5a8
-                if (!gdm_session_is_running (candidate_session))
4dd5a8
+                if (!gdm_session_is_running (candidate_session)) {
4dd5a8
+                        g_debug ("GdmSession: Ignoring session %s as it isn't running",
4dd5a8
+                                 candidate_session_id);
4dd5a8
                         continue;
4dd5a8
+                }
4dd5a8
 
4dd5a8
                 candidate_username = gdm_session_get_username (candidate_session);
4dd5a8
                 candidate_seat_id = gdm_session_get_display_seat_id (candidate_session);
4dd5a8
 
4dd5a8
+                g_debug ("GdmManager: Considering session %s on seat %s belonging to user %s",
4dd5a8
+                         candidate_session_id,
4dd5a8
+                         candidate_seat_id,
4dd5a8
+                         candidate_username);
4dd5a8
+
4dd5a8
                 if (g_strcmp0 (candidate_username, username) == 0 &&
4dd5a8
                     g_strcmp0 (candidate_seat_id, seat_id) == 0) {
4dd5a8
+                        g_debug ("GdmManager: yes, found session %s", candidate_session_id);
4dd5a8
                         return candidate_session;
4dd5a8
                 }
4dd5a8
+
4dd5a8
+                g_debug ("GdmManager: no, will not use session %s", candidate_session_id);
4dd5a8
         }
4dd5a8
 
4dd5a8
+        g_debug ("GdmManager: no matching sessions found");
4dd5a8
         return NULL;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 is_remote_session (GdmManager  *self,
4dd5a8
                    const char  *session_id,
4dd5a8
                    GError     **error)
4dd5a8
 {
4dd5a8
         char *seat;
4dd5a8
         int ret;
4dd5a8
         gboolean is_remote;
4dd5a8
 
4dd5a8
         /* FIXME: The next release of logind is going to have explicit api for
4dd5a8
          * checking remoteness.
4dd5a8
          */
4dd5a8
         seat = NULL;
4dd5a8
         ret = sd_session_get_seat (session_id, &seat;;
4dd5a8
 
4dd5a8
         if (ret < 0 && ret != -ENOENT) {
4dd5a8
                 g_debug ("GdmManager: Error while retrieving seat for session %s: %s",
4dd5a8
                          session_id, strerror (-ret));
4dd5a8
         }
4dd5a8
 
4dd5a8
         if (seat != NULL) {
4dd5a8
                 is_remote = FALSE;
4dd5a8
                 free (seat);
4dd5a8
         } else {
4dd5a8
                 is_remote = TRUE;
4dd5a8
         }
4dd5a8
 
4dd5a8
@@ -840,62 +857,66 @@ gdm_manager_handle_open_session (GdmDBusManager        *manager,
4dd5a8
         if (display == NULL) {
4dd5a8
                 g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                G_DBUS_ERROR,
4dd5a8
                                                                G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                _("No session available"));
4dd5a8
 
4dd5a8
                 return TRUE;
4dd5a8
         }
4dd5a8
 
4dd5a8
 #ifdef HAVE_LIBXDMCP
4dd5a8
         if (GDM_IS_XDMCP_CHOOSER_DISPLAY (display)) {
4dd5a8
                 GdmLaunchEnvironment *launch_environment;
4dd5a8
 
4dd5a8
                 g_object_get (display, "launch-environment", &launch_environment, NULL);
4dd5a8
 
4dd5a8
                 if (launch_environment != NULL) {
4dd5a8
                         session = gdm_launch_environment_get_session (launch_environment);
4dd5a8
                 }
4dd5a8
 
4dd5a8
                 if (session == NULL) {
4dd5a8
                         g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                        G_DBUS_ERROR,
4dd5a8
                                                                        G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                        _("Chooser session unavailable"));
4dd5a8
                         return TRUE;
4dd5a8
                 }
4dd5a8
         }
4dd5a8
 #endif
4dd5a8
         if (session == NULL) {
4dd5a8
                 session = get_user_session_for_display (display);
4dd5a8
+                g_debug ("GdmSession: Considering session %s for username %s",
4dd5a8
+                         gdm_session_get_session_id (session),
4dd5a8
+                         gdm_session_get_username (session));
4dd5a8
 
4dd5a8
                 if (gdm_session_is_running (session)) {
4dd5a8
+                        g_debug ("GdmSession: the session is running, and therefore can't be used");
4dd5a8
                         g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                        G_DBUS_ERROR,
4dd5a8
                                                                        G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                        _("Can only be called before user is logged in"));
4dd5a8
                         return TRUE;
4dd5a8
                 }
4dd5a8
         }
4dd5a8
 
4dd5a8
         allowed_user = gdm_session_get_allowed_user (session);
4dd5a8
 
4dd5a8
         if (uid != allowed_user) {
4dd5a8
                 g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                G_DBUS_ERROR,
4dd5a8
                                                                G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                _("Caller not GDM"));
4dd5a8
                 return TRUE;
4dd5a8
         }
4dd5a8
 
4dd5a8
         address = gdm_session_get_server_address (session);
4dd5a8
 
4dd5a8
         if (address == NULL) {
4dd5a8
                 g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                G_DBUS_ERROR,
4dd5a8
                                                                G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                _("Unable to open private communication channel"));
4dd5a8
                 return TRUE;
4dd5a8
         }
4dd5a8
 
4dd5a8
         gdm_dbus_manager_complete_open_session (GDM_DBUS_MANAGER (manager),
4dd5a8
                                                 invocation,
4dd5a8
@@ -1017,60 +1038,64 @@ open_temporary_reauthentication_channel (GdmManager            *self,
4dd5a8
                                          char                  *seat_id,
4dd5a8
                                          char                  *session_id,
4dd5a8
                                          GPid                   pid,
4dd5a8
                                          uid_t                  uid,
4dd5a8
                                          gboolean               is_remote)
4dd5a8
 {
4dd5a8
         GdmSession *session;
4dd5a8
         char **environment;
4dd5a8
         const char *display, *auth_file;
4dd5a8
         const char *address;
4dd5a8
 
4dd5a8
         /* Note we're just using a minimal environment here rather than the
4dd5a8
          * session's environment because the caller is unprivileged and the
4dd5a8
          * associated worker will be privileged */
4dd5a8
         environment = g_get_environ ();
4dd5a8
         display = "";
4dd5a8
         auth_file = "/dev/null";
4dd5a8
 
4dd5a8
         session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_REAUTHENTICATE,
4dd5a8
                                    uid,
4dd5a8
                                    display,
4dd5a8
                                    NULL,
4dd5a8
                                    NULL,
4dd5a8
                                    seat_id,
4dd5a8
                                    auth_file,
4dd5a8
                                    is_remote == FALSE,
4dd5a8
                                    (const char * const *)
4dd5a8
                                    environment);
4dd5a8
         g_strfreev (environment);
4dd5a8
 
4dd5a8
+        g_debug ("GdmSession: Created session for temporary reauthentication channel for user %d (seat %s)",
4dd5a8
+                 (int) uid,
4dd5a8
+                 seat_id);
4dd5a8
+
4dd5a8
         g_object_set_data_full (G_OBJECT (session),
4dd5a8
                                 "caller-session-id",
4dd5a8
                                 g_strdup (session_id),
4dd5a8
                                 (GDestroyNotify)
4dd5a8
                                 g_free);
4dd5a8
         g_object_set_data (G_OBJECT (session),
4dd5a8
                            "caller-pid",
4dd5a8
                            GUINT_TO_POINTER (pid));
4dd5a8
         g_hash_table_insert (self->priv->transient_sessions,
4dd5a8
                              GINT_TO_POINTER (pid),
4dd5a8
                              session);
4dd5a8
 
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "client-connected",
4dd5a8
                           G_CALLBACK (on_reauthentication_client_connected),
4dd5a8
                           self);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "client-disconnected",
4dd5a8
                           G_CALLBACK (on_reauthentication_client_disconnected),
4dd5a8
                           self);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "client-rejected",
4dd5a8
                           G_CALLBACK (on_reauthentication_client_rejected),
4dd5a8
                           self);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "cancelled",
4dd5a8
                           G_CALLBACK (on_reauthentication_cancelled),
4dd5a8
                           self);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "conversation-started",
4dd5a8
@@ -1096,65 +1121,67 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager        *manager
4dd5a8
                                                   const char            *username)
4dd5a8
 {
4dd5a8
         GdmManager       *self = GDM_MANAGER (manager);
4dd5a8
         const char       *sender;
4dd5a8
         GdmDisplay       *display = NULL;
4dd5a8
         GdmSession       *session;
4dd5a8
         GDBusConnection  *connection;
4dd5a8
         char             *seat_id = NULL;
4dd5a8
         char             *session_id = NULL;
4dd5a8
         GPid              pid = 0;
4dd5a8
         uid_t             uid = (uid_t) -1;
4dd5a8
         gboolean          is_login_screen = FALSE;
4dd5a8
         gboolean          is_remote = FALSE;
4dd5a8
 
4dd5a8
         g_debug ("GdmManager: trying to open reauthentication channel for user %s", username);
4dd5a8
 
4dd5a8
         sender = g_dbus_method_invocation_get_sender (invocation);
4dd5a8
         connection = g_dbus_method_invocation_get_connection (invocation);
4dd5a8
         get_display_and_details_for_bus_sender (self, connection, sender, &display, &seat_id, &session_id, NULL, &pid, &uid, &is_login_screen, &is_remote);
4dd5a8
 
4dd5a8
         if (session_id == NULL || pid == 0 || uid == (uid_t) -1) {
4dd5a8
                 g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                G_DBUS_ERROR,
4dd5a8
                                                                G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                _("No session available"));
4dd5a8
 
4dd5a8
                 return TRUE;
4dd5a8
         }
4dd5a8
 
4dd5a8
         if (is_login_screen) {
4dd5a8
+                g_debug ("GdmManager: looking for login screen session for user %s on seat %s", username, seat_id);
4dd5a8
                 session = find_session_for_user_on_seat (self,
4dd5a8
                                                          username,
4dd5a8
                                                          seat_id,
4dd5a8
                                                          NULL);
4dd5a8
         } else {
4dd5a8
+                g_debug ("GdmManager: looking for user session on display");
4dd5a8
                 session = get_user_session_for_display (display);
4dd5a8
         }
4dd5a8
 
4dd5a8
         if (session != NULL && gdm_session_is_running (session)) {
4dd5a8
                 gdm_session_start_reauthentication (session, pid, uid);
4dd5a8
                 g_hash_table_insert (self->priv->open_reauthentication_requests,
4dd5a8
                                      GINT_TO_POINTER (pid),
4dd5a8
                                      invocation);
4dd5a8
         } else if (is_login_screen) {
4dd5a8
                 g_dbus_method_invocation_return_error_literal (invocation,
4dd5a8
                                                                G_DBUS_ERROR,
4dd5a8
                                                                G_DBUS_ERROR_ACCESS_DENIED,
4dd5a8
                                                                "Login screen only allowed to open reauthentication channels for running sessions");
4dd5a8
                 return TRUE;
4dd5a8
         } else {
4dd5a8
                 char *address;
4dd5a8
                 address = open_temporary_reauthentication_channel (self,
4dd5a8
                                                                    seat_id,
4dd5a8
                                                                    session_id,
4dd5a8
                                                                    pid,
4dd5a8
                                                                    uid,
4dd5a8
                                                                    is_remote);
4dd5a8
                 gdm_dbus_manager_complete_open_reauthentication_channel (GDM_DBUS_MANAGER (manager),
4dd5a8
                                                                          invocation,
4dd5a8
                                                                          address);
4dd5a8
                 g_free (address);
4dd5a8
         }
4dd5a8
 
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
@@ -2087,107 +2114,107 @@ on_session_client_ready_for_session_to_start (GdmSession      *session,
4dd5a8
         if (client_is_ready) {
4dd5a8
                 g_debug ("GdmManager: Will start session when ready");
4dd5a8
         } else {
4dd5a8
                 g_debug ("GdmManager: Will start session when ready and told");
4dd5a8
         }
4dd5a8
 
4dd5a8
         waiting_to_start_user_session = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session),
4dd5a8
                                                                        "waiting-to-start"));
4dd5a8
 
4dd5a8
         g_object_set_data (G_OBJECT (session),
4dd5a8
                            "start-when-ready",
4dd5a8
                            GINT_TO_POINTER (client_is_ready));
4dd5a8
 
4dd5a8
         if (client_is_ready && waiting_to_start_user_session) {
4dd5a8
                 start_user_session_if_ready (manager, session, service_name);
4dd5a8
         }
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 on_session_client_connected (GdmSession      *session,
4dd5a8
                              GCredentials    *credentials,
4dd5a8
                              GPid             pid_of_client,
4dd5a8
                              GdmManager      *manager)
4dd5a8
 {
4dd5a8
         GdmDisplay *display;
4dd5a8
         char    *username;
4dd5a8
         int      delay;
4dd5a8
         gboolean enabled;
4dd5a8
         gboolean allow_timed_login = FALSE;
4dd5a8
 
4dd5a8
-        g_debug ("GdmManager: client connected");
4dd5a8
+        g_debug ("GdmManager: client with pid %d connected", (int) pid_of_client);
4dd5a8
 
4dd5a8
         display = get_display_for_user_session (session);
4dd5a8
 
4dd5a8
         if (display == NULL) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         if (!display_is_on_seat0 (display)) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
 #ifdef WITH_PLYMOUTH
4dd5a8
         if (manager->priv->plymouth_is_running) {
4dd5a8
                 plymouth_quit_with_transition ();
4dd5a8
                 manager->priv->plymouth_is_running = FALSE;
4dd5a8
         }
4dd5a8
 #endif
4dd5a8
 
4dd5a8
         g_object_get (G_OBJECT (display), "allow-timed-login", &allow_timed_login, NULL);
4dd5a8
 
4dd5a8
         if (!allow_timed_login) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         enabled = get_timed_login_details (manager, &username, &delay);
4dd5a8
 
4dd5a8
         if (! enabled) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         gdm_session_set_timed_login_details (session, username, delay);
4dd5a8
 
4dd5a8
         g_debug ("GdmManager: Starting automatic login conversation (for timed login)");
4dd5a8
         gdm_session_start_conversation (session, "gdm-autologin");
4dd5a8
 
4dd5a8
         g_free (username);
4dd5a8
 
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 on_session_client_disconnected (GdmSession   *session,
4dd5a8
                                 GCredentials *credentials,
4dd5a8
                                 GPid          pid_of_client,
4dd5a8
                                 GdmManager   *manager)
4dd5a8
 {
4dd5a8
-        g_debug ("GdmManager: client disconnected");
4dd5a8
+        g_debug ("GdmManager: client with pid %d disconnected", (int) pid_of_client);
4dd5a8
 }
4dd5a8
 
4dd5a8
 typedef struct
4dd5a8
 {
4dd5a8
         GdmManager *manager;
4dd5a8
         GdmSession *session;
4dd5a8
         guint idle_id;
4dd5a8
 } ResetSessionOperation;
4dd5a8
 
4dd5a8
 static void
4dd5a8
 destroy_reset_session_operation (ResetSessionOperation *operation)
4dd5a8
 {
4dd5a8
         g_object_set_data (G_OBJECT (operation->session),
4dd5a8
                            "reset-session-operation",
4dd5a8
                            NULL);
4dd5a8
         g_object_unref (operation->session);
4dd5a8
         g_slice_free (ResetSessionOperation, operation);
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 on_reset_session (ResetSessionOperation *operation)
4dd5a8
 {
4dd5a8
         gdm_session_reset (operation->session);
4dd5a8
 
4dd5a8
         destroy_reset_session_operation (operation);
4dd5a8
 
4dd5a8
         return G_SOURCE_REMOVE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
@@ -2200,63 +2227,64 @@ queue_session_reset (GdmManager *manager,
4dd5a8
 
4dd5a8
         if (operation != NULL) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         operation = g_slice_new0 (ResetSessionOperation);
4dd5a8
         operation->manager = manager;
4dd5a8
         operation->session = g_object_ref (session);
4dd5a8
         operation->idle_id = g_idle_add ((GSourceFunc) on_reset_session, operation);
4dd5a8
 
4dd5a8
         g_object_set_data (G_OBJECT (session), "reset-session-operation", operation);
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 on_session_cancelled (GdmSession  *session,
4dd5a8
                       GdmManager  *manager)
4dd5a8
 {
4dd5a8
         g_debug ("GdmManager: Session was cancelled");
4dd5a8
         queue_session_reset (manager, session);
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 on_session_conversation_started (GdmSession *session,
4dd5a8
                                  const char *service_name,
4dd5a8
                                  GdmManager *manager)
4dd5a8
 {
4dd5a8
         GdmDisplay *display;
4dd5a8
         gboolean    enabled;
4dd5a8
         char       *username;
4dd5a8
 
4dd5a8
-        g_debug ("GdmManager: session conversation started for service %s", service_name);
4dd5a8
+        g_debug ("GdmManager: session conversation started for service %s on session", service_name);
4dd5a8
 
4dd5a8
         if (g_strcmp0 (service_name, "gdm-autologin") != 0) {
4dd5a8
+                g_debug ("GdmManager: ignoring session conversation since its not automatic login conversation");
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         display = get_display_for_user_session (session);
4dd5a8
 
4dd5a8
         if (display == NULL) {
4dd5a8
                 g_debug ("GdmManager: conversation has no associated display");
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         if (!display_is_on_seat0 (display)) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         enabled = get_automatic_login_details (manager, &username);
4dd5a8
 
4dd5a8
         if (! enabled) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         g_debug ("GdmManager: begin auto login for user '%s'", username);
4dd5a8
 
4dd5a8
         /* service_name will be "gdm-autologin"
4dd5a8
          */
4dd5a8
         gdm_session_setup_for_user (session, service_name, username);
4dd5a8
 
4dd5a8
         g_free (username);
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
@@ -2312,60 +2340,66 @@ create_user_session_for_display (GdmManager *manager,
4dd5a8
         char       *display_auth_file = NULL;
4dd5a8
         char       *display_seat_id = NULL;
4dd5a8
         char       *display_id = NULL;
4dd5a8
 #if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
4dd5a8
         char       *display_session_type = NULL;
4dd5a8
         gboolean    greeter_is_wayland;
4dd5a8
 #endif
4dd5a8
 
4dd5a8
         g_object_get (G_OBJECT (display),
4dd5a8
                       "id", &display_id,
4dd5a8
                       "x11-display-name", &display_name,
4dd5a8
                       "is-local", &display_is_local,
4dd5a8
                       "remote-hostname", &remote_hostname,
4dd5a8
                       "x11-authority-file", &display_auth_file,
4dd5a8
                       "seat-id", &display_seat_id,
4dd5a8
 #if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
4dd5a8
                       "session-type", &display_session_type,
4dd5a8
 #endif
4dd5a8
                       NULL);
4dd5a8
         display_device = get_display_device (manager, display);
4dd5a8
 
4dd5a8
         session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN,
4dd5a8
                                    allowed_user,
4dd5a8
                                    display_name,
4dd5a8
                                    remote_hostname,
4dd5a8
                                    display_device,
4dd5a8
                                    display_seat_id,
4dd5a8
                                    display_auth_file,
4dd5a8
                                    display_is_local,
4dd5a8
                                    NULL);
4dd5a8
+
4dd5a8
+        g_debug ("GdmSession: Created user session for user %d on display %s (seat %s)",
4dd5a8
+                 (int) allowed_user,
4dd5a8
+                 display_id,
4dd5a8
+                 display_seat_id);
4dd5a8
+
4dd5a8
         g_free (display_name);
4dd5a8
         g_free (remote_hostname);
4dd5a8
         g_free (display_auth_file);
4dd5a8
         g_free (display_seat_id);
4dd5a8
 
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "reauthentication-started",
4dd5a8
                           G_CALLBACK (on_session_reauthentication_started),
4dd5a8
                           manager);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "reauthenticated",
4dd5a8
                           G_CALLBACK (on_session_reauthenticated),
4dd5a8
                           manager);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "client-ready-for-session-to-start",
4dd5a8
                           G_CALLBACK (on_session_client_ready_for_session_to_start),
4dd5a8
                           manager);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "client-connected",
4dd5a8
                           G_CALLBACK (on_session_client_connected),
4dd5a8
                           manager);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "client-disconnected",
4dd5a8
                           G_CALLBACK (on_session_client_disconnected),
4dd5a8
                           manager);
4dd5a8
         g_signal_connect (session,
4dd5a8
                           "cancelled",
4dd5a8
                           G_CALLBACK (on_session_cancelled),
4dd5a8
                           manager);
4dd5a8
         g_signal_connect (session,
4dd5a8
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
4dd5a8
index 0f821e390..f23a83c5e 100644
4dd5a8
--- a/daemon/gdm-session.c
4dd5a8
+++ b/daemon/gdm-session.c
4dd5a8
@@ -624,61 +624,64 @@ get_fallback_session_name (GdmSession *self)
4dd5a8
 
4dd5a8
 static const char *
4dd5a8
 get_default_session_name (GdmSession *self)
4dd5a8
 {
4dd5a8
         if (self->priv->saved_session != NULL) {
4dd5a8
                 return self->priv->saved_session;
4dd5a8
         }
4dd5a8
 
4dd5a8
         return get_fallback_session_name (self);
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 gdm_session_defaults_changed (GdmSession *self)
4dd5a8
 {
4dd5a8
 
4dd5a8
         update_session_type (self);
4dd5a8
 
4dd5a8
         if (self->priv->greeter_interface != NULL) {
4dd5a8
                 gdm_dbus_greeter_emit_default_language_name_changed (self->priv->greeter_interface,
4dd5a8
                                                                      get_default_language_name (self));
4dd5a8
                 gdm_dbus_greeter_emit_default_session_name_changed (self->priv->greeter_interface,
4dd5a8
                                                                     get_default_session_name (self));
4dd5a8
         }
4dd5a8
 }
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_select_user (GdmSession *self,
4dd5a8
                          const char *text)
4dd5a8
 {
4dd5a8
 
4dd5a8
-        g_debug ("GdmSession: Setting user: '%s'", text);
4dd5a8
+        g_debug ("GdmSession: selecting user '%s' for session '%s' (%p)",
4dd5a8
+                 text,
4dd5a8
+                 gdm_session_get_session_id (self),
4dd5a8
+                 self);
4dd5a8
 
4dd5a8
         g_free (self->priv->selected_user);
4dd5a8
         self->priv->selected_user = g_strdup (text);
4dd5a8
 
4dd5a8
         g_free (self->priv->saved_session);
4dd5a8
         self->priv->saved_session = NULL;
4dd5a8
 
4dd5a8
         g_free (self->priv->saved_session_type);
4dd5a8
         self->priv->saved_session_type = NULL;
4dd5a8
 
4dd5a8
         g_free (self->priv->saved_language);
4dd5a8
         self->priv->saved_language = NULL;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 cancel_pending_query (GdmSessionConversation *conversation)
4dd5a8
 {
4dd5a8
         if (conversation->pending_invocation == NULL) {
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         g_debug ("GdmSession: Cancelling pending query");
4dd5a8
 
4dd5a8
         g_dbus_method_invocation_return_dbus_error (conversation->pending_invocation,
4dd5a8
                                                     GDM_SESSION_DBUS_ERROR_CANCEL,
4dd5a8
                                                     "Operation cancelled");
4dd5a8
         conversation->pending_invocation = NULL;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
@@ -1416,117 +1419,121 @@ gdm_session_handle_client_cancel (GdmDBusUserVerifier    *user_verifier_interfac
4dd5a8
         gdm_dbus_user_verifier_complete_cancel (user_verifier_interface,
4dd5a8
                                                 invocation);
4dd5a8
         gdm_session_cancel (self);
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 gdm_session_handle_client_select_session (GdmDBusGreeter         *greeter_interface,
4dd5a8
                                           GDBusMethodInvocation  *invocation,
4dd5a8
                                           const char             *session,
4dd5a8
                                           GdmSession             *self)
4dd5a8
 {
4dd5a8
         if (self->priv->greeter_interface != NULL) {
4dd5a8
                 gdm_dbus_greeter_complete_select_session (greeter_interface,
4dd5a8
                                                           invocation);
4dd5a8
         }
4dd5a8
         gdm_session_select_session (self, session);
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 gdm_session_handle_client_select_user (GdmDBusGreeter        *greeter_interface,
4dd5a8
                                        GDBusMethodInvocation *invocation,
4dd5a8
                                        const char            *username,
4dd5a8
                                        GdmSession            *self)
4dd5a8
 {
4dd5a8
         if (self->priv->greeter_interface != NULL) {
4dd5a8
                 gdm_dbus_greeter_complete_select_user (greeter_interface,
4dd5a8
                                                        invocation);
4dd5a8
         }
4dd5a8
+        g_debug ("GdmSession: client selected user '%s' on session (%p)", username, self);
4dd5a8
         gdm_session_select_user (self, username);
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 gdm_session_handle_client_start_session_when_ready (GdmDBusGreeter        *greeter_interface,
4dd5a8
                                                     GDBusMethodInvocation *invocation,
4dd5a8
                                                     const char            *service_name,
4dd5a8
                                                     gboolean               client_is_ready,
4dd5a8
                                                     GdmSession            *self)
4dd5a8
 {
4dd5a8
 
4dd5a8
         if (self->priv->greeter_interface != NULL) {
4dd5a8
                 gdm_dbus_greeter_complete_start_session_when_ready (greeter_interface,
4dd5a8
                                                                     invocation);
4dd5a8
         }
4dd5a8
         g_signal_emit (G_OBJECT (self),
4dd5a8
                        signals [CLIENT_READY_FOR_SESSION_TO_START],
4dd5a8
                        0,
4dd5a8
                        service_name,
4dd5a8
                        client_is_ready);
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 gdm_session_handle_get_timed_login_details (GdmDBusGreeter        *greeter_interface,
4dd5a8
                                             GDBusMethodInvocation *invocation,
4dd5a8
                                             GdmSession            *self)
4dd5a8
 {
4dd5a8
 
4dd5a8
         if (self->priv->greeter_interface != NULL) {
4dd5a8
                 gdm_dbus_greeter_complete_get_timed_login_details (greeter_interface,
4dd5a8
                                                                    invocation,
4dd5a8
                                                                    self->priv->timed_login_username != NULL,
4dd5a8
                                                                    self->priv->timed_login_username != NULL? self->priv->timed_login_username : "",
4dd5a8
                                                                    self->priv->timed_login_delay);
4dd5a8
                 if (self->priv->timed_login_username != NULL) {
4dd5a8
                         gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
4dd5a8
                                                                      self->priv->timed_login_username,
4dd5a8
                                                                      self->priv->timed_login_delay);
4dd5a8
                 }
4dd5a8
         }
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static gboolean
4dd5a8
 gdm_session_handle_client_begin_auto_login (GdmDBusGreeter        *greeter_interface,
4dd5a8
                                             GDBusMethodInvocation *invocation,
4dd5a8
                                             const char            *username,
4dd5a8
                                             GdmSession            *self)
4dd5a8
 {
4dd5a8
         if (self->priv->greeter_interface != NULL) {
4dd5a8
                 gdm_dbus_greeter_complete_begin_auto_login (greeter_interface,
4dd5a8
                                                             invocation);
4dd5a8
         }
4dd5a8
 
4dd5a8
-        g_debug ("GdmSession: begin auto login for user '%s'", username);
4dd5a8
+        g_debug ("GdmSession: client requesting automatic login for user '%s' on session '%s' (%p)",
4dd5a8
+                 username,
4dd5a8
+                 gdm_session_get_session_id (self),
4dd5a8
+                 self);
4dd5a8
 
4dd5a8
         gdm_session_setup_for_user (self, "gdm-autologin", username);
4dd5a8
 
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 export_user_verifier_interface (GdmSession      *self,
4dd5a8
                                 GDBusConnection *connection)
4dd5a8
 {
4dd5a8
         GdmDBusUserVerifier   *user_verifier_interface;
4dd5a8
         user_verifier_interface = GDM_DBUS_USER_VERIFIER (gdm_dbus_user_verifier_skeleton_new ());
4dd5a8
 
4dd5a8
         g_object_set_data (G_OBJECT (connection), "gdm-session", self);
4dd5a8
 
4dd5a8
         g_signal_connect (user_verifier_interface,
4dd5a8
                           "handle-enable-extensions",
4dd5a8
                           G_CALLBACK (gdm_session_handle_client_enable_extensions),
4dd5a8
                           connection);
4dd5a8
         g_signal_connect (user_verifier_interface,
4dd5a8
                           "handle-begin-verification",
4dd5a8
                           G_CALLBACK (gdm_session_handle_client_begin_verification),
4dd5a8
                           self);
4dd5a8
         g_signal_connect (user_verifier_interface,
4dd5a8
                           "handle-begin-verification-for-user",
4dd5a8
                           G_CALLBACK (gdm_session_handle_client_begin_verification_for_user),
4dd5a8
                           self);
4dd5a8
         g_signal_connect (user_verifier_interface,
4dd5a8
                           "handle-answer-query",
4dd5a8
                           G_CALLBACK (gdm_session_handle_client_answer_query),
4dd5a8
@@ -1775,61 +1782,63 @@ allow_user_function (GDBusAuthObserver *observer,
4dd5a8
 {
4dd5a8
         uid_t client_uid;
4dd5a8
         GPid  pid_of_client;
4dd5a8
 
4dd5a8
         client_uid = g_credentials_get_unix_user (credentials, NULL);
4dd5a8
         if (client_uid == self->priv->allowed_user) {
4dd5a8
                 return TRUE;
4dd5a8
         }
4dd5a8
 
4dd5a8
         g_debug ("GdmSession: User not allowed");
4dd5a8
 
4dd5a8
         pid_of_client = g_credentials_get_unix_pid (credentials, NULL);
4dd5a8
         g_signal_emit (G_OBJECT (self),
4dd5a8
                        signals [CLIENT_REJECTED],
4dd5a8
                        0,
4dd5a8
                        credentials,
4dd5a8
                        (guint)
4dd5a8
                        pid_of_client);
4dd5a8
 
4dd5a8
 
4dd5a8
         return FALSE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 setup_outside_server (GdmSession *self)
4dd5a8
 {
4dd5a8
         GDBusAuthObserver *observer;
4dd5a8
         GDBusServer *server;
4dd5a8
         GError *error = NULL;
4dd5a8
 
4dd5a8
-        g_debug ("GdmSession: Creating D-Bus server for greeters and such");
4dd5a8
+         g_debug ("GdmSession: Creating D-Bus server for greeters and such for session %s (%p)",
4dd5a8
+                  gdm_session_get_session_id (self),
4dd5a8
+                  self);
4dd5a8
 
4dd5a8
         observer = g_dbus_auth_observer_new ();
4dd5a8
         g_signal_connect_object (observer,
4dd5a8
                                  "authorize-authenticated-peer",
4dd5a8
                                  G_CALLBACK (allow_user_function),
4dd5a8
                                  self,
4dd5a8
                                  0);
4dd5a8
 
4dd5a8
         server = gdm_dbus_setup_private_server (observer, &error);
4dd5a8
         g_object_unref (observer);
4dd5a8
 
4dd5a8
         if (server == NULL) {
4dd5a8
                 g_warning ("Cannot create greeter D-Bus server for the session: %s",
4dd5a8
                            error->message);
4dd5a8
                 return;
4dd5a8
         }
4dd5a8
 
4dd5a8
         g_signal_connect_object (server,
4dd5a8
                                  "new-connection",
4dd5a8
                                  G_CALLBACK (handle_connection_from_outside),
4dd5a8
                                  self,
4dd5a8
                                  0);
4dd5a8
         self->priv->outside_server = server;
4dd5a8
 
4dd5a8
         g_dbus_server_start (server);
4dd5a8
 
4dd5a8
         g_debug ("GdmSession: D-Bus server for greeters listening on %s",
4dd5a8
         g_dbus_server_get_client_address (self->priv->outside_server));
4dd5a8
 }
4dd5a8
 
4dd5a8
@@ -2160,61 +2169,61 @@ stop_conversation_now (GdmSessionConversation *conversation)
4dd5a8
 void
4dd5a8
 gdm_session_set_ignore_wayland (GdmSession *self,
4dd5a8
                                 gboolean    ignore_wayland)
4dd5a8
 {
4dd5a8
         self->priv->ignore_wayland = ignore_wayland;
4dd5a8
 }
4dd5a8
 #endif
4dd5a8
 
4dd5a8
 gboolean
4dd5a8
 gdm_session_start_conversation (GdmSession *self,
4dd5a8
                                 const char *service_name)
4dd5a8
 {
4dd5a8
         GdmSessionConversation *conversation;
4dd5a8
 
4dd5a8
         g_return_val_if_fail (GDM_IS_SESSION (self), FALSE);
4dd5a8
 
4dd5a8
         conversation = g_hash_table_lookup (self->priv->conversations,
4dd5a8
                                             service_name);
4dd5a8
 
4dd5a8
         if (conversation != NULL) {
4dd5a8
                 if (!conversation->is_stopping) {
4dd5a8
                         g_warning ("GdmSession: conversation %s started more than once", service_name);
4dd5a8
                         return FALSE;
4dd5a8
                 }
4dd5a8
                 g_debug ("GdmSession: stopping old conversation %s", service_name);
4dd5a8
                 gdm_session_worker_job_stop_now (conversation->job);
4dd5a8
                 g_object_unref (conversation->job);
4dd5a8
                 conversation->job = NULL;
4dd5a8
         }
4dd5a8
 
4dd5a8
-        g_debug ("GdmSession: starting conversation %s", service_name);
4dd5a8
+        g_debug ("GdmSession: starting conversation %s for session (%p)", service_name, self);
4dd5a8
 
4dd5a8
         conversation = start_conversation (self, service_name);
4dd5a8
 
4dd5a8
         g_hash_table_insert (self->priv->conversations,
4dd5a8
                              g_strdup (service_name), conversation);
4dd5a8
         return TRUE;
4dd5a8
 }
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_stop_conversation (GdmSession *self,
4dd5a8
                                const char *service_name)
4dd5a8
 {
4dd5a8
         GdmSessionConversation *conversation;
4dd5a8
 
4dd5a8
         g_return_if_fail (GDM_IS_SESSION (self));
4dd5a8
 
4dd5a8
         g_debug ("GdmSession: stopping conversation %s", service_name);
4dd5a8
 
4dd5a8
         conversation = find_conversation_by_name (self, service_name);
4dd5a8
 
4dd5a8
         if (conversation != NULL) {
4dd5a8
                 stop_conversation (conversation);
4dd5a8
         }
4dd5a8
 }
4dd5a8
 
4dd5a8
 static void
4dd5a8
 on_initialization_complete_cb (GdmDBusWorker *proxy,
4dd5a8
                                GAsyncResult  *res,
4dd5a8
                                gpointer       user_data)
4dd5a8
 {
4dd5a8
@@ -2319,60 +2328,64 @@ initialize (GdmSession *self,
4dd5a8
         }
4dd5a8
 
4dd5a8
         g_free (extensions);
4dd5a8
 }
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_setup (GdmSession *self,
4dd5a8
                    const char *service_name)
4dd5a8
 {
4dd5a8
 
4dd5a8
         g_return_if_fail (GDM_IS_SESSION (self));
4dd5a8
 
4dd5a8
         update_session_type (self);
4dd5a8
 
4dd5a8
         initialize (self, service_name, NULL, NULL);
4dd5a8
         gdm_session_defaults_changed (self);
4dd5a8
 }
4dd5a8
 
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_setup_for_user (GdmSession *self,
4dd5a8
                             const char *service_name,
4dd5a8
                             const char *username)
4dd5a8
 {
4dd5a8
 
4dd5a8
         g_return_if_fail (GDM_IS_SESSION (self));
4dd5a8
         g_return_if_fail (username != NULL);
4dd5a8
 
4dd5a8
         update_session_type (self);
4dd5a8
 
4dd5a8
+        g_debug ("GdmSession: Set up service %s for username %s on session (%p)",
4dd5a8
+                 service_name,
4dd5a8
+                 username,
4dd5a8
+                 self);
4dd5a8
         gdm_session_select_user (self, username);
4dd5a8
 
4dd5a8
         self->priv->is_program_session = FALSE;
4dd5a8
         initialize (self, service_name, self->priv->selected_user, NULL);
4dd5a8
         gdm_session_defaults_changed (self);
4dd5a8
 }
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_setup_for_program (GdmSession *self,
4dd5a8
                                const char *service_name,
4dd5a8
                                const char *username,
4dd5a8
                                const char *log_file)
4dd5a8
 {
4dd5a8
 
4dd5a8
         g_return_if_fail (GDM_IS_SESSION (self));
4dd5a8
 
4dd5a8
         self->priv->is_program_session = TRUE;
4dd5a8
         initialize (self, service_name, username, log_file);
4dd5a8
 }
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_authenticate (GdmSession *self,
4dd5a8
                           const char *service_name)
4dd5a8
 {
4dd5a8
         GdmSessionConversation *conversation;
4dd5a8
 
4dd5a8
         g_return_if_fail (GDM_IS_SESSION (self));
4dd5a8
 
4dd5a8
         conversation = find_conversation_by_name (self, service_name);
4dd5a8
         if (conversation != NULL) {
4dd5a8
@@ -2968,60 +2981,64 @@ gdm_session_set_timed_login_details (GdmSession *self,
4dd5a8
 
4dd5a8
 gboolean
4dd5a8
 gdm_session_is_running (GdmSession *self)
4dd5a8
 {
4dd5a8
         return self->priv->session_pid > 0;
4dd5a8
 }
4dd5a8
 
4dd5a8
 gboolean
4dd5a8
 gdm_session_client_is_connected (GdmSession *self)
4dd5a8
 {
4dd5a8
         g_return_val_if_fail (GDM_IS_SESSION (self), FALSE);
4dd5a8
 
4dd5a8
         return self->priv->outside_connections != NULL;
4dd5a8
 }
4dd5a8
 
4dd5a8
 uid_t
4dd5a8
 gdm_session_get_allowed_user (GdmSession *self)
4dd5a8
 {
4dd5a8
         return self->priv->allowed_user;
4dd5a8
 }
4dd5a8
 
4dd5a8
 void
4dd5a8
 gdm_session_start_reauthentication (GdmSession *session,
4dd5a8
                                     GPid        pid_of_caller,
4dd5a8
                                     uid_t       uid_of_caller)
4dd5a8
 {
4dd5a8
         GdmSessionConversation *conversation = session->priv->session_conversation;
4dd5a8
 
4dd5a8
         g_return_if_fail (conversation != NULL);
4dd5a8
 
4dd5a8
+        g_debug ("GdmSession: starting reauthentication for session %s for client with pid %d",
4dd5a8
+                 conversation->session_id,
4dd5a8
+                 (int) uid_of_caller);
4dd5a8
+
4dd5a8
         conversation->reauth_pid_of_caller = pid_of_caller;
4dd5a8
 
4dd5a8
         gdm_dbus_worker_call_start_reauthentication (conversation->worker_proxy,
4dd5a8
                                                      (int) pid_of_caller,
4dd5a8
                                                      (int) uid_of_caller,
4dd5a8
                                                      conversation->worker_cancellable,
4dd5a8
                                                      (GAsyncReadyCallback) on_reauthentication_started_cb,
4dd5a8
                                                      conversation);
4dd5a8
 }
4dd5a8
 
4dd5a8
 const char *
4dd5a8
 gdm_session_get_server_address (GdmSession *self)
4dd5a8
 {
4dd5a8
         g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
4dd5a8
 
4dd5a8
         return g_dbus_server_get_client_address (self->priv->outside_server);
4dd5a8
 }
4dd5a8
 
4dd5a8
 const char *
4dd5a8
 gdm_session_get_username (GdmSession *self)
4dd5a8
 {
4dd5a8
         g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
4dd5a8
 
4dd5a8
         return self->priv->selected_user;
4dd5a8
 }
4dd5a8
 
4dd5a8
 const char *
4dd5a8
 gdm_session_get_display_device (GdmSession *self)
4dd5a8
 {
4dd5a8
         g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
4dd5a8
-- 
4dd5a8
2.21.0
4dd5a8