/* 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;
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 */
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 *
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)
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);
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);
}
}
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);
}
}
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 \
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 \
#?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
--- /dev/null
+#
+# 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
#?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
#?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
#?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
#?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
# 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:"
#?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
#?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
#?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
#?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
#?*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
#?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
#?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
#?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
#?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
#?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
#?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
#?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
#?XSERVER-1 INDICATE-READY
#?XSERVER-1 ACCEPT-CONNECT
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
# Switch to session
#?VT ACTIVATE VT=8
#?XSERVER-1 INDICATE-READY
#?XSERVER-1 ACCEPT-CONNECT
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
# Switch to session
#?VT ACTIVATE VT=8
#?XSERVER-1 INDICATE-READY
#?XSERVER-1 ACCEPT-CONNECT
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
# Switch to session
#?VT ACTIVATE VT=8
#?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
#?XSERVER-1 INDICATE-READY
#?XSERVER-1 ACCEPT-CONNECT
+# Session is locked
+#?LOGIN1 LOCK-SESSION
+
# Switch to session
#?VT ACTIVATE VT=8
# 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
#?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
gchar *cookie;
gchar *path;
guint id;
+ gboolean locked;
} CKSession;
static GList *ck_sessions = NULL;
static gint ck_session_index = 0;
{
gchar *path;
guint pid;
+ gboolean locked;
} Login1Session;
static GList *login1_sessions = NULL;
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
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
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-seat-return-session-console-kit test-gobject-greeter