|
|
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
|