diff -Nru lightdm-1.18.1/common/user-list.c lightdm-1.18.3/common/user-list.c --- lightdm-1.18.1/common/user-list.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/common/user-list.c 2016-07-29 03:49:09.000000000 +0000 @@ -61,6 +61,7 @@ enum { CHANGED, + GET_LOGGED_IN, LAST_USER_SIGNAL }; static guint user_signals[LAST_USER_SIGNAL] = { 0 }; @@ -93,12 +94,12 @@ typedef struct { - /* User list this user is part of */ - CommonUserList *user_list; - /* TRUE if have loaded the DMRC file */ gboolean loaded_dmrc; + /* Bus we are listening for accounts service on */ + GDBusConnection *bus; + /* Accounts service path */ gchar *path; @@ -252,10 +253,34 @@ return TRUE; } +static void load_sessions (CommonUserList *user_list); + +static gboolean +get_logged_in_cb (CommonUser *user, CommonUserList *user_list) +{ + CommonUserListPrivate *priv = GET_LIST_PRIVATE (user_list); + const gchar *username; + GList *link; + + // Lazily decide to load/listen to sessions + if (priv->session_added_signal == 0) + load_sessions (user_list); + + username = GET_USER_PRIVATE (user)->name; + for (link = priv->sessions; link; link = link->next) + { + CommonSession *session = link->data; + if (strcmp (session->username, username) == 0) + return TRUE; + } + + return FALSE; +} + static void -user_changed_cb (CommonUser *user) +user_changed_cb (CommonUser *user, CommonUserList *user_list) { - g_signal_emit (GET_USER_PRIVATE (user)->user_list, list_signals[USER_CHANGED], 0, user); + g_signal_emit (user_list, list_signals[USER_CHANGED], 0, user); } static CommonUser * @@ -266,6 +291,8 @@ char **tokens; gchar *real_name, *image; + g_signal_connect (user, "get-logged-in", G_CALLBACK (get_logged_in_cb), user_list); + tokens = g_strsplit (entry->pw_gecos, ",", -1); if (tokens[0] != NULL && tokens[0][0] != '\0') real_name = g_strdup (tokens[0]); @@ -285,7 +312,6 @@ } } - priv->user_list = user_list; priv->name = g_strdup (entry->pw_name); priv->real_name = real_name; priv->home_directory = g_strdup (entry->pw_dir); @@ -405,7 +431,7 @@ { CommonUser *info = link->data; g_debug ("User %s added", common_user_get_name (info)); - g_signal_connect (info, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), NULL); + g_signal_connect (info, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), user_list); if (emit_add_signal) g_signal_emit (user_list, list_signals[USER_ADDED], 0, info); } @@ -483,7 +509,7 @@ /* Get the properties for this user */ if (!priv->changed_signal) - priv->changed_signal = g_dbus_connection_signal_subscribe (GET_LIST_PRIVATE (priv->user_list)->bus, + priv->changed_signal = g_dbus_connection_signal_subscribe (priv->bus, "org.freedesktop.Accounts", "org.freedesktop.Accounts.User", "Changed", @@ -493,7 +519,7 @@ accounts_user_changed_cb, user, NULL); - result = g_dbus_connection_call_sync (GET_LIST_PRIVATE (priv->user_list)->bus, + result = g_dbus_connection_call_sync (priv->bus, "org.freedesktop.Accounts", priv->path, "org.freedesktop.DBus.Properties", @@ -600,9 +626,10 @@ priv = GET_USER_PRIVATE (user); g_debug ("User %s added", path); - priv->user_list = user_list; + priv->bus = g_object_ref (list_priv->bus); priv->path = g_strdup (path); - g_signal_connect (user, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), NULL); + g_signal_connect (user, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), user_list); + g_signal_connect (user, "get-logged-in", G_CALLBACK (get_logged_in_cb), user_list); if (load_accounts_user (user)) { list_priv->users = g_list_insert_sorted (list_priv->users, user, compare_user); @@ -1135,12 +1162,11 @@ { GVariant *answer; GError *error = NULL; - CommonUserPrivate *user_priv = GET_USER_PRIVATE (user); - CommonUserListPrivate *list_priv = GET_LIST_PRIVATE (user_priv->user_list); + CommonUserPrivate *priv = GET_USER_PRIVATE (user); - answer = g_dbus_connection_call_sync (list_priv->bus, + answer = g_dbus_connection_call_sync (priv->bus, "org.freedesktop.Accounts", - user_priv->path, + priv->path, "org.freedesktop.Accounts.User", method, args, @@ -1438,27 +1464,13 @@ gboolean common_user_get_logged_in (CommonUser *user) { - CommonUserPrivate *priv; - CommonUserListPrivate *list_priv; - GList *link; + gboolean result; g_return_val_if_fail (COMMON_IS_USER (user), FALSE); - priv = GET_USER_PRIVATE (user); - list_priv = GET_LIST_PRIVATE (priv->user_list); - - // Lazily decide to load/listen to sessions - if (list_priv->session_added_signal == 0) - load_sessions (priv->user_list); - - for (link = list_priv->sessions; link; link = link->next) - { - CommonSession *session = link->data; - if (strcmp (session->username, priv->name) == 0) - return TRUE; - } + g_signal_emit (user, user_signals[GET_LOGGED_IN], 0, &result); - return FALSE; + return result; } /** @@ -1604,7 +1616,8 @@ g_free (priv->path); if (priv->changed_signal) - g_dbus_connection_signal_unsubscribe (GET_LIST_PRIVATE (priv->user_list)->bus, priv->changed_signal); + g_dbus_connection_signal_unsubscribe (priv->bus, priv->changed_signal); + g_clear_object (&priv->bus); g_free (priv->name); g_free (priv->real_name); g_free (priv->home_directory); @@ -1751,6 +1764,16 @@ NULL, NULL, NULL, G_TYPE_NONE, 0); + + user_signals[GET_LOGGED_IN] = + g_signal_new ("get-logged-in", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + g_signal_accumulator_first_wins, + NULL, + NULL, + G_TYPE_BOOLEAN, 0); } static void diff -Nru lightdm-1.18.1/configure.ac lightdm-1.18.3/configure.ac --- lightdm-1.18.1/configure.ac 2016-04-05 00:05:52.000000000 +0000 +++ lightdm-1.18.3/configure.ac 2016-08-11 23:36:32.000000000 +0000 @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(lightdm, 1.18.1) +AC_INIT(lightdm, 1.18.3) AC_CONFIG_MACRO_DIR(m4) AC_CONFIG_HEADER(config.h) AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz foreign]) @@ -158,27 +158,27 @@ dnl Configurable values dnl ########################################################################### -USER_SESSION=default +DEFAULT_USER_SESSION=default AC_ARG_WITH(user-session, AS_HELP_STRING(--with-user-session=, Session to use for user accounts), if test x$withval != x; then - USER_SESSION="$withval" + DEFAULT_USER_SESSION="$withval" fi ) -AC_SUBST(USER_SESSION) -AC_DEFINE_UNQUOTED(USER_SESSION, "$USER_SESSION", User session) +AC_SUBST(DEFAULT_USER_SESSION) +AC_DEFINE_UNQUOTED(DEFAULT_USER_SESSION, "$DEFAULT_USER_SESSION", User session) -GREETER_SESSION=default +DEFAULT_GREETER_SESSION=default AC_ARG_WITH(greeter-session, AS_HELP_STRING(--with-greeter-session=, Greeter session), if test x$withval != x; then - GREETER_SESSION="$withval" + DEFAULT_GREETER_SESSION="$withval" fi ) -AC_SUBST(GREETER_SESSION) -AC_DEFINE_UNQUOTED(GREETER_SESSION, "$GREETER_SESSION", Greeter session) +AC_SUBST(DEFAULT_GREETER_SESSION) +AC_DEFINE_UNQUOTED(DEFAULT_GREETER_SESSION, "$DEFAULT_GREETER_SESSION", Greeter session) GREETER_USER=lightdm AC_ARG_WITH(greeter-user, @@ -237,9 +237,9 @@ =========================== prefix: $prefix - Greeter session: $GREETER_SESSION + Greeter session: $DEFAULT_GREETER_SESSION Greeter user: $GREETER_USER - User session: $USER_SESSION + User session: $DEFAULT_USER_SESSION GObject introspection: $found_introspection Vala bindings: $enable_vala liblightdm-qt: $compile_liblightdm_qt4 diff -Nru lightdm-1.18.1/data/apparmor/lightdm-guest-session.in lightdm-1.18.3/data/apparmor/lightdm-guest-session.in --- lightdm-1.18.1/data/apparmor/lightdm-guest-session.in 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/data/apparmor/lightdm-guest-session.in 2016-06-20 04:57:48.000000000 +0000 @@ -9,4 +9,16 @@ # chromium-browser needs special confinement due to its sandboxing #include + + # fcitx and friends needs special treatment due to C/S design + /usr/bin/fcitx ix, + /tmp/fcitx-socket-* rwl, + /dev/shm/* rwl, + /usr/bin/fcitx-qimpanel ix, + /usr/bin/sogou-qimpanel-watchdog ix, + /usr/bin/sogou-sys-notify ix, + /tmp/sogou-qimpanel:* rwl, + + # mozc_server needs special treatment due to C/S design + unix (bind, listen) type=stream addr="@tmp/.mozc.*", } diff -Nru lightdm-1.18.1/data/lightdm.conf lightdm-1.18.3/data/lightdm.conf --- lightdm-1.18.1/data/lightdm.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/data/lightdm.conf 2016-05-05 00:09:39.000000000 +0000 @@ -132,6 +132,7 @@ # port = UDP/IP port to listen for connections on # listen-address = Host/address to listen for XDMCP connections (use all addresses if not present) # key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf) +# hostname = Hostname to report to XDMCP clients (defaults to system hostname if unset) # # The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively # it can be a word and the first 7 characters are used as the key. @@ -141,6 +142,7 @@ #port=177 #listen-address= #key= +#hostname= # # VNC Server configuration diff -Nru lightdm-1.18.1/debian/changelog lightdm-1.18.3/debian/changelog --- lightdm-1.18.1/debian/changelog 2016-04-05 00:28:49.000000000 +0000 +++ lightdm-1.18.3/debian/changelog 2017-03-31 18:14:13.000000000 +0000 @@ -1,3 +1,64 @@ +lightdm (1.18.3-0ubuntu1.1) xenial-security; urgency=medium + + * SECURITY UPDATE: Directory traversal allowing arbitrary directory + ownership and privilege escalation (LP: #1677924) + - debian/guest-account.sh: Detect existing malicious guest user home dirs + before proceeding with guest user creation + - CVE-2017-7358 + + -- Tyler Hicks Fri, 31 Mar 2017 16:04:04 +0000 + +lightdm (1.18.3-0ubuntu1) xenial; urgency=medium + + * New upstream release: + - Fix error that caused stdin to be closed. This seems to have lots of bad + side effects (greeter not working correctly, multi-seat failing). + - Add support for greeters running inside sessions. This is enabled by + setting X-LightDM-Allow-Greeter inside the session .desktop file. + The session can then use liblightdm to connect one greeter to the + daemon. The communication is done using a socket + (/var/run/lightdm//greeter-socket) that is accessible to any + process run by that user. Consider controlling access to this socket + using a MAC system such as AppArmor. (LP: #1582242) + - Fix various memory management issues exposed by the use of in-session + greeters. + * debian/patches/lp1605117.patch: + - Applied upstream + + -- Robert Ancell Fri, 12 Aug 2016 11:37:43 +1200 + +lightdm (1.18.2-0ubuntu2) xenial; urgency=medium + + * debian/patches/lp1605117.patch: + - Fix stdin being accidentally closed, causing indicators not to show in + unity-greeter (LP: #1605117) + + -- Robert Ancell Fri, 29 Jul 2016 15:18:41 +1200 + +lightdm (1.18.2-0ubuntu1) xenial; urgency=medium + + * New upstream release: + - Don't quit on SIGUSR1, SIGUSR2 or SIGHUP (LP: #960157) + - Use MIR_SERVER_HOST_SOCKET instead of MIR_SOCKET to report compositor + socket to sessions. This used to work but no longer works in Mir 0.21 + (LP: #1583624) + - Use only a single compositor on xlocal seats (LP: #1594229) + - Fix Mir greeter log filename having "(null)" in the name (LP: #1590582) + - Set XDMCP hostname field in to system hostname or configured value + (LP: #1578442) + - Improve XDMCP IPv6 address selection (LP: #1575200) + - Allow fcitx and mozc to run in guest session (LP: #1509829) + - Fix uninitialized memory errors + * debian/lightdm.dirs: + - Ensure user configuration directories /etc/lightdm/lightdm.conf.d and + /etc/guest-session exist + * debian/guest-account.sh: + * debian/guest-session-setup.sh: + - Source prefs.sh as privileged user to allow user modification + (LP: #1581853) + + -- Robert Ancell Tue, 21 Jun 2016 12:49:01 +1200 + lightdm (1.18.1-0ubuntu1) xenial; urgency=medium * New upstream release: diff -Nru lightdm-1.18.1/debian/guest-account.sh lightdm-1.18.3/debian/guest-account.sh --- lightdm-1.18.1/debian/guest-account.sh 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/debian/guest-account.sh 2017-03-31 18:14:13.000000000 +0000 @@ -35,7 +35,13 @@ temp_home=$(mktemp -td guest-XXXXXX) GUEST_HOME=$(echo ${temp_home} | tr '[:upper:]' '[:lower:]') GUEST_USER=${GUEST_HOME#/tmp/} - [ ${GUEST_HOME} != ${temp_home} ] && mv ${temp_home} ${GUEST_HOME} + if [ "${GUEST_HOME}" != "${temp_home}" ]; then + mkdir "${GUEST_HOME}" || { + echo "Failed to create ${GUEST_USER}'s home directory (${GUEST_HOME})" + exit 1 + } + rmdir "${temp_home}" + fi # if ${GUEST_USER} already exists, it must be a locked system account with no existing # home directory @@ -132,12 +138,20 @@ chown -R ${GUEST_USER}:${GUEST_USER} ${GUEST_HOME} fi - # delay the launch of info dialog - echo "export DIALOG_SLEEP=4" >> ${GUEST_HOME}/.profile - # setup session su ${GUEST_USER} -c "env HOME=${GUEST_HOME} site_gs=${site_gs} ${dist_gs}/setup.sh" + # set possible local guest session preferences + source_local_prefs() { + local USER=${GUEST_USER} + local HOME=${GUEST_HOME} + . ${site_gs}/prefs.sh + chown -R ${USER}:${USER} ${HOME} + } + if [ -f ${site_gs}/prefs.sh ]; then + source_local_prefs + fi + echo ${GUEST_USER} } diff -Nru lightdm-1.18.1/debian/guest-session-setup.sh lightdm-1.18.3/debian/guest-session-setup.sh --- lightdm-1.18.1/debian/guest-session-setup.sh 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/debian/guest-session-setup.sh 2017-03-31 18:14:13.000000000 +0000 @@ -1,7 +1,6 @@ #!/bin/sh HOME=${HOME:-$(getent passwd $(whoami) | cut -f6 -d:)} -site_gs=${site_gs:-/etc/guest-session} # disable some services that are unnecessary for the guest session services="jockey-kde.desktop jockey-gtk.desktop update-notifier.desktop user-dirs-update-gtk.desktop" @@ -30,7 +29,5 @@ #dmrc='[Desktop]\nSession=guest-restricted' #/bin/echo -e ${dmrc} > ${HOME}/.dmrc -# set possible local guest session preferences -if [ -f ${site_gs}/prefs.sh ]; then - . ${site_gs}/prefs.sh -fi +# delay the launch of info dialog +echo "export DIALOG_SLEEP=4" >> ${HOME}/.profile diff -Nru lightdm-1.18.1/debian/lightdm.dirs lightdm-1.18.3/debian/lightdm.dirs --- lightdm-1.18.1/debian/lightdm.dirs 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/debian/lightdm.dirs 2017-03-31 18:14:13.000000000 +0000 @@ -1,3 +1,5 @@ +/etc/guest-session +/etc/lightdm/lightdm.conf.d /etc/X11 /var/cache/lightdm /var/lib/lightdm-data diff -Nru lightdm-1.18.1/debian/patches/04_language_handling.patch lightdm-1.18.3/debian/patches/04_language_handling.patch --- lightdm-1.18.1/debian/patches/04_language_handling.patch 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/debian/patches/04_language_handling.patch 2017-03-31 18:14:13.000000000 +0000 @@ -2,10 +2,10 @@ Forwarded: not-needed Author: Gunnar Hjalmarsson -Index: trunk/liblightdm-gobject/language.c +Index: 1.18/liblightdm-gobject/language.c =================================================================== ---- trunk.orig/liblightdm-gobject/language.c -+++ trunk/liblightdm-gobject/language.c +--- 1.18.orig/liblightdm-gobject/language.c ++++ 1.18/liblightdm-gobject/language.c @@ -40,7 +40,7 @@ static GList *languages = NULL; static void update_languages (void) @@ -56,10 +56,10 @@ return language; } -Index: trunk/tests/scripts/language-env.conf +Index: 1.18/tests/scripts/language-env.conf =================================================================== ---- trunk.orig/tests/scripts/language-env.conf -+++ trunk/tests/scripts/language-env.conf +--- 1.18.orig/tests/scripts/language-env.conf ++++ 1.18/tests/scripts/language-env.conf @@ -24,8 +24,8 @@ user-session=default #?SESSION-X-0 CONNECT-XSERVER @@ -71,11 +71,11 @@ #?*SESSION-X-0 READ-ENV NAME=GDM_LANG #?SESSION-X-0 READ-ENV NAME=GDM_LANG VALUE=en_AU -Index: trunk/src/seat.c +Index: 1.18/src/seat.c =================================================================== ---- trunk.orig/src/seat.c -+++ trunk/src/seat.c -@@ -1020,7 +1020,7 @@ configure_session (Session *session, Ses +--- 1.18.orig/src/seat.c ++++ 1.18/src/seat.c +@@ -1010,7 +1010,7 @@ configure_session (Session *session, Ses } if (language && language[0] != '\0') { diff -Nru lightdm-1.18.1/debian/patches/autologin-session-workaround.patch lightdm-1.18.3/debian/patches/autologin-session-workaround.patch --- lightdm-1.18.1/debian/patches/autologin-session-workaround.patch 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/debian/patches/autologin-session-workaround.patch 2017-03-31 18:14:13.000000000 +0000 @@ -2,11 +2,11 @@ Author: Robert Ancell Bug: https://bugs.launchpad.net/bugs/1484083 -Index: trunk/src/seat.c +Index: 1.18/src/seat.c =================================================================== ---- trunk.orig/src/seat.c -+++ trunk/src/seat.c -@@ -1050,7 +1050,12 @@ create_user_session (Seat *seat, const g +--- 1.18.orig/src/seat.c ++++ 1.18/src/seat.c +@@ -1040,7 +1040,12 @@ create_user_session (Seat *seat, const g if (autostart) { const gchar *autologin_session_name = seat_get_string_property (seat, "autologin-session"); diff -Nru lightdm-1.18.1/debian/source_lightdm.py lightdm-1.18.3/debian/source_lightdm.py --- lightdm-1.18.1/debian/source_lightdm.py 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/debian/source_lightdm.py 2017-03-31 18:14:13.000000000 +0000 @@ -13,9 +13,9 @@ display_manager_files['LightdmDisplayLog'] = \ 'cat /var/log/lightdm/x-0.log' display_manager_files['LightdmGreeterLog'] = \ - 'cat /var/log/lightdm/x-0-greeter.log' + 'cat /var/log/lightdm/seat0-greeter.log' display_manager_files['LightdmGreeterLogOld'] = \ - 'cat /var/log/lightdm/x-0-greeter.log.old' + 'cat /var/log/lightdm/seat0-greeter.log.old' display_manager_files['LightdmConfig'] = \ 'cat /etc/lightdm/lightdm.conf' display_manager_files['LightdmUsersConfig'] = \ diff -Nru lightdm-1.18.1/liblightdm-gobject/greeter.c lightdm-1.18.3/liblightdm-gobject/greeter.c --- lightdm-1.18.1/liblightdm-gobject/greeter.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/liblightdm-gobject/greeter.c 2016-07-29 03:48:53.000000000 +0000 @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include "lightdm/greeter.h" @@ -50,11 +52,15 @@ /* TRUE if the daemon can reuse this greeter */ gboolean resettable; + /* Socket connection to daemon */ + GSocket *socket; + /* Channel to write to daemon */ GIOChannel *to_server_channel; /* Channel to read from daemon */ GIOChannel *from_server_channel; + guint from_server_watch; /* Data read from the daemon */ guint8 *read_buffer; @@ -141,6 +147,8 @@ #define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request)) G_DEFINE_TYPE_WITH_CODE (Request, request, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, request_iface_init)); +static gboolean from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data); + GType lightdm_prompt_type_get_type (void) { @@ -347,6 +355,66 @@ } static gboolean +connect_to_daemon (LightDMGreeter *greeter) +{ + LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); + const gchar *to_server_fd, *from_server_fd, *pipe_path; + GError *error = NULL; + + if (priv->to_server_channel || priv->from_server_channel) + return TRUE; + + /* Use private connection if one exists */ + to_server_fd = g_getenv ("LIGHTDM_TO_SERVER_FD"); + from_server_fd = g_getenv ("LIGHTDM_FROM_SERVER_FD"); + pipe_path = g_getenv ("LIGHTDM_GREETER_PIPE"); + if (to_server_fd && from_server_fd) + { + priv->to_server_channel = g_io_channel_unix_new (atoi (to_server_fd)); + priv->from_server_channel = g_io_channel_unix_new (atoi (from_server_fd)); + } + else if (pipe_path) + { + GSocketAddress *address; + gboolean result; + + priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, &error); + if (!priv->socket) + return FALSE; + + address = g_unix_socket_address_new (pipe_path); + result = g_socket_connect (priv->socket, address, NULL, &error); + g_object_unref (address); + if (!result) + { + g_warning ("Failed to connect to greeter socket %s: %s", pipe_path, error->message); + g_clear_error (&error); + return FALSE; + } + + priv->from_server_channel = g_io_channel_unix_new (g_socket_get_fd (priv->socket)); + priv->to_server_channel = g_io_channel_ref (priv->from_server_channel); + } + else + { + g_warning ("Unable to determine socket to daemon"); + return FALSE; + } + + priv->from_server_watch = g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter); + + if (!g_io_channel_set_encoding (priv->to_server_channel, NULL, &error) || + !g_io_channel_set_encoding (priv->from_server_channel, NULL, &error)) + { + g_warning ("Failed to set encoding on from server channel to binary: %s", error->message); + g_clear_error (&error); + return FALSE; + } + + return TRUE; +} + +static gboolean send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) { LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); @@ -355,7 +423,7 @@ GError *error = NULL; guint32 stated_length; - if (!priv->to_server_channel) + if (!connect_to_daemon (greeter)) return FALSE; /* Double check that we're sending well-formed messages. If we say we're @@ -381,6 +449,8 @@ if (error) g_warning ("Error writing to daemon: %s", error->message); g_clear_error (&error); + if (status == G_IO_STATUS_AGAIN) + continue; if (status != G_IO_STATUS_NORMAL) return FALSE; data_length -= n_written; @@ -660,8 +730,8 @@ guint8 *buffer; GError *error = NULL; - if (!priv->from_server_channel) - return NULL; + if (!connect_to_daemon (greeter)) + return FALSE; /* Read the header, or the whole message if we already have that */ n_to_read = HEADER_SIZE; @@ -679,7 +749,12 @@ if (error) g_warning ("Error reading from server: %s", error->message); g_clear_error (&error); - if (status != G_IO_STATUS_NORMAL) + if (status == G_IO_STATUS_AGAIN) + { + if (block) + continue; + } + else if (status != G_IO_STATUS_NORMAL) break; g_debug ("Read %zi bytes from daemon", n_read); @@ -831,6 +906,7 @@ { LightDMGreeterPrivate *priv; Request *request; + gboolean result; g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); @@ -852,9 +928,10 @@ g_free (message); } while (!request->complete); + result = request->complete; g_object_unref (request); - return request->complete; + return result; } /** @@ -1588,39 +1665,9 @@ lightdm_greeter_init (LightDMGreeter *greeter) { LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - const gchar *fd; priv->read_buffer = g_malloc (HEADER_SIZE); priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - fd = g_getenv ("LIGHTDM_TO_SERVER_FD"); - if (fd) - { - GError *error = NULL; - - priv->to_server_channel = g_io_channel_unix_new (atoi (fd)); - g_io_channel_set_encoding (priv->to_server_channel, NULL, &error); - if (error) - g_warning ("Failed to set encoding on to server channel to binary: %s\n", error->message); - g_clear_error (&error); - } - else - g_warning ("No LIGHTDM_TO_SERVER_FD environment variable"); - - fd = g_getenv ("LIGHTDM_FROM_SERVER_FD"); - if (fd) - { - GError *error = NULL; - - priv->from_server_channel = g_io_channel_unix_new (atoi (fd)); - g_io_channel_set_encoding (priv->from_server_channel, NULL, &error); - if (error) - g_warning ("Failed to set encoding on from server channel to binary: %s\n", error->message); - g_clear_error (&error); - g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter); - } - else - g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable"); } static void @@ -1697,12 +1744,26 @@ LightDMGreeter *self = LIGHTDM_GREETER (object); LightDMGreeterPrivate *priv = GET_PRIVATE (self); + g_clear_object (&priv->socket); if (priv->to_server_channel) g_io_channel_unref (priv->to_server_channel); if (priv->from_server_channel) g_io_channel_unref (priv->from_server_channel); - g_free (priv->authentication_user); + if (priv->from_server_watch) + g_source_remove (priv->from_server_watch); + priv->from_server_watch = 0; + g_clear_pointer (&priv->read_buffer, g_free); + g_list_free_full (priv->responses_received, g_free); + priv->responses_received = NULL; + g_list_free_full (priv->connect_requests, g_object_unref); + priv->connect_requests = NULL; + g_list_free_full (priv->start_session_requests, g_object_unref); + priv->start_session_requests = NULL; + g_list_free_full (priv->ensure_shared_data_dir_requests, g_object_unref); + priv->ensure_shared_data_dir_requests = NULL; + g_clear_pointer (&priv->authentication_user, g_free); g_hash_table_unref (priv->hints); + priv->hints = NULL; G_OBJECT_CLASS (lightdm_greeter_parent_class)->finalize (object); } diff -Nru lightdm-1.18.1/NEWS lightdm-1.18.3/NEWS --- lightdm-1.18.1/NEWS 2016-04-05 00:06:55.000000000 +0000 +++ lightdm-1.18.3/NEWS 2016-08-11 23:45:10.000000000 +0000 @@ -1,3 +1,29 @@ +Overview of changes in lightdm 1.18.3 + + * Fix error that caused stdin to be closed. This seems to have lots of bad + side effects (greeter not working correctly, multi-seat failing). + * Add support for greeters running inside sessions. This is enabled by + setting X-LightDM-Allow-Greeter inside the session .desktop file. + The session can then use liblightdm to connect one greeter to the + daemon. The communication is done using a socket + (/var/run/lightdm//greeter-socket) that is accessible to any + process run by that user. Consider controlling access to this socket + using a MAC system such as AppArmor. + * Fix various memory management issues exposed by the use of in-session + greeters. + +Overview of changes in lightdm 1.18.2 + + * Don't quit on SIGUSR1, SIGUSR2 or SIGHUP + * Use MIR_SERVER_HOST_SOCKET instead of MIR_SOCKET to report compositor + socket to sessions. This used to work but no longer works in Mir 0.21 + * Use only a single compositor on xlocal seats + * Fix Mir greeter log filename having "(null)" in the name + * Set XDMCP hostname field in to system hostname or configured value + * Improve XDMCP IPv6 address selection + * Allow fcitx and mozc to run in guest session + * Fix uninitialized memory errors + Overview of changes in lightdm 1.18.1 * Use /dev/tty0 instead of /dev/console for VT operations diff -Nru lightdm-1.18.1/po/lightdm.pot lightdm-1.18.3/po/lightdm.pot --- lightdm-1.18.1/po/lightdm.pot 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/po/lightdm.pot 2016-06-21 00:35:27.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-08-10 12:37+1200\n" +"POT-Creation-Date: 2016-06-21 12:35+1200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,57 +18,57 @@ "Content-Transfer-Encoding: 8bit\n" #. Help string for command line --config flag -#: ../src/lightdm.c:1169 +#: ../src/lightdm.c:1188 msgid "Use configuration file" msgstr "" #. Help string for command line --debug flag -#: ../src/lightdm.c:1172 +#: ../src/lightdm.c:1191 msgid "Print debugging messages" msgstr "" #. Help string for command line --test-mode flag -#: ../src/lightdm.c:1175 +#: ../src/lightdm.c:1194 msgid "Run as unprivileged user, skipping things that require root access" msgstr "" #. Help string for command line --pid-file flag -#: ../src/lightdm.c:1178 +#: ../src/lightdm.c:1197 msgid "File to write PID into" msgstr "" #. Help string for command line --log-dir flag -#: ../src/lightdm.c:1181 +#: ../src/lightdm.c:1200 msgid "Directory to write logs to" msgstr "" #. Help string for command line --run-dir flag -#: ../src/lightdm.c:1184 +#: ../src/lightdm.c:1203 msgid "Directory to store running state" msgstr "" #. Help string for command line --cache-dir flag -#: ../src/lightdm.c:1187 +#: ../src/lightdm.c:1206 msgid "Directory to cache information" msgstr "" #. Help string for command line --show-config flag -#: ../src/lightdm.c:1190 +#: ../src/lightdm.c:1209 msgid "Show combined configuration" msgstr "" #. Help string for command line --version flag -#: ../src/lightdm.c:1193 +#: ../src/lightdm.c:1212 msgid "Show release version" msgstr "" #. Arguments and description for --help test -#: ../src/lightdm.c:1212 +#: ../src/lightdm.c:1231 msgid "- Display Manager" msgstr "" #. Text printed out when an unknown command-line argument provided -#: ../src/lightdm.c:1222 +#: ../src/lightdm.c:1241 #, c-format msgid "Run '%s --help' to see a full list of available command line options." msgstr "" diff -Nru lightdm-1.18.1/src/display-server.c lightdm-1.18.3/src/display-server.c --- lightdm-1.18.1/src/display-server.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/display-server.c 2016-06-21 00:39:46.000000000 +0000 @@ -25,6 +25,9 @@ /* Unique name for this display server */ gchar *name; + /* TRUE when started */ + gboolean is_ready; + /* TRUE when being stopped */ gboolean stopping; @@ -59,6 +62,18 @@ return DISPLAY_SERVER_GET_CLASS (server)->get_session_type (server); } +DisplayServer * +display_server_get_parent (DisplayServer *server) +{ + return DISPLAY_SERVER_GET_CLASS (server)->get_parent (server); +} + +static DisplayServer * +display_server_real_get_parent (DisplayServer *server) +{ + return NULL; +} + gboolean display_server_get_can_share (DisplayServer *server) { @@ -91,9 +106,17 @@ return DISPLAY_SERVER_GET_CLASS (server)->start (server); } +gboolean +display_server_get_is_ready (DisplayServer *server) +{ + g_return_val_if_fail (server != NULL, FALSE); + return server->priv->is_ready; +} + static gboolean display_server_real_start (DisplayServer *server) { + server->priv->is_ready = TRUE; g_signal_emit (server, signals[READY], 0); return TRUE; } @@ -166,6 +189,7 @@ { GObjectClass *object_class = G_OBJECT_CLASS (klass); + klass->get_parent = display_server_real_get_parent; klass->get_can_share = display_server_real_get_can_share; klass->get_vt = display_server_real_get_vt; klass->start = display_server_real_start; diff -Nru lightdm-1.18.1/src/display-server.h lightdm-1.18.3/src/display-server.h --- lightdm-1.18.1/src/display-server.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/display-server.h 2016-06-21 00:39:46.000000000 +0000 @@ -44,6 +44,7 @@ void (*ready)(DisplayServer *server); void (*stopped)(DisplayServer *server); + DisplayServer *(*get_parent)(DisplayServer *server); const gchar *(*get_session_type)(DisplayServer *server); gboolean (*get_can_share)(DisplayServer *server); gint (*get_vt)(DisplayServer *server); @@ -61,12 +62,16 @@ const gchar *display_server_get_session_type (DisplayServer *server); +DisplayServer *display_server_get_parent (DisplayServer *server); + gboolean display_server_get_can_share (DisplayServer *server); gint display_server_get_vt (DisplayServer *server); gboolean display_server_start (DisplayServer *server); +gboolean display_server_get_is_ready (DisplayServer *server); + void display_server_connect_session (DisplayServer *server, Session *session); void display_server_disconnect_session (DisplayServer *server, Session *session); diff -Nru lightdm-1.18.1/src/greeter.c lightdm-1.18.3/src/greeter.c --- lightdm-1.18.1/src/greeter.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/greeter.c 2016-08-11 23:29:22.000000000 +0000 @@ -1,6 +1,5 @@ /* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell + * Copyright (C) 2010-2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software @@ -13,8 +12,6 @@ #include #include -#include -#include #include #include "greeter.h" @@ -28,6 +25,7 @@ enum { CONNECTED, + DISCONNECTED, CREATE_SESSION, START_SESSION, LAST_SIGNAL @@ -83,7 +81,7 @@ guint from_greeter_watch; }; -G_DEFINE_TYPE (Greeter, greeter, SESSION_TYPE); +G_DEFINE_TYPE (Greeter, greeter, G_TYPE_OBJECT); /* Messages from the greeter to the server */ typedef enum @@ -120,8 +118,42 @@ } void +greeter_set_file_descriptors (Greeter *greeter, int to_greeter_fd, int from_greeter_fd) +{ + GError *error = NULL; + + g_return_if_fail (greeter != NULL); + g_return_if_fail (greeter->priv->to_greeter_input < 0); + g_return_if_fail (greeter->priv->from_greeter_output < 0); + + greeter->priv->to_greeter_input = to_greeter_fd; + greeter->priv->to_greeter_channel = g_io_channel_unix_new (greeter->priv->to_greeter_input); + g_io_channel_set_encoding (greeter->priv->to_greeter_channel, NULL, &error); + if (error) + g_warning ("Failed to set encoding on to greeter channel to binary: %s\n", error->message); + g_clear_error (&error); + greeter->priv->from_greeter_output = from_greeter_fd; + greeter->priv->from_greeter_channel = g_io_channel_unix_new (greeter->priv->from_greeter_output); + g_io_channel_set_encoding (greeter->priv->from_greeter_channel, NULL, &error); + if (error) + g_warning ("Failed to set encoding on from greeter channel to binary: %s\n", error->message); + g_clear_error (&error); + g_io_channel_set_buffered (greeter->priv->from_greeter_channel, FALSE); + greeter->priv->from_greeter_watch = g_io_add_watch (greeter->priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); +} + +void +greeter_stop (Greeter *greeter) +{ + /* Stop any events occurring after we've stopped */ + if (greeter->priv->authentication_session) + g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); +} + +void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service) { + g_return_if_fail (greeter != NULL); g_free (greeter->priv->pam_service); greeter->priv->pam_service = g_strdup (pam_service); g_free (greeter->priv->autologin_pam_service); @@ -131,18 +163,21 @@ void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest) { + g_return_if_fail (greeter != NULL); greeter->priv->allow_guest = allow_guest; } void greeter_clear_hints (Greeter *greeter) { + g_return_if_fail (greeter != NULL); g_hash_table_remove_all (greeter->priv->hints); } void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value) { + g_return_if_fail (greeter != NULL); g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value)); } @@ -198,7 +233,7 @@ status = g_io_channel_write_chars (greeter->priv->to_greeter_channel, data, data_length, &n_written, &error); if (error) - l_warning (greeter, "Error writing to greeter: %s", error->message); + g_warning ("Error writing to greeter: %s", error->message); g_clear_error (&error); if (status != G_IO_STATUS_NORMAL) return; @@ -208,7 +243,7 @@ g_io_channel_flush (greeter->priv->to_greeter_channel, &error); if (error) - l_warning (greeter, "Failed to flush data to greeter: %s", error->message); + g_warning ("Failed to flush data to greeter: %s", error->message); g_clear_error (&error); } @@ -268,7 +303,7 @@ GHashTableIter iter; gpointer key, value; - l_debug (greeter, "Greeter connected version=%s resettable=%s", version, resettable ? "true" : "false"); + g_debug ("Greeter connected version=%s resettable=%s", version, resettable ? "true" : "false"); greeter->priv->resettable = resettable; @@ -305,7 +340,7 @@ messages_length = session_get_messages_length (session); /* Respond to d-bus query with messages */ - l_debug (greeter, "Prompt greeter with %d message(s)", messages_length); + g_debug ("Prompt greeter with %d message(s)", messages_length); size = int_length () + string_length (session_get_username (session)) + int_length (); for (i = 0; i < messages_length; i++) size += int_length () + string_length (messages[i].msg); @@ -367,6 +402,8 @@ GHashTableIter iter; gpointer key, value; + g_return_if_fail (greeter != NULL); + g_hash_table_iter_init (&iter, greeter->priv->hints); while (g_hash_table_iter_next (&iter, &key, &value)) length += string_length (key) + string_length (value); @@ -386,16 +423,16 @@ { int result; - l_debug (greeter, "Authenticate result for user %s: %s", session_get_username (session), session_get_authentication_result_string (session)); + g_debug ("Authenticate result for user %s: %s", session_get_username (session), session_get_authentication_result_string (session)); result = session_get_authentication_result (session); if (session_get_is_authenticated (session)) { if (session_get_user (session)) - l_debug (greeter, "User %s authorized", session_get_username (session)); + g_debug ("User %s authorized", session_get_username (session)); else { - l_debug (greeter, "User %s authorized, but no account of that name exists", session_get_username (session)); + g_debug ("User %s authorized, but no account of that name exists", session_get_username (session)); result = PAM_USER_UNKNOWN; } } @@ -426,11 +463,11 @@ if (username[0] == '\0') { - l_debug (greeter, "Greeter start authentication"); + g_debug ("Greeter start authentication"); username = NULL; } else - l_debug (greeter, "Greeter start authentication for %s", username); + g_debug ("Greeter start authentication for %s", username); reset_session (greeter); @@ -474,13 +511,13 @@ static void handle_login_as_guest (Greeter *greeter, guint32 sequence_number) { - l_debug (greeter, "Greeter start authentication for guest account"); + g_debug ("Greeter start authentication for guest account"); reset_session (greeter); if (!greeter->priv->allow_guest) { - l_debug (greeter, "Guest account is disabled"); + g_debug ("Guest account is disabled"); send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN); return; } @@ -531,11 +568,11 @@ if (username[0] == '\0') { - l_debug (greeter, "Greeter start authentication for remote session %s", session_name); + g_debug ("Greeter start authentication for remote session %s", session_name); username = NULL; } else - l_debug (greeter, "Greeter start authentication for remote session %s as user %s", session_name, username); + g_debug ("Greeter start authentication for remote session %s as user %s", session_name, username); reset_session (greeter); @@ -600,7 +637,7 @@ return; } - l_debug (greeter, "Continue authentication"); + g_debug ("Continue authentication"); /* Build response */ response = calloc (messages_length, sizeof (struct pam_response)); @@ -630,7 +667,7 @@ if (greeter->priv->authentication_session == NULL) return; - l_debug (greeter, "Cancel authentication"); + g_debug ("Cancel authentication"); reset_session (greeter); } @@ -655,15 +692,15 @@ if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session)) { if (session) - l_debug (greeter, "Greeter requests session %s", session); + g_debug ("Greeter requests session %s", session); else - l_debug (greeter, "Greeter requests default session"); + g_debug ("Greeter requests default session"); greeter->priv->start_session = TRUE; g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result); } else { - l_debug (greeter, "Ignoring start session request, user is not authorized"); + g_debug ("Ignoring start session request, user is not authorized"); result = FALSE; } @@ -679,18 +716,18 @@ if (!greeter->priv->guest_account_authenticated && !session_get_is_authenticated (greeter->priv->authentication_session)) { - l_debug (greeter, "Ignoring set language request, user is not authorized"); + g_debug ("Ignoring set language request, user is not authorized"); return; } // FIXME: Could use this if (greeter->priv->guest_account_authenticated) { - l_debug (greeter, "Ignoring set language request for guest user"); + g_debug ("Ignoring set language request for guest user"); return; } - l_debug (greeter, "Greeter sets language %s", language); + g_debug ("Greeter sets language %s", language); user = session_get_user (greeter->priv->authentication_session); user_set_language (user, language); } @@ -702,7 +739,7 @@ guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; - l_debug (greeter, "Greeter requests data directory for user %s", username); + g_debug ("Greeter requests data directory for user %s", username); dir = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); @@ -720,7 +757,7 @@ guint8 *buffer; if (greeter->priv->n_read - *offset < sizeof (guint32)) { - l_warning (greeter, "Not enough space for int, need %zu, got %zu", sizeof (guint32), greeter->priv->n_read - *offset); + g_warning ("Not enough space for int, need %zu, got %zu", sizeof (guint32), greeter->priv->n_read - *offset); return 0; } buffer = greeter->priv->read_buffer + *offset; @@ -740,7 +777,7 @@ if (HEADER_SIZE + payload_length < HEADER_SIZE) { - l_warning (greeter, "Payload length of %u octets too long", payload_length); + g_warning ("Payload length of %u octets too long", payload_length); return HEADER_SIZE; } @@ -756,7 +793,7 @@ length = read_int (greeter, offset); if (greeter->priv->n_read - *offset < length) { - l_warning (greeter, "Not enough space for string, need %u, got %zu", length, greeter->priv->n_read - *offset); + g_warning ("Not enough space for string, need %u, got %zu", length, greeter->priv->n_read - *offset); return g_strdup (""); } @@ -798,8 +835,9 @@ if (condition == G_IO_HUP) { - l_debug (greeter, "Greeter closed communication channel"); + g_debug ("Greeter closed communication channel"); greeter->priv->from_greeter_watch = 0; + g_signal_emit (greeter, signals[DISCONNECTED], 0); return FALSE; } @@ -820,9 +858,16 @@ &n_read, &error); if (error) - l_warning (greeter, "Error reading from greeter: %s", error->message); + g_warning ("Error reading from greeter: %s", error->message); g_clear_error (&error); - if (status != G_IO_STATUS_NORMAL) + if (status == G_IO_STATUS_EOF) + { + g_debug ("Greeter closed communication channel"); + greeter->priv->from_greeter_watch = 0; + g_signal_emit (greeter, signals[DISCONNECTED], 0); + return FALSE; + } + else if (status != G_IO_STATUS_NORMAL) return TRUE; greeter->priv->n_read += n_read; @@ -874,7 +919,7 @@ max_secrets = (G_MAXUINT32 - 1) / sizeof (gchar *); if (n_secrets > max_secrets) { - l_warning (greeter, "Array length of %u elements too long", n_secrets); + g_warning ("Array length of %u elements too long", n_secrets); greeter->priv->from_greeter_watch = 0; return FALSE; } @@ -906,7 +951,7 @@ g_free (username); break; default: - l_warning (greeter, "Unknown message from greeter: %d", id); + g_warning ("Unknown message from greeter: %d", id); break; } @@ -923,10 +968,18 @@ } Session * -greeter_get_authentication_session (Greeter *greeter) +greeter_take_authentication_session (Greeter *greeter) { + Session *session; + g_return_val_if_fail (greeter != NULL, NULL); - return greeter->priv->authentication_session; + + session = greeter->priv->authentication_session; + if (greeter->priv->authentication_session) + g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); + greeter->priv->authentication_session = NULL; + + return session; } gboolean @@ -950,60 +1003,6 @@ return greeter->priv->active_username; } -static gboolean -greeter_start (Session *session) -{ - Greeter *greeter = GREETER (session); - int to_greeter_pipe[2], from_greeter_pipe[2]; - int to_greeter_output, from_greeter_input; - gboolean result = FALSE; - gchar *value; - GError *error = NULL; - - /* Create a pipe to talk with the greeter */ - if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0) - { - g_warning ("Failed to create pipes: %s", strerror (errno)); - return FALSE; - } - to_greeter_output = to_greeter_pipe[0]; - greeter->priv->to_greeter_input = to_greeter_pipe[1]; - greeter->priv->to_greeter_channel = g_io_channel_unix_new (greeter->priv->to_greeter_input); - g_io_channel_set_encoding (greeter->priv->to_greeter_channel, NULL, &error); - if (error) - g_warning ("Failed to set encoding on to greeter channel to binary: %s\n", error->message); - g_clear_error (&error); - greeter->priv->from_greeter_output = from_greeter_pipe[0]; - from_greeter_input = from_greeter_pipe[1]; - greeter->priv->from_greeter_channel = g_io_channel_unix_new (greeter->priv->from_greeter_output); - g_io_channel_set_encoding (greeter->priv->from_greeter_channel, NULL, &error); - if (error) - g_warning ("Failed to set encoding on from greeter channel to binary: %s\n", error->message); - g_clear_error (&error); - g_io_channel_set_buffered (greeter->priv->from_greeter_channel, FALSE); - greeter->priv->from_greeter_watch = g_io_add_watch (greeter->priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); - - /* Let the greeter session know how to communicate with the daemon */ - value = g_strdup_printf ("%d", from_greeter_input); - session_set_env (SESSION (greeter), "LIGHTDM_TO_SERVER_FD", value); - g_free (value); - value = g_strdup_printf ("%d", to_greeter_output); - session_set_env (SESSION (greeter), "LIGHTDM_FROM_SERVER_FD", value); - g_free (value); - - /* Don't allow the daemon end of the pipes to be accessed in child processes */ - fcntl (greeter->priv->to_greeter_input, F_SETFD, FD_CLOEXEC); - fcntl (greeter->priv->from_greeter_output, F_SETFD, FD_CLOEXEC); - - result = SESSION_CLASS (greeter_parent_class)->start (session); - - /* Close the session ends of the pipe */ - close (to_greeter_output); - close (from_greeter_input); - - return result; -} - static Session * greeter_real_create_session (Greeter *greeter) { @@ -1017,18 +1016,6 @@ } static void -greeter_stop (Session *session) -{ - Greeter *greeter = GREETER (session); - - /* Stop any events occurring after we've stopped */ - if (greeter->priv->authentication_session) - g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); - - SESSION_CLASS (greeter_parent_class)->stop (session); -} - -static void greeter_init (Greeter *greeter) { greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, GREETER_TYPE, GreeterPrivate); @@ -1097,13 +1084,10 @@ static void greeter_class_init (GreeterClass *klass) { - SessionClass *session_class = SESSION_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); klass->create_session = greeter_real_create_session; klass->start_session = greeter_real_start_session; - session_class->start = greeter_start; - session_class->stop = greeter_stop; object_class->finalize = greeter_finalize; object_class->get_property = greeter_get_property; object_class->set_property = greeter_set_property; @@ -1116,6 +1100,15 @@ NULL, NULL, NULL, G_TYPE_NONE, 0); + + signals[DISCONNECTED] = + g_signal_new (GREETER_SIGNAL_DISCONNECTED, + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GreeterClass, disconnected), + NULL, NULL, + NULL, + G_TYPE_NONE, 0); signals[CREATE_SESSION] = g_signal_new (GREETER_SIGNAL_CREATE_SESSION, diff -Nru lightdm-1.18.1/src/greeter.h lightdm-1.18.3/src/greeter.h --- lightdm-1.18.1/src/greeter.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/greeter.h 2016-08-11 23:29:22.000000000 +0000 @@ -1,6 +1,5 @@ /* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell + * Copyright (C) 2010-2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software @@ -12,6 +11,8 @@ #ifndef GREETER_H_ #define GREETER_H_ +typedef struct Greeter Greeter; + #include "session.h" G_BEGIN_DECLS @@ -23,6 +24,7 @@ #define IS_GREETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_TYPE)) #define GREETER_SIGNAL_CONNECTED "connected" +#define GREETER_SIGNAL_DISCONNECTED "disconnected" #define GREETER_SIGNAL_CREATE_SESSION "create-session" #define GREETER_SIGNAL_START_SESSION "start-session" @@ -32,16 +34,17 @@ typedef struct GreeterPrivate GreeterPrivate; -typedef struct +struct Greeter { - Session parent_instance; + GObject parent_instance; GreeterPrivate *priv; -} Greeter; +}; typedef struct { - SessionClass parent_class; + GObjectClass parent_class; void (*connected)(Greeter *greeter); + void (*disconnected)(Greeter *greeter); Session *(*create_session)(Greeter *greeter); gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session); } GreeterClass; @@ -50,6 +53,10 @@ Greeter *greeter_new (void); +void greeter_set_file_descriptors (Greeter *greeter, int to_greeter_fd, int from_greeter_fd); + +void greeter_stop (Greeter *greeter); + void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service); void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest); @@ -64,7 +71,7 @@ gboolean greeter_get_guest_authenticated (Greeter *greeter); -Session *greeter_get_authentication_session (Greeter *greeter); +Session *greeter_take_authentication_session (Greeter *greeter); gboolean greeter_get_start_session (Greeter *greeter); diff -Nru lightdm-1.18.1/src/greeter-session.c lightdm-1.18.3/src/greeter-session.c --- lightdm-1.18.1/src/greeter-session.c 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/src/greeter-session.c 2016-06-29 03:15:58.000000000 +0000 @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#include + +#include +#include +#include + +#include "greeter-session.h" + +struct GreeterSessionPrivate +{ + /* Greeter running inside this session */ + Greeter *greeter; +}; + +G_DEFINE_TYPE (GreeterSession, greeter_session, SESSION_TYPE); + +GreeterSession * +greeter_session_new (void) +{ + return g_object_new (GREETER_SESSION_TYPE, NULL); +} + +Greeter * +greeter_session_get_greeter (GreeterSession *session) +{ + g_return_val_if_fail (session != NULL, NULL); + return session->priv->greeter; +} + +static gboolean +greeter_session_start (Session *session) +{ + GreeterSession *s = GREETER_SESSION (session); + int to_greeter_pipe[2], from_greeter_pipe[2]; + int to_greeter_input, to_greeter_output, from_greeter_input, from_greeter_output; + gchar *value; + gboolean result; + + /* Create a pipe to talk with the greeter */ + if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0) + { + g_warning ("Failed to create pipes: %s", strerror (errno)); + return FALSE; + } + + to_greeter_input = to_greeter_pipe[1]; + to_greeter_output = to_greeter_pipe[0]; + from_greeter_input = from_greeter_pipe[1]; + from_greeter_output = from_greeter_pipe[0]; + greeter_set_file_descriptors (s->priv->greeter, to_greeter_input, from_greeter_output); + + /* Don't allow the daemon end of the pipes to be accessed in child processes */ + fcntl (to_greeter_input, F_SETFD, FD_CLOEXEC); + fcntl (from_greeter_output, F_SETFD, FD_CLOEXEC); + + /* Let the greeter session know how to communicate with the daemon */ + value = g_strdup_printf ("%d", from_greeter_input); + session_set_env (session, "LIGHTDM_TO_SERVER_FD", value); + g_free (value); + value = g_strdup_printf ("%d", to_greeter_output); + session_set_env (session, "LIGHTDM_FROM_SERVER_FD", value); + g_free (value); + + result = SESSION_CLASS (greeter_session_parent_class)->start (session); + + /* Close the session ends of the pipe */ + close (from_greeter_input); + close (to_greeter_output); + + return result; +} + +static void +greeter_session_stop (Session *session) +{ + GreeterSession *s = GREETER_SESSION (session); + + greeter_stop (s->priv->greeter); + + SESSION_CLASS (greeter_session_parent_class)->stop (session); +} + +static void +greeter_session_init (GreeterSession *session) +{ + session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, GREETER_SESSION_TYPE, GreeterSessionPrivate); + session->priv->greeter = greeter_new (); +} + +static void +greeter_session_finalize (GObject *object) +{ + GreeterSession *self = GREETER_SESSION (object); + + g_clear_object (&self->priv->greeter); + + G_OBJECT_CLASS (greeter_session_parent_class)->finalize (object); +} + +static void +greeter_session_class_init (GreeterSessionClass *klass) +{ + SessionClass *session_class = SESSION_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + session_class->start = greeter_session_start; + session_class->stop = greeter_session_stop; + object_class->finalize = greeter_session_finalize; + + g_type_class_add_private (klass, sizeof (GreeterSessionPrivate)); +} diff -Nru lightdm-1.18.1/src/greeter-session.h lightdm-1.18.3/src/greeter-session.h --- lightdm-1.18.1/src/greeter-session.h 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/src/greeter-session.h 2016-06-21 00:29:07.000000000 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#ifndef GREETER_SESSION_H_ +#define GREETER_SESSION_H_ + +#include "session.h" +#include "greeter.h" + +G_BEGIN_DECLS + +#define GREETER_SESSION_TYPE (greeter_session_get_type()) +#define GREETER_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GREETER_SESSION_TYPE, GreeterSession)) +#define GREETER_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GREETER_SESSION_TYPE, GreeterSessionClass)) +#define GREETER_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GREETER_SESSION_TYPE, GreeterSessionClass)) +#define IS_GREETER_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_SESSION_TYPE)) + +typedef struct GreeterSessionPrivate GreeterSessionPrivate; + +typedef struct +{ + Session parent_instance; + GreeterSessionPrivate *priv; +} GreeterSession; + +typedef struct +{ + SessionClass parent_class; +} GreeterSessionClass; + +GType greeter_session_get_type (void); + +GreeterSession *greeter_session_new (void); + +Greeter *greeter_session_get_greeter (GreeterSession *session); + +G_END_DECLS + +#endif /* GREETER_SESSION_H_ */ diff -Nru lightdm-1.18.1/src/greeter-socket.c lightdm-1.18.3/src/greeter-socket.c --- lightdm-1.18.1/src/greeter-socket.c 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/src/greeter-socket.c 2016-07-29 03:51:27.000000000 +0000 @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2010-2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#include + +#include +#include +#include +#include + +#include "greeter-socket.h" + +enum { + CREATE_GREETER, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +struct GreeterSocketPrivate +{ + /* Path of socket to use */ + gchar *path; + + /* Listening UNIX socket */ + GSocket *socket; + + /* Source for listening for connections */ + GSource *source; + + /* Socket to greeter */ + GSocket *greeter_socket; + + /* Greeter connected on this socket */ + Greeter *greeter; +}; + +G_DEFINE_TYPE (GreeterSocket, greeter_socket, G_TYPE_OBJECT); + +GreeterSocket * +greeter_socket_new (const gchar *path) +{ + GreeterSocket *socket; + + socket = g_object_new (GREETER_SOCKET_TYPE, NULL); + socket->priv->path = g_strdup (path); + + return socket; +} + +static void +greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket) +{ + if (greeter == socket->priv->greeter) + { + g_clear_object (&socket->priv->greeter); + g_clear_object (&socket->priv->greeter_socket); + } +} + +static gboolean +greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) +{ + GSocket *new_socket; + GError *error = NULL; + + new_socket = g_socket_accept (socket->priv->socket, NULL, &error); + if (error) + g_warning ("Failed to accept greeter connection: %s", error->message); + g_clear_error (&error); + if (!new_socket) + return G_SOURCE_CONTINUE; + + /* Greeter already connected */ + if (socket->priv->greeter) + { + g_socket_close (new_socket, NULL); + g_object_unref (new_socket); + return G_SOURCE_CONTINUE; + } + + socket->priv->greeter_socket = new_socket; + g_signal_emit (socket, signals[CREATE_GREETER], 0, &socket->priv->greeter); + g_signal_connect (socket->priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket); + greeter_set_file_descriptors (socket->priv->greeter, g_socket_get_fd (new_socket), g_socket_get_fd (new_socket)); + + return G_SOURCE_CONTINUE; +} + +gboolean +greeter_socket_start (GreeterSocket *socket, GError **error) +{ + GSocketAddress *address; + gboolean result; + + g_return_val_if_fail (socket != NULL, FALSE); + g_return_val_if_fail (socket->priv->socket == NULL, FALSE); + + socket->priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, error); + if (!socket->priv->socket) + return FALSE; + + unlink (socket->priv->path); + address = g_unix_socket_address_new (socket->priv->path); + result = g_socket_bind (socket->priv->socket, address, FALSE, error); + g_object_unref (address); + if (!result) + return FALSE; + if (!g_socket_listen (socket->priv->socket, error)) + return FALSE; + + socket->priv->source = g_socket_create_source (socket->priv->socket, G_IO_IN, NULL); + g_source_set_callback (socket->priv->source, (GSourceFunc) greeter_connect_cb, socket, NULL); + g_source_attach (socket->priv->source, NULL); + + /* Allow to be written to */ + if (chmod (socket->priv->path, S_IRWXU | S_IRWXG | S_IRWXO) < 0) + { + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + "Failed to set permissions on greeter socket %s: %s", + socket->priv->path, + g_strerror (errno)); + return FALSE; + } + + return TRUE; +} + +static void +greeter_socket_init (GreeterSocket *socket) +{ + socket->priv = G_TYPE_INSTANCE_GET_PRIVATE (socket, GREETER_SOCKET_TYPE, GreeterSocketPrivate); +} + +static void +greeter_socket_finalize (GObject *object) +{ + GreeterSocket *self = GREETER_SOCKET (object); + + if (self->priv->path) + unlink (self->priv->path); + g_free (self->priv->path); + g_clear_object (&self->priv->socket); + g_clear_object (&self->priv->source); + g_clear_object (&self->priv->greeter_socket); + g_clear_object (&self->priv->greeter); + + G_OBJECT_CLASS (greeter_socket_parent_class)->finalize (object); +} + +static void +greeter_socket_class_init (GreeterSocketClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = greeter_socket_finalize; + + signals[CREATE_GREETER] = + g_signal_new (GREETER_SOCKET_SIGNAL_CREATE_GREETER, + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GreeterSocketClass, create_greeter), + g_signal_accumulator_first_wins, + NULL, + NULL, + GREETER_TYPE, 0); + + g_type_class_add_private (klass, sizeof (GreeterSocketPrivate)); +} diff -Nru lightdm-1.18.1/src/greeter-socket.h lightdm-1.18.3/src/greeter-socket.h --- lightdm-1.18.1/src/greeter-socket.h 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/src/greeter-socket.h 2016-06-29 02:15:32.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2010-2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#ifndef GREETER_SOCKET_H_ +#define GREETER_SOCKET_H_ + +#include + +#include "greeter.h" + +G_BEGIN_DECLS + +#define GREETER_SOCKET_TYPE (greeter_socket_get_type()) +#define GREETER_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GREETER_SOCKET_TYPE, GreeterSocket)) +#define GREETER_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GREETER_SOCKET_TYPE, GreeterSocketClass)) +#define GREETER_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GREETER_SOCKET_TYPE, GreeterSocketClass)) +#define IS_GREETER_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_SOCKET_TYPE)) + +#define GREETER_SOCKET_SIGNAL_CREATE_GREETER "create-greeter" + +typedef struct GreeterSocketPrivate GreeterSocketPrivate; + +typedef struct +{ + GObject parent_instance; + GreeterSocketPrivate *priv; +} GreeterSocket; + +typedef struct +{ + GObjectClass parent_class; + Greeter *(*create_greeter)(GreeterSocket *socket); +} GreeterSocketClass; + +GType greeter_socket_get_type (void); + +GreeterSocket *greeter_socket_new (const gchar *path); + +gboolean greeter_socket_start (GreeterSocket *socket, GError **error); + +G_END_DECLS + +#endif /* GREETER_SOCKET_H_ */ diff -Nru lightdm-1.18.1/src/lightdm.c lightdm-1.18.3/src/lightdm.c --- lightdm-1.18.1/src/lightdm.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/lightdm.c 2016-06-21 00:29:07.000000000 +0000 @@ -196,9 +196,19 @@ static void signal_cb (Process *process, int signum) { - g_debug ("Caught %s signal, shutting down", g_strsignal (signum)); - display_manager_stop (display_manager); - // FIXME: Stop XDMCP server + switch (signum) + { + case SIGINT: + case SIGTERM: + g_debug ("Caught %s signal, shutting down", g_strsignal (signum)); + display_manager_stop (display_manager); + // FIXME: Stop XDMCP server + break; + case SIGUSR1: + case SIGUSR2: + case SIGHUP: + break; + } } static void @@ -879,7 +889,7 @@ /* Start the XDMCP server */ if (config_get_boolean (config_get_instance (), "XDMCPServer", "enabled")) { - gchar *key_name, *key = NULL, *listen_address; + gchar *key_name, *key = NULL, *listen_address, *hostname; xdmcp_server = xdmcp_server_new (); if (config_has_key (config_get_instance (), "XDMCPServer", "port")) @@ -892,6 +902,9 @@ listen_address = config_get_string (config_get_instance (), "XDMCPServer", "listen-address"); xdmcp_server_set_listen_address (xdmcp_server, listen_address); g_free (listen_address); + hostname = config_get_string (config_get_instance (), "XDMCPServer", "hostname"); + xdmcp_server_set_hostname (xdmcp_server, hostname); + g_free (hostname); g_signal_connect (xdmcp_server, XDMCP_SERVER_SIGNAL_NEW_SESSION, G_CALLBACK (xdmcp_session_cb), NULL); key_name = config_get_string (config_get_instance (), "XDMCPServer", "key"); @@ -1411,9 +1424,9 @@ if (!config_has_key (config_get_instance (), "Seat:*", "greeter-show-remote-login")) config_set_boolean (config_get_instance (), "Seat:*", "greeter-show-remote-login", TRUE); if (!config_has_key (config_get_instance (), "Seat:*", "greeter-session")) - config_set_string (config_get_instance (), "Seat:*", "greeter-session", GREETER_SESSION); + config_set_string (config_get_instance (), "Seat:*", "greeter-session", DEFAULT_GREETER_SESSION); if (!config_has_key (config_get_instance (), "Seat:*", "user-session")) - config_set_string (config_get_instance (), "Seat:*", "user-session", USER_SESSION); + config_set_string (config_get_instance (), "Seat:*", "user-session", DEFAULT_USER_SESSION); if (!config_has_key (config_get_instance (), "Seat:*", "session-wrapper")) config_set_string (config_get_instance (), "Seat:*", "session-wrapper", "lightdm-session"); if (!config_has_key (config_get_instance (), "LightDM", "log-directory")) @@ -1431,6 +1444,8 @@ config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", REMOTE_SESSIONS_DIR); if (!config_has_key (config_get_instance (), "LightDM", "greeters-directory")) config_set_string (config_get_instance (), "LightDM", "greeters-directory", GREETERS_DIR); + if (!config_has_key (config_get_instance (), "XDMCPServer", "hostname")) + config_set_string (config_get_instance (), "XDMCPServer", "hostname", g_get_host_name ()); /* Override defaults */ if (log_dir) diff -Nru lightdm-1.18.1/src/Makefile.am lightdm-1.18.3/src/Makefile.am --- lightdm-1.18.1/src/Makefile.am 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/Makefile.am 2016-08-11 23:35:23.000000000 +0000 @@ -12,6 +12,10 @@ display-server.h \ greeter.c \ greeter.h \ + greeter-session.c \ + greeter-session.h \ + greeter-socket.c \ + greeter-socket.h \ guest-account.c \ guest-account.h \ lightdm.c \ @@ -21,8 +25,6 @@ login1.h \ log-file.c \ log-file.h \ - mir-server.c \ - mir-server.h \ plymouth.c \ plymouth.h \ process.c \ @@ -61,6 +63,8 @@ x-server-local.h \ x-server-remote.c \ x-server-remote.h \ + x-server-xmir.c \ + x-server-xmir.h \ x-server-xvnc.c \ x-server-xvnc.h \ x-server.c \ diff -Nru lightdm-1.18.1/src/mir-server.c lightdm-1.18.3/src/mir-server.c --- lightdm-1.18.1/src/mir-server.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/mir-server.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell - * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later - * version. See http://www.gnu.org/copyleft/gpl.html the full text of the - * license. - */ - -#include - -#include "mir-server.h" -#include "configuration.h" -#include "vt.h" - -struct MirServerPrivate -{ - /* VT to run on */ - gint vt; - - /* Mir socket for this server to talk to parent */ - gchar *parent_socket; -}; - -G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE); - -MirServer *mir_server_new (void) -{ - return g_object_new (MIR_SERVER_TYPE, NULL); -} - -void -mir_server_set_vt (MirServer *server, gint vt) -{ - g_return_if_fail (server != NULL); - if (server->priv->vt > 0) - vt_unref (server->priv->vt); - server->priv->vt = vt; - if (vt > 0) - vt_ref (vt); -} - -void -mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket) -{ - g_return_if_fail (server != NULL); - g_free (server->priv->parent_socket); - server->priv->parent_socket = g_strdup (parent_socket); -} - -static const gchar * -mir_server_get_session_type (DisplayServer *server) -{ - return "mir"; -} - -static gint -mir_server_get_vt (DisplayServer *server) -{ - return MIR_SERVER (server)->priv->vt; -} - -static void -mir_server_connect_session (DisplayServer *display_server, Session *session) -{ - MirServer *server; - - session_set_env (session, "XDG_SESSION_TYPE", "mir"); - - server = MIR_SERVER (display_server); - if (server->priv->parent_socket) - session_set_env (session, "MIR_SOCKET", server->priv->parent_socket); - if (server->priv->vt > 0) - { - gchar *value = g_strdup_printf ("%d", server->priv->vt); - session_set_env (session, "MIR_SERVER_VT", value); - g_free (value); - } -} - -static void -mir_server_disconnect_session (DisplayServer *display_server, Session *session) -{ - session_unset_env (session, "XDG_SESSION_TYPE"); - session_unset_env (session, "MIR_SOCKET"); - session_unset_env (session, "MIR_SERVER_VT"); -} - -static void -mir_server_init (MirServer *server) -{ - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate); - server->priv->vt = -1; - display_server_set_name (DISPLAY_SERVER (server), "mir"); -} - -static void -mir_server_finalize (GObject *object) -{ - MirServer *self = MIR_SERVER (object); - - if (self->priv->vt > 0) - vt_unref (self->priv->vt); - g_free (self->priv->parent_socket); - - G_OBJECT_CLASS (mir_server_parent_class)->finalize (object); -} - -static void -mir_server_class_init (MirServerClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass); - - display_server_class->get_session_type = mir_server_get_session_type; - display_server_class->get_vt = mir_server_get_vt; - display_server_class->connect_session = mir_server_connect_session; - display_server_class->disconnect_session = mir_server_disconnect_session; - object_class->finalize = mir_server_finalize; - - g_type_class_add_private (klass, sizeof (MirServerPrivate)); -} diff -Nru lightdm-1.18.1/src/mir-server.h lightdm-1.18.3/src/mir-server.h --- lightdm-1.18.1/src/mir-server.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/mir-server.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell - * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later - * version. See http://www.gnu.org/copyleft/gpl.html the full text of the - * license. - */ - -#ifndef MIR_SERVER_H_ -#define MIR_SERVER_H_ - -#include -#include "display-server.h" - -G_BEGIN_DECLS - -#define MIR_SERVER_TYPE (mir_server_get_type()) -#define MIR_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIR_SERVER_TYPE, MirServer)) -#define MIR_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MIR_SERVER_TYPE, MirServerClass)) -#define MIR_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MIR_SERVER_TYPE, MirServerClass)) -#define IS_MIR_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIR_SERVER_TYPE)) - -typedef struct MirServerPrivate MirServerPrivate; - -typedef struct -{ - DisplayServer parent_instance; - MirServerPrivate *priv; -} MirServer; - -typedef struct -{ - DisplayServerClass parent_class; -} MirServerClass; - -GType mir_server_get_type (void); - -MirServer *mir_server_new (void); - -void mir_server_set_vt (MirServer *server, gint vt); - -void mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket); - -G_END_DECLS - -#endif /* MIR_SERVER_H_ */ diff -Nru lightdm-1.18.1/src/seat.c lightdm-1.18.3/src/seat.c --- lightdm-1.18.1/src/seat.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/seat.c 2016-08-11 23:35:04.000000000 +0000 @@ -16,7 +16,7 @@ #include "seat.h" #include "configuration.h" #include "guest-account.h" -#include "greeter.h" +#include "greeter-session.h" #include "session-config.h" enum { @@ -67,7 +67,7 @@ gboolean stopped; /* The greeter to be started to replace the current one */ - Greeter *replacement_greeter; + GreeterSession *replacement_greeter; }; static void seat_logger_iface_init (LoggerInterface *iface); @@ -85,7 +85,8 @@ // FIXME: Make a get_display_server() that re-uses display servers if supported static DisplayServer *create_display_server (Seat *seat, Session *session); -static Greeter *create_greeter_session (Seat *seat); +static gboolean start_display_server (Seat *seat, DisplayServer *display_server); +static GreeterSession *create_greeter_session (Seat *seat); static void start_session (Seat *seat, Session *session); void @@ -235,12 +236,12 @@ if (s == session || session_get_is_stopping (s)) continue; - if (IS_GREETER (s)) + if (IS_GREETER_SESSION (s)) { - Greeter *greeter = GREETER (s); + Greeter *greeter = greeter_session_get_greeter (GREETER_SESSION (s)); if (greeter_get_resettable (greeter)) { - if (seat->priv->active_session == SESSION (greeter)) + if (seat->priv->active_session == s) { l_debug (seat, "Idling greeter"); /* Do this in an idle callback, because we might very well @@ -259,7 +260,7 @@ } /* Lock previous sessions */ - if (seat->priv->active_session && session != seat->priv->active_session && !IS_GREETER (seat->priv->active_session)) + if (seat->priv->active_session && session != seat->priv->active_session && !IS_GREETER_SESSION (seat->priv->active_session)) session_lock (seat->priv->active_session); session_activate (session); @@ -466,7 +467,7 @@ continue; /* Stop seat if this is the only display server and it failed to start a greeter */ - if (IS_GREETER (session) && + if (IS_GREETER_SESSION (session) && !session_get_is_started (session) && g_list_length (seat->priv->display_servers) == 0) { @@ -503,7 +504,7 @@ return seat->priv->share_display_server && display_server_get_can_share (display_server); } -static Greeter * +static GreeterSession * find_greeter_session (Seat *seat) { GList *link; @@ -511,14 +512,14 @@ for (link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; - if (!session_get_is_stopping (session) && IS_GREETER (session)) - return GREETER (session); + if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session)) + return GREETER_SESSION (session); } return NULL; } -static Greeter * +static GreeterSession * find_resettable_greeter (Seat *seat) { GList *link; @@ -526,29 +527,30 @@ for (link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; - if (!session_get_is_stopping (session) && IS_GREETER (session) && - greeter_get_resettable (GREETER (session))) - return GREETER (session); + if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session) && + greeter_get_resettable (greeter_session_get_greeter (GREETER_SESSION (session)))) + return GREETER_SESSION (session); } return NULL; } static void -set_greeter_hints (Seat *seat, Greeter *greeter_session) +set_greeter_hints (Seat *seat, Greeter *greeter) { - greeter_clear_hints (greeter_session); - greeter_set_hint (greeter_session, "default-session", seat_get_string_property (seat, "user-session")); - greeter_set_hint (greeter_session, "hide-users", seat_get_boolean_property (seat, "greeter-hide-users") ? "true" : "false"); - greeter_set_hint (greeter_session, "show-manual-login", seat_get_boolean_property (seat, "greeter-show-manual-login") ? "true" : "false"); - greeter_set_hint (greeter_session, "show-remote-login", seat_get_boolean_property (seat, "greeter-show-remote-login") ? "true" : "false"); - greeter_set_hint (greeter_session, "has-guest-account", seat_get_allow_guest (seat) && seat_get_boolean_property (seat, "greeter-allow-guest") ? "true" : "false"); + greeter_clear_hints (greeter); + greeter_set_hint (greeter, "default-session", seat_get_string_property (seat, "user-session")); + greeter_set_hint (greeter, "hide-users", seat_get_boolean_property (seat, "greeter-hide-users") ? "true" : "false"); + greeter_set_hint (greeter, "show-manual-login", seat_get_boolean_property (seat, "greeter-show-manual-login") ? "true" : "false"); + greeter_set_hint (greeter, "show-remote-login", seat_get_boolean_property (seat, "greeter-show-remote-login") ? "true" : "false"); + greeter_set_hint (greeter, "has-guest-account", seat_get_allow_guest (seat) && seat_get_boolean_property (seat, "greeter-allow-guest") ? "true" : "false"); } static void switch_to_greeter_from_failed_session (Seat *seat, Session *session) { - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; gboolean existing = FALSE; /* Switch to greeter if one open */ @@ -556,22 +558,23 @@ if (greeter_session) { l_debug (seat, "Switching to existing greeter"); - set_greeter_hints (seat, greeter_session); + set_greeter_hints (seat, greeter_session_get_greeter (greeter_session)); existing = TRUE; } else { greeter_session = create_greeter_session (seat); } + greeter = greeter_session_get_greeter (greeter_session); if (session_get_is_guest (session)) - greeter_set_hint (greeter_session, "select-guest", "true"); + greeter_set_hint (greeter, "select-guest", "true"); else - greeter_set_hint (greeter_session, "select-user", session_get_username (session)); + greeter_set_hint (greeter, "select-user", session_get_username (session)); if (existing) { - greeter_reset (greeter_session); + greeter_reset (greeter); seat_set_active_session (seat, SESSION (greeter_session)); } else @@ -587,7 +590,7 @@ display_server = create_display_server (seat, session); session_set_display_server (session, display_server); - if (!display_server_start (display_server)) + if (!start_display_server (seat, display_server)) { l_debug (seat, "Failed to start display server for greeter"); seat_stop (seat); @@ -605,13 +608,13 @@ start_session (Seat *seat, Session *session) { /* Use system location for greeter log file */ - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) { gchar *log_dir, *filename, *log_filename; gboolean backup_logs; log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - filename = g_strdup_printf ("%s-greeter.log", display_server_get_name (session_get_display_server (session))); + filename = g_strdup_printf ("%s-greeter.log", seat->priv->name); log_filename = g_build_filename (log_dir, filename, NULL); g_free (log_dir); g_free (filename); @@ -623,7 +626,7 @@ if (session_start (session)) return; - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) { l_debug (seat, "Failed to start greeter"); display_server_stop (session_get_display_server (session)); @@ -639,7 +642,7 @@ { const gchar *script; - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) script = seat_get_string_property (seat, "greeter-setup-script"); else script = seat_get_string_property (seat, "session-setup-script"); @@ -650,7 +653,7 @@ return; } - if (!IS_GREETER (session)) + if (!IS_GREETER_SESSION (session)) { g_signal_emit (seat, signals[RUNNING_USER_SESSION], 0, session); emit_upstart_signal ("desktop-session-start"); @@ -733,7 +736,7 @@ run_session (seat, session); } } - else if (!IS_GREETER (session)) + else if (!IS_GREETER_SESSION (session)) { l_debug (seat, "Switching to greeter due to failed authentication"); switch_to_greeter_from_failed_session (seat, session); @@ -769,7 +772,7 @@ } /* Cleanup */ - if (!IS_GREETER (session)) + if (!IS_GREETER_SESSION (session)) { const gchar *script; script = seat_get_string_property (seat, "session-cleanup-script"); @@ -790,9 +793,9 @@ } /* If there is a pending replacement greeter, start it */ - if (IS_GREETER (session) && seat->priv->replacement_greeter) + if (IS_GREETER_SESSION (session) && seat->priv->replacement_greeter) { - Greeter *replacement_greeter = seat->priv->replacement_greeter; + GreeterSession *replacement_greeter = seat->priv->replacement_greeter; seat->priv->replacement_greeter = NULL; if (session_get_is_authenticated (SESSION (replacement_greeter))) @@ -809,9 +812,9 @@ g_object_unref (replacement_greeter); } /* If this is the greeter session then re-use this display server */ - else if (IS_GREETER (session) && + else if (IS_GREETER_SESSION (session) && can_share_display_server (seat, display_server) && - greeter_get_start_session (GREETER (session))) + greeter_get_start_session (greeter_session_get_greeter (GREETER_SESSION (session)))) { GList *link; @@ -837,8 +840,8 @@ } } /* If this is the greeter and nothing else is running then stop the seat */ - else if (IS_GREETER (session) && - !greeter_get_start_session (GREETER (session)) && + else if (IS_GREETER_SESSION (session) && + !greeter_get_start_session (greeter_session_get_greeter (GREETER_SESSION (session))) && g_list_length (seat->priv->display_servers) == 1 && g_list_nth_data (seat->priv->display_servers, 0) == display_server) { @@ -846,7 +849,7 @@ seat_stop (seat); } /* If we were the active session, switch to a greeter */ - else if (!IS_GREETER (session) && session == seat_get_active_session (seat)) + else if (!IS_GREETER_SESSION (session) && session == seat_get_active_session (seat)) { l_debug (seat, "Active session stopped, starting greeter"); if (!seat_switch_to_greeter (seat)) @@ -857,24 +860,11 @@ } /* Stop the display server if no-longer required */ - if (display_server && !display_server_get_is_stopping (display_server)) + if (display_server && !display_server_get_is_stopping (display_server) && + !SEAT_GET_CLASS (seat)->display_server_is_used (seat, display_server)) { - GList *link; - int n_sessions = 0; - - for (link = seat->priv->sessions; link; link = link->next) - { - Session *s = link->data; - if (s == session) - continue; - if (session_get_display_server (s) == display_server) - n_sessions++; - } - if (n_sessions == 0) - { - l_debug (seat, "Stopping display server, no sessions require it"); - display_server_stop (display_server); - } + l_debug (seat, "Stopping display server, no sessions require it"); + display_server_stop (display_server); } g_signal_emit (seat, signals[SESSION_REMOVED], 0, session); @@ -1139,14 +1129,33 @@ return session; } +// FIXME: This is inefficient and we already know the greeter session when we set the callbacks... +static Session * +get_greeter_session (Seat *seat, Greeter *greeter) +{ + GList *link; + + /* Stop any greeters */ + for (link = seat->priv->sessions; link; link = link->next) + { + Session *session = link->data; + + if (IS_GREETER_SESSION (session) && greeter_session_get_greeter (GREETER_SESSION (session))) + return session; + } + + return NULL; +} + static Session * greeter_create_session_cb (Greeter *greeter, Seat *seat) { - Session *session; + Session *greeter_session, *session; + greeter_session = get_greeter_session (seat, greeter); session = create_session (seat, FALSE); - session_set_config (session, session_get_config (SESSION (greeter))); - session_set_display_server (session, session_get_display_server (SESSION (greeter))); + session_set_config (session, session_get_config (greeter_session)); + session_set_display_server (session, session_get_display_server (greeter_session)); return g_object_ref (session); } @@ -1154,14 +1163,14 @@ static gboolean greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Seat *seat) { - Session *session, *existing_session; + Session *session, *existing_session, *greeter_session; const gchar *username; DisplayServer *display_server; /* Get the session to use */ if (greeter_get_guest_authenticated (greeter)) { - session = create_guest_session (seat, session_name); + session = g_object_ref (create_guest_session (seat, session_name)); if (!session) return FALSE; session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service")); @@ -1174,7 +1183,7 @@ gchar *sessions_dir = NULL; gchar **argv; - session = greeter_get_authentication_session (greeter); + session = greeter_take_authentication_session (greeter); /* Get session command to run */ switch (type) @@ -1218,7 +1227,7 @@ /* Switch to this session when it is ready */ g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (session); + seat->priv->session_to_activate = session; /* Return to existing session if it is open */ username = session_get_username (session); @@ -1233,42 +1242,46 @@ } /* If can re-use the display server, stop the greeter first */ - display_server = session_get_display_server (SESSION (greeter)); - if (!greeter_get_resettable (greeter) && - can_share_display_server (seat, display_server) && - strcmp (display_server_get_session_type (display_server), session_get_session_type (session)) == 0) + greeter_session = get_greeter_session (seat, greeter); + if (greeter_session) { - l_debug (seat, "Stopping greeter; display server will be re-used for user session"); + display_server = session_get_display_server (greeter_session); + if (display_server && + !greeter_get_resettable (greeter) && + can_share_display_server (seat, display_server) && + strcmp (display_server_get_session_type (display_server), session_get_session_type (session)) == 0) + { + l_debug (seat, "Stopping greeter; display server will be re-used for user session"); - /* Run on the same display server after the greeter has stopped */ - session_set_display_server (session, display_server); + /* Run on the same display server after the greeter has stopped */ + session_set_display_server (session, display_server); - /* Stop the greeter */ - session_stop (SESSION (greeter)); + /* Stop the greeter */ + session_stop (greeter_session); - return TRUE; + return TRUE; + } } + /* Otherwise start a new display server for this session */ - else + display_server = create_display_server (seat, session); + session_set_display_server (session, display_server); + if (!start_display_server (seat, display_server)) { - display_server = create_display_server (seat, session); - session_set_display_server (session, display_server); - if (!display_server_start (display_server)) - { - l_debug (seat, "Failed to start display server for new session"); - return FALSE; - } - - return TRUE; + l_debug (seat, "Failed to start display server for new session"); + return FALSE; } + + return TRUE; } -static Greeter * +static GreeterSession * create_greeter_session (Seat *seat) { gchar *sessions_dir, **argv; SessionConfig *session_config; - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; const gchar *greeter_wrapper; const gchar *autologin_username; int autologin_timeout; @@ -1293,9 +1306,10 @@ } greeter_session = SEAT_GET_CLASS (seat)->create_greeter_session (seat); + greeter = greeter_session_get_greeter (greeter_session); session_set_config (SESSION (greeter_session), session_config); seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session)); - g_signal_connect (greeter_session, GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED, G_CALLBACK (greeter_active_username_changed_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED, G_CALLBACK (greeter_active_username_changed_cb), seat); g_signal_connect (greeter_session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (session_authentication_complete_cb), seat); g_signal_connect (greeter_session, SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), seat); @@ -1318,15 +1332,15 @@ session_set_argv (SESSION (greeter_session), argv); g_strfreev (argv); - greeter_set_pam_services (greeter_session, + greeter_set_pam_services (greeter, seat_get_string_property (seat, "pam-service"), seat_get_string_property (seat, "pam-autologin-service")); - g_signal_connect (greeter_session, GREETER_SIGNAL_CREATE_SESSION, G_CALLBACK (greeter_create_session_cb), seat); - g_signal_connect (greeter_session, GREETER_SIGNAL_START_SESSION, G_CALLBACK (greeter_start_session_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_CREATE_SESSION, G_CALLBACK (greeter_create_session_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_START_SESSION, G_CALLBACK (greeter_start_session_cb), seat); /* Set hints to greeter */ - greeter_set_allow_guest (greeter_session, seat_get_allow_guest (seat)); - set_greeter_hints (seat, greeter_session); + greeter_set_allow_guest (greeter, seat_get_allow_guest (seat)); + set_greeter_hints (seat, greeter); /* Configure for automatic login */ autologin_username = seat_get_string_property (seat, "autologin-user"); @@ -1339,12 +1353,12 @@ gchar *value; value = g_strdup_printf ("%d", autologin_timeout); - greeter_set_hint (greeter_session, "autologin-timeout", value); + greeter_set_hint (greeter, "autologin-timeout", value); g_free (value); if (autologin_username) - greeter_set_hint (greeter_session, "autologin-user", autologin_username); + greeter_set_hint (greeter, "autologin-user", autologin_username); if (autologin_guest) - greeter_set_hint (greeter_session, "autologin-guest", "true"); + greeter_set_hint (greeter, "autologin-guest", "true"); } g_object_unref (session_config); @@ -1360,7 +1374,10 @@ for (link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; - if (session_get_display_server (session) == display_server && !session_get_is_stopping (session)) + + if (session_get_display_server (session) == display_server && + !session_get_is_stopping (session) && + !session_get_is_run (session)) return session; } @@ -1417,17 +1434,33 @@ if (!display_server) return NULL; - seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server); - g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat); - g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat); + /* Remember this display server */ + if (!g_list_find (seat->priv->display_servers, display_server)) + { + seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server); + g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat); + g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat); + } return display_server; } +static gboolean +start_display_server (Seat *seat, DisplayServer *display_server) +{ + if (display_server_get_is_ready (display_server)) + { + display_server_ready_cb (display_server, seat); + return TRUE; + } + else + return display_server_start (display_server); +} + gboolean seat_switch_to_greeter (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; DisplayServer *display_server; g_return_val_if_fail (seat != NULL, FALSE); @@ -1454,13 +1487,14 @@ display_server = create_display_server (seat, SESSION (greeter_session)); session_set_display_server (SESSION (greeter_session), display_server); - return display_server_start (display_server); + return start_display_server (seat, display_server); } static void switch_authentication_complete_cb (Session *session, Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; DisplayServer *display_server; gboolean existing = FALSE; @@ -1484,7 +1518,7 @@ seat->priv->session_to_activate = g_object_ref (session); display_server = create_display_server (seat, session); session_set_display_server (session, display_server); - display_server_start (display_server); + start_display_server (seat, display_server); } return; @@ -1497,7 +1531,7 @@ if (greeter_session) { l_debug (seat, "Switching to existing greeter to authenticate session"); - set_greeter_hints (seat, greeter_session); + set_greeter_hints (seat, greeter_session_get_greeter (greeter_session)); existing = TRUE; } else @@ -1505,15 +1539,16 @@ l_debug (seat, "Starting greeter to authenticate session"); greeter_session = create_greeter_session (seat); } + greeter = greeter_session_get_greeter (greeter_session); if (session_get_is_guest (session)) - greeter_set_hint (greeter_session, "select-guest", "true"); + greeter_set_hint (greeter, "select-guest", "true"); else - greeter_set_hint (greeter_session, "select-user", session_get_username (session)); + greeter_set_hint (greeter, "select-user", session_get_username (session)); if (existing) { - greeter_reset (greeter_session); + greeter_reset (greeter); seat_set_active_session (seat, SESSION (greeter_session)); } else @@ -1523,7 +1558,7 @@ display_server = create_display_server (seat, SESSION (greeter_session)); session_set_display_server (SESSION (greeter_session), display_server); - display_server_start (display_server); + start_display_server (seat, display_server); } } @@ -1599,13 +1634,14 @@ session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service")); session_set_display_server (session, display_server); - return display_server_start (display_server); + return start_display_server (seat, display_server); } gboolean seat_lock (Seat *seat, const gchar *username) { - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; DisplayServer *display_server = NULL; gboolean reset_existing = FALSE; gboolean reuse_xserver = FALSE; @@ -1624,7 +1660,7 @@ if (greeter_session) { l_debug (seat, "Switching to existing greeter"); - set_greeter_hints (seat, greeter_session); + set_greeter_hints (seat, greeter_session_get_greeter (greeter_session)); reset_existing = TRUE; } else @@ -1646,14 +1682,15 @@ if (!greeter_session) return FALSE; } + greeter = greeter_session_get_greeter (greeter_session); - greeter_set_hint (greeter_session, "lock-screen", "true"); + greeter_set_hint (greeter, "lock-screen", "true"); if (username) - greeter_set_hint (greeter_session, "select-user", username); + greeter_set_hint (greeter, "select-user", username); if (reset_existing) { - greeter_reset (greeter_session); + greeter_reset (greeter); seat_set_active_session (seat, SESSION (greeter_session)); return TRUE; } @@ -1673,7 +1710,7 @@ return TRUE; } else - return display_server_start (display_server); + return start_display_server (seat, display_server); } } @@ -1746,7 +1783,7 @@ display_server = create_display_server (seat, session); session_set_display_server (session, display_server); - if (!display_server || !display_server_start (display_server)) + if (!display_server || !start_display_server (seat, display_server)) { l_debug (seat, "Can't create display server for automatic login"); session_stop (session); @@ -1760,7 +1797,7 @@ /* Fallback to a greeter */ if (!session) { - Greeter *greeter_session; + GreeterSession *greeter_session; DisplayServer *display_server; greeter_session = create_greeter_session (seat); @@ -1776,7 +1813,7 @@ display_server = create_display_server (seat, session); session_set_display_server (session, display_server); - if (!display_server || !display_server_start (display_server)) + if (!display_server || !start_display_server (seat, display_server)) { l_debug (seat, "Can't create display server for greeter"); session_stop (session); @@ -1800,23 +1837,78 @@ background_display_server = create_display_server (seat, background_session); session_set_display_server (background_session, background_display_server); - if (!display_server_start (background_display_server)) + if (!start_display_server (seat, background_display_server)) l_warning (seat, "Failed to start display server for background session"); } return TRUE; } -static Greeter * +static DisplayServer * +seat_real_create_display_server (Seat *seat, Session *session) +{ + return NULL; +} + +static gboolean +seat_real_display_server_is_used (Seat *seat, DisplayServer *display_server) +{ + GList *link; + + for (link = seat->priv->sessions; link; link = link->next) + { + Session *session = link->data; + DisplayServer *d; + + d = session_get_display_server (session); + if (d == display_server || display_server_get_parent (d) == display_server) + return TRUE; + } + + return FALSE; +} + +static GreeterSession * seat_real_create_greeter_session (Seat *seat) { - return greeter_new (); + return greeter_session_new (); +} + +static Session * +create_session_cb (Greeter *greeter, Seat *seat) +{ + return g_object_ref (create_session (seat, FALSE)); +} + +static Greeter * +create_greeter_cb (Session *session, Seat *seat) +{ + Greeter *greeter; + + greeter = greeter_new (); + + greeter_set_pam_services (greeter, + seat_get_string_property (seat, "pam-service"), + seat_get_string_property (seat, "pam-autologin-service")); + g_signal_connect (greeter, GREETER_SIGNAL_CREATE_SESSION, G_CALLBACK (create_session_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_START_SESSION, G_CALLBACK (greeter_start_session_cb), seat); + + /* Set hints to greeter */ + greeter_set_allow_guest (greeter, seat_get_allow_guest (seat)); + set_greeter_hints (seat, greeter); + + return greeter; } static Session * seat_real_create_session (Seat *seat) { - return session_new (); + Session *session; + + session = session_new (); + g_signal_connect (session, SESSION_SIGNAL_CREATE_GREETER, G_CALLBACK (create_greeter_cb), seat); + + return session; } static void @@ -1917,6 +2009,8 @@ klass->setup = seat_real_setup; klass->start = seat_real_start; + klass->create_display_server = seat_real_create_display_server; + klass->display_server_is_used = seat_real_display_server_is_used; klass->create_greeter_session = seat_real_create_greeter_session; klass->create_session = seat_real_create_session; klass->set_active_session = seat_real_set_active_session; diff -Nru lightdm-1.18.1/src/seat.h lightdm-1.18.3/src/seat.h --- lightdm-1.18.1/src/seat.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/seat.h 2016-06-21 00:39:46.000000000 +0000 @@ -14,7 +14,7 @@ #include #include "display-server.h" -#include "greeter.h" +#include "greeter-session.h" #include "session.h" #include "process.h" #include "logger.h" @@ -46,8 +46,8 @@ void (*setup)(Seat *seat); gboolean (*start)(Seat *seat); DisplayServer *(*create_display_server) (Seat *seat, Session *session); - gboolean (*display_server_supports_session_type) (Seat *seat, DisplayServer *display_server, const gchar *session_type); - Greeter *(*create_greeter_session) (Seat *seat); + gboolean (*display_server_is_used) (Seat *seat, DisplayServer *display_server); + GreeterSession *(*create_greeter_session) (Seat *seat); Session *(*create_session) (Seat *seat); void (*set_active_session)(Seat *seat, Session *session); void (*set_next_session)(Seat *seat, Session *session); diff -Nru lightdm-1.18.1/src/seat-unity.c lightdm-1.18.3/src/seat-unity.c --- lightdm-1.18.1/src/seat-unity.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/seat-unity.c 2016-06-21 00:39:46.000000000 +0000 @@ -17,8 +17,7 @@ #include "seat-unity.h" #include "configuration.h" #include "unity-system-compositor.h" -#include "x-server-local.h" -#include "mir-server.h" +#include "x-server-xmir.h" #include "vt.h" #include "plymouth.h" @@ -28,12 +27,10 @@ UnitySystemCompositor *compositor; /* X server being used for XDMCP */ - XServerLocal *xdmcp_x_server; + XServerXmir *xdmcp_x_server; - /* Next Mir ID to use for a Mir sessions, X server and greeters */ - gint next_session_id; + /* Next Mir ID to use for a Xmir servers */ gint next_x_server_id; - gint next_greeter_id; /* The currently visible session */ Session *active_session; @@ -42,7 +39,7 @@ G_DEFINE_TYPE (SeatUnity, seat_unity, SEAT_TYPE); -static XServerLocal *create_x_server (Seat *seat); +static XServerXmir *create_x_server (Seat *seat); static void seat_unity_setup (Seat *seat) @@ -89,10 +86,10 @@ gint port = 0; seat->priv->xdmcp_x_server = create_x_server (SEAT (seat)); - x_server_local_set_xdmcp_server (seat->priv->xdmcp_x_server, xdmcp_manager); + x_server_local_set_xdmcp_server (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), xdmcp_manager); port = seat_get_integer_property (SEAT (seat), "xdmcp-port"); if (port > 0) - x_server_local_set_xdmcp_port (seat->priv->xdmcp_x_server, port); + x_server_local_set_xdmcp_port (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), port); key_name = seat_get_string_property (SEAT (seat), "xdmcp-key"); if (key_name) { @@ -119,7 +116,7 @@ l_debug (seat, "Key %s not defined", key_name); if (key) - x_server_local_set_xdmcp_key (seat->priv->xdmcp_x_server, key); + x_server_local_set_xdmcp_key (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), key); g_free (key); } @@ -190,58 +187,55 @@ return display_server_start (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); } -static XServerLocal * +static XServerXmir * create_x_server (Seat *seat) { - XServerLocal *x_server; + XServerXmir *x_server; + gchar *number; + XAuthority *cookie; const gchar *command = NULL, *layout = NULL, *config_file = NULL; gboolean allow_tcp; gchar *id; l_debug (seat, "Starting X server on Unity compositor"); - x_server = x_server_local_new (); + x_server = x_server_xmir_new (SEAT_UNITY (seat)->priv->compositor); command = seat_get_string_property (seat, "xmir-command"); /* Fall back to using X if Xmir is not available as this was the previous way XMir worked */ if (strcmp (command, "Xmir") == 0 && !g_find_program_in_path ("Xmir")) command = seat_get_string_property (seat, "xserver-command"); - x_server_local_set_command (x_server, command); + x_server_local_set_command (X_SERVER_LOCAL (x_server), command); id = g_strdup_printf ("x-%d", SEAT_UNITY (seat)->priv->next_x_server_id); SEAT_UNITY (seat)->priv->next_x_server_id++; - x_server_local_set_mir_id (x_server, id); - x_server_local_set_mir_socket (x_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); + x_server_xmir_set_mir_id (x_server, id); + x_server_xmir_set_mir_socket (x_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); g_free (id); + number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); + cookie = x_authority_new_local_cookie (number); + x_server_set_authority (X_SERVER (x_server), cookie); + g_free (number); + g_object_unref (cookie); + layout = seat_get_string_property (seat, "xserver-layout"); if (layout) - x_server_local_set_layout (x_server, layout); + x_server_local_set_layout (X_SERVER_LOCAL (x_server), layout); - x_server_local_set_xdg_seat (x_server, seat_get_name (seat)); + x_server_local_set_xdg_seat (X_SERVER_LOCAL (x_server), seat_get_name (seat)); config_file = seat_get_string_property (seat, "xserver-config"); if (config_file) - x_server_local_set_config (x_server, config_file); + x_server_local_set_config (X_SERVER_LOCAL (x_server), config_file); allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp"); - x_server_local_set_allow_tcp (x_server, allow_tcp); + x_server_local_set_allow_tcp (X_SERVER_LOCAL (x_server), allow_tcp); return x_server; } static DisplayServer * -create_mir_server (Seat *seat) -{ - MirServer *mir_server; - - mir_server = mir_server_new (); - mir_server_set_parent_socket (mir_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); - - return DISPLAY_SERVER (mir_server); -} - -static DisplayServer * seat_unity_create_display_server (Seat *seat, Session *session) { const gchar *session_type; @@ -250,7 +244,7 @@ if (strcmp (session_type, "x") == 0) return DISPLAY_SERVER (create_x_server (seat)); else if (strcmp (session_type, "mir") == 0) - return create_mir_server (seat); + return g_object_ref (SEAT_UNITY (seat)->priv->compositor); else { l_warning (seat, "Can't create unsupported display server '%s'", session_type); @@ -258,21 +252,24 @@ } } -static Greeter * +static gboolean +seat_unity_display_server_is_used (Seat *seat, DisplayServer *display_server) +{ + if (display_server == DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)) + return TRUE; + + return SEAT_CLASS (seat_unity_parent_class)->display_server_is_used (seat, display_server); +} + +static GreeterSession * seat_unity_create_greeter_session (Seat *seat) { - Greeter *greeter_session; - gchar *id; + GreeterSession *greeter_session; gint vt; greeter_session = SEAT_CLASS (seat_unity_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); - id = g_strdup_printf ("greeter-%d", SEAT_UNITY (seat)->priv->next_greeter_id); - SEAT_UNITY (seat)->priv->next_greeter_id++; - session_set_env (SESSION (greeter_session), "MIR_SERVER_NAME", id); - g_free (id); - vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); if (vt >= 0) { @@ -288,17 +285,11 @@ seat_unity_create_session (Seat *seat) { Session *session; - gchar *id; gint vt; session = SEAT_CLASS (seat_unity_parent_class)->create_session (seat); session_set_env (session, "XDG_SEAT", seat_get_name (seat)); - id = g_strdup_printf ("session-%d", SEAT_UNITY (seat)->priv->next_session_id); - SEAT_UNITY (seat)->priv->next_session_id++; - session_set_env (session, "MIR_SERVER_NAME", id); - g_free (id); - vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); if (vt >= 0) { @@ -310,37 +301,39 @@ return session; } -static void -seat_unity_set_active_session (Seat *seat, Session *session) +static const gchar * +get_mir_id (Session *session) { DisplayServer *display_server; - if (session == SEAT_UNITY (seat)->priv->active_session) - return; - SEAT_UNITY (seat)->priv->active_session = g_object_ref (session); + if (!session) + return NULL; - display_server = session_get_display_server (session); - if (SEAT_UNITY (seat)->priv->active_display_server != display_server) - { - const gchar *id = NULL; + display_server = session_get_display_server (session); + if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) + return session_get_env (session, "MIR_SERVER_NAME"); + if (IS_X_SERVER_XMIR (display_server)) + return x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server)); - SEAT_UNITY (seat)->priv->active_display_server = g_object_ref (display_server); + return NULL; +} - if (IS_X_SERVER_LOCAL (display_server)) - id = x_server_local_get_mir_id (X_SERVER_LOCAL (display_server)); - else - id = session_get_env (session, "MIR_SERVER_NAME"); +static void +seat_unity_set_active_session (Seat *s, Session *session) +{ + SeatUnity *seat = SEAT_UNITY (s); + const gchar *old_id, *new_id; - if (id) - { - l_debug (seat, "Switching to Mir session %s", id); - unity_system_compositor_set_active_session (SEAT_UNITY (seat)->priv->compositor, id); - } - else - l_warning (seat, "Failed to work out session ID"); - } + old_id = get_mir_id (seat->priv->active_session); + new_id = get_mir_id (session); - SEAT_CLASS (seat_unity_parent_class)->set_active_session (seat, session); + g_clear_object (&seat->priv->active_session); + seat->priv->active_session = g_object_ref (session); + + if (g_strcmp0 (old_id, new_id) != 0) + unity_system_compositor_set_active_session (seat->priv->compositor, new_id); + + SEAT_CLASS (seat_unity_parent_class)->set_active_session (s, session); } static Session * @@ -361,7 +354,7 @@ display_server = session_get_display_server (session); if (IS_X_SERVER_LOCAL (display_server)) - id = x_server_local_get_mir_id (X_SERVER_LOCAL (display_server)); + id = x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server)); else id = session_get_env (session, "MIR_SERVER_NAME"); @@ -381,13 +374,13 @@ static void seat_unity_run_script (Seat *seat, DisplayServer *display_server, Process *script) { - if (IS_X_SERVER_LOCAL (display_server)) + if (IS_X_SERVER_XMIR (display_server)) { - XServerLocal *x_server; + XServerXmir *x_server; const gchar *path; - x_server = X_SERVER_LOCAL (display_server); - path = x_server_local_get_authority_file_path (x_server); + x_server = X_SERVER_XMIR (display_server); + path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); process_set_env (script, "XAUTHORITY", path); } @@ -442,6 +435,7 @@ seat_class->setup = seat_unity_setup; seat_class->start = seat_unity_start; seat_class->create_display_server = seat_unity_create_display_server; + seat_class->display_server_is_used = seat_unity_display_server_is_used; seat_class->create_greeter_session = seat_unity_create_greeter_session; seat_class->create_session = seat_unity_create_session; seat_class->set_active_session = seat_unity_set_active_session; diff -Nru lightdm-1.18.1/src/seat-xlocal.c lightdm-1.18.3/src/seat-xlocal.c --- lightdm-1.18.1/src/seat-xlocal.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/seat-xlocal.c 2016-06-21 00:41:00.000000000 +0000 @@ -21,13 +21,19 @@ struct SeatXLocalPrivate { + /* System compositor being used for Mir sessions */ + UnitySystemCompositor *compositor; + + /* Session currently active on compositor */ + Session *active_compositor_session; + /* X server being used for XDMCP */ XServerLocal *xdmcp_x_server; }; G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE); -static XServerLocal *create_x_server (Seat *seat); +static XServerLocal *create_x_server (SeatXLocal *seat); static void seat_xlocal_setup (Seat *seat) @@ -45,20 +51,30 @@ } static void -xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat) +xdmcp_x_server_stopped_cb (DisplayServer *display_server, SeatXLocal *seat) { l_debug (seat, "XDMCP X server stopped"); - g_signal_handlers_disconnect_matched (SEAT_XLOCAL (seat)->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - SEAT_XLOCAL (seat)->priv->xdmcp_x_server = NULL; - g_object_unref (display_server); + g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + g_clear_object (&seat->priv->xdmcp_x_server); - if (seat_get_is_stopping (seat)) - check_stopped (SEAT_XLOCAL (seat)); + if (seat_get_is_stopping (SEAT (seat))) + check_stopped (seat); else - seat_stop (seat); + seat_stop (SEAT (seat)); } +static void +compositor_stopped_cb (UnitySystemCompositor *compositor, SeatXLocal *seat) +{ + l_debug (seat, "Compositor stopped"); + + g_clear_object (&seat->priv->compositor); + + if (seat_get_is_stopping (SEAT (seat))) + check_stopped (seat); +} + static gboolean seat_xlocal_start (Seat *seat) { @@ -72,7 +88,7 @@ const gchar *key_name = NULL; gint port = 0; - s->priv->xdmcp_x_server = create_x_server (seat); + s->priv->xdmcp_x_server = create_x_server (s); x_server_local_set_xdmcp_server (s->priv->xdmcp_x_server, xdmcp_manager); port = seat_get_integer_property (seat, "xdmcp-port"); if (port > 0) @@ -136,10 +152,10 @@ } static gint -get_vt (Seat *seat, DisplayServer *display_server) +get_vt (SeatXLocal *seat, DisplayServer *display_server) { gint vt = -1; - const gchar *xdg_seat = seat_get_name (seat); + const gchar *xdg_seat = seat_get_name (SEAT (seat)); if (strcmp (xdg_seat, "seat0") != 0) return vt; @@ -166,10 +182,49 @@ return vt; } +static UnitySystemCompositor * +create_unity_system_compositor (SeatXLocal *seat) +{ + UnitySystemCompositor *compositor; + const gchar *command; + gint timeout, vt; + + compositor = unity_system_compositor_new (); + + command = seat_get_string_property (SEAT (seat), "unity-compositor-command"); + if (command) + unity_system_compositor_set_command (compositor, command); + + timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout"); + if (timeout <= 0) + timeout = 60; + unity_system_compositor_set_timeout (compositor, timeout); + + vt = get_vt (seat, DISPLAY_SERVER (compositor)); + if (vt >= 0) + unity_system_compositor_set_vt (compositor, vt); + + return compositor; +} + +static UnitySystemCompositor * +get_unity_system_compositor (SeatXLocal *seat) +{ + if (seat->priv->compositor) + return seat->priv->compositor; + + seat->priv->compositor = create_unity_system_compositor (seat); + g_signal_connect (seat->priv->compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), seat); + + return seat->priv->compositor; +} + static XServerLocal * -create_x_server (Seat *seat) +create_x_server (SeatXLocal *seat) { XServerLocal *x_server; + gchar *number; + XAuthority *cookie; const gchar *command = NULL, *layout = NULL, *config_file = NULL; gboolean allow_tcp; gint vt; @@ -189,63 +244,34 @@ if (g_getenv ("DISPLAY")) command = "Xephyr"; if (!command) - command = seat_get_string_property (seat, "xserver-command"); + command = seat_get_string_property (SEAT (seat), "xserver-command"); if (command) x_server_local_set_command (x_server, command); - layout = seat_get_string_property (seat, "xserver-layout"); + number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); + cookie = x_authority_new_local_cookie (number); + x_server_set_authority (X_SERVER (x_server), cookie); + g_free (number); + g_object_unref (cookie); + + layout = seat_get_string_property (SEAT (seat), "xserver-layout"); if (layout) x_server_local_set_layout (x_server, layout); - x_server_local_set_xdg_seat (x_server, seat_get_name (seat)); + x_server_local_set_xdg_seat (x_server, seat_get_name (SEAT (seat))); - config_file = seat_get_string_property (seat, "xserver-config"); + config_file = seat_get_string_property (SEAT (seat), "xserver-config"); if (config_file) x_server_local_set_config (x_server, config_file); - allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp"); + allow_tcp = seat_get_boolean_property (SEAT (seat), "xserver-allow-tcp"); x_server_local_set_allow_tcp (x_server, allow_tcp); return x_server; } static DisplayServer * -create_unity_system_compositor (Seat *seat) -{ - UnitySystemCompositor *compositor; - const gchar *command; - gchar *socket_name; - gint vt, timeout, i; - - compositor = unity_system_compositor_new (); - - command = seat_get_string_property (seat, "unity-compositor-command"); - if (command) - unity_system_compositor_set_command (compositor, command); - - timeout = seat_get_integer_property (seat, "unity-compositor-timeout"); - if (timeout <= 0) - timeout = 60; - unity_system_compositor_set_timeout (compositor, timeout); - - vt = get_vt (seat, DISPLAY_SERVER (compositor)); - if (vt >= 0) - unity_system_compositor_set_vt (compositor, vt); - - for (i = 0; ; i++) - { - socket_name = g_strdup_printf ("/run/lightdm-mir-%d", i); - if (!g_file_test (socket_name, G_FILE_TEST_EXISTS)) - break; - } - unity_system_compositor_set_socket (compositor, socket_name); - g_free (socket_name); - - return DISPLAY_SERVER (compositor); -} - -static DisplayServer * -create_wayland_session (Seat *seat) +create_wayland_session (SeatXLocal *seat) { WaylandSession *session; gint vt; @@ -260,28 +286,29 @@ } static DisplayServer * -seat_xlocal_create_display_server (Seat *seat, Session *session) +seat_xlocal_create_display_server (Seat *s, Session *session) { + SeatXLocal *seat = SEAT_XLOCAL (s); const gchar *session_type; session_type = session_get_session_type (session); if (strcmp (session_type, "x") == 0) return DISPLAY_SERVER (create_x_server (seat)); else if (strcmp (session_type, "mir") == 0) - return create_unity_system_compositor (seat); + return g_object_ref (get_unity_system_compositor (seat)); else if (strcmp (session_type, "wayland") == 0) return create_wayland_session (seat); else if (strcmp (session_type, "mir-container") == 0) { - DisplayServer *compositor; + UnitySystemCompositor *compositor; const gchar *compositor_command; compositor = create_unity_system_compositor (seat); compositor_command = session_config_get_compositor_command (session_get_config (session)); if (compositor_command) - unity_system_compositor_set_command (UNITY_SYSTEM_COMPOSITOR (compositor), compositor_command); + unity_system_compositor_set_command (compositor, compositor_command); - return compositor; + return DISPLAY_SERVER (compositor); } else { @@ -290,10 +317,19 @@ } } -static Greeter * +static gboolean +seat_xlocal_display_server_is_used (Seat *seat, DisplayServer *display_server) +{ + if (display_server == DISPLAY_SERVER (SEAT_XLOCAL (seat)->priv->compositor)) + return TRUE; + + return SEAT_CLASS (seat_xlocal_parent_class)->display_server_is_used (seat, display_server); +} + +static GreeterSession * seat_xlocal_create_greeter_session (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; greeter_session = SEAT_CLASS (seat_xlocal_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); @@ -313,8 +349,9 @@ } static void -seat_xlocal_set_active_session (Seat *seat, Session *session) +seat_xlocal_set_active_session (Seat *s, Session *session) { + SeatXLocal *seat = SEAT_XLOCAL (s); DisplayServer *display_server; display_server = session_get_display_server (session); @@ -323,15 +360,19 @@ if (vt >= 0) vt_set_active (vt); - if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) - unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), IS_GREETER (session) ? "greeter-0" : "session-0"); + g_clear_object (&seat->priv->active_compositor_session); + if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) { + unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), session_get_env (session, "MIR_SERVER_NAME")); + seat->priv->active_compositor_session = g_object_ref (session); + } - SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (seat, session); + SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (s, session); } static Session * -seat_xlocal_get_active_session (Seat *seat) +seat_xlocal_get_active_session (Seat *s) { + SeatXLocal *seat = SEAT_XLOCAL (s); gint vt; GList *link; @@ -339,7 +380,12 @@ if (vt < 0) return NULL; - for (link = seat_get_sessions (seat); link; link = link->next) + /* If the compositor is active return the session it is displaying */ + if (seat->priv->compositor && display_server_get_vt (DISPLAY_SERVER (seat->priv->compositor)) == vt) + return seat->priv->active_compositor_session; + + /* Otherwise find out which session is on this VT */ + for (link = seat_get_sessions (s); link; link = link->next) { Session *session = link->data; DisplayServer *display_server; @@ -353,6 +399,26 @@ } static void +seat_xlocal_set_next_session (Seat *seat, Session *session) +{ + const gchar *id = NULL; + + if (!session) + return; + + id = session_get_env (session, "MIR_SERVER_NAME"); + if (id) + { + l_debug (seat, "Marking Mir session %s as the next session", id); + unity_system_compositor_set_next_session (SEAT_XLOCAL (seat)->priv->compositor, id); + } + else + l_debug (seat, "Failed to work out session ID to mark"); + + SEAT_CLASS (seat_xlocal_parent_class)->set_next_session (seat, session); +} + +static void seat_xlocal_run_script (Seat *seat, DisplayServer *display_server, Process *script) { if (IS_X_SERVER_LOCAL (display_server)) @@ -370,13 +436,19 @@ } static void -seat_xlocal_stop (Seat *seat) +seat_xlocal_stop (Seat *s) { - /* Stop the XDMCP X server first */ - if (SEAT_XLOCAL (seat)->priv->xdmcp_x_server) - display_server_stop (DISPLAY_SERVER (SEAT_XLOCAL (seat)->priv->xdmcp_x_server)); + SeatXLocal *seat = SEAT_XLOCAL (s); + + /* Stop the compositor */ + if (seat->priv->compositor) + display_server_stop (DISPLAY_SERVER (seat->priv->compositor)); + + /* Stop the XDMCP X server */ + if (seat->priv->xdmcp_x_server) + display_server_stop (DISPLAY_SERVER (seat->priv->xdmcp_x_server)); - check_stopped (SEAT_XLOCAL (seat)); + check_stopped (seat); } static void @@ -390,6 +462,8 @@ { SeatXLocal *seat = SEAT_XLOCAL (object); + g_clear_object (&seat->priv->compositor); + g_clear_object (&seat->priv->active_compositor_session); if (seat->priv->xdmcp_x_server) { g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); @@ -410,10 +484,12 @@ seat_class->setup = seat_xlocal_setup; seat_class->start = seat_xlocal_start; seat_class->create_display_server = seat_xlocal_create_display_server; + seat_class->display_server_is_used = seat_xlocal_display_server_is_used; seat_class->create_greeter_session = seat_xlocal_create_greeter_session; seat_class->create_session = seat_xlocal_create_session; seat_class->set_active_session = seat_xlocal_set_active_session; seat_class->get_active_session = seat_xlocal_get_active_session; + seat_class->set_next_session = seat_xlocal_set_next_session; seat_class->run_script = seat_xlocal_run_script; seat_class->stop = seat_xlocal_stop; diff -Nru lightdm-1.18.1/src/seat-xremote.c lightdm-1.18.3/src/seat-xremote.c --- lightdm-1.18.1/src/seat-xremote.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/seat-xremote.c 2016-06-21 00:29:07.000000000 +0000 @@ -49,10 +49,10 @@ return DISPLAY_SERVER (x_server); } -static Greeter * +static GreeterSession * seat_xremote_create_greeter_session (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; greeter_session = SEAT_CLASS (seat_xremote_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); diff -Nru lightdm-1.18.1/src/seat-xvnc.c lightdm-1.18.3/src/seat-xvnc.c --- lightdm-1.18.1/src/seat-xvnc.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/seat-xvnc.c 2016-06-21 00:16:20.000000000 +0000 @@ -37,17 +37,24 @@ seat_xvnc_create_display_server (Seat *seat, Session *session) { XServerXVNC *x_server; + gchar *number; + XAuthority *cookie; const gchar *command = NULL; if (strcmp (session_get_session_type (session), "x") != 0) return NULL; x_server = x_server_xvnc_new (); + number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); + cookie = x_authority_new_local_cookie (number); + x_server_set_authority (X_SERVER (x_server), cookie); + g_free (number); + g_object_unref (cookie); x_server_xvnc_set_socket (x_server, g_socket_get_fd (SEAT_XVNC (seat)->priv->connection)); command = config_get_string (config_get_instance (), "VNCServer", "command"); if (command) - x_server_xvnc_set_command (x_server, command); + x_server_local_set_command (X_SERVER_LOCAL (x_server), command); if (config_has_key (config_get_instance (), "VNCServer", "width") && config_has_key (config_get_instance (), "VNCServer", "height")) @@ -81,7 +88,7 @@ address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (SEAT_XVNC (seat)->priv->connection, NULL)); hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); - path = x_server_xvnc_get_authority_file_path (x_server); + path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); process_set_env (script, "REMOTE_HOST", hostname); process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); diff -Nru lightdm-1.18.1/src/session.c lightdm-1.18.3/src/session.c --- lightdm-1.18.1/src/session.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/session.c 2016-07-11 21:51:57.000000000 +0000 @@ -27,8 +27,10 @@ #include "login1.h" #include "guest-account.h" #include "shared-data-manager.h" +#include "greeter-socket.h" enum { + CREATE_GREETER, GOT_MESSAGES, AUTHENTICATION_COMPLETE, STOPPED, @@ -94,6 +96,9 @@ XAuthority *x_authority; gboolean x_authority_use_system_location; + /* Socket to allow greeters to connect to (if allowed) */ + GreeterSocket *greeter_socket; + /* Remote host this session is being controlled from */ gchar *remote_host_name; @@ -151,7 +156,7 @@ session_get_session_type (Session *session) { g_return_val_if_fail (session != NULL, NULL); - return session_config_get_session_type (session_get_config (session)); + return session_config_get_session_type (session->priv->config); } void @@ -212,6 +217,10 @@ { g_return_if_fail (session != NULL); g_return_if_fail (display_server != NULL); + + if (session->priv->display_server == display_server) + return; + if (session->priv->display_server) { display_server_disconnect_session (session->priv->display_server, session); @@ -547,6 +556,14 @@ return session->priv->pid != 0; } +static Greeter * +create_greeter_cb (GreeterSocket *socket, Session *session) +{ + Greeter *greeter; + g_signal_emit (session, signals[CREATE_GREETER], 0, &greeter); + return greeter; +} + static gboolean session_real_start (Session *session) { @@ -731,10 +748,18 @@ void session_run (Session *session) { + g_return_if_fail (session != NULL); g_return_if_fail (session->priv->display_server != NULL); return SESSION_GET_CLASS (session)->run (session); } +gboolean +session_get_is_run (Session *session) +{ + g_return_val_if_fail (session != NULL, FALSE); + return session->priv->command_run; +} + static void session_real_run (Session *session) { @@ -790,6 +815,38 @@ } } + /* Open socket to allow in-session greeter */ + if (session->priv->config && session_config_get_allow_greeter (session->priv->config)) + { + gchar *run_dir, *dir, *path; + GError *error = NULL; + + run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); + dir = g_build_filename (run_dir, session->priv->username, NULL); + g_free (run_dir); + + if (g_mkdir_with_parents (dir, S_IRWXU) < 0) + l_warning (session, "Failed to create greeter socket dir %s: %s", dir, strerror (errno)); + if (getuid () == 0) + { + if (chown (dir, user_get_uid (session_get_user (session)), user_get_gid (session_get_user (session))) < 0) + l_warning (session, "Failed to set ownership of greeter socket dir: %s", strerror (errno)); + } + + path = g_build_filename (dir, "greeter-socket", NULL); + session->priv->greeter_socket = greeter_socket_new (path); + g_signal_connect (session->priv->greeter_socket, GREETER_SOCKET_SIGNAL_CREATE_GREETER, G_CALLBACK (create_greeter_cb), session); + session_set_env (session, "LIGHTDM_GREETER_PIPE", path); + g_free (path); + g_free (dir); + + if (!greeter_socket_start (session->priv->greeter_socket, &error)) + { + l_warning (session, "Failed to start greeter socket: %s\n", error->message); + g_clear_error (&error); + } + } + if (session->priv->log_filename) l_debug (session, "Logging to %s", session->priv->log_filename); write_string (session, session->priv->log_filename); @@ -963,6 +1020,16 @@ g_type_class_add_private (klass, sizeof (SessionPrivate)); + signals[CREATE_GREETER] = + g_signal_new (SESSION_SIGNAL_CREATE_GREETER, + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (SessionClass, create_greeter), + g_signal_accumulator_first_wins, + NULL, + NULL, + GREETER_TYPE, 0); + signals[GOT_MESSAGES] = g_signal_new (SESSION_SIGNAL_GOT_MESSAGES, G_TYPE_FROM_CLASS (klass), diff -Nru lightdm-1.18.1/src/session-config.c lightdm-1.18.3/src/session-config.c --- lightdm-1.18.1/src/session-config.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/session-config.c 2016-06-29 02:20:46.000000000 +0000 @@ -24,6 +24,9 @@ /* Compositor command to run (for type mir-container) */ gchar *compositor_command; + + /* TRUE if can run a greeter inside the session */ + gboolean allow_greeter; }; G_DEFINE_TYPE (SessionConfig, session_config, G_TYPE_OBJECT); @@ -68,6 +71,7 @@ } } config->priv->compositor_command = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-System-Compositor-Command", NULL); + config->priv->allow_greeter = g_key_file_get_boolean (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Allow-Greeter", NULL); g_key_file_free (desktop_file); @@ -102,6 +106,13 @@ return config->priv->compositor_command; } +gboolean +session_config_get_allow_greeter (SessionConfig *config) +{ + g_return_val_if_fail (config != NULL, FALSE); + return config->priv->allow_greeter; +} + static void session_config_init (SessionConfig *config) { diff -Nru lightdm-1.18.1/src/session-config.h lightdm-1.18.3/src/session-config.h --- lightdm-1.18.1/src/session-config.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/session-config.h 2016-06-29 02:20:58.000000000 +0000 @@ -46,6 +46,8 @@ const gchar *session_config_get_compositor_command (SessionConfig *config); +gboolean session_config_get_allow_greeter (SessionConfig *config); + G_END_DECLS #endif /* SESSION_CONFIG_H_ */ diff -Nru lightdm-1.18.1/src/session.h lightdm-1.18.3/src/session.h --- lightdm-1.18.1/src/session.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/session.h 2016-06-29 02:15:32.000000000 +0000 @@ -18,12 +18,19 @@ typedef struct Session Session; +typedef enum +{ + SESSION_TYPE_LOCAL, + SESSION_TYPE_REMOTE +} SessionType; + #include "session-config.h" #include "display-server.h" #include "accounts.h" #include "x-authority.h" #include "logger.h" #include "log-file.h" +#include "greeter.h" G_BEGIN_DECLS @@ -32,6 +39,7 @@ #define SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SESSION_TYPE, SessionClass)) #define SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SESSION_TYPE, SessionClass)) +#define SESSION_SIGNAL_CREATE_GREETER "create-greeter" #define SESSION_SIGNAL_GOT_MESSAGES "got-messages" #define SESSION_SIGNAL_AUTHENTICATION_COMPLETE "authentication-complete" #define SESSION_SIGNAL_STOPPED "stopped" @@ -52,17 +60,12 @@ void (*run)(Session *session); void (*stop)(Session *session); + Greeter *(*create_greeter)(Session *session); void (*got_messages)(Session *session); void (*authentication_complete)(Session *session); void (*stopped)(Session *session); } SessionClass; -typedef enum -{ - SESSION_TYPE_LOCAL, - SESSION_TYPE_REMOTE -} SessionType; - GType session_get_type (void); Session *session_new (void); @@ -136,6 +139,8 @@ void session_run (Session *session); +gboolean session_get_is_run (Session *session); + void session_lock (Session *session); void session_unlock (Session *session); diff -Nru lightdm-1.18.1/src/unity-system-compositor.c lightdm-1.18.3/src/unity-system-compositor.c --- lightdm-1.18.1/src/unity-system-compositor.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/unity-system-compositor.c 2016-06-21 00:39:46.000000000 +0000 @@ -21,7 +21,7 @@ #include "unity-system-compositor.h" #include "configuration.h" #include "process.h" -#include "greeter.h" +#include "greeter-session.h" #include "vt.h" struct UnitySystemCompositorPrivate @@ -58,6 +58,10 @@ /* TRUE when received ready signal */ gboolean is_ready; + + /* Counters for Mir IDs to use */ + int next_session_id; + int next_greeter_id; }; G_DEFINE_TYPE (UnitySystemCompositor, unity_system_compositor, DISPLAY_SERVER_TYPE); @@ -172,17 +176,28 @@ unity_system_compositor_connect_session (DisplayServer *display_server, Session *session) { UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (display_server); - const gchar *name; session_set_env (session, "XDG_SESSION_TYPE", "mir"); if (compositor->priv->socket) - session_set_env (session, "MIR_SOCKET", compositor->priv->socket); - if (IS_GREETER (session)) - name = "greeter-0"; - else - name = "session-0"; - session_set_env (session, "MIR_SERVER_NAME", name); + session_set_env (session, "MIR_SERVER_HOST_SOCKET", compositor->priv->socket); + + if (!session_get_env (session, "MIR_SERVER_NAME")) + { + gchar *name; + if (IS_GREETER_SESSION (session)) + { + name = g_strdup_printf ("greeter-%d", compositor->priv->next_greeter_id); + compositor->priv->next_greeter_id++; + } + else + { + name = g_strdup_printf ("session-%d", compositor->priv->next_session_id); + compositor->priv->next_session_id++; + } + session_set_env (session, "MIR_SERVER_NAME", name); + g_free (name); + } if (compositor->priv->vt >= 0) { @@ -196,7 +211,7 @@ unity_system_compositor_disconnect_session (DisplayServer *display_server, Session *session) { session_unset_env (session, "XDG_SESSION_TYPE"); - session_unset_env (session, "MIR_SOCKET"); + session_unset_env (session, "MIR_SERVER_HOST_SOCKET"); session_unset_env (session, "MIR_SERVER_NAME"); session_unset_env (session, "XDG_VTNR"); } @@ -435,9 +450,9 @@ /* Close compostor ends of the pipes */ close (compositor->priv->to_compositor_pipe[0]); - compositor->priv->to_compositor_pipe[0] = 0; + compositor->priv->to_compositor_pipe[0] = -1; close (compositor->priv->from_compositor_pipe[1]); - compositor->priv->from_compositor_pipe[1] = 0; + compositor->priv->from_compositor_pipe[1] = -1; if (!result) return FALSE; @@ -466,6 +481,10 @@ compositor->priv->command = g_strdup ("unity-system-compositor"); compositor->priv->socket = g_strdup ("/run/mir_socket"); compositor->priv->timeout = -1; + compositor->priv->to_compositor_pipe[0] = -1; + compositor->priv->to_compositor_pipe[1] = -1; + compositor->priv->from_compositor_pipe[0] = -1; + compositor->priv->from_compositor_pipe[1] = -1; } static void diff -Nru lightdm-1.18.1/src/unity-system-compositor.h lightdm-1.18.3/src/unity-system-compositor.h --- lightdm-1.18.1/src/unity-system-compositor.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/unity-system-compositor.h 2016-06-21 00:15:47.000000000 +0000 @@ -32,8 +32,6 @@ typedef struct { DisplayServerClass parent_class; - - void (*ready)(UnitySystemCompositor *compositor); } UnitySystemCompositorClass; GType unity_system_compositor_get_type (void); diff -Nru lightdm-1.18.1/src/x-authority.c lightdm-1.18.3/src/x-authority.c --- lightdm-1.18.1/src/x-authority.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-authority.c 2016-06-21 00:13:53.000000000 +0000 @@ -67,6 +67,15 @@ return x_authority_new (family, address, address_length, number, "MIT-MAGIC-COOKIE-1", cookie, 16); } +XAuthority * +x_authority_new_local_cookie (const gchar *number) +{ + gchar hostname[1024]; + + gethostname (hostname, 1024); + return x_authority_new_cookie (XAUTH_FAMILY_LOCAL, (guint8 *) hostname, strlen (hostname), number); +} + void x_authority_set_family (XAuthority *auth, guint16 family) { diff -Nru lightdm-1.18.1/src/x-authority.h lightdm-1.18.3/src/x-authority.h --- lightdm-1.18.1/src/x-authority.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-authority.h 2016-06-21 00:13:53.000000000 +0000 @@ -56,6 +56,8 @@ XAuthority *x_authority_new_cookie (guint16 family, const guint8 *address, gsize address_length, const gchar *number); +XAuthority *x_authority_new_local_cookie (const gchar *number); + void x_authority_set_family (XAuthority *auth, guint16 family); guint16 x_authority_get_family (XAuthority *auth); diff -Nru lightdm-1.18.1/src/xdmcp-server.c lightdm-1.18.3/src/xdmcp-server.c --- lightdm-1.18.1/src/xdmcp-server.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/xdmcp-server.c 2016-04-28 07:04:37.000000000 +0000 @@ -56,6 +56,13 @@ /* Maximum number of milliseconds client will resend manage requests before giving up */ #define MANAGE_TIMEOUT 126000 +/* Address sort support structure */ +typedef struct +{ + gsize index; + GInetAddress *address; +} AddrSortItem; + XDMCPServer * xdmcp_server_new (void) { @@ -355,54 +362,90 @@ } } -static gssize -find_address (GInetAddress **addresses, gsize length, GSocketFamily family) -{ - int i; - - for (i = 0; i < length; i++) +/* Sort function to order XDMCP addresses by which is best to connect to */ +static gint +compare_addresses (gconstpointer a, gconstpointer b, gpointer user_data) +{ + const AddrSortItem *item_a = a; + const AddrSortItem *item_b = b; + GInetAddress *source_address = user_data; + GSocketFamily family_a; + GSocketFamily family_b; + gboolean is_link_local; + + /* Prefer non link-local addresses */ + is_link_local = g_inet_address_get_is_link_local (item_a->address); + if (is_link_local != g_inet_address_get_is_link_local (item_b->address)) + return is_link_local ? 1 : -1; + + /* Prefer the source address family */ + family_a = g_inet_address_get_family (item_a->address); + family_b = g_inet_address_get_family (item_b->address); + if (family_a != family_b) { - GInetAddress *address = addresses[i]; - if (address && g_inet_address_get_family (address) == family) - return i; + GSocketFamily family; + + family = g_inet_address_get_family (source_address); + if (family_a == family) + return -1; + if (family_b == family) + return 1; + return family_a < family_b ? -1 : 1; } - return -1; + /* Check equality */ + if (g_inet_address_equal (item_a->address, item_b->address)) + return 0; + + /* Prefer the source address */ + if (g_inet_address_equal (source_address, item_a->address)) + return -1; + if (g_inet_address_equal (source_address, item_b->address)) + return 1; + + /* Addresses are not equal, but preferences are: order is undefined */ + return 0; } static XDMCPConnection * choose_connection (XDMCPPacket *packet, GInetAddress *source_address) { - GInetAddress **addresses; gsize addresses_length, i; + GArray *addresses; gssize index = -1; + AddrSortItem addr; addresses_length = packet->Request.n_connections; if (addresses_length == 0) return NULL; - addresses = malloc (sizeof (GInetAddress *) * addresses_length); + addresses = g_array_sized_new (FALSE, FALSE, sizeof addr, addresses_length); + if (!addresses) + return NULL; + for (i = 0; i < addresses_length; i++) - addresses[i] = connection_to_address (&packet->Request.connections[i]); + { + addr.address = connection_to_address (&packet->Request.connections[i]); + if (addr.address) + { + addr.index = i; + g_array_append_val (addresses, addr); + } + } - /* Use the address the request came in on as this is the least likely to have firewall / routing issues */ - for (i = 0; i < addresses_length && index < 0; i++) - if (g_inet_address_equal (source_address, addresses[i])) - index = i; - - /* Otherwise try and find an address that matches the incoming type */ - if (index < 0) - index = find_address (addresses, addresses_length, g_inet_address_get_family (source_address)); - - /* Otherwise use the first available */ - if (index < 0) - index = 0; + /* Sort the addresses according to our preferences */ + g_array_sort_with_data (addresses, compare_addresses, source_address); - for (i = 0; i < addresses_length; i++) - g_object_unref (addresses[i]); - g_free (addresses); + /* Use the best address */ + if (addresses->len) + index = g_array_index (addresses, AddrSortItem, 0).index; + + /* Free the local sort array and items */ + for (i = 0; i < addresses->len; i++) + g_object_unref (g_array_index (addresses, AddrSortItem, i).address); + g_object_unref (addresses); - return &packet->Request.connections[index]; + return index >= 0 ? &packet->Request.connections[index] : NULL; } static gboolean diff -Nru lightdm-1.18.1/src/x-server.c lightdm-1.18.3/src/x-server.c --- lightdm-1.18.1/src/x-server.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server.c 2016-06-21 00:14:16.000000000 +0000 @@ -21,9 +21,6 @@ /* Host running the server */ gchar *hostname; - /* Display number */ - guint number; - /* Cached server address */ gchar *address; @@ -53,20 +50,11 @@ return server->priv->hostname; } -void -x_server_set_display_number (XServer *server, guint number) -{ - g_return_if_fail (server != NULL); - server->priv->number = number; - g_free (server->priv->address); - server->priv->address = NULL; -} - guint x_server_get_display_number (XServer *server) { g_return_val_if_fail (server != NULL, 0); - return server->priv->number; + return X_SERVER_GET_CLASS (server)->get_display_number (server); } const gchar * @@ -77,9 +65,9 @@ if (!server->priv->address) { if (server->priv->hostname) - server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, server->priv->number); + server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, x_server_get_display_number (server)); else - server->priv->address = g_strdup_printf(":%d", server->priv->number); + server->priv->address = g_strdup_printf(":%d", x_server_get_display_number (server)); } return server->priv->address; diff -Nru lightdm-1.18.1/src/x-server.h lightdm-1.18.3/src/x-server.h --- lightdm-1.18.1/src/x-server.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server.h 2016-06-21 00:14:16.000000000 +0000 @@ -35,6 +35,7 @@ typedef struct { DisplayServerClass parent_class; + guint (*get_display_number) (XServer *server); } XServerClass; GType x_server_get_type (void); @@ -43,8 +44,6 @@ gchar *x_server_get_hostname (XServer *server); -void x_server_set_display_number (XServer *server, guint number); - guint x_server_get_display_number (XServer *server); const gchar *x_server_get_address (XServer *server); diff -Nru lightdm-1.18.1/src/x-server-local.c lightdm-1.18.3/src/x-server-local.c --- lightdm-1.18.1/src/x-server-local.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server-local.c 2016-06-21 00:21:39.000000000 +0000 @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -31,6 +30,9 @@ /* Command to run the X server */ gchar *command; + /* Display number to use */ + guint display_number; + /* Config file to use */ gchar *config_file; @@ -55,12 +57,6 @@ /* XDMCP key to use */ gchar *xdmcp_key; - /* ID to report to Mir */ - gchar *mir_id; - - /* Filename of socket Mir is listening on */ - gchar *mir_socket; - /* TRUE when received ready signal */ gboolean got_signal; @@ -204,20 +200,10 @@ x_server_local_new (void) { XServerLocal *self; - gchar hostname[1024], *number, *name; - XAuthority *cookie; + gchar *name; self = g_object_new (X_SERVER_LOCAL_TYPE, NULL); - x_server_set_display_number (X_SERVER (self), x_server_local_get_unused_display_number ()); - - gethostname (hostname, 1024); - number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (self))); - cookie = x_authority_new_cookie (XAUTH_FAMILY_LOCAL, (guint8*) hostname, strlen (hostname), number); - x_server_set_authority (X_SERVER (self), cookie); - g_free (number); - g_object_unref (cookie); - name = g_strdup_printf ("x-%d", x_server_get_display_number (X_SERVER (self))); display_server_set_name (DISPLAY_SERVER (self), name); g_free (name); @@ -325,26 +311,10 @@ server->priv->background = g_strdup (background); } -void -x_server_local_set_mir_id (XServerLocal *server, const gchar *id) +static guint +x_server_local_get_display_number (XServer *server) { - g_return_if_fail (server != NULL); - g_free (server->priv->mir_id); - server->priv->mir_id = g_strdup (id); -} - -const gchar *x_server_local_get_mir_id (XServerLocal *server) -{ - g_return_val_if_fail (server != NULL, NULL); - return server->priv->mir_id; -} - -void -x_server_local_set_mir_socket (XServerLocal *server, const gchar *socket) -{ - g_return_if_fail (server != NULL); - g_free (server->priv->mir_socket); - server->priv->mir_socket = g_strdup (socket); + return X_SERVER_LOCAL (server)->priv->display_number; } static gint @@ -385,7 +355,7 @@ } static void -run_cb (Process *process, gpointer user_data) +x_server_local_run (Process *process, gpointer user_data) { int fd; @@ -398,13 +368,25 @@ signal (SIGUSR1, SIG_IGN); } +static ProcessRunFunc +x_server_local_get_run_function (XServerLocal *server) +{ + return x_server_local_run; +} + +static gboolean +x_server_local_get_log_stdout (XServerLocal *server) +{ + return TRUE; +} + static void got_signal_cb (Process *process, int signum, XServerLocal *server) { if (signum == SIGUSR1 && !server->priv->got_signal) { server->priv->got_signal = TRUE; - l_debug (server, "Got signal from X server :%d", x_server_get_display_number (X_SERVER (server))); + l_debug (server, "Got signal from X server :%d", server->priv->display_number); // FIXME: Check return value DISPLAY_SERVER_CLASS (x_server_local_parent_class)->start (DISPLAY_SERVER (server)); @@ -422,7 +404,7 @@ vt_unref (server->priv->vt); server->priv->have_vt_ref = FALSE; } - x_server_local_release_display_number (x_server_get_display_number (X_SERVER (server))); + x_server_local_release_display_number (server->priv->display_number); if (x_server_get_authority (X_SERVER (server)) && server->priv->authority_file) { @@ -474,6 +456,7 @@ x_server_local_start (DisplayServer *display_server) { XServerLocal *server = X_SERVER_LOCAL (display_server); + ProcessRunFunc run_cb; gboolean result, backup_logs; gchar *filename, *dir, *log_file, *absolute_command; GString *command; @@ -484,6 +467,7 @@ g_return_val_if_fail (server->priv->command != NULL, FALSE); + run_cb = X_SERVER_LOCAL_GET_CLASS (server)->get_run_function (server); server->priv->x_server_process = process_new (run_cb, server); process_set_clear_environment (server->priv->x_server_process, TRUE); g_signal_connect (server->priv->x_server_process, PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (got_signal_cb), server); @@ -494,7 +478,7 @@ dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); log_file = g_build_filename (dir, filename, NULL); backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); - process_set_log_file (server->priv->x_server_process, log_file, TRUE, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); + process_set_log_file (server->priv->x_server_process, log_file, X_SERVER_LOCAL_GET_CLASS (server)->get_log_stdout (server), backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); l_debug (display_server, "Logging to %s", log_file); g_free (log_file); g_free (filename); @@ -510,7 +494,7 @@ command = g_string_new (absolute_command); g_free (absolute_command); - g_string_append_printf (command, " :%d", x_server_get_display_number (X_SERVER (server))); + g_string_append_printf (command, " :%d", server->priv->display_number); if (server->priv->config_file) g_string_append_printf (command, " -config %s", server->priv->config_file); @@ -525,13 +509,6 @@ if (server->priv->authority_file) g_string_append_printf (command, " -auth %s", server->priv->authority_file); - /* Setup for running inside Mir */ - if (server->priv->mir_id) - g_string_append_printf (command, " -mir %s", server->priv->mir_id); - - if (server->priv->mir_socket) - g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket); - /* Connect to a remote server using XDMCP */ if (server->priv->xdmcp_server != NULL) { @@ -555,6 +532,10 @@ if (server->priv->background) g_string_append_printf (command, " -background %s", server->priv->background); + /* Allow sub-classes to add arguments */ + if (X_SERVER_LOCAL_GET_CLASS (server)->add_args) + X_SERVER_LOCAL_GET_CLASS (server)->add_args (server, command); + process_set_command (server->priv->x_server_process, command->str); g_string_free (command, TRUE); @@ -586,7 +567,7 @@ result = process_start (server->priv->x_server_process, FALSE); if (result) - l_debug (display_server, "Waiting for ready signal from X server :%d", x_server_get_display_number (X_SERVER (server))); + l_debug (display_server, "Waiting for ready signal from X server :%d", server->priv->display_number); if (!result) stopped_cb (server->priv->x_server_process, X_SERVER_LOCAL (server)); @@ -606,6 +587,7 @@ server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_LOCAL_TYPE, XServerLocalPrivate); server->priv->vt = -1; server->priv->command = g_strdup ("X"); + server->priv->display_number = x_server_local_get_unused_display_number (); } static void @@ -624,8 +606,6 @@ g_free (self->priv->xdg_seat); g_free (self->priv->xdmcp_server); g_free (self->priv->xdmcp_key); - g_free (self->priv->mir_id); - g_free (self->priv->mir_socket); g_free (self->priv->authority_file); if (self->priv->have_vt_ref) vt_unref (self->priv->vt); @@ -638,10 +618,14 @@ x_server_local_class_init (XServerLocalClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + XServerClass *x_server_class = X_SERVER_CLASS (klass); DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass); + klass->get_run_function = x_server_local_get_run_function; + klass->get_log_stdout = x_server_local_get_log_stdout; + x_server_class->get_display_number = x_server_local_get_display_number; display_server_class->get_vt = x_server_local_get_vt; - display_server_class->start = x_server_local_start; + display_server_class->start = klass->start = x_server_local_start; display_server_class->stop = x_server_local_stop; object_class->finalize = x_server_local_finalize; diff -Nru lightdm-1.18.1/src/x-server-local.h lightdm-1.18.3/src/x-server-local.h --- lightdm-1.18.1/src/x-server-local.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server-local.h 2016-06-21 00:21:39.000000000 +0000 @@ -13,11 +13,14 @@ #define X_SERVER_LOCAL_H_ #include "x-server.h" +#include "process.h" G_BEGIN_DECLS #define X_SERVER_LOCAL_TYPE (x_server_local_get_type()) #define X_SERVER_LOCAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_LOCAL_TYPE, XServerLocal)) +#define X_SERVER_LOCAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), X_SERVER_LOCAL_TYPE, XServerLocalClass)) +#define X_SERVER_LOCAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), X_SERVER_LOCAL_TYPE, XServerLocalClass)) #define IS_X_SERVER_LOCAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_LOCAL_TYPE)) typedef struct XServerLocalPrivate XServerLocalPrivate; @@ -31,6 +34,10 @@ typedef struct { XServerClass parent_class; + ProcessRunFunc (*get_run_function)(XServerLocal *server); + gboolean (*get_log_stdout)(XServerLocal *server); + void (*add_args)(XServerLocal *server, GString *command); + gboolean (*start)(DisplayServer *server); } XServerLocalClass; const gchar *x_server_local_get_version (void); @@ -69,12 +76,6 @@ void x_server_local_set_background (XServerLocal *server, const gchar *background); -void x_server_local_set_mir_id (XServerLocal *server, const gchar *id); - -const gchar *x_server_local_get_mir_id (XServerLocal *server); - -void x_server_local_set_mir_socket (XServerLocal *server, const gchar *socket); - const gchar *x_server_local_get_authority_file_path (XServerLocal *server); G_END_DECLS diff -Nru lightdm-1.18.1/src/x-server-remote.c lightdm-1.18.3/src/x-server-remote.c --- lightdm-1.18.1/src/x-server-remote.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server-remote.c 2016-06-21 00:14:16.000000000 +0000 @@ -13,6 +13,12 @@ #include "x-server-remote.h" +struct XServerRemotePrivate +{ + /* Display number to use */ + guint display_number; +}; + G_DEFINE_TYPE (XServerRemote, x_server_remote, X_SERVER_TYPE); XServerRemote * @@ -21,8 +27,9 @@ XServerRemote *self = g_object_new (X_SERVER_REMOTE_TYPE, NULL); gchar *name; + self->priv->display_number = number; + x_server_set_hostname (X_SERVER (self), hostname); - x_server_set_display_number (X_SERVER (self), number); x_server_set_authority (X_SERVER (self), authority); name = g_strdup_printf ("x-%s-%d", hostname, number); @@ -32,12 +39,24 @@ return self; } +static guint +x_server_remote_get_display_number (XServer *server) +{ + return X_SERVER_REMOTE (server)->priv->display_number; +} + static void x_server_remote_init (XServerRemote *server) { + server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_REMOTE_TYPE, XServerRemotePrivate); } static void x_server_remote_class_init (XServerRemoteClass *klass) { + XServerClass *x_server_class = X_SERVER_CLASS (klass); + + x_server_class->get_display_number = x_server_remote_get_display_number; + + g_type_class_add_private (klass, sizeof (XServerRemotePrivate)); } diff -Nru lightdm-1.18.1/src/x-server-remote.h lightdm-1.18.3/src/x-server-remote.h --- lightdm-1.18.1/src/x-server-remote.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server-remote.h 2016-06-21 00:14:16.000000000 +0000 @@ -19,9 +19,12 @@ #define X_SERVER_REMOTE_TYPE (x_server_remote_get_type()) #define X_SERVER_REMOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_REMOTE_TYPE, XServerRemote)) +typedef struct XServerRemotePrivate XServerRemotePrivate; + typedef struct { - XServer parent_instance; + XServer parent_instance; + XServerRemotePrivate *priv; } XServerRemote; typedef struct diff -Nru lightdm-1.18.1/src/x-server-xmir.c lightdm-1.18.3/src/x-server-xmir.c --- lightdm-1.18.1/src/x-server-xmir.c 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/src/x-server-xmir.c 2016-06-21 00:39:46.000000000 +0000 @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2010-2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#include + +#include "x-server-xmir.h" + +struct XServerXmirPrivate +{ + /* Compositor we are running under */ + UnitySystemCompositor *compositor; + + /* TRUE if we are waiting for the compositor to start */ + gboolean waiting_for_compositor; + + /* ID to report to Mir */ + gchar *mir_id; + + /* Filename of socket Mir is listening on */ + gchar *mir_socket; +}; + +G_DEFINE_TYPE (XServerXmir, x_server_xmir, X_SERVER_LOCAL_TYPE); + +static void +compositor_ready_cb (UnitySystemCompositor *compositor, XServerXmir *server) +{ + gboolean result; + + if (!server->priv->waiting_for_compositor) + return; + server->priv->waiting_for_compositor = FALSE; + + result = X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (DISPLAY_SERVER (server)); + if (!result) + display_server_stop (DISPLAY_SERVER (server)); +} + +static void +compositor_stopped_cb (UnitySystemCompositor *compositor, XServerXmir *server) +{ + display_server_stop (DISPLAY_SERVER (server)); +} + +XServerXmir * +x_server_xmir_new (UnitySystemCompositor *compositor) +{ + XServerXmir *server; + gchar *name; + + server = g_object_new (X_SERVER_XMIR_TYPE, NULL); + x_server_local_set_command (X_SERVER_LOCAL (server), "Xmir"); + server->priv->compositor = g_object_ref (compositor); + g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), server); + g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), server); + + name = g_strdup_printf ("x-%d", x_server_get_display_number (X_SERVER (server))); + display_server_set_name (DISPLAY_SERVER (server), name); + g_free (name); + + + return server; +} + +void +x_server_xmir_set_mir_id (XServerXmir *server, const gchar *id) +{ + g_return_if_fail (server != NULL); + g_free (server->priv->mir_id); + server->priv->mir_id = g_strdup (id); +} + +const gchar * +x_server_xmir_get_mir_id (XServerXmir *server) +{ + g_return_val_if_fail (server != NULL, NULL); + return server->priv->mir_id; +} + +void +x_server_xmir_set_mir_socket (XServerXmir *server, const gchar *socket) +{ + g_return_if_fail (server != NULL); + g_free (server->priv->mir_socket); + server->priv->mir_socket = g_strdup (socket); +} + +static void +x_server_xmir_add_args (XServerLocal *x_server, GString *command) +{ + XServerXmir *server = X_SERVER_XMIR (x_server); + + if (server->priv->mir_id) + g_string_append_printf (command, " -mir %s", server->priv->mir_id); + + if (server->priv->mir_socket) + g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket); +} + +static DisplayServer * +x_server_xmir_get_parent (DisplayServer *server) +{ + return DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor); +} + +static gint +x_server_xmir_get_vt (DisplayServer *server) +{ + return display_server_get_vt (DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor)); +} + +static gboolean +x_server_xmir_start (DisplayServer *display_server) +{ + XServerXmir *server = X_SERVER_XMIR (display_server); + + if (display_server_get_is_ready (DISPLAY_SERVER (server->priv->compositor))) + return X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (display_server); + else + { + if (!server->priv->waiting_for_compositor) + { + server->priv->waiting_for_compositor = TRUE; + if (!display_server_start (DISPLAY_SERVER (server->priv->compositor))) + return FALSE; + } + return TRUE; + } +} + +static void +x_server_xmir_init (XServerXmir *server) +{ + server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_XMIR_TYPE, XServerXmirPrivate); +} + +static void +x_server_xmir_finalize (GObject *object) +{ + XServerXmir *self = X_SERVER_XMIR (object); + + if (self->priv->compositor) + { + g_signal_handlers_disconnect_matched (self->priv->compositor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); + g_object_unref (self->priv->compositor); + } + g_free (self->priv->mir_id); + g_free (self->priv->mir_socket); + + G_OBJECT_CLASS (x_server_xmir_parent_class)->finalize (object); +} + +static void +x_server_xmir_class_init (XServerXmirClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass); + XServerLocalClass *x_server_local_class = X_SERVER_LOCAL_CLASS (klass); + + x_server_local_class->add_args = x_server_xmir_add_args; + display_server_class->get_parent = x_server_xmir_get_parent; + display_server_class->get_vt = x_server_xmir_get_vt; + display_server_class->start = x_server_xmir_start; + object_class->finalize = x_server_xmir_finalize; + + g_type_class_add_private (klass, sizeof (XServerXmirPrivate)); +} diff -Nru lightdm-1.18.1/src/x-server-xmir.h lightdm-1.18.3/src/x-server-xmir.h --- lightdm-1.18.1/src/x-server-xmir.h 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/src/x-server-xmir.h 2016-06-21 00:21:39.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2010-2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#ifndef X_SERVER_XMIR_H_ +#define X_SERVER_XMIR_H_ + +#include "x-server-local.h" +#include "unity-system-compositor.h" + +G_BEGIN_DECLS + +#define X_SERVER_XMIR_TYPE (x_server_xmir_get_type()) +#define X_SERVER_XMIR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_XMIR_TYPE, XServerXmir)) +#define IS_X_SERVER_XMIR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_XMIR_TYPE)) + +typedef struct XServerXmirPrivate XServerXmirPrivate; + +typedef struct +{ + XServerLocal parent_instance; + XServerXmirPrivate *priv; +} XServerXmir; + +typedef struct +{ + XServerLocalClass parent_class; +} XServerXmirClass; + +GType x_server_xmir_get_type (void); + +XServerXmir *x_server_xmir_new (UnitySystemCompositor *compositor); + +void x_server_xmir_set_mir_id (XServerXmir *server, const gchar *id); + +const gchar *x_server_xmir_get_mir_id (XServerXmir *server); + +void x_server_xmir_set_mir_socket (XServerXmir *server, const gchar *socket); + +const gchar *x_server_xmir_get_authority_file_path (XServerXmir *server); + +G_END_DECLS + +#endif /* X_SERVER_XMIR_H_ */ diff -Nru lightdm-1.18.1/src/x-server-xvnc.c lightdm-1.18.3/src/x-server-xvnc.c --- lightdm-1.18.1/src/x-server-xvnc.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server-xvnc.c 2016-06-21 00:16:20.000000000 +0000 @@ -12,38 +12,24 @@ #include #include #include -#include #include #include #include #include "x-server-xvnc.h" #include "configuration.h" -#include "x-server-local.h" #include "process.h" struct XServerXVNCPrivate { - /* X server process */ - Process *x_server_process; - - /* Command to run the X server */ - gchar *command; - - /* Authority file */ - gchar *authority_file; - /* File descriptor to use for standard input */ gint socket_fd; /* Geometry and colour depth */ gint width, height, depth; - - /* TRUE when received ready signal */ - gboolean got_signal; }; -G_DEFINE_TYPE (XServerXVNC, x_server_xvnc, X_SERVER_TYPE); +G_DEFINE_TYPE (XServerXVNC, x_server_xvnc, X_SERVER_LOCAL_TYPE); XServerXVNC * x_server_xvnc_new (void) @@ -51,23 +37,14 @@ XServerXVNC *self = g_object_new (X_SERVER_XVNC_TYPE, NULL); gchar *name; - x_server_set_display_number (X_SERVER (self), x_server_local_get_unused_display_number ()); - name = g_strdup_printf ("xvnc-%d", x_server_get_display_number (X_SERVER (self))); display_server_set_name (DISPLAY_SERVER (self), name); g_free (name); + + x_server_local_set_command (X_SERVER_LOCAL (self), "Xvnc"); return self; } - -void -x_server_xvnc_set_command (XServerXVNC *server, const gchar *command) -{ - g_return_if_fail (server != NULL); - g_free (server->priv->command); - server->priv->command = g_strdup (command); -} - void x_server_xvnc_set_socket (XServerXVNC *server, int fd) { @@ -97,37 +74,8 @@ server->priv->depth = depth; } -const gchar * -x_server_xvnc_get_authority_file_path (XServerXVNC *server) -{ - g_return_val_if_fail (server != NULL, 0); - return server->priv->authority_file; -} - -static gchar * -get_absolute_command (const gchar *command) -{ - gchar **tokens; - gchar *absolute_binary, *absolute_command = NULL; - - tokens = g_strsplit (command, " ", 2); - - absolute_binary = g_find_program_in_path (tokens[0]); - if (absolute_binary) - { - if (tokens[1]) - absolute_command = g_strjoin (" ", absolute_binary, tokens[1], NULL); - else - absolute_command = g_strdup (absolute_binary); - } - - g_strfreev (tokens); - - return absolute_command; -} - static void -run_cb (Process *process, gpointer user_data) +x_server_xvnc_run (Process *process, gpointer user_data) { XServerXVNC *server = user_data; @@ -140,35 +88,16 @@ signal (SIGUSR1, SIG_IGN); } -static void -got_signal_cb (Process *process, int signum, XServerXVNC *server) +static ProcessRunFunc +x_server_xvnc_get_run_function (XServerLocal *server) { - if (signum == SIGUSR1 && !server->priv->got_signal) - { - server->priv->got_signal = TRUE; - l_debug (server, "Got signal from Xvnc server :%d", x_server_get_display_number (X_SERVER (server))); - - // FIXME: Check return value - DISPLAY_SERVER_CLASS (x_server_xvnc_parent_class)->start (DISPLAY_SERVER (server)); - } + return x_server_xvnc_run; } -static void -stopped_cb (Process *process, XServerXVNC *server) +static gboolean +x_server_xvnc_get_log_stdout (XServerLocal *server) { - l_debug (server, "Xvnc server stopped"); - - g_clear_object (&server->priv->x_server_process); - - x_server_local_release_display_number (x_server_get_display_number (X_SERVER (server))); - - l_debug (server, "Removing X server authority %s", server->priv->authority_file); - - g_unlink (server->priv->authority_file); - g_free (server->priv->authority_file); - server->priv->authority_file = NULL; - - DISPLAY_SERVER_CLASS (x_server_xvnc_parent_class)->stop (DISPLAY_SERVER (server)); + return FALSE; } static gboolean @@ -177,139 +106,39 @@ return TRUE; } -static gboolean -x_server_xvnc_start (DisplayServer *display_server) +static void +x_server_xvnc_add_args (XServerLocal *x_server, GString *command) { - XServerXVNC *server = X_SERVER_XVNC (display_server); - XAuthority *authority; - gboolean result, backup_logs; - gchar *filename, *run_dir, *dir, *log_file, *absolute_command; - GString *command; - gchar hostname[1024], *number; - GError *error = NULL; - - g_return_val_if_fail (server->priv->x_server_process == NULL, FALSE); - - server->priv->got_signal = FALSE; - - server->priv->x_server_process = process_new (run_cb, server); - process_set_clear_environment (server->priv->x_server_process, TRUE); - g_signal_connect (server->priv->x_server_process, PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (got_signal_cb), server); - g_signal_connect (server->priv->x_server_process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), server); - - /* Setup logging */ - filename = g_strdup_printf ("%s.log", display_server_get_name (display_server)); - dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - log_file = g_build_filename (dir, filename, NULL); - backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); - process_set_log_file (server->priv->x_server_process, log_file, FALSE, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); - l_debug (display_server, "Logging to %s", log_file); - g_free (log_file); - g_free (filename); - g_free (dir); - - absolute_command = get_absolute_command (server->priv->command); - if (!absolute_command) - { - l_debug (display_server, "Can't launch X server %s, not found in path", server->priv->command); - stopped_cb (server->priv->x_server_process, X_SERVER_XVNC (server)); - return FALSE; - } - - gethostname (hostname, 1024); - number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (server))); - authority = x_authority_new_cookie (XAUTH_FAMILY_LOCAL, (guint8*) hostname, strlen (hostname), number); - - x_server_set_authority (X_SERVER (server), authority); - - run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); - dir = g_build_filename (run_dir, "root", NULL); - g_free (run_dir); - if (g_mkdir_with_parents (dir, S_IRWXU) < 0) - l_warning (display_server, "Failed to make authority directory %s: %s", dir, strerror (errno)); - - server->priv->authority_file = g_build_filename (dir, x_server_get_address (X_SERVER (server)), NULL); - g_free (dir); - - l_debug (display_server, "Writing X server authority to %s", server->priv->authority_file); - - x_authority_write (authority, XAUTH_WRITE_MODE_REPLACE, server->priv->authority_file, &error); - if (error) - l_warning (display_server, "Failed to write authority: %s", error->message); - g_clear_error (&error); - - command = g_string_new (absolute_command); - g_free (absolute_command); - - g_string_append_printf (command, " :%d", x_server_get_display_number (X_SERVER (server))); - g_string_append_printf (command, " -auth %s", server->priv->authority_file); - g_string_append (command, " -inetd -nolisten tcp"); + XServerXVNC *server = X_SERVER_XVNC (x_server); + + g_string_append (command, " -inetd"); + if (server->priv->width > 0 && server->priv->height > 0) g_string_append_printf (command, " -geometry %dx%d", server->priv->width, server->priv->height); + if (server->priv->depth > 0) g_string_append_printf (command, " -depth %d", server->priv->depth); - - process_set_command (server->priv->x_server_process, command->str); - g_string_free (command, TRUE); - - l_debug (display_server, "Launching Xvnc server"); - - /* Variable required for regression tests */ - if (g_getenv ("LIGHTDM_TEST_ROOT")) - { - process_set_env (server->priv->x_server_process, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT")); - process_set_env (server->priv->x_server_process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH")); - } - - result = process_start (server->priv->x_server_process, FALSE); - - if (result) - l_debug (display_server, "Waiting for ready signal from Xvnc server :%d", x_server_get_display_number (X_SERVER (server))); - - if (!result) - stopped_cb (server->priv->x_server_process, X_SERVER_XVNC (server)); - - return result; -} - -static void -x_server_xvnc_stop (DisplayServer *server) -{ - process_stop (X_SERVER_XVNC (server)->priv->x_server_process); } static void x_server_xvnc_init (XServerXVNC *server) { server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_XVNC_TYPE, XServerXVNCPrivate); - server->priv->command = g_strdup ("Xvnc"); server->priv->width = 1024; server->priv->height = 768; server->priv->depth = 8; } static void -x_server_xvnc_finalize (GObject *object) -{ - XServerXVNC *self = X_SERVER_XVNC (object); - - g_clear_object (&self->priv->x_server_process); - g_free (self->priv->command); - g_free (self->priv->authority_file); - - G_OBJECT_CLASS (x_server_xvnc_parent_class)->finalize (object); -} - -static void x_server_xvnc_class_init (XServerXVNCClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + XServerLocalClass *x_server_local_class = X_SERVER_LOCAL_CLASS (klass); DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass); + x_server_local_class->get_run_function = x_server_xvnc_get_run_function; + x_server_local_class->get_log_stdout = x_server_xvnc_get_log_stdout; + x_server_local_class->add_args = x_server_xvnc_add_args; display_server_class->get_can_share = x_server_xvnc_get_can_share; - display_server_class->start = x_server_xvnc_start; - display_server_class->stop = x_server_xvnc_stop; - object_class->finalize = x_server_xvnc_finalize; g_type_class_add_private (klass, sizeof (XServerXVNCPrivate)); } diff -Nru lightdm-1.18.1/src/x-server-xvnc.h lightdm-1.18.3/src/x-server-xvnc.h --- lightdm-1.18.1/src/x-server-xvnc.h 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/src/x-server-xvnc.h 2016-06-21 00:16:20.000000000 +0000 @@ -12,7 +12,7 @@ #ifndef X_SERVER_XVNC_H_ #define X_SERVER_XVNC_H_ -#include "x-server.h" +#include "x-server-local.h" G_BEGIN_DECLS @@ -24,13 +24,13 @@ typedef struct { - XServer parent_instance; + XServerLocal parent_instance; XServerXVNCPrivate *priv; } XServerXVNC; typedef struct { - XServerClass parent_class; + XServerLocalClass parent_class; void (*ready)(XServerXVNC *server); } XServerXVNCClass; @@ -41,8 +41,6 @@ XServerXVNC *x_server_xvnc_new (void); -void x_server_xvnc_set_command (XServerXVNC *server, const gchar *command); - void x_server_xvnc_set_socket (XServerXVNC *server, int fd); int x_server_xvnc_get_socket (XServerXVNC *server); @@ -51,8 +49,6 @@ void x_server_xvnc_set_depth (XServerXVNC *server, gint depth); -const gchar *x_server_xvnc_get_authority_file_path (XServerXVNC *server); - G_END_DECLS #endif /* X_SERVER_XVNC_H_ */ diff -Nru lightdm-1.18.1/tests/data/sessions/greeter.desktop lightdm-1.18.3/tests/data/sessions/greeter.desktop --- lightdm-1.18.1/tests/data/sessions/greeter.desktop 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/data/sessions/greeter.desktop 2016-06-29 02:15:32.000000000 +0000 @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=Test Session with greeter +Comment=LightDM test session that can run a greeter inside +Exec=test-session +X-LightDM-Allow-Greeter=true diff -Nru lightdm-1.18.1/tests/Makefile.am lightdm-1.18.3/tests/Makefile.am --- lightdm-1.18.1/tests/Makefile.am 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/Makefile.am 2016-08-11 23:35:41.000000000 +0000 @@ -166,6 +166,18 @@ test-switch-to-user-logout-inactive \ test-switch-to-user-resettable \ test-switch-to-users \ + test-session-greeter \ + test-session-greeter-autologin \ + test-session-greeter-reconnect \ + test-session-greeter-unlock \ + test-session-greeter-unlock-twice \ + test-session-greeter-switch \ + test-session-greeter-multiple-login \ + test-session-greeter-default-session \ + test-session-greeter-allow-guest \ + test-session-greeter-hide-users \ + test-session-greeter-show-manual-login \ + test-session-greeter-show-remote-login \ test-vnc-login \ test-vnc-command \ test-vnc-dimensions \ @@ -180,6 +192,7 @@ test-xdmcp-server-double-login \ test-xdmcp-server-guest \ test-xdmcp-server-keep-alive \ + test-xdmcp-server-hostname \ test-xdmcp-server-xdm-authentication \ test-xdmcp-server-xdm-authentication-missing-data \ test-xdmcp-server-xdm-authentication-short-data \ @@ -199,7 +212,7 @@ test-audit-autologin \ test-no-accounts-service \ test-console-kit \ - test-console-kit-no-xdg-runtime \ + test-console-kit-no-xdg-runtime \ test-no-console-kit \ test-no-login1 \ test-no-console-kit-or-login1 \ @@ -211,6 +224,9 @@ test-xdmcp-server-open-file-descriptors \ test-add-local-x-seat \ test-multi-seat \ + test-multi-seat-login \ + test-multi-seat-autologin-seat0 \ + test-multi-seat-autologin-seat1 \ test-multi-seat-seat0-non-graphical \ test-multi-seat-seat0-non-graphical-disabled \ test-multi-seat-non-graphical \ @@ -381,6 +397,7 @@ data/keys.conf \ data/sessions/alternative.desktop \ data/sessions/default.desktop \ + data/sessions/greeter.desktop \ data/sessions/mir.desktop \ data/sessions/mir-container.desktop \ data/sessions/named.desktop \ @@ -388,7 +405,7 @@ data/sessions/wayland.desktop \ scripts/0-additional.conf \ scripts/1-additional.conf \ - scripts/add-local-x-seat.conf \ + scripts/add-local-x-seat.conf \ scripts/additional-config.conf \ scripts/additional-config-priority.conf \ scripts/additional-system-config.conf \ @@ -423,7 +440,7 @@ scripts/change-authentication.conf \ scripts/cancel-authentication.conf \ scripts/console-kit.conf \ - scripts/console-kit-no-xdg-runtime.conf \ + scripts/console-kit-no-xdg-runtime.conf \ scripts/corrupt-xauthority.conf \ scripts/crash-authenticate.conf \ scripts/cred-error.conf \ @@ -503,8 +520,11 @@ scripts/mir-session-compositor-crash.conf \ scripts/mir-session-crash.conf \ scripts/multi-seat.conf \ + scripts/multi-seat-autologin-seat0.conf \ + scripts/multi-seat-autologin-seat1.conf \ scripts/multi-seat-change-graphical.conf \ scripts/multi-seat-change-graphical-disabled.conf \ + scripts/multi-seat-login.conf \ scripts/multi-seat-non-graphical.conf \ scripts/multi-seat-non-graphical-disabled.conf \ scripts/multi-seat-seat0-non-graphical.conf \ @@ -535,6 +555,18 @@ scripts/script-hook-greeter-setup-missing.conf \ scripts/script-hook-session-setup-fail.conf \ scripts/script-hook-session-setup-missing.conf \ + scripts/session-greeter.conf \ + scripts/session-greeter-allow-guest.conf \ + scripts/session-greeter-autologin.conf \ + scripts/session-greeter-default-session.conf \ + scripts/session-greeter-hide-users.conf \ + scripts/session-greeter-multiple-login.conf \ + scripts/session-greeter-reconnect.conf \ + scripts/session-greeter-show-manual-login.conf \ + scripts/session-greeter-show-remote-login.conf \ + scripts/session-greeter-switch.conf \ + scripts/session-greeter-unlock.conf \ + scripts/session-greeter-unlock-twice.conf \ scripts/session-stdout.conf \ scripts/session-stderr.conf \ scripts/session-stderr-multi-write.conf \ @@ -616,6 +648,7 @@ scripts/xdmcp-server-autologin.conf \ scripts/xdmcp-server-double-login.conf \ scripts/xdmcp-server-guest.conf \ + scripts/xdmcp-server-hostname.conf \ scripts/xdmcp-server-invalid-authentication.conf \ scripts/xdmcp-server-keep-alive.conf \ scripts/xdmcp-server-login.conf \ diff -Nru lightdm-1.18.1/tests/scripts/mir-autologin.conf lightdm-1.18.3/tests/scripts/mir-autologin.conf --- lightdm-1.18.1/tests/scripts/mir-autologin.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-autologin.conf 2016-06-21 00:41:00.000000000 +0000 @@ -10,7 +10,7 @@ #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Session starts diff -Nru lightdm-1.18.1/tests/scripts/mir-container-session.conf lightdm-1.18.3/tests/scripts/mir-container-session.conf --- lightdm-1.18.1/tests/scripts/mir-container-session.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-container-session.conf 2016-06-21 00:41:00.000000000 +0000 @@ -30,7 +30,7 @@ #?*GREETER-X-0 START-SESSION # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=8 XDG_VTNR=8 CONTAINER=TRUE +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=8 XDG_VTNR=8 CONTAINER=TRUE #?*UNITY-SYSTEM-COMPOSITOR READY # Switch to system compositor diff -Nru lightdm-1.18.1/tests/scripts/mir-greeter.conf lightdm-1.18.3/tests/scripts/mir-greeter.conf --- lightdm-1.18.1/tests/scripts/mir-greeter.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-greeter.conf 2016-06-21 00:41:00.000000000 +0000 @@ -6,7 +6,7 @@ #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Greeter starts diff -Nru lightdm-1.18.1/tests/scripts/mir-script-hooks.conf lightdm-1.18.3/tests/scripts/mir-script-hooks.conf --- lightdm-1.18.1/tests/scripts/mir-script-hooks.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-script-hooks.conf 2016-06-21 00:41:00.000000000 +0000 @@ -15,7 +15,7 @@ #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Script hooks run @@ -42,7 +42,7 @@ #?SCRIPT-HOOK DISPLAY-STOPPED # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 ENABLE-HARDWARE-CURSOR=TRUE XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 ENABLE-HARDWARE-CURSOR=TRUE XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Script hooks run diff -Nru lightdm-1.18.1/tests/scripts/mir-session-compositor-crash.conf lightdm-1.18.3/tests/scripts/mir-session-compositor-crash.conf --- lightdm-1.18.1/tests/scripts/mir-session-compositor-crash.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-session-compositor-crash.conf 2016-06-21 00:41:00.000000000 +0000 @@ -10,7 +10,7 @@ #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Session starts diff -Nru lightdm-1.18.1/tests/scripts/mir-session.conf lightdm-1.18.3/tests/scripts/mir-session.conf --- lightdm-1.18.1/tests/scripts/mir-session.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-session.conf 2016-06-21 00:41:00.000000000 +0000 @@ -30,7 +30,7 @@ #?*GREETER-X-0 START-SESSION # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=8 XDG_VTNR=8 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=8 XDG_VTNR=8 #?*UNITY-SYSTEM-COMPOSITOR READY # Switch to system compositor diff -Nru lightdm-1.18.1/tests/scripts/mir-session-crash.conf lightdm-1.18.3/tests/scripts/mir-session-crash.conf --- lightdm-1.18.1/tests/scripts/mir-session-crash.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/mir-session-crash.conf 2016-06-21 00:41:00.000000000 +0000 @@ -10,7 +10,7 @@ #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Session starts @@ -23,19 +23,19 @@ # Crash session #?*SESSION-MIR-session-0 CRASH -# Compositor is stopped -#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15 - # X server starts -#?XSERVER-0 START VT=7 SEAT=seat0 +#?XSERVER-0 START VT=8 SEAT=seat0 # Daemon connects when X server is ready #?*XSERVER-0 INDICATE-READY #?XSERVER-0 INDICATE-READY #?XSERVER-0 ACCEPT-CONNECT +# Switch to X +#?VT ACTIVATE VT=8 + # Greeter starts -#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_SESSION_CLASS=greeter +#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter #?LOGIN1 ACTIVATE-SESSION SESSION=c1 #?XSERVER-0 ACCEPT-CONNECT #?GREETER-X-0 CONNECT-XSERVER @@ -44,6 +44,7 @@ # Cleanup #?*STOP-DAEMON +#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15 #?GREETER-X-0 TERMINATE SIGNAL=15 #?XSERVER-0 TERMINATE SIGNAL=15 #?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/multi-seat-autologin-seat0.conf lightdm-1.18.3/tests/scripts/multi-seat-autologin-seat0.conf --- lightdm-1.18.1/tests/scripts/multi-seat-autologin-seat0.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/multi-seat-autologin-seat0.conf 2016-08-02 09:32:33.000000000 +0000 @@ -0,0 +1,42 @@ +# +# Check autologin works on one seat only +# + +[Seat:seat0] +autologin-user=have-password1 + +#?*START-DAEMON +#?RUNNER DAEMON-START + +# seat0 starts with autologin +#?XSERVER-0 START VT=7 SEAT=seat0 +#?*XSERVER-0 INDICATE-READY +#?XSERVER-0 INDICATE-READY +#?XSERVER-0 ACCEPT-CONNECT +#?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=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Add seat1 +#?*ADD-SEAT ID=seat1 + +# seat1 starts with greeter +#?XSERVER-1 START SEAT=seat1 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 START XDG_SEAT=seat1 XDG_SESSION_CLASS=greeter +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?GREETER-X-1 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/multi-seat-autologin-seat1.conf lightdm-1.18.3/tests/scripts/multi-seat-autologin-seat1.conf --- lightdm-1.18.1/tests/scripts/multi-seat-autologin-seat1.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/multi-seat-autologin-seat1.conf 2016-08-02 09:32:33.000000000 +0000 @@ -0,0 +1,42 @@ +# +# Check autologin works on one seat only +# + +[Seat:seat1] +autologin-user=have-password1 + +#?*START-DAEMON +#?RUNNER DAEMON-START + +# seat0 starts with greeter +#?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 + +# Add seat1 +#?*ADD-SEAT ID=seat1 + +# seat1 starts with autologin +#?XSERVER-1 START SEAT=seat1 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 START XDG_SEAT=seat1 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Cleanup +#?*STOP-DAEMON +#?GREETER-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/multi-seat-login.conf lightdm-1.18.3/tests/scripts/multi-seat-login.conf --- lightdm-1.18.1/tests/scripts/multi-seat-login.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/multi-seat-login.conf 2016-08-02 09:31:55.000000000 +0000 @@ -0,0 +1,65 @@ +# +# Check can log in on both seats +# + +#?*START-DAEMON +#?RUNNER DAEMON-START + +# seat0 starts +#?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 + +# Add seat1 +#?*ADD-SEAT ID=seat1 + +# seat1 starts +#?XSERVER-1 START SEAT=seat1 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 START XDG_SEAT=seat1 XDG_SESSION_CLASS=greeter +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON + +# Login seat0 +#?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1 +#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE +#?*GREETER-X-0 START-SESSION +#?GREETER-X-0 TERMINATE SIGNAL=15 + +# Session starts +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/no-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=no-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c2 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Login seat1 +#?*GREETER-X-1 AUTHENTICATE USERNAME=no-password2 +#?GREETER-X-1 AUTHENTICATION-COMPLETE USERNAME=no-password2 AUTHENTICATED=TRUE +#?*GREETER-X-1 START-SESSION +#?GREETER-X-1 TERMINATE SIGNAL=15 + +# Session starts +#?SESSION-X-1 START XDG_SEAT=seat1 XDG_GREETER_DATA_DIR=.*/no-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=no-password2 +#?LOGIN1 ACTIVATE-SESSION SESSION=c3 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-allow-guest.conf lightdm-1.18.3/tests/scripts/session-greeter-allow-guest.conf --- lightdm-1.18.1/tests/scripts/session-greeter-allow-guest.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-allow-guest.conf 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,38 @@ +# +# Check in-session greeter is informed if manual login should be showed (it defaults to show) +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter +greeter-allow-guest=false + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Check has correct hint to allow guest +#?SESSION-X-0 GREETER-HAS-GUEST-ACCOUNT-HINT=FALSE + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-autologin.conf lightdm-1.18.3/tests/scripts/session-greeter-autologin.conf --- lightdm-1.18.1/tests/scripts/session-greeter-autologin.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-autologin.conf 2016-07-11 21:51:57.000000000 +0000 @@ -0,0 +1,59 @@ +# +# Check can run greeter inside session after autologin +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into account with a password +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password2 +#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:" +#?*SESSION-X-0 GREETER-RESPOND TEXT="password" +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# New session starts +#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/have-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password2 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Switch to new session +#?VT ACTIVATE VT=8 +#?LOGIN1 LOCK-SESSION SESSION=c0 +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter.conf lightdm-1.18.3/tests/scripts/session-greeter.conf --- lightdm-1.18.1/tests/scripts/session-greeter.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter.conf 2016-07-11 21:51:57.000000000 +0000 @@ -0,0 +1,74 @@ +# +# Check can run greeter inside session +# + +[Seat:*] +user-session=greeter + +#?*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 into account with a password +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into account with a password +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password2 +#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:" +#?*SESSION-X-0 GREETER-RESPOND TEXT="password" +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# New session starts +#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/have-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password2 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Switch to new session +#?VT ACTIVATE VT=8 +#?LOGIN1 LOCK-SESSION SESSION=c1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c2 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-default-session.conf lightdm-1.18.3/tests/scripts/session-greeter-default-session.conf --- lightdm-1.18.1/tests/scripts/session-greeter-default-session.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-default-session.conf 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,39 @@ +# +# Check in-session greeter is informed of the default user session +# + +[Seat:*] +autologin-user=have-password1 +autologin-session=greeter +user-session=alternative + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Check has correct user session +#?*SESSION-X-0 GREETER-LOG-DEFAULT-SESSION +#?SESSION-X-0 GREETER-LOG-DEFAULT-SESSION SESSION=alternative + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-hide-users.conf lightdm-1.18.3/tests/scripts/session-greeter-hide-users.conf --- lightdm-1.18.1/tests/scripts/session-greeter-hide-users.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-hide-users.conf 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,38 @@ +# +# Check in-session greeter is informed if user list should be hidden +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter +greeter-hide-users=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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Check has correct hint to allow guest +#?SESSION-X-0 GREETER-HIDE-USERS-HINT + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-multiple-login.conf lightdm-1.18.3/tests/scripts/session-greeter-multiple-login.conf --- lightdm-1.18.1/tests/scripts/session-greeter-multiple-login.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-multiple-login.conf 2016-08-11 23:29:22.000000000 +0000 @@ -0,0 +1,65 @@ +# +# Check continuing to use an in-session greeter doesn't break things +# + +[Seat:*] +autologin-user=no-password1 +user-session=greeter + +#?*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 + +# Session starts +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/no-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=no-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into account with a password +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=no-password2 +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=no-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# New session starts +#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/no-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=no-password2 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Switch to new session +#?VT ACTIVATE VT=8 +#?LOGIN1 LOCK-SESSION SESSION=c0 +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# Log in again from the greeter +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=no-password2 +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=no-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# Session is activated again +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-reconnect.conf lightdm-1.18.3/tests/scripts/session-greeter-reconnect.conf --- lightdm-1.18.1/tests/scripts/session-greeter-reconnect.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-reconnect.conf 2016-07-29 03:51:27.000000000 +0000 @@ -0,0 +1,66 @@ +# +# Check can reconnect in-session greeter +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Stop greeter +#?*SESSION-X-0 GREETER-STOP + +# Re-start greeter +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into account with a password +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password2 +#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:" +#?*SESSION-X-0 GREETER-RESPOND TEXT="password" +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password2 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# New session starts +#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/have-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password2 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Switch to new session +#?VT ACTIVATE VT=8 +#?LOGIN1 LOCK-SESSION SESSION=c0 +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-show-manual-login.conf lightdm-1.18.3/tests/scripts/session-greeter-show-manual-login.conf --- lightdm-1.18.1/tests/scripts/session-greeter-show-manual-login.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-show-manual-login.conf 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,38 @@ +# +# Check in-session greeter is informed if manual login should be showed +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter +greeter-show-manual-login=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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Check has correct hint to allow guest +#?SESSION-X-0 GREETER-SHOW-MANUAL-LOGIN-HINT + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-show-remote-login.conf lightdm-1.18.3/tests/scripts/session-greeter-show-remote-login.conf --- lightdm-1.18.1/tests/scripts/session-greeter-show-remote-login.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-show-remote-login.conf 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,38 @@ +# +# Check in-session greeter is informed if remote login should be showed (it defaults to show) +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter +greeter-show-remote-login=false + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Check has correct hint to show remote login +#?SESSION-X-0 GREETER-SHOW-REMOTE-LOGIN-HINT=FALSE + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-switch.conf lightdm-1.18.3/tests/scripts/session-greeter-switch.conf --- lightdm-1.18.1/tests/scripts/session-greeter-switch.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-switch.conf 2016-08-11 23:29:09.000000000 +0000 @@ -0,0 +1,71 @@ +# +# Check can unlock existing session with an in-session greeter +# + +[Seat:*] +autologin-user=no-password1 +user-session=greeter + +#?*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 + +# Session starts +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/no-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=no-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start a second account +#?*SWITCH-TO-USER USERNAME=no-password2 +#?RUNNER SWITCH-TO-USER USERNAME=no-password2 + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 + +# Daemon connects when X server is ready +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# Session is locked +#?LOGIN1 LOCK-SESSION SESSION=c0 + +# New session starts +#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/no-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=no-password2 +#?XSERVER-1 ACCEPT-CONNECT +#?SESSION-X-1 CONNECT-XSERVER + +# Switch to session +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?VT ACTIVATE VT=8 + +# Start greeter inside session +#?*SESSION-X-1 GREETER-START +#?SESSION-X-1 GREETER-STARTED + +# Log into first account +#?*SESSION-X-1 GREETER-AUTHENTICATE USERNAME=no-password1 +#?SESSION-X-1 GREETER-AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE +#?*SESSION-X-1 GREETER-START-SESSION + +# Switch back to first session +#?VT ACTIVATE VT=7 +#?LOGIN1 UNLOCK-SESSION SESSION=c0 +#?LOGIN1 LOCK-SESSION SESSION=c1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 + +# Cleanup +#?*STOP-DAEMON +#?XSERVER-0 TERMINATE SIGNAL=15 +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?SESSION-X-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-unlock.conf lightdm-1.18.3/tests/scripts/session-greeter-unlock.conf --- lightdm-1.18.1/tests/scripts/session-greeter-unlock.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-unlock.conf 2016-07-29 03:51:46.000000000 +0000 @@ -0,0 +1,44 @@ +# +# Check can unlock user with an in-session greeter +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into our account +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1 +#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:" +#?*SESSION-X-0 GREETER-RESPOND TEXT="password" +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# We are reactivated +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/session-greeter-unlock-twice.conf lightdm-1.18.3/tests/scripts/session-greeter-unlock-twice.conf --- lightdm-1.18.1/tests/scripts/session-greeter-unlock-twice.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/session-greeter-unlock-twice.conf 2016-08-11 23:28:54.000000000 +0000 @@ -0,0 +1,54 @@ +# +# Check can unlock user with an in-session greeter and re-lock again +# + +[Seat:*] +autologin-user=have-password1 +user-session=greeter + +#?*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 + +# 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=greeter USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Start greeter inside session +#?*SESSION-X-0 GREETER-START +#?SESSION-X-0 GREETER-STARTED + +# Log into our account +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1 +#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:" +#?*SESSION-X-0 GREETER-RESPOND TEXT="password" +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# We are reactivated +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 + +# Authenticate again +#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1 +#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:" +#?*SESSION-X-0 GREETER-RESPOND TEXT="password" +#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE +#?*SESSION-X-0 GREETER-START-SESSION + +# We are reactivated +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/unity-mir-script-hooks.conf lightdm-1.18.3/tests/scripts/unity-mir-script-hooks.conf --- lightdm-1.18.1/tests/scripts/unity-mir-script-hooks.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/unity-mir-script-hooks.conf 2016-06-21 00:39:46.000000000 +0000 @@ -35,9 +35,7 @@ # Script hooks runs #?SCRIPT-HOOK SESSION-CLEANUP USER=have-password1 -# FIXME: order wrong here? #?SCRIPT-HOOK DISPLAY-SETUP -#?SCRIPT-HOOK DISPLAY-STOPPED #?SCRIPT-HOOK GREETER-SETUP USER=.* # Greeter starts diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-autologin.conf lightdm-1.18.3/tests/scripts/xdmcp-server-autologin.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-autologin.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-autologin.conf 2016-05-05 00:09:39.000000000 +0000 @@ -22,7 +22,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-double-login.conf lightdm-1.18.3/tests/scripts/xdmcp-server-double-login.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-double-login.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-double-login.conf 2016-05-05 00:09:39.000000000 +0000 @@ -21,7 +21,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" @@ -59,7 +59,7 @@ # Request to connect - daemon says OK #?*XSERVER-99 SEND-QUERY -#?XSERVER-99 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-99 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-99 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" MFID="TEST XSERVER" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-guest.conf lightdm-1.18.3/tests/scripts/xdmcp-server-guest.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-guest.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-guest.conf 2016-05-05 00:09:39.000000000 +0000 @@ -21,7 +21,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-hostname.conf lightdm-1.18.3/tests/scripts/xdmcp-server-hostname.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-hostname.conf 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-hostname.conf 2016-05-05 00:09:39.000000000 +0000 @@ -0,0 +1,45 @@ +# +# Check can set hostname for XDMCP server +# + +[LightDM] +start-default-seat=false + +[XDMCPServer] +enabled=true +hostname=xdmcp-test + +[Seat:*] +user-session=default +autologin-user=have-password1 + +#?*START-DAEMON +#?RUNNER DAEMON-START +#?*WAIT + +# Start a remote X server to log in with XDMCP +#?*START-XSERVER ARGS=":98 -query 127.0.0.1 -nolisten unix" +#?XSERVER-98 START LISTEN-TCP NO-LISTEN-UNIX + +# Request to connect - daemon says OK +#?*XSERVER-98 SEND-QUERY +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="xdmcp-test" STATUS="" + +# Connect - daemon says OK +#?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" +#?XSERVER-98 GOT-ACCEPT SESSION-ID=[0-9]+ AUTHENTICATION-NAME="" AUTHENTICATION-DATA= AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1" AUTHORIZATION-DATA=[0-9A-F]{32} +#?*XSERVER-98 SEND-MANAGE + +# LightDM connects to X server +#?XSERVER-98 ACCEPT-CONNECT + +# Session starts +#?SESSION-X-127.0.0.1:98 START XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-98 ACCEPT-CONNECT +#?SESSION-X-127.0.0.1:98 CONNECT-XSERVER + +# Clean up +#?*STOP-DAEMON +#?SESSION-X-127.0.0.1:98 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-invalid-authentication.conf lightdm-1.18.3/tests/scripts/xdmcp-server-invalid-authentication.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-invalid-authentication.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-invalid-authentication.conf 2016-05-05 00:09:39.000000000 +0000 @@ -18,7 +18,7 @@ # Connect with an invalid authentication name - daemon says no #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="NO-SUCH-AUTHENTICATION" -#?XSERVER-98 GOT-UNWILLING HOSTNAME="" STATUS="No matching authentication" +#?XSERVER-98 GOT-UNWILLING HOSTNAME="lightdm-test" STATUS="No matching authentication" # Try anyway - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="NO-SUCH-AUTHENTICATION" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-keep-alive.conf lightdm-1.18.3/tests/scripts/xdmcp-server-keep-alive.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-keep-alive.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-keep-alive.conf 2016-05-05 00:09:39.000000000 +0000 @@ -22,7 +22,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-login.conf lightdm-1.18.3/tests/scripts/xdmcp-server-login.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-login.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-login.conf 2016-05-05 00:09:39.000000000 +0000 @@ -21,7 +21,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-open-file-descriptors.conf lightdm-1.18.3/tests/scripts/xdmcp-server-open-file-descriptors.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-open-file-descriptors.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-open-file-descriptors.conf 2016-05-05 00:09:39.000000000 +0000 @@ -21,7 +21,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-request-invalid-authentication.conf lightdm-1.18.3/tests/scripts/xdmcp-server-request-invalid-authentication.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-request-invalid-authentication.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-request-invalid-authentication.conf 2016-05-05 00:09:39.000000000 +0000 @@ -18,7 +18,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect with an invalid authentication - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="NO-SUCH-AUTHENTICATION" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-request-invalid-authorization.conf lightdm-1.18.3/tests/scripts/xdmcp-server-request-invalid-authorization.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-request-invalid-authorization.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-request-invalid-authorization.conf 2016-05-05 00:09:39.000000000 +0000 @@ -18,7 +18,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect with an invalid authorization - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="NO-SUCH-AUTHORIZATION" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-request-without-addresses.conf lightdm-1.18.3/tests/scripts/xdmcp-server-request-without-addresses.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-request-without-addresses.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-request-without-addresses.conf 2016-05-05 00:09:39.000000000 +0000 @@ -18,7 +18,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect without providing an address - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-request-without-authorization.conf lightdm-1.18.3/tests/scripts/xdmcp-server-request-without-authorization.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-request-without-authorization.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-request-without-authorization.conf 2016-05-05 00:09:39.000000000 +0000 @@ -18,7 +18,7 @@ # Request to connect - daemon says OK #?*XSERVER-98 SEND-QUERY -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="lightdm-test" STATUS="" # Connect without authorization - daemon says no #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication.conf 2016-05-05 00:09:39.000000000 +0000 @@ -23,7 +23,7 @@ # Request to connect with XDM authentication - daemon says OK #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="XDM-AUTHENTICATION-1" -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="lightdm-test" STATUS="" # Connect - daemon says OK #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" AUTHENTICATION-DATA="0123456789ABCDEF" AUTHORIZATION-NAMES="XDM-AUTHORIZATION-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-invalid-authorization.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-invalid-authorization.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-invalid-authorization.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-invalid-authorization.conf 2016-05-05 00:09:39.000000000 +0000 @@ -19,7 +19,7 @@ # Request to connect with XDM authentication - daemon says OK #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="XDM-AUTHENTICATION-1" -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="lightdm-test" STATUS="" # Connect with wrong authorization - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" AUTHENTICATION-DATA="0123456789ABCDEF" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-long-data.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-long-data.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-long-data.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-long-data.conf 2016-05-05 00:09:39.000000000 +0000 @@ -19,7 +19,7 @@ # Request to connect with XDM authentication - daemon says OK #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="XDM-AUTHENTICATION-1" -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="lightdm-test" STATUS="" # Connect without any authentication data - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" AUTHENTICATION-DATA="DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF" AUTHORIZATION-NAMES="XDM-AUTHORIZATION-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-missing-data.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-missing-data.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-missing-data.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-missing-data.conf 2016-05-05 00:09:39.000000000 +0000 @@ -19,7 +19,7 @@ # Request to connect with XDM authentication - daemon says OK #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="XDM-AUTHENTICATION-1" -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="lightdm-test" STATUS="" # Connect without any authentication data - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" AUTHENTICATION-DATA="" AUTHORIZATION-NAMES="XDM-AUTHORIZATION-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-no-key.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-no-key.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-no-key.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-no-key.conf 2016-05-05 00:09:39.000000000 +0000 @@ -18,7 +18,7 @@ # Request to connect with XDM authentication - daemon says we don't do that #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="XDM-AUTHENTICATION-1" -#?XSERVER-98 GOT-UNWILLING HOSTNAME="" STATUS="No matching authentication" +#?XSERVER-98 GOT-UNWILLING HOSTNAME="lightdm-test" STATUS="No matching authentication" # Try anyway - daemon rejects #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" AUTHORIZATION-NAME="XDM-AUTHORIZATION-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-required.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-required.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-required.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-required.conf 2016-05-05 00:09:39.000000000 +0000 @@ -19,7 +19,7 @@ # Request to connection without authentication - daemon says we don't do that #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="" -#?XSERVER-98 GOT-UNWILLING HOSTNAME="" STATUS="No matching authentication, server requires XDM-AUTHENTICATION-1" +#?XSERVER-98 GOT-UNWILLING HOSTNAME="lightdm-test" STATUS="No matching authentication, server requires XDM-AUTHENTICATION-1" # Try anyway - daemon rejects #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="" AUTHORIZATION-NAMES="XDM-AUTHORIZATION-1" diff -Nru lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-short-data.conf lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-short-data.conf --- lightdm-1.18.1/tests/scripts/xdmcp-server-xdm-authentication-short-data.conf 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/scripts/xdmcp-server-xdm-authentication-short-data.conf 2016-05-05 00:09:39.000000000 +0000 @@ -19,7 +19,7 @@ # Request to connect with XDM authentication - daemon says OK #?*XSERVER-98 SEND-QUERY AUTHENTICATION-NAMES="XDM-AUTHENTICATION-1" -#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="" STATUS="" +#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" HOSTNAME="lightdm-test" STATUS="" # Connect without any authentication data - daemon declines #?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHENTICATION-NAME="XDM-AUTHENTICATION-1" AUTHENTICATION-DATA="00" AUTHORIZATION-NAMES="XDM-AUTHORIZATION-1" diff -Nru lightdm-1.18.1/tests/src/libsystem.c lightdm-1.18.3/tests/src/libsystem.c --- lightdm-1.18.1/tests/src/libsystem.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/src/libsystem.c 2016-06-29 02:15:32.000000000 +0000 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -72,6 +73,13 @@ struct pam_conv conversation; }; +int +gethostname (char *name, size_t len) +{ + snprintf (name, len, "lightdm-test"); + return 0; +} + uid_t getuid (void) { @@ -609,35 +617,48 @@ bind (int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int port = 0, redirected_port = 0; + const char *path; int (*_bind) (int sockfd, const struct sockaddr *addr, socklen_t addrlen); const struct sockaddr *modified_addr = addr; - struct sockaddr_in temp_addr; - struct sockaddr_in6 temp_addr6; + struct sockaddr_in temp_addr_in; + struct sockaddr_in6 temp_addr_in6; + struct sockaddr_un temp_addr_un; int retval; _bind = (int (*)(int sockfd, const struct sockaddr *addr, socklen_t addrlen)) dlsym (RTLD_NEXT, "bind"); switch (addr->sa_family) { + case AF_UNIX: + path = ((const struct sockaddr_un *) addr)->sun_path; + if (path[0] != '\0') + { + gchar *new_path = redirect_path (path); + memcpy (&temp_addr_un, addr, sizeof (struct sockaddr_un)); + strncpy (temp_addr_un.sun_path, new_path, sizeof (temp_addr_un.sun_path) - 1); + g_free (new_path); + modified_addr = (struct sockaddr *) &temp_addr_un; + } + break; case AF_INET: port = ntohs (((const struct sockaddr_in *) addr)->sin_port); redirected_port = find_port_redirect (port); - memcpy (&temp_addr, addr, sizeof (struct sockaddr_in)); - modified_addr = (struct sockaddr *) &temp_addr; + memcpy (&temp_addr_in, addr, sizeof (struct sockaddr_in)); + modified_addr = (struct sockaddr *) &temp_addr_in; if (redirected_port != 0) - temp_addr.sin_port = htons (redirected_port); + temp_addr_in.sin_port = htons (redirected_port); else - temp_addr.sin_port = 0; + temp_addr_in.sin_port = 0; break; case AF_INET6: port = ntohs (((const struct sockaddr_in6 *) addr)->sin6_port); redirected_port = find_port_redirect (port); - memcpy (&temp_addr6, addr, sizeof (struct sockaddr_in6)); - modified_addr = (struct sockaddr *) &temp_addr6; + memcpy (&temp_addr_in6, addr, sizeof (struct sockaddr_in6)); + modified_addr = (struct sockaddr *) &temp_addr_in6; if (redirected_port != 0) - temp_addr6.sin6_port = htons (redirected_port); + temp_addr_in6.sin6_port = htons (redirected_port); else - temp_addr6.sin6_port = 0; + temp_addr_in6.sin6_port = 0; break; } @@ -647,20 +668,20 @@ switch (addr->sa_family) { case AF_INET: - temp_addr_len = sizeof (temp_addr); - getsockname (sockfd, &temp_addr, &temp_addr_len); + temp_addr_len = sizeof (temp_addr_in); + getsockname (sockfd, &temp_addr_in, &temp_addr_len); if (redirected_port == 0) { - redirected_port = ntohs (temp_addr.sin_port); + redirected_port = ntohs (temp_addr_in.sin_port); add_port_redirect (port, redirected_port); } break; case AF_INET6: - temp_addr_len = sizeof (temp_addr6); - getsockname (sockfd, &temp_addr6, &temp_addr_len); + temp_addr_len = sizeof (temp_addr_in6); + getsockname (sockfd, &temp_addr_in6, &temp_addr_len); if (redirected_port == 0) { - redirected_port = ntohs (temp_addr6.sin6_port); + redirected_port = ntohs (temp_addr_in6.sin6_port); add_port_redirect (port, redirected_port); } break; @@ -669,27 +690,42 @@ return retval; } +#include + int connect (int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int port, redirected_port; + const char *path; const struct sockaddr *modified_addr = addr; - struct sockaddr_in temp_addr; - struct sockaddr_in6 temp_addr6; + struct sockaddr_in temp_addr_in; + struct sockaddr_in6 temp_addr_in6; + struct sockaddr_un temp_addr_un; int (*_connect) (int sockfd, const struct sockaddr *addr, socklen_t addrlen); _connect = (int (*)(int sockfd, const struct sockaddr *addr, socklen_t addrlen)) dlsym (RTLD_NEXT, "connect"); switch (addr->sa_family) { + case AF_UNIX: + path = ((const struct sockaddr_un *) addr)->sun_path; + if (path[0] != '\0') + { + gchar *new_path = redirect_path (path); + memcpy (&temp_addr_un, addr, addrlen); + strncpy (temp_addr_un.sun_path, new_path, sizeof (temp_addr_un.sun_path) - 1); + g_free (new_path); + modified_addr = (struct sockaddr *) &temp_addr_un; + } + break; case AF_INET: port = ntohs (((const struct sockaddr_in *) addr)->sin_port); redirected_port = find_port_redirect (port); if (redirected_port != 0) { - memcpy (&temp_addr, addr, sizeof (struct sockaddr_in)); - temp_addr.sin_port = htons (redirected_port); - modified_addr = (struct sockaddr *) &temp_addr; + memcpy (&temp_addr_in, addr, sizeof (struct sockaddr_in)); + temp_addr_in.sin_port = htons (redirected_port); + modified_addr = (struct sockaddr *) &temp_addr_in; } break; case AF_INET6: @@ -697,9 +733,9 @@ redirected_port = find_port_redirect (port); if (redirected_port != 0) { - memcpy (&temp_addr6, addr, sizeof (struct sockaddr_in6)); - temp_addr6.sin6_port = htons (redirected_port); - modified_addr = (struct sockaddr *) &temp_addr6; + memcpy (&temp_addr_in6, addr, sizeof (struct sockaddr_in6)); + temp_addr_in6.sin6_port = htons (redirected_port); + modified_addr = (struct sockaddr *) &temp_addr_in6; } break; } @@ -711,23 +747,36 @@ sendto (int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { int port, redirected_port; + const char *path; const struct sockaddr *modified_addr = dest_addr; - struct sockaddr_in temp_addr; - struct sockaddr_in6 temp_addr6; + struct sockaddr_in temp_addr_in; + struct sockaddr_in6 temp_addr_in6; + struct sockaddr_un temp_addr_un; ssize_t (*_sendto) (int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); _sendto = (ssize_t (*)(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)) dlsym (RTLD_NEXT, "sendto"); switch (dest_addr->sa_family) { + case AF_UNIX: + path = ((const struct sockaddr_un *) dest_addr)->sun_path; + if (path[0] != '\0') + { + gchar *new_path = redirect_path (path); + memcpy (&temp_addr_un, dest_addr, sizeof (struct sockaddr_un)); + strncpy (temp_addr_un.sun_path, new_path, sizeof (temp_addr_un.sun_path) - 1); + g_free (new_path); + modified_addr = (struct sockaddr *) &temp_addr_un; + } + break; case AF_INET: port = ntohs (((const struct sockaddr_in *) dest_addr)->sin_port); redirected_port = find_port_redirect (port); if (redirected_port != 0) { - memcpy (&temp_addr, dest_addr, sizeof (struct sockaddr_in)); - temp_addr.sin_port = htons (redirected_port); - modified_addr = (struct sockaddr *) &temp_addr; + memcpy (&temp_addr_in, dest_addr, sizeof (struct sockaddr_in)); + temp_addr_in.sin_port = htons (redirected_port); + modified_addr = (struct sockaddr *) &temp_addr_in; } break; case AF_INET6: @@ -735,9 +784,9 @@ redirected_port = find_port_redirect (port); if (redirected_port != 0) { - memcpy (&temp_addr6, dest_addr, sizeof (struct sockaddr_in6)); - temp_addr6.sin6_port = htons (redirected_port); - modified_addr = (struct sockaddr *) &temp_addr6; + memcpy (&temp_addr_in6, dest_addr, sizeof (struct sockaddr_in6)); + temp_addr_in6.sin6_port = htons (redirected_port); + modified_addr = (struct sockaddr *) &temp_addr_in6; } break; } diff -Nru lightdm-1.18.1/tests/src/Makefile.am lightdm-1.18.3/tests/src/Makefile.am --- lightdm-1.18.1/tests/src/Makefile.am 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/src/Makefile.am 2016-06-29 02:15:32.000000000 +0000 @@ -195,11 +195,14 @@ test_session_SOURCES = test-session.c status.c status.h test_session_CFLAGS = \ + -I$(top_srcdir)/liblightdm-gobject \ $(WARN_CFLAGS) \ $(GLIB_CFLAGS) \ $(GIO_UNIX_CFLAGS) \ $(XCB_CFLAGS) test_session_LDADD = \ + -L$(top_builddir)/liblightdm-gobject \ + -llightdm-gobject-1 \ $(GLIB_LIBS) \ $(GIO_UNIX_LIBS) \ $(XCB_LIBS) diff -Nru lightdm-1.18.1/tests/src/test-gobject-greeter.c lightdm-1.18.3/tests/src/test-gobject-greeter.c --- lightdm-1.18.1/tests/src/test-gobject-greeter.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/src/test-gobject-greeter.c 2016-06-21 00:20:11.000000000 +0000 @@ -407,7 +407,7 @@ int main (int argc, char **argv) { - gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *xdg_session_type, *mir_socket, *mir_vt, *mir_id, *path; + gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *xdg_session_type, *mir_server_host_socket, *mir_vt, *mir_id, *path; GString *status_text; #if !defined(GLIB_VERSION_2_36) @@ -420,7 +420,7 @@ xdg_session_cookie = getenv ("XDG_SESSION_COOKIE"); xdg_session_class = getenv ("XDG_SESSION_CLASS"); xdg_session_type = getenv ("XDG_SESSION_TYPE"); - mir_socket = getenv ("MIR_SOCKET"); + mir_server_host_socket = getenv ("MIR_SERVER_HOST_SOCKET"); mir_vt = getenv ("MIR_SERVER_VT"); mir_id = getenv ("MIR_SERVER_NAME"); if (display) @@ -432,7 +432,7 @@ } else if (mir_id) greeter_id = g_strdup_printf ("GREETER-MIR-%s", mir_id); - else if (mir_socket || mir_vt) + else if (mir_server_host_socket || mir_vt) greeter_id = g_strdup ("GREETER-MIR"); else if (g_strcmp0 (xdg_session_type, "wayland") == 0) greeter_id = g_strdup ("GREETER-WAYLAND"); diff -Nru lightdm-1.18.1/tests/src/test-session.c lightdm-1.18.3/tests/src/test-session.c --- lightdm-1.18.1/tests/src/test-session.c 2016-04-05 00:05:09.000000000 +0000 +++ lightdm-1.18.3/tests/src/test-session.c 2016-08-11 23:30:50.000000000 +0000 @@ -11,6 +11,7 @@ #include #include #include +#include #include "status.h" @@ -24,6 +25,8 @@ static xcb_connection_t *connection; +static LightDMGreeter *greeter = NULL; + static gboolean sigint_cb (gpointer user_data) { @@ -41,8 +44,36 @@ } static void +show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type) +{ + status_notify ("%s GREETER-SHOW-MESSAGE TEXT=\"%s\"", session_id, text); +} + +static void +show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type) +{ + status_notify ("%s GREETER-SHOW-PROMPT TEXT=\"%s\"", session_id, text); +} + +static void +authentication_complete_cb (LightDMGreeter *greeter) +{ + if (lightdm_greeter_get_authentication_user (greeter)) + status_notify ("%s GREETER-AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s", + session_id, + lightdm_greeter_get_authentication_user (greeter), + lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE"); + else + status_notify ("%s GREETER-AUTHENTICATION-COMPLETE AUTHENTICATED=%s", + session_id, + lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE"); +} + +static void request_cb (const gchar *name, GHashTable *params) { + GError *error = NULL; + if (!name) { g_main_loop_quit (loop); @@ -224,12 +255,86 @@ else status_notify ("%s WRITE-SHARED-DATA ERROR=NO_XDG_GREETER_DATA_DIR", session_id); } + + else if (strcmp (name, "GREETER-START") == 0) + { + int timeout; + GError *error = NULL; + + g_assert (greeter == NULL); + greeter = lightdm_greeter_new (); + g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE, G_CALLBACK (show_message_cb), NULL); + g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT, G_CALLBACK (show_prompt_cb), NULL); + g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), NULL); + if (lightdm_greeter_connect_to_daemon_sync (greeter, &error)) + status_notify ("%s GREETER-STARTED", session_id); + else + status_notify ("%s GREETER-FAILED", session_id); + + if (lightdm_greeter_get_select_user_hint (greeter)) + status_notify ("%s GREETER-SELECT-USER-HINT USERNAME=%s", session_id, lightdm_greeter_get_select_user_hint (greeter)); + if (lightdm_greeter_get_select_guest_hint (greeter)) + status_notify ("%s GREETER-SELECT-GUEST-HINT", session_id); + if (lightdm_greeter_get_lock_hint (greeter)) + status_notify ("%s GREETER-LOCK-HINT", session_id); + if (!lightdm_greeter_get_has_guest_account_hint (greeter)) + status_notify ("%s GREETER-HAS-GUEST-ACCOUNT-HINT=FALSE", session_id); + if (lightdm_greeter_get_hide_users_hint (greeter)) + status_notify ("%s GREETER-HIDE-USERS-HINT", session_id); + if (lightdm_greeter_get_show_manual_login_hint (greeter)) + status_notify ("%s GREETER-SHOW-MANUAL-LOGIN-HINT", session_id); + if (!lightdm_greeter_get_show_remote_login_hint (greeter)) + status_notify ("%s GREETER-SHOW-REMOTE-LOGIN-HINT=FALSE", session_id); + timeout = lightdm_greeter_get_autologin_timeout_hint (greeter); + if (lightdm_greeter_get_autologin_user_hint (greeter)) + { + if (timeout != 0) + status_notify ("%s GREETER-AUTOLOGIN-USER USERNAME=%s TIMEOUT=%d", session_id, lightdm_greeter_get_autologin_user_hint (greeter), timeout); + else + status_notify ("%s GREETER-AUTOLOGIN-USER USERNAME=%s", session_id, lightdm_greeter_get_autologin_user_hint (greeter)); + } + else if (lightdm_greeter_get_autologin_guest_hint (greeter)) + { + if (timeout != 0) + status_notify ("%s GREETER-AUTOLOGIN-GUEST TIMEOUT=%d", session_id, timeout); + else + status_notify ("%s GREETER-AUTOLOGIN-GUEST", session_id); + } + } + + else if (strcmp (name, "GREETER-LOG-DEFAULT-SESSION") == 0) + status_notify ("%s GREETER-LOG-DEFAULT-SESSION SESSION=%s", session_id, lightdm_greeter_get_default_session_hint (greeter)); + + else if (strcmp (name, "GREETER-AUTHENTICATE") == 0) + { + lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME")); + } + + else if (strcmp (name, "GREETER-RESPOND") == 0) + { + lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT")); + } + + else if (strcmp (name, "GREETER-START-SESSION") == 0) + { + if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), &error)) + { + status_notify ("%s FAIL-START-SESSION ERROR=%s", session_id, error->message); + g_clear_error (&error); + } + } + + else if (strcmp (name, "GREETER-STOP") == 0) + { + g_assert (greeter != NULL); + g_clear_object (&greeter); + } } int main (int argc, char **argv) { - gchar *display, *xdg_seat, *xdg_vtnr, *xdg_current_desktop, *xdg_greeter_data_dir, *xdg_session_cookie, *xdg_session_class, *xdg_session_type, *xdg_session_desktop, *mir_socket, *mir_vt, *mir_id; + gchar *display, *xdg_seat, *xdg_vtnr, *xdg_current_desktop, *xdg_greeter_data_dir, *xdg_session_cookie, *xdg_session_class, *xdg_session_type, *xdg_session_desktop, *mir_server_host_socket, *mir_vt, *mir_id; GString *status_text; int fd, open_max; @@ -242,7 +347,7 @@ xdg_session_class = getenv ("XDG_SESSION_CLASS"); xdg_session_type = getenv ("XDG_SESSION_TYPE"); xdg_session_desktop = getenv ("XDG_SESSION_DESKTOP"); - mir_socket = getenv ("MIR_SOCKET"); + mir_server_host_socket = getenv ("MIR_SERVER_HOST_SOCKET"); mir_vt = getenv ("MIR_SERVER_VT"); mir_id = getenv ("MIR_SERVER_NAME"); if (display) @@ -254,7 +359,7 @@ } else if (mir_id) session_id = g_strdup_printf ("SESSION-MIR-%s", mir_id); - else if (mir_socket || mir_vt) + else if (mir_server_host_socket || mir_vt) session_id = g_strdup ("SESSION-MIR"); else if (g_strcmp0 (xdg_session_type, "wayland") == 0) session_id = g_strdup ("SESSION-WAYLAND"); diff -Nru lightdm-1.18.1/tests/test-multi-seat-autologin-seat0 lightdm-1.18.3/tests/test-multi-seat-autologin-seat0 --- lightdm-1.18.1/tests/test-multi-seat-autologin-seat0 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-multi-seat-autologin-seat0 2016-08-02 09:32:33.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner multi-seat-autologin-seat0 test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-multi-seat-autologin-seat1 lightdm-1.18.3/tests/test-multi-seat-autologin-seat1 --- lightdm-1.18.1/tests/test-multi-seat-autologin-seat1 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-multi-seat-autologin-seat1 2016-08-02 09:32:33.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner multi-seat-autologin-seat1 test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-multi-seat-login lightdm-1.18.3/tests/test-multi-seat-login --- lightdm-1.18.1/tests/test-multi-seat-login 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-multi-seat-login 2016-08-02 09:31:55.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner multi-seat-login test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter lightdm-1.18.3/tests/test-session-greeter --- lightdm-1.18.1/tests/test-session-greeter 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter 2016-06-29 02:15:32.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-allow-guest lightdm-1.18.3/tests/test-session-greeter-allow-guest --- lightdm-1.18.1/tests/test-session-greeter-allow-guest 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-allow-guest 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-allow-guest test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-autologin lightdm-1.18.3/tests/test-session-greeter-autologin --- lightdm-1.18.1/tests/test-session-greeter-autologin 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-autologin 2016-07-11 21:51:57.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-autologin test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-default-session lightdm-1.18.3/tests/test-session-greeter-default-session --- lightdm-1.18.1/tests/test-session-greeter-default-session 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-default-session 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-default-session test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-hide-users lightdm-1.18.3/tests/test-session-greeter-hide-users --- lightdm-1.18.1/tests/test-session-greeter-hide-users 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-hide-users 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-hide-users test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-multiple-login lightdm-1.18.3/tests/test-session-greeter-multiple-login --- lightdm-1.18.1/tests/test-session-greeter-multiple-login 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-multiple-login 2016-08-11 23:29:22.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-multiple-login test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-reconnect lightdm-1.18.3/tests/test-session-greeter-reconnect --- lightdm-1.18.1/tests/test-session-greeter-reconnect 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-reconnect 2016-07-29 03:51:27.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-reconnect test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-show-manual-login lightdm-1.18.3/tests/test-session-greeter-show-manual-login --- lightdm-1.18.1/tests/test-session-greeter-show-manual-login 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-show-manual-login 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-show-manual-login test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-show-remote-login lightdm-1.18.3/tests/test-session-greeter-show-remote-login --- lightdm-1.18.1/tests/test-session-greeter-show-remote-login 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-show-remote-login 2016-08-11 23:29:44.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-show-remote-login test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-switch lightdm-1.18.3/tests/test-session-greeter-switch --- lightdm-1.18.1/tests/test-session-greeter-switch 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-switch 2016-08-11 23:29:09.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-switch test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-unlock lightdm-1.18.3/tests/test-session-greeter-unlock --- lightdm-1.18.1/tests/test-session-greeter-unlock 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-unlock 2016-07-29 03:51:46.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-unlock test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-session-greeter-unlock-twice lightdm-1.18.3/tests/test-session-greeter-unlock-twice --- lightdm-1.18.1/tests/test-session-greeter-unlock-twice 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-session-greeter-unlock-twice 2016-08-11 23:28:54.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-unlock-twice test-gobject-greeter diff -Nru lightdm-1.18.1/tests/test-xdmcp-server-hostname lightdm-1.18.3/tests/test-xdmcp-server-hostname --- lightdm-1.18.1/tests/test-xdmcp-server-hostname 1970-01-01 00:00:00.000000000 +0000 +++ lightdm-1.18.3/tests/test-xdmcp-server-hostname 2016-05-05 00:09:39.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner xdmcp-server-hostname test-gobject-greeter