Blame SOURCES/fix-session-chooser-for-smartcards.patch

ef3d3d
From 8ce3d6268c5ff8f38062c62b487362ac728afa97 Mon Sep 17 00:00:00 2001
ef3d3d
From: Ray Strode <rstrode@redhat.com>
ef3d3d
Date: Thu, 13 Nov 2014 10:57:05 -0500
ef3d3d
Subject: [PATCH] worker: make sure SavedSessionNameRead is emitted for
ef3d3d
 conversations without initial username
ef3d3d
ef3d3d
We emit SavedSessionNameRead when we know the session associated with a
ef3d3d
user account. Unfortunately, we don't emit the signal in the case we
ef3d3d
don't know the username up front (such as with a smartcard).
ef3d3d
ef3d3d
This commit fixes it to be emitted in that case.
ef3d3d
---
ef3d3d
 daemon/gdm-session-worker.c | 33 +++++++++++++++++++++------------
ef3d3d
 1 file changed, 21 insertions(+), 12 deletions(-)
ef3d3d
ef3d3d
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
ef3d3d
index eb81450..731fcf5 100644
ef3d3d
--- a/daemon/gdm-session-worker.c
ef3d3d
+++ b/daemon/gdm-session-worker.c
ef3d3d
@@ -2131,72 +2131,60 @@ on_saved_session_name_read (GdmSessionWorker *worker)
ef3d3d
         g_debug ("GdmSessionWorker: Saved session is %s", session_name);
ef3d3d
         gdm_dbus_worker_emit_saved_session_name_read (GDM_DBUS_WORKER (worker),
ef3d3d
                                                       session_name);
ef3d3d
         g_free (session_name);
ef3d3d
 }
ef3d3d
ef3d3d
 static void
ef3d3d
 do_setup (GdmSessionWorker *worker)
ef3d3d
 {
ef3d3d
         GError  *error;
ef3d3d
         gboolean res;
ef3d3d
ef3d3d
         error = NULL;
ef3d3d
         res = gdm_session_worker_initialize_pam (worker,
ef3d3d
                                                  worker->priv->service,
ef3d3d
                                                  worker->priv->username,
ef3d3d
                                                  worker->priv->hostname,
ef3d3d
                                                  worker->priv->display_is_local,
ef3d3d
                                                  worker->priv->x11_display_name,
ef3d3d
                                                  worker->priv->x11_authority_file,
ef3d3d
                                                  worker->priv->display_device,
ef3d3d
                                                  worker->priv->display_seat_id,
ef3d3d
                                                  &error);
ef3d3d
ef3d3d
         if (res) {
ef3d3d
                 g_dbus_method_invocation_return_value (worker->priv->pending_invocation, NULL);
ef3d3d
         } else {
ef3d3d
                 g_dbus_method_invocation_take_error (worker->priv->pending_invocation, error);
ef3d3d
         }
ef3d3d
         worker->priv->pending_invocation = NULL;
ef3d3d
-
ef3d3d
-        /* These singal handlers should be disconnected after the loading,
ef3d3d
-         * so that gdm_session_settings_set_* APIs don't cause the emitting
ef3d3d
-         * of Saved*NameRead D-Bus signals any more.
ef3d3d
-         */
ef3d3d
-        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
ef3d3d
-                                              G_CALLBACK (on_saved_session_name_read),
ef3d3d
-                                              worker);
ef3d3d
-
ef3d3d
-        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
ef3d3d
-                                              G_CALLBACK (on_saved_language_name_read),
ef3d3d
-                                              worker);
ef3d3d
 }
ef3d3d
ef3d3d
 static void
ef3d3d
 do_authenticate (GdmSessionWorker *worker)
ef3d3d
 {
ef3d3d
         GError  *error;
ef3d3d
         gboolean res;
ef3d3d
ef3d3d
         /* find out who the user is and ensure they are who they say they are
ef3d3d
          */
ef3d3d
         error = NULL;
ef3d3d
         res = gdm_session_worker_authenticate_user (worker,
ef3d3d
                                                     worker->priv->password_is_required,
ef3d3d
                                                     &error);
ef3d3d
         if (res) {
ef3d3d
                 /* we're authenticated.  Let's make sure we've been given
ef3d3d
                  * a valid username for the system
ef3d3d
                  */
ef3d3d
                 if (!worker->priv->is_program_session) {
ef3d3d
                         g_debug ("GdmSessionWorker: trying to get updated username");
ef3d3d
                         gdm_session_worker_update_username (worker);
ef3d3d
                 }
ef3d3d
ef3d3d
                 gdm_dbus_worker_complete_authenticate (GDM_DBUS_WORKER (worker), worker->priv->pending_invocation);
ef3d3d
         } else {
ef3d3d
                 g_debug ("GdmSessionWorker: Unable to verify user");
ef3d3d
                 g_dbus_method_invocation_take_error (worker->priv->pending_invocation, error);
ef3d3d
         }
ef3d3d
         worker->priv->pending_invocation = NULL;
ef3d3d
 }
ef3d3d
@@ -2236,60 +2224,72 @@ do_accredit (GdmSessionWorker *worker)
ef3d3d
                 gdm_dbus_worker_complete_establish_credentials (GDM_DBUS_WORKER (worker), worker->priv->pending_invocation);
ef3d3d
         } else {
ef3d3d
                 g_dbus_method_invocation_take_error (worker->priv->pending_invocation, error);
ef3d3d
         }
ef3d3d
         worker->priv->pending_invocation = NULL;
ef3d3d
 }
ef3d3d
ef3d3d
 static void
ef3d3d
 save_account_details_now (GdmSessionWorker *worker)
ef3d3d
 {
ef3d3d
         g_assert (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCREDITED);
ef3d3d
ef3d3d
         g_debug ("GdmSessionWorker: saving account details for user %s", worker->priv->username);
ef3d3d
         worker->priv->state = GDM_SESSION_WORKER_STATE_ACCOUNT_DETAILS_SAVED;
ef3d3d
         if (!gdm_session_settings_save (worker->priv->user_settings,
ef3d3d
                                         worker->priv->username)) {
ef3d3d
                 g_warning ("could not save session and language settings");
ef3d3d
         }
ef3d3d
         queue_state_change (worker);
ef3d3d
 }
ef3d3d
ef3d3d
 static void
ef3d3d
 on_settings_is_loaded_changed (GdmSessionSettings *user_settings,
ef3d3d
                                GParamSpec         *pspec,
ef3d3d
                                GdmSessionWorker   *worker)
ef3d3d
 {
ef3d3d
         if (!gdm_session_settings_is_loaded (worker->priv->user_settings)) {
ef3d3d
                 return;
ef3d3d
         }
ef3d3d
ef3d3d
+        /* These singal handlers should be disconnected after the loading,
ef3d3d
+         * so that gdm_session_settings_set_* APIs don't cause the emitting
ef3d3d
+         * of Saved*NameRead D-Bus signals any more.
ef3d3d
+         */
ef3d3d
+        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
ef3d3d
+                                              G_CALLBACK (on_saved_session_name_read),
ef3d3d
+                                              worker);
ef3d3d
+
ef3d3d
+        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
ef3d3d
+                                              G_CALLBACK (on_saved_language_name_read),
ef3d3d
+                                              worker);
ef3d3d
+
ef3d3d
         if (worker->priv->state == GDM_SESSION_WORKER_STATE_NONE) {
ef3d3d
                 g_debug ("GdmSessionWorker: queuing setup for user: %s %s",
ef3d3d
                          worker->priv->username, worker->priv->display_device);
ef3d3d
                 queue_state_change (worker);
ef3d3d
         } else if (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCREDITED) {
ef3d3d
                 save_account_details_now (worker);
ef3d3d
         } else {
ef3d3d
                 return;
ef3d3d
         }
ef3d3d
ef3d3d
         g_signal_handlers_disconnect_by_func (G_OBJECT (worker->priv->user_settings),
ef3d3d
                                               G_CALLBACK (on_settings_is_loaded_changed),
ef3d3d
                                               worker);
ef3d3d
 }
ef3d3d
ef3d3d
 static void
ef3d3d
 do_save_account_details_when_ready (GdmSessionWorker *worker)
ef3d3d
 {
ef3d3d
         g_assert (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCREDITED);
ef3d3d
ef3d3d
         if (!gdm_session_settings_is_loaded (worker->priv->user_settings)) {
ef3d3d
                 g_signal_connect (G_OBJECT (worker->priv->user_settings),
ef3d3d
                                   "notify::is-loaded",
ef3d3d
                                   G_CALLBACK (on_settings_is_loaded_changed),
ef3d3d
                                   worker);
ef3d3d
                 g_debug ("GdmSessionWorker: user %s, not fully loaded yet, will save account details later",
ef3d3d
                          worker->priv->username);
ef3d3d
                 gdm_session_settings_load (worker->priv->user_settings,
ef3d3d
                                            worker->priv->username);
ef3d3d
                 return;
ef3d3d
@@ -2505,60 +2505,69 @@ gdm_session_worker_handle_open (GdmDBusWorker         *object,
ef3d3d
                                 GDBusMethodInvocation *invocation)
ef3d3d
 {
ef3d3d
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
ef3d3d
         validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_ACCOUNT_DETAILS_SAVED);
ef3d3d
         return TRUE;
ef3d3d
 }
ef3d3d
ef3d3d
 static gboolean
ef3d3d
 gdm_session_worker_handle_setup (GdmDBusWorker         *object,
ef3d3d
                                  GDBusMethodInvocation *invocation,
ef3d3d
                                  const char            *service,
ef3d3d
                                  const char            *x11_display_name,
ef3d3d
                                  const char            *x11_authority_file,
ef3d3d
                                  const char            *console,
ef3d3d
                                  const char            *seat_id,
ef3d3d
                                  const char            *hostname,
ef3d3d
                                  gboolean               display_is_local)
ef3d3d
 {
ef3d3d
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
ef3d3d
         validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE);
ef3d3d
ef3d3d
         worker->priv->service = g_strdup (service);
ef3d3d
         worker->priv->x11_display_name = g_strdup (x11_display_name);
ef3d3d
         worker->priv->x11_authority_file = g_strdup (x11_authority_file);
ef3d3d
         worker->priv->display_device = g_strdup (console);
ef3d3d
         worker->priv->display_seat_id = g_strdup (seat_id);
ef3d3d
         worker->priv->hostname = g_strdup (hostname);
ef3d3d
         worker->priv->display_is_local = display_is_local;
ef3d3d
         worker->priv->username = NULL;
ef3d3d
ef3d3d
+        g_signal_connect_swapped (worker->priv->user_settings,
ef3d3d
+                                  "notify::language-name",
ef3d3d
+                                  G_CALLBACK (on_saved_language_name_read),
ef3d3d
+                                  worker);
ef3d3d
+
ef3d3d
+        g_signal_connect_swapped (worker->priv->user_settings,
ef3d3d
+                                  "notify::session-name",
ef3d3d
+                                  G_CALLBACK (on_saved_session_name_read),
ef3d3d
+                                  worker);
ef3d3d
         return TRUE;
ef3d3d
 }
ef3d3d
ef3d3d
 static gboolean
ef3d3d
 gdm_session_worker_handle_setup_for_user (GdmDBusWorker         *object,
ef3d3d
                                           GDBusMethodInvocation *invocation,
ef3d3d
                                           const char            *service,
ef3d3d
                                           const char            *username,
ef3d3d
                                           const char            *x11_display_name,
ef3d3d
                                           const char            *x11_authority_file,
ef3d3d
                                           const char            *console,
ef3d3d
                                           const char            *seat_id,
ef3d3d
                                           const char            *hostname,
ef3d3d
                                           gboolean               display_is_local)
ef3d3d
 {
ef3d3d
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
ef3d3d
ef3d3d
         if (!validate_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE))
ef3d3d
                 return TRUE;
ef3d3d
ef3d3d
         worker->priv->service = g_strdup (service);
ef3d3d
         worker->priv->x11_display_name = g_strdup (x11_display_name);
ef3d3d
         worker->priv->x11_authority_file = g_strdup (x11_authority_file);
ef3d3d
         worker->priv->display_device = g_strdup (console);
ef3d3d
         worker->priv->display_seat_id = g_strdup (seat_id);
ef3d3d
         worker->priv->hostname = g_strdup (hostname);
ef3d3d
         worker->priv->display_is_local = display_is_local;
ef3d3d
         worker->priv->username = g_strdup (username);
ef3d3d
ef3d3d
         g_signal_connect_swapped (worker->priv->user_settings,
ef3d3d
--
ef3d3d
2.1.0