diff --git a/common/user-list.c b/common/user-list.c index 0774d9c7..359fe7ab 100644 --- a/common/user-list.c +++ b/common/user-list.c @@ -1348,11 +1348,17 @@ common_user_get_language (CommonUser *user) void common_user_set_language (CommonUser *user, const gchar *language) { + CommonUserPrivate *priv = common_user_get_instance_private (user); + g_return_if_fail (COMMON_IS_USER (user)); if (g_strcmp0 (common_user_get_language (user), language) != 0) { call_method (user, "SetLanguage", g_variant_new ("(s)", language), "()", NULL); save_string_to_dmrc (user, "Desktop", "Language", language); + g_free (priv->language); + priv->language = g_strdup (language); + if (priv->language && priv->language[0] == '\0') + g_clear_pointer (&priv->language, g_free); } } @@ -1421,11 +1427,20 @@ common_user_get_session (CommonUser *user) void common_user_set_session (CommonUser *user, const gchar *session) { + CommonUserPrivate *priv = common_user_get_instance_private (user); + g_return_if_fail (COMMON_IS_USER (user)); + /* Update the in-memory cache: load_dmrc only runs once when AccountsService + * is unavailable, so skipping this left .dmrc stuck after switching away + * from the originally loaded session (#325). */ if (g_strcmp0 (common_user_get_session (user), session) != 0) { call_method (user, "SetXSession", g_variant_new ("(s)", session), "()", NULL); save_string_to_dmrc (user, "Desktop", "Session", session); + g_free (priv->session); + priv->session = g_strdup (session); + if (priv->session && priv->session[0] == '\0') + g_clear_pointer (&priv->session, g_free); } } diff --git a/tests/Makefile.am b/tests/Makefile.am index fc85348e..7ad8a4ee 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -102,6 +102,7 @@ TESTS = \ test-login-multi-prompt-gobject \ test-login-pick-session-gobject \ test-login-remember-session-gobject \ + test-login-remember-original-session \ test-login-manual-remember-session-gobject \ test-login-previous-session-gobject \ test-login-wrong-password-gobject \ @@ -500,6 +501,7 @@ EXTRA_DIST = \ scripts/login-pick-session.conf \ scripts/login-previous-session.conf \ scripts/login-remember-session.conf \ + scripts/login-remember-original-session.conf \ scripts/login-remote-session.conf \ scripts/login-session-crash.conf \ scripts/login-two-factor.conf \ diff --git a/tests/scripts/login-remember-original-session.conf b/tests/scripts/login-remember-original-session.conf new file mode 100644 index 00000000..d904d981 --- /dev/null +++ b/tests/scripts/login-remember-original-session.conf @@ -0,0 +1,70 @@ +# +# Returning to the originally loaded .dmrc session must rewrite .dmrc (issue #325) +# + +[test-runner-config] +disable-accounts-service=true + +[Seat:*] +user-session=default + +#?*START-DAEMON +#?RUNNER DAEMON-START + +#?XSERVER-0 START VT=7 SEAT=seat0 +#?*XSERVER-0 INDICATE-READY +#?XSERVER-0 INDICATE-READY +#?XSERVER-0 ACCEPT-CONNECT + +#?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 + +# have-session starts with Session=alternative in .dmrc; switch to default +#?*GREETER-X-0 AUTHENTICATE USERNAME=have-session +#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=have-session AUTHENTICATED=TRUE +#?*GREETER-X-0 START-SESSION SESSION=default +#?GREETER-X-0 TERMINATE SIGNAL=15 + +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-session XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-session +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +#?*SESSION-X-0 LOGOUT +#?XSERVER-0 TERMINATE SIGNAL=15 + +#?XSERVER-0 START VT=7 SEAT=seat0 +#?*XSERVER-0 INDICATE-READY +#?XSERVER-0 INDICATE-READY +#?XSERVER-0 ACCEPT-CONNECT + +#?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 + +# Switch back to the originally loaded session +#?*GREETER-X-0 AUTHENTICATE USERNAME=have-session +#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=have-session AUTHENTICATED=TRUE +#?*GREETER-X-0 START-SESSION SESSION=alternative +#?GREETER-X-0 TERMINATE SIGNAL=15 + +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-session XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=alternative NAME=alternative USER=have-session +#?LOGIN1 ACTIVATE-SESSION SESSION=c3 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# .dmrc must record alternative again (not stay stuck on default) +#?*CHECK-DMRC-SESSION USERNAME=have-session +#?RUNNER DMRC-SESSION USERNAME=have-session SESSION=alternative + +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?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 64b7fb86..6441fa9a 100644 --- a/tests/src/test-runner.c +++ b/tests/src/test-runner.c @@ -801,6 +801,18 @@ handle_command (const gchar *command) } else if (strcmp (name, "STOP-DAEMON") == 0) stop_process (lightdm_process); + else if (strcmp (name, "CHECK-DMRC-SESSION") == 0) + { + const gchar *username = g_hash_table_lookup (params, "USERNAME"); + g_autofree gchar *path = g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "home", username, ".dmrc", NULL); + g_autoptr(GKeyFile) dmrc = g_key_file_new (); + g_autofree gchar *session = NULL; + if (g_key_file_load_from_file (dmrc, path, G_KEY_FILE_NONE, NULL)) + session = g_key_file_get_string (dmrc, "Desktop", "Session", NULL); + g_autofree gchar *status_text = g_strdup_printf ("RUNNER DMRC-SESSION USERNAME=%s SESSION=%s", + username, session ? session : ""); + check_status (status_text); + } // FIXME: Make generic RUN-COMMAND else if (strcmp (name, "START-XSERVER") == 0) { diff --git a/tests/test-login-remember-original-session b/tests/test-login-remember-original-session new file mode 100755 index 00000000..2fd87c98 --- /dev/null +++ b/tests/test-login-remember-original-session @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner login-remember-original-session test-gobject-greeter