diff options
author | Ray Strode <rstrode@redhat.com> | 2014-06-05 17:01:48 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2014-06-05 17:19:33 -0400 |
commit | e24484f72bdf1d7c96131c6b7bae6409fabed210 (patch) | |
tree | 97054c10d0a1afb6cdce60300e8accc07997b4ea /daemon/gdm-session.c | |
parent | ef6954833cf43bef8306823d7fcfb6a04b903ad7 (diff) | |
download | gdm-e24484f72bdf1d7c96131c6b7bae6409fabed210.tar.gz |
manager: close up timed login race
Previously we would emit the timed-login-requested signal after the
client connects, which might be before it was listening for the
signal.
Now we only emit the signal in direct response to a GetTimedLoginDetails
call, which we make implicitly when the appropiate proxy interface is
set up.
https://bugzilla.gnome.org/show_bug.cgi?id=680348
Diffstat (limited to 'daemon/gdm-session.c')
-rw-r--r-- | daemon/gdm-session.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index 07eed5eb..60667c5f 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -88,6 +88,10 @@ struct _GdmSessionPrivate char *selected_user; char *user_x11_authority_file; + char *timed_login_username; + int timed_login_delay; + GList *pending_timed_login_invocations; + GHashTable *conversations; GdmSessionConversation *session_conversation; @@ -1296,6 +1300,27 @@ gdm_session_handle_client_start_session_when_ready (GdmDBusGreeter *greet } static gboolean +gdm_session_handle_get_timed_login_details (GdmDBusGreeter *greeter_interface, + GDBusMethodInvocation *invocation, + GdmSession *self) +{ + + if (self->priv->greeter_interface != NULL) { + gdm_dbus_greeter_complete_get_timed_login_details (greeter_interface, + invocation, + self->priv->timed_login_username != NULL, + self->priv->timed_login_username != NULL? self->priv->timed_login_username : "", + self->priv->timed_login_delay); + if (self->priv->timed_login_username != NULL) { + gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface, + self->priv->timed_login_username, + self->priv->timed_login_delay); + } + } + return TRUE; +} + +static gboolean gdm_session_handle_client_begin_auto_login (GdmDBusGreeter *greeter_interface, GDBusMethodInvocation *invocation, const char *username, @@ -1368,6 +1393,10 @@ export_greeter_interface (GdmSession *self, "handle-start-session-when-ready", G_CALLBACK (gdm_session_handle_client_start_session_when_ready), self); + g_signal_connect (greeter_interface, + "handle-get-timed-login-details", + G_CALLBACK (gdm_session_handle_get_timed_login_details), + self); g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (greeter_interface), connection, @@ -2609,16 +2638,13 @@ gdm_session_reset (GdmSession *self) } void -gdm_session_request_timed_login (GdmSession *self, - const char *username, - int delay) +gdm_session_set_timed_login_details (GdmSession *self, + const char *username, + int delay) { - g_debug ("GdmSession: requesting timed login"); - if (self->priv->greeter_interface != NULL) { - gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface, - username, - delay); - } + g_debug ("GdmSession: timed login details %s %d", username, delay); + self->priv->timed_login_username = g_strdup (username); + self->priv->timed_login_delay = delay; } gboolean |