summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2016-11-28 16:36:38 +1300
committerRobert Ancell <robert.ancell@canonical.com>2016-11-28 16:36:38 +1300
commitbadeec2022be718a1c37ec0da223c9d74f44cb66 (patch)
tree8b42e84d0846e7266ee71aca0edf21cab00ccfae
parent5ef39191b647312ad058099e05a583652428a7e8 (diff)
parent04659fc24d22b73f0be3009634a25927c1d5f994 (diff)
downloadlightdm-git-badeec2022be718a1c37ec0da223c9d74f44cb66.tar.gz
Use logind to terminate greeter sessions if it is available
-rw-r--r--debian/changelog7
-rw-r--r--debian/patches/series1
-rw-r--r--debian/patches/terminate-session.patch83
-rw-r--r--src/login1.c33
-rw-r--r--src/login1.h2
-rw-r--r--src/session.c5
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/scripts/login1-terminate.conf72
-rw-r--r--tests/src/test-runner.c25
-rwxr-xr-xtests/test-login1-terminate2
10 files changed, 148 insertions, 84 deletions
diff --git a/debian/changelog b/debian/changelog
index ebc13e17..042a5ce7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+lightdm (1.21.2-0ubuntu1) UNRELEASED; urgency=medium
+
+ * debian/patches/terminate-session.patch:
+ - Merged upstream
+
+ -- Robert Ancell <robert.ancell@canonical.com> Mon, 28 Nov 2016 16:35:58 +1300
+
lightdm (1.21.1-0ubuntu2) zesty; urgency=medium
Restore patch from 1.20.0-0ubuntu3:
diff --git a/debian/patches/series b/debian/patches/series
index 66de6c10..d3ba2550 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,4 +1,3 @@
04_language_handling.patch
05_translate_debian_files.patch
autologin-session-workaround.patch
-terminate-session.patch
diff --git a/debian/patches/terminate-session.patch b/debian/patches/terminate-session.patch
deleted file mode 100644
index 1a6a0299..00000000
--- a/debian/patches/terminate-session.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-Description: Terminate leftover processes in greeter session
- It can happen that the greeter session does not properly clean up itself on
- logout. This causes leaked processes like settings-daemon which act on the
- user session as they share the same $DISPLAY. Ask logind to terminate
- remaining processes in the greeter session on closing, which is more robust
- than trying to fix every greeter.
-Author: Martin Pitt <martin.pitt@canonical.com>
-Forwarded: https://code.launchpad.net/~pitti/lightdm/cleanup-session/+merge/310758
-Bug-Ubuntu: https://launchpad.net/bugs/1637758
-
-=== modified file 'src/login1.c'
---- old/src/login1.c 2015-10-16 10:04:18 +0000
-+++ new/src/login1.c 2016-11-14 11:00:45 +0000
-@@ -437,6 +437,39 @@
- }
- }
-
-+void
-+login1_service_terminate_session (Login1Service *service, const gchar *session_id)
-+{
-+ GError *error = NULL;
-+
-+ g_return_if_fail (service != NULL);
-+ g_return_if_fail (session_id != NULL);
-+
-+ g_debug ("Terminating login1 session %s", session_id);
-+
-+ if (session_id)
-+ {
-+ GVariant *result;
-+
-+ result = g_dbus_connection_call_sync (service->priv->connection,
-+ LOGIN1_SERVICE_NAME,
-+ LOGIN1_OBJECT_NAME,
-+ LOGIN1_MANAGER_INTERFACE_NAME,
-+ "TerminateSession",
-+ g_variant_new ("(s)", session_id),
-+ G_VARIANT_TYPE ("()"),
-+ G_DBUS_CALL_FLAGS_NONE,
-+ -1,
-+ NULL,
-+ &error);
-+ if (error)
-+ g_warning ("Error terminating login1 session: %s", error->message);
-+ g_clear_error (&error);
-+ if (result)
-+ g_variant_unref (result);
-+ }
-+}
-+
- static void
- login1_service_init (Login1Service *service)
- {
-
-=== modified file 'src/login1.h'
---- old/src/login1.h 2014-12-16 22:48:40 +0000
-+++ new/src/login1.h 2016-11-14 11:00:45 +0000
-@@ -78,6 +78,8 @@
-
- void login1_service_activate_session (Login1Service *service, const gchar *session_id);
-
-+void login1_service_terminate_session (Login1Service *service, const gchar *session_id);
-+
- const gchar *login1_seat_get_id (Login1Seat *seat);
-
- gboolean login1_seat_get_can_graphical (Login1Seat *seat);
-
-=== modified file 'src/session.c'
---- old/src/session.c 2016-07-11 21:51:14 +0000
-+++ new/src/session.c 2016-11-14 11:00:45 +0000
-@@ -913,6 +913,11 @@
- {
- g_return_if_fail (session != NULL);
-
-+ /* Kill remaining processes in our logind session to avoid them leaking
-+ * to the user session (they share the same $DISPLAY) */
-+ if (getuid () == 0 && session->priv->login1_session_id)
-+ login1_service_terminate_session (login1_service_get_instance (), session->priv->login1_session_id);
-+
- /* If can cleanly stop then do that */
- if (session_get_is_authenticated (session) && !session->priv->command_run)
- {
-
diff --git a/src/login1.c b/src/login1.c
index dc60a492..73d2d8b9 100644
--- a/src/login1.c
+++ b/src/login1.c
@@ -437,6 +437,39 @@ login1_service_activate_session (Login1Service *service, const gchar *session_id
}
}
+void
+login1_service_terminate_session (Login1Service *service, const gchar *session_id)
+{
+ GError *error = NULL;
+
+ g_return_if_fail (service != NULL);
+ g_return_if_fail (session_id != NULL);
+
+ g_debug ("Terminating login1 session %s", session_id);
+
+ if (session_id)
+ {
+ GVariant *result;
+
+ result = g_dbus_connection_call_sync (service->priv->connection,
+ LOGIN1_SERVICE_NAME,
+ LOGIN1_OBJECT_NAME,
+ LOGIN1_MANAGER_INTERFACE_NAME,
+ "TerminateSession",
+ g_variant_new ("(s)", session_id),
+ G_VARIANT_TYPE ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (error)
+ g_warning ("Error terminating login1 session: %s", error->message);
+ g_clear_error (&error);
+ if (result)
+ g_variant_unref (result);
+ }
+}
+
static void
login1_service_init (Login1Service *service)
{
diff --git a/src/login1.h b/src/login1.h
index e34e806b..9377dba8 100644
--- a/src/login1.h
+++ b/src/login1.h
@@ -78,6 +78,8 @@ void login1_service_unlock_session (Login1Service *service, const gchar *session
void login1_service_activate_session (Login1Service *service, const gchar *session_id);
+void login1_service_terminate_session (Login1Service *service, const gchar *session_id);
+
const gchar *login1_seat_get_id (Login1Seat *seat);
gboolean login1_seat_get_can_graphical (Login1Seat *seat);
diff --git a/src/session.c b/src/session.c
index 5e7d4767..15598425 100644
--- a/src/session.c
+++ b/src/session.c
@@ -913,6 +913,11 @@ session_stop (Session *session)
{
g_return_if_fail (session != NULL);
+ /* Kill remaining processes in our logind session to avoid them leaking
+ * to the user session (they share the same $DISPLAY) */
+ if (getuid () == 0 && session->priv->login1_session_id)
+ login1_service_terminate_session (login1_service_get_instance (), session->priv->login1_session_id);
+
/* If can cleanly stop then do that */
if (session_get_is_authenticated (session) && !session->priv->command_run)
{
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a0db3da1..e424c2d7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -219,6 +219,7 @@ TESTS = \
test-console-kit \
test-console-kit-no-xdg-runtime \
test-no-console-kit \
+ test-login1-terminate \
test-no-login1 \
test-no-console-kit-or-login1 \
test-power-gobject \
@@ -490,6 +491,7 @@ EXTRA_DIST = \
scripts/lock-session-resettable.conf \
scripts/lock-session-return-session.conf \
scripts/lock-session-twice.conf \
+ scripts/login1-terminate.conf \
scripts/login.conf \
scripts/login-crash-authenticate.conf \
scripts/login-guest.conf \
diff --git a/tests/scripts/login1-terminate.conf b/tests/scripts/login1-terminate.conf
new file mode 100644
index 00000000..552686f3
--- /dev/null
+++ b/tests/scripts/login1-terminate.conf
@@ -0,0 +1,72 @@
+#
+# Check login1 session is terminated for greeters
+#
+
+[Seat:*]
+user-session=default
+
+[test-runner-config]
+log-login1-terminate=true
+
+#?*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
+
+# Greeter starts
+#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_SESSION_CLASS=greeter
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-X-0 CONNECT-XSERVER
+#?GREETER-X-0 CONNECT-TO-DAEMON
+#?GREETER-X-0 CONNECTED-TO-DAEMON
+
+# Log in
+#?*GREETER-X-0 AUTHENTICATE USERNAME=have-password1
+#?GREETER-X-0 SHOW-PROMPT TEXT="Password:"
+#?*GREETER-X-0 RESPOND TEXT="password"
+#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*GREETER-X-0 START-SESSION
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?LOGIN1 TERMINATE-SESSION SESSION=c0
+
+# 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=c1
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Logout session
+#?*SESSION-X-0 LOGOUT
+
+# X server stops
+#?XSERVER-0 TERMINATE SIGNAL=15
+
+# 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
+
+# Greeter starts
+#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_SESSION_CLASS=greeter
+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-X-0 CONNECT-XSERVER
+#?GREETER-X-0 CONNECT-TO-DAEMON
+#?GREETER-X-0 CONNECTED-TO-DAEMON
+
+# Cleanup
+#?*STOP-DAEMON
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?LOGIN1 TERMINATE-SESSION SESSION=c2
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/src/test-runner.c b/tests/src/test-runner.c
index bcb6f8ee..d4d2ccfa 100644
--- a/tests/src/test-runner.c
+++ b/tests/src/test-runner.c
@@ -1871,6 +1871,28 @@ handle_login1_call (GDBusConnection *connection,
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
}
+ else if (strcmp (method_name, "TerminateSession") == 0)
+ {
+ const gchar *id;
+ Login1Session *session;
+
+ g_variant_get (parameters, "(&s)", &id);
+ session = find_login1_session (id);
+ if (!session)
+ {
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such session: %s", id);
+ return;
+ }
+
+ if (g_key_file_get_boolean (config, "test-runner-config", "log-login1-terminate", NULL))
+ {
+ gchar *status = g_strdup_printf ("LOGIN1 TERMINATE-SESSION SESSION=%s", id);
+ check_status (status);
+ g_free (status);
+ }
+
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
+ }
else if (strcmp (method_name, "CanReboot") == 0)
{
check_status ("LOGIN1 CAN-REBOOT");
@@ -1947,6 +1969,9 @@ login1_name_acquired_cb (GDBusConnection *connection,
" <method name='ActivateSession'>"
" <arg name='id' type='s' direction='in'/>"
" </method>"
+ " <method name='TerminateSession'>"
+ " <arg name='id' type='s' direction='in'/>"
+ " </method>"
" <method name='CanReboot'>"
" <arg name='result' direction='out' type='s'/>"
" </method>"
diff --git a/tests/test-login1-terminate b/tests/test-login1-terminate
new file mode 100755
index 00000000..eafdbadc
--- /dev/null
+++ b/tests/test-login1-terminate
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner login1-terminate test-gobject-greeter