diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2016-11-28 16:36:38 +1300 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2016-11-28 16:36:38 +1300 |
commit | badeec2022be718a1c37ec0da223c9d74f44cb66 (patch) | |
tree | 8b42e84d0846e7266ee71aca0edf21cab00ccfae | |
parent | 5ef39191b647312ad058099e05a583652428a7e8 (diff) | |
parent | 04659fc24d22b73f0be3009634a25927c1d5f994 (diff) | |
download | lightdm-git-badeec2022be718a1c37ec0da223c9d74f44cb66.tar.gz |
Use logind to terminate greeter sessions if it is available
-rw-r--r-- | debian/changelog | 7 | ||||
-rw-r--r-- | debian/patches/series | 1 | ||||
-rw-r--r-- | debian/patches/terminate-session.patch | 83 | ||||
-rw-r--r-- | src/login1.c | 33 | ||||
-rw-r--r-- | src/login1.h | 2 | ||||
-rw-r--r-- | src/session.c | 5 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/scripts/login1-terminate.conf | 72 | ||||
-rw-r--r-- | tests/src/test-runner.c | 25 | ||||
-rwxr-xr-x | tests/test-login1-terminate | 2 |
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 |