diff --git a/.gdm.metadata b/.gdm.metadata index bc466e4..8c47fa9 100644 --- a/.gdm.metadata +++ b/.gdm.metadata @@ -1 +1 @@ -19582495748efdf3d4a20cf8b0e90d0d17c57558 SOURCES/gdm-3.22.3.tar.xz +f0ecbe867bd0ef2b085ef79a56655f51bbef3193 SOURCES/gdm-3.26.2.1.tar.xz diff --git a/.gitignore b/.gitignore index f652268..a865c9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/gdm-3.22.3.tar.xz +SOURCES/gdm-3.26.2.1.tar.xz diff --git a/SOURCES/0001-Honor-initial-setup-being-disabled-by-distro-install.patch b/SOURCES/0001-Honor-initial-setup-being-disabled-by-distro-install.patch index 96a78f5..bb44070 100644 --- a/SOURCES/0001-Honor-initial-setup-being-disabled-by-distro-install.patch +++ b/SOURCES/0001-Honor-initial-setup-being-disabled-by-distro-install.patch @@ -1,4 +1,4 @@ -From fa5733788ae5f8e8caeb07e956be370e96f9b6b1 Mon Sep 17 00:00:00 2001 +From d4f6b620c4c1b56e7e6421cc470eb711d7faa0eb Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Mon, 23 Jan 2017 20:19:51 +0100 Subject: [PATCH] Honor initial setup being disabled by distro installer @@ -19,10 +19,24 @@ https://bugzilla.gnome.org/show_bug.cgi?id=777708 2 files changed, 30 insertions(+) diff --git a/daemon/Makefile.am b/daemon/Makefile.am -index ab5dda0..786e0c5 100644 +index 5e9eb5e0..3b1b1512 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am -@@ -14,6 +14,7 @@ AM_CPPFLAGS = \ +@@ -1,47 +1,48 @@ + NULL = + + AM_CPPFLAGS = \ + -I. \ + -I.. \ + -I$(top_srcdir)/common \ + -I$(top_srcdir)/pam-extensions \ + -I$(top_builddir)/common \ + -DBINDIR=\"$(bindir)\" \ + -DDATADIR=\"$(datadir)\" \ + -DDMCONFDIR=\"$(dmconfdir)\" \ + -DGDMCONFDIR=\"$(gdmconfdir)\" \ + -DLIBDIR=\"$(libdir)\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ -DLOCALSTATEDIR=\"$(localstatedir)\" \ -DLOGDIR=\"$(logdir)\" \ -DSBINDIR=\"$(sbindir)\" \ @@ -30,14 +44,69 @@ index ab5dda0..786e0c5 100644 -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ -DGDM_RUN_DIR=\"$(GDM_RUN_DIR)\" \ -DGDM_XAUTH_DIR=\"$(GDM_XAUTH_DIR)\" \ + -DGDM_SCREENSHOT_DIR=\"$(GDM_SCREENSHOT_DIR)\" \ + -DGDM_CACHE_DIR=\""$(localstatedir)/cache/gdm"\" \ + -DGDM_SESSION_DEFAULT_PATH=\"$(GDM_SESSION_DEFAULT_PATH)\" \ + $(DISABLE_DEPRECATED_CFLAGS) \ + $(DAEMON_CFLAGS) \ + $(XLIB_CFLAGS) \ + $(WARN_CFLAGS) \ + $(DEBUG_CFLAGS) \ + $(SYSTEMD_CFLAGS) \ + $(JOURNALD_CFLAGS) \ + $(LIBSELINUX_CFLAGS) \ + -DLANG_CONFIG_FILE=\"$(LANG_CONFIG_FILE)\" \ + $(NULL) + + BUILT_SOURCES = \ + gdm-display-glue.h \ + gdm-manager-glue.h \ + gdm-local-display-glue.h \ + gdm-local-display-factory-glue.h \ + gdm-session-glue.h \ + gdm-session-worker-glue.h \ + gdm-session-enum-types.h \ + $(NULL) + + gdm-session-enum-types.h: gdm-session-enum-types.h.in gdm-session.h + $(AM_V_GEN) glib-mkenums --template $^ > $@ + diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c -index 0057e2c..2af8e13 100644 +index 6a3984a9..30723da0 100644 --- a/daemon/gdm-display.c +++ b/daemon/gdm-display.c -@@ -1456,6 +1456,31 @@ can_create_environment (const char *session_id) +@@ -1522,100 +1522,129 @@ kernel_cmdline_initial_setup_force_state (gboolean *force_state) + GError *error = NULL; + gchar *contents = NULL; + gchar *setup_argument = NULL; + + g_return_val_if_fail (force_state != NULL, FALSE); + + if (!g_file_get_contents ("/proc/cmdline", &contents, NULL, &error)) { + g_debug ("GdmDisplay: Could not check kernel parameters, not forcing initial setup: %s", + error->message); + g_clear_error (&error); + return FALSE; + } + + g_debug ("GdmDisplay: Checking kernel command buffer %s", contents); + + if (!kernel_cmdline_initial_setup_argument (contents, &setup_argument, &error)) { + g_debug ("GdmDisplay: Failed to read kernel commandline: %s", error->message); + g_clear_pointer (&contents, g_free); + return FALSE; + } + + g_clear_pointer (&contents, g_free); + + /* Poor-man's check for truthy or falsey values */ + *force_state = setup_argument[0] == '1'; + + g_free (setup_argument); + return TRUE; } - static gboolean ++static gboolean +initial_setup_disabled_by_anaconda (void) +{ + GKeyFile *key_file; @@ -62,11 +131,43 @@ index 0057e2c..2af8e13 100644 + return disabled; +} + -+static gboolean + static gboolean wants_initial_setup (GdmDisplay *self) { gboolean enabled = FALSE; -@@ -1480,6 +1505,10 @@ wants_initial_setup (GdmDisplay *self) + gboolean forced = FALSE; + + if (already_done_initial_setup_on_this_boot ()) { + return FALSE; + } + + if (kernel_cmdline_initial_setup_force_state (&forced)) { + if (forced) { + g_debug ("GdmDisplay: Forcing gnome-initial-setup"); + return TRUE; + } + + g_debug ("GdmDisplay: Forceing no gnome-initial-setup"); + return FALSE; + } + + /* don't run initial-setup on remote displays + */ + if (!self->priv->is_local) { + return FALSE; + } + + /* don't run if the system has existing users */ + if (self->priv->have_existing_user_accounts) { + return FALSE; + } + + /* don't run if initial-setup is unavailable */ + if (!can_create_environment ("gnome-initial-setup")) { + return FALSE; + } + + if (!gdm_settings_direct_get_boolean (GDM_KEY_INITIAL_SETUP_ENABLE, &enabled)) { return FALSE; } @@ -77,6 +178,33 @@ index 0057e2c..2af8e13 100644 return enabled; } + void + gdm_display_start_greeter_session (GdmDisplay *self) + { + GdmSession *session; + char *display_name; + char *seat_id; + char *hostname; + char *auth_file = NULL; + + g_return_if_fail (g_strcmp0 (self->priv->session_class, "greeter") == 0); + + g_debug ("GdmDisplay: Running greeter"); + + display_name = NULL; + seat_id = NULL; + hostname = NULL; + + g_object_get (self, + "x11-display-name", &display_name, + "seat-id", &seat_id, + "remote-hostname", &hostname, + NULL); + if (self->priv->access_file != NULL) { + auth_file = gdm_display_access_file_get_path (self->priv->access_file); + } + + g_debug ("GdmDisplay: Creating greeter for %s %s", display_name, hostname); -- -2.9.3 +2.14.2 diff --git a/SOURCES/0001-Revert-data-Add-gnome-login.session.patch b/SOURCES/0001-Revert-data-Add-gnome-login.session.patch new file mode 100644 index 0000000..56be2d7 --- /dev/null +++ b/SOURCES/0001-Revert-data-Add-gnome-login.session.patch @@ -0,0 +1,212 @@ +From cbddcc7c8cc8dcccc8c9a616e1decf8a3ed1cb87 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 13 Oct 2017 13:56:22 -0400 +Subject: [PATCH] Revert "data: Add gnome-login.session" + +This reverts commit 1073f0e792d9d5bf9d53bddb6e51177c8024c2b3. +--- + data/Makefile.am | 12 ------------ + data/dconf/defaults/00-upstream-settings | 2 +- + data/gnome-login.session.in | 3 --- + 3 files changed, 1 insertion(+), 16 deletions(-) + delete mode 100644 data/gnome-login.session.in + +diff --git a/data/Makefile.am b/data/Makefile.am +index c10c9151..f2875fcb 100644 +--- a/data/Makefile.am ++++ b/data/Makefile.am +@@ -59,74 +59,63 @@ schemas_in_files = gdm.schemas.in + schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) + + gdm.schemas.in: $(srcdir)/gdm.schemas.in.in + sed -e 's,[@]GDMPREFETCHCMD[@],$(GDMPREFETCHCMD),g' \ + -e 's,[@]GDM_CUSTOM_CONF[@],$(GDM_CUSTOM_CONF),g' \ + -e 's,[@]GDM_USER_PATH[@],$(GDM_USER_PATH),g' \ + -e 's,[@]GDM_USERNAME[@],$(GDM_USERNAME),g' \ + -e 's,[@]GDM_GROUPNAME[@],$(GDM_GROUPNAME),g' \ + -e 's,[@]HALT_COMMAND[@],$(HALT_COMMAND),g' \ + -e 's,[@]REBOOT_COMMAND[@],$(REBOOT_COMMAND),g' \ + -e 's,[@]SOUND_PROGRAM[@],$(SOUND_PROGRAM),g' \ + -e 's,[@]SUSPEND_COMMAND[@],$(SUSPEND_COMMAND),g' \ + -e 's,[@]XEVIE_OPTION[@],$(XEVIE_OPTION),g' \ + -e 's,[@]ALWAYS_RESTART_SERVER[@],$(ALWAYS_RESTART_SERVER),g' \ + -e 's,[@]X_CONFIG_OPTIONS[@],$(X_CONFIG_OPTIONS),g' \ + -e 's,[@]X_SERVER[@],$(X_SERVER),g' \ + -e 's,[@]X_XNEST_CMD[@],$(X_XNEST_CMD),g' \ + -e 's,[@]X_XNEST_CONFIG_OPTIONS[@],$(X_XNEST_CONFIG_OPTIONS),g' \ + -e 's,[@]X_XNEST_UNSCALED_FONTPATH[@],$(X_XNEST_UNSCALED_FONTPATH),g' \ + -e 's,[@]GDM_RBAC_SYSCMD_KEYS[@],$(GDM_RBAC_SYSCMD_KEYS),g' \ + -e 's,[@]datadir[@],$(datadir),g' \ + -e 's,[@]gdmconfdir[@],$(gdmconfdir),g' \ + -e 's,[@]libdir[@],$(libdir),g' \ + -e 's,[@]libexecdir[@],$(libexecdir),g' \ + -e 's,[@]gdmlocaledir[@],$(gdmlocaledir),g' \ + -e 's,[@]logdir[@],$(logdir),g' \ + -e 's,[@]pixmapdir[@],$(pixmapdir),g' \ + -e 's,[@]sbindir[@],$(sbindir),g' \ + <$(srcdir)/gdm.schemas.in.in >gdm.schemas.in + +- +-EXTRA_DIST += gnome-login.session.in +- +-gnome-login.session: $(srcdir)/gnome-login.session.in +- sed -e 's,[@]libexecdir[@],$(libexecdir),g' \ +- -e 's,[@]CHECK_ACCELERATED_DIR[@],$(CHECK_ACCELERATED_DIR),g' \ +- < $< > $@.tmp && mv $@.tmp $@ +- + localealiasdir = $(datadir)/gdm + localealias_DATA = locale.alias + +-sessiondir = $(datadir)/gnome-session/sessions +-session_DATA = gnome-login.session +- + pam_redhat_files = \ + pam-redhat/gdm-autologin.pam \ + pam-redhat/gdm-launch-environment.pam \ + pam-redhat/gdm-fingerprint.pam \ + pam-redhat/gdm-smartcard.pam \ + pam-redhat/gdm-password.pam \ + pam-redhat/gdm-pin.pam \ + $(NULL) + EXTRA_DIST += $(pam_redhat_files) + + pam_openembedded_files = pam-openembedded/gdm-password.pam \ + pam-openembedded/gdm-autologin.pam \ + pam-openembedded/gdm-launch-environment.pam \ + pam-openembedded/gdm-pin.pam \ + $(NULL) + EXTRA_DIST += $(pam_openembedded_files) + + pam_exherbo_files = pam-exherbo/gdm-autologin.pam \ + pam-exherbo/gdm-launch-environment.pam \ + pam-exherbo/gdm-fingerprint.pam \ + pam-exherbo/gdm-smartcard.pam \ + pam-exherbo/gdm-password.pam \ + pam-exherbo/gdm-pin.pam \ + $(NULL) + EXTRA_DIST += $(pam_exherbo_files) + + pam_lfs_files = \ + pam-lfs/gdm-autologin.pam \ + pam-lfs/gdm-launch-environment.pam \ + pam-lfs/gdm-fingerprint.pam \ +@@ -163,61 +152,60 @@ endif + + EXTRA_DIST += \ + $(dconf_db_files) \ + $(schemas_in_files) \ + $(schemas_DATA) \ + $(dbusconf_in_files) \ + $(localealias_DATA) \ + gdm.schemas.in.in \ + gdm.conf-custom.in \ + Xsession.in \ + Init.in \ + PreSession.in \ + PostSession.in \ + PostLogin \ + org.gnome.login-screen.gschema.xml.in \ + $(NULL) + + CLEANFILES = \ + Xsession \ + gdm.conf-custom \ + Init \ + PreSession \ + PostSession \ + $(gsettings_SCHEMAS) \ + greeter-dconf-defaults \ + $(NULL) + + DISTCLEANFILES = \ + $(dbusconf_DATA) \ + gdm.schemas \ +- gnome-login.session \ + $(NULL) + + MAINTAINERCLEANFILES = \ + *~ \ + Makefile.in + + systemdsystemunit = + + gdm.service: $(srcdir)/gdm.service.in + $(AM_V_GEN)sed \ + -e 's,[@]sbindir[@],$(sbindir),g' \ + -e 's,[@]GDM_INITIAL_VT[@],$(GDM_INITIAL_VT),g' \ + -e 's,[@]LANG_CONFIG_FILE[@],$(LANG_CONFIG_FILE),g' \ + -e 's,[@]PLYMOUTH_QUIT_SERVICE[@],$(PLYMOUTH_QUIT_SERVICE),g' \ + -e 's, *$$,,g' \ + < $< > $@ + systemdsystemunit += gdm.service + CLEANFILES += gdm.service + + if INSTALL_SYSTEMD_UNITS + systemdsystemunit_DATA=$(systemdsystemunit) + systemdsystemunitdir=$(SYSTEMD_SYSTEM_UNIT_DIR) + endif + + Xsession_files = + if ENABLE_GDM_XSESSION + + Xsession: $(srcdir)/Xsession.in + sed -e 's,[@]XSESSION_SHELL[@],$(XSESSION_SHELL),g' \ + -e 's,[@]libexecdir[@],$(libexecdir),g' \ +diff --git a/data/dconf/defaults/00-upstream-settings b/data/dconf/defaults/00-upstream-settings +index 603903e6..f109e0a9 100644 +--- a/data/dconf/defaults/00-upstream-settings ++++ b/data/dconf/defaults/00-upstream-settings +@@ -1,40 +1,40 @@ + # This file is part of the GDM packaging and should not be changed. + # + # Instead create your own file next to it with a higher numbered prefix, + # and run + # + # dconf update + # + + [org/gnome/desktop/session] +-session-name='gnome-login' ++session-name='gnome' + + [org/gnome/desktop/a11y] + always-show-universal-access-status=true + + [org/gnome/desktop/background] + show-desktop-icons=false + + [org/gnome/desktop/default-applications/terminal] + exec='true' + + [org/gnome/desktop/lockdown] + disable-application-handlers=true + disable-command-line=true + disable-lock-screen=true + disable-log-out=false + disable-printing=true + disable-print-setup=true + disable-save-to-disk=true + disable-user-switching=true + + [org/gnome/desktop/sound] + event-sounds=true + + [org/gnome/settings-daemon/plugins/media-keys] + calculator='' + eject='' + email='' + help='' + home='' + media='' +diff --git a/data/gnome-login.session.in b/data/gnome-login.session.in +deleted file mode 100644 +index 764afd15..00000000 +--- a/data/gnome-login.session.in ++++ /dev/null +@@ -1,3 +0,0 @@ +-[GNOME Session] +-Name=Display Manager +-RequiredComponents=org.gnome.Shell;org.gnome.SettingsDaemon.A11yKeyboard;org.gnome.SettingsDaemon.A11ySettings;org.gnome.SettingsDaemon.Clipboard;org.gnome.SettingsDaemon.Color;org.gnome.SettingsDaemon.Datetime;org.gnome.SettingsDaemon.Housekeeping;org.gnome.SettingsDaemon.Keyboard;org.gnome.SettingsDaemon.MediaKeys;org.gnome.SettingsDaemon.Mouse;org.gnome.SettingsDaemon.Power;org.gnome.SettingsDaemon.PrintNotifications;org.gnome.SettingsDaemon.Rfkill;org.gnome.SettingsDaemon.ScreensaverProxy;org.gnome.SettingsDaemon.Sharing;org.gnome.SettingsDaemon.Smartcard;org.gnome.SettingsDaemon.Sound;org.gnome.SettingsDaemon.Wacom;org.gnome.SettingsDaemon.XSettings; +-- +2.14.2 + diff --git a/SOURCES/0001-Revert-gdm-sessions-force-a-session-bus-for-non-seat.patch b/SOURCES/0001-Revert-gdm-sessions-force-a-session-bus-for-non-seat.patch new file mode 100644 index 0000000..eb2f277 --- /dev/null +++ b/SOURCES/0001-Revert-gdm-sessions-force-a-session-bus-for-non-seat.patch @@ -0,0 +1,86 @@ +From 5c86f9731ed715bcf603c9dd93dced002f11b996 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 17 Oct 2017 10:06:22 -0400 +Subject: [PATCH] Revert "gdm-sessions: force a session bus for non-seat0 + session" + +This reverts commit 2b52d8933c8ab38e7ee83318da2363d00d8c5581. +--- + daemon/gdm-session.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index 3e71ad2f..3a1b7f23 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -2870,66 +2870,61 @@ gdm_session_start_session (GdmSession *self, + allow_remote_connections = TRUE; + } + + if (run_launcher) { + if (is_x11) { + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s %s\"%s\"", + run_xsession_script? "--run-script " : "", + allow_remote_connections? "--allow-remote-connections " : "", + command); + } else { + program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session \"%s\"", + command); + } + } else if (run_xsession_script) { + program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command); + } else { + program = g_strdup (command); + } + + g_free (command); + } else { + if (run_launcher) { + if (is_x11) { + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session \"%s\"", + self->priv->selected_program); + } else { + program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session \"%s\"", + self->priv->selected_program); + } + } else { +- if (g_strcmp0 (self->priv->display_seat_id, "seat0") != 0) { +- program = g_strdup_printf ("dbus-run-session -- %s", +- self->priv->selected_program); +- } else { +- program = g_strdup (self->priv->selected_program); +- } ++ program = g_strdup (self->priv->selected_program); + } + } + + set_up_session_environment (self); + send_environment (self, conversation); + + gdm_dbus_worker_call_start_program (conversation->worker_proxy, + program, + conversation->worker_cancellable, + (GAsyncReadyCallback) on_start_program_cb, + conversation); + g_free (program); + } + + static void + stop_all_conversations (GdmSession *self) + { + stop_all_other_conversations (self, NULL, TRUE); + } + + static void + do_reset (GdmSession *self) + { + stop_all_conversations (self); + + g_list_free_full (self->priv->pending_worker_connections, g_object_unref); + self->priv->pending_worker_connections = NULL; + + g_free (self->priv->selected_user); + self->priv->selected_user = NULL; +-- +2.14.2 + diff --git a/SOURCES/0001-Revert-session-don-t-call-gdm_session_defaults_chang.patch b/SOURCES/0001-Revert-session-don-t-call-gdm_session_defaults_chang.patch new file mode 100644 index 0000000..213fe0f --- /dev/null +++ b/SOURCES/0001-Revert-session-don-t-call-gdm_session_defaults_chang.patch @@ -0,0 +1,103 @@ +From 0012497171500090b55e4c8e967809a5b2daaa94 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 14 Feb 2018 16:07:15 -0500 +Subject: [PATCH] Revert "session: don't call gdm_session_defaults_changed from + setup" + +This reverts commit 572a19324b75cc1f1b2db4908e2d7c9f06e4e335. + +It turns out we need this call for more than just the session type, +we also need to it to inform the greeter about the default session +to use. +--- + daemon/gdm-session.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index 3a1b7f23..e9cbd0ec 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -2368,78 +2368,80 @@ initialize (GdmSession *self, + g_variant_builder_add_parsed (&details, "{'seat-id', <%s>}", self->priv->display_seat_id); + + if (self->priv->display_x11_authority_file != NULL) + g_variant_builder_add_parsed (&details, "{'x11-authority-file', <%s>}", self->priv->display_x11_authority_file); + + g_debug ("GdmSession: Beginning initialization"); + + conversation = find_conversation_by_name (self, service_name); + if (conversation != NULL) { + gdm_dbus_worker_call_initialize (conversation->worker_proxy, + g_variant_builder_end (&details), + + conversation->worker_cancellable, + (GAsyncReadyCallback) on_initialization_complete_cb, + conversation); + } + + g_free (extensions); + } + + void + gdm_session_setup (GdmSession *self, + const char *service_name) + { + + g_return_if_fail (GDM_IS_SESSION (self)); + + update_session_type (self); + + initialize (self, service_name, NULL, NULL); ++ gdm_session_defaults_changed (self); + } + + + void + gdm_session_setup_for_user (GdmSession *self, + const char *service_name, + const char *username) + { + + g_return_if_fail (GDM_IS_SESSION (self)); + g_return_if_fail (username != NULL); + + update_session_type (self); + + gdm_session_select_user (self, username); + + self->priv->is_program_session = FALSE; + initialize (self, service_name, self->priv->selected_user, NULL); ++ gdm_session_defaults_changed (self); + } + + void + gdm_session_setup_for_program (GdmSession *self, + const char *service_name, + const char *username, + const char *log_file) + { + + g_return_if_fail (GDM_IS_SESSION (self)); + + self->priv->is_program_session = TRUE; + initialize (self, service_name, username, log_file); + } + + void + gdm_session_authenticate (GdmSession *self, + const char *service_name) + { + GdmSessionConversation *conversation; + + g_return_if_fail (GDM_IS_SESSION (self)); + + conversation = find_conversation_by_name (self, service_name); + if (conversation != NULL) { + gdm_dbus_worker_call_authenticate (conversation->worker_proxy, + conversation->worker_cancellable, + (GAsyncReadyCallback) on_authenticate_cb, + conversation); + } +-- +2.14.3 + diff --git a/SOURCES/0001-Revert-session-forward-is-initial-from-display-to-wo.patch b/SOURCES/0001-Revert-session-forward-is-initial-from-display-to-wo.patch index 8067b65..b5d6af6 100644 --- a/SOURCES/0001-Revert-session-forward-is-initial-from-display-to-wo.patch +++ b/SOURCES/0001-Revert-session-forward-is-initial-from-display-to-wo.patch @@ -1,4 +1,4 @@ -From 6df33bb3293d220bcdff7abc68f61ebad841ffe1 Mon Sep 17 00:00:00 2001 +From 0522f061f30baeecff958e0deee89934baff3776 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 12 May 2017 10:11:09 -0400 Subject: [PATCH] Revert "session: forward is-initial from display to worker" @@ -10,296 +10,37 @@ This reverts commit 7a4e34049c79e907d1a027390c5d3a8dcdc11977. It breaks login screen until reboot on 7.3→7.4 upgrade. --- - daemon/gdm-display.c | 6 ------ - daemon/gdm-session-worker.c | 21 +++++---------------- + daemon/gdm-session-worker.c | 10 ++-------- daemon/gdm-session-worker.xml | 3 --- - daemon/gdm-session.c | 25 ------------------------- - 4 files changed, 5 insertions(+), 50 deletions(-) + 2 files changed, 2 insertions(+), 11 deletions(-) -diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c -index 2af8e13e..c44e4941 100644 ---- a/daemon/gdm-display.c -+++ b/daemon/gdm-display.c -@@ -1488,119 +1488,113 @@ wants_initial_setup (GdmDisplay *self) - /* don't run initial-setup on remote displays - */ - if (!self->priv->is_local) { - return FALSE; - } - - /* don't run if the system has existing users */ - if (self->priv->have_existing_user_accounts) { - return FALSE; - } - - /* don't run if initial-setup is unavailable */ - if (!can_create_environment ("gnome-initial-setup")) { - return FALSE; - } - - if (!gdm_settings_direct_get_boolean (GDM_KEY_INITIAL_SETUP_ENABLE, &enabled)) { - return FALSE; - } - - if (initial_setup_disabled_by_anaconda ()) { - return FALSE; - } - - return enabled; - } - - void - gdm_display_start_greeter_session (GdmDisplay *self) - { -- GdmSession *session; - char *display_name; - char *seat_id; - char *hostname; - char *auth_file = NULL; - - g_return_if_fail (g_strcmp0 (self->priv->session_class, "greeter") == 0); - - g_debug ("GdmDisplay: Running greeter"); - - display_name = NULL; - seat_id = NULL; - hostname = NULL; - - g_object_get (self, - "x11-display-name", &display_name, - "seat-id", &seat_id, - "remote-hostname", &hostname, - NULL); - if (self->priv->access_file != NULL) { - auth_file = gdm_display_access_file_get_path (self->priv->access_file); - } - - g_debug ("GdmDisplay: Creating greeter for %s %s", display_name, hostname); - - g_signal_connect_object (self->priv->launch_environment, - "opened", - G_CALLBACK (on_launch_environment_session_opened), - self, 0); - g_signal_connect_object (self->priv->launch_environment, - "started", - G_CALLBACK (on_launch_environment_session_started), - self, 0); - g_signal_connect_object (self->priv->launch_environment, - "stopped", - G_CALLBACK (on_launch_environment_session_stopped), - self, 0); - g_signal_connect_object (self->priv->launch_environment, - "exited", - G_CALLBACK (on_launch_environment_session_exited), - self, 0); - g_signal_connect_object (self->priv->launch_environment, - "died", - G_CALLBACK (on_launch_environment_session_died), - self, 0); - - if (auth_file != NULL) { - g_object_set (self->priv->launch_environment, - "x11-authority-file", auth_file, - NULL); - } - - gdm_launch_environment_start (self->priv->launch_environment); - -- session = gdm_launch_environment_get_session (self->priv->launch_environment); -- g_object_set (G_OBJECT (session), -- "display-is-initial", self->priv->is_initial, -- NULL); -- - g_free (display_name); - g_free (seat_id); - g_free (hostname); - g_free (auth_file); - } - - static void - chown_initial_setup_home_dir (void) - { - GFile *dir; - GError *error; - char *gis_dir_path; - char *gis_uid_path; - char *gis_uid_contents; - struct passwd *pwe; - uid_t uid; - - if (!gdm_get_pwent_for_name (INITIAL_SETUP_USERNAME, &pwe)) { - g_warning ("Unknown user %s", INITIAL_SETUP_USERNAME); - return; - } - - gis_dir_path = g_strdup (pwe->pw_dir); - - gis_uid_path = g_build_filename (gis_dir_path, - "gnome-initial-setup-uid", - NULL); - if (!g_file_get_contents (gis_uid_path, &gis_uid_contents, NULL, NULL)) { - g_warning ("Unable to read %s", gis_uid_path); - goto out; diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c -index d97b02b5..dffc8917 100644 +index 34b3bf7f..10ecccb0 100644 --- a/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c -@@ -134,61 +134,60 @@ struct GdmSessionWorkerPrivate - pam_handle_t *pam_handle; - - GPid child_pid; - guint child_watch_id; - - /* from Setup */ - char *service; - char *x11_display_name; - char *x11_authority_file; - char *display_device; - char *display_seat_id; - char *hostname; - char *username; - char *log_file; - char *session_id; - uid_t uid; - gid_t gid; - gboolean password_is_required; - - int cred_flags; - int login_vt; - int session_vt; - int session_tty_fd; - - char **arguments; - guint32 cancelled : 1; - guint32 timed_out : 1; - guint32 is_program_session : 1; - guint32 is_reauth_session : 1; - guint32 display_is_local : 1; -- guint32 display_is_initial : 1; - guint state_change_idle_id; - GdmSessionDisplayMode display_mode; - - char *server_address; - GDBusConnection *connection; - GdmDBusWorkerManager *manager; - - GHashTable *reauthentication_requests; - - GdmSessionAuditor *auditor; - GdmSessionSettings *user_settings; - - GDBusMethodInvocation *pending_invocation; - }; - - enum { - PROP_0, - PROP_SERVER_ADDRESS, - PROP_IS_REAUTH_SESSION, - }; - - static void gdm_session_worker_class_init (GdmSessionWorkerClass *klass); - static void gdm_session_worker_init (GdmSessionWorker *session_worker); - static void gdm_session_worker_finalize (GObject *object); - - static void gdm_session_worker_set_environment_variable (GdmSessionWorker *worker, - const char *key, - const char *value); - - static void queue_state_change (GdmSessionWorker *worker); -@@ -2057,67 +2056,63 @@ gdm_session_worker_start_session (GdmSessionWorker *worker, - g_assert (sizeof (GPid) <= sizeof (int)); - - g_debug ("GdmSessionWorker: state SESSION_STARTED"); - worker->priv->state = GDM_SESSION_WORKER_STATE_SESSION_STARTED; - - gdm_session_worker_watch_child (worker); - - out: - if (error_code != PAM_SUCCESS) { - gdm_session_worker_uninitialize_pam (worker, error_code); - return FALSE; - } +@@ -3033,166 +3033,160 @@ gdm_session_worker_handle_initialize (GdmDBusWorker *object, - return TRUE; - } - - static gboolean - set_up_for_new_vt (GdmSessionWorker *worker) - { - int fd; - char vt_string[256], tty_string[256]; - int session_vt = 0; - - fd = open ("/dev/tty0", O_RDWR | O_NOCTTY); - - if (fd < 0) { - g_debug ("GdmSessionWorker: couldn't open VT master: %m"); - return FALSE; - } - -- if (worker->priv->display_is_initial) { -- session_vt = atoi (GDM_INITIAL_VT); -- } else { -- if (ioctl(fd, VT_OPENQRY, &session_vt) < 0) { -- g_debug ("GdmSessionWorker: couldn't open new VT: %m"); -- goto fail; -- } -+ if (ioctl(fd, VT_OPENQRY, &session_vt) < 0) { -+ g_debug ("GdmSessionWorker: couldn't open new VT: %m"); -+ goto fail; + if (worker->priv->username) { + wait_for_settings = !gdm_session_settings_load (worker->priv->user_settings, + worker->priv->username); + } } - worker->priv->session_vt = session_vt; - - close (fd); - fd = -1; - - g_assert (session_vt > 0); - - g_snprintf (vt_string, sizeof (vt_string), "%d", session_vt); - - /* Set the VTNR. This is used by logind to configure a session in - * the logind-managed case, but it doesn't hurt to set it always. - * When logind gains support for XDG_VTNR=auto, we can make the - * OPENQRY and this whole path only used by the new VT code. */ - gdm_session_worker_set_environment_variable (worker, - "XDG_VTNR", - vt_string); - - g_snprintf (tty_string, 256, "/dev/tty%d", session_vt); - worker->priv->session_tty_fd = open (tty_string, O_RDWR | O_NOCTTY); - pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string); - - return TRUE; - - fail: - close (fd); - return FALSE; - } - -@@ -2795,166 +2790,160 @@ gdm_session_worker_handle_establish_credentials (GdmDBusWorker *object, - GdmSessionWorker *worker = GDM_SESSION_WORKER (object); - validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_ACCREDITED); - - if (!worker->priv->is_reauth_session) { - worker->priv->cred_flags = PAM_ESTABLISH_CRED; + if (wait_for_settings) { + /* Load settings from accounts daemon before continuing + */ + g_signal_connect (G_OBJECT (worker->priv->user_settings), + "notify::is-loaded", + G_CALLBACK (on_settings_is_loaded_changed), + worker); } else { - worker->priv->cred_flags = PAM_REINITIALIZE_CRED; + queue_state_change (worker); } return TRUE; } static gboolean - gdm_session_worker_handle_open (GdmDBusWorker *object, - GDBusMethodInvocation *invocation) - { - GdmSessionWorker *worker = GDM_SESSION_WORKER (object); - validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_ACCOUNT_DETAILS_SAVED); - return TRUE; - } - - static gboolean gdm_session_worker_handle_setup (GdmDBusWorker *object, GDBusMethodInvocation *invocation, const char *service, @@ -447,13 +188,10 @@ index d97b02b5..dffc8917 100644 g_dbus_method_invocation_take_error (invocation, parse_error); return TRUE; diff --git a/daemon/gdm-session-worker.xml b/daemon/gdm-session-worker.xml -index 9f6d8b35..f7d1dc2d 100644 +index 4280fe09..bc055973 100644 --- a/daemon/gdm-session-worker.xml +++ b/daemon/gdm-session-worker.xml -@@ -5,83 +5,80 @@ - - - +@@ -8,83 +8,80 @@ @@ -473,6 +211,9 @@ index 9f6d8b35..f7d1dc2d 100644 + + + @@ -534,528 +275,6 @@ index 9f6d8b35..f7d1dc2d 100644 -diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index e69291fb..1dfbef64 100644 ---- a/daemon/gdm-session.c -+++ b/daemon/gdm-session.c -@@ -103,74 +103,72 @@ struct _GdmSessionPrivate - GdmDBusUserVerifier *user_verifier_interface; - GdmDBusGreeter *greeter_interface; - GdmDBusRemoteGreeter *remote_greeter_interface; - GdmDBusChooser *chooser_interface; - - GList *pending_worker_connections; - GList *outside_connections; - - GPid session_pid; - - /* object lifetime scope */ - char *session_type; - char *display_name; - char *display_hostname; - char *display_device; - char *display_seat_id; - char *display_x11_authority_file; - gboolean display_is_local; - - GdmSessionVerificationMode verification_mode; - - uid_t allowed_user; - - char *fallback_session_name; - - GDBusServer *worker_server; - GDBusServer *outside_server; - GHashTable *environment; - - guint32 is_program_session : 1; -- guint32 display_is_initial : 1; - #ifdef ENABLE_WAYLAND_SUPPORT - guint32 ignore_wayland : 1; - #endif - }; - - enum { - PROP_0, - PROP_VERIFICATION_MODE, - PROP_ALLOWED_USER, - PROP_DISPLAY_NAME, - PROP_DISPLAY_HOSTNAME, - PROP_DISPLAY_IS_LOCAL, -- PROP_DISPLAY_IS_INITIAL, - PROP_SESSION_TYPE, - PROP_DISPLAY_DEVICE, - PROP_DISPLAY_SEAT_ID, - PROP_DISPLAY_X11_AUTHORITY_FILE, - PROP_USER_X11_AUTHORITY_FILE, - PROP_CONVERSATION_ENVIRONMENT, - #ifdef ENABLE_WAYLAND_SUPPORT - PROP_IGNORE_WAYLAND, - #endif - }; - - enum { - CONVERSATION_STARTED = 0, - CONVERSATION_STOPPED, - SETUP_COMPLETE, - CANCELLED, - HOSTNAME_SELECTED, - CLIENT_REJECTED, - CLIENT_CONNECTED, - CLIENT_DISCONNECTED, - CLIENT_READY_FOR_SESSION_TO_START, - DISCONNECTED, - AUTHENTICATION_FAILED, - VERIFICATION_COMPLETE, - SESSION_OPENED, - SESSION_STARTED, - SESSION_START_FAILED, - SESSION_EXITED, - SESSION_DIED, - REAUTHENTICATION_STARTED, -@@ -2118,61 +2116,60 @@ send_setup (GdmSession *self, - display_hostname = ""; - } - if (self->priv->display_device != NULL) { - display_device = self->priv->display_device; - } else { - display_device = ""; - } - if (self->priv->display_seat_id != NULL) { - display_seat_id = self->priv->display_seat_id; - } else { - display_seat_id = ""; - } - if (self->priv->display_x11_authority_file != NULL) { - display_x11_authority_file = self->priv->display_x11_authority_file; - } else { - display_x11_authority_file = ""; - } - - g_debug ("GdmSession: Beginning setup"); - - conversation = find_conversation_by_name (self, service_name); - if (conversation != NULL) { - gdm_dbus_worker_call_setup (conversation->worker_proxy, - service_name, - display_name, - display_x11_authority_file, - display_device, - display_seat_id, - display_hostname, - self->priv->display_is_local, -- self->priv->display_is_initial, - conversation->worker_cancellable, - (GAsyncReadyCallback) on_setup_complete_cb, - conversation); - } - } - - static void - send_setup_for_user (GdmSession *self, - const char *service_name) - { - const char *display_name; - const char *display_device; - const char *display_seat_id; - const char *display_hostname; - const char *display_x11_authority_file; - const char *selected_user; - GdmSessionConversation *conversation; - - g_assert (service_name != NULL); - - conversation = find_conversation_by_name (self, service_name); - - if (self->priv->display_name != NULL) { - display_name = self->priv->display_name; - } else { - display_name = ""; - } - if (self->priv->display_hostname != NULL) { - display_hostname = self->priv->display_hostname; - } else { -@@ -2184,122 +2181,120 @@ send_setup_for_user (GdmSession *self, - display_device = ""; - } - if (self->priv->display_seat_id != NULL) { - display_seat_id = self->priv->display_seat_id; - } else { - display_seat_id = ""; - } - if (self->priv->display_x11_authority_file != NULL) { - display_x11_authority_file = self->priv->display_x11_authority_file; - } else { - display_x11_authority_file = ""; - } - if (self->priv->selected_user != NULL) { - selected_user = self->priv->selected_user; - } else { - selected_user = ""; - } - - g_debug ("GdmSession: Beginning setup for user %s", self->priv->selected_user); - - if (conversation != NULL) { - gdm_dbus_worker_call_setup_for_user (conversation->worker_proxy, - service_name, - selected_user, - display_name, - display_x11_authority_file, - display_device, - display_seat_id, - display_hostname, - self->priv->display_is_local, -- self->priv->display_is_initial, - conversation->worker_cancellable, - (GAsyncReadyCallback) on_setup_complete_cb, - conversation); - } - } - - static void - send_setup_for_program (GdmSession *self, - const char *service_name, - const char *username, - const char *log_file) - { - const char *display_name; - const char *display_device; - const char *display_seat_id; - const char *display_hostname; - const char *display_x11_authority_file; - GdmSessionConversation *conversation; - - g_assert (service_name != NULL); - - if (self->priv->display_name != NULL) { - display_name = self->priv->display_name; - } else { - display_name = ""; - } - if (self->priv->display_hostname != NULL) { - display_hostname = self->priv->display_hostname; - } else { - display_hostname = ""; - } - if (self->priv->display_device != NULL) { - display_device = self->priv->display_device; - } else { - display_device = ""; - } - if (self->priv->display_seat_id != NULL) { - display_seat_id = self->priv->display_seat_id; - } else { - display_seat_id = ""; - } - if (self->priv->display_x11_authority_file != NULL) { - display_x11_authority_file = self->priv->display_x11_authority_file; - } else { - display_x11_authority_file = ""; - } - - g_debug ("GdmSession: Beginning setup for session for program using PAM service %s", service_name); - - conversation = find_conversation_by_name (self, service_name); - if (conversation != NULL) { - gdm_dbus_worker_call_setup_for_program (conversation->worker_proxy, - service_name, - username, - display_name, - display_x11_authority_file, - display_device, - display_seat_id, - display_hostname, - self->priv->display_is_local, -- self->priv->display_is_initial, - log_file, - conversation->worker_cancellable, - (GAsyncReadyCallback) on_setup_complete_cb, - conversation); - } - } - - void - gdm_session_setup (GdmSession *self, - const char *service_name) - { - - g_return_if_fail (GDM_IS_SESSION (self)); - - send_setup (self, service_name); - gdm_session_defaults_changed (self); - } - - - void - gdm_session_setup_for_user (GdmSession *self, - const char *service_name, - const char *username) - { - - g_return_if_fail (GDM_IS_SESSION (self)); - g_return_if_fail (username != NULL); - - gdm_session_select_user (self, username); - -@@ -3217,67 +3212,60 @@ set_display_seat_id (GdmSession *self, - const char *name) - { - g_free (self->priv->display_seat_id); - self->priv->display_seat_id = g_strdup (name); - } - - static void - set_user_x11_authority_file (GdmSession *self, - const char *name) - { - g_free (self->priv->user_x11_authority_file); - self->priv->user_x11_authority_file = g_strdup (name); - } - - static void - set_display_x11_authority_file (GdmSession *self, - const char *name) - { - g_free (self->priv->display_x11_authority_file); - self->priv->display_x11_authority_file = g_strdup (name); - } - - static void - set_display_is_local (GdmSession *self, - gboolean is_local) - { - self->priv->display_is_local = is_local; - } - - static void --set_display_is_initial (GdmSession *self, -- gboolean is_initial) --{ -- self->priv->display_is_initial = is_initial; --} -- --static void - set_verification_mode (GdmSession *self, - GdmSessionVerificationMode verification_mode) - { - self->priv->verification_mode = verification_mode; - } - - static void - set_allowed_user (GdmSession *self, - uid_t allowed_user) - { - self->priv->allowed_user = allowed_user; - } - - static void - set_conversation_environment (GdmSession *self, - char **environment) - { - g_strfreev (self->priv->conversation_environment); - self->priv->conversation_environment = g_strdupv (environment); - } - - static void - set_session_type (GdmSession *self, - const char *session_type) - { - - if (g_strcmp0 (self->priv->session_type, session_type) != 0) { - g_debug ("GdmSession: setting session to type '%s'", session_type? session_type : ""); - g_free (self->priv->session_type); - self->priv->session_type = g_strdup (session_type); -@@ -3292,121 +3280,115 @@ gdm_session_set_property (GObject *object, - { - GdmSession *self; - - self = GDM_SESSION (object); - - switch (prop_id) { - case PROP_SESSION_TYPE: - set_session_type (self, g_value_get_string (value)); - break; - case PROP_DISPLAY_NAME: - set_display_name (self, g_value_get_string (value)); - break; - case PROP_DISPLAY_HOSTNAME: - set_display_hostname (self, g_value_get_string (value)); - break; - case PROP_DISPLAY_DEVICE: - set_display_device (self, g_value_get_string (value)); - break; - case PROP_DISPLAY_SEAT_ID: - set_display_seat_id (self, g_value_get_string (value)); - break; - case PROP_USER_X11_AUTHORITY_FILE: - set_user_x11_authority_file (self, g_value_get_string (value)); - break; - case PROP_DISPLAY_X11_AUTHORITY_FILE: - set_display_x11_authority_file (self, g_value_get_string (value)); - break; - case PROP_DISPLAY_IS_LOCAL: - set_display_is_local (self, g_value_get_boolean (value)); - break; -- case PROP_DISPLAY_IS_INITIAL: -- set_display_is_initial (self, g_value_get_boolean (value)); -- break; - case PROP_VERIFICATION_MODE: - set_verification_mode (self, g_value_get_enum (value)); - break; - case PROP_ALLOWED_USER: - set_allowed_user (self, g_value_get_uint (value)); - break; - case PROP_CONVERSATION_ENVIRONMENT: - set_conversation_environment (self, g_value_get_pointer (value)); - break; - #ifdef ENABLE_WAYLAND_SUPPORT - case PROP_IGNORE_WAYLAND: - gdm_session_set_ignore_wayland (self, g_value_get_boolean (value)); - break; - #endif - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - } - - static void - gdm_session_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) - { - GdmSession *self; - - self = GDM_SESSION (object); - - switch (prop_id) { - case PROP_SESSION_TYPE: - g_value_set_string (value, self->priv->session_type); - break; - case PROP_DISPLAY_NAME: - g_value_set_string (value, self->priv->display_name); - break; - case PROP_DISPLAY_HOSTNAME: - g_value_set_string (value, self->priv->display_hostname); - break; - case PROP_DISPLAY_DEVICE: - g_value_set_string (value, self->priv->display_device); - break; - case PROP_DISPLAY_SEAT_ID: - g_value_set_string (value, self->priv->display_seat_id); - break; - case PROP_USER_X11_AUTHORITY_FILE: - g_value_set_string (value, self->priv->user_x11_authority_file); - break; - case PROP_DISPLAY_X11_AUTHORITY_FILE: - g_value_set_string (value, self->priv->display_x11_authority_file); - break; - case PROP_DISPLAY_IS_LOCAL: - g_value_set_boolean (value, self->priv->display_is_local); - break; -- case PROP_DISPLAY_IS_INITIAL: -- g_value_set_boolean (value, self->priv->display_is_initial); -- break; - case PROP_VERIFICATION_MODE: - g_value_set_enum (value, self->priv->verification_mode); - break; - case PROP_ALLOWED_USER: - g_value_set_uint (value, self->priv->allowed_user); - break; - case PROP_CONVERSATION_ENVIRONMENT: - g_value_set_pointer (value, self->priv->environment); - break; - #ifdef ENABLE_WAYLAND_SUPPORT - case PROP_IGNORE_WAYLAND: - g_value_set_boolean (value, self->priv->ignore_wayland); - break; - #endif - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - } - - static void - gdm_session_dispose (GObject *object) - { - GdmSession *self; - - self = GDM_SESSION (object); - - g_debug ("GdmSession: Disposing session"); - - gdm_session_close (self); -@@ -3749,67 +3731,60 @@ gdm_session_class_init (GdmSessionClass *session_class) - - g_object_class_install_property (object_class, - PROP_SESSION_TYPE, - g_param_spec_string ("session-type", - NULL, - NULL, - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_DISPLAY_NAME, - g_param_spec_string ("display-name", - "display name", - "display name", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, - PROP_DISPLAY_HOSTNAME, - g_param_spec_string ("display-hostname", - "display hostname", - "display hostname", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (object_class, - PROP_DISPLAY_IS_LOCAL, - g_param_spec_boolean ("display-is-local", - "display is local", - "display is local", - TRUE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (object_class, -- PROP_DISPLAY_IS_INITIAL, -- g_param_spec_boolean ("display-is-initial", -- "display is initial", -- "display is initial", -- FALSE, -- G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); -- g_object_class_install_property (object_class, - PROP_DISPLAY_X11_AUTHORITY_FILE, - g_param_spec_string ("display-x11-authority-file", - "display x11 authority file", - "display x11 authority file", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - /* not construct only */ - g_object_class_install_property (object_class, - PROP_USER_X11_AUTHORITY_FILE, - g_param_spec_string ("user-x11-authority-file", - "", - "", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, - PROP_DISPLAY_DEVICE, - g_param_spec_string ("display-device", - "display device", - "display device", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property (object_class, - PROP_DISPLAY_SEAT_ID, - g_param_spec_string ("display-seat-id", - "display seat id", - "display seat id", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - -- -2.12.2 +2.14.2 diff --git a/SOURCES/0001-data-drop-pam_gdm-reintroduce-pam_env-postlogin.patch b/SOURCES/0001-data-drop-pam_gdm-reintroduce-pam_env-postlogin.patch new file mode 100644 index 0000000..25913bd --- /dev/null +++ b/SOURCES/0001-data-drop-pam_gdm-reintroduce-pam_env-postlogin.patch @@ -0,0 +1,45 @@ +From 6effb1671a917adb3ed8f77f5e13324e8b455c32 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 30 Jan 2018 10:32:08 -0500 +Subject: [PATCH] data: drop pam_gdm, reintroduce pam_env/postlogin + +The current upstream pam configuration upstream doesn't really +make sense in RHEL. + +systemd doesn't handle /etc/environment on its own in RHEL and it +doesn't populate the kernel keyring with disk encrypt passwords, +so pam_gdm is not useful. + +This commit restores the pam configuration to something closer to +what was shipped in 7.3 +--- + data/pam-redhat/gdm-autologin.pam | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/data/pam-redhat/gdm-autologin.pam b/data/pam-redhat/gdm-autologin.pam +index c31ff27a..aa99e1b0 100644 +--- a/data/pam-redhat/gdm-autologin.pam ++++ b/data/pam-redhat/gdm-autologin.pam +@@ -1,16 +1,15 @@ + #%PAM-1.0 +-auth [success=ok default=1] pam_gdm.so +--auth optional pam_gnome_keyring.so +-auth sufficient pam_permit.so ++auth required pam_env.so ++auth required pam_permit.so ++auth include postlogin + account required pam_nologin.so + account include system-auth + password include system-auth + session required pam_selinux.so close + session required pam_loginuid.so + session optional pam_console.so + session required pam_selinux.so open + session optional pam_keyinit.so force revoke + session required pam_namespace.so + session include system-auth +-session optional pam_gnome_keyring.so auto_start + session include postlogin +-- +2.14.3 + diff --git a/SOURCES/0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch b/SOURCES/0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch index 901c86f..9ec89f9 100644 --- a/SOURCES/0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch +++ b/SOURCES/0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch @@ -1,4 +1,4 @@ -From 539b8a08787f86586eabe8fd502ec2faff5a74d9 Mon Sep 17 00:00:00 2001 +From e21c8b8fcdd3365ac19ae4024c0f615526358072 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 16 Mar 2017 10:52:41 -0400 Subject: [PATCH] gdm.conf-custom.in: strip out reference to wayland @@ -29,5 +29,5 @@ index 67ebca39..73d0b5f4 100644 #Enable=true -- -2.11.1 +2.14.2 diff --git a/SOURCES/0001-legacy-display-ensure-X-server-is-dead-when-respawni.patch b/SOURCES/0001-legacy-display-ensure-X-server-is-dead-when-respawni.patch deleted file mode 100644 index c519086..0000000 --- a/SOURCES/0001-legacy-display-ensure-X-server-is-dead-when-respawni.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 6f62469760cfe8b4c798135bba1d9ccaa7f4b0d2 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 12 Jul 2017 10:26:37 -0400 -Subject: [PATCH] legacy-display: ensure X server is dead when respawning - -If the user logs out we may detect the session dying before -we detect the X server dying. If that happens, then we -currently don't wait for the X server to exit before starting -a new X server. - -This commit makes sure to explicitly kill the X server and wait -for its death before proceeding. ---- - daemon/gdm-legacy-display.c | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - -diff --git a/daemon/gdm-legacy-display.c b/daemon/gdm-legacy-display.c -index 9c999232..46990ccc 100644 ---- a/daemon/gdm-legacy-display.c -+++ b/daemon/gdm-legacy-display.c -@@ -236,51 +236,72 @@ gdm_legacy_display_manage (GdmDisplay *display) - "server (your graphical environment) " - "due to an internal error. " - "Please contact your system administrator " - "or check your syslog to diagnose. " - "In the meantime this display will be " - "disabled. Please restart GDM when " - "the problem is corrected.")); - gdm_display_unmanage (GDM_DISPLAY (self)); - } - - g_debug ("GdmDisplay: Started X server"); - - } - - static void - gdm_legacy_display_class_init (GdmLegacyDisplayClass *klass) - { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass); - - object_class->constructor = gdm_legacy_display_constructor; - object_class->finalize = gdm_legacy_display_finalize; - - display_class->prepare = gdm_legacy_display_prepare; - display_class->manage = gdm_legacy_display_manage; - - g_type_class_add_private (klass, sizeof (GdmLegacyDisplayPrivate)); - } - - static void -+on_display_status_changed (GdmLegacyDisplay *self) -+{ -+ int status; -+ -+ status = gdm_display_get_status (self); -+ -+ switch (status) { -+ case GDM_DISPLAY_UNMANAGED: -+ if (self->priv->server != NULL) -+ gdm_server_stop (self->priv->server); -+ break; -+ default: -+ break; -+ } -+} -+ -+static void - gdm_legacy_display_init (GdmLegacyDisplay *legacy_display) - { - - legacy_display->priv = GDM_LEGACY_DISPLAY_GET_PRIVATE (legacy_display); -+ -+ g_signal_connect (legacy_display, "notify::status", -+ G_CALLBACK (on_display_status_changed), -+ NULL); - } - - GdmDisplay * - gdm_legacy_display_new (int display_number) - { - GObject *object; - char *x11_display; - - x11_display = g_strdup_printf (":%d", display_number); - object = g_object_new (GDM_TYPE_LEGACY_DISPLAY, - "x11-display-number", display_number, - "x11-display-name", x11_display, - NULL); - g_free (x11_display); - - return GDM_DISPLAY (object); - } --- -2.13.0 - diff --git a/SOURCES/0001-local-display-factory-add-missing-comma-to-fix-user-.patch b/SOURCES/0001-local-display-factory-add-missing-comma-to-fix-user-.patch deleted file mode 100644 index 6a59dca..0000000 --- a/SOURCES/0001-local-display-factory-add-missing-comma-to-fix-user-.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 4b07f66e36bb00d022494c9118e4dc12921bce6d Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 3 Apr 2017 13:25:58 -0400 -Subject: [PATCH] local-display-factory: add missing comma to fix user - switching - -commit 4b47633b36a22195e7976a8e597862eff695ca86 refactored some code -and inadvertently dropped an important comma, which broke user -switching. - -This commit reintroduces the comma. - -https://bugzilla.gnome.org/show_bug.cgi?id=780879 ---- - daemon/gdm-local-display-factory.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c -index 70987c71..7a4643d0 100644 ---- a/daemon/gdm-local-display-factory.c -+++ b/daemon/gdm-local-display-factory.c -@@ -192,61 +192,61 @@ store_display (GdmLocalDisplayFactory *factory, - /org/gnome/DisplayManager/Manager \ - org.gnome.DisplayManager.Manager.GetDisplays - */ - gboolean - gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *factory, - char **id, - GError **error) - { - gboolean ret; - GdmDisplay *display = NULL; - - g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); - - ret = FALSE; - - g_debug ("GdmLocalDisplayFactory: Creating transient display"); - - #ifdef ENABLE_USER_DISPLAY_SERVER - display = gdm_local_display_new (); - #else - if (display == NULL) { - guint32 num; - - num = take_next_display_number (factory); - - display = gdm_legacy_display_new (num); - } - #endif - - g_object_set (display, -- "seat-id", "seat0" -+ "seat-id", "seat0", - "allow-timed-login", FALSE, - NULL); - - store_display (factory, display); - - if (! gdm_display_manage (display)) { - display = NULL; - goto out; - } - - if (! gdm_display_get_id (display, id, NULL)) { - display = NULL; - goto out; - } - - ret = TRUE; - out: - /* ref either held by store or not at all */ - g_object_unref (display); - - return ret; - } - - static void - on_display_status_changed (GdmDisplay *display, - GParamSpec *arg1, - GdmLocalDisplayFactory *factory) - { - int status; - GdmDisplayStore *store; --- -2.12.0 - diff --git a/SOURCES/0001-manager-be-more-robust-against-autologin-having-an-i.patch b/SOURCES/0001-manager-be-more-robust-against-autologin-having-an-i.patch deleted file mode 100644 index aeb46c4..0000000 --- a/SOURCES/0001-manager-be-more-robust-against-autologin-having-an-i.patch +++ /dev/null @@ -1,430 +0,0 @@ -From 5afc4cd548f3ae8db9fbaab32fe2189efff37677 Mon Sep 17 00:00:00 2001 -From: Michael Catanzaro -Date: Tue, 12 Jan 2016 21:42:15 -0600 -Subject: [PATCH 01/13] manager: be more robust against autologin having an - invalid user - -If the configured autologin user does not exist, fall back to a -greeter session. - -https://bugzilla.gnome.org/show_bug.cgi?id=695250 ---- - configure.ac | 2 +- - daemon/gdm-manager.c | 115 +++++++++++++++++++++++++++++++++++++-------------- - 2 files changed, 86 insertions(+), 31 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 6613097b..119297c5 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -36,61 +36,61 @@ AC_SUBST(LT_AGE) - - AC_HEADER_STDC - - AC_SUBST(VERSION) - - AC_CONFIG_HEADERS(config.h) - AC_CONFIG_MACRO_DIR([m4]) - - # Documentation - enable_documentation=no - m4_ifdef([YELP_HELP_INIT],[ - YELP_HELP_INIT - enable_documentation=yes - ]) - AM_CONDITIONAL(ENABLE_DOCUMENTATION, test x$enable_documentation = xyes) - - # i18n stuff - IT_PROG_INTLTOOL([0.40.0]) - - GETTEXT_PACKAGE=gdm - AC_SUBST(GETTEXT_PACKAGE) - AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [gettext package]) - - dnl --------------------------------------------------------------------------- - dnl - Dependencies - dnl --------------------------------------------------------------------------- - - GLIB_REQUIRED_VERSION=2.36.0 - GTK_REQUIRED_VERSION=2.91.1 - LIBCANBERRA_GTK_REQUIRED_VERSION=0.4 --ACCOUNTS_SERVICE_REQUIRED_VERSION=0.6.12 -+ACCOUNTS_SERVICE_REQUIRED_VERSION=0.6.35 - - EXTRA_COMPILE_WARNINGS(yes) - - PKG_CHECK_MODULES(GTHREAD, gthread-2.0) - AC_SUBST(GTHREAD_CFLAGS) - AC_SUBST(GTHREAD_LIBS) - - PKG_CHECK_MODULES(COMMON, - gobject-2.0 >= $GLIB_REQUIRED_VERSION - gio-2.0 >= $GLIB_REQUIRED_VERSION - gio-unix-2.0 >= $GLIB_REQUIRED_VERSION - ) - AC_SUBST(COMMON_CFLAGS) - AC_SUBST(COMMON_LIBS) - - PKG_CHECK_MODULES(DAEMON, - gobject-2.0 >= $GLIB_REQUIRED_VERSION - gio-2.0 >= $GLIB_REQUIRED_VERSION - gio-unix-2.0 >= $GLIB_REQUIRED_VERSION - accountsservice >= $ACCOUNTS_SERVICE_REQUIRED_VERSION - xcb - ) - AC_SUBST(DAEMON_CFLAGS) - AC_SUBST(DAEMON_LIBS) - - GLIB_GSETTINGS - - PKG_CHECK_MODULES(XLIB, x11 xau, , - [AC_PATH_XTRA - if test "x$no_x" = xyes; then -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 35a7a0fe..e78228b4 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -7,60 +7,62 @@ - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - - #include "config.h" - - #include - #include - #include - #include - #include - #include - #include - #include - - #include - #include - #include - #include - -+#include -+ - #include - - #include "gdm-common.h" - - #include "gdm-dbus-util.h" - #include "gdm-manager.h" - #include "gdm-manager-glue.h" - #include "gdm-display-store.h" - #include "gdm-display-factory.h" - #include "gdm-local-display.h" - #include "gdm-local-display-factory.h" - #include "gdm-session.h" - #include "gdm-session-record.h" - #include "gdm-settings-direct.h" - #include "gdm-settings-keys.h" - #include "gdm-xdmcp-display-factory.h" - - #define GDM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_MANAGER, GdmManagerPrivate)) - - #define GDM_DBUS_PATH "/org/gnome/DisplayManager" - #define GDM_MANAGER_PATH GDM_DBUS_PATH "/Manager" - #define GDM_MANAGER_DISPLAYS_PATH GDM_DBUS_PATH "/Displays" - - #define INITIAL_SETUP_USERNAME "gnome-initial-setup" - - typedef struct - { - GdmManager *manager; - GdmSession *session; - char *service_name; -@@ -1227,79 +1229,60 @@ get_automatic_login_details (GdmManager *manager, - if (res && enabled) { - res = gdm_settings_direct_get_string (GDM_KEY_AUTO_LOGIN_USER, &username); - } - - if (enabled && res && username != NULL && username[0] != '\0') { - goto out; - } - - g_free (username); - username = NULL; - enabled = FALSE; - - out: - if (enabled) { - g_debug ("GdmDisplay: Got automatic login details for display: %d %s", - enabled, - username); - } else { - g_debug ("GdmDisplay: Got automatic login details for display: 0"); - } - - if (usernamep != NULL) { - *usernamep = username; - } else { - g_free (username); - } - - return enabled; - } - --static gboolean --display_should_autologin (GdmManager *manager, -- GdmDisplay *display) --{ -- gboolean enabled = FALSE; -- -- if (manager->priv->ran_once) { -- return FALSE; -- } -- -- if (!display_is_on_seat0 (display)) { -- return FALSE; -- } -- -- enabled = get_automatic_login_details (manager, NULL); -- -- return enabled; --} -- - static void - maybe_start_pending_initial_login (GdmManager *manager, - GdmDisplay *greeter_display) - { - StartUserSessionOperation *operation; - char *greeter_seat_id = NULL; - char *user_session_seat_id = NULL; - - /* There may be a user session waiting to be started. - * This would happen if we couldn't start it earlier because - * the login screen X server was coming up and two X servers - * can't be started on the same seat at the same time. - */ - - if (manager->priv->initial_login_operation == NULL) { - return; - } - - operation = manager->priv->initial_login_operation; - - g_object_get (G_OBJECT (greeter_display), - "seat-id", &greeter_seat_id, - NULL); - g_object_get (G_OBJECT (operation->session), - "display-seat-id", &user_session_seat_id, - NULL); - - if (g_strcmp0 (greeter_seat_id, user_session_seat_id) == 0) { - start_user_session (manager, operation); - manager->priv->initial_login_operation = NULL; -@@ -1347,114 +1330,186 @@ set_up_automatic_login_session (GdmManager *manager, - g_object_set (G_OBJECT (session), - "display-is-initial", is_initial, - NULL); - - g_debug ("GdmManager: Starting automatic login conversation"); - gdm_session_start_conversation (session, "gdm-autologin"); - } - - static void - set_up_greeter_session (GdmManager *manager, - GdmDisplay *display) - { - const char *allowed_user; - struct passwd *passwd_entry; - - allowed_user = get_username_for_greeter_display (manager, display); - - if (!gdm_get_pwent_for_name (allowed_user, &passwd_entry)) { - g_warning ("GdmManager: couldn't look up username %s", - allowed_user); - gdm_display_unmanage (display); - gdm_display_finish (display); - return; - } - - create_embryonic_user_session_for_display (manager, display, passwd_entry->pw_uid); - gdm_display_start_greeter_session (display); - } - - static void -+set_up_automatic_login_session_if_user_exists (GdmManager *manager, -+ GdmDisplay *display, -+ ActUser *user) -+{ -+ if (act_user_is_nonexistent (user)) -+ set_up_greeter_session (manager, display); -+ else -+ set_up_automatic_login_session (manager, display); -+} -+ -+typedef struct { -+ GdmManager *manager; -+ GdmDisplay *display; -+ char *username; -+} UsernameLookupOperation; -+ -+static void -+destroy_username_lookup_operation (UsernameLookupOperation *operation) -+{ -+ g_object_unref (operation->manager); -+ g_object_unref (operation->display); -+ g_free (operation->username); -+ g_free (operation); -+} -+ -+static void -+on_user_is_loaded_changed (ActUser *user, -+ GParamSpec *pspec, -+ UsernameLookupOperation *operation) -+{ -+ if (act_user_is_loaded (user)) { -+ set_up_automatic_login_session_if_user_exists (operation->manager, operation->display, user); -+ g_signal_handlers_disconnect_by_func (G_OBJECT (user), -+ G_CALLBACK (on_user_is_loaded_changed), -+ operation); -+ destroy_username_lookup_operation (operation); -+ } -+} -+ -+static void -+set_up_session (GdmManager *manager, -+ GdmDisplay *display) -+{ -+ ActUserManager *user_manager; -+ ActUser *user; -+ gboolean loaded; -+ gboolean autologin_enabled = FALSE; -+ char *username = NULL; -+ -+ if (!manager->priv->ran_once && display_is_on_seat0 (display)) -+ autologin_enabled = get_automatic_login_details (manager, &username); -+ -+ if (!autologin_enabled) { -+ set_up_greeter_session (manager, display); -+ g_free (username); -+ return; -+ } -+ -+ /* Check whether the user really exists before committing to autologin. */ -+ user_manager = act_user_manager_get_default (); -+ user = act_user_manager_get_user (user_manager, username); -+ g_object_get (user_manager, "is-loaded", &loaded, NULL); -+ -+ if (loaded) { -+ set_up_automatic_login_session_if_user_exists (manager, display, user); -+ } else { -+ UsernameLookupOperation *operation; -+ -+ operation = g_new (UsernameLookupOperation, 1); -+ operation->manager = g_object_ref (manager); -+ operation->display = g_object_ref (display); -+ operation->username = username; -+ -+ g_signal_connect (user, -+ "notify::is-loaded", -+ G_CALLBACK (on_user_is_loaded_changed), -+ operation); -+ } -+} -+ -+static void - greeter_display_started (GdmManager *manager, - GdmDisplay *display) - { - if (manager->priv->ran_once) { - return; - } - - maybe_start_pending_initial_login (manager, display); - - manager->priv->ran_once = TRUE; - } - - static void - on_display_status_changed (GdmDisplay *display, - GParamSpec *arg1, - GdmManager *manager) - { - int status; - int display_number = -1; - #ifdef WITH_PLYMOUTH - gboolean display_is_local = FALSE; - gboolean quit_plymouth = FALSE; - - g_object_get (display, - "is-local", &display_is_local, - NULL); - quit_plymouth = display_is_local && manager->priv->plymouth_is_running; - #endif - - g_object_get (display, "x11-display-number", &display_number, NULL); - - status = gdm_display_get_status (display); - - switch (status) { - case GDM_DISPLAY_PREPARED: - case GDM_DISPLAY_MANAGED: - if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) || - (display_number != -1 && status == GDM_DISPLAY_MANAGED)) { - char *session_class; - - g_object_get (display, - "session-class", &session_class, - NULL); -- if (g_strcmp0 (session_class, "greeter") == 0) { -- gboolean will_autologin; -- -- will_autologin = display_should_autologin (manager, display); -- -- if (will_autologin) { -- set_up_automatic_login_session (manager, display); -- } else { -- set_up_greeter_session (manager, display); -- } -- } -+ if (g_strcmp0 (session_class, "greeter") == 0) -+ set_up_session (manager, display); - g_free (session_class); - } - - if (status == GDM_DISPLAY_MANAGED) { - greeter_display_started (manager, display); - } - break; - case GDM_DISPLAY_FAILED: - case GDM_DISPLAY_UNMANAGED: - case GDM_DISPLAY_FINISHED: - #ifdef WITH_PLYMOUTH - if (quit_plymouth) { - plymouth_quit_without_transition (); - manager->priv->plymouth_is_running = FALSE; - } - #endif - - maybe_start_pending_initial_login (manager, display); - break; - default: - break; - } - - } - - static void - on_display_removed (GdmDisplayStore *display_store, - const char *id, - GdmManager *manager) - { --- -2.12.0 - diff --git a/SOURCES/0001-manager-fix-dangling-pointer-free.patch b/SOURCES/0001-manager-fix-dangling-pointer-free.patch deleted file mode 100644 index 30d6ac7..0000000 --- a/SOURCES/0001-manager-fix-dangling-pointer-free.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 0317fe746acc1f14bcb64d740de813f9ca8f4e70 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 23 Aug 2017 09:26:11 -0400 -Subject: [PATCH] manager: fix dangling pointer free - -When reauthenticating, we can crash if no login screen -is running on the seat (for instance, when building -with --disable-user-display-server, and not user -switching). The crash is due to a dangling -pointer. - -This commit fixes that. - -https://bugzilla.gnome.org/show_bug.cgi?id=786656 ---- - daemon/gdm-manager.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 3eef745f..f001a36e 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -2003,62 +2003,62 @@ on_user_session_died (GdmSession *session, - static char * - get_display_device (GdmManager *manager, - GdmDisplay *display) - { - /* systemd finds the display device out on its own based on the display */ - return NULL; - } - - static void - on_session_reauthenticated (GdmSession *session, - const char *service_name, - GdmManager *manager) - { - gboolean fail_if_already_switched = FALSE; - - if (gdm_session_get_display_mode (session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) { - const char *seat_id; - char *session_id; - - seat_id = gdm_session_get_display_seat_id (session); - if (get_login_window_session_id (seat_id, &session_id)) { - GdmDisplay *display = gdm_display_store_find (manager->priv->display_store, - lookup_by_session_id, - (gpointer) session_id); - - if (display != NULL) { - gdm_display_stop_greeter_session (display); - gdm_display_unmanage (display); - gdm_display_finish (display); - } -+ g_free (session_id); - } -- g_free (session_id); - } - - /* There should already be a session running, so jump to its - * VT. In the event we're already on the right VT, (i.e. user - * used an unlock screen instead of a user switched login screen), - * then silently succeed and unlock the session. - */ - switch_to_compatible_user_session (manager, session, fail_if_already_switched); - } - - static void - on_session_client_ready_for_session_to_start (GdmSession *session, - const char *service_name, - gboolean client_is_ready, - GdmManager *manager) - { - gboolean waiting_to_start_user_session; - - if (client_is_ready) { - g_debug ("GdmManager: Will start session when ready"); - } else { - g_debug ("GdmManager: Will start session when ready and told"); - } - - waiting_to_start_user_session = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session), - "waiting-to-start")); - - g_object_set_data (G_OBJECT (session), - "start-when-ready", - GINT_TO_POINTER (client_is_ready)); --- -2.14.3 - diff --git a/SOURCES/0001-manager-make-sure-we-end-up-on-a-login-screen.patch b/SOURCES/0001-manager-make-sure-we-end-up-on-a-login-screen.patch deleted file mode 100644 index bd03bdb..0000000 --- a/SOURCES/0001-manager-make-sure-we-end-up-on-a-login-screen.patch +++ /dev/null @@ -1,169 +0,0 @@ -From 73ebe0f786241e262ebf4358cc5638ffcb35f8a1 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 4 Apr 2017 17:07:04 -0400 -Subject: [PATCH 1/2] manager: make sure we end up on a login screen - -If we're running in legacy mode where VT1 is not necessarily a login -screen, then we can end up in a situation where logging out leaves us -sitting on the wrong vt. - -1) log in to user 1 on vt 1 -2) switch user to login screen on vt 2 and log in as user 2 on vt 2 -3) switch user to login screen on vt 3 and unlock user 1 back on vt 1 -4) log out of user 1 on vt 1 -5) now sitting at blank vt 1 - -This commit makes sure in that case we jump to a login screen ---- - daemon/gdm-manager.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 128 insertions(+) - -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 373778d..6ffb842 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -1312,6 +1312,133 @@ maybe_start_pending_initial_login (GdmManager *manager, - g_free (user_session_seat_id); - } - -+static gboolean -+get_login_window_session_id (const char *seat_id, -+ char **session_id) -+{ -+ gboolean ret; -+ int res, i; -+ char **sessions; -+ char *service_id; -+ char *service_class; -+ char *state; -+ -+ res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL); -+ if (res < 0) { -+ g_debug ("Failed to determine sessions: %s", strerror (-res)); -+ return FALSE; -+ } -+ -+ if (sessions == NULL || sessions[0] == NULL) { -+ *session_id = NULL; -+ ret = TRUE; -+ goto out; -+ } -+ -+ for (i = 0; sessions[i]; i ++) { -+ -+ res = sd_session_get_class (sessions[i], &service_class); -+ if (res < 0) { -+ g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res)); -+ ret = FALSE; -+ goto out; -+ } -+ -+ if (strcmp (service_class, "greeter") != 0) { -+ free (service_class); -+ continue; -+ } -+ -+ free (service_class); -+ -+ ret = sd_session_get_state (sessions[i], &state); -+ if (ret < 0) { -+ g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res)); -+ ret = FALSE; -+ goto out; -+ } -+ -+ if (g_strcmp0 (state, "closing") == 0) { -+ free (state); -+ continue; -+ } -+ free (state); -+ -+ res = sd_session_get_service (sessions[i], &service_id); -+ if (res < 0) { -+ g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res)); -+ ret = FALSE; -+ goto out; -+ } -+ -+ if (strcmp (service_id, "gdm-launch-environment") == 0) { -+ *session_id = g_strdup (sessions[i]); -+ ret = TRUE; -+ -+ free (service_id); -+ goto out; -+ } -+ -+ free (service_id); -+ } -+ -+ *session_id = NULL; -+ ret = TRUE; -+ -+out: -+ if (sessions) { -+ for (i = 0; sessions[i]; i ++) { -+ free (sessions[i]); -+ } -+ -+ free (sessions); -+ } -+ -+ return ret; -+} -+ -+static void -+activate_login_window_session_on_seat (GdmManager *self, -+ const char *seat_id) -+{ -+ char *session_id; -+ -+ if (!get_login_window_session_id (seat_id, &session_id)) { -+ return; -+ } -+ -+ activate_session_id (self, seat_id, session_id); -+} -+ -+static void -+maybe_activate_other_session (GdmManager *self, -+ GdmDisplay *old_display) -+{ -+ char *seat_id = NULL; -+ char *session_id; -+ int ret; -+ -+ g_object_get (G_OBJECT (old_display), -+ "seat-id", &seat_id, -+ NULL); -+ -+ ret = sd_seat_get_active (seat_id, &session_id, NULL); -+ -+ if (ret == 0) { -+ GdmDisplay *display; -+ -+ display = gdm_display_store_find (self->priv->display_store, -+ lookup_by_session_id, -+ (gpointer) session_id); -+ -+ if (display == NULL) { -+ activate_login_window_session_on_seat (self, seat_id); -+ } -+ } -+ -+ g_free (seat_id); -+} -+ - static const char * - get_username_for_greeter_display (GdmManager *manager, - GdmDisplay *display) -@@ -1545,6 +1672,7 @@ on_display_status_changed (GdmDisplay *display, - #endif - - maybe_start_pending_initial_login (manager, display); -+ maybe_activate_other_session (manager, display); - break; - default: - break; --- -1.8.3.1 - diff --git a/SOURCES/0001-manager-update-session-id-property-when-reusing-disp.patch b/SOURCES/0001-manager-update-session-id-property-when-reusing-disp.patch deleted file mode 100644 index 585fd65..0000000 --- a/SOURCES/0001-manager-update-session-id-property-when-reusing-disp.patch +++ /dev/null @@ -1,161 +0,0 @@ -From b1e364e4f5651888be7a075dad044b445e0f0236 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Thu, 4 May 2017 15:34:33 -0400 -Subject: [PATCH] manager: update session-id property when reusing display - -If a display starts out its life as a greeter display, and then -gets reused for the user session, we need to update the session-id -property on the display to match its new session. - -This is important so the reauthentication process match the -session with existing display and run in the proper context. ---- - daemon/gdm-manager.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 9201b9f8..3eef745f 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -1750,130 +1750,134 @@ start_user_session (GdmManager *manager, - static void - create_display_for_user_session (GdmManager *self, - GdmSession *session, - const char *session_id) - { - GdmDisplay *display; - /* at the moment we only create GdmLocalDisplay objects on seat0 */ - const char *seat_id = "seat0"; - - display = gdm_local_display_new (); - - g_object_set (G_OBJECT (display), - "session-class", "user", - "seat-id", seat_id, - "session-id", session_id, - NULL); - gdm_display_store_add (self->priv->display_store, - display); - g_object_set_data (G_OBJECT (session), "gdm-display", display); - } - - static gboolean - on_start_user_session (StartUserSessionOperation *operation) - { - GdmManager *self = operation->manager; - gboolean migrated; - gboolean fail_if_already_switched = TRUE; - gboolean doing_initial_setup = FALSE; - gboolean starting_user_session_right_away = TRUE; - GdmDisplay *display; -+ const char *session_id; - - g_debug ("GdmManager: start or jump to session"); - - /* If there's already a session running, jump to it. - * If the only session running is the one we just opened, - * start a session on it. - */ - migrated = switch_to_compatible_user_session (operation->manager, operation->session, fail_if_already_switched); - - g_debug ("GdmManager: migrated: %d", migrated); - if (migrated) { - /* We don't stop the manager here because - when Xorg exits it switches to the VT it was - started from. That interferes with fast - user switching. */ - gdm_session_reset (operation->session); - destroy_start_user_session_operation (operation); - goto out; - } - - display = get_display_for_user_session (operation->session); - - g_object_get (G_OBJECT (display), "doing-initial-setup", &doing_initial_setup, NULL); - -+ session_id = gdm_session_get_conversation_session_id (operation->session, -+ operation->service_name); -+ - if (gdm_session_get_display_mode (operation->session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) { - /* In this case, the greeter's display is morphing into - * the user session display. Kill the greeter on this session - * and let the user session follow the same display. */ - gdm_display_stop_greeter_session (display); -- g_object_set (G_OBJECT (display), "session-class", "user", NULL); -+ g_object_set (G_OBJECT (display), -+ "session-class", "user", -+ "session-id", session_id, -+ NULL); - } else { -- const char *session_id; - uid_t allowed_uid; - - g_object_ref (display); - if (doing_initial_setup) { - g_debug ("GdmManager: closing down initial setup display"); - gdm_display_stop_greeter_session (display); - gdm_display_unmanage (display); - gdm_display_finish (display); - - /* We can't start the user session until the finished display - * starts to respawn (since starting an X server and bringing - * one down at the same time is a no go) - */ - g_assert (self->priv->initial_login_operation == NULL); - self->priv->initial_login_operation = operation; - starting_user_session_right_away = FALSE; - } else { - g_debug ("GdmManager: session has its display server, reusing our server for another login screen"); - } - - /* The user session is going to follow the session worker - * into the new display. Untie it from this display and - * create a new embryonic session for a future user login. */ - allowed_uid = gdm_session_get_allowed_user (operation->session); - g_object_set_data (G_OBJECT (display), "gdm-embryonic-user-session", NULL); - g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL); - create_embryonic_user_session_for_display (operation->manager, display, allowed_uid); - - if (g_strcmp0 (operation->service_name, "gdm-autologin") == 0) { - /* remove the unused prepared greeter display since we're not going - * to have a greeter */ - gdm_display_store_remove (self->priv->display_store, display); - g_object_unref (display); - } - - /* Give the user session a new display object for bookkeeping purposes */ -- session_id = gdm_session_get_conversation_session_id (operation->session, -- operation->service_name); - create_display_for_user_session (operation->manager, - operation->session, - session_id); - } - - if (starting_user_session_right_away) { - start_user_session (operation->manager, operation); - } - - out: - return G_SOURCE_REMOVE; - } - - static void - queue_start_user_session (GdmManager *manager, - GdmSession *session, - const char *service_name) - { - StartUserSessionOperation *operation; - - operation = g_slice_new0 (StartUserSessionOperation); - operation->manager = manager; - operation->session = g_object_ref (session); - operation->service_name = g_strdup (service_name); - - operation->idle_id = g_idle_add ((GSourceFunc) on_start_user_session, operation); - g_object_set_data (G_OBJECT (session), "start-user-session-operation", operation); - } - - static void --- -2.12.2 - diff --git a/SOURCES/0001-worker-add-compat-patch-to-make-new-worker-work-with.patch b/SOURCES/0001-worker-add-compat-patch-to-make-new-worker-work-with.patch index fa796d3..58779ad 100644 --- a/SOURCES/0001-worker-add-compat-patch-to-make-new-worker-work-with.patch +++ b/SOURCES/0001-worker-add-compat-patch-to-make-new-worker-work-with.patch @@ -1,4 +1,4 @@ -From cc1eef39a91bdff761791a4ccb6074cca0888ea1 Mon Sep 17 00:00:00 2001 +From be25f936f6568af9019bf446c3cf2a19de5e167f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 12 May 2017 15:20:14 -0400 Subject: [PATCH] worker: add compat patch to make new worker work with old @@ -9,10 +9,10 @@ Subject: [PATCH] worker: add compat patch to make new worker work with old 1 file changed, 17 insertions(+) diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c -index dffc8917..81aaa5e7 100644 +index 10ecccb0..f71594c2 100644 --- a/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c -@@ -2897,69 +2897,86 @@ gdm_session_worker_handle_setup_for_user (GdmDBusWorker *object, +@@ -3140,69 +3140,86 @@ gdm_session_worker_handle_setup_for_user (GdmDBusWorker *object, static gboolean gdm_session_worker_handle_setup_for_program (GdmDBusWorker *object, GDBusMethodInvocation *invocation, @@ -100,5 +100,5 @@ index dffc8917..81aaa5e7 100644 g_debug ("GdmSessionWorker: client connected to reauthentication server"); } -- -2.12.2 +2.14.2 diff --git a/SOURCES/0002-manager-stop-transient-greeter-session-when-done-wit.patch b/SOURCES/0002-manager-stop-transient-greeter-session-when-done-wit.patch deleted file mode 100644 index c2ba6f6..0000000 --- a/SOURCES/0002-manager-stop-transient-greeter-session-when-done-wit.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 66250ce6402087d2e08f2008782edc02a0d013b0 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 5 Apr 2017 12:11:20 -0400 -Subject: [PATCH 2/2] manager: stop transient greeter session when done with it - -If we're running in legacy display mode, we currently can -end up with a leaked greeter following user switching. -That can happen if a user with an already running session -is reauthenticated (so the login screen won't morph into the -use session). - -This commit makes sure we kill the greeter session off in that -case. ---- - daemon/gdm-manager.c | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 6ffb842..9201b9f 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -2010,6 +2010,26 @@ on_session_reauthenticated (GdmSession *session, - GdmManager *manager) - { - gboolean fail_if_already_switched = FALSE; -+ -+ if (gdm_session_get_display_mode (session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) { -+ const char *seat_id; -+ char *session_id; -+ -+ seat_id = gdm_session_get_display_seat_id (session); -+ if (get_login_window_session_id (seat_id, &session_id)) { -+ GdmDisplay *display = gdm_display_store_find (manager->priv->display_store, -+ lookup_by_session_id, -+ (gpointer) session_id); -+ -+ if (display != NULL) { -+ gdm_display_stop_greeter_session (display); -+ gdm_display_unmanage (display); -+ gdm_display_finish (display); -+ } -+ } -+ g_free (session_id); -+ } -+ - /* There should already be a session running, so jump to its - * VT. In the event we're already on the right VT, (i.e. user - * used an unlock screen instead of a user switched login screen), --- -1.8.3.1 - diff --git a/SOURCES/0003-launch-environment-fix-crasher-when-session-mode-isn.patch b/SOURCES/0003-launch-environment-fix-crasher-when-session-mode-isn.patch deleted file mode 100644 index f9ce1d4..0000000 --- a/SOURCES/0003-launch-environment-fix-crasher-when-session-mode-isn.patch +++ /dev/null @@ -1,94 +0,0 @@ -From c29c4587ffc1ac7b923a2725a9f8fee0579124d1 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Mon, 27 Mar 2017 16:56:29 -0400 -Subject: [PATCH 03/13] launch-environment: fix crasher when session-mode isn't - set - -This commit fixes a crasher when starting the indirect chooser. ---- - daemon/gdm-launch-environment.c | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c -index a30276b4..4372ac29 100644 ---- a/daemon/gdm-launch-environment.c -+++ b/daemon/gdm-launch-environment.c -@@ -128,68 +128,69 @@ build_launch_environment (GdmLaunchEnvironment *launch_environment, - "XDG_CONFIG_DIRS", NULL - }; - char *system_data_dirs; - int i; - - /* create a hash table of current environment, then update keys has necessary */ - hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - for (i = 0; optional_environment[i] != NULL; i++) { - if (g_getenv (optional_environment[i]) == NULL) { - continue; - } - - g_hash_table_insert (hash, - g_strdup (optional_environment[i]), - g_strdup (g_getenv (optional_environment[i]))); - } - - system_data_dirs = g_strjoinv (":", (char **) g_get_system_data_dirs ()); - - g_hash_table_insert (hash, - g_strdup ("XDG_DATA_DIRS"), - g_strdup_printf ("%s:%s", - DATADIR "/gdm/greeter", - system_data_dirs)); - g_free (system_data_dirs); - - if (launch_environment->priv->x11_authority_file != NULL) - g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (launch_environment->priv->x11_authority_file)); - -- if (launch_environment->priv->session_mode != NULL) -+ if (launch_environment->priv->session_mode != NULL) { - g_hash_table_insert (hash, g_strdup ("GNOME_SHELL_SESSION_MODE"), g_strdup (launch_environment->priv->session_mode)); - -- /* Inital setup needs gvfs for fetching remote avatars. */ -- if (strcmp (launch_environment->priv->session_mode, INITIAL_SETUP_SESSION_MODE) != 0) { -- g_hash_table_insert (hash, g_strdup ("GVFS_DISABLE_FUSE"), g_strdup ("1")); -- g_hash_table_insert (hash, g_strdup ("GIO_USE_VFS"), g_strdup ("local")); -- g_hash_table_insert (hash, g_strdup ("GVFS_REMOTE_VOLUME_MONITOR_IGNORE"), g_strdup ("1")); -+ /* Inital setup needs gvfs for fetching remote avatars. */ -+ if (strcmp (launch_environment->priv->session_mode, INITIAL_SETUP_SESSION_MODE) != 0) { -+ g_hash_table_insert (hash, g_strdup ("GVFS_DISABLE_FUSE"), g_strdup ("1")); -+ g_hash_table_insert (hash, g_strdup ("GIO_USE_VFS"), g_strdup ("local")); -+ g_hash_table_insert (hash, g_strdup ("GVFS_REMOTE_VOLUME_MONITOR_IGNORE"), g_strdup ("1")); -+ } - } - - g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (launch_environment->priv->user_name)); - g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (launch_environment->priv->user_name)); - g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (launch_environment->priv->user_name)); - - g_hash_table_insert (hash, g_strdup ("GDM_VERSION"), g_strdup (VERSION)); - g_hash_table_remove (hash, "MAIL"); - - g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/")); - g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/")); - g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh")); - - gdm_get_pwent_for_name (launch_environment->priv->user_name, &pwent); - if (pwent != NULL) { - if (pwent->pw_dir != NULL && pwent->pw_dir[0] != '\0') { - g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pwent->pw_dir)); - g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pwent->pw_dir)); - } - - g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell)); - } - - if (start_session && launch_environment->priv->x11_display_seat_id != NULL) { - char *seat_id; - - seat_id = launch_environment->priv->x11_display_seat_id; - - g_hash_table_insert (hash, g_strdup ("GDM_SEAT_ID"), g_strdup (seat_id)); - } --- -2.12.0 - diff --git a/SOURCES/0004-manager-drop-some-erroneous-code.patch b/SOURCES/0004-manager-drop-some-erroneous-code.patch deleted file mode 100644 index f8cb492..0000000 --- a/SOURCES/0004-manager-drop-some-erroneous-code.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 7eae5842599eca46e14d57641f6629c60fe7a354 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 14:56:46 -0400 -Subject: [PATCH 04/13] manager: drop some erroneous code - -This is commit 82296a3350b64d0ed5ae3b9f6983466c60dd8a53 all over -again. The code snuck back in during a refactor ! ---- - daemon/gdm-manager.c | 18 ------------------ - 1 file changed, 18 deletions(-) - -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index e78228b4..3014dad3 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -1903,79 +1903,61 @@ on_session_client_connected (GdmSession *session, - } - #endif - - g_object_get (G_OBJECT (display), "allow-timed-login", &allow_timed_login, NULL); - - if (!allow_timed_login) { - return; - } - - enabled = get_timed_login_details (manager, &username, &delay); - - if (! enabled) { - return; - } - - gdm_session_set_timed_login_details (session, username, delay); - - g_debug ("GdmManager: Starting automatic login conversation (for timed login)"); - gdm_session_start_conversation (session, "gdm-autologin"); - - g_free (username); - - } - - static void - on_session_client_disconnected (GdmSession *session, - GCredentials *credentials, - GPid pid_of_client, - GdmManager *manager) - { -- GdmDisplay *display; -- gboolean display_is_local; -- - g_debug ("GdmManager: client disconnected"); -- -- display = get_display_for_user_session (session); -- -- if (display == NULL) { -- return; -- } -- -- g_object_get (G_OBJECT (display), -- "is-local", &display_is_local, -- NULL); -- -- if ( ! display_is_local && gdm_session_is_running (session)) { -- gdm_display_unmanage (display); -- gdm_display_finish (display); -- } - } - - typedef struct - { - GdmManager *manager; - GdmSession *session; - guint idle_id; - } ResetSessionOperation; - - static void - destroy_reset_session_operation (ResetSessionOperation *operation) - { - g_object_set_data (G_OBJECT (operation->session), - "reset-session-operation", - NULL); - g_object_unref (operation->session); - g_slice_free (ResetSessionOperation, operation); - } - - static gboolean - on_reset_session (ResetSessionOperation *operation) - { - gdm_session_reset (operation->session); - - destroy_reset_session_operation (operation); - - return G_SOURCE_REMOVE; - } - - static void --- -2.12.0 - diff --git a/SOURCES/0005-launch-environment-implement-hostname-selected-signa.patch b/SOURCES/0005-launch-environment-implement-hostname-selected-signa.patch deleted file mode 100644 index ac4324e..0000000 --- a/SOURCES/0005-launch-environment-implement-hostname-selected-signa.patch +++ /dev/null @@ -1,356 +0,0 @@ -From 239bc98692187ca42dca7cf1a19800415afcf6cf Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 15:01:06 -0400 -Subject: [PATCH 05/13] launch-environment: implement hostname-selected signal - -We're connecting to a signal that isn't implemented. This -commit adds the implementation. - -A slightly better fix might be to cut out some of the layers, -of middle men passing around hostname-selected, but for now this -is fine. ---- - daemon/gdm-launch-environment.c | 27 +++++++++++++++++++++++++++ - daemon/gdm-launch-environment.h | 2 ++ - 2 files changed, 29 insertions(+) - -diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c -index 4372ac29..a7ae6728 100644 ---- a/daemon/gdm-launch-environment.c -+++ b/daemon/gdm-launch-environment.c -@@ -76,60 +76,61 @@ struct GdmLaunchEnvironmentPrivate - char *x11_display_name; - char *x11_display_seat_id; - char *x11_display_device; - char *x11_display_hostname; - char *x11_authority_file; - gboolean x11_display_is_local; - }; - - enum { - PROP_0, - PROP_VERIFICATION_MODE, - PROP_SESSION_TYPE, - PROP_SESSION_MODE, - PROP_X11_DISPLAY_NAME, - PROP_X11_DISPLAY_SEAT_ID, - PROP_X11_DISPLAY_DEVICE, - PROP_X11_DISPLAY_HOSTNAME, - PROP_X11_AUTHORITY_FILE, - PROP_X11_DISPLAY_IS_LOCAL, - PROP_USER_NAME, - PROP_RUNTIME_DIR, - PROP_COMMAND, - }; - - enum { - OPENED, - STARTED, - STOPPED, - EXITED, - DIED, -+ HOSTNAME_SELECTED, - LAST_SIGNAL - }; - - static guint signals [LAST_SIGNAL] = { 0, }; - - static void gdm_launch_environment_class_init (GdmLaunchEnvironmentClass *klass); - static void gdm_launch_environment_init (GdmLaunchEnvironment *launch_environment); - static void gdm_launch_environment_finalize (GObject *object); - - G_DEFINE_TYPE (GdmLaunchEnvironment, gdm_launch_environment, G_TYPE_OBJECT) - - static GHashTable * - build_launch_environment (GdmLaunchEnvironment *launch_environment, - gboolean start_session) - { - GHashTable *hash; - struct passwd *pwent; - static const char * const optional_environment[] = { - "LANG", "LANGUAGE", "LC_CTYPE", "LC_NUMERIC", "LC_TIME", - "LC_COLLATE", "LC_MONETARY", "LC_MESSAGES", "LC_PAPER", - "LC_NAME", "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", - "LC_IDENTIFICATION", "LC_ALL", "WINDOWPATH", "XCURSOR_PATH", - "XDG_CONFIG_DIRS", NULL - }; - char *system_data_dirs; - int i; - - /* create a hash table of current environment, then update keys has necessary */ - hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - -@@ -237,60 +238,69 @@ static void - on_session_started (GdmSession *session, - const char *service_name, - int pid, - GdmLaunchEnvironment *launch_environment) - { - launch_environment->priv->pid = pid; - g_signal_emit (G_OBJECT (launch_environment), signals [STARTED], 0); - } - - static void - on_session_exited (GdmSession *session, - int exit_code, - GdmLaunchEnvironment *launch_environment) - { - gdm_session_stop_conversation (launch_environment->priv->session, "gdm-launch-environment"); - - g_signal_emit (G_OBJECT (launch_environment), signals [EXITED], 0, exit_code); - } - - static void - on_session_died (GdmSession *session, - int signal_number, - GdmLaunchEnvironment *launch_environment) - { - gdm_session_stop_conversation (launch_environment->priv->session, "gdm-launch-environment"); - - g_signal_emit (G_OBJECT (launch_environment), signals [DIED], 0, signal_number); - } - - static void -+on_hostname_selected (GdmSession *session, -+ const char *hostname, -+ GdmLaunchEnvironment *launch_environment) -+{ -+ g_debug ("GdmSession: hostname selected: %s", hostname); -+ g_signal_emit (launch_environment, signals [HOSTNAME_SELECTED], 0, hostname); -+} -+ -+static void - on_conversation_started (GdmSession *session, - const char *service_name, - GdmLaunchEnvironment *launch_environment) - { - char *log_path; - char *log_file; - - log_file = g_strdup_printf ("%s-greeter.log", launch_environment->priv->x11_display_name); - log_path = g_build_filename (LOGDIR, log_file, NULL); - g_free (log_file); - - gdm_session_setup_for_program (launch_environment->priv->session, - "gdm-launch-environment", - launch_environment->priv->user_name, - log_path); - g_free (log_path); - } - - static void - on_conversation_stopped (GdmSession *session, - const char *service_name, - GdmLaunchEnvironment *launch_environment) - { - GdmSession *conversation_session; - - conversation_session = launch_environment->priv->session; - launch_environment->priv->session = NULL; - - g_debug ("GdmLaunchEnvironment: conversation stopped"); - -@@ -382,60 +392,65 @@ gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment) - g_signal_connect_object (launch_environment->priv->session, - "conversation-stopped", - G_CALLBACK (on_conversation_stopped), - launch_environment, - 0); - g_signal_connect_object (launch_environment->priv->session, - "setup-complete", - G_CALLBACK (on_session_setup_complete), - launch_environment, - 0); - g_signal_connect_object (launch_environment->priv->session, - "session-opened", - G_CALLBACK (on_session_opened), - launch_environment, - 0); - g_signal_connect_object (launch_environment->priv->session, - "session-started", - G_CALLBACK (on_session_started), - launch_environment, - 0); - g_signal_connect_object (launch_environment->priv->session, - "session-exited", - G_CALLBACK (on_session_exited), - launch_environment, - 0); - g_signal_connect_object (launch_environment->priv->session, - "session-died", - G_CALLBACK (on_session_died), - launch_environment, - 0); -+ g_signal_connect_object (launch_environment->priv->session, -+ "hostname-selected", -+ G_CALLBACK (on_hostname_selected), -+ launch_environment, -+ 0); - - gdm_session_start_conversation (launch_environment->priv->session, "gdm-launch-environment"); - gdm_session_select_program (launch_environment->priv->session, launch_environment->priv->command); - - if (launch_environment->priv->session_type != NULL) { - g_object_set (G_OBJECT (launch_environment->priv->session), - "session-type", - launch_environment->priv->session_type, - NULL); - } - - res = TRUE; - out: - if (local_error) { - g_critical ("GdmLaunchEnvironment: %s", local_error->message); - g_clear_error (&local_error); - } - return res; - } - - gboolean - gdm_launch_environment_stop (GdmLaunchEnvironment *launch_environment) - { - if (launch_environment->priv->pid > 1) { - gdm_signal_pid (-launch_environment->priv->pid, SIGTERM); - } - - if (launch_environment->priv->session != NULL) { - gdm_session_close (launch_environment->priv->session); - -@@ -780,60 +795,72 @@ gdm_launch_environment_class_init (GdmLaunchEnvironmentClass *klass) - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, stopped), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals [EXITED] = - g_signal_new ("exited", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, exited), - NULL, - NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, - 1, - G_TYPE_INT); - signals [DIED] = - g_signal_new ("died", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, died), - NULL, - NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, - 1, - G_TYPE_INT); -+ -+ signals [HOSTNAME_SELECTED] = -+ g_signal_new ("hostname-selected", -+ G_OBJECT_CLASS_TYPE (object_class), -+ G_SIGNAL_RUN_FIRST, -+ G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, hostname_selected), -+ NULL, -+ NULL, -+ g_cclosure_marshal_VOID__STRING, -+ G_TYPE_NONE, -+ 1, -+ G_TYPE_STRING); - } - - static void - gdm_launch_environment_init (GdmLaunchEnvironment *launch_environment) - { - - launch_environment->priv = GDM_LAUNCH_ENVIRONMENT_GET_PRIVATE (launch_environment); - - launch_environment->priv->command = NULL; - launch_environment->priv->session = NULL; - } - - static void - gdm_launch_environment_finalize (GObject *object) - { - GdmLaunchEnvironment *launch_environment; - - g_return_if_fail (object != NULL); - g_return_if_fail (GDM_IS_LAUNCH_ENVIRONMENT (object)); - - launch_environment = GDM_LAUNCH_ENVIRONMENT (object); - - g_return_if_fail (launch_environment->priv != NULL); - - gdm_launch_environment_stop (launch_environment); - - if (launch_environment->priv->session) { - g_object_unref (launch_environment->priv->session); - } - -diff --git a/daemon/gdm-launch-environment.h b/daemon/gdm-launch-environment.h -index 3fd875c2..c2a09d1c 100644 ---- a/daemon/gdm-launch-environment.h -+++ b/daemon/gdm-launch-environment.h -@@ -32,55 +32,57 @@ G_BEGIN_DECLS - #define GDM_LAUNCH_ENVIRONMENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_LAUNCH_ENVIRONMENT, GdmLaunchEnvironmentClass)) - #define GDM_IS_LAUNCH_ENVIRONMENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_LAUNCH_ENVIRONMENT)) - #define GDM_IS_LAUNCH_ENVIRONMENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_LAUNCH_ENVIRONMENT)) - #define GDM_LAUNCH_ENVIRONMENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_LAUNCH_ENVIRONMENT, GdmLaunchEnvironmentClass)) - - typedef struct GdmLaunchEnvironmentPrivate GdmLaunchEnvironmentPrivate; - - typedef struct - { - GObject parent; - GdmLaunchEnvironmentPrivate *priv; - } GdmLaunchEnvironment; - - typedef struct - { - GObjectClass parent_class; - - /* methods */ - gboolean (*start) (GdmLaunchEnvironment *launch_environment); - gboolean (*stop) (GdmLaunchEnvironment *launch_environment); - - - /* signals */ - void (* opened) (GdmLaunchEnvironment *launch_environment); - void (* started) (GdmLaunchEnvironment *launch_environment); - void (* stopped) (GdmLaunchEnvironment *launch_environment); - void (* exited) (GdmLaunchEnvironment *launch_environment, - int exit_code); - void (* died) (GdmLaunchEnvironment *launch_environment, - int signal_number); -+ void (* hostname_selected) (GdmLaunchEnvironment *launch_environment, -+ const char *hostname); - } GdmLaunchEnvironmentClass; - - GType gdm_launch_environment_get_type (void); - - gboolean gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment); - gboolean gdm_launch_environment_stop (GdmLaunchEnvironment *launch_environment); - GdmSession * gdm_launch_environment_get_session (GdmLaunchEnvironment *launch_environment); - char * gdm_launch_environment_get_session_id (GdmLaunchEnvironment *launch_environment); - - GdmLaunchEnvironment *gdm_create_greeter_launch_environment (const char *display_name, - const char *seat_id, - const char *session_type, - const char *display_hostname, - gboolean display_is_local); - GdmLaunchEnvironment *gdm_create_initial_setup_launch_environment (const char *display_name, - const char *seat_id, - const char *display_hostname, - gboolean display_is_local); - GdmLaunchEnvironment *gdm_create_chooser_launch_environment (const char *display_name, - const char *seat_id, - const char *display_hostname); - - G_END_DECLS - - #endif /* __GDM_LAUNCH_ENVIRONMENT_H */ --- -2.12.0 - diff --git a/SOURCES/0006-manager-fix-up-support-for-chooser.patch b/SOURCES/0006-manager-fix-up-support-for-chooser.patch deleted file mode 100644 index c68bf23..0000000 --- a/SOURCES/0006-manager-fix-up-support-for-chooser.patch +++ /dev/null @@ -1,355 +0,0 @@ -From 60a03333bec4f7904a2cfddb291d22ce493e1ced Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 14:54:44 -0400 -Subject: [PATCH 06/13] manager: fix up support for chooser - -We were missing some chunks of code to handle dealing with -the chooser. - -This commit adds in the necessary bits to start the chooser, -and deal with the choice. ---- - daemon/gdm-manager.c | 62 ++++++++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 53 insertions(+), 9 deletions(-) - -diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 3014dad3..373778d9 100644 ---- a/daemon/gdm-manager.c -+++ b/daemon/gdm-manager.c -@@ -18,67 +18,69 @@ - * - */ - - #include "config.h" - - #include - #include - #include - #include - #include - #include - #include - #include - - #include - #include - #include - #include - - #include - - #include - - #include "gdm-common.h" - - #include "gdm-dbus-util.h" - #include "gdm-manager.h" - #include "gdm-manager-glue.h" - #include "gdm-display-store.h" - #include "gdm-display-factory.h" -+#include "gdm-launch-environment.h" - #include "gdm-local-display.h" - #include "gdm-local-display-factory.h" - #include "gdm-session.h" - #include "gdm-session-record.h" - #include "gdm-settings-direct.h" - #include "gdm-settings-keys.h" - #include "gdm-xdmcp-display-factory.h" -+#include "gdm-xdmcp-chooser-display.h" - - #define GDM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_MANAGER, GdmManagerPrivate)) - - #define GDM_DBUS_PATH "/org/gnome/DisplayManager" - #define GDM_MANAGER_PATH GDM_DBUS_PATH "/Manager" - #define GDM_MANAGER_DISPLAYS_PATH GDM_DBUS_PATH "/Displays" - - #define INITIAL_SETUP_USERNAME "gnome-initial-setup" - - typedef struct - { - GdmManager *manager; - GdmSession *session; - char *service_name; - guint idle_id; - } StartUserSessionOperation; - - struct GdmManagerPrivate - { - GdmDisplayStore *display_store; - GdmLocalDisplayFactory *local_factory; - #ifdef HAVE_LIBXDMCP - GdmXdmcpDisplayFactory *xdmcp_factory; - #endif - GList *user_sessions; - GHashTable *transient_sessions; - GHashTable *open_reauthentication_requests; - gboolean xdmcp_enabled; - GCancellable *cancellable; - -@@ -793,89 +795,107 @@ gdm_manager_handle_register_display (GdmDBusManager *manager, - /* FIXME: this should happen in gdm-session.c when the session is opened - */ - if (tty != NULL) - g_object_set (G_OBJECT (session), "display-device", tty, NULL); - - pid = gdm_session_get_pid (session); - - if (pid > 0) { - add_session_record (self, session, pid, SESSION_RECORD_LOGIN); - } - } - - g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL); - - gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager), - invocation); - - g_clear_pointer (&x11_display_name, g_free); - g_clear_pointer (&tty, g_free); - return TRUE; - } - - static gboolean - gdm_manager_handle_open_session (GdmDBusManager *manager, - GDBusMethodInvocation *invocation) - { - GdmManager *self = GDM_MANAGER (manager); - const char *sender; - GDBusConnection *connection; - GdmDisplay *display = NULL; -- GdmSession *session; -+ GdmSession *session = NULL; - const char *address; - GPid pid = 0; - uid_t uid = (uid_t) -1; - uid_t allowed_user; - - g_debug ("GdmManager: trying to open new session"); - - sender = g_dbus_method_invocation_get_sender (invocation); - connection = g_dbus_method_invocation_get_connection (invocation); - get_display_and_details_for_bus_sender (self, connection, sender, &display, NULL, NULL, NULL, &pid, &uid, NULL, NULL); - - if (display == NULL) { - g_dbus_method_invocation_return_error_literal (invocation, - G_DBUS_ERROR, - G_DBUS_ERROR_ACCESS_DENIED, - _("No session available")); - - return TRUE; - } - -- session = get_embryonic_user_session_for_display (display); -+ if (GDM_IS_XDMCP_CHOOSER_DISPLAY (display)) { -+ GdmLaunchEnvironment *launch_environment; - -- if (gdm_session_is_running (session)) { -- g_dbus_method_invocation_return_error_literal (invocation, -- G_DBUS_ERROR, -- G_DBUS_ERROR_ACCESS_DENIED, -- _("Can only be called before user is logged in")); -- return TRUE; -+ g_object_get (display, "launch-environment", &launch_environment, NULL); -+ -+ if (launch_environment != NULL) { -+ session = gdm_launch_environment_get_session (launch_environment); -+ } -+ -+ if (session == NULL) { -+ g_dbus_method_invocation_return_error_literal (invocation, -+ G_DBUS_ERROR, -+ G_DBUS_ERROR_ACCESS_DENIED, -+ _("Chooser session unavailable")); -+ return TRUE; -+ } -+ } else { -+ session = get_embryonic_user_session_for_display (display); -+ -+ if (gdm_session_is_running (session)) { -+ g_dbus_method_invocation_return_error_literal (invocation, -+ G_DBUS_ERROR, -+ G_DBUS_ERROR_ACCESS_DENIED, -+ _("Can only be called before user is logged in")); -+ return TRUE; -+ } - } - - allowed_user = gdm_session_get_allowed_user (session); - - if (uid != allowed_user) { - g_dbus_method_invocation_return_error_literal (invocation, - G_DBUS_ERROR, - G_DBUS_ERROR_ACCESS_DENIED, - _("Caller not GDM")); - return TRUE; - } - - address = gdm_session_get_server_address (session); - - if (address == NULL) { - g_dbus_method_invocation_return_error_literal (invocation, - G_DBUS_ERROR, - G_DBUS_ERROR_ACCESS_DENIED, - _("Unable to open private communication channel")); - return TRUE; - } - - gdm_dbus_manager_complete_open_session (GDM_DBUS_MANAGER (manager), - invocation, - address); - return TRUE; - } - - static void - close_transient_session (GdmManager *self, -@@ -1309,60 +1329,80 @@ get_username_for_greeter_display (GdmManager *manager, - } - } - - static void - set_up_automatic_login_session (GdmManager *manager, - GdmDisplay *display) - { - GdmSession *session; - char *display_session_type = NULL; - gboolean is_initial; - - /* 0 is root user; since the daemon talks to the session object - * directly, itself, for automatic login - */ - session = create_embryonic_user_session_for_display (manager, display, 0); - - g_object_get (G_OBJECT (display), - "is-initial", &is_initial, - "session-type", &display_session_type, - NULL); - - g_object_set (G_OBJECT (session), - "display-is-initial", is_initial, - NULL); - - g_debug ("GdmManager: Starting automatic login conversation"); - gdm_session_start_conversation (session, "gdm-autologin"); - } - - static void -+set_up_chooser_session (GdmManager *manager, -+ GdmDisplay *display) -+{ -+ const char *allowed_user; -+ struct passwd *passwd_entry; -+ -+ allowed_user = get_username_for_greeter_display (manager, display); -+ -+ if (!gdm_get_pwent_for_name (allowed_user, &passwd_entry)) { -+ g_warning ("GdmManager: couldn't look up username %s", -+ allowed_user); -+ gdm_display_unmanage (display); -+ gdm_display_finish (display); -+ return; -+ } -+ -+ gdm_display_start_greeter_session (display); -+} -+ -+static void - set_up_greeter_session (GdmManager *manager, - GdmDisplay *display) - { - const char *allowed_user; - struct passwd *passwd_entry; - - allowed_user = get_username_for_greeter_display (manager, display); - - if (!gdm_get_pwent_for_name (allowed_user, &passwd_entry)) { - g_warning ("GdmManager: couldn't look up username %s", - allowed_user); - gdm_display_unmanage (display); - gdm_display_finish (display); - return; - } - - create_embryonic_user_session_for_display (manager, display, passwd_entry->pw_uid); - gdm_display_start_greeter_session (display); - } - - static void - set_up_automatic_login_session_if_user_exists (GdmManager *manager, - GdmDisplay *display, - ActUser *user) - { - if (act_user_is_nonexistent (user)) - set_up_greeter_session (manager, display); - else - set_up_automatic_login_session (manager, display); - } -@@ -1383,61 +1423,65 @@ destroy_username_lookup_operation (UsernameLookupOperation *operation) - } - - static void - on_user_is_loaded_changed (ActUser *user, - GParamSpec *pspec, - UsernameLookupOperation *operation) - { - if (act_user_is_loaded (user)) { - set_up_automatic_login_session_if_user_exists (operation->manager, operation->display, user); - g_signal_handlers_disconnect_by_func (G_OBJECT (user), - G_CALLBACK (on_user_is_loaded_changed), - operation); - destroy_username_lookup_operation (operation); - } - } - - static void - set_up_session (GdmManager *manager, - GdmDisplay *display) - { - ActUserManager *user_manager; - ActUser *user; - gboolean loaded; - gboolean autologin_enabled = FALSE; - char *username = NULL; - - if (!manager->priv->ran_once && display_is_on_seat0 (display)) - autologin_enabled = get_automatic_login_details (manager, &username); - - if (!autologin_enabled) { -- set_up_greeter_session (manager, display); -+ if (GDM_IS_XDMCP_CHOOSER_DISPLAY (display)) { -+ set_up_chooser_session (manager, display); -+ } else { -+ set_up_greeter_session (manager, display); -+ } - g_free (username); - return; - } - - /* Check whether the user really exists before committing to autologin. */ - user_manager = act_user_manager_get_default (); - user = act_user_manager_get_user (user_manager, username); - g_object_get (user_manager, "is-loaded", &loaded, NULL); - - if (loaded) { - set_up_automatic_login_session_if_user_exists (manager, display, user); - } else { - UsernameLookupOperation *operation; - - operation = g_new (UsernameLookupOperation, 1); - operation->manager = g_object_ref (manager); - operation->display = g_object_ref (display); - operation->username = username; - - g_signal_connect (user, - "notify::is-loaded", - G_CALLBACK (on_user_is_loaded_changed), - operation); - } - } - - static void - greeter_display_started (GdmManager *manager, - GdmDisplay *display) - { --- -2.12.0 - diff --git a/SOURCES/0007-xdmcp-display-don-t-set-MANAGED-until-we-ve-connecte.patch b/SOURCES/0007-xdmcp-display-don-t-set-MANAGED-until-we-ve-connecte.patch deleted file mode 100644 index c12e90b..0000000 --- a/SOURCES/0007-xdmcp-display-don-t-set-MANAGED-until-we-ve-connecte.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 9367cdcb777cabacc5cb436155e4ab7c32dc74ef Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 14:52:23 -0400 -Subject: [PATCH 07/13] xdmcp-display: don't set MANAGED until we've connected - -We don't want to start the greeter session until we've -successfully connected to the display ourselves! - -This prevents a race where session processes may inadvertently - get the initial connection to the display server, causing -premature resets. ---- - daemon/gdm-xdmcp-display.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/daemon/gdm-xdmcp-display.c b/daemon/gdm-xdmcp-display.c -index c9f9c3d2..630844f2 100644 ---- a/daemon/gdm-xdmcp-display.c -+++ b/daemon/gdm-xdmcp-display.c -@@ -166,80 +166,79 @@ gdm_xdmcp_display_prepare (GdmDisplay *display) - NULL); - - if (launch_environment == NULL) { - launch_environment = gdm_create_greeter_launch_environment (display_name, - seat_id, - NULL, - hostname, - FALSE); - g_object_set (self, "launch-environment", launch_environment, NULL); - g_object_unref (launch_environment); - } - - if (!gdm_display_create_authority (display)) { - g_warning ("Unable to set up access control for display %s", - display_name); - return FALSE; - } - - return GDM_DISPLAY_CLASS (gdm_xdmcp_display_parent_class)->prepare (display); - } - - static gboolean - idle_connect_to_display (GdmXdmcpDisplay *self) - { - gboolean res; - - self->priv->connection_attempts++; - - res = gdm_display_connect (GDM_DISPLAY (self)); - if (res) { -+ g_object_set (G_OBJECT (self), "status", GDM_DISPLAY_MANAGED, NULL); - } else { - if (self->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) { - g_warning ("Unable to connect to display after %d tries - bailing out", self->priv->connection_attempts); - gdm_display_unmanage (GDM_DISPLAY (self)); - return FALSE; - } - return TRUE; - } - - return FALSE; - } - - static void - gdm_xdmcp_display_manage (GdmDisplay *display) - { - GdmXdmcpDisplay *self = GDM_XDMCP_DISPLAY (display); - - g_timeout_add (500, (GSourceFunc)idle_connect_to_display, self); -- -- g_object_set (G_OBJECT (self), "status", GDM_DISPLAY_MANAGED, NULL); - } - - static void - gdm_xdmcp_display_class_init (GdmXdmcpDisplayClass *klass) - { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass); - - object_class->get_property = gdm_xdmcp_display_get_property; - object_class->set_property = gdm_xdmcp_display_set_property; - - display_class->prepare = gdm_xdmcp_display_prepare; - display_class->manage = gdm_xdmcp_display_manage; - - g_type_class_add_private (klass, sizeof (GdmXdmcpDisplayPrivate)); - - g_object_class_install_property (object_class, - PROP_REMOTE_ADDRESS, - g_param_spec_boxed ("remote-address", - "Remote address", - "Remote address", - GDM_TYPE_ADDRESS, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - - g_object_class_install_property (object_class, - PROP_SESSION_NUMBER, - g_param_spec_int ("session-number", - "session-number", - "session-number", - G_MININT, --- -2.12.0 - diff --git a/SOURCES/0008-xdmcp-display-factory-fix-signal-prototype.patch b/SOURCES/0008-xdmcp-display-factory-fix-signal-prototype.patch deleted file mode 100644 index 8afb79b..0000000 --- a/SOURCES/0008-xdmcp-display-factory-fix-signal-prototype.patch +++ /dev/null @@ -1,82 +0,0 @@ -From af841691f3e48ff7635df21703115c5b109ba9dc Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 14:58:26 -0400 -Subject: [PATCH 08/13] xdmcp-display-factory: fix signal prototype - -The callback was getting called with the wrong arguments leading -to spew in the logs and necessary code not getting run! ---- - daemon/gdm-xdmcp-display-factory.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c -index b9ab921c..c5f7ddb4 100644 ---- a/daemon/gdm-xdmcp-display-factory.c -+++ b/daemon/gdm-xdmcp-display-factory.c -@@ -2023,61 +2023,62 @@ on_hostname_selected (GdmXdmcpChooserDisplay *display, - #ifdef AI_V4MAPPED - hints.ai_flags = AI_V4MAPPED; - #endif - - xdmcp_port = g_strdup_printf ("%d", XDM_UDP_PORT); - if ((gaierr = getaddrinfo (hostname, xdmcp_port, &hints, &ai_list)) != 0) { - g_warning ("Unable to get address: %s", gai_strerror (gaierr)); - g_free (xdmcp_port); - return; - } - g_free (xdmcp_port); - - /* just take the first one */ - ai = ai_list; - - if (ai != NULL) { - char *ip; - ic->chosen_address = gdm_address_new_from_sockaddr (ai->ai_addr, ai->ai_addrlen); - - ip = NULL; - gdm_address_get_numeric_info (ic->chosen_address, &ip, NULL); - g_debug ("GdmXdmcpDisplayFactory: hostname resolves to %s", - ip ? ip : "(null)"); - g_free (ip); - } - - freeaddrinfo (ai_list); - } - - static void --on_client_disconnected (GdmDisplay *display) -+on_client_disconnected (GdmSession *session, -+ GdmDisplay *display) - { - if (gdm_display_get_status (display) != GDM_DISPLAY_MANAGED) - return; - - gdm_display_unmanage (display); - gdm_display_finish (display); - } - - static void - on_display_status_changed (GdmDisplay *display, - GParamSpec *arg1, - GdmXdmcpDisplayFactory *factory) - { - int status; - GdmDisplayStore *store; - GdmLaunchEnvironment *launch_environment; - GdmSession *session; - GdmAddress *address; - gint32 session_number; - int display_number; - - store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); - - launch_environment = NULL; - g_object_get (display, "launch-environment", &launch_environment, NULL); - - session = NULL; - if (launch_environment != NULL) { - session = gdm_launch_environment_get_session (launch_environment); - } --- -2.12.0 - diff --git a/SOURCES/0009-xdmcp-display-factory-explicitly-stop-greeter-sessio.patch b/SOURCES/0009-xdmcp-display-factory-explicitly-stop-greeter-sessio.patch deleted file mode 100644 index ee65a9e..0000000 --- a/SOURCES/0009-xdmcp-display-factory-explicitly-stop-greeter-sessio.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 1dc72abeb4419027f649d67fd95b302c8233335d Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 14:59:05 -0400 -Subject: [PATCH 09/13] xdmcp-display-factory: explicitly stop greeter session - on disconnect - -If the client disconnects, we should kill off the necessary processes. ---- - daemon/gdm-xdmcp-display-factory.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c -index c5f7ddb4..3a8506ce 100644 ---- a/daemon/gdm-xdmcp-display-factory.c -+++ b/daemon/gdm-xdmcp-display-factory.c -@@ -2029,60 +2029,61 @@ on_hostname_selected (GdmXdmcpChooserDisplay *display, - g_warning ("Unable to get address: %s", gai_strerror (gaierr)); - g_free (xdmcp_port); - return; - } - g_free (xdmcp_port); - - /* just take the first one */ - ai = ai_list; - - if (ai != NULL) { - char *ip; - ic->chosen_address = gdm_address_new_from_sockaddr (ai->ai_addr, ai->ai_addrlen); - - ip = NULL; - gdm_address_get_numeric_info (ic->chosen_address, &ip, NULL); - g_debug ("GdmXdmcpDisplayFactory: hostname resolves to %s", - ip ? ip : "(null)"); - g_free (ip); - } - - freeaddrinfo (ai_list); - } - - static void - on_client_disconnected (GdmSession *session, - GdmDisplay *display) - { - if (gdm_display_get_status (display) != GDM_DISPLAY_MANAGED) - return; - -+ gdm_display_stop_greeter_session (display); - gdm_display_unmanage (display); - gdm_display_finish (display); - } - - static void - on_display_status_changed (GdmDisplay *display, - GParamSpec *arg1, - GdmXdmcpDisplayFactory *factory) - { - int status; - GdmDisplayStore *store; - GdmLaunchEnvironment *launch_environment; - GdmSession *session; - GdmAddress *address; - gint32 session_number; - int display_number; - - store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); - - launch_environment = NULL; - g_object_get (display, "launch-environment", &launch_environment, NULL); - - session = NULL; - if (launch_environment != NULL) { - session = gdm_launch_environment_get_session (launch_environment); - } - - status = gdm_display_get_status (display); - - g_debug ("GdmXdmcpDisplayFactory: xdmcp display status changed: %d", status); --- -2.12.0 - diff --git a/SOURCES/0010-chooser-fix-duplicate-entry-in-the-list.patch b/SOURCES/0010-chooser-fix-duplicate-entry-in-the-list.patch deleted file mode 100644 index 7d4d0f9..0000000 --- a/SOURCES/0010-chooser-fix-duplicate-entry-in-the-list.patch +++ /dev/null @@ -1,80 +0,0 @@ -From e3530d3ee97df1f78c15172abb0511ce12f1175b Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 15:11:03 -0400 -Subject: [PATCH 10/13] chooser: fix duplicate entry in the list - ---- - chooser/gdm-host-chooser-widget.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/chooser/gdm-host-chooser-widget.c b/chooser/gdm-host-chooser-widget.c -index f9200aa0..b8924618 100644 ---- a/chooser/gdm-host-chooser-widget.c -+++ b/chooser/gdm-host-chooser-widget.c -@@ -246,62 +246,62 @@ decode_packet (GIOChannel *source, - } - - if (! XdmcpReadARRAY8 (&buf, &stat)) { - goto done; - } - - status = g_strndup ((char *) stat.data, MIN (stat.length, 256)); - } else if (header.opcode == UNWILLING) { - /* immaterial, will not be shown */ - status = NULL; - } else { - goto done; - } - - g_debug ("STATUS: %s", status); - - chooser_host = find_known_host (widget, address); - if (chooser_host == NULL) { - chooser_host = g_object_new (GDM_TYPE_CHOOSER_HOST, - "address", address, - "description", status, - "willing", (header.opcode == WILLING), - "kind", GDM_CHOOSER_HOST_KIND_XDMCP, - NULL); - chooser_host_add (widget, chooser_host); - browser_add_host (widget, chooser_host); - } else { - /* server changed it's mind */ - if (header.opcode == WILLING - && ! gdm_chooser_host_get_willing (chooser_host)) { -- g_object_set (chooser_host, "willing", TRUE, NULL); - browser_add_host (widget, chooser_host); -+ g_object_set (chooser_host, "willing", TRUE, NULL); - } - /* FIXME: handle unwilling? */ - } - - done: - if (header.opcode == WILLING) { - XdmcpDisposeARRAY8 (&auth); - XdmcpDisposeARRAY8 (&host); - XdmcpDisposeARRAY8 (&stat); - } - - g_free (status); - gdm_address_free (address); - - return TRUE; - } - - static void - do_ping (GdmHostChooserWidget *widget, - gboolean full) - { - GSList *l; - - g_debug ("do ping full:%d", full); - - for (l = widget->priv->broadcast_addresses; l != NULL; l = l->next) { - GdmAddress *address; - int res; - - address = l->data; --- -2.12.0 - diff --git a/SOURCES/0011-chooser-make-host-list-fill-the-dialog.patch b/SOURCES/0011-chooser-make-host-list-fill-the-dialog.patch deleted file mode 100644 index 4c53b85..0000000 --- a/SOURCES/0011-chooser-make-host-list-fill-the-dialog.patch +++ /dev/null @@ -1,79 +0,0 @@ -From c77f0cd06eb26716ba03c79a4a47c76e334faec4 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 15:21:45 -0400 -Subject: [PATCH 11/13] chooser: make host list fill the dialog - ---- - chooser/gdm-host-chooser-dialog.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/chooser/gdm-host-chooser-dialog.c b/chooser/gdm-host-chooser-dialog.c -index 02169502..b9581a34 100644 ---- a/chooser/gdm-host-chooser-dialog.c -+++ b/chooser/gdm-host-chooser-dialog.c -@@ -106,61 +106,61 @@ gdm_host_chooser_dialog_get_property (GObject *object, - } - } - - static void - on_response (GdmHostChooserDialog *dialog, - gint response_id) - { - switch (response_id) { - case GTK_RESPONSE_APPLY: - gdm_host_chooser_widget_refresh (GDM_HOST_CHOOSER_WIDGET (dialog->priv->chooser_widget)); - g_signal_stop_emission_by_name (dialog, "response"); - break; - default: - break; - } - } - - static GObject * - gdm_host_chooser_dialog_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) - { - GdmHostChooserDialog *dialog; - - dialog = GDM_HOST_CHOOSER_DIALOG (G_OBJECT_CLASS (gdm_host_chooser_dialog_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); - - - dialog->priv->chooser_widget = gdm_host_chooser_widget_new (dialog->priv->kind_mask); -- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), dialog->priv->chooser_widget); -+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), dialog->priv->chooser_widget, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (dialog->priv->chooser_widget), 5); - - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - GTK_STOCK_REFRESH, GTK_RESPONSE_APPLY, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_CONNECT, GTK_RESPONSE_OK, - NULL); - - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 12); - gtk_window_set_title (GTK_WINDOW (dialog), _("Select System")); - gtk_window_set_icon_name (GTK_WINDOW (dialog), "computer"); - - g_signal_connect (dialog, - "response", - G_CALLBACK (on_response), - dialog); - - gtk_widget_show_all (GTK_WIDGET (dialog)); - - return G_OBJECT (dialog); - } - - static void - gdm_host_chooser_dialog_dispose (GObject *object) - { - g_debug ("Disposing host_chooser_dialog"); - - G_OBJECT_CLASS (gdm_host_chooser_dialog_parent_class)->dispose (object); - } --- -2.12.0 - diff --git a/SOURCES/0012-chooser-switch-to-browse-selection-mode.patch b/SOURCES/0012-chooser-switch-to-browse-selection-mode.patch deleted file mode 100644 index 9fac97b..0000000 --- a/SOURCES/0012-chooser-switch-to-browse-selection-mode.patch +++ /dev/null @@ -1,178 +0,0 @@ -From bead5672f65d9a579143de16a7c72e701a346cce Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 15:22:06 -0400 -Subject: [PATCH 12/13] chooser: switch to browse selection mode - -The chooser is a host browser after all. It makes not sense to -have an unselected item. ---- - chooser/gdm-host-chooser-widget.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/chooser/gdm-host-chooser-widget.c b/chooser/gdm-host-chooser-widget.c -index b8924618..f8aabf3e 100644 ---- a/chooser/gdm-host-chooser-widget.c -+++ b/chooser/gdm-host-chooser-widget.c -@@ -124,89 +124,96 @@ find_known_host (GdmHostChooserWidget *widget, - GdmAddress *address) - { - GSList *li; - GdmChooserHost *host; - - for (li = widget->priv->chooser_hosts; li != NULL; li = li->next) { - host = li->data; - if (gdm_address_equal (gdm_chooser_host_get_address (host), address)) { - goto out; - } - } - - host = NULL; - out: - - return host; - } - - static void - browser_add_host (GdmHostChooserWidget *widget, - GdmChooserHost *host) - { - char *hostname; - char *name; - char *desc; - char *label; - GtkTreeModel *model; - GtkTreeIter iter; - gboolean res; - -+ GtkTreeSelection *selection; -+ - g_assert (host != NULL); - - if (! gdm_chooser_host_get_willing (host)) { - gtk_widget_set_sensitive (GTK_WIDGET (widget), TRUE); - return; - } - - res = gdm_address_get_hostname (gdm_chooser_host_get_address (host), &hostname); - if (! res) { - gdm_address_get_numeric_info (gdm_chooser_host_get_address (host), &hostname, NULL); - } - - name = g_markup_escape_text (hostname, -1); - desc = g_markup_escape_text (gdm_chooser_host_get_description (host), -1); - label = g_strdup_printf ("%s\n%s", name, desc); - g_free (name); - g_free (desc); - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget->priv->treeview)); - - gtk_list_store_append (GTK_LIST_STORE (model), &iter); - gtk_list_store_set (GTK_LIST_STORE (model), - &iter, - CHOOSER_LIST_ICON_COLUMN, NULL, - CHOOSER_LIST_LABEL_COLUMN, label, - CHOOSER_LIST_HOST_COLUMN, host, - -1); - g_free (label); - -+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->treeview)); -+ if (!gtk_tree_selection_get_selected (selection, NULL, NULL)) { -+ gtk_tree_selection_select_iter (selection, &iter); -+ } -+ - } - - static gboolean - decode_packet (GIOChannel *source, - GIOCondition condition, - GdmHostChooserWidget *widget) - { - struct sockaddr_storage clnt_ss; - GdmAddress *address; - int ss_len; - XdmcpHeader header; - int res; - static XdmcpBuffer buf; - ARRAY8 auth = {0}; - ARRAY8 host = {0}; - ARRAY8 stat = {0}; - char *status; - GdmChooserHost *chooser_host; - - status = NULL; - address = NULL; - - g_debug ("decode_packet: GIOCondition %d", (int)condition); - - if ( ! (condition & G_IO_IN)) { - return TRUE; - } - - ss_len = (int) sizeof (clnt_ss); - -@@ -777,61 +784,61 @@ on_row_activated (GtkTreeView *tree_view, - { - g_signal_emit (widget, signals[HOST_ACTIVATED], 0); - } - - static void - gdm_host_chooser_widget_init (GdmHostChooserWidget *widget) - { - GtkWidget *scrolled; - GtkTreeSelection *selection; - GtkTreeViewColumn *column; - GtkTreeModel *model; - - widget->priv = GDM_HOST_CHOOSER_WIDGET_GET_PRIVATE (widget); - - scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), - GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (widget), scrolled, TRUE, TRUE, 0); - - widget->priv->treeview = gtk_tree_view_new (); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (widget->priv->treeview), FALSE); - g_signal_connect (widget->priv->treeview, - "row-activated", - G_CALLBACK (on_row_activated), - widget); - gtk_container_add (GTK_CONTAINER (scrolled), widget->priv->treeview); - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->treeview)); -- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); -+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); - g_signal_connect (selection, "changed", - G_CALLBACK (on_host_selected), - widget); - - model = (GtkTreeModel *)gtk_list_store_new (3, - GDK_TYPE_PIXBUF, - G_TYPE_STRING, - G_TYPE_POINTER); - gtk_tree_view_set_model (GTK_TREE_VIEW (widget->priv->treeview), model); - - column = gtk_tree_view_column_new_with_attributes ("Icon", - gtk_cell_renderer_pixbuf_new (), - "pixbuf", CHOOSER_LIST_ICON_COLUMN, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (widget->priv->treeview), column); - - column = gtk_tree_view_column_new_with_attributes ("Hostname", - gtk_cell_renderer_text_new (), - "markup", CHOOSER_LIST_LABEL_COLUMN, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (widget->priv->treeview), column); - - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), - CHOOSER_LIST_LABEL_COLUMN, - GTK_SORT_ASCENDING); - } - - static void - gdm_host_chooser_widget_finalize (GObject *object) - { --- -2.12.0 - diff --git a/SOURCES/0013-chooser-filter-out-duplicate-hostnames.patch b/SOURCES/0013-chooser-filter-out-duplicate-hostnames.patch deleted file mode 100644 index c0abd1e..0000000 --- a/SOURCES/0013-chooser-filter-out-duplicate-hostnames.patch +++ /dev/null @@ -1,125 +0,0 @@ -From d32365ddb729e94f7ebf650ef526f7f5319dfe4c Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 31 Mar 2017 15:40:21 -0400 -Subject: [PATCH 13/13] chooser: filter out duplicate hostnames - -One host may report itself on multiple interfaces. -GDM only supports based on hostname not interface, -so that leads duplicate entries in the list. - -This commit filters out the dupes. ---- - chooser/gdm-host-chooser-widget.c | 34 +++++++++++++++++++++++++++++++++- - 1 file changed, 33 insertions(+), 1 deletion(-) - -diff --git a/chooser/gdm-host-chooser-widget.c b/chooser/gdm-host-chooser-widget.c -index f8aabf3e..e2507900 100644 ---- a/chooser/gdm-host-chooser-widget.c -+++ b/chooser/gdm-host-chooser-widget.c -@@ -92,70 +92,102 @@ static void gdm_host_chooser_widget_finalize (GObject * - - G_DEFINE_TYPE (GdmHostChooserWidget, gdm_host_chooser_widget, GTK_TYPE_VBOX) - - #define GDM_XDMCP_PROTOCOL_VERSION 1001 - #define SCAN_TIMEOUT 30 - #define PING_TIMEOUT 2 - #define PING_TRIES 3 - - enum { - CHOOSER_LIST_ICON_COLUMN = 0, - CHOOSER_LIST_LABEL_COLUMN, - CHOOSER_LIST_HOST_COLUMN - }; - - static void - chooser_host_add (GdmHostChooserWidget *widget, - GdmChooserHost *host) - { - widget->priv->chooser_hosts = g_slist_prepend (widget->priv->chooser_hosts, host); - } - - #if 0 - static void - chooser_host_remove (GdmHostChooserWidget *widget, - GdmChooserHost *host) - { - widget->priv->chooser_hosts = g_slist_remove (widget->priv->chooser_hosts, host); - } - #endif - -+static gboolean -+address_hostnames_equal (GdmAddress *address, -+ GdmAddress *other_address) -+{ -+ char *hostname, *other_hostname; -+ gboolean are_equal; -+ -+ if (gdm_address_equal (address, other_address)) { -+ return TRUE; -+ } -+ -+ if (!gdm_address_get_hostname (address, &hostname)) { -+ gdm_address_get_numeric_info (address, &hostname, NULL); -+ } -+ -+ if (!gdm_address_get_hostname (other_address, &other_hostname)) { -+ gdm_address_get_numeric_info (other_address, &other_hostname, NULL); -+ } -+ -+ are_equal = g_strcmp0 (hostname, other_hostname) == 0; -+ -+ g_free (hostname); -+ g_free (other_hostname); -+ -+ return are_equal; -+} -+ - static GdmChooserHost * - find_known_host (GdmHostChooserWidget *widget, - GdmAddress *address) - { - GSList *li; - GdmChooserHost *host; - - for (li = widget->priv->chooser_hosts; li != NULL; li = li->next) { -+ GdmAddress *other_address; -+ - host = li->data; -- if (gdm_address_equal (gdm_chooser_host_get_address (host), address)) { -+ -+ other_address = gdm_chooser_host_get_address (host); -+ -+ if (address_hostnames_equal (address, other_address)) { - goto out; - } - } - - host = NULL; - out: - - return host; - } - - static void - browser_add_host (GdmHostChooserWidget *widget, - GdmChooserHost *host) - { - char *hostname; - char *name; - char *desc; - char *label; - GtkTreeModel *model; - GtkTreeIter iter; - gboolean res; - - GtkTreeSelection *selection; - - g_assert (host != NULL); - - if (! gdm_chooser_host_get_willing (host)) { - gtk_widget_set_sensitive (GTK_WIDGET (widget), TRUE); - return; - } --- -2.12.0 - diff --git a/SOURCES/audit-4.patch b/SOURCES/audit-4.patch index 54d5b1d..ac52ebb 100644 --- a/SOURCES/audit-4.patch +++ b/SOURCES/audit-4.patch @@ -1,7 +1,7 @@ -From 328f7544bf77891b76af091af8e179f4e003050a Mon Sep 17 00:00:00 2001 +From a17354e67eab4a294c30ec3e8b407057c6fb5f80 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 3 Jul 2015 14:39:33 -0400 -Subject: [PATCH] server: add -audit 4 to default flags +Subject: [PATCH 4/8] server: add -audit 4 to default flags --- daemon/gdm-server.c | 2 +- @@ -9,10 +9,10 @@ Subject: [PATCH] server: add -audit 4 to default flags 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c -index 6357d344..2e8c0562 100644 +index 83fba99c..5bd9725c 100644 --- a/daemon/gdm-server.c +++ b/daemon/gdm-server.c -@@ -199,61 +199,61 @@ gdm_server_launch_sigusr1_thread_if_needed (void) +@@ -191,61 +191,61 @@ gdm_server_launch_sigusr1_thread_if_needed (void) static GThread *sigusr1_thread; if (sigusr1_thread == NULL) { @@ -76,7 +76,7 @@ index 6357d344..2e8c0562 100644 if (server->priv->display_seat_id == NULL || strcmp (server->priv->display_seat_id, "seat0") == 0) { diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c -index b919e6e9..80fc09b8 100644 +index 88fe96f4..a499a342 100644 --- a/daemon/gdm-x-session.c +++ b/daemon/gdm-x-session.c @@ -247,60 +247,62 @@ spawn_x_server (State *state, @@ -143,5 +143,5 @@ index b919e6e9..80fc09b8 100644 display_number = g_data_input_stream_read_line (data_stream, -- -2.11.1 +2.14.2 diff --git a/SOURCES/classic-session.patch b/SOURCES/classic-session.patch index ddaeae7..1ddc504 100644 --- a/SOURCES/classic-session.patch +++ b/SOURCES/classic-session.patch @@ -1,7 +1,7 @@ -From b8c0d62a660b7a48993feef40947a79be80f729f Mon Sep 17 00:00:00 2001 +From 45848cf2625eaec34a07c03fdee624c8a2cb76de Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 3 Apr 2013 10:28:09 -0400 -Subject: [PATCH] session: change default session +Subject: [PATCH 8/8] session: change default session We default to gnome-classic in rhel, unless overridden by /etc/sysconfig/desktop @@ -10,10 +10,11 @@ by /etc/sysconfig/desktop 1 file changed, 100 insertions(+) diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index e69291fb..81341554 100644 +index f62f77d0..d6f1e121 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c -@@ -492,75 +492,175 @@ get_session_command_for_name (GdmSession *self, +@@ -495,76 +495,176 @@ get_session_command_for_name (GdmSession *self, + { gboolean res; char *filename; @@ -43,7 +44,7 @@ index e69291fb..81341554 100644 return setlocale (LC_MESSAGES, NULL); } - static const char * ++static const char * +get_configured_default_session_name (GdmSession *self) +{ + static const char *config_file = "/etc/sysconfig/desktop"; @@ -122,10 +123,10 @@ index e69291fb..81341554 100644 + return session_name; +} + -+static const char * + static const char * get_fallback_session_name (GdmSession *self) { - const char **search_dirs; + char **search_dirs; + const char *configured_session; int i; char *name; @@ -190,5 +191,5 @@ index e69291fb..81341554 100644 if (!g_str_has_suffix (base_name, ".desktop")) { continue; -- -2.11.1 +2.14.2 diff --git a/SOURCES/clear-screen.patch b/SOURCES/clear-screen.patch index b262864..0d3a595 100644 --- a/SOURCES/clear-screen.patch +++ b/SOURCES/clear-screen.patch @@ -1,7 +1,7 @@ -From ff7510f5594fe62b82c811c166713eecd916c27b Mon Sep 17 00:00:00 2001 +From 5337f1094ecedf50bcfb9a000ac6b99bd95ffea2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 14 Mar 2014 11:04:49 -0400 -Subject: [PATCH] systemd: clear terminal after starting +Subject: [PATCH 5/8] systemd: clear terminal after starting This helps with flicker when the X server shuts down. --- @@ -9,10 +9,10 @@ This helps with flicker when the X server shuts down. 1 file changed, 1 insertion(+) diff --git a/data/gdm.service.in b/data/gdm.service.in -index fb0ffdcf..9c876c70 100644 +index 72201c1f..b58f4c61 100644 --- a/data/gdm.service.in +++ b/data/gdm.service.in -@@ -1,33 +1,34 @@ +@@ -1,34 +1,35 @@ [Unit] Description=GNOME Display Manager @@ -44,9 +44,10 @@ index fb0ffdcf..9c876c70 100644 StandardOutput=syslog StandardError=inherit EnvironmentFile=-@LANG_CONFIG_FILE@ + ExecReload=/bin/kill -SIGHUP $MAINPID [Install] Alias=display-manager.service -- -2.11.1 +2.14.2 diff --git a/SOURCES/system-dconf.patch b/SOURCES/system-dconf.patch index 617817c..3f3ba16 100644 --- a/SOURCES/system-dconf.patch +++ b/SOURCES/system-dconf.patch @@ -1,7 +1,7 @@ -From 29d374ce6781df6f3b168a8c57163ddb582c998a Mon Sep 17 00:00:00 2001 +From 2cd39fafe8109a41d1e87b8ba89a2c3229d71a01 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 31 Jul 2013 17:32:55 -0400 -Subject: [PATCH] data: add system dconf databases to gdm profile +Subject: [PATCH 7/8] data: add system dconf databases to gdm profile This way system settings can affect the login screen. --- @@ -20,5 +20,5 @@ index 4d8bf174..9694078f 100644 +system-db:distro file-db:@DATADIR@/@PACKAGE@/greeter-dconf-defaults -- -2.11.1 +2.14.2 diff --git a/SPECS/gdm.spec b/SPECS/gdm.spec index eda43c1..c0d6e19 100644 --- a/SPECS/gdm.spec +++ b/SPECS/gdm.spec @@ -11,8 +11,8 @@ Summary: The GNOME Display Manager Name: gdm -Version: 3.22.3 -Release: 13%{?dist} +Version: 3.26.2.1 +Release: 5%{?dist} Epoch: 1 License: GPLv2+ Group: User Interface/X @@ -21,36 +21,25 @@ URL: http://download.gnome.org/sources/gdm Source: http://download.gnome.org/sources/gdm/3.22/gdm-%{version}.tar.xz Source1: org.gnome.login-screen.gschema.override Source2: ja.po + Patch0: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch -Patch1: 0001-manager-be-more-robust-against-autologin-having-an-i.patch -Patch2: 0003-launch-environment-fix-crasher-when-session-mode-isn.patch -Patch3: 0004-manager-drop-some-erroneous-code.patch -Patch4: 0005-launch-environment-implement-hostname-selected-signa.patch -Patch5: 0006-manager-fix-up-support-for-chooser.patch -Patch6: 0007-xdmcp-display-don-t-set-MANAGED-until-we-ve-connecte.patch -Patch7: 0008-xdmcp-display-factory-fix-signal-prototype.patch -Patch8: 0009-xdmcp-display-factory-explicitly-stop-greeter-sessio.patch -Patch9: 0010-chooser-fix-duplicate-entry-in-the-list.patch -Patch10: 0011-chooser-make-host-list-fill-the-dialog.patch -Patch11: 0012-chooser-switch-to-browse-selection-mode.patch -Patch12: 0013-chooser-filter-out-duplicate-hostnames.patch - -Patch13: 0001-local-display-factory-add-missing-comma-to-fix-user-.patch - -Patch14: 0001-manager-make-sure-we-end-up-on-a-login-screen.patch -Patch15: 0002-manager-stop-transient-greeter-session-when-done-wit.patch -Patch16: 0001-manager-update-session-id-property-when-reusing-disp.patch - -Patch80: 0001-Revert-session-forward-is-initial-from-display-to-wo.patch -Patch81: 0001-worker-add-compat-patch-to-make-new-worker-work-with.patch -Patch82: 0001-legacy-display-ensure-X-server-is-dead-when-respawni.patch -Patch83: 0001-manager-fix-dangling-pointer-free.patch - -Patch95: audit-4.patch -Patch96: clear-screen.patch -Patch97: 0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch -Patch98: system-dconf.patch -Patch99: classic-session.patch + +patch10: 0001-Revert-session-don-t-call-gdm_session_defaults_chang.patch + +Patch20: 0001-Revert-session-forward-is-initial-from-display-to-wo.patch +Patch21: 0001-worker-add-compat-patch-to-make-new-worker-work-with.patch + +# breaks upgrades +Patch40: 0001-Revert-data-Add-gnome-login.session.patch +# we don't have new enough dbus for this and don't need it with our old dbus +Patch41: 0001-Revert-gdm-sessions-force-a-session-bus-for-non-seat.patch + +Patch90: audit-4.patch +Patch91: clear-screen.patch +Patch92: 0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch +Patch93: system-dconf.patch +Patch94: classic-session.patch +Patch95: 0001-data-drop-pam_gdm-reintroduce-pam_env-postlogin.patch BuildRequires: git BuildRequires: pam-devel >= 0:%{pam_version} @@ -128,11 +117,22 @@ log out, and when user-switching. Summary: Development files for gdm Group: Development/Libraries Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: gdm-pam-extensions-devel = %{epoch}:%{version}-%{release} %description devel The gdm-devel package contains headers and other files needed to build custom greeters. +%package pam-extensions-devel +Summary: Macros for developing GDM extensions to PAM +Group: Development/Libraries +Requires: pam-devel + +%description pam-extensions-devel +The gdm-pam-extensions-devel package contains headers and other +files that are helpful to PAM modules wishing to support +GDM specific authentication features. + %prep %autosetup -S git @@ -152,6 +152,7 @@ autoreconf --force --install --verbose --with-plymouth \ --disable-systemd-journal \ --disable-user-display-server \ + --enable-wayland-support \ --with-selinux # drop unneeded direct library deps with --as-needed @@ -320,7 +321,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || : %{_libdir}/girepository-1.0/Gdm-1.0.typelib %{_libdir}/security/pam_gdm.so %{_libdir}/libgdm*.so* -%dir %{_localstatedir}/log/gdm +%attr(0711, root, gdm) %dir %{_localstatedir}/log/gdm %attr(1770, gdm, gdm) %dir %{_localstatedir}/lib/gdm %attr(0711, root, gdm) %dir /run/gdm %attr(1755, root, gdm) %dir %{_localstatedir}/cache/gdm @@ -336,13 +337,62 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || : %files devel %dir %{_includedir}/gdm %{_includedir}/gdm/*.h +%exclude %{_includedir}/gdm/gdm-pam-extensions.h %{_datadir}/gir-1.0/Gdm-1.0.gir %{_libdir}/pkgconfig/gdm.pc +%files pam-extensions-devel +%{_includedir}/gdm/gdm-pam-extensions.h +%{_libdir}/pkgconfig/gdm-pam-extensions.pc + %changelog -* Mon Dec 04 2017 Ray Strode - 3.22.3-13 -- fix reauth crash - Resolves: #1519250 +* Wed Feb 14 2018 Ray Strode - 3.26.2.1-5 +- Fix bullet in session list + Resolves: #1527145 + +* Tue Jan 30 2018 Ray Strode - 3.26.2.1-4 +- Repair autologin PAM configuration following rebase. + Resolves: #1539106 + +* Tue Nov 14 2017 Ray Strode - 3.26.2.1-3 +- Split PAM macros off into new subpackage + Resolves: #1512213 + +* Mon Nov 13 2017 Ray Strode - 3.26.2.1-2 +- Fix permissions on log dir + Resolves: #1275532 + +* Tue Oct 31 2017 Ray Strode - 3.26.2.1-1 +- Update to 3.26.2.1 + Integrates a lot of the downstream patches + Related: #1481740 +- Fixes race condition introduced by list display patch + Related: #1413900 + +* Tue Oct 17 2017 Ray Strode - 3.26.1-3 +- Revert patch that calls dbus-run-session + Related: #1481740 + +* Fri Oct 13 2017 Ray Strode - 3.26.1-2 +- Fix a few warnings discovered by coverity + Related: #1481740 + +* Wed Oct 11 2017 Ray Strode - 3.26.1-1 +- Update to 3.26.1 + Resolves: #1489359 + Related: #1481740 +- Enable wayland support + Resolves: #1481740 +- Fix bogus wtmp entries + Resolves: #1391156 + +* Tue Aug 15 2017 Ray Strode - 3.22.3-14 +- Fix memory corruption bug when user switching + Resolves: #1477289 + +* Wed Jul 26 2017 Ray Strode - 3.22.3-13 +- Add support for displaying lists + Resolves: #1413900 * Wed Jul 12 2017 Ray Strode - 3.22.3-12 - Ensure X server is dead after logout