From f65c681a469a2675d96012a77a563e50369b9e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 9 Jul 2021 18:09:08 +0200 Subject: session: Only emit verification-complete on reauth or after session is opened We're currently emitting verification-complete signal as soon as we got a positive authentication callback from the worker, however at this point we've not opened the session yet, and if that fails we'll end up in a scenario where gdm assumed that we're logging in, and so its greeter is shut down and never restarted on its VT until we manually switch back and forth from it. Meanwhile the session opening failure is never exposed to the user. So, do not emit verification-completed on logins, until we've opened the session. However, re-order the session-opened callback events so that we keep notifying verification-complete before than session-opened. This basically reverts commit c4292870 (again). Fixes: https://gitlab.gnome.org/GNOME/gdm/-/issues/712 --- daemon/gdm-session.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index 5c5903a4..2bc9d943 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -322,18 +322,18 @@ on_establish_credentials_cb (GdmDBusWorker *proxy, service_name = g_strdup (conversation->service_name); if (worked) { - if (self->user_verifier_interface != NULL) { - gdm_dbus_user_verifier_emit_verification_complete (self->user_verifier_interface, - service_name); - g_signal_emit (self, signals[VERIFICATION_COMPLETE], 0, service_name); - } - switch (self->verification_mode) { case GDM_SESSION_VERIFICATION_MODE_LOGIN: case GDM_SESSION_VERIFICATION_MODE_CHOOSER: gdm_session_open_session (self, service_name); break; case GDM_SESSION_VERIFICATION_MODE_REAUTHENTICATE: + if (self->user_verifier_interface != NULL) { + gdm_dbus_user_verifier_emit_verification_complete (self->user_verifier_interface, + service_name); + g_signal_emit (self, signals[VERIFICATION_COMPLETE], 0, service_name); + } + break; default: break; } @@ -866,17 +866,17 @@ on_opened (GdmDBusWorker *worker, conversation->session_id = g_strdup (session_id); - if (self->greeter_interface != NULL) { - gdm_dbus_greeter_emit_session_opened (self->greeter_interface, - service_name); - } - if (self->user_verifier_interface != NULL) { gdm_dbus_user_verifier_emit_verification_complete (self->user_verifier_interface, service_name); g_signal_emit (self, signals[VERIFICATION_COMPLETE], 0, service_name); } + if (self->greeter_interface != NULL) { + gdm_dbus_greeter_emit_session_opened (self->greeter_interface, + service_name); + } + g_debug ("GdmSession: Emitting 'session-opened' signal"); g_signal_emit (self, signals[SESSION_OPENED], 0, service_name, session_id); } else { -- cgit v1.2.1 From 2f9afacd494311b8b7393848fec59bc8df7520b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 9 Jul 2021 18:27:37 +0200 Subject: session: Emit session-opened-failed on session failures We used the same signal (session-start-failed) when we had both session starting and opening failures. This may lead to wrong behaviors, so let's introduce another signal to notify such state. --- daemon/gdm-session.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index 2bc9d943..f705f0e0 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -172,6 +172,7 @@ enum { AUTHENTICATION_FAILED, VERIFICATION_COMPLETE, SESSION_OPENED, + SESSION_OPENED_FAILED, SESSION_STARTED, SESSION_START_FAILED, SESSION_EXITED, @@ -883,7 +884,7 @@ on_opened (GdmDBusWorker *worker, report_and_stop_conversation (self, service_name, error); g_debug ("GdmSession: Emitting 'session-start-failed' signal"); - g_signal_emit (self, signals[SESSION_START_FAILED], 0, service_name, error->message); + g_signal_emit (self, signals[SESSION_OPENED_FAILED], 0, service_name, error->message); } } @@ -3746,6 +3747,17 @@ gdm_session_class_init (GdmSessionClass *session_class) 2, G_TYPE_STRING, G_TYPE_STRING); + signals [SESSION_OPENED_FAILED] = + g_signal_new ("session-opened-failed", + GDM_TYPE_SESSION, + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 2, + G_TYPE_STRING, G_TYPE_STRING); signals [SESSION_STARTED] = g_signal_new ("session-started", GDM_TYPE_SESSION, -- cgit v1.2.1