]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Fix session locking broken in 1.7.5
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 8 Aug 2013 10:10:19 +0000 (22:10 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 8 Aug 2013 10:10:19 +0000 (22:10 +1200)
24 files changed:
src/seat.c
src/session.c
tests/Makefile.am
tests/scripts/lock-seat-console-kit.conf
tests/scripts/lock-seat-return-session-console-kit.conf [new file with mode: 0644]
tests/scripts/lock-seat-return-session.conf
tests/scripts/lock-seat.conf
tests/scripts/lock-session-no-password.conf
tests/scripts/lock-session-return-session.conf
tests/scripts/lock-session.conf
tests/scripts/switch-to-greeter-new-session-logout-new.conf
tests/scripts/switch-to-greeter-new-session-logout-old.conf
tests/scripts/switch-to-greeter-new-session.conf
tests/scripts/switch-to-greeter-return-session-logout.conf
tests/scripts/switch-to-greeter-return-session.conf
tests/scripts/switch-to-greeter.conf
tests/scripts/switch-to-guest.conf
tests/scripts/switch-to-user-logout.conf
tests/scripts/switch-to-user-no-password.conf
tests/scripts/switch-to-user.conf
tests/scripts/switch-to-users.conf
tests/scripts/unity-switch.conf
tests/src/test-runner.c
tests/test-lock-seat-return-session-console-kit [new file with mode: 0755]

index 7ef2f94867652c6f9c9f8c6e8f58bb273e135672..11d95fc0e7f841772a4194a39b98fd83eb301261 100644 (file)
@@ -45,6 +45,9 @@ struct SeatPrivate
     /* The sessions on this seat */
     GList *sessions;
 
+    /* The last session set to active */
+    Session *active_session;
+
     /* The session to set active when it starts */
     Session *session_to_activate;
   
@@ -179,6 +182,10 @@ seat_set_active_session (Seat *seat, Session *session)
 
     g_return_if_fail (seat != NULL);
 
+    /* Unlock this session */
+    if (session != seat->priv->active_session && !IS_GREETER (session))
+        session_unlock (session);
+
     SEAT_GET_CLASS (seat)->set_active_session (seat, session);
 
     /* Stop any greeters */
@@ -195,6 +202,15 @@ seat_set_active_session (Seat *seat, Session *session)
             session_stop (s);
         }
     }
+
+    /* Lock previous sessions */
+    if (seat->priv->active_session)
+    {
+        if (session != seat->priv->active_session && !IS_GREETER (seat->priv->active_session))
+            session_lock (seat->priv->active_session);
+        g_object_unref (seat->priv->active_session);
+    }
+    seat->priv->active_session = g_object_ref (session);
 }
 
 Session *
@@ -503,6 +519,16 @@ session_stopped_cb (Session *session, Seat *seat)
 
     g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
     seat->priv->sessions = g_list_remove (seat->priv->sessions, session);
+    if (session == seat->priv->active_session)
+    {
+        g_object_unref (seat->priv->active_session);
+        seat->priv->active_session = NULL;
+    }
+    if (session == seat->priv->session_to_activate)
+    {
+        g_object_unref (seat->priv->session_to_activate);
+        seat->priv->session_to_activate = NULL;
+    }
 
     display_server = session_get_display_server (session);
     if (!display_server)
@@ -1535,6 +1561,8 @@ seat_finalize (GObject *object)
         g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
     }
     g_list_free_full (self->priv->sessions, g_object_unref);
+    if (self->priv->active_session)
+        g_object_unref (self->priv->active_session);
     if (self->priv->session_to_activate)
         g_object_unref (self->priv->session_to_activate);
 
index 3b360d287e95a8ac1826d845ad692fb6c755693a..ecba9f4c3da0b2a6d7d1e8e0fe13c836458c7502 100644 (file)
@@ -780,9 +780,9 @@ session_lock (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (login1_is_running ())
+        if (session->priv->login1_session)
             login1_lock_session (session->priv->login1_session);
-        if (!session->priv->login1_session)
+        else if (session->priv->console_kit_cookie)
             ck_lock_session (session->priv->console_kit_cookie);
     }
 }
@@ -793,9 +793,9 @@ session_unlock (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (login1_is_running ())
+        if (session->priv->login1_session)
             login1_unlock_session (session->priv->login1_session);
-        if (!session->priv->login1_session)
+        else if (session->priv->console_kit_cookie)
             ck_unlock_session (session->priv->console_kit_cookie);
     }
 }
index 4b7d4f556d3ec5fcfda16a97299f02798981f5b7..54f633ad2709a4f7d2355bdac2d667190c9a52ab 100644 (file)
@@ -107,6 +107,7 @@ TESTS = \
        test-lock-session-no-password \
        test-lock-session-return-session \
        test-lock-seat-console-kit \
+       test-lock-seat-return-session-console-kit \
        test-switch-to-greeter \
        test-switch-to-greeter-new-session \
        test-switch-to-greeter-new-session-logout-new \
@@ -324,6 +325,7 @@ EXTRA_DIST = \
        scripts/lock-seat.conf \
        scripts/lock-seat-console-kit.conf \    
        scripts/lock-seat-return-session.conf \
+       scripts/lock-seat-return-session-console-kit.conf \
        scripts/lock-session.conf \
        scripts/lock-session-no-password.conf \
        scripts/lock-session-return-session.conf \
index e49e5d6eb0356943cfba98e4d62521ee4e846650..2abe49b4f00d4738cb0871eeb97bf6e28226595d 100644 (file)
@@ -36,6 +36,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?CONSOLE-KIT LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_COOKIE=ck-cookie-x:1
 #?XSERVER-1 ACCEPT-CONNECT
diff --git a/tests/scripts/lock-seat-return-session-console-kit.conf b/tests/scripts/lock-seat-return-session-console-kit.conf
new file mode 100644 (file)
index 0000000..f7032cc
--- /dev/null
@@ -0,0 +1,74 @@
+#
+# Check can lock a seat from D-Bus and can return to it when using ConsoleKit
+#
+
+[test-runner-config]
+disable-login1=true
+
+[SeatDefaults]
+autologin-user=have-password1
+user-session=default
+
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7
+
+# 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_SESSION_COOKIE=ck-cookie-x:0 USER=have-password1
+#?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
+
+# Daemon connects when X server is ready
+#?*XSERVER-1 INDICATE-READY
+#?XSERVER-1 INDICATE-READY
+#?XSERVER-1 ACCEPT-CONNECT
+
+# Session is locked
+#?CONSOLE-KIT LOCK-SESSION
+
+# Greeter starts
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_COOKIE=ck-cookie-x:1
+#?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
+#?VT ACTIVATE VT=8
+
+# Login as existing user
+#?*GREETER-X-1 AUTHENTICATE USERNAME=have-password1
+#?GREETER-X-1 SHOW-PROMPT TEXT="Password:"
+#?*GREETER-X-1 RESPOND TEXT="password"
+#?GREETER-X-1 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*GREETER-X-1 START-SESSION
+
+# Old session is unlocked
+#?CONSOLE-KIT UNLOCK-SESSION
+
+# Return to session
+#?VT ACTIVATE VT=7
+
+# Greeter and X server stop
+#?GREETER-X-1 TERMINATE SIGNAL=15
+#?XSERVER-1 TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
index 4771cdde6f8fde82baf2e75ee637fb9edc97f228..9a6ad33822b2c36aa43e10e9d8453a40860eac3c 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
@@ -51,6 +54,9 @@ user-session=default
 #?GREETER-X-1 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
 #?*GREETER-X-1 START-SESSION
 
+# Old session is unlocked
+#?LOGIN1 UNLOCK-SESSION
+
 # Return to session
 #?VT ACTIVATE VT=7
 
index ac4659adfd236dd6432403f729f0a36392712b37..b0ea9883e67363655be5b99aad01f851559dcef7 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index e4398f66625782a2dc9d26c10c738acafbb8be1f..4fad1abe9371a25629a8774a4ac755dea164b11d 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts with session user selected
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index 75bf1ed60a11b177904b17b94e54fac24ad58eb5..4c17fe48f734c50e4bc9323e46c5ee54983e399e 100644 (file)
@@ -45,6 +45,9 @@ user-session=default
 # Switch to greeter
 #?VT ACTIVATE VT=8
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Login as existing user
 #?*GREETER-X-1 AUTHENTICATE USERNAME=have-password1
 #?GREETER-X-1 SHOW-PROMPT TEXT="Password:"
@@ -52,6 +55,9 @@ user-session=default
 #?GREETER-X-1 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
 #?*GREETER-X-1 START-SESSION
 
+# Existing session is unlocked
+#?LOGIN1 UNLOCK-SESSION
+
 # Return to session
 #?VT ACTIVATE VT=7
 
index 8f32265a12ee49b5c31b26e5c87f74c83f3f7a90..6a52cb065f13224dcc4eaad8de6ea332012bdeb3 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts with session user selected
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index 04c007d2e569a151d2450e9930661d155818cf55..eb64e6c48ca431c52a6c55d097bc59f45d768882 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index 0e595f7519e813e671c455d55600a384f8a7e592..965a2828fddec5fee6066210c03be428269b955d 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
@@ -60,6 +63,15 @@ user-session=default
 #?*SWITCH-TO-USER USERNAME=have-password1
 #?RUNNER SWITCH-TO-USER USERNAME=have-password1
 
+# Existing session is unlocked
+#?LOGIN1 UNLOCK-SESSION
+
+# Switch to greeter
+#?VT ACTIVATE VT=7
+
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Logout of old session
 #?*SESSION-X-0 LOGOUT
 #?XSERVER-0 TERMINATE SIGNAL=15
@@ -77,9 +89,6 @@ user-session=default
 #?GREETER-X-0 CONNECT-TO-DAEMON
 #?GREETER-X-0 CONNECTED-TO-DAEMON
 
-# Switch to greeter
-#?VT ACTIVATE VT=7
-
 # Cleanup
 #?*STOP-DAEMON
 #?GREETER-X-0 TERMINATE SIGNAL=15
index bcfa1e0bd42b64b1542ae5ad02009a715ba59ad1..1080954a7859828c64ce2feb8ed64870e011b3fe 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index 7004a665a5ac7dd1eda531ba1ff79c60c5e8e9dd..4102ec101b176c158b8d80b5e45af866b863c8bb 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
@@ -50,6 +53,9 @@ user-session=default
 #?GREETER-X-1 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
 #?*GREETER-X-1 START-SESSION
 
+# Session is unlocked
+#?LOGIN1 UNLOCK-SESSION
+
 # Switch to session
 #?VT ACTIVATE VT=7
 
index d4a0828a302e4f844848d3cbba79d90e6221d29a..20ca573a81d0118eaf63c921bed138b317da3719 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
@@ -50,6 +53,9 @@ user-session=default
 #?GREETER-X-1 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
 #?*GREETER-X-1 START-SESSION
 
+# Session is unlocked
+#?LOGIN1 UNLOCK-SESSION
+
 # Switch to session
 #?VT ACTIVATE VT=7
 
index 61079b1deaa1456bfbdc247b8d6977486c6ecc0e..a6510cc60344027cf426d14b3d38008f654944ec 100644 (file)
@@ -33,6 +33,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index 14469d6fabeb301d68924688ff120a46af3c2376..d8c2813b539c6cc285d41fcde7f23174ad204843 100644 (file)
@@ -37,6 +37,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Switch to session
 #?VT ACTIVATE VT=8
 
index d8ff178bfd37161d08f0312a4ae5f00a8ba36b12..d6d82dcf8f1703e672f64f1d1c4b82c585fc7f4d 100644 (file)
@@ -34,6 +34,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Switch to session
 #?VT ACTIVATE VT=8
 
index 5739b5adc8f521fad9dd72ee341d48e3791b08d5..cfee1bf9049fef39fb5181f3251360156f9ec330 100644 (file)
@@ -34,6 +34,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Switch to session
 #?VT ACTIVATE VT=8
 
index 86a2f83eddc45285ff3cb3f78a8ce6dc0c0efe68..539111b3e076977ce9900e14dfe10879e8f3c728 100644 (file)
@@ -34,6 +34,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8
 #?XSERVER-1 ACCEPT-CONNECT
index 5d13fc247264ffad9ffb4c44fc0b06a94ee2565e..6938ea58372f13c692757d16a807bcb5186cb0c8 100644 (file)
@@ -34,6 +34,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # Switch to session
 #?VT ACTIVATE VT=8
 
@@ -57,6 +60,9 @@ user-session=default
 # Switch to session
 #?VT ACTIVATE VT=9
 
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
 # New session starts
 #?SESSION-X-2 START XDG_SEAT=seat0 XDG_VTNR=9 USER=no-password2
 #?XSERVER-2 ACCEPT-CONNECT
index 4b4612b3302f93b78764da72511d17b184bd44c9..fec9f1c2bec70d90a2a50db05653ab966c2f1556 100644 (file)
@@ -41,6 +41,9 @@ user-session=default
 #?XSERVER-1 INDICATE-READY
 #?XSERVER-1 ACCEPT-CONNECT
 
+# Lock session
+#?LOGIN1 LOCK-SESSION
+
 # Greeter starts
 #?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=7
 #?XSERVER-1 ACCEPT-CONNECT
index fa89820be9e3413ffc3c1eb51d151f079f89f0fc..526bb73e78e3c622d8b8212eaab4b4341e253dcf 100644 (file)
@@ -85,6 +85,7 @@ typedef struct
     gchar *cookie;
     gchar *path;
     guint id;
+    gboolean locked;
 } CKSession;
 static GList *ck_sessions = NULL;
 static gint ck_session_index = 0;
@@ -105,6 +106,7 @@ typedef struct
 {
     gchar *path;
     guint pid;
+    gboolean locked;
 } Login1Session;
 
 static GList *login1_sessions = NULL;
@@ -1011,14 +1013,20 @@ handle_ck_session_call (GDBusConnection       *connection,
                         GDBusMethodInvocation *invocation,
                         gpointer               user_data)
 {
+    CKSession *session = user_data;
+
     if (strcmp (method_name, "Lock") == 0)
-    {
-        check_status ("CONSOLE-KIT LOCK-SESSION");
+    { 
+        if (!session->locked)
+            check_status ("CONSOLE-KIT LOCK-SESSION");
+        session->locked = TRUE;
         g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
     }
     else if (strcmp (method_name, "Unlock") == 0)
     {
-        check_status ("CONSOLE-KIT UNLOCK-SESSION");
+        if (session->locked)
+            check_status ("CONSOLE-KIT UNLOCK-SESSION");
+        session->locked = FALSE;
         g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
     }
     else
@@ -1132,14 +1140,20 @@ handle_login1_session_call (GDBusConnection       *connection,
                             GDBusMethodInvocation *invocation,
                             gpointer               user_data)
 {
+    Login1Session *session = user_data;
+
     if (strcmp (method_name, "Lock") == 0)
     {
-        check_status ("LOGIN1 LOCK-SESSION");
+        if (!session->locked)
+            check_status ("LOGIN1 LOCK-SESSION");
+        session->locked = TRUE;
         g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
     }
     else if (strcmp (method_name, "Unlock") == 0)
     {
-        check_status ("LOGIN1 UNLOCK-SESSION");
+        if (session->locked)
+            check_status ("LOGIN1 UNLOCK-SESSION");
+        session->locked = FALSE;
         g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
     }
     else
diff --git a/tests/test-lock-seat-return-session-console-kit b/tests/test-lock-seat-return-session-console-kit
new file mode 100755 (executable)
index 0000000..2a1df67
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-seat-return-session-console-kit test-gobject-greeter