]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
When locking a session, if an existing greeter can't be reused, then it's stopped...
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 16 Oct 2015 09:10:34 +0000 (10:10 +0100)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 16 Oct 2015 09:10:34 +0000 (10:10 +0100)
src/seat.c
tests/Makefile.am
tests/scripts/lock-seat-after-vt-switch.conf
tests/scripts/lock-seat-twice.conf [new file with mode: 0644]
tests/scripts/lock-session-twice.conf [new file with mode: 0644]
tests/test-lock-seat-twice [new file with mode: 0755]
tests/test-lock-session-twice [new file with mode: 0755]

index 33b73152e2326c85a2bd0cf2d62047296d9b7783..13624ccb6fe5c78e24154d343ee1e5ca0dd942f0 100644 (file)
@@ -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);
 }
index b4d73c65ed9303d02a9e0d15ee9001ddc712370b..a96c77f19ecdac635c26a82aca8cce4f72724077 100644 (file)
@@ -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 \
index 4a20ea193e9cad2c1568f2ab89db19891fa2ea8b..d9cb9ccb74103679c597681507f6471dc5b90d4b 100644 (file)
@@ -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 (file)
index 0000000..c8d6dc8
--- /dev/null
@@ -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 (file)
index 0000000..e7f20c3
--- /dev/null
@@ -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 (executable)
index 0000000..d39c985
--- /dev/null
@@ -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 (executable)
index 0000000..61b09d1
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-session-twice test-gobject-greeter