summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2015-10-16 10:10:34 +0100
committerRobert Ancell <robert.ancell@canonical.com>2015-10-16 10:10:34 +0100
commit5b1596558dd7e01b892479fa32b46757b7566ee2 (patch)
treef5aeb340c423b54071f569802b788ff26800d414
parent1f0180f018fa3f9b15f7a68cb17d15423c8e9a22 (diff)
parentb7778d2853d781998a4c6e8733c9cf76b7b6588e (diff)
downloadlightdm-5b1596558dd7e01b892479fa32b46757b7566ee2.tar.gz
When locking a session, if an existing greeter can't be reused, then it's stopped and its display server is reused with a new greeter.
-rw-r--r--src/seat.c65
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/scripts/lock-seat-after-vt-switch.conf22
-rw-r--r--tests/scripts/lock-seat-twice.conf75
-rw-r--r--tests/scripts/lock-session-twice.conf77
-rwxr-xr-xtests/test-lock-seat-twice2
-rwxr-xr-xtests/test-lock-session-twice2
7 files changed, 227 insertions, 20 deletions
diff --git a/src/seat.c b/src/seat.c
index 33b73152..13624ccb 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -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)
+ {
+ Greeter *replacement_greeter = seat->priv->replacement_greeter;
+ seat->priv->replacement_greeter = NULL;
+
+ if (session_get_is_authenticated (SESSION (replacement_greeter)))
+ {
+ l_debug (seat, "Greeter stopped, running session");
+ run_session (seat, SESSION (replacement_greeter));
+ }
+ else
+ {
+ l_debug (seat, "Greeter stopped, starting session authentication");
+ start_session (seat, SESSION (replacement_greeter));
+ }
+ g_object_unref (replacement_greeter);
+ }
/* 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)))
{
@@ -1594,14 +1616,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 */
@@ -1610,10 +1635,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;
@@ -1623,7 +1661,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));
@@ -1631,14 +1669,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);
}
}
@@ -1877,6 +1924,8 @@ seat_finalize (GObject *object)
g_object_unref (self->priv->next_session);
if (self->priv->session_to_activate)
g_object_unref (self->priv->session_to_activate);
+ if (self->priv->replacement_greeter)
+ g_object_unref (self->priv->replacement_greeter);
G_OBJECT_CLASS (seat_parent_class)->finalize (object);
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b4d73c65..a96c77f1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -134,9 +134,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 \
@@ -434,10 +436,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