From: Robert Ancell Date: Thu, 11 Aug 2016 05:14:22 +0000 (+1200) Subject: Fix greeter being killing a started session once if a new authentication is started X-Git-Url: https://rtime.felk.cvut.cz/gitweb/sojka/lightdm.git/commitdiff_plain/de330724674719b92c1e3c4f424320553a939f4a Fix greeter being killing a started session once if a new authentication is started --- diff --git a/src/greeter.c b/src/greeter.c index 4eebc8ca..1ec5bd9c 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -967,10 +967,18 @@ greeter_get_guest_authenticated (Greeter *greeter) } Session * -greeter_get_authentication_session (Greeter *greeter) +greeter_take_authentication_session (Greeter *greeter) { + Session *session; + g_return_val_if_fail (greeter != NULL, NULL); - return greeter->priv->authentication_session; + + session = greeter->priv->authentication_session; + if (greeter->priv->authentication_session) + g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); + greeter->priv->authentication_session = NULL; + + return session; } gboolean diff --git a/src/greeter.h b/src/greeter.h index b9404ae5..a8ba6c7c 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -71,7 +71,7 @@ void greeter_reset (Greeter *greeter); gboolean greeter_get_guest_authenticated (Greeter *greeter); -Session *greeter_get_authentication_session (Greeter *greeter); +Session *greeter_take_authentication_session (Greeter *greeter); gboolean greeter_get_start_session (Greeter *greeter); diff --git a/src/seat.c b/src/seat.c index 8f1053ea..8d53f875 100644 --- a/src/seat.c +++ b/src/seat.c @@ -1177,7 +1177,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi /* Get the session to use */ if (greeter_get_guest_authenticated (greeter)) { - session = create_guest_session (seat, session_name); + session = g_object_ref (create_guest_session (seat, session_name)); if (!session) return FALSE; session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service")); @@ -1190,7 +1190,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi gchar *sessions_dir = NULL; gchar **argv; - session = greeter_get_authentication_session (greeter); + session = greeter_take_authentication_session (greeter); /* Get session command to run */ switch (type) @@ -1234,7 +1234,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi /* Switch to this session when it is ready */ g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (session); + seat->priv->session_to_activate = session; /* Return to existing session if it is open */ username = session_get_username (session); diff --git a/tests/Makefile.am b/tests/Makefile.am index 27a50408..77aa52a7 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -173,7 +173,8 @@ TESTS = \ test-session-greeter-reconnect \ test-session-greeter-unlock \ test-session-greeter-unlock-twice \ - test-session-greeter-switch \ + test-session-greeter-switch \ + test-session-greeter-multiple-login \ test-vnc-login \ test-vnc-command \ test-vnc-dimensions \ @@ -555,6 +556,7 @@ EXTRA_DIST = \ scripts/script-hook-session-setup-missing.conf \ scripts/session-greeter.conf \ scripts/session-greeter-autologin.conf \ + scripts/session-greeter-multiple-login.conf \ scripts/session-greeter-reconnect.conf \ scripts/session-greeter-switch.conf \ scripts/session-greeter-unlock.conf \ diff --git a/tests/scripts/session-greeter-multiple-login.conf b/tests/scripts/session-greeter-multiple-login.conf new file mode 100644 index 00000000..32da905a --- /dev/null +++ b/tests/scripts/session-greeter-multiple-login.conf @@ -0,0 +1,65 @@ +# +# Check continuing to use an in-session greeter doesn't break things +# + +[Seat:*] +autologin-user=no-password1 +user-session=greeter + +#?*START-DAEMON +#?RUNNER DAEMON-START + +# X server starts +#?XSERVER-0 START VT=7 SEAT=seat0 + +# Daemon connects when X server is ready +#?*XSERVER-0 INDICATE-READY +#?XSERVER-0 INDICATE-READY +#?XSERVER-0 ACCEPT-CONNECT + +# Session starts +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/no-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=no-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into account with a password +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=no-password2 +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=no-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# New session starts +#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/no-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=no-password2 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Switch to new session +#?VT ACTIVATE VT=8 +#?LOGIN1 LOCK-SESSION SESSION=c0 +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# Log in again from the greeter +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=no-password2 +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=no-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# Session is activated again +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/test-session-greeter-multiple-login b/tests/test-session-greeter-multiple-login new file mode 100755 index 00000000..ab639983 --- /dev/null +++ b/tests/test-session-greeter-multiple-login @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-multiple-login test-gobject-greeter