diff options
-rw-r--r-- | src/seat.c | 63 | ||||
-rw-r--r-- | tests/Makefile.am | 4 | ||||
-rw-r--r-- | tests/scripts/lock-seat-after-vt-switch.conf | 22 | ||||
-rw-r--r-- | tests/scripts/lock-seat-twice.conf | 75 | ||||
-rw-r--r-- | tests/scripts/lock-session-twice.conf | 77 | ||||
-rwxr-xr-x | tests/test-lock-seat-twice | 2 | ||||
-rwxr-xr-x | tests/test-lock-session-twice | 2 |
7 files changed, 225 insertions, 20 deletions
@@ -65,6 +65,9 @@ struct SeatPrivate /* TRUE if stopped */ gboolean stopped; + + /* The greeter to be started to replace the current one */ + Greeter *replacement_greeter; }; static void seat_logger_iface_init (LoggerInterface *iface); @@ -790,9 +793,28 @@ session_stopped_cb (Session *session, Seat *seat) g_object_unref (session); return; } + + /* If there is a pending replacement greeter, start it */ + if (IS_GREETER (session) && seat->priv->replacement_greeter) + { + Session *s = SESSION(seat->priv->replacement_greeter); + seat->priv->replacement_greeter = NULL; + g_object_unref(s); + + if (session_get_is_authenticated (s)) + { + l_debug (seat, "Greeter stopped, running session"); + run_session (seat, s); + } + else + { + l_debug (seat, "Greeter stopped, starting session authentication"); + start_session (seat, s); + } + } /* If this is the greeter session then re-use this display server */ - if (IS_GREETER (session) && + else if (IS_GREETER (session) && can_share_display_server (seat, display_server) && greeter_get_start_session (GREETER (session))) { @@ -1582,14 +1604,17 @@ gboolean seat_lock (Seat *seat, const gchar *username) { Greeter *greeter_session; - DisplayServer *display_server; - gboolean existing = FALSE; + DisplayServer *display_server = NULL; + gboolean reset_existing = FALSE; + gboolean reuse_xserver = FALSE; g_return_val_if_fail (seat != NULL, FALSE); if (!seat_get_can_switch (seat)) return FALSE; + // FIXME: If already locked then don't bother... + l_debug (seat, "Locking"); /* Switch to greeter we can reuse */ @@ -1598,10 +1623,23 @@ seat_lock (Seat *seat, const gchar *username) { l_debug (seat, "Switching to existing greeter"); set_greeter_hints (seat, greeter_session); - existing = TRUE; + reset_existing = TRUE; } else { + /* If the existing greeter can't be reused, stop it and reuse its display server */ + greeter_session = find_greeter_session (seat); + if (greeter_session) + { + display_server = session_get_display_server (SESSION (greeter_session)); + if (!session_get_is_stopping (SESSION (greeter_session))) + { + l_debug (seat, "Stopping session"); + session_stop (SESSION (greeter_session)); + } + reuse_xserver = TRUE; + } + greeter_session = create_greeter_session (seat); if (!greeter_session) return FALSE; @@ -1611,7 +1649,7 @@ seat_lock (Seat *seat, const gchar *username) if (username) greeter_set_hint (greeter_session, "select-user", username); - if (existing) + if (reset_existing) { greeter_reset (greeter_session); seat_set_active_session (seat, SESSION (greeter_session)); @@ -1619,14 +1657,23 @@ seat_lock (Seat *seat, const gchar *username) } else { - display_server = create_display_server (seat, SESSION (greeter_session)); + if (!reuse_xserver) + display_server = create_display_server (seat, SESSION (greeter_session)); + session_set_display_server (SESSION (greeter_session), display_server); if (seat->priv->session_to_activate) g_object_unref (seat->priv->session_to_activate); seat->priv->session_to_activate = g_object_ref (greeter_session); - session_set_display_server (SESSION (greeter_session), display_server); - return display_server_start (display_server); + if (reuse_xserver) + { + if (seat->priv->replacement_greeter) + g_object_unref (seat->priv->replacement_greeter); + seat->priv->replacement_greeter = g_object_ref (greeter_session); + return TRUE; + } + else + return display_server_start (display_server); } } diff --git a/tests/Makefile.am b/tests/Makefile.am index c5d93f4e..93a09ad9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -130,9 +130,11 @@ TESTS = \ test-dbus \ test-lock-seat \ test-lock-seat-after-vt-switch \ + test-lock-seat-twice \ test-lock-seat-resettable \ test-lock-seat-return-session \ test-lock-session \ + test-lock-session-twice \ test-lock-session-no-password \ test-lock-session-resettable \ test-lock-session-return-session \ @@ -418,10 +420,12 @@ EXTRA_DIST = \ scripts/lock-seat-resettable.conf \ scripts/lock-seat-return-session.conf \ scripts/lock-seat-return-session-console-kit.conf \ + scripts/lock-seat-twice.conf \ scripts/lock-session.conf \ scripts/lock-session-no-password.conf \ scripts/lock-session-resettable.conf \ scripts/lock-session-return-session.conf \ + scripts/lock-session-twice.conf \ scripts/login.conf \ scripts/login-crash-authenticate.conf \ scripts/login-guest.conf \ diff --git a/tests/scripts/lock-seat-after-vt-switch.conf b/tests/scripts/lock-seat-after-vt-switch.conf index 4a20ea19..d9cb9ccb 100644 --- a/tests/scripts/lock-seat-after-vt-switch.conf +++ b/tests/scripts/lock-seat-after-vt-switch.conf @@ -61,21 +61,19 @@ user-session=default # Lock the seat again #?*SESSION-X-0 LOCK-SEAT #?SESSION-X-0 LOCK-SEAT - -# New X server starts (this is a "bug") -#?XSERVER-2 START VT=9 SEAT=seat0 -#?*XSERVER-2 INDICATE-READY -#?XSERVER-2 INDICATE-READY -#?XSERVER-2 ACCEPT-CONNECT - -# Session is locked #?LOGIN1 LOCK-SESSION SESSION=c0 -# Session is switched to greeter -#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +# Old greeter is stopped +#?GREETER-X-1 TERMINATE SIGNAL=15 -# The unnecessary X server is killed -#?XSERVER-2 TERMINATE SIGNAL=15 +# A new greeter is started and activated on the same X server +#?LOGIN1 ACTIVATE-SESSION SESSION=c2 +#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON +#?GREETER-X-1 LOCK-HINT # Cleanup #?*STOP-DAEMON diff --git a/tests/scripts/lock-seat-twice.conf b/tests/scripts/lock-seat-twice.conf new file mode 100644 index 00000000..c8d6dc8e --- /dev/null +++ b/tests/scripts/lock-seat-twice.conf @@ -0,0 +1,75 @@ +# +# Check locking a seat twice doesn't spawn two greeters +# + +[SeatDefaults] +autologin-user=have-password1 +user-session=default + +#?*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=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Lock the seat +#?*SESSION-X-0 LOCK-SEAT +#?SESSION-X-0 LOCK-SEAT + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 + +# Daemon connects when X server is ready +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# Session is locked +#?LOGIN1 LOCK-SESSION SESSION=c0 + +# Greeter starts +#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON +#?GREETER-X-1 LOCK-HINT + +# Switch to greeter +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?VT ACTIVATE VT=8 + +# Lock the seat again +#?*SESSION-X-0 LOCK-SEAT +#?SESSION-X-0 LOCK-SEAT + +# Old greeter is stopped +#?GREETER-X-1 TERMINATE SIGNAL=15 + +# A new greeter is started and activated on the same X server +#?LOGIN1 ACTIVATE-SESSION SESSION=c2 +#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON +#?GREETER-X-1 LOCK-HINT + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?GREETER-X-1 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/scripts/lock-session-twice.conf b/tests/scripts/lock-session-twice.conf new file mode 100644 index 00000000..e7f20c3d --- /dev/null +++ b/tests/scripts/lock-session-twice.conf @@ -0,0 +1,77 @@ +# +# Check locking a session twice doesn't spawn two greeters +# + +[SeatDefaults] +autologin-user=have-password1 +user-session=default + +#?*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=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Lock the session +#?*SESSION-X-0 LOCK-SESSION +#?SESSION-X-0 LOCK-SESSION + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 + +# Daemon connects when X server is ready +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# Session is locked +#?LOGIN1 LOCK-SESSION SESSION=c0 + +# Greeter starts with session user selected +#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON +#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1 +#?GREETER-X-1 LOCK-HINT + +# Switch to greeter +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?VT ACTIVATE VT=8 + +# Lock the session again +#?*SESSION-X-0 LOCK-SESSION +#?SESSION-X-0 LOCK-SESSION + +# Old greeter is stopped +#?GREETER-X-1 TERMINATE SIGNAL=15 +#?LOGIN1 ACTIVATE-SESSION SESSION=c2 + +# A new greeter is started and activated on the same X server +#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON +#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1 +#?GREETER-X-1 LOCK-HINT + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?GREETER-X-1 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/test-lock-seat-twice b/tests/test-lock-seat-twice new file mode 100755 index 00000000..d39c9855 --- /dev/null +++ b/tests/test-lock-seat-twice @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner lock-seat-twice test-gobject-greeter diff --git a/tests/test-lock-session-twice b/tests/test-lock-session-twice new file mode 100755 index 00000000..61b09d1f --- /dev/null +++ b/tests/test-lock-session-twice @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner lock-session-twice test-gobject-greeter |