diff --git a/.gdm.metadata b/.gdm.metadata new file mode 100644 index 0000000..11c3901 --- /dev/null +++ b/.gdm.metadata @@ -0,0 +1 @@ +761f14d38e1714a013ee93d6076ae55283189e2c SOURCES/gdm-40.1.tar.xz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c4c601 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gdm-40.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 new file mode 100644 index 0000000..b712857 --- /dev/null +++ b/SOURCES/0001-Honor-initial-setup-being-disabled-by-distro-install.patch @@ -0,0 +1,159 @@ +From f6ebcec5d48aeff718a9db9b8ff812fd404a61ed 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 + +Sysadmins might want to disable any kind of initial setup for their +users, perhaps because they pre-configure their environments. We +already provide a configuration file option for this but distro +installers might have their own way of requesting this. + +At least the anaconda installer provides an option to skip any kind +post-install setup tools so, for now we're only adding support for +that but more might be added in the future. + +https://bugzilla.gnome.org/show_bug.cgi?id=777708 +--- + daemon/gdm-display.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c +index 34467856..9438fe72 100644 +--- a/daemon/gdm-display.c ++++ b/daemon/gdm-display.c +@@ -1621,103 +1621,132 @@ 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 ++initial_setup_disabled_by_anaconda (void) ++{ ++ GKeyFile *key_file; ++ const gchar *file_name = SYSCONFDIR "/sysconfig/anaconda"; ++ gboolean disabled = FALSE; ++ GError *error = NULL; ++ ++ key_file = g_key_file_new (); ++ if (!g_key_file_load_from_file (key_file, file_name, G_KEY_FILE_NONE, &error)) { ++ if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT) && ++ !g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) { ++ g_warning ("Could not read %s: %s", file_name, error->message); ++ } ++ g_error_free (error); ++ goto out; ++ } ++ ++ disabled = g_key_file_get_boolean (key_file, "General", ++ "post_install_tools_disabled", NULL); ++ out: ++ g_key_file_unref (key_file); ++ return disabled; ++} ++ + static gboolean + wants_initial_setup (GdmDisplay *self) + { + GdmDisplayPrivate *priv; + gboolean enabled = FALSE; + gboolean forced = FALSE; + + priv = gdm_display_get_instance_private (self); + + 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: Forcing no gnome-initial-setup"); + return FALSE; + } + + /* don't run initial-setup on remote displays + */ + if (!priv->is_local) { + return FALSE; + } + + /* don't run if the system has existing users */ + if (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) + { + GdmDisplayPrivate *priv; + GdmSession *session; + char *display_name; + char *seat_id; + char *hostname; + char *auth_file = NULL; + + priv = gdm_display_get_instance_private (self); + g_return_if_fail (g_strcmp0 (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 (priv->access_file != NULL) { + auth_file = gdm_display_access_file_get_path (priv->access_file); + } +-- +2.32.0 + diff --git a/SOURCES/0001-data-Disable-network-configuration-on-login-screen.patch b/SOURCES/0001-data-Disable-network-configuration-on-login-screen.patch new file mode 100644 index 0000000..7a1d38d --- /dev/null +++ b/SOURCES/0001-data-Disable-network-configuration-on-login-screen.patch @@ -0,0 +1,103 @@ +From aa1c4a7708df2edbc12f2ada7249208aef586d1e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Tue, 8 Jun 2021 20:45:00 +0200 +Subject: [PATCH] data: Disable network configuration on login screen + +--- + data/meson.build | 10 ++++++++++ + data/org.gnome.gdm.rules.in | 8 ++++++++ + 2 files changed, 18 insertions(+) + create mode 100644 data/org.gnome.gdm.rules.in + +diff --git a/data/meson.build b/data/meson.build +index 7c5222ea..20d39a36 100644 +--- a/data/meson.build ++++ b/data/meson.build +@@ -130,60 +130,70 @@ pam_data_files_map = { + ], + 'arch': [ + 'gdm-autologin', + 'gdm-launch-environment', + 'gdm-fingerprint', + 'gdm-smartcard', + 'gdm-password', + ], + 'none': [], + # We should no longer have 'autodetect' at this point + } + + pam_data_files = pam_data_files_map[default_pam_config] + pam_prefix = (get_option('pam-prefix') != '')? get_option('pam-prefix') : get_option('sysconfdir') + foreach _pam_filename : pam_data_files + install_data('pam-@0@/@1@.pam'.format(default_pam_config, _pam_filename), + rename: _pam_filename, + install_dir: pam_prefix / 'pam.d', + ) + endforeach + + gdm_rules = configure_file( + input: '61-gdm.rules.in', + output: '@BASENAME@', + configuration: { + 'libexecdir': gdm_prefix / get_option('libexecdir'), + }, + install_dir: udev_dir, + ) + ++# Polkit rules ++polkit_rules = configure_file( ++ input: 'org.gnome.gdm.rules.in', ++ output: '@BASENAME@', ++ configuration: { ++ 'GDM_USERNAME': get_option('user'), ++ }, ++ install_dir: get_option('datadir') / 'polkit-1' / 'rules.d', ++) ++ + # DBus service files + service_config = configuration_data() + service_config.set('sbindir', gdm_prefix / get_option('sbindir')) + service_config.set('GDM_INITIAL_VT', get_option('initial-vt')) + service_config.set('LANG_CONFIG_FILE', lang_config_file) + if plymouth_dep.found() + service_config.set('PLYMOUTH_QUIT_SERVICE', 'plymouth-quit.service') + else + service_config.set('PLYMOUTH_QUIT_SERVICE', '') + endif + + if get_option('systemdsystemunitdir') != '' + systemd_systemunitdir = get_option('systemdsystemunitdir') + else + systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir') + endif + + if get_option('systemduserunitdir') != '' + systemd_userunitdir = get_option('systemduserunitdir') + else + systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir', + define_variable: ['prefix', get_option('prefix')]) + endif + + configure_file( + input: 'gdm.service.in', + output: '@BASENAME@', + configuration: service_config, + install_dir: systemd_systemunitdir, + format: 'cmake' +diff --git a/data/org.gnome.gdm.rules.in b/data/org.gnome.gdm.rules.in +new file mode 100644 +index 00000000..09544f11 +--- /dev/null ++++ b/data/org.gnome.gdm.rules.in +@@ -0,0 +1,8 @@ ++polkit.addRule(function(action, subject) { ++ if (action.id == "org.freedesktop.NetworkManager.network-control" && ++ subject.user == "@GDM_USERNAME@") { ++ return polkit.Result.NO; ++ } ++ ++ return polkit.Result.NOT_HANDLED; ++}); +-- +2.32.0 + diff --git a/SOURCES/0001-data-add-system-dconf-databases-to-gdm-profile.patch b/SOURCES/0001-data-add-system-dconf-databases-to-gdm-profile.patch new file mode 100644 index 0000000..bfaf66c --- /dev/null +++ b/SOURCES/0001-data-add-system-dconf-databases-to-gdm-profile.patch @@ -0,0 +1,24 @@ +From 3e62d7b423175102bd2376adc9cf58ad736b23b0 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 + +This way system settings can affect the login screen. +--- + data/dconf/gdm.in | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/data/dconf/gdm.in b/data/dconf/gdm.in +index 4d8bf174..9694078f 100644 +--- a/data/dconf/gdm.in ++++ b/data/dconf/gdm.in +@@ -1,2 +1,6 @@ + user-db:user ++system-db:gdm ++system-db:local ++system-db:site ++system-db:distro + file-db:@DATADIR@/@PACKAGE@/greeter-dconf-defaults +-- +2.32.0 + diff --git a/SOURCES/0001-data-reap-gdm-sessions-on-shutdown.patch b/SOURCES/0001-data-reap-gdm-sessions-on-shutdown.patch new file mode 100644 index 0000000..fb878aa --- /dev/null +++ b/SOURCES/0001-data-reap-gdm-sessions-on-shutdown.patch @@ -0,0 +1,55 @@ +From a4743b9b2b355f84da3904e7da93ec3c7a521895 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 26 Jul 2019 14:06:16 -0400 +Subject: [PATCH] data: reap gdm sessions on shutdown + +If GDM gets shutdown we should make sure all sessions get shutdown too. + +This is a bit of a safety net in case any processes in the session are +lingering after the orderly shutdown. +--- + data/gdm.service.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/data/gdm.service.in b/data/gdm.service.in +index 17e8a8de..195bd0fd 100644 +--- a/data/gdm.service.in ++++ b/data/gdm.service.in +@@ -1,33 +1,34 @@ + [Unit] + Description=GNOME Display Manager + + # replaces the getty + Conflicts=getty@tty${GDM_INITIAL_VT}.service + After=getty@tty${GDM_INITIAL_VT}.service + + # replaces plymouth-quit since it quits plymouth on its own + Conflicts=${PLYMOUTH_QUIT_SERVICE} + After=${PLYMOUTH_QUIT_SERVICE} + + # Needs all the dependencies of the services it's replacing + # pulled from getty@.service and ${PLYMOUTH_QUIT_SERVICE} + # (except for plymouth-quit-wait.service since it waits until + # plymouth is quit, which we do) + After=rc-local.service plymouth-start.service systemd-user-sessions.service + + # GDM takes responsibility for stopping plymouth, so if it fails + # for any reason, make sure plymouth still stops + OnFailure=plymouth-quit.service + + [Service] + ExecStart=${sbindir}/gdm ++ExecStopPost=-/usr/bin/bash -c 'for f in /run/systemd/sessions/*; do [ -f $f ] && /usr/bin/fgrep -q SERVICE=gdm $f && loginctl terminate-session $(basename $f); done' + KillMode=mixed + Restart=always + IgnoreSIGPIPE=no + BusName=org.gnome.DisplayManager + EnvironmentFile=-${LANG_CONFIG_FILE} + ExecReload=/bin/kill -SIGHUP $MAINPID + KeyringMode=shared + + [Install] + Alias=display-manager.service +-- +2.32.0 + diff --git a/SOURCES/0001-local-display-factory-Don-t-try-to-respawn-displays-.patch b/SOURCES/0001-local-display-factory-Don-t-try-to-respawn-displays-.patch new file mode 100644 index 0000000..45344c5 --- /dev/null +++ b/SOURCES/0001-local-display-factory-Don-t-try-to-respawn-displays-.patch @@ -0,0 +1,325 @@ +From 9261fcd05667fc5f8b81880577e41a566db821a8 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 15 Sep 2021 11:23:17 -0400 +Subject: [PATCH] local-display-factory: Don't try to respawn displays on + shutdown + +At the moment in the shutdown path we may try to respawn displays +that just got killed. + +The respawning happens when things are half torn down leading to +crashes. + +This commit makes sure we turn off the respawn logic in the shutdown +path. +--- + daemon/gdm-local-display-factory.c | 11 ++++++++++- + daemon/gdm-manager.c | 2 ++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 141d64c6..bca41f6e 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -46,60 +46,62 @@ + #define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory" + #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.LocalDisplayFactory" + + #define MAX_DISPLAY_FAILURES 5 + #define WAIT_TO_FINISH_TIMEOUT 10 /* seconds */ + #define SEAT0_GRAPHICS_CHECK_TIMEOUT 10 /* seconds */ + + struct _GdmLocalDisplayFactory + { + GdmDisplayFactory parent; + + GdmDBusLocalDisplayFactory *skeleton; + GDBusConnection *connection; + GHashTable *used_display_numbers; + + /* FIXME: this needs to be per seat? */ + guint num_failures; + + guint seat_new_id; + guint seat_removed_id; + guint seat_properties_changed_id; + + gboolean seat0_graphics_check_timed_out; + guint seat0_graphics_check_timeout_id; + + #if defined(ENABLE_USER_DISPLAY_SERVER) + unsigned int active_vt; + guint active_vt_watch_id; + guint wait_to_finish_timeout_id; + #endif ++ ++ gboolean is_started; + }; + + enum { + PROP_0, + }; + + static void gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass); + static void gdm_local_display_factory_init (GdmLocalDisplayFactory *factory); + static void gdm_local_display_factory_finalize (GObject *object); + + static void ensure_display_for_seat (GdmLocalDisplayFactory *factory, + const char *seat_id); + + static void on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory); + + static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory); + static gpointer local_display_factory_object = NULL; + static gboolean lookup_by_session_id (const char *id, + GdmDisplay *display, + gpointer user_data); + + G_DEFINE_TYPE (GdmLocalDisplayFactory, gdm_local_display_factory, GDM_TYPE_DISPLAY_FACTORY) + + GQuark + gdm_local_display_factory_error_quark (void) + { + static GQuark ret = 0; + if (ret == 0) { +@@ -416,60 +418,64 @@ on_session_registered_cb (GObject *gobject, + GParamSpec *pspec, + gpointer user_data) + { + GdmDisplay *display = GDM_DISPLAY (gobject); + GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data); + gboolean registered; + + g_object_get (display, "session-registered", ®istered, NULL); + + if (!registered) + return; + + g_debug ("GdmLocalDisplayFactory: session registered on display, looking for any background displays to kill"); + + finish_waiting_displays_on_seat (factory, "seat0"); + } + + static void + on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory) + { + int status; + int num; + char *seat_id = NULL; + char *session_type = NULL; + char *session_class = NULL; + gboolean is_initial = TRUE; + gboolean is_local = TRUE; + ++ ++ if (!factory->is_started) ++ return; ++ + num = -1; + gdm_display_get_x11_display_number (display, &num, NULL); + + g_object_get (display, + "seat-id", &seat_id, + "is-initial", &is_initial, + "is-local", &is_local, + "session-type", &session_type, + "session-class", &session_class, + NULL); + + status = gdm_display_get_status (display); + + g_debug ("GdmLocalDisplayFactory: display status changed: %d", status); + switch (status) { + case GDM_DISPLAY_FINISHED: + /* remove the display number from factory->used_display_numbers + so that it may be reused */ + if (num != -1) { + g_hash_table_remove (factory->used_display_numbers, GUINT_TO_POINTER (num)); + } + gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory)); + + /* if this is a local display, do a full resync. Only + * seats without displays will get created anyway. This + * ensures we get a new login screen when the user logs out, + * if there isn't one. + */ + if (is_local && g_strcmp0 (session_class, "greeter") != 0) { + /* reset num failures */ +@@ -1204,99 +1210,102 @@ on_display_added (GdmDisplayStore *display_store, + + display = gdm_display_store_lookup (display_store, id); + + if (display != NULL) { + g_signal_connect_object (display, "notify::status", + G_CALLBACK (on_display_status_changed), + factory, + 0); + + g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); + } + } + + static void + on_display_removed (GdmDisplayStore *display_store, + GdmDisplay *display, + GdmLocalDisplayFactory *factory) + { + g_signal_handlers_disconnect_by_func (display, G_CALLBACK (on_display_status_changed), factory); + g_object_weak_unref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); + } + + static gboolean + gdm_local_display_factory_start (GdmDisplayFactory *base_factory) + { + GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (base_factory); + GdmDisplayStore *store; + + g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); + ++ factory->is_started = TRUE; ++ + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + g_signal_connect_object (G_OBJECT (store), + "display-added", + G_CALLBACK (on_display_added), + factory, + 0); + + g_signal_connect_object (G_OBJECT (store), + "display-removed", + G_CALLBACK (on_display_removed), + factory, + 0); + + gdm_local_display_factory_start_monitor (factory); + return gdm_local_display_factory_sync_seats (factory); + } + + static gboolean + gdm_local_display_factory_stop (GdmDisplayFactory *base_factory) + { + GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (base_factory); + GdmDisplayStore *store; + + g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); + + gdm_local_display_factory_stop_monitor (factory); + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + g_signal_handlers_disconnect_by_func (G_OBJECT (store), + G_CALLBACK (on_display_added), + factory); + g_signal_handlers_disconnect_by_func (G_OBJECT (store), + G_CALLBACK (on_display_removed), + factory); +- + g_clear_handle_id (&factory->seat0_graphics_check_timeout_id, g_source_remove); + ++ factory->is_started = FALSE; ++ + return TRUE; + } + + static void + gdm_local_display_factory_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) + { + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static void + gdm_local_display_factory_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) + { + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static gboolean +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 4c2752fe..cc61efc9 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -2741,60 +2741,62 @@ unexport_display (const char *id, + GdmDisplay *display, + GdmManager *manager) + { + if (!g_dbus_connection_is_closed (manager->priv->connection)) + g_dbus_object_manager_server_unexport (manager->priv->object_manager, id); + } + + static void + finish_display (const char *id, + GdmDisplay *display, + GdmManager *manager) + { + gdm_display_stop_greeter_session (display); + if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) + gdm_display_unmanage (display); + gdm_display_finish (display); + } + + static void + gdm_manager_dispose (GObject *object) + { + GdmManager *manager; + + g_return_if_fail (object != NULL); + g_return_if_fail (GDM_IS_MANAGER (object)); + + manager = GDM_MANAGER (object); + + g_return_if_fail (manager->priv != NULL); + ++ gdm_manager_stop (manager); ++ + g_clear_weak_pointer (&manager->priv->automatic_login_display); + + #ifdef HAVE_LIBXDMCP + g_clear_object (&manager->priv->xdmcp_factory); + #endif + g_clear_object (&manager->priv->local_factory); + g_clear_pointer (&manager->priv->open_reauthentication_requests, + g_hash_table_unref); + g_clear_pointer (&manager->priv->transient_sessions, + g_hash_table_unref); + + g_list_foreach (manager->priv->user_sessions, + (GFunc) gdm_session_close, + NULL); + g_list_free_full (manager->priv->user_sessions, (GDestroyNotify) g_object_unref); + manager->priv->user_sessions = NULL; + + g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store), + G_CALLBACK (on_display_added), + manager); + g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store), + G_CALLBACK (on_display_removed), + manager); + + if (!g_dbus_connection_is_closed (manager->priv->connection)) { + gdm_display_store_foreach (manager->priv->display_store, + (GdmDisplayStoreFunc)unexport_display, + manager); + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager)); + } +-- +2.32.0 + diff --git a/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch b/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch new file mode 100644 index 0000000..e72eab6 --- /dev/null +++ b/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch @@ -0,0 +1,2452 @@ +From a8f8a5ee422d6ae3d87c1fba351313a5d98ded6e Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 16 Jul 2021 12:34:57 -0400 +Subject: [PATCH] local-display-factory: Provide more flexibility for + configuring display server + +There's currently a way to disable wayland, but no way to disable Xorg. +We currently prefer wayland if it's not disabled, but have no way to +prefer Xorg without disabling wayland entirely. + +There's currently no way use legacy Xorg support at all if user display +server support is enabled at a build time. + +This commit adds more flexibility to display server selection. It adds +two new keys: XorgEnable and and PreferredDisplayServer. + +XorgEnable=false disables Xorg support entirely on seat 0. + +PreferredDisplayServer can be set to "wayland", "xorg", "legacy-xorg" or +"none" to select which display server is used by default. If it's set to +"wayland", it will fall back to "xorg". If it's set to "xorg" it will +fall back to "wayland". +--- + common/gdm-settings-keys.h | 2 + + daemon/gdm-display.c | 36 +++++ + daemon/gdm-launch-environment.c | 9 ++ + daemon/gdm-local-display-factory.c | 224 ++++++++++++++++++++++++----- + daemon/gdm-manager.c | 22 ++- + daemon/gdm-session.c | 115 ++++++++------- + data/gdm.schemas.in | 10 ++ + libgdm/gdm-sessions.c | 72 +++++++--- + 8 files changed, 366 insertions(+), 124 deletions(-) + +diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h +index f0059b5cf..87685d3cd 100644 +--- a/common/gdm-settings-keys.h ++++ b/common/gdm-settings-keys.h +@@ -6,59 +6,61 @@ + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + #ifndef _GDM_SETTINGS_KEYS_H + #define _GDM_SETTINGS_KEYS_H + + #include + + G_BEGIN_DECLS + + #define GDM_KEY_USER "daemon/User" + #define GDM_KEY_GROUP "daemon/Group" + #define GDM_KEY_AUTO_LOGIN_ENABLE "daemon/AutomaticLoginEnable" + #define GDM_KEY_AUTO_LOGIN_USER "daemon/AutomaticLogin" + #define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable" + #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin" + #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay" + #define GDM_KEY_INITIAL_SETUP_ENABLE "daemon/InitialSetupEnable" ++#define GDM_KEY_PREFERRED_DISPLAY_SERVER "daemon/PreferredDisplayServer" + #define GDM_KEY_WAYLAND_ENABLE "daemon/WaylandEnable" ++#define GDM_KEY_XORG_ENABLE "daemon/XorgEnable" + + #define GDM_KEY_DEBUG "debug/Enable" + + #define GDM_KEY_INCLUDE "greeter/Include" + #define GDM_KEY_EXCLUDE "greeter/Exclude" + #define GDM_KEY_INCLUDE_ALL "greeter/IncludeAll" + + #define GDM_KEY_DISALLOW_TCP "security/DisallowTCP" + #define GDM_KEY_ALLOW_REMOTE_AUTOLOGIN "security/AllowRemoteAutoLogin" + + #define GDM_KEY_XDMCP_ENABLE "xdmcp/Enable" + #define GDM_KEY_SHOW_LOCAL_GREETER "xdmcp/ShowLocalGreeter" + #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending" + #define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions" + #define GDM_KEY_MAX_WAIT "xdmcp/MaxWait" + #define GDM_KEY_DISPLAYS_PER_HOST "xdmcp/DisplaysPerHost" + #define GDM_KEY_UDP_PORT "xdmcp/Port" + #define GDM_KEY_INDIRECT "xdmcp/HonorIndirect" + #define GDM_KEY_MAX_WAIT_INDIRECT "xdmcp/MaxWaitIndirect" + #define GDM_KEY_PING_INTERVAL "xdmcp/PingIntervalSeconds" + #define GDM_KEY_WILLING "xdmcp/Willing" + + #define GDM_KEY_MULTICAST "chooser/Multicast" + #define GDM_KEY_MULTICAST_ADDR "chooser/MulticastAddr" + + G_END_DECLS + + #endif /* _GDM_SETTINGS_KEYS_H */ +diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c +index 3a260923a..46d5a7732 100644 +--- a/daemon/gdm-display.c ++++ b/daemon/gdm-display.c +@@ -66,83 +66,86 @@ typedef struct _GdmDisplayPrivate + char *x11_display_name; + int status; + time_t creation_time; + + char *x11_cookie; + gsize x11_cookie_size; + GdmDisplayAccessFile *access_file; + + guint finish_idle_id; + + xcb_connection_t *xcb_connection; + int xcb_screen_number; + + GDBusConnection *connection; + GdmDisplayAccessFile *user_access_file; + + GdmDBusDisplay *display_skeleton; + GDBusObjectSkeleton *object_skeleton; + + GDBusProxy *accountsservice_proxy; + + /* this spawns and controls the greeter session */ + GdmLaunchEnvironment *launch_environment; + + guint is_local : 1; + guint is_initial : 1; + guint allow_timed_login : 1; + guint have_existing_user_accounts : 1; + guint doing_initial_setup : 1; + guint session_registered : 1; ++ ++ GStrv supported_session_types; + } GdmDisplayPrivate; + + enum { + PROP_0, + PROP_ID, + PROP_STATUS, + PROP_SEAT_ID, + PROP_SESSION_ID, + PROP_SESSION_CLASS, + PROP_SESSION_TYPE, + PROP_REMOTE_HOSTNAME, + PROP_X11_DISPLAY_NUMBER, + PROP_X11_DISPLAY_NAME, + PROP_X11_COOKIE, + PROP_X11_AUTHORITY_FILE, + PROP_IS_CONNECTED, + PROP_IS_LOCAL, + PROP_LAUNCH_ENVIRONMENT, + PROP_IS_INITIAL, + PROP_ALLOW_TIMED_LOGIN, + PROP_HAVE_EXISTING_USER_ACCOUNTS, + PROP_DOING_INITIAL_SETUP, + PROP_SESSION_REGISTERED, ++ PROP_SUPPORTED_SESSION_TYPES, + }; + + static void gdm_display_class_init (GdmDisplayClass *klass); + static void gdm_display_init (GdmDisplay *self); + static void gdm_display_finalize (GObject *object); + static void queue_finish (GdmDisplay *self); + static void _gdm_display_set_status (GdmDisplay *self, + int status); + static gboolean wants_initial_setup (GdmDisplay *self); + G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdmDisplay, gdm_display, G_TYPE_OBJECT) + + GQuark + gdm_display_error_quark (void) + { + static GQuark ret = 0; + if (ret == 0) { + ret = g_quark_from_static_string ("gdm_display_error"); + } + + return ret; + } + + time_t + gdm_display_get_creation_time (GdmDisplay *self) + { + GdmDisplayPrivate *priv; + + g_return_val_if_fail (GDM_IS_DISPLAY (self), 0); + + priv = gdm_display_get_instance_private (self); +@@ -883,116 +886,136 @@ _gdm_display_set_launch_environment (GdmDisplay *self, + + priv = gdm_display_get_instance_private (self); + + g_clear_object (&priv->launch_environment); + + priv->launch_environment = g_object_ref (launch_environment); + } + + static void + _gdm_display_set_is_initial (GdmDisplay *self, + gboolean initial) + { + GdmDisplayPrivate *priv; + + priv = gdm_display_get_instance_private (self); + g_debug ("GdmDisplay: initial: %s", initial? "yes" : "no"); + priv->is_initial = initial; + } + + static void + _gdm_display_set_allow_timed_login (GdmDisplay *self, + gboolean allow_timed_login) + { + GdmDisplayPrivate *priv; + + priv = gdm_display_get_instance_private (self); + g_debug ("GdmDisplay: allow timed login: %s", allow_timed_login? "yes" : "no"); + priv->allow_timed_login = allow_timed_login; + } + ++static void ++_gdm_display_set_supported_session_types (GdmDisplay *self, ++ const char * const *supported_session_types) ++ ++{ ++ GdmDisplayPrivate *priv; ++ g_autofree char *supported_session_types_string = NULL; ++ ++ if (supported_session_types != NULL) ++ supported_session_types_string = g_strjoinv (":", (GStrv) supported_session_types); ++ ++ priv = gdm_display_get_instance_private (self); ++ g_debug ("GdmDisplay: supported session types: %s", supported_session_types_string); ++ g_strfreev (priv->supported_session_types); ++ priv->supported_session_types = g_strdupv ((GStrv) supported_session_types); ++} ++ + static void + gdm_display_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) + { + GdmDisplay *self; + + self = GDM_DISPLAY (object); + + switch (prop_id) { + case PROP_ID: + _gdm_display_set_id (self, g_value_get_string (value)); + break; + case PROP_STATUS: + _gdm_display_set_status (self, g_value_get_int (value)); + break; + case PROP_SEAT_ID: + _gdm_display_set_seat_id (self, g_value_get_string (value)); + break; + case PROP_SESSION_ID: + _gdm_display_set_session_id (self, g_value_get_string (value)); + break; + case PROP_SESSION_CLASS: + _gdm_display_set_session_class (self, g_value_get_string (value)); + break; + case PROP_SESSION_TYPE: + _gdm_display_set_session_type (self, g_value_get_string (value)); + break; + case PROP_REMOTE_HOSTNAME: + _gdm_display_set_remote_hostname (self, g_value_get_string (value)); + break; + case PROP_X11_DISPLAY_NUMBER: + _gdm_display_set_x11_display_number (self, g_value_get_int (value)); + break; + case PROP_X11_DISPLAY_NAME: + _gdm_display_set_x11_display_name (self, g_value_get_string (value)); + break; + case PROP_X11_COOKIE: + _gdm_display_set_x11_cookie (self, g_value_get_string (value)); + break; + case PROP_IS_LOCAL: + _gdm_display_set_is_local (self, g_value_get_boolean (value)); + break; + case PROP_ALLOW_TIMED_LOGIN: + _gdm_display_set_allow_timed_login (self, g_value_get_boolean (value)); + break; + case PROP_LAUNCH_ENVIRONMENT: + _gdm_display_set_launch_environment (self, g_value_get_object (value)); + break; + case PROP_IS_INITIAL: + _gdm_display_set_is_initial (self, g_value_get_boolean (value)); + break; + case PROP_SESSION_REGISTERED: + _gdm_display_set_session_registered (self, g_value_get_boolean (value)); + break; ++ case PROP_SUPPORTED_SESSION_TYPES: ++ _gdm_display_set_supported_session_types (self, g_value_get_boxed (value)); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static void + gdm_display_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) + { + GdmDisplay *self; + GdmDisplayPrivate *priv; + + self = GDM_DISPLAY (object); + priv = gdm_display_get_instance_private (self); + + switch (prop_id) { + case PROP_ID: + g_value_set_string (value, priv->id); + break; + case PROP_STATUS: + g_value_set_int (value, priv->status); + break; + case PROP_SEAT_ID: + g_value_set_string (value, priv->seat_id); + break; + case PROP_SESSION_ID: + g_value_set_string (value, priv->session_id); +@@ -1017,60 +1040,63 @@ gdm_display_get_property (GObject *object, + break; + case PROP_X11_AUTHORITY_FILE: + g_value_take_string (value, + priv->access_file? + gdm_display_access_file_get_path (priv->access_file) : NULL); + break; + case PROP_IS_LOCAL: + g_value_set_boolean (value, priv->is_local); + break; + case PROP_IS_CONNECTED: + g_value_set_boolean (value, priv->xcb_connection != NULL); + break; + case PROP_LAUNCH_ENVIRONMENT: + g_value_set_object (value, priv->launch_environment); + break; + case PROP_IS_INITIAL: + g_value_set_boolean (value, priv->is_initial); + break; + case PROP_HAVE_EXISTING_USER_ACCOUNTS: + g_value_set_boolean (value, priv->have_existing_user_accounts); + break; + case PROP_DOING_INITIAL_SETUP: + g_value_set_boolean (value, priv->doing_initial_setup); + break; + case PROP_SESSION_REGISTERED: + g_value_set_boolean (value, priv->session_registered); + break; + case PROP_ALLOW_TIMED_LOGIN: + g_value_set_boolean (value, priv->allow_timed_login); + break; ++ case PROP_SUPPORTED_SESSION_TYPES: ++ g_value_set_boxed (value, priv->supported_session_types); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static gboolean + handle_get_id (GdmDBusDisplay *skeleton, + GDBusMethodInvocation *invocation, + GdmDisplay *self) + { + char *id; + + gdm_display_get_id (self, &id, NULL); + + gdm_dbus_display_complete_get_id (skeleton, invocation, id); + + g_free (id); + return TRUE; + } + + static gboolean + handle_get_remote_hostname (GdmDBusDisplay *skeleton, + GDBusMethodInvocation *invocation, + GdmDisplay *self) + { + char *hostname; + + gdm_display_get_remote_hostname (self, &hostname, NULL); + +@@ -1202,60 +1228,61 @@ gdm_display_constructor (GType type, + priv = gdm_display_get_instance_private (self); + + g_free (priv->id); + priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Displays/%lu", + (gulong) self); + + res = register_display (self); + if (! res) { + g_warning ("Unable to register display with system bus"); + } + + return G_OBJECT (self); + } + + static void + gdm_display_dispose (GObject *object) + { + GdmDisplay *self; + GdmDisplayPrivate *priv; + + self = GDM_DISPLAY (object); + priv = gdm_display_get_instance_private (self); + + g_debug ("GdmDisplay: Disposing display"); + + if (priv->finish_idle_id != 0) { + g_source_remove (priv->finish_idle_id); + priv->finish_idle_id = 0; + } + g_clear_object (&priv->launch_environment); ++ g_clear_pointer (&priv->supported_session_types, g_strfreev); + + g_warn_if_fail (priv->status != GDM_DISPLAY_MANAGED); + g_warn_if_fail (priv->user_access_file == NULL); + g_warn_if_fail (priv->access_file == NULL); + + G_OBJECT_CLASS (gdm_display_parent_class)->dispose (object); + } + + static void + gdm_display_class_init (GdmDisplayClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gdm_display_get_property; + object_class->set_property = gdm_display_set_property; + object_class->constructor = gdm_display_constructor; + object_class->dispose = gdm_display_dispose; + object_class->finalize = gdm_display_finalize; + + klass->prepare = gdm_display_real_prepare; + + g_object_class_install_property (object_class, + PROP_ID, + g_param_spec_string ("id", + "id", + "id", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_REMOTE_HOSTNAME, +@@ -1362,60 +1389,68 @@ gdm_display_class_init (GdmDisplayClass *klass) + PROP_DOING_INITIAL_SETUP, + g_param_spec_boolean ("doing-initial-setup", + NULL, + NULL, + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_SESSION_REGISTERED, + g_param_spec_boolean ("session-registered", + NULL, + NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, + PROP_LAUNCH_ENVIRONMENT, + g_param_spec_object ("launch-environment", + NULL, + NULL, + GDM_TYPE_LAUNCH_ENVIRONMENT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_STATUS, + g_param_spec_int ("status", + "status", + "status", + -1, + G_MAXINT, + GDM_DISPLAY_UNMANAGED, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); ++ ++ g_object_class_install_property (object_class, ++ PROP_SUPPORTED_SESSION_TYPES, ++ g_param_spec_boxed ("supported-session-types", ++ "supported session types", ++ "supported session types", ++ G_TYPE_STRV, ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + } + + static void + gdm_display_init (GdmDisplay *self) + { + GdmDisplayPrivate *priv; + + priv = gdm_display_get_instance_private (self); + + priv->creation_time = time (NULL); + } + + static void + gdm_display_finalize (GObject *object) + { + GdmDisplay *self; + GdmDisplayPrivate *priv; + + g_return_if_fail (object != NULL); + g_return_if_fail (GDM_IS_DISPLAY (object)); + + self = GDM_DISPLAY (object); + priv = gdm_display_get_instance_private (self); + + g_return_if_fail (priv != NULL); + + g_debug ("GdmDisplay: Finalizing display: %s", priv->id); + g_free (priv->id); + g_free (priv->seat_id); + g_free (priv->session_class); +@@ -1694,60 +1729,61 @@ gdm_display_start_greeter_session (GdmDisplay *self) + G_CALLBACK (on_launch_environment_session_opened), + self, 0); + g_signal_connect_object (priv->launch_environment, + "started", + G_CALLBACK (on_launch_environment_session_started), + self, 0); + g_signal_connect_object (priv->launch_environment, + "stopped", + G_CALLBACK (on_launch_environment_session_stopped), + self, 0); + g_signal_connect_object (priv->launch_environment, + "exited", + G_CALLBACK (on_launch_environment_session_exited), + self, 0); + g_signal_connect_object (priv->launch_environment, + "died", + G_CALLBACK (on_launch_environment_session_died), + self, 0); + + if (auth_file != NULL) { + g_object_set (priv->launch_environment, + "x11-authority-file", auth_file, + NULL); + } + + gdm_launch_environment_start (priv->launch_environment); + + session = gdm_launch_environment_get_session (priv->launch_environment); + g_object_set (G_OBJECT (session), + "display-is-initial", priv->is_initial, ++ "supported-session-types", priv->supported_session_types, + NULL); + + g_free (display_name); + g_free (seat_id); + g_free (hostname); + g_free (auth_file); + } + + void + gdm_display_stop_greeter_session (GdmDisplay *self) + { + GdmDisplayPrivate *priv; + + priv = gdm_display_get_instance_private (self); + + if (priv->launch_environment != NULL) { + + g_signal_handlers_disconnect_by_func (priv->launch_environment, + G_CALLBACK (on_launch_environment_session_opened), + self); + g_signal_handlers_disconnect_by_func (priv->launch_environment, + G_CALLBACK (on_launch_environment_session_started), + self); + g_signal_handlers_disconnect_by_func (priv->launch_environment, + G_CALLBACK (on_launch_environment_session_stopped), + self); + g_signal_handlers_disconnect_by_func (priv->launch_environment, + G_CALLBACK (on_launch_environment_session_exited), + self); + g_signal_handlers_disconnect_by_func (priv->launch_environment, +diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c +index 87a1c5ffe..14ecfac2d 100644 +--- a/daemon/gdm-launch-environment.c ++++ b/daemon/gdm-launch-environment.c +@@ -134,60 +134,61 @@ static GHashTable * + build_launch_environment (GdmLaunchEnvironment *launch_environment, + gboolean start_session) + { + GHashTable *hash; + struct passwd *pwent; + static const char *const optional_environment[] = { + "GI_TYPELIB_PATH", + "LANG", + "LANGUAGE", + "LC_ADDRESS", + "LC_ALL", + "LC_COLLATE", + "LC_CTYPE", + "LC_IDENTIFICATION", + "LC_MEASUREMENT", + "LC_MESSAGES", + "LC_MONETARY", + "LC_NAME", + "LC_NUMERIC", + "LC_PAPER", + "LC_TELEPHONE", + "LC_TIME", + "LD_LIBRARY_PATH", + "PATH", + "WINDOWPATH", + "XCURSOR_PATH", + "XDG_CONFIG_DIRS", + NULL + }; + char *system_data_dirs; ++ g_auto (GStrv) supported_session_types = NULL; + 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]))); + } + + 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) { + g_hash_table_insert (hash, g_strdup ("GNOME_SHELL_SESSION_MODE"), g_strdup (launch_environment->priv->session_mode)); + + if (strcmp (launch_environment->priv->session_mode, INITIAL_SETUP_SESSION_MODE) != 0) { + /* gvfs is needed for fetching remote avatars in the initial setup. Disable it otherwise. */ + 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")); + + /* The locked down dconf profile should not be used for the initial setup session. + * This allows overridden values from the user profile to take effect. + */ +@@ -217,60 +218,68 @@ build_launch_environment (GdmLaunchEnvironment *launch_environment, + } + + 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)); + } + + g_hash_table_insert (hash, g_strdup ("RUNNING_UNDER_GDM"), g_strdup ("true")); + + /* Now populate XDG_DATA_DIRS from env.d if we're running initial setup; this allows + * e.g. Flatpak apps to be recognized by gnome-shell. + */ + if (g_strcmp0 (launch_environment->priv->session_mode, INITIAL_SETUP_SESSION_MODE) == 0) + gdm_load_env_d (load_env_func, get_var_cb, hash); + + /* Prepend our own XDG_DATA_DIRS value */ + system_data_dirs = g_strdup (g_hash_table_lookup (hash, "XDG_DATA_DIRS")); + if (!system_data_dirs) + 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); + ++ g_object_get (launch_environment->priv->session, ++ "supported-session-types", ++ &supported_session_types, ++ NULL); ++ g_hash_table_insert (hash, ++ g_strdup ("GDM_SUPPORTED_SESSION_TYPES"), ++ g_strjoinv (":", supported_session_types)); ++ + return hash; + } + + static void + on_session_setup_complete (GdmSession *session, + const char *service_name, + GdmLaunchEnvironment *launch_environment) + { + GHashTable *hash; + GHashTableIter iter; + gpointer key, value; + + hash = build_launch_environment (launch_environment, TRUE); + + g_hash_table_iter_init (&iter, hash); + while (g_hash_table_iter_next (&iter, &key, &value)) { + gdm_session_set_environment_variable (launch_environment->priv->session, key, value); + } + g_hash_table_destroy (hash); + } + + static void + on_session_opened (GdmSession *session, + const char *service_name, + const char *session_id, + GdmLaunchEnvironment *launch_environment) + { + launch_environment->priv->session_id = g_strdup (session_id); + + g_signal_emit (G_OBJECT (launch_environment), signals [OPENED], 0); +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 8a4ef06cd..141d64c6b 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -156,126 +156,225 @@ take_next_display_number (GdmLocalDisplayFactory *factory) + + g_debug ("GdmLocalDisplayFactory: Found the following X displays:"); + for (l = list; l != NULL; l = l->next) { + g_debug ("GdmLocalDisplayFactory: %u", GPOINTER_TO_UINT (l->data)); + } + + for (l = list; l != NULL; l = l->next) { + guint32 num; + num = GPOINTER_TO_UINT (l->data); + + /* always fill zero */ + if (l->prev == NULL && num != 0) { + ret = 0; + break; + } + /* now find the first hole */ + if (l->next == NULL || GPOINTER_TO_UINT (l->next->data) != (num + 1)) { + ret = num + 1; + break; + } + } + out: + + /* now reserve this number */ + g_debug ("GdmLocalDisplayFactory: Reserving X display: %u", ret); + g_hash_table_insert (factory->used_display_numbers, GUINT_TO_POINTER (ret), NULL); + + return ret; + } + ++static char * ++get_preferred_display_server (GdmLocalDisplayFactory *factory) ++{ ++ g_autofree gchar *preferred_display_server = NULL; ++ gboolean wayland_enabled = FALSE, xorg_enabled = FALSE; ++ ++ gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled); ++ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled); ++ ++ if (wayland_enabled && !xorg_enabled) { ++ return g_strdup ("wayland"); ++ } ++ ++ if (!wayland_enabled && !xorg_enabled) { ++ return g_strdup ("none"); ++ } ++ ++ gdm_settings_direct_get_string (GDM_KEY_PREFERRED_DISPLAY_SERVER, &preferred_display_server); ++ ++ if (g_strcmp0 (preferred_display_server, "wayland") == 0) { ++ if (wayland_enabled) ++ return g_strdup (preferred_display_server); ++ else ++ return g_strdup ("xorg"); ++ } ++ ++ if (g_strcmp0 (preferred_display_server, "xorg") == 0) { ++ if (xorg_enabled) ++ return g_strdup (preferred_display_server); ++ else ++ return g_strdup ("wayland"); ++ } ++ ++ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) { ++ if (xorg_enabled) ++ return g_strdup (preferred_display_server); ++ } ++ ++ return g_strdup ("none"); ++} ++ ++static const char * ++gdm_local_display_factory_get_session_type (GdmLocalDisplayFactory *factory, ++ gboolean should_fall_back) ++{ ++ const char *session_types[3] = { NULL }; ++ gsize i, session_type_index = 0; ++ g_autofree gchar *preferred_display_server = NULL; ++ ++ preferred_display_server = get_preferred_display_server (factory); ++ ++ if (g_strcmp0 (preferred_display_server, "wayland") != 0 && ++ g_strcmp0 (preferred_display_server, "xorg") != 0) ++ return NULL; ++ ++ for (i = 0; i < G_N_ELEMENTS (session_types) - 1; i++) { ++#ifdef ENABLE_WAYLAND_SUPPORT ++ if (i > 0 || ++ g_strcmp0 (preferred_display_server, "wayland") == 0) { ++ gboolean wayland_enabled = FALSE; ++ if (gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled)) { ++ if (wayland_enabled && g_file_test ("/usr/bin/Xwayland", G_FILE_TEST_IS_EXECUTABLE)) { ++ session_types[i] = "wayland"; ++ continue; ++ } ++ } ++ } ++#endif ++ ++ if (i > 0 || ++ g_strcmp0 (preferred_display_server, "xorg") == 0) { ++ gboolean xorg_enabled = FALSE; ++ if (gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled)) { ++ if (xorg_enabled && g_file_test ("/usr/bin/Xorg", G_FILE_TEST_IS_EXECUTABLE)) { ++ session_types[i] = "x11"; ++ continue; ++ } ++ } ++ } ++ } ++ ++ if (should_fall_back) ++ session_type_index++; ++ ++ return session_types[session_type_index]; ++} ++ + static void + on_display_disposed (GdmLocalDisplayFactory *factory, + GdmDisplay *display) + { + g_debug ("GdmLocalDisplayFactory: Display %p disposed", display); + } + + static void + store_display (GdmLocalDisplayFactory *factory, + GdmDisplay *display) + { + GdmDisplayStore *store; + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + gdm_display_store_add (store, display); + } + +-static gboolean +-gdm_local_display_factory_use_wayland (void) +-{ +-#ifdef ENABLE_WAYLAND_SUPPORT +- gboolean wayland_enabled = FALSE; +- if (gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled)) { +- if (wayland_enabled && g_file_test ("/usr/bin/Xwayland", G_FILE_TEST_IS_EXECUTABLE) ) +- return TRUE; +- } +-#endif +- return FALSE; +-} +- + /* + Example: + dbus-send --system --dest=org.gnome.DisplayManager \ + --type=method_call --print-reply --reply-timeout=2000 \ + /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; + gboolean is_initial = FALSE; ++ const char *session_type; ++ g_autofree gchar *preferred_display_server = 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 (); +- if (gdm_local_display_factory_use_wayland ()) +- g_object_set (G_OBJECT (display), "session-type", "wayland", NULL); +- is_initial = TRUE; +-#else +- if (display == NULL) { +- guint32 num; ++ preferred_display_server = get_preferred_display_server (factory); + +- num = take_next_display_number (factory); ++#ifdef ENABLE_USER_DISPLAY_SERVER ++ if (g_strcmp0 (preferred_display_server, "wayland") == 0 || ++ g_strcmp0 (preferred_display_server, "xorg") == 0) { ++ session_type = gdm_local_display_factory_get_session_type (factory, FALSE); ++ ++ if (session_type == NULL) { ++ g_set_error_literal (error, ++ GDM_DISPLAY_ERROR, ++ GDM_DISPLAY_ERROR_GENERAL, ++ "Both Wayland and Xorg are unavailable"); ++ return FALSE; ++ } + +- display = gdm_legacy_display_new (num); ++ display = gdm_local_display_new (); ++ g_object_set (G_OBJECT (display), "session-type", session_type, NULL); ++ is_initial = TRUE; + } + #endif ++ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) { ++ if (display == NULL) { ++ guint32 num; ++ ++ num = take_next_display_number (factory); ++ ++ display = gdm_legacy_display_new (num); ++ } ++ } ++ ++ if (display == NULL) { ++ g_set_error_literal (error, ++ GDM_DISPLAY_ERROR, ++ GDM_DISPLAY_ERROR_GENERAL, ++ "Invalid preferred display server configured"); ++ return FALSE; ++ } + + g_object_set (display, + "seat-id", "seat0", + "allow-timed-login", FALSE, + "is-initial", is_initial, + 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 + finish_display_on_seat_if_waiting (GdmDisplayStore *display_store, + GdmDisplay *display, +@@ -454,190 +553,239 @@ lookup_prepared_display_by_seat_id (const char *id, + return lookup_by_seat_id (id, display, user_data); + } + + static int + on_seat0_graphics_check_timeout (gpointer user_data) + { + GdmLocalDisplayFactory *factory = user_data; + + factory->seat0_graphics_check_timeout_id = 0; + + /* Simply try to re-add seat0. If it is there already (i.e. CanGraphical + * turned TRUE, then we'll find it and it will not be created again). + */ + factory->seat0_graphics_check_timed_out = TRUE; + ensure_display_for_seat (factory, "seat0"); + + return G_SOURCE_REMOVE; + } + + static void + ensure_display_for_seat (GdmLocalDisplayFactory *factory, + const char *seat_id) + { + int ret; + gboolean seat_supports_graphics; + gboolean is_seat0; + const char *session_type = "wayland"; + GdmDisplayStore *store; + GdmDisplay *display = NULL; + g_autofree char *login_session_id = NULL; ++ gboolean wayland_enabled = FALSE, xorg_enabled = FALSE; ++ g_autofree gchar *preferred_display_server = NULL; ++ gboolean falling_back; ++ ++ gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled); ++ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled); ++ ++ preferred_display_server = get_preferred_display_server (factory); ++ ++ if (g_strcmp0 (preferred_display_server, "none") == 0) { ++ g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display"); ++ return; ++ } + + ret = sd_seat_can_graphical (seat_id); + + if (ret < 0) { + g_critical ("Failed to query CanGraphical information for seat %s", seat_id); + return; + } + + if (ret == 0) { + g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics"); + seat_supports_graphics = FALSE; + } else { + g_debug ("GdmLocalDisplayFactory: System supports graphics"); + seat_supports_graphics = TRUE; + } + + if (g_strcmp0 (seat_id, "seat0") == 0) { + is_seat0 = TRUE; + +- /* If we've failed, or are explicitly told to, fall back to legacy X11 support +- */ +- if (factory->num_failures > 0 || !gdm_local_display_factory_use_wayland ()) { +- session_type = NULL; +- g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use X11 fallback"); +- } else { +- g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use wayland"); +- } ++ falling_back = factory->num_failures > 0; ++ session_type = gdm_local_display_factory_get_session_type (factory, falling_back); ++ ++ g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", ++ session_type, falling_back? " fallback" : ""); + } else { + is_seat0 = FALSE; + + g_debug ("GdmLocalDisplayFactory: New displays on seat %s will use X11 fallback", seat_id); + /* Force legacy X11 for all auxiliary seats */ + seat_supports_graphics = TRUE; +- session_type = NULL; ++ session_type = "x11"; + } + + /* For seat0, we have a fallback logic to still try starting it after + * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if + * CanGraphical is unset. + * This is ugly, but it means we'll come up eventually in some + * scenarios where no master device is present. + * Note that we'll force an X11 fallback even though there might be + * cases where an wayland capable device is present and simply not marked as + * master-of-seat. In these cases, this should likely be fixed in the + * udev rules. + * + * At the moment, systemd always sets CanGraphical for non-seat0 seats. + * This is because non-seat0 seats are defined by having master-of-seat + * set. This means we can avoid the fallback check for non-seat0 seats, + * which simplifies the code. + */ + if (is_seat0) { + if (!seat_supports_graphics) { + if (!factory->seat0_graphics_check_timed_out) { + if (factory->seat0_graphics_check_timeout_id == 0) { + g_debug ("GdmLocalDisplayFactory: seat0 doesn't yet support graphics. Waiting %d seconds to try again.", SEAT0_GRAPHICS_CHECK_TIMEOUT); + factory->seat0_graphics_check_timeout_id = g_timeout_add_seconds (SEAT0_GRAPHICS_CHECK_TIMEOUT, + on_seat0_graphics_check_timeout, + factory); + + } else { + /* It is not yet time to force X11 fallback. */ + g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout."); + } + + return; + } + + g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!"); + g_debug ("GdmLocalDisplayFactory: This might indicate an issue where the framebuffer device is not tagged as master-of-seat in udev."); + seat_supports_graphics = TRUE; +- session_type = NULL; ++ session_type = "x11"; ++ wayland_enabled = FALSE; + } else { + g_clear_handle_id (&factory->seat0_graphics_check_timeout_id, g_source_remove); + } + } + + if (!seat_supports_graphics) + return; + +- g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested", +- session_type? : "X11", seat_id); ++ if (session_type != NULL) ++ g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested", ++ session_type, seat_id); ++ else if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) ++ g_debug ("GdmLocalDisplayFactory: Legacy Xorg login display for seat %s requested", ++ seat_id); ++ + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + if (is_seat0) + display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id); + else + display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id); + + /* Ensure we don't create the same display more than once */ + if (display != NULL) { + g_debug ("GdmLocalDisplayFactory: display already created"); + return; + } + + /* If we already have a login window, switch to it */ + if (gdm_get_login_window_session_id (seat_id, &login_session_id)) { + GdmDisplay *display; + + display = gdm_display_store_find (store, + lookup_by_session_id, + (gpointer) login_session_id); + if (display != NULL && + (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED || + gdm_display_get_status (display) == GDM_DISPLAY_WAITING_TO_FINISH)) { + g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL); + g_debug ("GdmLocalDisplayFactory: session %s found, activating.", + login_session_id); + gdm_activate_session_by_id (factory->connection, seat_id, login_session_id); + return; + } + } + + g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id); + + #ifdef ENABLE_USER_DISPLAY_SERVER +- if (is_seat0) { +- display = gdm_local_display_new (); +- if (session_type != NULL) { ++ if (g_strcmp0 (preferred_display_server, "wayland") == 0 || ++ g_strcmp0 (preferred_display_server, "xorg") == 0) { ++ if (is_seat0) { ++ g_autoptr (GPtrArray) supported_session_types = NULL; ++ ++ if (session_type == NULL) { ++ g_warning ("GdmLocalDisplayFactory: Both Wayland and Xorg sessions are unavailable"); ++ return; ++ } ++ ++ supported_session_types = g_ptr_array_new (); ++ ++ if (g_strcmp0 (preferred_display_server, "wayland") == 0) { ++ if (wayland_enabled) ++ g_ptr_array_add (supported_session_types, "wayland"); ++ } else { ++ if (xorg_enabled) ++ g_ptr_array_add (supported_session_types, "x11"); ++ } ++ ++ if (!falling_back) { ++ if (g_strcmp0 (preferred_display_server, "wayland") == 0) { ++ if (xorg_enabled) ++ g_ptr_array_add (supported_session_types, "x11"); ++ } else { ++ if (wayland_enabled) ++ g_ptr_array_add (supported_session_types, "wayland"); ++ } ++ } ++ ++ g_ptr_array_add (supported_session_types, NULL); ++ ++ display = gdm_local_display_new (); + g_object_set (G_OBJECT (display), "session-type", session_type, NULL); ++ g_object_set (G_OBJECT (display), "supported-session-types", supported_session_types->pdata, NULL); + } + } + #endif + + if (display == NULL) { + guint32 num; ++ const char *supported_session_types[] = { "x11", NULL }; + + num = take_next_display_number (factory); + + display = gdm_legacy_display_new (num); ++ g_object_set (G_OBJECT (display), "supported-session-types", supported_session_types, NULL); + } + + g_object_set (display, "seat-id", seat_id, NULL); + g_object_set (display, "is-initial", is_seat0, NULL); + + store_display (factory, display); + + /* let store own the ref */ + g_object_unref (display); + + if (! gdm_display_manage (display)) { + gdm_display_unmanage (display); + } + + return; + } + + static void + delete_display (GdmLocalDisplayFactory *factory, + const char *seat_id) { + + GdmDisplayStore *store; + + g_debug ("GdmLocalDisplayFactory: Removing used_display_numbers on seat %s", seat_id); + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + gdm_display_store_foreach_remove (store, lookup_by_seat_id, (gpointer) seat_id); + } + + static gboolean +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 9c10adff3..4c2752fee 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -1306,74 +1306,75 @@ get_automatic_login_details (GdmManager *manager, + *usernamep = username; + } else { + g_free (username); + } + + return enabled; + } + + static const char * + get_username_for_greeter_display (GdmManager *manager, + GdmDisplay *display) + { + gboolean doing_initial_setup = FALSE; + + g_object_get (G_OBJECT (display), + "doing-initial-setup", &doing_initial_setup, + NULL); + + if (doing_initial_setup) { + return INITIAL_SETUP_USERNAME; + } else { + return GDM_USERNAME; + } + } + + static void + set_up_automatic_login_session (GdmManager *manager, + GdmDisplay *display) + { + GdmSession *session; +- char *display_session_type = NULL; ++ g_auto (GStrv) supported_session_types = NULL; + + /* 0 is root user; since the daemon talks to the session object + * directly, itself, for automatic login + */ + create_user_session_for_display (manager, display, 0); + session = get_user_session_for_display (display); + + g_object_get (G_OBJECT (display), +- "session-type", &display_session_type, ++ "supported-session-types", &supported_session_types, + NULL); + + g_object_set (G_OBJECT (session), + "display-is-initial", FALSE, ++ "supported-session-types", supported_session_types, + 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) + { +@@ -2278,87 +2279,85 @@ on_session_reauthentication_started (GdmSession *session, + + if (invocation != NULL) { + g_hash_table_steal (manager->priv->open_reauthentication_requests, + source_tag); + gdm_dbus_manager_complete_open_reauthentication_channel (GDM_DBUS_MANAGER (manager), + invocation, + address); + } + } + + static void + clean_user_session (GdmSession *session) + { + g_object_set_data (G_OBJECT (session), "gdm-display", NULL); + g_object_unref (session); + } + + static void + create_user_session_for_display (GdmManager *manager, + GdmDisplay *display, + uid_t allowed_user) + { + GdmSession *session; + gboolean display_is_local = FALSE; + char *display_name = NULL; + char *display_device = NULL; + char *remote_hostname = NULL; + char *display_auth_file = NULL; + char *display_seat_id = NULL; + char *display_id = NULL; +-#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) +- g_autofree char *display_session_type = NULL; +- gboolean greeter_is_wayland; +-#endif ++ g_auto (GStrv) supported_session_types = NULL; + + g_object_get (G_OBJECT (display), + "id", &display_id, + "x11-display-name", &display_name, + "is-local", &display_is_local, + "remote-hostname", &remote_hostname, + "x11-authority-file", &display_auth_file, + "seat-id", &display_seat_id, +-#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) +- "session-type", &display_session_type, +-#endif ++ "supported-session-types", &supported_session_types, + NULL); + display_device = get_display_device (manager, display); + + session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN, + allowed_user, + display_name, + remote_hostname, + display_device, + display_seat_id, + display_auth_file, + display_is_local, + NULL); ++ g_object_set (G_OBJECT (session), ++ "supported-session-types", supported_session_types, ++ NULL); + + g_debug ("GdmSession: Created user session for user %d on display %s (seat %s)", + (int) allowed_user, + display_id, + display_seat_id); + + g_free (display_name); + g_free (remote_hostname); + g_free (display_auth_file); + g_free (display_seat_id); + + g_signal_connect (session, + "reauthentication-started", + G_CALLBACK (on_session_reauthentication_started), + manager); + g_signal_connect (session, + "reauthenticated", + G_CALLBACK (on_session_reauthenticated), + manager); + g_signal_connect (session, + "client-ready-for-session-to-start", + G_CALLBACK (on_session_client_ready_for_session_to_start), + manager); + g_signal_connect (session, + "client-connected", + G_CALLBACK (on_session_client_connected), + manager); + g_signal_connect (session, + "client-disconnected", + G_CALLBACK (on_session_client_disconnected), +@@ -2378,65 +2377,60 @@ create_user_session_for_display (GdmManager *manager, + g_signal_connect (session, + "authentication-failed", + G_CALLBACK (on_session_authentication_failed), + manager); + g_signal_connect (session, + "session-opened", + G_CALLBACK (on_user_session_opened), + manager); + g_signal_connect (session, + "session-started", + G_CALLBACK (on_user_session_started), + manager); + g_signal_connect (session, + "session-start-failed", + G_CALLBACK (on_session_start_failed), + manager); + g_signal_connect (session, + "session-exited", + G_CALLBACK (on_user_session_exited), + manager); + g_signal_connect (session, + "session-died", + G_CALLBACK (on_user_session_died), + manager); + g_object_set_data (G_OBJECT (session), "gdm-display", display); + g_object_set_data_full (G_OBJECT (display), + "gdm-user-session", + session, + (GDestroyNotify) + clean_user_session); +- +-#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) +- greeter_is_wayland = g_strcmp0 (display_session_type, "wayland") == 0; +- g_object_set (G_OBJECT (session), "ignore-wayland", !greeter_is_wayland, NULL); +-#endif + } + + static void + on_display_added (GdmDisplayStore *display_store, + const char *id, + GdmManager *manager) + { + GdmDisplay *display; + + display = gdm_display_store_lookup (display_store, id); + + if (display != NULL) { + g_dbus_object_manager_server_export (manager->priv->object_manager, + gdm_display_get_object_skeleton (display)); + + g_signal_connect (display, "notify::status", + G_CALLBACK (on_display_status_changed), + manager); + g_signal_emit (manager, signals[DISPLAY_ADDED], 0, id); + } + } + + GQuark + gdm_manager_error_quark (void) + { + static GQuark ret = 0; + if (ret == 0) { + ret = g_quark_from_static_string ("gdm_manager_error"); + } + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index a010cecf5..2b941e5e1 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -106,84 +106,81 @@ struct _GdmSession + GdmDBusUserVerifier *user_verifier_interface; + GHashTable *user_verifier_extensions; + 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; + ++ GStrv supported_session_types; ++ + 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 ++ PROP_SUPPORTED_SESSION_TYPES, + }; + + 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_OPENED_FAILED, + SESSION_STARTED, + SESSION_START_FAILED, + SESSION_EXITED, + SESSION_DIED, + REAUTHENTICATION_STARTED, + REAUTHENTICATED, + LAST_SIGNAL + }; + + #ifdef ENABLE_WAYLAND_SUPPORT + static gboolean gdm_session_is_wayland_session (GdmSession *self); + #endif + static void update_session_type (GdmSession *self); +@@ -320,109 +317,117 @@ on_establish_credentials_cb (GdmDBusWorker *proxy, + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + + self = g_object_ref (conversation->session); + service_name = g_strdup (conversation->service_name); + + if (worked) { + switch (self->verification_mode) { + case GDM_SESSION_VERIFICATION_MODE_LOGIN: + case GDM_SESSION_VERIFICATION_MODE_CHOOSER: + gdm_session_open_session (self, service_name); + break; + case GDM_SESSION_VERIFICATION_MODE_REAUTHENTICATE: + if (self->user_verifier_interface != NULL) { + gdm_dbus_user_verifier_emit_verification_complete (self->user_verifier_interface, + service_name); + g_signal_emit (self, signals[VERIFICATION_COMPLETE], 0, service_name); + } + break; + default: + break; + } + } else { + report_and_stop_conversation (self, service_name, error); + } + + g_free (service_name); + g_object_unref (self); + } + ++static gboolean ++supports_session_type (GdmSession *self, ++ const char *session_type) ++{ ++ if (session_type == NULL) ++ return TRUE; ++ ++ return g_strv_contains ((const char * const *) self->supported_session_types, ++ session_type); ++} ++ + static char ** + get_system_session_dirs (GdmSession *self, + const char *type) + { + GArray *search_array = NULL; + char **search_dirs; +- int i; ++ int i, j; + const gchar * const *system_data_dirs = g_get_system_data_dirs (); + + static const char *x_search_dirs[] = { + "/etc/X11/sessions/", + DMCONFDIR "/Sessions/", + DATADIR "/gdm/BuiltInSessions/", + DATADIR "/xsessions/", + }; + + static const char *wayland_search_dir = DATADIR "/wayland-sessions/"; + + search_array = g_array_new (TRUE, TRUE, sizeof (char *)); + +- if (type == NULL || g_str_equal (type, "x11")) { +- for (i = 0; system_data_dirs[i]; i++) { +- gchar *dir = g_build_filename (system_data_dirs[i], "xsessions", NULL); +- g_array_append_val (search_array, dir); ++ for (j = 0; self->supported_session_types[j] != NULL; j++) { ++ const char *supported_type = self->supported_session_types[j]; ++ ++ if (g_str_equal (supported_type, "x11") && ++ (type == NULL || g_str_equal (type, supported_type))) { ++ for (i = 0; system_data_dirs[i]; i++) { ++ gchar *dir = g_build_filename (system_data_dirs[i], "xsessions", NULL); ++ g_array_append_val (search_array, dir); ++ } ++ ++ g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); + } + +- g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); +- } + + #ifdef ENABLE_WAYLAND_SUPPORT +- if (!self->ignore_wayland && +- (type == NULL || g_str_equal (type, "wayland"))) { +-#ifdef ENABLE_USER_DISPLAY_SERVER +- g_array_prepend_val (search_array, wayland_search_dir); ++ if (g_str_equal (supported_type, "wayland") && ++ (type == NULL || g_str_equal (type, supported_type))) { ++ for (i = 0; system_data_dirs[i]; i++) { ++ gchar *dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL); ++ g_array_append_val (search_array, dir); ++ } + +- for (i = 0; system_data_dirs[i]; i++) { +- gchar *dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL); +- g_array_insert_val (search_array, i, dir); ++ g_array_append_val (search_array, wayland_search_dir); + } +-#else +- for (i = 0; system_data_dirs[i]; i++) { +- gchar *dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL); +- g_array_append_val (search_array, dir); +- } +- +- g_array_append_val (search_array, wayland_search_dir); + #endif + } +-#endif + + search_dirs = g_strdupv ((char **) search_array->data); + + g_array_free (search_array, TRUE); + + return search_dirs; + } + + static gboolean + is_prog_in_path (const char *prog) + { + char *f; + gboolean ret; + + f = g_find_program_in_path (prog); + ret = (f != NULL); + g_free (f); + return ret; + } + + static GKeyFile * + load_key_file_for_file (GdmSession *self, + const char *file, + const char *type, + char **full_path) + { + GKeyFile *key_file; + GError *error = NULL; + gboolean res; + char **search_dirs; +@@ -444,60 +449,66 @@ load_key_file_for_file (GdmSession *self, + g_debug ("GdmSession: %s", error->message); + g_error_free (error); + } + g_key_file_free (key_file); + key_file = NULL; + } + + g_strfreev (search_dirs); + + return key_file; + } + + static gboolean + get_session_command_for_file (GdmSession *self, + const char *file, + const char *type, + char **command) + { + GKeyFile *key_file; + GError *error; + char *exec; + gboolean ret; + gboolean res; + + exec = NULL; + ret = FALSE; + if (command != NULL) { + *command = NULL; + } + ++ if (!supports_session_type (self, type)) { ++ g_debug ("GdmSession: ignoring %s session command request for file '%s'", ++ type, file); ++ goto out; ++ } ++ + g_debug ("GdmSession: getting session command for file '%s'", file); + key_file = load_key_file_for_file (self, file, type, NULL); + if (key_file == NULL) { + goto out; + } + + error = NULL; + res = g_key_file_get_boolean (key_file, + G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_HIDDEN, + &error); + if (error == NULL && res) { + g_debug ("GdmSession: Session %s is marked as hidden", file); + goto out; + } + + exec = g_key_file_get_string (key_file, + G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, + NULL); + if (exec != NULL) { + res = is_prog_in_path (exec); + g_free (exec); + exec = NULL; + + if (! res) { + g_debug ("GdmSession: Command not found: %s", + G_KEY_FILE_DESKTOP_KEY_TRY_EXEC); + goto out; + } +@@ -2230,68 +2241,72 @@ close_conversation (GdmSessionConversation *conversation) + + if (conversation->worker_manager_interface != NULL) { + unexport_worker_manager_interface (self, conversation->worker_manager_interface); + g_clear_object (&conversation->worker_manager_interface); + } + + if (conversation->worker_proxy != NULL) { + GDBusConnection *connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (conversation->worker_proxy)); + g_dbus_connection_close_sync (connection, NULL, NULL); + } + } + + static void + stop_conversation (GdmSessionConversation *conversation) + { + close_conversation (conversation); + + conversation->is_stopping = TRUE; + gdm_session_worker_job_stop (conversation->job); + } + + static void + stop_conversation_now (GdmSessionConversation *conversation) + { + close_conversation (conversation); + + gdm_session_worker_job_stop_now (conversation->job); + g_clear_object (&conversation->job); + } + +-#ifdef ENABLE_WAYLAND_SUPPORT + void +-gdm_session_set_ignore_wayland (GdmSession *self, +- gboolean ignore_wayland) ++gdm_session_set_supported_session_types (GdmSession *self, ++ const char * const *supported_session_types) + { +- self->ignore_wayland = ignore_wayland; ++ const char * const session_types[] = { "wayland", "x11", NULL }; ++ g_strfreev (self->supported_session_types); ++ ++ if (supported_session_types == NULL) ++ self->supported_session_types = g_strdupv ((GStrv) session_types); ++ else ++ self->supported_session_types = g_strdupv ((GStrv) supported_session_types); + } +-#endif + + gboolean + gdm_session_start_conversation (GdmSession *self, + const char *service_name) + { + GdmSessionConversation *conversation; + + g_return_val_if_fail (GDM_IS_SESSION (self), FALSE); + + conversation = g_hash_table_lookup (self->conversations, + service_name); + + if (conversation != NULL) { + if (!conversation->is_stopping) { + g_warning ("GdmSession: conversation %s started more than once", service_name); + return FALSE; + } + g_debug ("GdmSession: stopping old conversation %s", service_name); + gdm_session_worker_job_stop_now (conversation->job); + g_object_unref (conversation->job); + conversation->job = NULL; + } + + g_debug ("GdmSession: starting conversation %s for session (%p)", service_name, self); + + conversation = start_conversation (self, service_name); + + g_hash_table_insert (self->conversations, + g_strdup (service_name), conversation); + return TRUE; +@@ -3162,69 +3177,69 @@ gdm_session_get_session_id (GdmSession *self) + + const char * + gdm_session_get_conversation_session_id (GdmSession *self, + const char *service_name) + { + GdmSessionConversation *conversation; + + g_return_val_if_fail (GDM_IS_SESSION (self), NULL); + + conversation = find_conversation_by_name (self, service_name); + + if (conversation == NULL) { + return NULL; + } + + return conversation->session_id; + } + + static char * + get_session_filename (GdmSession *self) + { + return g_strdup_printf ("%s.desktop", get_session_name (self)); + } + + #ifdef ENABLE_WAYLAND_SUPPORT + static gboolean + gdm_session_is_wayland_session (GdmSession *self) + { + GKeyFile *key_file; + gboolean is_wayland_session = FALSE; +- char *filename; +- char *full_path = NULL; ++ char *filename; ++ g_autofree char *full_path = NULL; + + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (GDM_IS_SESSION (self), FALSE); + + filename = get_session_filename (self); + +- key_file = load_key_file_for_file (self, filename, "wayland", &full_path); ++ key_file = load_key_file_for_file (self, filename, NULL, &full_path); + + if (key_file == NULL) { + goto out; + } + + if (full_path != NULL && strstr (full_path, "/wayland-sessions/") != NULL) { + is_wayland_session = TRUE; + } + g_debug ("GdmSession: checking if file '%s' is wayland session: %s", filename, is_wayland_session? "yes" : "no"); + + out: + g_clear_pointer (&key_file, g_key_file_free); + g_free (filename); + return is_wayland_session; + } + #endif + + static void + update_session_type (GdmSession *self) + { + #ifdef ENABLE_WAYLAND_SUPPORT + gboolean is_wayland_session = FALSE; + + is_wayland_session = gdm_session_is_wayland_session (self); + + if (is_wayland_session) { + set_session_type (self, "wayland"); + } else { + set_session_type (self, NULL); + } +@@ -3513,140 +3528,138 @@ gdm_session_set_property (GObject *object, + 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)); ++ case PROP_SUPPORTED_SESSION_TYPES: ++ gdm_session_set_supported_session_types (self, g_value_get_boxed (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->session_type); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, self->display_name); + break; + case PROP_DISPLAY_HOSTNAME: + g_value_set_string (value, self->display_hostname); + break; + case PROP_DISPLAY_DEVICE: + g_value_set_string (value, self->display_device); + break; + case PROP_DISPLAY_SEAT_ID: + g_value_set_string (value, self->display_seat_id); + break; + case PROP_USER_X11_AUTHORITY_FILE: + g_value_set_string (value, self->user_x11_authority_file); + break; + case PROP_DISPLAY_X11_AUTHORITY_FILE: + g_value_set_string (value, self->display_x11_authority_file); + break; + case PROP_DISPLAY_IS_LOCAL: + g_value_set_boolean (value, self->display_is_local); + break; + case PROP_DISPLAY_IS_INITIAL: + g_value_set_boolean (value, self->display_is_initial); + break; + case PROP_VERIFICATION_MODE: + g_value_set_enum (value, self->verification_mode); + break; + case PROP_ALLOWED_USER: + g_value_set_uint (value, self->allowed_user); + break; + case PROP_CONVERSATION_ENVIRONMENT: + g_value_set_pointer (value, self->environment); + break; +-#ifdef ENABLE_WAYLAND_SUPPORT +- case PROP_IGNORE_WAYLAND: +- g_value_set_boolean (value, self->ignore_wayland); ++ case PROP_SUPPORTED_SESSION_TYPES: ++ g_value_set_boxed (value, self->supported_session_types); + 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); + ++ g_clear_pointer (&self->supported_session_types, ++ g_strfreev); + g_clear_pointer (&self->conversations, + g_hash_table_unref); + + g_clear_object (&self->user_verifier_interface); + g_clear_pointer (&self->user_verifier_extensions, + g_hash_table_unref); + g_clear_object (&self->greeter_interface); + g_clear_object (&self->remote_greeter_interface); + g_clear_object (&self->chooser_interface); + + g_free (self->display_name); + self->display_name = NULL; + + g_free (self->display_hostname); + self->display_hostname = NULL; + + g_free (self->display_device); + self->display_device = NULL; + + g_free (self->display_seat_id); + self->display_seat_id = NULL; + + g_free (self->display_x11_authority_file); + self->display_x11_authority_file = NULL; + + g_strfreev (self->conversation_environment); + self->conversation_environment = NULL; + + if (self->worker_server != NULL) { + g_dbus_server_stop (self->worker_server); +@@ -4007,69 +4020,67 @@ gdm_session_class_init (GdmSessionClass *session_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 | G_PARAM_STATIC_STRINGS)); + /* 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_PARAM_STATIC_STRINGS)); + 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_PARAM_STATIC_STRINGS)); + + 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 | G_PARAM_STATIC_STRINGS)); + +-#ifdef ENABLE_WAYLAND_SUPPORT + g_object_class_install_property (object_class, +- PROP_IGNORE_WAYLAND, +- g_param_spec_boolean ("ignore-wayland", +- "ignore wayland", +- "ignore wayland", +- FALSE, +- G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); +-#endif ++ PROP_SUPPORTED_SESSION_TYPES, ++ g_param_spec_boxed ("supported-session-types", ++ "supported session types", ++ "supported session types", ++ G_TYPE_STRV, ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /* Ensure we can resolve errors */ + gdm_dbus_error_ensure (GDM_SESSION_WORKER_ERROR); + } + + GdmSession * + gdm_session_new (GdmSessionVerificationMode verification_mode, + uid_t allowed_user, + const char *display_name, + const char *display_hostname, + const char *display_device, + const char *display_seat_id, + const char *display_x11_authority_file, + gboolean display_is_local, + const char * const *environment) + { + GdmSession *self; + + self = g_object_new (GDM_TYPE_SESSION, + "verification-mode", verification_mode, + "allowed-user", (guint) allowed_user, + "display-name", display_name, + "display-hostname", display_hostname, + "display-device", display_device, + "display-seat-id", display_seat_id, + "display-x11-authority-file", display_x11_authority_file, + "display-is-local", display_is_local, + "conversation-environment", environment, + NULL); + +diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in +index 255bff023..a1035f95e 100644 +--- a/data/gdm.schemas.in ++++ b/data/gdm.schemas.in +@@ -25,65 +25,75 @@ + + daemon/AutomaticLoginEnable + b + false + + + daemon/AutomaticLogin + s + + + + daemon/TimedLoginEnable + b + false + + + daemon/TimedLogin + s + + + + daemon/TimedLoginDelay + i + 30 + + + daemon/InitialSetupEnable + b + true + ++ ++ daemon/PreferredDisplayServer ++ s ++ wayland ++ + + daemon/WaylandEnable + b + true + ++ ++ daemon/XorgEnable ++ b ++ true ++ + + security/AllowRemoteAutoLogin + b + false + + + + debug/Enable + b + false + + + + security/DisallowTCP + b + true + + + xdmcp/Enable + b + false + + + xdmcp/ShowLocalGreeter + b + true + + + xdmcp/MaxPending + i +diff --git a/libgdm/gdm-sessions.c b/libgdm/gdm-sessions.c +index a13225050..f078e04b8 100644 +--- a/libgdm/gdm-sessions.c ++++ b/libgdm/gdm-sessions.c +@@ -163,171 +163,203 @@ load_session_file (const char *id, + + static gboolean + remove_duplicate_sessions (gpointer key, + gpointer value, + gpointer user_data) + { + gboolean already_known; + GHashTable *names_seen_before; + GdmSessionFile *session; + + names_seen_before = (GHashTable *) user_data; + session = (GdmSessionFile *) value; + already_known = !g_hash_table_add (names_seen_before, session->translated_name); + + if (already_known) + g_debug ("GdmSession: Removing %s (%s) as we already have a session by this name", + session->id, + session->path); + + return already_known; + } + + static void + collect_sessions_from_directory (const char *dirname) + { + GDir *dir; + const char *filename; + + gboolean is_x11 = g_getenv ("WAYLAND_DISPLAY") == NULL && + g_getenv ("RUNNING_UNDER_GDM") != NULL; ++ gboolean is_wayland = g_getenv ("WAYLAND_DISPLAY") != NULL && ++ g_getenv ("RUNNING_UNDER_GDM") != NULL; + + /* FIXME: add file monitor to directory */ + + dir = g_dir_open (dirname, 0, NULL); + if (dir == NULL) { + return; + } + + while ((filename = g_dir_read_name (dir))) { + char *id; + char *full_path; + + if (! g_str_has_suffix (filename, ".desktop")) { + continue; + } + +- if (is_x11 && g_str_has_suffix (filename, "-xorg.desktop")) { +- char *base_name = g_strndup (filename, strlen (filename) - strlen ("-xorg.desktop")); +- char *fallback_name = g_strconcat (base_name, ".desktop", NULL); +- g_free (base_name); +- char *fallback_path = g_build_filename (dirname, fallback_name, NULL); +- g_free (fallback_name); +- if (g_file_test (fallback_path, G_FILE_TEST_EXISTS)) { +- g_free (fallback_path); +- g_debug ("Running under X11, ignoring %s", filename); +- continue; ++ if (is_wayland) { ++ if (g_str_has_suffix (filename, "-wayland.desktop")) { ++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen ("-wayland.desktop")); ++ g_autofree char *other_name = g_strconcat (base_name, ".desktop", NULL); ++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL); ++ ++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) { ++ g_debug ("Running under Wayland, ignoring %s", filename); ++ continue; ++ } ++ } else { ++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen (".desktop")); ++ g_autofree char *other_name = g_strdup_printf ("%s-xorg.desktop", base_name); ++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL); ++ ++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) { ++ g_debug ("Running under Wayland, ignoring %s", filename); ++ continue; ++ } ++ } ++ } else if (is_x11) { ++ if (g_str_has_suffix (filename, "-xorg.desktop")) { ++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen ("-xorg.desktop")); ++ g_autofree char *other_name = g_strconcat (base_name, ".desktop", NULL); ++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL); ++ ++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) { ++ g_debug ("Running under X11, ignoring %s", filename); ++ continue; ++ } ++ } else { ++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen (".desktop")); ++ g_autofree char *other_name = g_strdup_printf ("%s-wayland.desktop", base_name); ++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL); ++ ++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) { ++ g_debug ("Running under X11, ignoring %s", filename); ++ continue; ++ } + } +- g_free (fallback_path); + } + + id = g_strndup (filename, strlen (filename) - strlen (".desktop")); + + full_path = g_build_filename (dirname, filename, NULL); + + load_session_file (id, full_path); + + g_free (id); + g_free (full_path); + } + + g_dir_close (dir); + } + + static void + collect_sessions (void) + { + g_autoptr(GHashTable) names_seen_before = NULL; + g_autoptr(GPtrArray) xorg_search_array = NULL; + g_autoptr(GPtrArray) wayland_search_array = NULL; + gchar *session_dir = NULL; + int i; + const char *xorg_search_dirs[] = { + "/etc/X11/sessions/", + DMCONFDIR "/Sessions/", + DATADIR "/gdm/BuiltInSessions/", + DATADIR "/xsessions/", + }; ++ g_auto (GStrv) supported_session_types = NULL; ++ ++ supported_session_types = g_strsplit (g_getenv ("GDM_SUPPORTED_SESSION_TYPES"), ":", -1); + + names_seen_before = g_hash_table_new (g_str_hash, g_str_equal); + xorg_search_array = g_ptr_array_new_with_free_func (g_free); + + const gchar * const *system_data_dirs = g_get_system_data_dirs (); + + for (i = 0; system_data_dirs[i]; i++) { + session_dir = g_build_filename (system_data_dirs[i], "xsessions", NULL); + g_ptr_array_add (xorg_search_array, session_dir); + } + + for (i = 0; i < G_N_ELEMENTS (xorg_search_dirs); i++) { + g_ptr_array_add (xorg_search_array, g_strdup (xorg_search_dirs[i])); + } + + #ifdef ENABLE_WAYLAND_SUPPORT + const char *wayland_search_dirs[] = { + DATADIR "/wayland-sessions/", + }; + + wayland_search_array = g_ptr_array_new_with_free_func (g_free); + + for (i = 0; system_data_dirs[i]; i++) { + session_dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL); + g_ptr_array_add (wayland_search_array, session_dir); + } + + for (i = 0; i < G_N_ELEMENTS (wayland_search_dirs); i++) { + g_ptr_array_add (wayland_search_array, g_strdup (wayland_search_dirs[i])); + } + #endif + + if (gdm_available_sessions_map == NULL) { + gdm_available_sessions_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify)gdm_session_file_free); + } + +- for (i = 0; i < xorg_search_array->len; i++) { +- collect_sessions_from_directory (g_ptr_array_index (xorg_search_array, i)); ++ if (!supported_session_types || g_strv_contains ((const char * const *) supported_session_types, "x11")) { ++ for (i = 0; i < xorg_search_array->len; i++) { ++ collect_sessions_from_directory (g_ptr_array_index (xorg_search_array, i)); ++ } + } + + #ifdef ENABLE_WAYLAND_SUPPORT + #ifdef ENABLE_USER_DISPLAY_SERVER +- if (g_getenv ("WAYLAND_DISPLAY") == NULL && g_getenv ("RUNNING_UNDER_GDM") != NULL) { +- goto out; ++ if (!supported_session_types || g_strv_contains ((const char * const *) supported_session_types, "wayland")) { ++ for (i = 0; i < wayland_search_array->len; i++) { ++ collect_sessions_from_directory (g_ptr_array_index (wayland_search_array, i)); ++ } + } + #endif +- +- for (i = 0; i < wayland_search_array->len; i++) { +- collect_sessions_from_directory (g_ptr_array_index (wayland_search_array, i)); +- } + #endif + +-out: + g_hash_table_foreach_remove (gdm_available_sessions_map, + remove_duplicate_sessions, + names_seen_before); + } + + static gint + compare_session_ids (gconstpointer a, + gconstpointer b) + { + GdmSessionFile *session_a, *session_b; + session_a = (GdmSessionFile *) g_hash_table_lookup (gdm_available_sessions_map, a); + session_b = (GdmSessionFile *) g_hash_table_lookup (gdm_available_sessions_map, b); + + if (session_a == NULL) + return -1; + + if (session_b == NULL) + return 1; + + return g_strcmp0 (session_a->translated_name, session_b->translated_name); + } + + /** + * gdm_get_session_ids: + * + * Reads /usr/share/xsessions and other relevant places for possible sessions + * to log into and returns the complete list. + * + * Returns: (transfer full): a %NULL terminated list of session ids + */ +-- +2.31.1 + diff --git a/SOURCES/0001-local-display-factory-Stall-startup-until-main-graph.patch b/SOURCES/0001-local-display-factory-Stall-startup-until-main-graph.patch new file mode 100644 index 0000000..33a411c --- /dev/null +++ b/SOURCES/0001-local-display-factory-Stall-startup-until-main-graph.patch @@ -0,0 +1,729 @@ +From e5b3467412874d27c311253e3d5d7e65a61d12a4 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 1 Mar 2022 13:25:02 -0500 +Subject: [PATCH 1/4] local-display-factory: Stall startup until main graphics + card is ready + +At the moment, GDM waits until systemd says the system supports +graphics (via the CanGraphical logind property). + +Unfortunately, this property isn't really what we need, since it flips +to true when *any* graphics are available, not when the main graphics +for the system are ready. + +This is a problem on hybrid graphics systems, if one card is slower to +load than another. In particular, the vendor nvidia driver can be slow +to load because it has multiple kernel modules it loads in series. + +Indeed on fast systems, that use the vendor nvidia driver, it's not +unusual for boot to get to a point where all of userspace up to and +including GDM is executed before the graphics are ready to go. + +This commit tries to mitigate the situation by adding an additional, +check aside from CanGraphical to test if the system is ready. + +This check waits for the graphics card associated with boot to be fully +up and running before proceeding to start a login screen. + +Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/763 +--- + daemon/gdm-local-display-factory.c | 164 ++++++++++++++++++++++++++--- + daemon/meson.build | 4 + + meson.build | 2 + + 4 files changed, 159 insertions(+), 12 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index c00e1c47..0b1d3482 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -1,100 +1,112 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2007 William Jon McCann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 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 + ++#ifdef HAVE_UDEV ++#include ++#endif ++ + #include + + #include "gdm-common.h" + #include "gdm-manager.h" + #include "gdm-display-factory.h" + #include "gdm-local-display-factory.h" + #include "gdm-local-display-factory-glue.h" + + #include "gdm-settings-keys.h" + #include "gdm-settings-direct.h" + #include "gdm-display-store.h" + #include "gdm-local-display.h" + #include "gdm-legacy-display.h" + + #define GDM_DBUS_PATH "/org/gnome/DisplayManager" + #define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory" + #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.LocalDisplayFactory" + + #define MAX_DISPLAY_FAILURES 5 + #define WAIT_TO_FINISH_TIMEOUT 10 /* seconds */ + #define SEAT0_GRAPHICS_CHECK_TIMEOUT 10 /* seconds */ + + struct _GdmLocalDisplayFactory + { +- GdmDisplayFactory parent; ++ GdmDisplayFactory parent; ++#ifdef HAVE_UDEV ++ GUdevClient *gudev_client; ++#endif + + GdmDBusLocalDisplayFactory *skeleton; + GDBusConnection *connection; + GHashTable *used_display_numbers; + + /* FIXME: this needs to be per seat? */ + guint num_failures; + + guint seat_new_id; + guint seat_removed_id; + guint seat_properties_changed_id; + ++ gboolean seat0_has_platform_graphics; ++ gboolean seat0_has_boot_up_graphics; ++ + gboolean seat0_graphics_check_timed_out; + guint seat0_graphics_check_timeout_id; + ++ gulong uevent_handler_id; ++ + #if defined(ENABLE_USER_DISPLAY_SERVER) + unsigned int active_vt; + guint active_vt_watch_id; + guint wait_to_finish_timeout_id; + #endif + + gboolean is_started; + }; + + enum { + PROP_0, + }; + + static void gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass); + static void gdm_local_display_factory_init (GdmLocalDisplayFactory *factory); + static void gdm_local_display_factory_finalize (GObject *object); + + static void ensure_display_for_seat (GdmLocalDisplayFactory *factory, + const char *seat_id); + + static void on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory); + + static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory); + static gpointer local_display_factory_object = NULL; + static gboolean lookup_by_session_id (const char *id, + GdmDisplay *display, + gpointer user_data); + +@@ -594,142 +606,236 @@ lookup_by_seat_id (const char *id, + gpointer user_data) + { + const char *looking_for = user_data; + char *current; + gboolean res; + + g_object_get (G_OBJECT (display), "seat-id", ¤t, NULL); + + res = g_strcmp0 (current, looking_for) == 0; + + g_free(current); + + return res; + } + + static gboolean + lookup_prepared_display_by_seat_id (const char *id, + GdmDisplay *display, + gpointer user_data) + { + int status; + + status = gdm_display_get_status (display); + + if (status != GDM_DISPLAY_PREPARED) + return FALSE; + + return lookup_by_seat_id (id, display, user_data); + } + ++#ifdef HAVE_UDEV ++static gboolean ++udev_is_settled (GdmLocalDisplayFactory *factory) ++{ ++ g_autoptr (GUdevEnumerator) enumerator = NULL; ++ GList *devices; ++ GList *node; ++ ++ gboolean is_settled = FALSE; ++ ++ if (factory->seat0_has_platform_graphics) { ++ g_debug ("GdmLocalDisplayFactory: udev settled, platform graphics enabled."); ++ return TRUE; ++ } ++ ++ if (factory->seat0_has_boot_up_graphics) { ++ g_debug ("GdmLocalDisplayFactory: udev settled, boot up graphics available."); ++ return TRUE; ++ } ++ ++ if (factory->seat0_graphics_check_timed_out) { ++ g_debug ("GdmLocalDisplayFactory: udev timed out, proceeding anyway."); ++ return TRUE; ++ } ++ ++ g_debug ("GdmLocalDisplayFactory: Checking if udev has settled enough to support graphics."); ++ ++ enumerator = g_udev_enumerator_new (factory->gudev_client); ++ ++ g_udev_enumerator_add_match_name (enumerator, "card*"); ++ g_udev_enumerator_add_match_tag (enumerator, "master-of-seat"); ++ g_udev_enumerator_add_match_subsystem (enumerator, "drm"); ++ ++ devices = g_udev_enumerator_execute (enumerator); ++ if (!devices) { ++ g_debug ("GdmLocalDisplayFactory: udev has no candidate graphics devices available yet."); ++ return FALSE; ++ } ++ ++ node = devices; ++ while (node != NULL) { ++ GUdevDevice *device = node->data; ++ GList *next_node = node->next; ++ g_autoptr (GUdevDevice) platform_device = NULL; ++ g_autoptr (GUdevDevice) pci_device = NULL; ++ ++ platform_device = g_udev_device_get_parent_with_subsystem (device, "platform", NULL); ++ ++ if (platform_device != NULL) { ++ g_debug ("GdmLocalDisplayFactory: Found embedded platform graphics, proceeding."); ++ factory->seat0_has_platform_graphics = TRUE; ++ is_settled = TRUE; ++ break; ++ } ++ ++ pci_device = g_udev_device_get_parent_with_subsystem (device, "pci", NULL); ++ ++ if (pci_device != NULL) { ++ gboolean boot_vga; ++ ++ boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga"); ++ ++ if (boot_vga == 1) { ++ g_debug ("GdmLocalDisplayFactory: Found primary PCI graphics adapter, proceeding."); ++ factory->seat0_has_boot_up_graphics = TRUE; ++ is_settled = TRUE; ++ break; ++ } else { ++ g_debug ("GdmLocalDisplayFactory: Found secondary PCI graphics adapter, not proceeding yet."); ++ } ++ } ++ node = next_node; ++ } ++ ++ g_debug ("GdmLocalDisplayFactory: udev has %ssettled enough for graphics.", is_settled? "" : "not "); ++ g_list_free_full (devices, g_object_unref); ++ ++ if (is_settled) ++ g_clear_signal_handler (&factory->uevent_handler_id, factory->gudev_client); ++ ++ return is_settled; ++} ++#endif ++ + static int + on_seat0_graphics_check_timeout (gpointer user_data) + { + GdmLocalDisplayFactory *factory = user_data; + + factory->seat0_graphics_check_timeout_id = 0; + + /* Simply try to re-add seat0. If it is there already (i.e. CanGraphical + * turned TRUE, then we'll find it and it will not be created again). + */ + factory->seat0_graphics_check_timed_out = TRUE; + ensure_display_for_seat (factory, "seat0"); + + return G_SOURCE_REMOVE; + } + + static void + ensure_display_for_seat (GdmLocalDisplayFactory *factory, + const char *seat_id) + { + int ret; + gboolean seat_supports_graphics; + gboolean is_seat0; + g_auto (GStrv) session_types = NULL; + const char *legacy_session_types[] = { "x11", NULL }; + GdmDisplayStore *store; + GdmDisplay *display = NULL; + g_autofree char *login_session_id = NULL; + gboolean wayland_enabled = FALSE, xorg_enabled = FALSE; + g_autofree gchar *preferred_display_server = NULL; + gboolean falling_back = FALSE; ++ gboolean waiting_on_udev = FALSE; + + gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled); + gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled); + + preferred_display_server = get_preferred_display_server (factory); + + if (g_strcmp0 (preferred_display_server, "none") == 0) { + g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display"); + return; + } + +- ret = sd_seat_can_graphical (seat_id); ++#ifdef HAVE_UDEV ++ waiting_on_udev = !udev_is_settled (factory); ++#endif + +- if (ret < 0) { +- g_critical ("Failed to query CanGraphical information for seat %s", seat_id); +- return; +- } ++ if (!waiting_on_udev) { ++ ret = sd_seat_can_graphical (seat_id); + +- if (ret == 0) { +- g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics"); +- seat_supports_graphics = FALSE; ++ if (ret < 0) { ++ g_critical ("Failed to query CanGraphical information for seat %s", seat_id); ++ return; ++ } ++ ++ if (ret == 0) { ++ g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics"); ++ seat_supports_graphics = FALSE; ++ } else { ++ g_debug ("GdmLocalDisplayFactory: System supports graphics"); ++ seat_supports_graphics = TRUE; ++ } + } else { +- g_debug ("GdmLocalDisplayFactory: System supports graphics"); +- seat_supports_graphics = TRUE; ++ g_debug ("GdmLocalDisplayFactory: udev is still settling, so not creating display yet"); ++ seat_supports_graphics = FALSE; + } + + if (g_strcmp0 (seat_id, "seat0") == 0) { + is_seat0 = TRUE; + + falling_back = factory->num_failures > 0; + session_types = gdm_local_display_factory_get_session_types (factory, falling_back); + + if (session_types == NULL) { + g_debug ("GdmLocalDisplayFactory: Both Wayland and Xorg are unavailable"); + seat_supports_graphics = FALSE; + } else { + g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", + session_types[0], falling_back? " fallback" : ""); + } + } else { + is_seat0 = FALSE; + + g_debug ("GdmLocalDisplayFactory: New displays on seat %s will use X11 fallback", seat_id); + /* Force legacy X11 for all auxiliary seats */ + seat_supports_graphics = TRUE; + session_types = g_strdupv ((char **) legacy_session_types); + } + + /* For seat0, we have a fallback logic to still try starting it after + * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if +- * CanGraphical is unset. ++ * CanGraphical is unset or udev otherwise never finds a suitable graphics card. + * This is ugly, but it means we'll come up eventually in some + * scenarios where no master device is present. + * Note that we'll force an X11 fallback even though there might be + * cases where an wayland capable device is present and simply not marked as + * master-of-seat. In these cases, this should likely be fixed in the + * udev rules. + * + * At the moment, systemd always sets CanGraphical for non-seat0 seats. + * This is because non-seat0 seats are defined by having master-of-seat + * set. This means we can avoid the fallback check for non-seat0 seats, + * which simplifies the code. + */ + if (is_seat0) { + if (!seat_supports_graphics) { + if (!factory->seat0_graphics_check_timed_out) { + if (factory->seat0_graphics_check_timeout_id == 0) { + g_debug ("GdmLocalDisplayFactory: seat0 doesn't yet support graphics. Waiting %d seconds to try again.", SEAT0_GRAPHICS_CHECK_TIMEOUT); + factory->seat0_graphics_check_timeout_id = g_timeout_add_seconds (SEAT0_GRAPHICS_CHECK_TIMEOUT, + on_seat0_graphics_check_timeout, + factory); + + } else { + /* It is not yet time to force X11 fallback. */ + g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout."); + } + + return; + } + + g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!"); +@@ -1138,113 +1240,151 @@ on_vt_changed (GIOChannel *source, + if (factory->wait_to_finish_timeout_id != 0) { + g_debug ("GdmLocalDisplayFactory: deferring previous login screen clean up operation"); + g_source_remove (factory->wait_to_finish_timeout_id); + } + + factory->wait_to_finish_timeout_id = g_timeout_add_seconds (WAIT_TO_FINISH_TIMEOUT, + (GSourceFunc) + on_finish_waiting_for_seat0_displays_timeout, + factory); + } + } + } + + /* if user jumped back to initial vt and it's empty put a login screen + * on it (unless a login screen is already running elsewhere, then + * jump to that login screen) + */ + if (factory->active_vt != GDM_INITIAL_VT) { + g_debug ("GdmLocalDisplayFactory: active VT is not initial VT, so ignoring"); + return G_SOURCE_CONTINUE; + } + + g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change"); + + ensure_display_for_seat (factory, "seat0"); + + return G_SOURCE_CONTINUE; + } + #endif + ++#ifdef HAVE_UDEV ++static void ++on_uevent (GUdevClient *client, ++ const char *action, ++ GUdevDevice *device, ++ GdmLocalDisplayFactory *factory) ++{ ++ if (!g_udev_device_get_device_file (device)) ++ return; ++ ++ if (g_strcmp0 (action, "add") != 0 && ++ g_strcmp0 (action, "change") != 0) ++ return; ++ ++ if (!udev_is_settled (factory)) ++ return; ++ ++ g_signal_handler_disconnect (factory->gudev_client, factory->uevent_handler_id); ++ factory->uevent_handler_id = 0; ++ ++ ensure_display_for_seat (factory, "seat0"); ++} ++#endif ++ + static void + gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory) + { + g_autoptr (GIOChannel) io_channel = NULL; ++ const char *subsystems[] = { "drm", NULL }; + + factory->seat_new_id = g_dbus_connection_signal_subscribe (factory->connection, + "org.freedesktop.login1", + "org.freedesktop.login1.Manager", + "SeatNew", + "/org/freedesktop/login1", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + on_seat_new, + g_object_ref (factory), + g_object_unref); + factory->seat_removed_id = g_dbus_connection_signal_subscribe (factory->connection, + "org.freedesktop.login1", + "org.freedesktop.login1.Manager", + "SeatRemoved", + "/org/freedesktop/login1", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + on_seat_removed, + g_object_ref (factory), + g_object_unref); + factory->seat_properties_changed_id = g_dbus_connection_signal_subscribe (factory->connection, + "org.freedesktop.login1", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + NULL, + "org.freedesktop.login1.Seat", + G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, + on_seat_properties_changed, + g_object_ref (factory), + g_object_unref); ++#ifdef HAVE_UDEV ++ factory->gudev_client = g_udev_client_new (subsystems); ++ factory->uevent_handler_id = g_signal_connect (factory->gudev_client, ++ "uevent", ++ G_CALLBACK (on_uevent), ++ factory); ++#endif + + #if defined(ENABLE_USER_DISPLAY_SERVER) + io_channel = g_io_channel_new_file ("/sys/class/tty/tty0/active", "r", NULL); + + if (io_channel != NULL) { + factory->active_vt_watch_id = + g_io_add_watch (io_channel, + G_IO_PRI, + (GIOFunc) + on_vt_changed, + factory); + } + #endif + } + + static void + gdm_local_display_factory_stop_monitor (GdmLocalDisplayFactory *factory) + { ++ if (factory->uevent_handler_id) { ++ g_signal_handler_disconnect (factory->gudev_client, factory->uevent_handler_id); ++ factory->uevent_handler_id = 0; ++ } ++ g_clear_object (&factory->gudev_client); ++ + if (factory->seat_new_id) { + g_dbus_connection_signal_unsubscribe (factory->connection, + factory->seat_new_id); + factory->seat_new_id = 0; + } + if (factory->seat_removed_id) { + g_dbus_connection_signal_unsubscribe (factory->connection, + factory->seat_removed_id); + factory->seat_removed_id = 0; + } + if (factory->seat_properties_changed_id) { + g_dbus_connection_signal_unsubscribe (factory->connection, + factory->seat_properties_changed_id); + factory->seat_properties_changed_id = 0; + } + #if defined(ENABLE_USER_DISPLAY_SERVER) + if (factory->active_vt_watch_id) { + g_source_remove (factory->active_vt_watch_id); + factory->active_vt_watch_id = 0; + } + if (factory->wait_to_finish_timeout_id != 0) { + g_source_remove (factory->wait_to_finish_timeout_id); + factory->wait_to_finish_timeout_id = 0; + } + #endif + } + + static void + on_display_added (GdmDisplayStore *display_store, + const char *id, +diff --git a/daemon/meson.build b/daemon/meson.build +index 2e61b644..41f30abe 100644 +--- a/daemon/meson.build ++++ b/daemon/meson.build +@@ -177,37 +177,41 @@ gdm_daemon_sources = files( + 'gdm-session-record.c', + 'gdm-session-worker-common.c', + 'gdm-session-worker-job.c', + 'gdm-session.c', + 'main.c', + ) + + gdm_daemon_gen_sources = [ + display_dbus_gen, + local_display_factory_dbus_gen, + manager_dbus_gen, + local_display_dbus_gen, + session_dbus_gen, + session_worker_dbus_gen, + gdm_session_enums, + ] + + if xdmcp_dep.found() + gdm_daemon_deps += xdmcp_dep + + gdm_daemon_sources = [ + gdm_daemon_sources, + files( + 'gdm-xdmcp-display-factory.c', + 'gdm-xdmcp-display.c', + 'gdm-xdmcp-chooser-display.c', + ), + ] + endif + ++if gudev_dep.found() ++ gdm_daemon_deps += gudev_dep ++endif ++ + gdm_daemon = executable('gdm', + [ gdm_daemon_sources, gdm_daemon_gen_sources ], + dependencies: gdm_daemon_deps, + include_directories: config_h_dir, + install: true, + install_dir: get_option('sbindir') + ) +diff --git a/meson.build b/meson.build +index 02d609dc..05d8da41 100644 +--- a/meson.build ++++ b/meson.build +@@ -11,60 +11,61 @@ i18n = import('i18n') + + # Compiler + cc = meson.get_compiler('c') + + # Options + gdm_prefix = get_option('prefix') + + gdmconfdir = (get_option('sysconfsubdir') == '')? gdm_prefix / get_option('sysconfdir') : gdm_prefix / get_option('sysconfdir') / get_option('sysconfsubdir') + dmconfdir = (get_option('dmconfdir') != '')? get_option('dmconfdir') : gdm_prefix / get_option('sysconfdir') / 'dm' + udev_dir = get_option('udev-dir') + at_spi_registryd_dir = (get_option('at-spi-registryd-dir') != '')? get_option('at-spi-registryd-dir') : gdm_prefix / get_option('libexecdir') + lang_config_file = (get_option('lang-file') != '')? get_option('lang-file') : gdm_prefix / get_option('sysconfdir') / 'locale.conf' + pam_mod_dir = (get_option('pam-mod-dir') != '')? get_option('pam-mod-dir') : gdm_prefix / get_option('libdir') / 'security' + dbus_sys_dir = (get_option('dbus-sys') != '')? get_option('dbus-sys') : get_option('sysconfdir') / 'dbus-1' / 'system.d' + gdm_defaults_conf = (get_option('defaults-conf') != '')? get_option('defaults-conf') : gdm_prefix / get_option('datadir') / 'gdm' / 'defaults.conf' + gdm_custom_conf = (get_option('custom-conf') != '')? get_option('custom-conf') : gdmconfdir / 'custom.conf' + gnome_settings_daemon_dir = (get_option('gnome-settings-daemon-dir') != '')? get_option('gnome-settings-daemon-dir') : gdm_prefix / get_option('libexecdir') + gdm_run_dir = (get_option('run-dir') != '')? get_option('run-dir') : gdm_prefix / get_option('localstatedir') / 'run' / 'gdm' + gdm_runtime_conf = (get_option('runtime-conf') != '')? get_option('runtime-conf') : gdm_run_dir / 'custom.conf' + gdm_pid_file = (get_option('pid-file') != '')? get_option('pid-file') : gdm_run_dir / 'gdm.pid' + ran_once_marker_dir = (get_option('ran-once-marker-dir') != '')? get_option('ran-once-marker-dir') : gdm_run_dir + working_dir = (get_option('working-dir') != '')? get_option('working-dir') : gdm_prefix / get_option('localstatedir') / 'lib' / 'gdm' + gdm_xauth_dir = (get_option('xauth-dir') != '')? get_option('xauth-dir') : gdm_run_dir + gdm_screenshot_dir = (get_option('screenshot-dir') != '')? get_option('screenshot-dir') : gdm_run_dir / 'greeter' + + # Common variables + config_h_dir = include_directories('.') + + # Dependencies + udev_dep = dependency('udev') ++gudev_dep = dependency('gudev-1.0', version: '>= 232') + + glib_min_version = '2.56.0' + + glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version) + gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version) + gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version) + gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version) + gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1') + libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4') + accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35') + xcb_dep = dependency('xcb') + keyutils_dep = dependency('libkeyutils', required: false) + libselinux_dep = dependency('libselinux', required: get_option('selinux')) + + # udev + if udev_dir == '' + if udev_dep.found() + udev_prefix = udev_dep.get_pkgconfig_variable('udevdir') + else + udev_prefix = gdm_prefix / 'lib' / 'udev' + endif + udev_dir = udev_prefix / 'rules.d' + endif + + # X11 + x_deps = declare_dependency( + dependencies: [ + dependency('x11'), + dependency('xau'), + ], +@@ -217,60 +218,61 @@ conf.set('HAVE_UTMP_H', have_utmp_header) + conf.set('HAVE_UTMPX_H', have_utmpx_header) + conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r) + conf.set('UTMP', utmp_struct) + conf.set('HAVE_GETUTXENT', cc.has_function('getutxent')) + conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp')) + conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx')) + conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil')) + conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil')) + conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil')) + conf.set('HAVE_PAM_SYSLOG', have_pam_syslog) + conf.set('HAVE_KEYUTILS', keyutils_dep.found()) + conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported) + conf.set('HAVE_SELINUX', libselinux_dep.found()) + conf.set('HAVE_XSERVER_WITH_LISTEN', xserver_has_listen) + conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server')) + conf.set('ENABLE_SYSTEMD_JOURNAL', get_option('systemd-journal')) + conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support')) + conf.set('ENABLE_PROFILING', get_option('profiling')) + conf.set('GDM_INITIAL_VT', get_option('initial-vt')) + conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf) + conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf) + conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf) + conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path')) + conf.set_quoted('GDM_USERNAME', get_option('user')) + conf.set_quoted('GDM_GROUPNAME', get_option('group')) + conf.set('HAVE_LIBXDMCP', xdmcp_dep.found()) + conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server) + conf.set('WITH_PLYMOUTH', plymouth_dep.found()) + conf.set_quoted('X_SERVER', x_bin) + conf.set_quoted('X_PATH', x_path) ++conf.set('HAVE_UDEV', gudev_dep.found()) + conf.set('HAVE_UT_UT_HOST', utmp_has_host_field) + conf.set('HAVE_UT_UT_PID', utmp_has_pid_field) + conf.set('HAVE_UT_UT_ID', utmp_has_id_field) + conf.set('HAVE_UT_UT_NAME', utmp_has_name_field) + conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field) + conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field) + conf.set('HAVE_UT_UT_USER', utmp_has_user_field) + conf.set('HAVE_UT_UT_TIME', utmp_has_time_field) + conf.set('HAVE_UT_UT_TV', utmp_has_tv_field) + conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field) + conf.set('ENABLE_IPV6', get_option('ipv6')) + configure_file(output: 'config.h', configuration: conf) + + # Subdirs + subdir('data') + subdir('common') + if pam_extensions_supported + subdir('pam-extensions') + endif + subdir('daemon') + subdir('libgdm') + subdir('utils') + subdir('pam_gdm') + subdir('po') + if libcheck_dep.found() + subdir('tests') + endif + if xdmcp_dep.found() + subdir('chooser') + endif +-- +2.34.1 + diff --git a/SOURCES/0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch b/SOURCES/0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch new file mode 100644 index 0000000..13b39da --- /dev/null +++ b/SOURCES/0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch @@ -0,0 +1,344 @@ +From 2e7965beae81e0e93d3f475f2ea29a7af6c23f29 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 20 Dec 2018 14:51:38 -0500 +Subject: [PATCH 1/3] manager: allow multiple xdmcp logins for the same user + +--- + common/gdm-settings-keys.h | 1 + + daemon/gdm-manager.c | 71 ++++++++++++++++++++++++++++---------- + data/gdm.schemas.in | 5 +++ + 3 files changed, 59 insertions(+), 18 deletions(-) + +diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h +index 87685d3c..4b3a1ffe 100644 +--- a/common/gdm-settings-keys.h ++++ b/common/gdm-settings-keys.h +@@ -30,37 +30,38 @@ G_BEGIN_DECLS + #define GDM_KEY_AUTO_LOGIN_ENABLE "daemon/AutomaticLoginEnable" + #define GDM_KEY_AUTO_LOGIN_USER "daemon/AutomaticLogin" + #define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable" + #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin" + #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay" + #define GDM_KEY_INITIAL_SETUP_ENABLE "daemon/InitialSetupEnable" + #define GDM_KEY_PREFERRED_DISPLAY_SERVER "daemon/PreferredDisplayServer" + #define GDM_KEY_WAYLAND_ENABLE "daemon/WaylandEnable" + #define GDM_KEY_XORG_ENABLE "daemon/XorgEnable" + + #define GDM_KEY_DEBUG "debug/Enable" + + #define GDM_KEY_INCLUDE "greeter/Include" + #define GDM_KEY_EXCLUDE "greeter/Exclude" + #define GDM_KEY_INCLUDE_ALL "greeter/IncludeAll" + + #define GDM_KEY_DISALLOW_TCP "security/DisallowTCP" + #define GDM_KEY_ALLOW_REMOTE_AUTOLOGIN "security/AllowRemoteAutoLogin" + + #define GDM_KEY_XDMCP_ENABLE "xdmcp/Enable" + #define GDM_KEY_SHOW_LOCAL_GREETER "xdmcp/ShowLocalGreeter" + #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending" + #define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions" + #define GDM_KEY_MAX_WAIT "xdmcp/MaxWait" + #define GDM_KEY_DISPLAYS_PER_HOST "xdmcp/DisplaysPerHost" + #define GDM_KEY_UDP_PORT "xdmcp/Port" + #define GDM_KEY_INDIRECT "xdmcp/HonorIndirect" + #define GDM_KEY_MAX_WAIT_INDIRECT "xdmcp/MaxWaitIndirect" + #define GDM_KEY_PING_INTERVAL "xdmcp/PingIntervalSeconds" + #define GDM_KEY_WILLING "xdmcp/Willing" ++#define GDM_KEY_ALLOW_MULTIPLE_SESSIONS_PER_USER "xdmcp/AllowMultipleSessionsPerUser" + + #define GDM_KEY_MULTICAST "chooser/Multicast" + #define GDM_KEY_MULTICAST_ADDR "chooser/MulticastAddr" + + G_END_DECLS + + #endif /* _GDM_SETTINGS_KEYS_H */ +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index cc61efc9..dc839aeb 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -566,93 +566,106 @@ get_display_and_details_for_bus_sender (GdmManager *self, + *out_tty = get_tty_for_session_id (session_id, &error); + + if (error != NULL) { + g_debug ("GdmManager: Error while retrieving tty for session: %s", + error->message); + g_clear_error (&error); + } + } + + display = gdm_display_store_find (self->priv->display_store, + lookup_by_session_id, + (gpointer) session_id); + + out: + if (out_display != NULL) { + *out_display = display; + } + + g_free (session_id); + } + + static gboolean + switch_to_compatible_user_session (GdmManager *manager, + GdmSession *session, + gboolean fail_if_already_switched) + { + gboolean res; + gboolean ret; + const char *username; + const char *seat_id; +- const char *ssid_to_activate; ++ const char *ssid_to_activate = NULL; + GdmSession *existing_session; + + ret = FALSE; + + username = gdm_session_get_username (session); + seat_id = gdm_session_get_display_seat_id (session); + +- if (!fail_if_already_switched) { +- session = NULL; +- } ++ if (!fail_if_already_switched) ++ ssid_to_activate = gdm_session_get_session_id (session); + +- existing_session = find_session_for_user_on_seat (manager, username, seat_id, session); ++ if (ssid_to_activate == NULL) { ++ if (!seat_id || !sd_seat_can_multi_session (seat_id)) { ++ g_debug ("GdmManager: unable to activate existing sessions from login screen unless on seat0"); ++ goto out; ++ } + +- if (existing_session != NULL) { +- ssid_to_activate = gdm_session_get_session_id (existing_session); +- if (seat_id != NULL) { +- res = gdm_activate_session_by_id (manager->priv->connection, seat_id, ssid_to_activate); +- if (! res) { +- g_debug ("GdmManager: unable to activate session: %s", ssid_to_activate); +- goto out; +- } ++ if (!fail_if_already_switched) { ++ session = NULL; + } + +- res = session_unlock (manager, ssid_to_activate); +- if (!res) { +- /* this isn't fatal */ +- g_debug ("GdmManager: unable to unlock session: %s", ssid_to_activate); ++ existing_session = find_session_for_user_on_seat (manager, username, seat_id, session); ++ ++ if (existing_session != NULL) { ++ ssid_to_activate = gdm_session_get_session_id (existing_session); + } +- } else { ++ } ++ ++ if (ssid_to_activate == NULL) { + goto out; + } + ++ if (seat_id != NULL) { ++ res = gdm_activate_session_by_id (manager->priv->connection, seat_id, ssid_to_activate); ++ if (! res) { ++ g_debug ("GdmManager: unable to activate session: %s", ssid_to_activate); ++ goto out; ++ } ++ } ++ ++ res = session_unlock (manager, ssid_to_activate); ++ if (!res) { ++ /* this isn't fatal */ ++ g_debug ("GdmManager: unable to unlock session: %s", ssid_to_activate); ++ } ++ + ret = TRUE; + + out: + return ret; + } + + static GdmDisplay * + get_display_for_user_session (GdmSession *session) + { + return g_object_get_data (G_OBJECT (session), "gdm-display"); + } + + static GdmSession * + get_user_session_for_display (GdmDisplay *display) + { + if (display == NULL) { + return NULL; + } + + return g_object_get_data (G_OBJECT (display), "gdm-user-session"); + } + + static gboolean + add_session_record (GdmManager *manager, + GdmSession *session, + GPid pid, + SessionRecord record) + { + const char *username; + char *display_name, *hostname, *display_device; +@@ -1089,92 +1102,114 @@ open_temporary_reauthentication_channel (GdmManager *self, + g_signal_connect (session, + "client-disconnected", + G_CALLBACK (on_reauthentication_client_disconnected), + self); + g_signal_connect (session, + "client-rejected", + G_CALLBACK (on_reauthentication_client_rejected), + self); + g_signal_connect (session, + "cancelled", + G_CALLBACK (on_reauthentication_cancelled), + self); + g_signal_connect (session, + "conversation-started", + G_CALLBACK (on_reauthentication_conversation_started), + self); + g_signal_connect (session, + "conversation-stopped", + G_CALLBACK (on_reauthentication_conversation_stopped), + self); + g_signal_connect (session, + "verification-complete", + G_CALLBACK (on_reauthentication_verification_complete), + self); + + address = gdm_session_get_server_address (session); + + return g_strdup (address); + } + ++static gboolean ++remote_users_can_log_in_more_than_once (GdmManager *manager) ++{ ++ gboolean enabled; ++ ++ enabled = FALSE; ++ ++ gdm_settings_direct_get_boolean (GDM_KEY_ALLOW_MULTIPLE_SESSIONS_PER_USER, &enabled); ++ ++ g_debug ("GdmDisplay: Remote users allowed to log in more than once: %s", enabled? "yes" : "no"); ++ ++ return enabled; ++} ++ + static gboolean + gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager, + GDBusMethodInvocation *invocation, + const char *username) + { + GdmManager *self = GDM_MANAGER (manager); + const char *sender; + GdmDisplay *display = NULL; + GdmSession *session; + GDBusConnection *connection; + char *seat_id = NULL; + char *session_id = NULL; + GPid pid = 0; + uid_t uid = (uid_t) -1; + gboolean is_login_screen = FALSE; + gboolean is_remote = FALSE; + + g_debug ("GdmManager: trying to open reauthentication channel for user %s", username); + + 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, &seat_id, &session_id, NULL, &pid, &uid, &is_login_screen, &is_remote); + + if (session_id == NULL || pid == 0 || uid == (uid_t) -1) { + g_dbus_method_invocation_return_error_literal (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_ACCESS_DENIED, + _("No session available")); + + return TRUE; + } + ++ if (is_login_screen && is_remote && remote_users_can_log_in_more_than_once (self)) { ++ g_dbus_method_invocation_return_error_literal (invocation, ++ G_DBUS_ERROR, ++ G_DBUS_ERROR_ACCESS_DENIED, ++ "Login screen creates new sessions for remote connections"); ++ return TRUE; ++ } ++ + if (is_login_screen) { + g_debug ("GdmManager: looking for login screen session for user %s on seat %s", username, seat_id); + session = find_session_for_user_on_seat (self, + username, + seat_id, + NULL); + } else { + g_debug ("GdmManager: looking for user session on display"); + session = get_user_session_for_display (display); + } + + if (session != NULL && gdm_session_is_running (session)) { + gdm_session_start_reauthentication (session, pid, uid); + g_hash_table_insert (self->priv->open_reauthentication_requests, + GINT_TO_POINTER (pid), + invocation); + } else if (is_login_screen) { + g_dbus_method_invocation_return_error_literal (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_ACCESS_DENIED, + "Login screen only allowed to open reauthentication channels for running sessions"); + return TRUE; + } else { + char *address; + address = open_temporary_reauthentication_channel (self, + seat_id, + session_id, + pid, + uid, + is_remote); +diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in +index a1035f95..929d13d9 100644 +--- a/data/gdm.schemas.in ++++ b/data/gdm.schemas.in +@@ -112,33 +112,38 @@ + + xdmcp/DisplaysPerHost + i + 1 + + + xdmcp/Port + i + 177 + + + xdmcp/HonorIndirect + b + true + + + xdmcp/MaxWaitIndirect + i + 30 + + + xdmcp/PingIntervalSeconds + i + 0 + + + xdmcp/Willing + s + @gdmconfdir@/Xwilling + ++ ++ xdmcp/AllowMultipleSessionsPerUser ++ b ++ false ++ + + + +-- +2.32.0 + diff --git a/SOURCES/0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch b/SOURCES/0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch new file mode 100644 index 0000000..0b6b1ec --- /dev/null +++ b/SOURCES/0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch @@ -0,0 +1,144 @@ +From b8caa1a18f284cc9b59a2e0273780a51b6fd7528 Mon Sep 17 00:00:00 2001 +From: Alan Coopersmith +Date: Thu, 7 Oct 2021 18:22:11 -0700 +Subject: [PATCH 1/2] meson: Fix detection of Xorg versions that need -listen + tcp + +Closes #704 +--- + meson.build | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/meson.build b/meson.build +index 64b98628..52ac1941 100644 +--- a/meson.build ++++ b/meson.build +@@ -42,60 +42,63 @@ udev_dep = dependency('udev') + glib_min_version = '2.56.0' + + glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version) + gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version) + gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version) + gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version) + gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1') + libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4') + accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35') + xcb_dep = dependency('xcb') + keyutils_dep = dependency('libkeyutils', required: false) + libselinux_dep = dependency('libselinux', required: get_option('selinux')) + + # udev + if udev_dir == '' + if udev_dep.found() + udev_prefix = udev_dep.get_pkgconfig_variable('udevdir') + else + udev_prefix = gdm_prefix / 'lib' / 'udev' + endif + udev_dir = udev_prefix / 'rules.d' + endif + + # X11 + x_deps = declare_dependency( + dependencies: [ + dependency('x11'), + dependency('xau'), + ], + ) ++# Xserver 1.17 & later default to -nolisten and require -listen for remote access ++xserver_deps = dependency('xorg-server', version : '>=1.17', required : false) ++xserver_nolisten_default = xserver_deps.found() + find_x_server_script = find_program('build-aux/find-x-server.sh', native: true) + find_x_server_out = run_command(find_x_server_script).stdout().strip() + if find_x_server_out != '' + x_bin = find_x_server_out + x_bin_path_split = x_bin.split('/') + i = 0 + x_path = '/' + foreach dir : x_bin_path_split + if i < x_bin_path_split.length() - 1 + x_path = x_path / dir + endif + i = i + 1 + endforeach + else + # what to do, what to do, this is wrong, but this just sets the + # defaults, perhaps this user is cross compiling or some such + x_path = '/usr/bin/X11:/usr/X11R6/bin:/opt/X11R6/bin' + x_bin = '/usr/bin/X' + endif + xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp')) + if xdmcp_dep.found() and get_option('tcp-wrappers') + libwrap_dep = cc.find_library('wrap') + endif + # systemd + systemd_dep = dependency('systemd') + libsystemd_dep = dependency('libsystemd') + if meson.version().version_compare('>= 0.53') + systemd_multiseat_x = find_program('systemd-multi-seat-x', + required: false, + dirs: [ +@@ -197,60 +200,61 @@ conf.set_quoted('SYSCONFDIR', gdm_prefix / get_option('sysconfdir')) + conf.set_quoted('BINDIR', gdm_prefix / get_option('bindir')) + conf.set_quoted('LIBDIR', gdm_prefix / get_option('libdir')) + conf.set_quoted('LIBEXECDIR', gdm_prefix / get_option('libexecdir')) + conf.set_quoted('LOGDIR', get_option('log-dir')) + conf.set_quoted('DMCONFDIR', dmconfdir) + conf.set_quoted('GDMCONFDIR', gdmconfdir) + conf.set_quoted('GDM_SCREENSHOT_DIR', gdm_screenshot_dir) + conf.set_quoted('GDM_XAUTH_DIR', gdm_xauth_dir) + conf.set_quoted('GDM_RAN_ONCE_MARKER_DIR', ran_once_marker_dir) + conf.set_quoted('GDM_RUN_DIR', gdm_run_dir) + conf.set_quoted('GNOMELOCALEDIR', gdm_prefix / get_option('localedir')) + conf.set_quoted('AT_SPI_REGISTRYD_DIR', at_spi_registryd_dir) + conf.set_quoted('GDM_PID_FILE', gdm_pid_file) + conf.set_quoted('GNOME_SETTINGS_DAEMON_DIR', gnome_settings_daemon_dir) + conf.set_quoted('LANG_CONFIG_FILE', lang_config_file) + conf.set('HAVE_ADT', have_adt) + conf.set('HAVE_UTMP_H', have_utmp_header) + conf.set('HAVE_UTMPX_H', have_utmpx_header) + conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r) + conf.set('UTMP', utmp_struct) + conf.set('HAVE_GETUTXENT', cc.has_function('getutxent')) + conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp')) + conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx')) + conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil')) + conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil')) + conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil')) + conf.set('HAVE_PAM_SYSLOG', have_pam_syslog) + conf.set('HAVE_KEYUTILS', keyutils_dep.found()) + conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported) + conf.set('HAVE_SELINUX', libselinux_dep.found()) ++conf.set('HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY', xserver_nolisten_default) + conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server')) + conf.set('ENABLE_SYSTEMD_JOURNAL', get_option('systemd-journal')) + conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support')) + conf.set('ENABLE_PROFILING', get_option('profiling')) + conf.set('GDM_INITIAL_VT', get_option('initial-vt')) + conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf) + conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf) + conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf) + conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path')) + conf.set_quoted('GDM_USERNAME', get_option('user')) + conf.set_quoted('GDM_GROUPNAME', get_option('group')) + conf.set('HAVE_LIBXDMCP', xdmcp_dep.found()) + conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server) + conf.set('WITH_PLYMOUTH', plymouth_dep.found()) + conf.set_quoted('X_SERVER', x_bin) + conf.set_quoted('X_PATH', x_path) + conf.set('HAVE_UT_UT_HOST', utmp_has_host_field) + conf.set('HAVE_UT_UT_PID', utmp_has_pid_field) + conf.set('HAVE_UT_UT_ID', utmp_has_id_field) + conf.set('HAVE_UT_UT_NAME', utmp_has_name_field) + conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field) + conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field) + conf.set('HAVE_UT_UT_USER', utmp_has_user_field) + conf.set('HAVE_UT_UT_TIME', utmp_has_time_field) + conf.set('HAVE_UT_UT_TV', utmp_has_tv_field) + conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field) + conf.set('ENABLE_IPV6', get_option('ipv6')) + configure_file(output: 'config.h', configuration: conf) + + # Subdirs +-- +2.34.1 + diff --git a/SOURCES/0001-session-settings-Fetch-session-from-user-even-if-use.patch b/SOURCES/0001-session-settings-Fetch-session-from-user-even-if-use.patch new file mode 100644 index 0000000..109ec15 --- /dev/null +++ b/SOURCES/0001-session-settings-Fetch-session-from-user-even-if-use.patch @@ -0,0 +1,89 @@ +From 8a29f79124f38e2106b263bacb6b5ab4cdb255d0 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 9 Mar 2022 10:46:21 -0500 +Subject: [PATCH] session-settings: Fetch session from user even if user isn't + cached + +Now that accountsservice supports session templates, GDM can't assume +that no-cache file means, there's nothing worth reading. + +Unfortunately, GDM does exactly that. It bypasses fetching the users +session if it doesn't think the user has one. + +This commit removes that no-longer-correct optimization. +--- + daemon/gdm-session-settings.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c +index 5b64cb65..fbf6897b 100644 +--- a/daemon/gdm-session-settings.c ++++ b/daemon/gdm-session-settings.c +@@ -270,64 +270,60 @@ gdm_session_settings_new (void) + GdmSessionSettings *settings; + + settings = g_object_new (GDM_TYPE_SESSION_SETTINGS, + NULL); + + return settings; + } + + gboolean + gdm_session_settings_is_loaded (GdmSessionSettings *settings) + { + if (settings->priv->user == NULL) { + return FALSE; + } + + return act_user_is_loaded (settings->priv->user); + } + + static void + load_settings_from_user (GdmSessionSettings *settings) + { + const char *session_name; + const char *session_type; + const char *language_name; + + if (!act_user_is_loaded (settings->priv->user)) { + g_warning ("GdmSessionSettings: trying to load user settings from unloaded user"); + return; + } + +- /* if the user doesn't have saved state, they don't have any settings worth reading */ +- if (!act_user_get_saved (settings->priv->user)) +- goto out; +- + session_type = act_user_get_session_type (settings->priv->user); + session_name = act_user_get_session (settings->priv->user); + + g_debug ("GdmSessionSettings: saved session is %s (type %s)", session_name, session_type); + + if (session_type != NULL && session_type[0] != '\0') { + gdm_session_settings_set_session_type (settings, session_type); + } + + if (session_name != NULL && session_name[0] != '\0') { + gdm_session_settings_set_session_name (settings, session_name); + } + + language_name = act_user_get_language (settings->priv->user); + + g_debug ("GdmSessionSettings: saved language is %s", language_name); + if (language_name != NULL && language_name[0] != '\0') { + gdm_session_settings_set_language_name (settings, language_name); + } + + out: + g_object_notify (G_OBJECT (settings), "is-loaded"); + } + + static void + on_user_is_loaded_changed (ActUser *user, + GParamSpec *pspec, + GdmSessionSettings *settings) + { + if (act_user_is_loaded (settings->priv->user)) { +-- +2.34.1 + diff --git a/SOURCES/0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch b/SOURCES/0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch new file mode 100644 index 0000000..f69ae2b --- /dev/null +++ b/SOURCES/0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch @@ -0,0 +1,84 @@ +From 26705ee64f4d3628eaaf45db980c435fa26e112a Mon Sep 17 00:00:00 2001 +From: Chingkai Chu <3013329+chuchingkai@users.noreply.github.com> +Date: Thu, 12 Aug 2021 10:34:01 +0800 +Subject: [PATCH] session-worker: Set session_vt=0 out of pam uninitialization + +MR GNOME/gdm!123 moved jump_to_vt and session_vt reseting to a +separate function, so we don't need to reset session_vt in pam +uninitialization. + +https://gitlab.gnome.org/GNOME/gdm/-/issues/719 +--- + daemon/gdm-session-worker.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c +index 7d7d2496..3ad94e2a 100644 +--- a/daemon/gdm-session-worker.c ++++ b/daemon/gdm-session-worker.c +@@ -1076,62 +1076,60 @@ gdm_session_worker_set_state (GdmSessionWorker *worker, + + static void + gdm_session_worker_uninitialize_pam (GdmSessionWorker *worker, + int status) + { + g_debug ("GdmSessionWorker: uninitializing PAM"); + + if (worker->priv->pam_handle == NULL) + return; + + gdm_session_worker_get_username (worker, NULL); + + if (worker->priv->state >= GDM_SESSION_WORKER_STATE_SESSION_OPENED) { + pam_close_session (worker->priv->pam_handle, 0); + gdm_session_auditor_report_logout (worker->priv->auditor); + } else { + gdm_session_auditor_report_login_failure (worker->priv->auditor, + status, + pam_strerror (worker->priv->pam_handle, status)); + } + + if (worker->priv->state >= GDM_SESSION_WORKER_STATE_ACCREDITED) { + pam_setcred (worker->priv->pam_handle, PAM_DELETE_CRED); + } + + pam_end (worker->priv->pam_handle, status); + worker->priv->pam_handle = NULL; + + gdm_session_worker_stop_auditor (worker); + +- worker->priv->session_vt = 0; +- + g_debug ("GdmSessionWorker: state NONE"); + gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_NONE); + } + + static char * + _get_tty_for_pam (const char *x11_display_name, + const char *display_device) + { + #ifdef __sun + return g_strdup (display_device); + #else + return g_strdup (x11_display_name); + #endif + } + + #ifdef PAM_XAUTHDATA + static struct pam_xauth_data * + _get_xauth_for_pam (const char *x11_authority_file) + { + FILE *fh; + Xauth *auth = NULL; + struct pam_xauth_data *retval = NULL; + gsize len = sizeof (*retval) + 1; + + fh = fopen (x11_authority_file, "r"); + if (fh) { + auth = XauReadAuth (fh); + fclose (fh); + } + if (auth) { +-- +2.32.0 + diff --git a/SOURCES/0001-xdmcp-display-factory-Set-supported-session-types-fo.patch b/SOURCES/0001-xdmcp-display-factory-Set-supported-session-types-fo.patch new file mode 100644 index 0000000..f3eefe7 --- /dev/null +++ b/SOURCES/0001-xdmcp-display-factory-Set-supported-session-types-fo.patch @@ -0,0 +1,122 @@ +From 36b9fd4f6e055e236175979d9a1527df71aeac1f Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 14 Sep 2021 11:00:33 -0400 +Subject: [PATCH 1/5] xdmcp-display-factory: Set supported session types for + XDMCP displays + +The lower levels of GDM now expect the session types supported by a +display to be specified up front. + +This commit makes sure XDMCP displays do that. +--- + daemon/gdm-xdmcp-display-factory.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c +index ce8f026e..abb58fae 100644 +--- a/daemon/gdm-xdmcp-display-factory.c ++++ b/daemon/gdm-xdmcp-display-factory.c +@@ -2104,94 +2104,100 @@ on_display_status_changed (GdmDisplay *display, + break; + case GDM_DISPLAY_MANAGED: + if (session != NULL) { + g_signal_connect_object (G_OBJECT (session), + "client-disconnected", + G_CALLBACK (on_client_disconnected), + display, G_CONNECT_SWAPPED); + g_signal_connect_object (G_OBJECT (session), + "disconnected", + G_CALLBACK (on_client_disconnected), + display, G_CONNECT_SWAPPED); + } + break; + default: + g_assert_not_reached (); + break; + } + + g_clear_object (&launch_environment); + } + + static GdmDisplay * + gdm_xdmcp_display_create (GdmXdmcpDisplayFactory *factory, + const char *hostname, + GdmAddress *address, + int displaynum) + { + GdmDisplay *display; + GdmDisplayStore *store; + gboolean use_chooser; ++ const char *session_types[] = { "x11", NULL }; + + g_debug ("GdmXdmcpDisplayFactory: Creating xdmcp display for %s:%d", + hostname ? hostname : "(null)", displaynum); + + use_chooser = FALSE; + if (factory->honor_indirect) { + IndirectClient *ic; + + ic = indirect_client_lookup (factory, address); + + /* This was an indirect thingie and nothing was yet chosen, + * use a chooser */ + if (ic != NULL && ic->chosen_address == NULL) { + use_chooser = TRUE; + } + } + + if (use_chooser) { + display = gdm_xdmcp_chooser_display_new (hostname, + displaynum, + address, + get_next_session_serial (factory)); + g_signal_connect (display, "hostname-selected", G_CALLBACK (on_hostname_selected), factory); + } else { + display = gdm_xdmcp_display_new (hostname, + displaynum, + address, + get_next_session_serial (factory)); + } + + if (display == NULL) { + goto out; + } + ++ g_object_set (G_OBJECT (display), ++ "session-type", session_types[0], ++ "supported-session-types", session_types, ++ NULL); ++ + if (! gdm_display_prepare (display)) { + gdm_display_unmanage (display); + g_object_unref (display); + display = NULL; + goto out; + } + + g_signal_connect_after (display, + "notify::status", + G_CALLBACK (on_display_status_changed), + factory); + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + gdm_display_store_add (store, display); + + factory->num_pending_sessions++; + out: + + return display; + } + + static void + gdm_xdmcp_send_accept (GdmXdmcpDisplayFactory *factory, + GdmAddress *address, + CARD32 session_id, + ARRAY8Ptr authentication_name, + ARRAY8Ptr authentication_data, + ARRAY8Ptr authorization_name, + ARRAY8Ptr authorization_data) + { +-- +2.34.1 + diff --git a/SOURCES/0002-common-Add-API-to-reload-settings-from-disk.patch b/SOURCES/0002-common-Add-API-to-reload-settings-from-disk.patch new file mode 100644 index 0000000..b6696e6 --- /dev/null +++ b/SOURCES/0002-common-Add-API-to-reload-settings-from-disk.patch @@ -0,0 +1,356 @@ +From d3e073fa1cd314b344db1ec22f0add2702a6c299 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 15 Feb 2022 14:33:22 -0500 +Subject: [PATCH 2/4] common: Add API to reload settings from disk + +Ideally we would reread /run/gdm/custom.conf after we've decided +graphics setup is complete. This is because the file may not +get written out by udev until after GDM is already started and waiting. + +As a first step to get there, this commit adds an API for rereading +the file, and changes the SIGHUP handler to use it (instead of +the complete teardown and reinitialization it was doing before). +--- + common/gdm-settings-direct.c | 9 +++++++++ + common/gdm-settings-direct.h | 2 ++ + common/gdm-settings.c | 14 ++++++++++++-- + common/gdm-settings.h | 1 + + daemon/main.c | 12 ++---------- + 5 files changed, 26 insertions(+), 12 deletions(-) + +diff --git a/common/gdm-settings-direct.c b/common/gdm-settings-direct.c +index ddb31908..5fbe0326 100644 +--- a/common/gdm-settings-direct.c ++++ b/common/gdm-settings-direct.c +@@ -224,35 +224,44 @@ hashify_list (GdmSettingsEntry *entry, + + gboolean + gdm_settings_direct_init (GdmSettings *settings, + const char *file, + const char *root) + { + GSList *list; + + g_return_val_if_fail (file != NULL, FALSE); + g_return_val_if_fail (root != NULL, FALSE); + + g_debug ("Settings Direct Init"); + if (schemas != NULL) { + g_hash_table_unref (schemas); + schemas = NULL; + } + + if (! gdm_settings_parse_schemas (file, root, &list)) { + g_warning ("Unable to parse schemas"); + return FALSE; + } + + schemas = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)gdm_settings_entry_free); + g_slist_foreach (list, (GFunc)hashify_list, NULL); + + settings_object = settings; + + return TRUE; + } + ++void ++gdm_settings_direct_reload (void) ++{ ++ if (!settings_object) ++ return; ++ ++ gdm_settings_reload (settings_object); ++} ++ + void + gdm_settings_direct_shutdown (void) + { + + } +diff --git a/common/gdm-settings-direct.h b/common/gdm-settings-direct.h +index 156489cd..6754955f 100644 +--- a/common/gdm-settings-direct.h ++++ b/common/gdm-settings-direct.h +@@ -3,48 +3,50 @@ + * Copyright (C) 2007 William Jon McCann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 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. + * + */ + + + #ifndef __GDM_SETTINGS_DIRECT_H + #define __GDM_SETTINGS_DIRECT_H + + #include + #include "gdm-settings.h" + + G_BEGIN_DECLS + + gboolean gdm_settings_direct_init (GdmSettings *settings, + const char *schemas_file, + const char *root); ++ ++void gdm_settings_direct_reload (void); + void gdm_settings_direct_shutdown (void); + + gboolean gdm_settings_direct_get (const char *key, + GValue *value); + gboolean gdm_settings_direct_set (const char *key, + GValue *value); + gboolean gdm_settings_direct_get_int (const char *key, + int *value); + gboolean gdm_settings_direct_get_uint (const char *key, + uint *value); + gboolean gdm_settings_direct_get_boolean (const char *key, + gboolean *value); + gboolean gdm_settings_direct_get_string (const char *key, + char **value); + + G_END_DECLS + + #endif /* __GDM_SETTINGS_DIRECT_H */ +diff --git a/common/gdm-settings.c b/common/gdm-settings.c +index e6f46ec3..96c2f8d3 100644 +--- a/common/gdm-settings.c ++++ b/common/gdm-settings.c +@@ -157,84 +157,94 @@ gdm_settings_class_init (GdmSettingsClass *klass) + object_class->finalize = gdm_settings_finalize; + + signals [VALUE_CHANGED] = + g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 3, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING); + } + + static void + backend_value_changed (GdmSettingsBackend *backend, + const char *key, + const char *old_value, + const char *new_value, + GdmSettings *settings) + { + g_debug ("Emitting value-changed %s %s %s", key, old_value, new_value); + + /* proxy it to internal listeners */ + g_signal_emit (settings, signals [VALUE_CHANGED], 0, key, old_value, new_value); + } + +-static void +-gdm_settings_init (GdmSettings *settings) ++void ++gdm_settings_reload (GdmSettings *settings) + { + GList *l; + GdmSettingsBackend *backend; + ++ g_list_foreach (settings->backends, (GFunc) g_object_unref, NULL); ++ g_list_free (settings->backends); ++ settings->backends = NULL; ++ + backend = gdm_settings_desktop_backend_new (GDM_CUSTOM_CONF); + if (backend) + settings->backends = g_list_prepend (NULL, backend); + + backend = gdm_settings_desktop_backend_new (GDM_RUNTIME_CONF); + if (backend) + settings->backends = g_list_prepend (settings->backends, backend); + + for (l = settings->backends; l; l = g_list_next (l)) { + backend = l->data; + + g_signal_connect (backend, + "value-changed", + G_CALLBACK (backend_value_changed), + settings); + } + } + ++static void ++gdm_settings_init (GdmSettings *settings) ++{ ++ gdm_settings_reload (settings); ++} ++ + static void + gdm_settings_finalize (GObject *object) + { + GdmSettings *settings; + + g_return_if_fail (object != NULL); + g_return_if_fail (GDM_IS_SETTINGS (object)); + + settings = GDM_SETTINGS (object); + + g_return_if_fail (settings != NULL); + + g_list_foreach (settings->backends, (GFunc) g_object_unref, NULL); + g_list_free (settings->backends); + settings->backends = NULL; + + settings_object = NULL; + + G_OBJECT_CLASS (gdm_settings_parent_class)->finalize (object); + } + + GdmSettings * + gdm_settings_new (void) + { + if (settings_object != NULL) { + g_object_ref (settings_object); + } else { + settings_object = g_object_new (GDM_TYPE_SETTINGS, NULL); + } + +diff --git a/common/gdm-settings.h b/common/gdm-settings.h +index 786868a9..07b64785 100644 +--- a/common/gdm-settings.h ++++ b/common/gdm-settings.h +@@ -13,45 +13,46 @@ + * 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. + * + */ + + + #ifndef __GDM_SETTINGS_H + #define __GDM_SETTINGS_H + + #include + + G_BEGIN_DECLS + + #define GDM_TYPE_SETTINGS (gdm_settings_get_type ()) + G_DECLARE_FINAL_TYPE (GdmSettings, gdm_settings, GDM, SETTINGS, GObject) + + typedef enum + { + GDM_SETTINGS_ERROR_GENERAL, + GDM_SETTINGS_ERROR_KEY_NOT_FOUND + } GdmSettingsError; + + #define GDM_SETTINGS_ERROR gdm_settings_error_quark () + + GQuark gdm_settings_error_quark (void); + + GdmSettings * gdm_settings_new (void); ++void gdm_settings_reload (GdmSettings *settings); + + /* exported */ + + gboolean gdm_settings_get_value (GdmSettings *settings, + const char *key, + char **value, + GError **error); + gboolean gdm_settings_set_value (GdmSettings *settings, + const char *key, + const char *value, + GError **error); + + G_END_DECLS + + #endif /* __GDM_SETTINGS_H */ +diff --git a/daemon/main.c b/daemon/main.c +index 1b893fe0..344d1b74 100644 +--- a/daemon/main.c ++++ b/daemon/main.c +@@ -240,70 +240,62 @@ gdm_daemon_lookup_user (uid_t *uidp, + if G_UNLIKELY (gid == 0) { + gdm_fail (_("The GDM group should not be root. Aborting!")); + } + + if (uidp != NULL) { + *uidp = uid; + } + + if (gidp != NULL) { + *gidp = gid; + } + + g_free (username); + g_free (groupname); + } + + static gboolean + on_shutdown_signal_cb (gpointer user_data) + { + GMainLoop *mainloop = user_data; + + g_main_loop_quit (mainloop); + + return FALSE; + } + + static gboolean + on_sighup_cb (gpointer user_data) + { + g_debug ("Got HUP signal"); +- /* Reread config stuff like system config files, VPN service +- * files, etc +- */ +- g_object_unref (settings); +- settings = gdm_settings_new (); +- if (settings != NULL) { +- if (! gdm_settings_direct_init (settings, DATADIR "/gdm/gdm.schemas", "/")) { +- g_warning ("Unable to initialize settings"); +- } +- } ++ ++ gdm_settings_reload (settings); + + return TRUE; + } + + static gboolean + is_debug_set (void) + { + gboolean debug; + gdm_settings_direct_get_boolean (GDM_KEY_DEBUG, &debug); + return debug; + } + + /* SIGUSR1 is used by the X server to tell us that we're ready, so + * block it. We'll unblock it in the worker thread in gdm-server.c + */ + static void + block_sigusr1 (void) + { + sigset_t mask; + + sigemptyset (&mask); + sigaddset (&mask, SIGUSR1); + sigprocmask (SIG_BLOCK, &mask, NULL); + } + + int + main (int argc, + char **argv) + { + GMainLoop *main_loop; +-- +2.34.1 + diff --git a/SOURCES/0002-daemon-Don-t-update-session-type-if-no-saved-session.patch b/SOURCES/0002-daemon-Don-t-update-session-type-if-no-saved-session.patch new file mode 100644 index 0000000..c6b5abc --- /dev/null +++ b/SOURCES/0002-daemon-Don-t-update-session-type-if-no-saved-session.patch @@ -0,0 +1,109 @@ +From b09ab8a73d5a4133f72846d529bbbfb7802ca535 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 6 Sep 2021 08:40:46 -0400 +Subject: [PATCH 2/5] daemon: Don't update session type if no saved session + +At the moment we always set the session type when the session name +is read. But users don't always have a session type specified. + +If they don't, then don't set the session type. + +https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/153 +--- + daemon/gdm-session.c | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index 2b941e5e..b54687d5 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -995,73 +995,76 @@ worker_on_reauthenticated (GdmDBusWorker *worker, + static void + worker_on_saved_language_name_read (GdmDBusWorker *worker, + const char *language_name, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + if (strlen (language_name) > 0) { + g_free (self->saved_language); + self->saved_language = g_strdup (language_name); + + if (self->greeter_interface != NULL) { + gdm_dbus_greeter_emit_default_language_name_changed (self->greeter_interface, + language_name); + } + } + } + + static void + worker_on_saved_session_name_read (GdmDBusWorker *worker, + const char *session_name, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + if (! get_session_command_for_name (self, session_name, self->saved_session_type, NULL)) { + /* ignore sessions that don't exist */ + g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name); + g_free (self->saved_session); + self->saved_session = NULL; +- } else if (strcmp (session_name, +- get_default_session_name (self)) != 0) { +- g_free (self->saved_session); +- self->saved_session = g_strdup (session_name); +- +- if (self->greeter_interface != NULL) { +- gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, +- session_name); ++ update_session_type (self); ++ } else { ++ if (strcmp (session_name, ++ get_default_session_name (self)) != 0) { ++ g_free (self->saved_session); ++ self->saved_session = g_strdup (session_name); ++ ++ if (self->greeter_interface != NULL) { ++ gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, ++ session_name); ++ } + } ++ if (self->saved_session_type != NULL) ++ set_session_type (self, self->saved_session_type); + } + +- update_session_type (self); +- + } + + static void + worker_on_saved_session_type_read (GdmDBusWorker *worker, + const char *session_type, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + g_free (self->saved_session_type); + self->saved_session_type = g_strdup (session_type); + } + + static GdmSessionConversation * + find_conversation_by_pid (GdmSession *self, + GPid pid) + { + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, self->conversations); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GdmSessionConversation *conversation; + + conversation = (GdmSessionConversation *) value; + + if (conversation->worker_pid == pid) { + return conversation; + } + } +-- +2.34.1 + diff --git a/SOURCES/0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch b/SOURCES/0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch new file mode 100644 index 0000000..a822f49 --- /dev/null +++ b/SOURCES/0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch @@ -0,0 +1,327 @@ +From cc67c8de39358031fddc5ca7d8c993271d6606a7 Mon Sep 17 00:00:00 2001 +From: Alan Coopersmith +Date: Thu, 7 Oct 2021 18:22:11 -0700 +Subject: [PATCH 2/2] daemon: Support X servers built with -Dlisten_tcp=true + +Xorg since version 1.17 doesn't listen to tcp sockets by default +unless it's explicitly built with -Dlisten_tcp=true. + +GDM currently assumes X servers 1.17 and later are always built +without specifying -Dlisten_tcp=true and doesn't work properly +otherwise. + +This commit enhances GDM to better handle these non-standard builds by +always passing '-nolisten tcp' on the command line when tcp should +be disabled, and likewise always passing '-listen tcp' on the command +line, assuming the X server is new enough to support it, when tcp +should be enabled. + +Related #704 +--- + daemon/gdm-server.c | 21 +++++++++++---------- + daemon/gdm-x-session.c | 12 ++++++------ + meson.build | 4 ++-- + 3 files changed, 19 insertions(+), 18 deletions(-) + +diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c +index 1ba00d45..e5d23521 100644 +--- a/daemon/gdm-server.c ++++ b/daemon/gdm-server.c +@@ -290,72 +290,73 @@ gdm_server_resolve_command_line (GdmServer *server, + if (strcmp (arg, "-query") == 0 || + strcmp (arg, "-indirect") == 0) + query_in_arglist = TRUE; + } + + argv = g_renew (char *, argv, len + 12); + /* shift args down one */ + for (i = len - 1; i >= 1; i--) { + argv[i+1] = argv[i]; + } + + /* server number is the FIRST argument, before any others */ + argv[1] = g_strdup (server->display_name); + len++; + + if (server->auth_file != NULL) { + argv[len++] = g_strdup ("-auth"); + argv[len++] = g_strdup (server->auth_file); + } + + if (server->display_seat_id != NULL) { + argv[len++] = g_strdup ("-seat"); + argv[len++] = g_strdup (server->display_seat_id); + } + + /* If we were compiled with Xserver >= 1.17 we need to specify + * '-listen tcp' as the X server dosen't listen on tcp sockets + * by default anymore. In older versions we need to pass + * -nolisten tcp to disable listening on tcp sockets. + */ +-#ifdef HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY +- if (!server->disable_tcp && ! query_in_arglist) { +- argv[len++] = g_strdup ("-listen"); +- argv[len++] = g_strdup ("tcp"); +- } +-#else +- if (server->disable_tcp && ! query_in_arglist) { +- argv[len++] = g_strdup ("-nolisten"); +- argv[len++] = g_strdup ("tcp"); +- } ++ if (!query_in_arglist) { ++ if (server->disable_tcp) { ++ argv[len++] = g_strdup ("-nolisten"); ++ argv[len++] = g_strdup ("tcp"); ++ } + ++#ifdef HAVE_XSERVER_WITH_LISTEN ++ if (!server->disable_tcp) { ++ argv[len++] = g_strdup ("-listen"); ++ argv[len++] = g_strdup ("tcp"); ++ } + #endif ++ } + + if (vtarg != NULL && ! gotvtarg) { + argv[len++] = g_strdup (vtarg); + } + + argv[len++] = NULL; + + *argvp = argv; + *argcp = len; + + return TRUE; + } + + static void + rotate_logs (const char *path, + guint n_copies) + { + int i; + + for (i = n_copies - 1; i > 0; i--) { + char *name_n; + char *name_n1; + + name_n = g_strdup_printf ("%s.%d", path, i); + if (i > 1) { + name_n1 = g_strdup_printf ("%s.%d", path, i - 1); + } else { + name_n1 = g_strdup (path); + } + +diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c +index 5962da57..0b07ab5b 100644 +--- a/daemon/gdm-x-session.c ++++ b/daemon/gdm-x-session.c +@@ -233,70 +233,70 @@ spawn_x_server (State *state, + + if (g_getenv ("XDG_VTNR") != NULL) { + int vt; + + vt = atoi (g_getenv ("XDG_VTNR")); + + if (vt > 0 && vt < 64) { + vt_string = g_strdup_printf ("vt%d", vt); + } + } + + display_fd_string = g_strdup_printf ("%d", DISPLAY_FILENO); + + g_ptr_array_add (arguments, X_SERVER); + + if (vt_string != NULL) { + g_ptr_array_add (arguments, vt_string); + } + + g_ptr_array_add (arguments, "-displayfd"); + g_ptr_array_add (arguments, display_fd_string); + + g_ptr_array_add (arguments, "-auth"); + g_ptr_array_add (arguments, auth_file); + + /* If we were compiled with Xserver >= 1.17 we need to specify + * '-listen tcp' as the X server doesn't listen on tcp sockets + * by default anymore. In older versions we need to pass + * -nolisten tcp to disable listening on tcp sockets. + */ +-#ifdef HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY +- if (allow_remote_connections) { +- g_ptr_array_add (arguments, "-listen"); +- g_ptr_array_add (arguments, "tcp"); +- } +-#else + if (!allow_remote_connections) { + g_ptr_array_add (arguments, "-nolisten"); + g_ptr_array_add (arguments, "tcp"); + } ++ ++#ifdef HAVE_XSERVER_WITH_LISTEN ++ if (allow_remote_connections) { ++ g_ptr_array_add (arguments, "-listen"); ++ g_ptr_array_add (arguments, "tcp"); ++ } + #endif + + g_ptr_array_add (arguments, "-background"); + g_ptr_array_add (arguments, "none"); + + g_ptr_array_add (arguments, "-noreset"); + g_ptr_array_add (arguments, "-keeptty"); + g_ptr_array_add (arguments, "-novtswitch"); + + g_ptr_array_add (arguments, "-verbose"); + if (state->debug_enabled) { + g_ptr_array_add (arguments, "7"); + } else { + g_ptr_array_add (arguments, "3"); + } + + if (state->debug_enabled) { + g_ptr_array_add (arguments, "-core"); + } + g_ptr_array_add (arguments, NULL); + + subprocess = g_subprocess_launcher_spawnv (launcher, + (const char * const *) arguments->pdata, + &error); + g_free (display_fd_string); + g_clear_object (&launcher); + g_ptr_array_free (arguments, TRUE); + + if (subprocess == NULL) { + g_debug ("could not start X server: %s", error->message); +diff --git a/meson.build b/meson.build +index 52ac1941..02d609dc 100644 +--- a/meson.build ++++ b/meson.build +@@ -44,61 +44,61 @@ glib_min_version = '2.56.0' + glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version) + gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version) + gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version) + gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version) + gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1') + libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4') + accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35') + xcb_dep = dependency('xcb') + keyutils_dep = dependency('libkeyutils', required: false) + libselinux_dep = dependency('libselinux', required: get_option('selinux')) + + # udev + if udev_dir == '' + if udev_dep.found() + udev_prefix = udev_dep.get_pkgconfig_variable('udevdir') + else + udev_prefix = gdm_prefix / 'lib' / 'udev' + endif + udev_dir = udev_prefix / 'rules.d' + endif + + # X11 + x_deps = declare_dependency( + dependencies: [ + dependency('x11'), + dependency('xau'), + ], + ) + # Xserver 1.17 & later default to -nolisten and require -listen for remote access + xserver_deps = dependency('xorg-server', version : '>=1.17', required : false) +-xserver_nolisten_default = xserver_deps.found() ++xserver_has_listen = xserver_deps.found() + find_x_server_script = find_program('build-aux/find-x-server.sh', native: true) + find_x_server_out = run_command(find_x_server_script).stdout().strip() + if find_x_server_out != '' + x_bin = find_x_server_out + x_bin_path_split = x_bin.split('/') + i = 0 + x_path = '/' + foreach dir : x_bin_path_split + if i < x_bin_path_split.length() - 1 + x_path = x_path / dir + endif + i = i + 1 + endforeach + else + # what to do, what to do, this is wrong, but this just sets the + # defaults, perhaps this user is cross compiling or some such + x_path = '/usr/bin/X11:/usr/X11R6/bin:/opt/X11R6/bin' + x_bin = '/usr/bin/X' + endif + xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp')) + if xdmcp_dep.found() and get_option('tcp-wrappers') + libwrap_dep = cc.find_library('wrap') + endif + # systemd + systemd_dep = dependency('systemd') + libsystemd_dep = dependency('libsystemd') + if meson.version().version_compare('>= 0.53') + systemd_multiseat_x = find_program('systemd-multi-seat-x', + required: false, + dirs: [ +@@ -200,61 +200,61 @@ conf.set_quoted('SYSCONFDIR', gdm_prefix / get_option('sysconfdir')) + conf.set_quoted('BINDIR', gdm_prefix / get_option('bindir')) + conf.set_quoted('LIBDIR', gdm_prefix / get_option('libdir')) + conf.set_quoted('LIBEXECDIR', gdm_prefix / get_option('libexecdir')) + conf.set_quoted('LOGDIR', get_option('log-dir')) + conf.set_quoted('DMCONFDIR', dmconfdir) + conf.set_quoted('GDMCONFDIR', gdmconfdir) + conf.set_quoted('GDM_SCREENSHOT_DIR', gdm_screenshot_dir) + conf.set_quoted('GDM_XAUTH_DIR', gdm_xauth_dir) + conf.set_quoted('GDM_RAN_ONCE_MARKER_DIR', ran_once_marker_dir) + conf.set_quoted('GDM_RUN_DIR', gdm_run_dir) + conf.set_quoted('GNOMELOCALEDIR', gdm_prefix / get_option('localedir')) + conf.set_quoted('AT_SPI_REGISTRYD_DIR', at_spi_registryd_dir) + conf.set_quoted('GDM_PID_FILE', gdm_pid_file) + conf.set_quoted('GNOME_SETTINGS_DAEMON_DIR', gnome_settings_daemon_dir) + conf.set_quoted('LANG_CONFIG_FILE', lang_config_file) + conf.set('HAVE_ADT', have_adt) + conf.set('HAVE_UTMP_H', have_utmp_header) + conf.set('HAVE_UTMPX_H', have_utmpx_header) + conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r) + conf.set('UTMP', utmp_struct) + conf.set('HAVE_GETUTXENT', cc.has_function('getutxent')) + conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp')) + conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx')) + conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil')) + conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil')) + conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil')) + conf.set('HAVE_PAM_SYSLOG', have_pam_syslog) + conf.set('HAVE_KEYUTILS', keyutils_dep.found()) + conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported) + conf.set('HAVE_SELINUX', libselinux_dep.found()) +-conf.set('HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY', xserver_nolisten_default) ++conf.set('HAVE_XSERVER_WITH_LISTEN', xserver_has_listen) + conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server')) + conf.set('ENABLE_SYSTEMD_JOURNAL', get_option('systemd-journal')) + conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support')) + conf.set('ENABLE_PROFILING', get_option('profiling')) + conf.set('GDM_INITIAL_VT', get_option('initial-vt')) + conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf) + conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf) + conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf) + conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path')) + conf.set_quoted('GDM_USERNAME', get_option('user')) + conf.set_quoted('GDM_GROUPNAME', get_option('group')) + conf.set('HAVE_LIBXDMCP', xdmcp_dep.found()) + conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server) + conf.set('WITH_PLYMOUTH', plymouth_dep.found()) + conf.set_quoted('X_SERVER', x_bin) + conf.set_quoted('X_PATH', x_path) + conf.set('HAVE_UT_UT_HOST', utmp_has_host_field) + conf.set('HAVE_UT_UT_PID', utmp_has_pid_field) + conf.set('HAVE_UT_UT_ID', utmp_has_id_field) + conf.set('HAVE_UT_UT_NAME', utmp_has_name_field) + conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field) + conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field) + conf.set('HAVE_UT_UT_USER', utmp_has_user_field) + conf.set('HAVE_UT_UT_TIME', utmp_has_time_field) + conf.set('HAVE_UT_UT_TV', utmp_has_tv_field) + conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field) + conf.set('ENABLE_IPV6', get_option('ipv6')) + configure_file(output: 'config.h', configuration: conf) + + # Subdirs +-- +2.34.1 + diff --git a/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch b/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch new file mode 100644 index 0000000..c195db5 --- /dev/null +++ b/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch @@ -0,0 +1,151 @@ +From 618dfea6563d4f0bad0583b38b63746e44969d5e Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 5 Feb 2020 15:20:48 -0500 +Subject: [PATCH 2/3] gdm-x-session: run session bus on non-seat0 seats + +GNOME doesn't deal very well with multiple sessions +running on a multiple seats at the moment. + +Until that's fixed, ensure sessions run on auxillary +seats get their own session bus. +--- + daemon/gdm-session.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index a65fa0f9..f13b54af 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -2864,119 +2864,128 @@ on_start_program_cb (GdmDBusWorker *worker, + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + + self = conversation->session; + service_name = conversation->service_name; + + if (worked) { + self->session_pid = pid; + self->session_conversation = conversation; + + g_debug ("GdmSession: Emitting 'session-started' signal with pid '%d'", pid); + g_signal_emit (self, signals[SESSION_STARTED], 0, service_name, pid); + } else { + gdm_session_stop_conversation (self, service_name); + + g_debug ("GdmSession: Emitting 'session-start-failed' signal"); + g_signal_emit (self, signals[SESSION_START_FAILED], 0, service_name, error->message); + } + } + + void + gdm_session_start_session (GdmSession *self, + const char *service_name) + { + GdmSessionConversation *conversation; + GdmSessionDisplayMode display_mode; + gboolean is_x11 = TRUE; + gboolean run_launcher = FALSE; + gboolean allow_remote_connections = FALSE; ++ gboolean run_separate_bus = FALSE; + char *command; + char *program; + gboolean register_session; + + g_return_if_fail (GDM_IS_SESSION (self)); + g_return_if_fail (self->session_conversation == NULL); + + conversation = find_conversation_by_name (self, service_name); + + if (conversation == NULL) { + g_warning ("GdmSession: Tried to start session of " + "nonexistent conversation %s", service_name); + return; + } + + stop_all_other_conversations (self, conversation, FALSE); + + display_mode = gdm_session_get_display_mode (self); + + #ifdef ENABLE_WAYLAND_SUPPORT + is_x11 = g_strcmp0 (self->session_type, "wayland") != 0; + #endif + + if (display_mode == GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED || + display_mode == GDM_SESSION_DISPLAY_MODE_NEW_VT) { + run_launcher = TRUE; + } + + register_session = !gdm_session_session_registers (self); + ++ if (g_strcmp0 (self->display_seat_id, "seat0") != 0 && !run_launcher) { ++ run_separate_bus = TRUE; ++ } ++ + if (self->selected_program == NULL) { + gboolean run_xsession_script; + + command = get_session_command (self); + + run_xsession_script = !gdm_session_bypasses_xsession (self); + + if (self->display_is_local) { + gboolean disallow_tcp = TRUE; + gdm_settings_direct_get_boolean (GDM_KEY_DISALLOW_TCP, &disallow_tcp); + allow_remote_connections = !disallow_tcp; + } else { + allow_remote_connections = TRUE; + } + + if (run_launcher) { + if (is_x11) { + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s%s %s\"%s\"", + register_session ? "--register-session " : "", + run_xsession_script? "--run-script " : "", + allow_remote_connections? "--allow-remote-connections " : "", + command); + } else { + program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"%s\"", + register_session ? "--register-session " : "", + command); + } + } else if (run_xsession_script) { +- program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command); ++ if (run_separate_bus) { ++ program = g_strdup_printf ("dbus-run-session -- " GDMCONFDIR "/Xsession \"%s\"", command); ++ } else { ++ program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command); ++ } + } else { + program = g_strdup (command); + } + + g_free (command); + } else { + /* FIXME: + * Always use a separate DBus bus for each greeter session. + * Firstly, this means that if we run multiple greeter session + * (which we really should not do, but have to currently), then + * each one will get its own DBus session bus. + * But, we also explicitly do this for seat0, because that way + * it cannot make use of systemd to run the GNOME session. This + * prevents the session lookup logic from getting confused. + * This has a similar effect as passing --builtin to gnome-session. + * + * We really should not be doing this. But the fix is to use + * separate dynamically created users and that requires some + * major refactorings. + */ + if (run_launcher) { + if (is_x11) { + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s\"dbus-run-session -- %s\"", + register_session ? "--register-session " : "", + self->selected_program); + } else { + program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"dbus-run-session -- %s\"", + register_session ? "--register-session " : "", + self->selected_program); + } +-- +2.32.0 + diff --git a/SOURCES/0003-common-Reload-settings-when-graphics-initialize.patch b/SOURCES/0003-common-Reload-settings-when-graphics-initialize.patch new file mode 100644 index 0000000..4113958 --- /dev/null +++ b/SOURCES/0003-common-Reload-settings-when-graphics-initialize.patch @@ -0,0 +1,155 @@ +From a9928bfcc9c6d81d60e047b7838d4107835b8f89 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 15 Feb 2022 14:33:22 -0500 +Subject: [PATCH 3/4] common: Reload settings when graphics initialize + +If GDM starts faster than graphics initialize, then the +udev rules that write out /run/gdm/custom.conf might get +run too late for GDM to notice. + +This commit changes GDM to reread its config after graphicals +initialization completes. + +https://gitlab.gnome.org/GNOME/gdm/-/issues/763 +--- + daemon/gdm-local-display-factory.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 0b1d3482..8bca8ce9 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -1023,64 +1023,66 @@ on_seat_properties_changed (GDBusConnection *connection, + g_autoptr(GVariant) changed_prop = NULL; + g_autofree const gchar **invalidated_props = NULL; + gboolean changed = FALSE; + int ret; + + /* Extract seat id, i.e. the last element of the object path. */ + seat = strrchr (object_path, '/'); + if (seat == NULL) + return; + seat += 1; + + /* Valid seat IDs must start with seat, i.e. ignore "auto" */ + if (!g_str_has_prefix (seat, "seat")) + return; + + g_variant_get (parameters, "(s@a{sv}^a&s)", NULL, &changed_props, &invalidated_props); + + changed_prop = g_variant_lookup_value (changed_props, "CanGraphical", NULL); + if (changed_prop) + changed = TRUE; + if (!changed && g_strv_contains (invalidated_props, "CanGraphical")) + changed = TRUE; + + if (!changed) + return; + + ret = sd_seat_can_graphical (seat); + if (ret < 0) + return; + +- if (ret != 0) ++ if (ret != 0) { ++ gdm_settings_direct_reload (); + ensure_display_for_seat (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat); +- else ++ } else { + delete_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat); ++ } + } + + static gboolean + lookup_by_session_id (const char *id, + GdmDisplay *display, + gpointer user_data) + { + const char *looking_for = user_data; + const char *current; + + current = gdm_display_get_session_id (display); + return g_strcmp0 (current, looking_for) == 0; + } + + static gboolean + lookup_by_tty (const char *id, + GdmDisplay *display, + gpointer user_data) + { + const char *tty_to_find = user_data; + g_autofree char *tty_to_check = NULL; + const char *session_id; + int ret; + + session_id = gdm_display_get_session_id (display); + + if (!session_id) + return FALSE; + + ret = sd_session_get_tty (session_id, &tty_to_check); +@@ -1260,60 +1262,61 @@ on_vt_changed (GIOChannel *source, + } + + g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change"); + + ensure_display_for_seat (factory, "seat0"); + + return G_SOURCE_CONTINUE; + } + #endif + + #ifdef HAVE_UDEV + static void + on_uevent (GUdevClient *client, + const char *action, + GUdevDevice *device, + GdmLocalDisplayFactory *factory) + { + if (!g_udev_device_get_device_file (device)) + return; + + if (g_strcmp0 (action, "add") != 0 && + g_strcmp0 (action, "change") != 0) + return; + + if (!udev_is_settled (factory)) + return; + + g_signal_handler_disconnect (factory->gudev_client, factory->uevent_handler_id); + factory->uevent_handler_id = 0; + ++ gdm_settings_direct_reload (); + ensure_display_for_seat (factory, "seat0"); + } + #endif + + static void + gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory) + { + g_autoptr (GIOChannel) io_channel = NULL; + const char *subsystems[] = { "drm", NULL }; + + factory->seat_new_id = g_dbus_connection_signal_subscribe (factory->connection, + "org.freedesktop.login1", + "org.freedesktop.login1.Manager", + "SeatNew", + "/org/freedesktop/login1", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + on_seat_new, + g_object_ref (factory), + g_object_unref); + factory->seat_removed_id = g_dbus_connection_signal_subscribe (factory->connection, + "org.freedesktop.login1", + "org.freedesktop.login1.Manager", + "SeatRemoved", + "/org/freedesktop/login1", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + on_seat_removed, + g_object_ref (factory), + g_object_unref); +-- +2.34.1 + diff --git a/SOURCES/0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch b/SOURCES/0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch new file mode 100644 index 0000000..f0d568b --- /dev/null +++ b/SOURCES/0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch @@ -0,0 +1,87 @@ +From 7084aea50bdc16ccecb4474ca79403429e79ec0e Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 29 Sep 2021 11:03:41 -0400 +Subject: [PATCH 3/5] daemon: Infer session type from desktop file if user has + no saved session type + +The accountsservice user cache file can specify a session type +associated with the saved session. This is optional though. If one +isn't specified GDM needs to figure out the session type based on the +list of preferred session types for the system and the session file +itself. + +It was failing to do the latter, though. This commit fixes that. +--- + daemon/gdm-session.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index b54687d5..a65fa0f9 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -1009,60 +1009,62 @@ worker_on_saved_language_name_read (GdmDBusWorker *worker, + } + } + } + + static void + worker_on_saved_session_name_read (GdmDBusWorker *worker, + const char *session_name, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + if (! get_session_command_for_name (self, session_name, self->saved_session_type, NULL)) { + /* ignore sessions that don't exist */ + g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name); + g_free (self->saved_session); + self->saved_session = NULL; + update_session_type (self); + } else { + if (strcmp (session_name, + get_default_session_name (self)) != 0) { + g_free (self->saved_session); + self->saved_session = g_strdup (session_name); + + if (self->greeter_interface != NULL) { + gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, + session_name); + } + } + if (self->saved_session_type != NULL) + set_session_type (self, self->saved_session_type); ++ else ++ update_session_type (self); + } + + } + + static void + worker_on_saved_session_type_read (GdmDBusWorker *worker, + const char *session_type, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + g_free (self->saved_session_type); + self->saved_session_type = g_strdup (session_type); + } + + static GdmSessionConversation * + find_conversation_by_pid (GdmSession *self, + GPid pid) + { + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, self->conversations); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GdmSessionConversation *conversation; + + conversation = (GdmSessionConversation *) value; + + if (conversation->worker_pid == pid) { + return conversation; +-- +2.34.1 + diff --git a/SOURCES/0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch b/SOURCES/0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch new file mode 100644 index 0000000..15bc1ce --- /dev/null +++ b/SOURCES/0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch @@ -0,0 +1,105 @@ +From f30e557a8afcdfe5d571a625b4c99606315ed3b4 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 11 Feb 2019 10:32:55 -0500 +Subject: [PATCH 3/3] session: ensure login screen over XDMCP connects to its + session + +Right now GTK preferentially picks the wayland display over an +X11 display if it finds one. + +That causes a problem for XDMCP sessions, since there may be a +wayland display running on the local console for the GDM user. + +This commit addresses the issue by forcing the X11 backend if +the session is X11. +--- + daemon/gdm-session.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index f13b54af..9f68166e 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -2739,60 +2739,79 @@ set_up_session_environment (GdmSession *self) + } + + static void + send_display_mode (GdmSession *self, + GdmSessionConversation *conversation) + { + GdmSessionDisplayMode mode; + + mode = gdm_session_get_display_mode (self); + gdm_dbus_worker_call_set_session_display_mode (conversation->worker_proxy, + gdm_session_display_mode_to_string (mode), + conversation->worker_cancellable, + NULL, NULL); + } + + static void + send_session_type (GdmSession *self, + GdmSessionConversation *conversation) + { + const char *session_type = "x11"; + + if (self->session_type != NULL) { + session_type = self->session_type; + } + + gdm_dbus_worker_call_set_environment_variable (conversation->worker_proxy, + "XDG_SESSION_TYPE", + session_type, + conversation->worker_cancellable, + NULL, NULL); ++ ++ /* If the session type is x11, then set GDK_BACKEND to x11 as well. ++ * This is so gnome-session-check-accelerated from an XDMCP connection doesn't ++ * try to use the wayland display running on the local console for the gdm ++ * user login screen session. ++ * ++ * That's the only case where we let a user log in more than once, so it's ++ * the only situation that matters. ++ * ++ * We can drop this code if we ever switch the login screen to use systemd's ++ * DynamicUser feature. ++ */ ++ if (g_strcmp0 (session_type, "x11") == 0) { ++ gdm_dbus_worker_call_set_environment_variable (conversation->worker_proxy, ++ "GDK_BACKEND", ++ "x11", ++ conversation->worker_cancellable, ++ NULL, NULL); ++ } + } + + void + gdm_session_open_session (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) { + send_display_mode (self, conversation); + send_session_type (self, conversation); + + gdm_dbus_worker_call_open (conversation->worker_proxy, + conversation->worker_cancellable, + (GAsyncReadyCallback) on_opened, conversation); + } + } + + static void + stop_all_other_conversations (GdmSession *self, + GdmSessionConversation *conversation_to_keep, + gboolean now) + { + GHashTableIter iter; + gpointer key, value; + +-- +2.32.0 + diff --git a/SOURCES/0004-daemon-Consolidate-session-type-and-supported-sessio.patch b/SOURCES/0004-daemon-Consolidate-session-type-and-supported-sessio.patch new file mode 100644 index 0000000..9a91510 --- /dev/null +++ b/SOURCES/0004-daemon-Consolidate-session-type-and-supported-sessio.patch @@ -0,0 +1,559 @@ +From d76d6ff0761d47df938f1dab0daeeecac2feb56e Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 6 Sep 2021 08:43:28 -0400 +Subject: [PATCH 4/5] daemon: Consolidate session-type and + supported-session-types list + +There's currently a bug in computing the session-type to use. + +The `i > 0` check means wayland will overwrite x11 in the +transient session type list. + +Morever, the separation between "session-type" and +"supported-session-types" is a little redundant. Since +supported-session-types is a sorted list, the first item should +always be the same as "session-type". + +This commit addresses the bug and the redundant logic, by computing +the supported session types early in the function and indexing into +it to get the session-type. + +A future cleanup could probably get rid of session-type entirely. + +https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/153 +--- + daemon/gdm-local-display-factory.c | 193 +++++++++++++++++------------ + 1 file changed, 116 insertions(+), 77 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 141d64c6..eba38671 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -197,164 +197,226 @@ get_preferred_display_server (GdmLocalDisplayFactory *factory) + } + + if (!wayland_enabled && !xorg_enabled) { + return g_strdup ("none"); + } + + gdm_settings_direct_get_string (GDM_KEY_PREFERRED_DISPLAY_SERVER, &preferred_display_server); + + if (g_strcmp0 (preferred_display_server, "wayland") == 0) { + if (wayland_enabled) + return g_strdup (preferred_display_server); + else + return g_strdup ("xorg"); + } + + if (g_strcmp0 (preferred_display_server, "xorg") == 0) { + if (xorg_enabled) + return g_strdup (preferred_display_server); + else + return g_strdup ("wayland"); + } + + if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) { + if (xorg_enabled) + return g_strdup (preferred_display_server); + } + + return g_strdup ("none"); + } + ++struct GdmDisplayServerConfiguration { ++ const char *display_server; ++ const char *key; ++ const char *binary; ++ const char *session_type; ++} display_server_configuration[] = { ++#ifdef ENABLE_WAYLAND_SUPPORT ++ { "wayland", GDM_KEY_WAYLAND_ENABLE, "/usr/bin/Xwayland", "wayland" }, ++#endif ++ { "xorg", GDM_KEY_XORG_ENABLE, "/usr/bin/Xorg", "x11" }, ++ { NULL, NULL, NULL }, ++}; ++ ++static gboolean ++display_server_enabled (GdmLocalDisplayFactory *factory, ++ const char *display_server) ++{ ++ size_t i; ++ ++ for (i = 0; display_server_configuration[i].display_server != NULL; i++) { ++ const char *key = display_server_configuration[i].key; ++ const char *binary = display_server_configuration[i].binary; ++ gboolean enabled = FALSE; ++ ++ if (!g_str_equal (display_server_configuration[i].display_server, ++ display_server)) ++ continue; ++ ++ if (!gdm_settings_direct_get_boolean (key, &enabled) || !enabled) ++ return FALSE; ++ ++ if (!g_file_test (binary, G_FILE_TEST_IS_EXECUTABLE)) ++ return FALSE; ++ ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ + static const char * +-gdm_local_display_factory_get_session_type (GdmLocalDisplayFactory *factory, +- gboolean should_fall_back) ++get_session_type_for_display_server (GdmLocalDisplayFactory *factory, ++ const char *display_server) ++{ ++ size_t i; ++ ++ for (i = 0; display_server_configuration[i].display_server != NULL; i++) { ++ if (!g_str_equal (display_server_configuration[i].display_server, ++ display_server)) ++ continue; ++ ++ return display_server_configuration[i].session_type; ++ } ++ ++ return NULL; ++} ++ ++static char ** ++gdm_local_display_factory_get_session_types (GdmLocalDisplayFactory *factory, ++ gboolean should_fall_back) + { +- const char *session_types[3] = { NULL }; +- gsize i, session_type_index = 0; + g_autofree gchar *preferred_display_server = NULL; ++ const char *fallback_display_server = NULL; ++ gboolean wayland_preferred = FALSE; ++ gboolean xorg_preferred = FALSE; ++ g_autoptr (GPtrArray) session_types_array = NULL; ++ char **session_types; ++ ++ session_types_array = g_ptr_array_new (); + + preferred_display_server = get_preferred_display_server (factory); + +- if (g_strcmp0 (preferred_display_server, "wayland") != 0 && +- g_strcmp0 (preferred_display_server, "xorg") != 0) +- return NULL; ++ g_debug ("GdmLocalDisplayFactory: Getting session type (prefers %s, falling back: %s)", ++ preferred_display_server, should_fall_back? "yes" : "no"); + +- for (i = 0; i < G_N_ELEMENTS (session_types) - 1; i++) { +-#ifdef ENABLE_WAYLAND_SUPPORT +- if (i > 0 || +- g_strcmp0 (preferred_display_server, "wayland") == 0) { +- gboolean wayland_enabled = FALSE; +- if (gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled)) { +- if (wayland_enabled && g_file_test ("/usr/bin/Xwayland", G_FILE_TEST_IS_EXECUTABLE)) { +- session_types[i] = "wayland"; +- continue; +- } +- } +- } +-#endif ++ wayland_preferred = g_str_equal (preferred_display_server, "wayland"); ++ xorg_preferred = g_str_equal (preferred_display_server, "xorg"); ++ ++ if (wayland_preferred) ++ fallback_display_server = "xorg"; ++ else if (xorg_preferred) ++ fallback_display_server = "wayland"; ++ else ++ return NULL; + +- if (i > 0 || +- g_strcmp0 (preferred_display_server, "xorg") == 0) { +- gboolean xorg_enabled = FALSE; +- if (gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled)) { +- if (xorg_enabled && g_file_test ("/usr/bin/Xorg", G_FILE_TEST_IS_EXECUTABLE)) { +- session_types[i] = "x11"; +- continue; +- } +- } +- } ++ if (!should_fall_back) { ++ if (display_server_enabled (factory, preferred_display_server)) ++ g_ptr_array_add (session_types_array, (gpointer) get_session_type_for_display_server (factory, preferred_display_server)); + } + +- if (should_fall_back) +- session_type_index++; ++ if (display_server_enabled (factory, fallback_display_server)) ++ g_ptr_array_add (session_types_array, (gpointer) get_session_type_for_display_server (factory, fallback_display_server)); + +- return session_types[session_type_index]; ++ if (session_types_array->len == 0) ++ return NULL; ++ ++ g_ptr_array_add (session_types_array, NULL); ++ ++ session_types = g_strdupv ((char **) session_types_array->pdata); ++ ++ return session_types; + } + + static void + on_display_disposed (GdmLocalDisplayFactory *factory, + GdmDisplay *display) + { + g_debug ("GdmLocalDisplayFactory: Display %p disposed", display); + } + + static void + store_display (GdmLocalDisplayFactory *factory, + GdmDisplay *display) + { + GdmDisplayStore *store; + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + gdm_display_store_add (store, display); + } + + /* + Example: + dbus-send --system --dest=org.gnome.DisplayManager \ + --type=method_call --print-reply --reply-timeout=2000 \ + /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; + gboolean is_initial = FALSE; + const char *session_type; + g_autofree gchar *preferred_display_server = NULL; + + g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); + + ret = FALSE; + + g_debug ("GdmLocalDisplayFactory: Creating transient display"); + + preferred_display_server = get_preferred_display_server (factory); + + #ifdef ENABLE_USER_DISPLAY_SERVER + if (g_strcmp0 (preferred_display_server, "wayland") == 0 || + g_strcmp0 (preferred_display_server, "xorg") == 0) { +- session_type = gdm_local_display_factory_get_session_type (factory, FALSE); ++ g_auto(GStrv) session_types = NULL; + +- if (session_type == NULL) { ++ session_types = gdm_local_display_factory_get_session_types (factory, FALSE); ++ ++ if (session_types == NULL) { + g_set_error_literal (error, + GDM_DISPLAY_ERROR, + GDM_DISPLAY_ERROR_GENERAL, + "Both Wayland and Xorg are unavailable"); + return FALSE; + } + + display = gdm_local_display_new (); +- g_object_set (G_OBJECT (display), "session-type", session_type, NULL); ++ g_object_set (G_OBJECT (display), ++ "session-type", session_types[0], ++ "supported-session-types", session_types, ++ NULL); + is_initial = TRUE; + } + #endif + if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) { + if (display == NULL) { + guint32 num; + + num = take_next_display_number (factory); + + display = gdm_legacy_display_new (num); + } + } + + if (display == NULL) { + g_set_error_literal (error, + GDM_DISPLAY_ERROR, + GDM_DISPLAY_ERROR_GENERAL, + "Invalid preferred display server configured"); + return FALSE; + } + + g_object_set (display, + "seat-id", "seat0", + "allow-timed-login", FALSE, + "is-initial", is_initial, + NULL); + + store_display (factory, display); + + if (! gdm_display_manage (display)) { +@@ -549,243 +611,220 @@ lookup_prepared_display_by_seat_id (const char *id, + + if (status != GDM_DISPLAY_PREPARED) + return FALSE; + + return lookup_by_seat_id (id, display, user_data); + } + + static int + on_seat0_graphics_check_timeout (gpointer user_data) + { + GdmLocalDisplayFactory *factory = user_data; + + factory->seat0_graphics_check_timeout_id = 0; + + /* Simply try to re-add seat0. If it is there already (i.e. CanGraphical + * turned TRUE, then we'll find it and it will not be created again). + */ + factory->seat0_graphics_check_timed_out = TRUE; + ensure_display_for_seat (factory, "seat0"); + + return G_SOURCE_REMOVE; + } + + static void + ensure_display_for_seat (GdmLocalDisplayFactory *factory, + const char *seat_id) + { + int ret; + gboolean seat_supports_graphics; + gboolean is_seat0; +- const char *session_type = "wayland"; ++ g_auto (GStrv) session_types = NULL; ++ const char *legacy_session_types[] = { "x11", NULL }; + GdmDisplayStore *store; + GdmDisplay *display = NULL; + g_autofree char *login_session_id = NULL; + gboolean wayland_enabled = FALSE, xorg_enabled = FALSE; + g_autofree gchar *preferred_display_server = NULL; +- gboolean falling_back; ++ gboolean falling_back = FALSE; + + gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled); + gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled); + + preferred_display_server = get_preferred_display_server (factory); + + if (g_strcmp0 (preferred_display_server, "none") == 0) { + g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display"); + return; + } + + ret = sd_seat_can_graphical (seat_id); + + if (ret < 0) { + g_critical ("Failed to query CanGraphical information for seat %s", seat_id); + return; + } + + if (ret == 0) { + g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics"); + seat_supports_graphics = FALSE; + } else { + g_debug ("GdmLocalDisplayFactory: System supports graphics"); + seat_supports_graphics = TRUE; + } + + if (g_strcmp0 (seat_id, "seat0") == 0) { + is_seat0 = TRUE; + + falling_back = factory->num_failures > 0; +- session_type = gdm_local_display_factory_get_session_type (factory, falling_back); ++ session_types = gdm_local_display_factory_get_session_types (factory, falling_back); + + g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", +- session_type, falling_back? " fallback" : ""); ++ session_types[0], falling_back? " fallback" : ""); + } else { + is_seat0 = FALSE; + + g_debug ("GdmLocalDisplayFactory: New displays on seat %s will use X11 fallback", seat_id); + /* Force legacy X11 for all auxiliary seats */ + seat_supports_graphics = TRUE; +- session_type = "x11"; ++ session_types = g_strdupv ((char **) legacy_session_types); + } + + /* For seat0, we have a fallback logic to still try starting it after + * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if + * CanGraphical is unset. + * This is ugly, but it means we'll come up eventually in some + * scenarios where no master device is present. + * Note that we'll force an X11 fallback even though there might be + * cases where an wayland capable device is present and simply not marked as + * master-of-seat. In these cases, this should likely be fixed in the + * udev rules. + * + * At the moment, systemd always sets CanGraphical for non-seat0 seats. + * This is because non-seat0 seats are defined by having master-of-seat + * set. This means we can avoid the fallback check for non-seat0 seats, + * which simplifies the code. + */ + if (is_seat0) { + if (!seat_supports_graphics) { + if (!factory->seat0_graphics_check_timed_out) { + if (factory->seat0_graphics_check_timeout_id == 0) { + g_debug ("GdmLocalDisplayFactory: seat0 doesn't yet support graphics. Waiting %d seconds to try again.", SEAT0_GRAPHICS_CHECK_TIMEOUT); + factory->seat0_graphics_check_timeout_id = g_timeout_add_seconds (SEAT0_GRAPHICS_CHECK_TIMEOUT, + on_seat0_graphics_check_timeout, + factory); + + } else { + /* It is not yet time to force X11 fallback. */ + g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout."); + } + + return; + } + + g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!"); + g_debug ("GdmLocalDisplayFactory: This might indicate an issue where the framebuffer device is not tagged as master-of-seat in udev."); + seat_supports_graphics = TRUE; +- session_type = "x11"; + wayland_enabled = FALSE; ++ g_strfreev (session_types); ++ session_types = g_strdupv ((char **) legacy_session_types); + } else { + g_clear_handle_id (&factory->seat0_graphics_check_timeout_id, g_source_remove); + } + } + + if (!seat_supports_graphics) + return; + +- if (session_type != NULL) ++ if (session_types != NULL) + g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested", +- session_type, seat_id); ++ session_types[0], seat_id); + else if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) + g_debug ("GdmLocalDisplayFactory: Legacy Xorg login display for seat %s requested", + seat_id); + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + if (is_seat0) + display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id); + else + display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id); + + /* Ensure we don't create the same display more than once */ + if (display != NULL) { + g_debug ("GdmLocalDisplayFactory: display already created"); + return; + } + + /* If we already have a login window, switch to it */ + if (gdm_get_login_window_session_id (seat_id, &login_session_id)) { + GdmDisplay *display; + + display = gdm_display_store_find (store, + lookup_by_session_id, + (gpointer) login_session_id); + if (display != NULL && + (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED || + gdm_display_get_status (display) == GDM_DISPLAY_WAITING_TO_FINISH)) { + g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL); + g_debug ("GdmLocalDisplayFactory: session %s found, activating.", + login_session_id); + gdm_activate_session_by_id (factory->connection, seat_id, login_session_id); + return; + } + } + + g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id); + + #ifdef ENABLE_USER_DISPLAY_SERVER + if (g_strcmp0 (preferred_display_server, "wayland") == 0 || + g_strcmp0 (preferred_display_server, "xorg") == 0) { + if (is_seat0) { +- g_autoptr (GPtrArray) supported_session_types = NULL; +- +- if (session_type == NULL) { +- g_warning ("GdmLocalDisplayFactory: Both Wayland and Xorg sessions are unavailable"); +- return; +- } +- +- supported_session_types = g_ptr_array_new (); +- +- if (g_strcmp0 (preferred_display_server, "wayland") == 0) { +- if (wayland_enabled) +- g_ptr_array_add (supported_session_types, "wayland"); +- } else { +- if (xorg_enabled) +- g_ptr_array_add (supported_session_types, "x11"); +- } +- +- if (!falling_back) { +- if (g_strcmp0 (preferred_display_server, "wayland") == 0) { +- if (xorg_enabled) +- g_ptr_array_add (supported_session_types, "x11"); +- } else { +- if (wayland_enabled) +- g_ptr_array_add (supported_session_types, "wayland"); +- } +- } +- +- g_ptr_array_add (supported_session_types, NULL); +- + display = gdm_local_display_new (); +- g_object_set (G_OBJECT (display), "session-type", session_type, NULL); +- g_object_set (G_OBJECT (display), "supported-session-types", supported_session_types->pdata, NULL); ++ g_object_set (G_OBJECT (display), ++ "session-type", session_types[0], ++ "supported-session-types", session_types, ++ NULL); + } + } + #endif + + if (display == NULL) { + guint32 num; +- const char *supported_session_types[] = { "x11", NULL }; + + num = take_next_display_number (factory); + + display = gdm_legacy_display_new (num); +- g_object_set (G_OBJECT (display), "supported-session-types", supported_session_types, NULL); ++ g_object_set (G_OBJECT (display), ++ "session-type", legacy_session_types[0], ++ "supported-session-types", legacy_session_types, ++ NULL); + } + + g_object_set (display, "seat-id", seat_id, NULL); + g_object_set (display, "is-initial", is_seat0, NULL); + + store_display (factory, display); + + /* let store own the ref */ + g_object_unref (display); + + if (! gdm_display_manage (display)) { + gdm_display_unmanage (display); + } + + return; + } + + static void + delete_display (GdmLocalDisplayFactory *factory, + const char *seat_id) { + + GdmDisplayStore *store; + + g_debug ("GdmLocalDisplayFactory: Removing used_display_numbers on seat %s", seat_id); + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + gdm_display_store_foreach_remove (store, lookup_by_seat_id, (gpointer) seat_id); + } + + static gboolean +-- +2.34.1 + diff --git a/SOURCES/0004-data-Use-latest-upstream-udev-rules.patch b/SOURCES/0004-data-Use-latest-upstream-udev-rules.patch new file mode 100644 index 0000000..bf526be --- /dev/null +++ b/SOURCES/0004-data-Use-latest-upstream-udev-rules.patch @@ -0,0 +1,163 @@ +From 0131864b339dc0cc5f23def75e6caa5872c9ed11 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 7 Mar 2022 10:16:39 -0500 +Subject: [PATCH 4/4] data: Use latest upstream udev rules + +This pulls in the latest udev rule from upstream that gives us +wayland on nvidia when we can, and disables wayland on nvidia +when we should. + +It also pulls in the latest handling for passthrough gpus. +--- + data/61-gdm.rules.in | 139 +++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 135 insertions(+), 4 deletions(-) + +diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in +index b1da191f..5dae00ea 100644 +--- a/data/61-gdm.rules.in ++++ b/data/61-gdm.rules.in +@@ -1,6 +1,137 @@ ++# identify virtio graphics cards to find passthrough setups ++SUBSYSTEM!="virtio", GOTO="gdm_virtio_device_end" ++ACTION!="add", GOTO="gdm_virtio_device_end" ++ATTR{vendor}=="0x1af4", ATTR{device}=="0x0010", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_virtio_device_end" ++LABEL="gdm_virtio_device_end" ++ ++SUBSYSTEM!="pci", GOTO="gdm_pci_device_end" ++ACTION!="bind", ACTION!="add", GOTO="gdm_pci_device_end" ++ ++# identify virtio graphics cards to find passthrough setups ++# cirrus ++ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end" ++# vga ++ATTR{vendor}=="0x1b36", ATTR{device}=="0x0100", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end" ++# qxl ++ATTR{vendor}=="0x1234", ATTR{device}=="0x1111", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end" ++ + # disable Wayland on Hi1710 chipsets +-ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" +-# disable Wayland when using the proprietary nvidia driver +-DRIVER=="nvidia", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" ++ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", GOTO="gdm_disable_wayland" ++ ++# disable Wayland on Matrox chipsets ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0522", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0524", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0530", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0532", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0533", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0534", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0536", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0538", GOTO="gdm_disable_wayland" ++ ++# disable Wayland on aspeed chipsets ++ATTR{vendor}=="0x1a03", ATTR{device}=="0x2010", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x1a03", ATTR{device}=="0x2000", GOTO="gdm_disable_wayland" ++ ++LABEL="gdm_pci_device_end" ++ + # disable Wayland if modesetting is disabled +-IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" ++KERNEL!="card[0-9]*", GOTO="gdm_nomodeset_end" ++SUBSYSTEM!="drm", GOTO="gdm_nomodeset_end" ++IMPORT{parent}="GDM_MACHINE_HAS_VIRTUAL_GPU" ++ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}!="1", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hardware-gpu" ++# but keep it enabled for simple framebuffer drivers ++DRIVERS=="simple-framebuffer", GOTO="gdm_nomodeset_end" ++IMPORT{cmdline}="nomodeset", GOTO="gdm_disable_wayland" ++LABEL="gdm_nomodeset_end" ++ ++# The vendor nvidia driver has multiple modules that need to be loaded before GDM can make an ++# informed choice on which way to proceed, so force GDM to wait until NVidia's modules are ++# loaded before starting up. ++KERNEL!="nvidia", GOTO="gdm_nvidia_end" ++SUBSYSTEM!="module", GOTO="gdm_nvidia_end" ++ACTION!="add", GOTO="gdm_nvidia_end" ++RUN+="/usr/bin/touch /run/udev/gdm-machine-has-vendor-nvidia-driver" ++ ++# Check if suspend/resume services necessary for working wayland support is available ++TEST{0711}!="/usr/bin/nvidia-sleep.sh", GOTO="gdm_disable_wayland" ++TEST{0711}!="/usr/lib/systemd/system-sleep/nvidia", GOTO="gdm_disable_wayland" ++IMPORT{program}="/bin/sh -c \"sed -e 's/: /=/g' -e 's/\([^[:upper:]]\)\([[:upper:]]\)/\1_\2/g' -e 's/[[:lower:]]/\U&/g' -e 's/^/NVIDIA_/' /proc/driver/nvidia/params\"" ++ENV{NVIDIA_PRESERVE_VIDEO_MEMORY_ALLOCATIONS}!="1", GOTO="gdm_disable_wayland" ++IMPORT{program}="/bin/sh -c 'echo NVIDIA_HIBERNATE=`systemctl is-enabled nvidia-hibernate`'" ++ENV{NVIDIA_HIBERNATE}!="enabled", GOTO="gdm_disable_wayland" ++IMPORT{program}="/bin/sh -c 'echo NVIDIA_RESUME=`systemctl is-enabled nvidia-resume`'" ++ENV{NVIDIA_RESUME}!="enabled", GOTO="gdm_disable_wayland" ++IMPORT{program}="/bin/sh -c 'echo NVIDIA_SUSPEND=`systemctl is-enabled nvidia-suspend`'" ++ENV{NVIDIA_SUSPEND}!="enabled", GOTO="gdm_disable_wayland" ++LABEL="gdm_nvidia_end" ++ ++# If this machine has an internal panel, take note, since it's probably a laptop ++# FIXME: It could be "ghost connectors" make this pop positive for some workstations ++# in the wild. If so, we may have to fallback to looking at the chassis type from ++# dmi data or acpi ++KERNEL!="card[0-9]-eDP-*", GOTO="gdm_laptop_check_end" ++SUBSYSTEM!="drm", GOTO="gdm_laptop_check_end" ++ACTION!="add", GOTO="gdm_laptop_check_end" ++RUN+="/usr/bin/touch /run/udev/gdm-machine-is-laptop" ++GOTO="gdm_hybrid_nvidia_laptop_check" ++LABEL="gdm_laptop_check_end" ++ ++# If this is a hybrid graphics setup, take note ++KERNEL!="card[1-9]*", GOTO="gdm_hybrid_graphics_check_end" ++KERNEL=="card[1-9]-*", GOTO="gdm_hybrid_graphics_check_end" ++SUBSYSTEM!="drm", GOTO="gdm_hybrid_graphics_check_end" ++ACTION!="add", GOTO="gdm_hybrid_graphics_check_end" ++RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hybrid-graphics" ++LABEL="gdm_hybrid_graphics_check_end" ++ ++# If this is a hybrid graphics laptop with vendor nvidia driver, disable wayland ++LABEL="gdm_hybrid_nvidia_laptop_check" ++TEST!="/run/udev/gdm-machine-is-laptop", GOTO="gdm_hybrid_nvidia_laptop_check_end" ++TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_hybrid_nvidia_laptop_check_end" ++TEST!="/run/udev/gdm-machine-has-vendor-nvidia-driver", GOTO="gdm_hybrid_nvidia_laptop_check_end" ++GOTO="gdm_disable_wayland" ++LABEL="gdm_hybrid_nvidia_laptop_check_end" ++ ++# Disable wayland in situation where we're in a guest with a virtual gpu and host passthrough gpu ++LABEL="gdm_virt_passthrough_check" ++TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_virt_passthrough_check_end" ++TEST!="/run/udev/gdm-machine-has-virtual-gpu", GOTO="gdm_virt_passthrough_check_end" ++TEST!="/run/udev/gdm-machine-has-hardware-gpu", GOTO="gdm_virt_passthrough_check_end" ++GOTO="gdm_disable_wayland" ++LABEL="gdm_virt_passthrough_check_end" ++ ++# Disable wayland when there are multiple virtual gpus ++LABEL="gdm_virt_multi_gpu_check" ++TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_virt_multi_gpu_check_end" ++TEST!="/run/udev/gdm-machine-has-virtual-gpu", GOTO="gdm_virt_multi_gpu_check_end" ++TEST=="/run/udev/gdm-machine-has-hardware-gpu", GOTO="gdm_virt_multi_gpu_check_end" ++LABEL="gdm_virt_multi_gpu_check_end" ++ ++# Disable wayland when nvidia modeset is disabled or when drivers are a lower ++# version than 470, ++# For versions above 470 but lower than 510 prefer Xorg, ++# Above 510, prefer Wayland. ++KERNEL!="nvidia_drm", GOTO="gdm_nvidia_drm_end" ++SUBSYSTEM!="module", GOTO="gdm_nvidia_drm_end" ++ACTION!="add", GOTO="gdm_nvidia_drm_end" ++# disable wayland if nvidia-drm modeset is not enabled ++ATTR{parameters/modeset}!="Y", GOTO="gdm_disable_wayland" ++# disable wayland for nvidia drivers versions lower than 470 ++ATTR{version}=="4[0-6][0-9].*|[0-3][0-9][0-9].*|[0-9][0-9].*|[0-9].*", GOTO="gdm_disable_wayland" ++# For nvidia drivers versions Above 510, keep Wayland by default ++ATTR{version}=="[5-9][1-9][0-9].*", GOTO="gdm_end" ++# For nvidia drivers versions 470-495, prefer Xorg by default ++GOTO="gdm_prefer_xorg" ++LABEL="gdm_nvidia_drm_end" ++ ++GOTO="gdm_end" ++ ++LABEL="gdm_prefer_xorg" ++RUN+="@libexecdir@/gdm-runtime-config set daemon PreferredDisplayServer xorg" ++GOTO="gdm_end" ++ ++LABEL="gdm_disable_wayland" ++RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" ++GOTO="gdm_end" ++ ++LABEL="gdm_end" +-- +2.34.1 + diff --git a/SOURCES/0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch b/SOURCES/0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch new file mode 100644 index 0000000..800ed00 --- /dev/null +++ b/SOURCES/0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch @@ -0,0 +1,96 @@ +From 0e467e3fb32d9e2a7499069699527638eb2c2be1 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 7 Oct 2021 15:34:27 -0400 +Subject: [PATCH 5/5] local-display-factory: Don't crash if Xorg and Wayland + are both unavailable + +At the moment if Wayland doesn't work, the login screen will fall back +to Xorg, and if Xorg doesn't work the login screen will fall back to +Wayland. + +But if the fall back choice is disabled explicitly, GDM will just crash. + +This commit fixes the crash. + +Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/739 +--- + daemon/gdm-local-display-factory.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index eba38671..120847f9 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -651,62 +651,67 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, + gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled); + + preferred_display_server = get_preferred_display_server (factory); + + if (g_strcmp0 (preferred_display_server, "none") == 0) { + g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display"); + return; + } + + ret = sd_seat_can_graphical (seat_id); + + if (ret < 0) { + g_critical ("Failed to query CanGraphical information for seat %s", seat_id); + return; + } + + if (ret == 0) { + g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics"); + seat_supports_graphics = FALSE; + } else { + g_debug ("GdmLocalDisplayFactory: System supports graphics"); + seat_supports_graphics = TRUE; + } + + if (g_strcmp0 (seat_id, "seat0") == 0) { + is_seat0 = TRUE; + + falling_back = factory->num_failures > 0; + session_types = gdm_local_display_factory_get_session_types (factory, falling_back); + +- g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", +- session_types[0], falling_back? " fallback" : ""); ++ if (session_types == NULL) { ++ g_debug ("GdmLocalDisplayFactory: Both Wayland and Xorg are unavailable"); ++ seat_supports_graphics = FALSE; ++ } else { ++ g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", ++ session_types[0], falling_back? " fallback" : ""); ++ } + } else { + is_seat0 = FALSE; + + g_debug ("GdmLocalDisplayFactory: New displays on seat %s will use X11 fallback", seat_id); + /* Force legacy X11 for all auxiliary seats */ + seat_supports_graphics = TRUE; + session_types = g_strdupv ((char **) legacy_session_types); + } + + /* For seat0, we have a fallback logic to still try starting it after + * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if + * CanGraphical is unset. + * This is ugly, but it means we'll come up eventually in some + * scenarios where no master device is present. + * Note that we'll force an X11 fallback even though there might be + * cases where an wayland capable device is present and simply not marked as + * master-of-seat. In these cases, this should likely be fixed in the + * udev rules. + * + * At the moment, systemd always sets CanGraphical for non-seat0 seats. + * This is because non-seat0 seats are defined by having master-of-seat + * set. This means we can avoid the fallback check for non-seat0 seats, + * which simplifies the code. + */ + if (is_seat0) { + if (!seat_supports_graphics) { + if (!factory->seat0_graphics_check_timed_out) { + if (factory->seat0_graphics_check_timeout_id == 0) { + g_debug ("GdmLocalDisplayFactory: seat0 doesn't yet support graphics. Waiting %d seconds to try again.", SEAT0_GRAPHICS_CHECK_TIMEOUT); + factory->seat0_graphics_check_timeout_id = g_timeout_add_seconds (SEAT0_GRAPHICS_CHECK_TIMEOUT, +-- +2.34.1 + diff --git a/SOURCES/default.pa-for-gdm b/SOURCES/default.pa-for-gdm new file mode 100644 index 0000000..145bd31 --- /dev/null +++ b/SOURCES/default.pa-for-gdm @@ -0,0 +1,9 @@ +load-module module-device-restore +load-module module-card-restore +load-module module-udev-detect +load-module module-native-protocol-unix +load-module module-default-device-restore +load-module module-always-sink +load-module module-intended-roles +load-module module-suspend-on-idle +load-module module-position-event-sounds diff --git a/SOURCES/org.gnome.login-screen.gschema.override b/SOURCES/org.gnome.login-screen.gschema.override new file mode 100644 index 0000000..d018c5e --- /dev/null +++ b/SOURCES/org.gnome.login-screen.gschema.override @@ -0,0 +1,3 @@ +[org.gnome.login-screen] +logo='/usr/share/pixmaps/fedora-gdm-logo.png' +enable-smartcard-authentication=false diff --git a/SPECS/gdm.spec b/SPECS/gdm.spec new file mode 100644 index 0000000..a0435d3 --- /dev/null +++ b/SPECS/gdm.spec @@ -0,0 +1,3294 @@ +%global _hardened_build 1 + +%define libauditver 1.0.6 +%define gtk3_version 2.99.2 +%define pam_version 0.99.8.1-11 +%define desktop_file_utils_version 0.2.90 +%define nss_version 3.11.1 + +%global tarball_version %%(echo %{version} | tr '~' '.') + +Name: gdm +Epoch: 1 +Version: 40.1 +Release: 13%{?dist}.4 +Summary: The GNOME Display Manager + +License: GPLv2+ +URL: https://wiki.gnome.org/Projects/GDM +Source0: http://download.gnome.org/sources/gdm/40/gdm-%{tarball_version}.tar.xz +Source1: org.gnome.login-screen.gschema.override + +# moved here from pulseaudio-gdm-hooks-11.1-16 +Source5: default.pa-for-gdm + +# Upstream backports +Patch10001: 0001-local-display-factory-Provide-more-flexibility-for-c.patch + +Patch20001: 0001-xdmcp-display-factory-Set-supported-session-types-fo.patch +Patch20002: 0002-daemon-Don-t-update-session-type-if-no-saved-session.patch +Patch20003: 0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch +Patch20004: 0004-daemon-Consolidate-session-type-and-supported-sessio.patch +Patch20005: 0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch + +Patch30001: 0001-local-display-factory-Don-t-try-to-respawn-displays-.patch + +Patch40001: 0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch + +Patch50001: 0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch +Patch50002: 0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch + +Patch60001: 0001-session-settings-Fetch-session-from-user-even-if-use.patch + +# Latest udev rules and support code +Patch70001: 0001-local-display-factory-Stall-startup-until-main-graph.patch +Patch70002: 0002-common-Add-API-to-reload-settings-from-disk.patch +Patch70003: 0003-common-Reload-settings-when-graphics-initialize.patch +Patch70004: 0004-data-Use-latest-upstream-udev-rules.patch + +# Non-upstreamable workarounds +Patch66610001: 0001-data-reap-gdm-sessions-on-shutdown.patch + +# Questionable feature to support logging in over multiple XDMCP consoles at the same time +Patch66620001: 0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch +Patch66620002: 0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch +Patch66620003: 0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch + +# Non-upstreamable integration patches +Patch99910001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch + +Patch99930001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch + +Patch99950001: 0001-data-Disable-network-configuration-on-login-screen.patch + + +BuildRequires: accountsservice-devel +BuildRequires: audit-libs-devel >= %{libauditver} +BuildRequires: dconf +BuildRequires: desktop-file-utils >= %{desktop_file_utils_version} +BuildRequires: gettext-devel +BuildRequires: git +BuildRequires: keyutils-libs-devel +BuildRequires: libXdmcp-devel +BuildRequires: libattr-devel +BuildRequires: libdmx-devel +BuildRequires: meson +BuildRequires: nss-devel >= %{nss_version} +BuildRequires: pam-devel >= 0:%{pam_version} +BuildRequires: pkgconfig(accountsservice) >= 0.6.3 +BuildRequires: pkgconfig(check) +BuildRequires: pkgconfig(gobject-introspection-1.0) +BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version} +BuildRequires: pkgconfig(gudev-1.0) +BuildRequires: pkgconfig(iso-codes) +BuildRequires: pkgconfig(libcanberra-gtk3) +BuildRequires: pkgconfig(libselinux) +BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(ply-boot-client) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xau) +BuildRequires: pkgconfig(xorg-server) +BuildRequires: plymouth-devel +BuildRequires: systemd +BuildRequires: systemd-devel +BuildRequires: which +BuildRequires: xorg-x11-server-Xorg +BuildRequires: xorg-x11-server-devel +BuildRequires: yelp-devel +BuildRequires: yelp-tools + +Requires(pre): /usr/sbin/useradd +%{?systemd_requires} + +Provides: service(graphical-login) = %{name} + +Requires: accountsservice +Requires: audit-libs >= %{libauditver} +Requires: dconf +# since we use it, and pam spams the log if the module is missing +Requires: gnome-keyring-pam +Requires: gnome-session +Requires: gnome-session-wayland-session +Requires: gnome-settings-daemon >= 3.27.90 +Requires: gnome-shell +Requires: iso-codes +# We need 1.0.4-5 since it lets us use "localhost" in auth cookies +Requires: libXau >= 1.0.4-4 +Requires: pam >= 0:%{pam_version} +Requires: /sbin/nologin +Requires: setxkbmap +Requires: systemd >= 186 +Requires: system-logos +Requires: xhost xmodmap xrdb +Requires: xorg-x11-xinit + +# Until the greeter gets dynamic user support, it can't +# use a user bus +Requires: /usr/bin/dbus-run-session + +Requires(posttrans): dconf + +Provides: gdm-libs%{?_isa} = %{epoch}:%{version}-%{release} + +%description +GDM, the GNOME Display Manager, handles authentication-related backend +functionality for logging in a user and unlocking the user's session after +it's been locked. GDM also provides functionality for initiating user-switching, +so more than one user can be logged in at the same time. It handles +graphical session registration with the system for both local and remote +sessions (in the latter case, via the XDMCP protocol). In cases where the +session doesn't provide it's own display server, GDM can start the display +server on behalf of the session. + +%package devel +Summary: Development files for gdm +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 +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 -n gdm-%{tarball_version} + +%build +%meson -Dpam-prefix=%{_sysconfdir} \ + -Drun-dir=/run/gdm \ + -Dudev-dir=%{_udevrulesdir} \ + -Ddefault-path=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \ + -Dprofiling=true \ + -Dplymouth=enabled \ + -Dselinux=enabled +%meson_build + + +%install +mkdir -p %{buildroot}%{_sysconfdir}/gdm/Init +mkdir -p %{buildroot}%{_sysconfdir}/gdm/PreSession +mkdir -p %{buildroot}%{_sysconfdir}/gdm/PostSession + +%meson_install + +install -p -m644 -D %{SOURCE5} %{buildroot}%{_localstatedir}/lib/gdm/.config/pulse/default.pa + +rm -f %{buildroot}%{_sysconfdir}/pam.d/gdm + +# add logo to shell greeter +cp -a %{SOURCE1} %{buildroot}%{_datadir}/glib-2.0/schemas + +# docs go elsewhere +rm -rf %{buildroot}/%{_prefix}/doc + +# create log dir +mkdir -p %{buildroot}/var/log/gdm + +(cd %{buildroot}%{_sysconfdir}/gdm; ln -sf ../X11/xinit/Xsession .) + +mkdir -p %{buildroot}%{_datadir}/gdm/autostart/LoginWindow + +mkdir -p %{buildroot}/run/gdm + +mkdir -p %{buildroot}%{_sysconfdir}/dconf/db/gdm.d/locks + +%find_lang gdm --with-gnome + +%pre +/usr/sbin/useradd -M -u 42 -d /var/lib/gdm -s /sbin/nologin -r gdm > /dev/null 2>&1 +/usr/sbin/usermod -d /var/lib/gdm -s /sbin/nologin gdm >/dev/null 2>&1 +# ignore errors, as we can't disambiguate between gdm already existed +# and couldn't create account with the current adduser. +exit 0 + +%post +# if the user already has a config file, then migrate it to the new +# location; rpm will ensure that old file will be renamed + +custom=/etc/gdm/custom.conf + +if [ $1 -ge 2 ] ; then + if [ -f /usr/share/gdm/config/gdm.conf-custom ]; then + oldconffile=/usr/share/gdm/config/gdm.conf-custom + elif [ -f /etc/X11/gdm/gdm.conf ]; then + oldconffile=/etc/X11/gdm/gdm.conf + fi + + # Comment out some entries from the custom config file that may + # have changed locations in the update. Also move various + # elements to their new locations. + + [ -n "$oldconffile" ] && sed \ + -e 's@^command=/usr/X11R6/bin/X@#command=/usr/bin/Xorg@' \ + -e 's@^Xnest=/usr/X11R6/bin/Xnest@#Xnest=/usr/X11R6/bin/Xnest@' \ + -e 's@^BaseXsession=/etc/X11/xdm/Xsession@#BaseXsession=/etc/X11/xinit/Xsession@' \ + -e 's@^BaseXsession=/etc/X11/gdm/Xsession@#&@' \ + -e 's@^BaseXsession=/etc/gdm/Xsession@#&@' \ + -e 's@^Greeter=/usr/bin/gdmgreeter@#Greeter=/usr/libexec/gdmgreeter@' \ + -e 's@^RemoteGreeter=/usr/bin/gdmlogin@#RemoteGreeter=/usr/libexec/gdmlogin@' \ + -e 's@^GraphicalTheme=Bluecurve@#&@' \ + -e 's@^BackgroundColor=#20305a@#&@' \ + -e 's@^DefaultPath=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin@#&@' \ + -e 's@^RootPath=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin@#&@' \ + -e 's@^HostImageDir=/usr/share/hosts/@#HostImageDir=/usr/share/pixmaps/faces/@' \ + -e 's@^LogDir=/var/log/gdm@#&@' \ + -e 's@^PostLoginScriptDir=/etc/X11/gdm/PostLogin@#&@' \ + -e 's@^PreLoginScriptDir=/etc/X11/gdm/PreLogin@#&@' \ + -e 's@^PreSessionScriptDir=/etc/X11/gdm/PreSession@#&@' \ + -e 's@^PostSessionScriptDir=/etc/X11/gdm/PostSession@#&@' \ + -e 's@^DisplayInitDir=/var/run/gdm.pid@#&@' \ + -e 's@^RebootCommand=/sbin/reboot;/sbin/shutdown -r now;/usr/sbin/shutdown -r now;/usr/bin/reboot@#&@' \ + -e 's@^HaltCommand=/sbin/poweroff;/sbin/shutdown -h now;/usr/sbin/shutdown -h now;/usr/bin/poweroff@#&@' \ + -e 's@^ServAuthDir=/var/gdm@#&@' \ + -e 's@^Greeter=/usr/bin/gdmlogin@Greeter=/usr/libexec/gdmlogin@' \ + -e 's@^RemoteGreeter=/usr/bin/gdmgreeter@RemoteGreeter=/usr/libexec/gdmgreeter@' \ + $oldconffile > $custom +fi + +if [ $1 -ge 2 -a -f $custom ] && grep -q /etc/X11/gdm $custom ; then + sed -i -e 's@/etc/X11/gdm@/etc/gdm@g' $custom +fi + +%systemd_post gdm.service + +%preun +%systemd_preun gdm.service + +%postun +%systemd_postun gdm.service + +%posttrans +dconf update || : + +%files -f gdm.lang +%doc AUTHORS NEWS README.md +%license COPYING +%dir %{_sysconfdir}/gdm +%config(noreplace) %{_sysconfdir}/gdm/custom.conf +%config %{_sysconfdir}/gdm/Init/* +%config %{_sysconfdir}/gdm/PostLogin/* +%config %{_sysconfdir}/gdm/PreSession/* +%config %{_sysconfdir}/gdm/PostSession/* +%config %{_sysconfdir}/pam.d/gdm-autologin +%config %{_sysconfdir}/pam.d/gdm-password +# not config files +%{_sysconfdir}/gdm/Xsession +%{_datadir}/gdm/gdm.schemas +%{_sysconfdir}/dbus-1/system.d/gdm.conf +%dir %{_sysconfdir}/gdm/Init +%dir %{_sysconfdir}/gdm/PreSession +%dir %{_sysconfdir}/gdm/PostSession +%dir %{_sysconfdir}/gdm/PostLogin +%dir %{_sysconfdir}/dconf/db/gdm.d +%dir %{_sysconfdir}/dconf/db/gdm.d/locks +%{_datadir}/glib-2.0/schemas/org.gnome.login-screen.gschema.xml +%{_datadir}/glib-2.0/schemas/org.gnome.login-screen.gschema.override +%{_libexecdir}/gdm-host-chooser +%{_libexecdir}/gdm-runtime-config +%{_libexecdir}/gdm-session-worker +%{_libexecdir}/gdm-simple-chooser +%{_libexecdir}/gdm-wayland-session +%{_libexecdir}/gdm-x-session +%{_sbindir}/gdm +%{_bindir}/gdmflexiserver +%{_bindir}/gdm-screenshot +%dir %{_datadir}/dconf +%dir %{_datadir}/dconf/profile +%{_datadir}/dconf/profile/gdm +%dir %{_datadir}/gdm/greeter +%dir %{_datadir}/gdm/greeter/applications +%{_datadir}/gdm/greeter/applications/* +%dir %{_datadir}/gdm/greeter/autostart +%{_datadir}/gdm/greeter/autostart/* +%{_datadir}/gdm/greeter-dconf-defaults +%{_datadir}/gdm/locale.alias +%{_datadir}/gdm/gdb-cmd +%{_datadir}/gnome-session/sessions/gnome-login.session +%{_datadir}/polkit-1/rules.d/org.gnome.gdm.rules +%{_libdir}/girepository-1.0/Gdm-1.0.typelib +%{_libdir}/security/pam_gdm.so +%{_libdir}/libgdm*.so* +%attr(0711, root, gdm) %dir %{_localstatedir}/log/gdm +%attr(1770, gdm, gdm) %dir %{_localstatedir}/lib/gdm +%attr(0700, gdm, gdm) %dir %{_localstatedir}/lib/gdm/.config +%attr(0700, gdm, gdm) %dir %{_localstatedir}/lib/gdm/.config/pulse +%attr(0600, gdm, gdm) %{_localstatedir}/lib/gdm/.config/pulse/default.pa +%attr(0711, root, gdm) %dir /run/gdm +%config %{_sysconfdir}/pam.d/gdm-pin +%config %{_sysconfdir}/pam.d/gdm-smartcard +%config %{_sysconfdir}/pam.d/gdm-fingerprint +%{_sysconfdir}/pam.d/gdm-launch-environment +%{_udevrulesdir}/61-gdm.rules +%{_unitdir}/gdm.service +%dir %{_userunitdir}/gnome-session@gnome-login.target.d/ +%{_userunitdir}/gnome-session@gnome-login.target.d/session.conf + +%files devel +%dir %{_includedir}/gdm +%{_includedir}/gdm/*.h +%exclude %{_includedir}/gdm/gdm-pam-extensions.h +%dir %{_datadir}/gir-1.0 +%{_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 +* Fri Apr 08 2022 Ray Strode - 40.1-13.4 +- Fix typo that prevents the correct session type from being + used when user switching. + Resolves: #2073372 + +* Thu Apr 07 2022 Ray Strode - 40.1-13.3 +- Properly force Xorg on matrix cards + Related: #2072986 + +* Thu Mar 24 2022 Ray Strode - 40.1-13.2 +- Fix erroneous jump back to login screen on udev events after login + Resolves: #2065901 + +* Wed Mar 09 2022 Ray Strode - 40.1-13.1 +- Fix accountsservice user templates + Resolves: #2057483 + +* Mon Mar 07 2022 Ray Strode - 40.1-13 +- Pull in latest udev rules and race fixes for handling + udev rules. + Related: #2017938 + +* Tue Feb 22 2022 Ray Strode - 40.1-12 +- More fixes from RHEL 8: + - Fix DisallowTCP=false + - Fix crash when both wayland and xorg are unavailable + Related: #2056931 + +* Wed Oct 27 2021 Ray Strode - 40.1-11 +- Pull in RHEL 8 patches and drop unused patches + Related: #2017859 + +* Mon Oct 25 2021 Ray Strode - 40.1-10 +- Remove module-rescue-stream from default.pa + Resolves: #2017439 + +* Mon Oct 25 2021 Ray Strode - 40.1-9 +- Synchronize permission and group ownership for log dir between + rpm file manifest and daemon expectations. + Resolves: #1999586 + +* Wed Oct 13 2021 Ray Strode - 40.1-8 +- Add latest session type propagation fixes from upstream + Related: #2009044 + +* Mon Aug 23 2021 Ray Strode - 40.1-7 +- Don't use gdm-disable-wayland binary in udev rules. + It doesn't exist anymore. + Related: #1985099 + +* Thu Aug 19 2021 Ray Strode - 40.1-6 +- Disable wayland on server chips + Resolves: #1963919 + +* Mon Aug 09 2021 Mohan Boddu - 1:40.1-5 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Wed Jul 28 2021 Ray Strode - 40.1-4 +- Update to 40.1 +- Allow vendor nvidia users to choose wayland sessions + Related: #1985099 + +* Wed Jun 16 2021 Ray Strode - 40.0-5 +- Ensure gdm dconf db is generated at install time + Related: #1972234 + +* Tue Jun 15 2021 Ray Strode - 1:40.0-4 +- Provide gdm specific dconf sources + Related: #1972234 + +* Thu Apr 15 2021 Mohan Boddu - 1:40.0-2 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Tue Mar 30 2021 Kalev Lember - 1:40.0-1 +- Update to 40.0 +- Remove old obsoletes and provides + +* Tue Mar 16 2021 Kalev Lember - 1:40~rc-1 +- Update to 40.rc + +* Wed Mar 10 2021 Benjamin Berg - 1:40~beta-2 +- Add patch to fix issues with the first login after boot + Resolves: #1937308 + +* Fri Feb 26 2021 Kalev Lember - 1:40~beta-1 +- Update to 40.beta + +* Tue Jan 26 2021 Fedora Release Engineering - 1:3.38.2.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Sat Dec 19 2020 Kalev Lember - 1:3.38.2.1-1 +- Update to 3.38.2.1 + +* Wed Nov 4 2020 Kalev Lember - 1:3.38.2-1 +- Update to 3.38.2 + +* Tue Oct 13 2020 Ray Strode - 3.38.1-1 +- Update to 3.38.1 + +* Sat Sep 12 2020 Kalev Lember - 1:3.38.0-1 +- Update to 3.38.0 + +* Tue Sep 08 2020 Dan Horák - 3.37.90-2 +- Remove stale and unnecessary architecture-specific exceptions + +* Mon Aug 17 2020 Kalev Lember - 1:3.37.90-1 +- Update to 3.37.90 + +* Sat Aug 01 2020 Fedora Release Engineering - 1:3.37.3-4 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jul 28 2020 Adam Jackson - 3.37.3-3 +- Requires xhost xmodmap xrdb, not xorg-x11-server-utils + +* Mon Jul 27 2020 Fedora Release Engineering - 1:3.37.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 20 2020 Ray Strode - 3.37.3-1 +- Update to 3.37.3 +- Kills login screen after login on Xorg systems +- Fixes user switching bug + Resolves: #1829079 + +* Tue May 05 2020 Ray Strode - 3.37.1-2 +- Make sure users have dbus-run-session installed since + the greeter depends on it. + +* Mon May 04 2020 Ray Strode - 3.37.1-1 +- Update to 3.37.1 + +* Tue Apr 07 2020 Ray Strode - 3.34.1-3 +- Fix autologin when gdm is started from VT other than VT 1 + +* Tue Jan 28 2020 Fedora Release Engineering - 1:3.34.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Mon Oct 07 2019 Kalev Lember - 1:3.34.1-1 +- Update to 3.34.1 + +* Wed Sep 25 2019 Benjamin Berg - 1:3.34.0-2 +- Add patch to fix fast user switching + https://gitlab.gnome.org/GNOME/gdm/merge_requests/86 +- Resolves: #1751673 + +* Wed Sep 11 2019 Kalev Lember - 1:3.34.0-1 +- Update to 3.34.0 + +* Wed Sep 04 2019 Kalev Lember - 1:3.33.92-1 +- Update to 3.33.92 + +* Wed Sep 04 2019 Benjamin Berg - 1:3.33.90-4 +- Add patch to fix environment setup + https://gitlab.gnome.org/GNOME/gdm/merge_requests/82 + See also #1746563 + +* Mon Aug 26 2019 Adam Williamson - 1:3.33.90-3 +- Drop patch from -2, better fix was applied to systemd + +* Thu Aug 22 2019 Adam Williamson - 1:3.33.90-2 +- Revert upstream commit that gives sbin priority in non-root $PATH +- Resolves: #1744059 + +* Tue Aug 20 2019 Kalev Lember - 1:3.33.90-1 +- Update to 3.33.90 + +* Mon Aug 12 2019 Kalev Lember - 1:3.33.4-1 +- Update to 3.33.4 + +* Thu Jul 25 2019 Fedora Release Engineering - 1:3.32.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Apr 15 2019 Ray Strode - 1:3.32.0-3 +- avoid wayland if nomodeset is on kernel command line + Related: #1691909 + +* Mon Apr 15 2019 Ray Strode - 1:3.32.0-2 +- Drop CanGraphical patch for now. It's causing problems. + Resolves: #1683197 + +* Wed Mar 13 2019 Kalev Lember - 1:3.32.0-1 +- Update to 3.32.0 + +* Wed Feb 27 2019 Ray Strode - 3.31.91-1 +- Update to 3.31.91 + +* Tue Feb 26 2019 Kalev Lember - 1:3.30.3-1 +- Update to 3.30.3 + +* Thu Jan 31 2019 Fedora Release Engineering - 1:3.30.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Wed Dec 19 2018 Kalev Lember - 1:3.30.2-1 +- Update to 3.30.2 + +* Sat Oct 06 2018 Ray Strode - 1:3.30.1-2 +- Fix login screen for machines that boot to fast +- Fix autologin crash + +* Sat Sep 29 2018 Kalev Lember - 1:3.30.1-1 +- Update to 3.30.1 + +* Fri Sep 07 2018 Kalev Lember - 1:3.30.0-3 +- Rebuilt against fixed atk (#1626575) + +* Fri Sep 07 2018 Ray Strode - 3.30.0-2 +- More initial setup fixes + Resolves: #1625572 + +* Tue Sep 04 2018 Ray Strode - 3.30.0-1 +- Update to 3.30.0 +- Fixes initial setup + Resolves: #1624534 + +* Fri Aug 24 2018 Ray Strode - 1:3.29.91-1 +- Update to 3.29.91 +- Fix race at startup + +* Mon Aug 13 2018 Kalev Lember - 1:3.29.90-1 +- Update to 3.29.90 + +* Fri Jul 13 2018 Fedora Release Engineering - 1:3.28.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Thu May 17 2018 Kalev Lember - 1:3.28.2-1 +- Update to 3.28.2 + +* Tue Apr 10 2018 Kalev Lember - 1:3.28.1-1 +- Update to 3.28.1 + +* Thu Mar 22 2018 Igor Gnatenko - 3.28.0-6 +- Fixup ldconfig in postun + +* Wed Mar 21 2018 Kevin Fenzi - 3.28.0-5 +- Fix my ldconfig fix to be actually correct. + +* Wed Mar 21 2018 Kevin Fenzi - 3.28.0-4 +- Fix post/postun calls to ldconfig scriptlet. + +* Tue Mar 20 2018 Ray Strode - 1:3.28.0-3 +- Drop /etc/dconf/db/gdm.d from list of dconf sources, that's + not longer used. + Related: #1546644 + +* Tue Mar 20 2018 Rex Dieter - 1:3.28.0-2 +- move pulseaudio-gdm-hooks content here +- use %%ldconfig %%make_build %%make_install %%systemd_requires + +* Tue Mar 13 2018 Kalev Lember - 1:3.28.0-1 +- Update to 3.28.0 + +* Sun Mar 11 2018 Kalev Lember - 1:3.27.92-1 +- Update to 3.27.92 + +* Fri Mar 02 2018 Kalev Lember - 1:3.27.91-1 +- Update to 3.27.91 + +* Mon Feb 19 2018 Ray Strode > - 1:3.27.4-4 +- Make sure GDM checks systemd dconf databases + Related: #1546644 + +* Fri Feb 09 2018 Bastien Nocera - 3.27.4-3 ++ gdm-3.27.4-4 +- Update for gnome-settings-daemon changes + +* Wed Feb 07 2018 Fedora Release Engineering - 1:3.27.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 09 2018 Ray Strode - 3.27.4-1 +- Update to 3.27.4 + +* Sat Jan 06 2018 Igor Gnatenko - 1:3.26.2.1-4 +- Remove obsolete scriptlets + +* Thu Nov 30 2017 Ray Strode - 1:3.26.2.1-3 +- Add buildrequires for X server so it knows which -listen + variant to use. + https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/K2ZPZ43355YKAU66A5TDI3OSFU3U4T3M/ + +* Wed Nov 15 2017 Ray Strode - 1:3.26.2.1-2 +- Split PAM macros off into a new subpackage + Resolves: #1512212 + +* Wed Nov 01 2017 Kalev Lember - 1:3.26.2.1-1 +- Update to 3.26.2.1 + +* Tue Oct 24 2017 Ray Strode - 3.26.1-2 +- make sure initial-setup starts when wayland fails + Resolves: #1502827 + +* Sun Oct 08 2017 Kalev Lember - 1:3.26.1-1 +- Update to 3.26.1 + +* Thu Sep 14 2017 Kalev Lember - 1:3.26.0-1 +- Update to 3.26.0 + +* Fri Sep 08 2017 Kalev Lember - 1:3.25.92-1 +- Update to 3.25.92 + +* Tue Aug 15 2017 Kalev Lember - 1:3.25.90.1-1 +- Update to 3.25.90.1 + +* Mon Aug 14 2017 Ville Skyttä - 1:3.25.4.1-2 +- Own %%{_datadir}/{dconf,gdm/greeter,gir-1.0} dirs + +* Mon Jul 31 2017 Kalev Lember - 1:3.25.4.1-1 +- Update to 3.25.4.1 + +* Wed Jul 26 2017 Fedora Release Engineering - 1:3.25.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sun Jun 25 2017 Kalev Lember - 1:3.25.3-1 +- Update to 3.25.3 + +* Wed May 10 2017 Kalev Lember - 1:3.24.2-1 +- Update to 3.24.2 + +* Wed Apr 12 2017 Kalev Lember - 1:3.24.1-1 +- Update to 3.24.1 + +* Sat Mar 25 2017 Ray Strode - 1:3.24.0-2 +- Fix fallback to X logic + Resolves: #1435010 + +* Tue Mar 21 2017 Kalev Lember - 1:3.24.0-1 +- Update to 3.24.0 + +* Fri Mar 17 2017 Kalev Lember - 1:3.23.92-1 +- Update to 3.23.92 + +* Mon Mar 06 2017 Kalev Lember - 1:3.23.91.1-1 +- Update to 3.23.91.1 + +* Mon Feb 13 2017 Richard Hughes - 1:3.23.4-1 +- Update to 3.23.4 + +* Fri Feb 10 2017 Fedora Release Engineering - 1:3.22.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Tue Jan 31 2017 Rui Matos - 1:3.22.1-2 +- Honor anaconda's firstboot being disabled + +* Wed Oct 12 2016 Kalev Lember - 1:3.22.1-1 +- Update to 3.22.1 +- Don't set group tags + +* Wed Sep 21 2016 Ray Strode - 3.22.0-2 +- Fix log in after log out + Resolves: #1373169 + +* Tue Sep 20 2016 Kalev Lember - 1:3.22.0-1 +- Update to 3.22.0 + +* Thu Sep 01 2016 Ray Strode - 1:3.21.91-2 +- Add buildrequire on kernel keyring development headers + +* Tue Aug 30 2016 Ray Strode - 1:3.21.91-1 +- Update to 3.21.91 + +* Tue Aug 30 2016 Ray Strode - 1:3.21.90-2 +- Fix autologin + +* Tue Aug 23 2016 Kalev Lember - 1:3.21.90-1 +- Update to 3.21.90 + +* Tue Jul 26 2016 Kalev Lember - 1:3.21.4-1 +- Update to 3.21.4 + +* Wed Jun 22 2016 Richard Hughes - 1:3.21.3-1 +- Update to 3.21.3 + +* Thu Apr 21 2016 Kalev Lember - 1:3.20.1-1 +- Update to 3.20.1 + +* Tue Mar 22 2016 Kalev Lember - 1:3.20.0-1 +- Update to 3.20.0 + +* Tue Mar 15 2016 Kalev Lember - 1:3.19.92-1 +- Update to 3.19.92 + +* Fri Mar 04 2016 Kalev Lember - 1:3.19.91-1 +- Update to 3.19.91 + +* Thu Feb 18 2016 Richard Hughes - 1:3.19.90-1 +- Update to 3.19.90 + +* Tue Feb 09 2016 Ray Strode - 3.19.4.1-4 +- More fixes need to get get gnome-terminal, gedit, etc working + Resolves: #1281675 + +* Thu Feb 04 2016 Ray Strode - 3.19.4.1-3 +- Fix gnome-terminal launched in an X session (and gedit etc) + Resolves: #1281675 + +* Wed Feb 03 2016 Fedora Release Engineering - 1:3.19.4.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Mon Jan 25 2016 Ray Strode - 3.19.4.1-1 +- Update to 3.19.4.1 + +* Thu Jan 21 2016 Kalev Lember 3.19.4-1 +- Update to 3.19.4 + +* Thu Dec 17 2015 Kalev Lember 3.19.2-1 +- Update to 3.19.2 + +* Tue Nov 10 2015 Ray Strode 3.19.2-0.1.20151110gitaf5957ad9 +- Update to git snapshot + +* Mon Sep 21 2015 Kalev Lember - 1:3.18.0-1 +- Update to 3.18.0 + +* Wed Sep 16 2015 Kalev Lember 3.17.92-1 +- Update to 3.17.92 + +* Mon Aug 24 2015 Ray Strode 3.17.90-1 +- Update to 3.17.90 +- Fixes sporadic failure to login and corruption of GDM_LANG + environment variable + +* Thu Aug 06 2015 Ray Strode 3.17.4-2 +- drop /bin and /sbin from default path + They don't make since given /usr merge + Resolves: #1251192 + +* Tue Jul 28 2015 Kalev Lember - 1:3.17.4-1 +- Update to 3.17.4 + +* Tue Jun 23 2015 Ray Strode 3.17.3.1-1 +- Update to 3.17.3.1 + +* Wed Jun 17 2015 Fedora Release Engineering - 1:3.17.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Wed Jun 03 2015 Ray Strode 3.17.2-1 +- Update to 3.17.2 + +* Thu Apr 16 2015 Ray Strode 3.16.1.1-1 +- Update to 3.16.1.1 + +* Thu Apr 16 2015 Kalev Lember 3.16.1-1 +- Update to 3.16.1 + +* Tue Apr 07 2015 Ray Strode 3.16.0.1-3 +- Fix permissions on /var/lib/gdm/.local/share +- Fixes starting Xorg without root on machines that started out + as Fedora 15 machines. + +* Fri Mar 27 2015 Ray Strode 3.16.0.1-2 +- set XORG_RUN_AS_USER_OK in environment + +* Tue Mar 24 2015 Kalev Lember - 1:3.16.0.1-1 +- Update to 3.16.0.1 + +* Tue Mar 24 2015 Ray Strode 3.16.0-2 +- actually quit plymouth at startup + +* Mon Mar 23 2015 Kalev Lember - 1:3.16.0-1 +- Update to 3.16.0 + +* Fri Mar 20 2015 Kalev Lember - 1:3.15.92-1 +- Update to 3.15.92 + +* Tue Mar 03 2015 Ray Strode 3.15.91.2-1 +- Update to 3.15.92.2 +- fixes "black screen on logout" of wayland sessions + +* Mon Mar 02 2015 Ray Strode 3.15.91.1-1 +- Update to 3.15.91.1 +- fixes deadlock on VT switch in some cases + +* Fri Feb 27 2015 Ray Strode 3.15.91-1 +- Update for 3.15.91 +- Reduces flicker +- Fixes hang for autologin + Resolves: #1197224 +- Fixes users that disable root running X in /etc/X11/Xwrapper.conf +- Fixes intermittent crash at login + +* Tue Feb 24 2015 Ray Strode - 1:3.15.90.5-1 +- Update to 3.15.90.5 +- gnome-initial-setup should work again + Resolves: #1194948 +- X will work better when configured to not need root + (still not perfect though) + +* Sun Feb 22 2015 Ray Strode - 1:3.15.90.4-1 +- Update to 3.15.90.4 +- Fixes bus activated X clients + +* Sat Feb 21 2015 Ray Strode - 1:3.15.90.3-1 +- Update to 3.15.90.3 +- Disables gnome-initial-setup support for now, which isn't functional + +* Fri Feb 20 2015 Ray Strode - 1:3.15.90.2-1 +- Update to 3.15.90.2 +- Fixes "no user list in the middle of my login screen" bug +- Require gnome-session-wayland-session since we default to wayland now + +* Fri Feb 20 2015 David King - 1:3.15.90.1-1 +- Update to 3.15.90.1 +- Use license macro for COPYING +- Use pkgconfig for BuildRequires +- Update URL + +* Thu Feb 19 2015 Richard Hughes - 1:3.15.90-1 +- Update to 3.15.90 + +* Fri Jan 23 2015 Ray Strode 3.15.3.1-4 +- Another user switching fix + Related: #1184933 + +* Thu Jan 22 2015 Ray Strode 3.15.3.1-3 +- Fix user switching + Resolves: #1184933 + +* Fri Jan 16 2015 Ray Strode 3.13.91-2 +- Fix pam_ecryptfs. unfortunately adds back gross last login messages. + Resolves: #1174366 + +* Fri Dec 19 2014 Richard Hughes - 1:3.15.3.1-1 +- Update to 3.15.3.1 + +* Fri Dec 19 2014 Richard Hughes - 1:3.15.3-1 +- Update to 3.15.3 + +* Tue Nov 25 2014 Kalev Lember - 1:3.15.2-1 +- Update to 3.15.2 + +* Tue Oct 14 2014 Kalev Lember - 1:3.14.1-1 +- Update to 3.14.1 + +* Mon Sep 22 2014 Kalev Lember - 1:3.14.0-1 +- Update to 3.14.0 + +* Wed Sep 17 2014 Kalev Lember - 1:3.13.92-1 +- Update to 3.13.92 + +* Wed Sep 03 2014 Kalev Lember - 1:3.13.91-2 +- Drop last GConf remnants + +* Wed Sep 03 2014 Kalev Lember - 1:3.13.91-1 +- Update to 3.13.91 + +* Sat Aug 16 2014 Fedora Release Engineering - 1:3.12.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Tue Jul 22 2014 Kalev Lember - 1:3.12.2-3 +- Rebuilt for gobject-introspection 1.41.4 + +* Sat Jun 07 2014 Fedora Release Engineering - 1:3.12.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Fri May 16 2014 Kalev Lember - 1:3.12.2-1 +- Update to 3.12.2 + +* Thu May 08 2014 Ray Strode - 1:3.12.1-3 +- Fix PATH + Resolves: #1095344 + +* Wed May 07 2014 Kalev Lember - 1:3.12.1-2 +- Drop gnome-icon-theme-symbolic dependency + +* Wed Apr 16 2014 Kalev Lember - 1:3.12.1-1 +- Update to 3.12.1 + +* Sat Apr 05 2014 Kalev Lember - 1:3.12.0-3 +- Fold -libs into the main gdm package + +* Sat Apr 05 2014 Kalev Lember - 1:3.12.0-2 +- Tighten subpackage deps + +* Tue Mar 25 2014 Richard Hughes - 1:3.12.0-1 +- Update to 3.12.0 + +* Thu Mar 20 2014 Richard Hughes - 1:3.11.92.1-1 +- Update to 3.11.92.1 + +* Fri Feb 21 2014 Richard Hughes - 1:3.11.90-1 +- Update to 3.11.90 + +* Wed Jan 15 2014 Richard Hughes - 1:3.11.4-1 +- Update to 3.11.4 + +* Sun Dec 22 2013 Ville Skyttä - 1:3.11.3-2 +- Drop empty TODO from docs, trivial rpmlint fixes. + +* Tue Dec 17 2013 Richard Hughes - 1:3.11.3-1 +- Update to 3.11.3 + +* Tue Nov 19 2013 Richard Hughes - 1:3.11.2-1 +- Update to 3.11.2 + +* Mon Oct 28 2013 Richard Hughes - 1:3.10.0.1-1 +- Update to 3.10.0.1 + +* Wed Sep 25 2013 Kalev Lember - 1:3.10.0-1 +- Update to 3.10.0 + +* Thu Aug 22 2013 Kalev Lember - 1:3.9.90-1 +- Update to 3.9.90 + +* Sat Aug 10 2013 Kalev Lember - 1:3.9.5-1 +- Update to 3.9.5 + +* Tue Jul 16 2013 Richard Hughes - 1:3.8.3.1-1 +- Update to 3.8.3.1 + +* Sat Jun 22 2013 Matthias Clasen - 3.8.3-2 +- Trim %%changelog + +* Fri Jun 14 2013 Ray Strode 3.8.3-1 +- Update to 3.8.3 + +* Tue May 21 2013 Matthias Clasen 1:3.8.1.1-6 +- Don't include the fallback greeter + +* Mon May 20 2013 Ray Strode 1:3.8.1.1-5 +- Fix permissions on /run/gdm + Resolves: #fudge + (http://lists.fedoraproject.org/pipermail/devel/2013-May/182906.html) + +* Mon May 20 2013 Ray Strode 1:3.8.1.1-4 +- Require gnome-shell. We no longer use the fallback greeter. + (Since gdm 3.7.92). + +* Fri May 17 2013 Ray Strode - 1:3.8.1.1-3 +- Build with -fpie + Resolves: #955154 + +* Thu May 16 2013 Florian Müllner - 1:3.8.1.1-2 +- Update branding + +* Wed Apr 17 2013 Richard Hughes - 1:3.8.1.1-1 +- Update to 3.8.1.1 + +* Mon Apr 15 2013 Kalev Lember - 1:3.8.1-1 +- Update to 3.8.1 + +* Mon Apr 01 2013 Kalev Lember - 1:3.8.0-2 +- Drop the metacity dep now that the fallback greeter is gone + +* Tue Mar 26 2013 Kalev Lember - 1:3.8.0-1 +- Update to 3.8.0 + +* Thu Mar 21 2013 Kalev Lember - 1:3.7.92-2 +- Drop the polkit-gnome dep now that the fallback greeter is gone + +* Wed Mar 20 2013 Richard Hughes - 1:3.7.92-1 +- Update to 3.7.92 + +* Wed Mar 6 2013 Matthias Clasen 3.7.91-1 +- Update to 3.7.91 + +* Wed Feb 27 2013 Ray Strode 3.7.90-3 +- Fix up runtime dir for real + +* Tue Feb 26 2013 Ray Strode 3.7.90-2 +- Fix up runtime dir path (spotted by dwalsh) + +* Fri Feb 22 2013 Kalev Lember - 1:3.7.90-1 +- Update to 3.7.90 + +* Wed Feb 06 2013 Kalev Lember - 1:3.7.5-1 +- Update to 3.7.5 + +* Wed Jan 09 2013 Richard Hughes - 1:3.7.3.1-1 +- Update to 3.7.3.1 + +* Tue Nov 20 2012 Richard Hughes - 1:3.7.2-1 +- Update to 3.7.2 + +* Tue Nov 20 2012 Matthias Clasen - 1:3.6.2-2 +- Remove patch fuzz of 999 + +* Wed Nov 14 2012 Kalev Lember - 1:3.6.2-1 +- Update to 3.6.2 + +* Mon Nov 05 2012 Ray Strode - 1:3.6.1-4 +- Fix GDM auth cookie problem + Related: #870695 + +* Mon Oct 29 2012 Matthias Clasen - 1:3.6.1-3 +- Add ppc to %%ExcludeArch + +* Thu Oct 18 2012 Matthias Clasen - 1:3.6.1-2 +- Require gnome-icon-theme-symbolic (#867718) + +* Tue Oct 16 2012 Kalev Lember - 1:3.6.1-1 +- Update to 3.6.1 + +* Tue Sep 25 2012 Richard Hughes - 1:3.6.0-1 +- Update to 3.6.0 + +* Wed Sep 19 2012 Matthias Clasen 1:3.5.92.1-1 +- Update to 3.5.92.1 + +* Fri Sep 07 2012 Ray Strode 1:3.5.91-2 +- Fix autologin +- Fix selinux context after forking session + +* Thu Sep 06 2012 Richard Hughes - 1:3.5.91-1 +- Update to 3.5.91 + +* Tue Aug 21 2012 Richard Hughes - 1:3.5.90-1 +- Update to 3.5.90 + +* Tue Aug 7 2012 Lennart Poettering - 1:3.5.5-2 +- https://fedoraproject.org/wiki/Features/DisplayManagerRework +- https://bugzilla.redhat.com/show_bug.cgi?id=846135 +- Ship and use gdm.service +- Force gdm onto VT1 + +* Tue Aug 07 2012 Richard Hughes - 1:3.5.5-1 +- Update to 3.5.5 + +* Fri Jul 27 2012 Fedora Release Engineering - 1:3.5.4.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Jul 19 2012 Ray Strode 3.5.4.2-1 +- Update to 3.5.4.2 +- Fixes non-autologin + +* Thu Jul 19 2012 Ray Strode 3.5.4.1-1 +- Update to 3.5.4.1 +- Fixes autologin +- Fixes logind integration +- Fixes dconf incompatibility + +* Thu Jul 19 2012 Matthias Clasen - 1:3.5.4-3 +- Fix dconf profile syntax + +* Thu Jul 19 2012 Kalev Lember - 1:3.5.4-2 +- Require systemd >= 186 for libsystemd-login + +* Tue Jul 17 2012 Richard Hughes - 1:3.5.4-1 +- Update to 3.5.4 + +* Thu Jun 28 2012 Ray Strode 3.5.2-4 +- Build with plymouth support (woops). + +* Wed Jun 13 2012 Ray Strode 3.5.2-3 +- Drop unused spool dir + Related: #819254 + +* Sat Jun 9 2012 Matthias Clasen - 1:3.5.2-2 +- Fix gnome-shell detection + +* Thu Jun 07 2012 Richard Hughes - 1:3.5.2-1 +- Update to 3.5.2 + +* Sat Apr 14 2012 Matthias Clasen - 3.4.1-1 +- Update to 3.4.1 + +* Mon Apr 09 2012 Ray Strode 3.4.0.1-5 +- One more try at fixing crash + Resolves: #810451 + +* Mon Apr 09 2012 Ray Strode 3.4.0.1-4 +- Fix crash + Resolves: #810451 + +* Thu Apr 5 2012 Matthias Clasen 3.4.0.1-3 +- Make session unlocking after user switching work + +* Mon Apr 02 2012 Ray Strode 3.4.0.1-2 +- Move pam_gnome_keyring after XDG_RUNTIME_DIR is setup + Resolves: #809152 + +* Tue Mar 27 2012 Ray Strode 3.4.0.1-1 +- Update to 3.4.0.1 +- fixes autologin + +* Tue Mar 27 2012 Richard Hughes - 1:3.4.0-1 +- Update to 3.4.0 + +* Tue Mar 20 2012 Ray Strode 3.3.92.1-1 +- Update to 3.3.92.1 + +* Wed Feb 15 2012 Ray Strode 3.2.1.1-14 +- More consolekit registration fixes + +* Mon Feb 13 2012 Ray Strode 3.2.1.1-12 +- Restore ConsoleKit registration if ConsoleKit is installed + +* Tue Feb 7 2012 Lennart Poettering - 1:3.2.1.1-11 +- Add multi-seat patch from gdm git master + +* Thu Jan 26 2012 Ray Strode 3.2.1.1-10 +- Drop system-icon-theme requirement since we don't depend + on it anymore + +* Fri Jan 13 2012 Fedora Release Engineering - 1:3.2.1.1-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Wed Nov 09 2011 Adam Williamson 1:3.2.1.1-8 +- sync with recent changes on f16 branch: + + update to 3.2.1.1 + + properly set up PAM files + + auth fixes + + put fallback plugin development files in -devel + + require metacity to fix #746693 + + fix logo in fallback mode - just set it to a Fedora file + +* Thu Nov 03 2011 Ray Strode 3.2.1-3 +- Drop fprintd-pam dependency and make Harald's laptop + more lean and streamlined. + +* Wed Oct 26 2011 Fedora Release Engineering - 1:3.2.1-2 +- Rebuilt for glibc bug#747377 + +* Tue Oct 18 2011 Ray Strode 3.2.1-1 +- Update to 3.2.1 +- Move plugins into main package + +* Wed Oct 5 2011 Adam Williamson - 1:3.2.0-2 +- shell_check.patch (upstream): re-add check for gnome-shell presence + before using it to handle login (RH #743596) + +* Wed Sep 28 2011 Ray - 1:3.2.0-1 +- Update to 3.2.0 + +* Tue Jun 28 2011 Ray Strode 3.1.2-3 +- Disable fatal critcals + Resolves: #717324 + +* Tue Jun 21 2011 Michael Schwendt - 3.1.2-2 +- Fix /dev/ull typo in scriptlets (#693046). + +* Mon Jun 13 2011 Ray Strode 3.1.2-1 +- Update for release + +* Mon Jun 06 2011 Ray Strode 3.0.4-1 +- Update to latest version + Resolves CVE-2011-1709 + +* Fri Apr 15 2011 Matthias Clasen - 3.0.0-2 +- Put the Fedora logo back in the greeter + +* Mon Apr 4 2011 Matthias Clasen - 3.0.0-1 +- Update to 3.0.0 + +* Tue Mar 22 2011 Ray Strode 2.91.94-1 +- Update to 2.91.94 + +* Wed Mar 09 2011 Ray Strode 2.91.93-2 +- Fix autologin crash + +* Tue Mar 08 2011 Ray Strode 2.91.93-1 +- Update to 2.91.93 + +* Tue Feb 22 2011 Ray Strode 2.91.6-11 +- Dropping async code didn't work. The bug was still + around. This commit should fix it. + +* Fri Feb 18 2011 Ray Strode 2.91.6-10 +- Fix user list async bugs by dropping async code and + moving to accounts service library + Resolves: #678236 +- Add requires for accounts service to spec since it isn't + optional (and hasn't been for a while) + +* Thu Feb 17 2011 Ray Strode 2.91.6-9 +- Add back session chooser + Resolves: #539638 + +* Mon Feb 14 2011 Ray Strode 2.91.6-8 +- Do build with pam stack changes need to get ecryptfs + working. + Resolves: #665061 + +* Mon Feb 14 2011 Ray Strode 2.91.6-7 +- Fix crasher and rendering glitches + Resolves: #674978 + +* Fri Feb 11 2011 Matthias Clasen - 2.91.6-6 +- Rebuild against newer gtk + +* Wed Feb 09 2011 Christopher Aillon - 2.91.6-5 +- Drop the requires on plymouth-gdm-hooks since it no longer exists + +* Tue Feb 08 2011 Fedora Release Engineering - 1:2.91.6-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Mon Feb 07 2011 Bastien Nocera 2.91.6-3 +- Really disable gnome-settings-daemon plugins in the greeter + +* Fri Feb 04 2011 Ray Strode 2.91.6-2 +- Drop some unimportant patches +- Attempt to fix bug 674978 (theme related crash) + +* Wed Feb 02 2011 Ray Strode 2.91.6-1 +- Update to 2.91.6 + +* Sat Jan 29 2011 Ville Skyttä - 1:2.91.4-6 +- Dir ownership fixes. + +* Wed Jan 19 2011 Ray Strode 2.91.4-5 +- Fix swapped LHS and RHS in more-aggressive-about-loading-icons + patch + +* Wed Jan 19 2011 Ray Strode 2.91.4-4 +- Update previous patch to handle NULL better + +* Wed Jan 19 2011 Ray Strode 2.91.4-3 +- Fix icon ref counting issue + +* Wed Jan 19 2011 Ray Strode 2.91.4-2 +- Be more aggresive about loading icons + (right now we fail, which combined with fatal criticals + gives us crashes) + +* Fri Dec 17 2010 Ray Strode 2.91.4-1 +- Update to 2.91.4 + +* Wed Dec 15 2010 Christopher Aillon 2.32.0-4 +- Add maybe-set-is-loaded.patch to ensure we end up with a loaded user + +* Wed Dec 01 2010 Peter Hutterer 1:2.32.0-3 +- plymouth.patch: xserver 1.10 takes "-background none" root argument + instead of the fedora-specific "-nr". +- Add missing BuildRequires for dbus-glib-devel + +* Mon Nov 15 2010 Dan Williams 2.32.0-2 +- Fix upower build requirement + +* Wed Sep 29 2010 Ray Strode 2.32.0-1 +- Update to 2.32.0 + +* Tue Aug 17 2010 Ray Strode 2.31.90-1 +- Update to 2.31.90 + +* Wed Jun 16 2010 Matthias Clasen 2.30.2-3 +- Kill explicit library deps + +* Tue Apr 27 2010 Ray Strode 2.30.2-2 +- Update multistack patch +- Add accounts service patch +- Update plymouth patch + +* Tue Apr 27 2010 Matthias Clasen 2.30.2-1 +- Update to 2.30.2 +- Spec file cleanups + +* Tue Apr 06 2010 Ray Strode 2.30.0-2 +- Update plymouth patch to work with 0.8.1 + +* Mon Mar 29 2010 Matthias Clasen 2.30.0-1 +- Update to 2.30.0 + +* Wed Mar 24 2010 Matthias Clasen 2.29.92-4 +- Drop hal dependency + +* Tue Mar 09 2010 Ray Strode 2.29.92-3 +- Drop Prereq in favor of Requires(pre) + +* Tue Mar 09 2010 Ray Strode 2.29.92-2 +- Rebase multistack patch + +* Tue Mar 09 2010 Bastien Nocera 2.29.92-1 +- Update to 2.29.92 + +* Thu Feb 11 2010 Matthias Clasen 2.29.6-1 +- Update to 2.29.6 + +* Thu Jan 28 2010 Ray Strode 2.29.5-2 +- name graphical-login vprovides (bug 559268) + +* Tue Jan 26 2010 Ray Strode 2.29.5-1 +- Update to 2.29.5 + +* Sun Jan 17 2010 Matthias Clasen - 2.29.4-3 +- Rebuild + +* Thu Jan 14 2010 Ray Strode 2.29.4-2 +- Fix boot + +* Tue Dec 22 2009 Matthias Clasen - 2.29.4-1 +- Update to 2.29.4 + +* Wed Dec 09 2009 Ray Strode 2.29.1-3 +- Update to work better with latest plymouth + +* Thu Dec 03 2009 Ray Strode 2.29.1-2 +- Drop upstreamed patches +- rebase multi-stack patch + +* Tue Dec 01 2009 Bastien Nocera 2.29.1-1 +- Update to 2.29.1 + +* Sat Oct 31 2009 Matthias Clasen 2.28.1-20 +- Don't show 'Lock Screen' in the user switcher if locked down + +* Sat Oct 31 2009 Matthias Clasen 2.28.1-18 +- Actually set up statusicon padding + +* Fri Oct 30 2009 Ray Strode 2.28.1-17 +- Make the user list slide animation smoother + +* Thu Oct 29 2009 Ray Strode 2.28.1-16 +- Shrink autologin timer +- Make language dialog not double spaced + +* Thu Oct 29 2009 Ray Strode 2.28.1-15 +- Don't show fingerprint task button unless fingerprint is + enabled +- Don't show smartcard task button and list item unless + pcscd is running. + +* Wed Oct 28 2009 Ray Strode 2.28.1-14 +- Don't show image on login button + +* Wed Oct 28 2009 Ray Strode 2.28.1-13 +- Fix double free during user switching (might address + bug 512944) + +* Tue Oct 27 2009 Ray Strode 2.28.1-12 +- One more go at bug 527920 + +* Tue Oct 27 2009 Ray Strode 2.28.1-11 +- Tighten permissions on /var/run/gdm (bug 531063) + +* Mon Oct 26 2009 Ray Strode 2.28.1-10 +- Position shutdown menu properly on multihead machines + +* Fri Oct 23 2009 Ray Strode 2.28.1-9 +- Don't show hostname by default if it's localhost + +* Fri Oct 23 2009 Ray Strode 2.28.1-8 +- Attempt to fix crash some users see. +- Clean up rebase + +* Fri Oct 23 2009 Ray Strode 2.28.1-7 +- Show Other user even when there are no other users + (bug 527920) + +* Fri Oct 23 2009 Ray Strode 2.28.1-6 +- Properly read default keyboard layout (bug 530452) + +* Fri Oct 23 2009 Ray Strode 2.28.1-5 +- Remove tool tip from login button + +* Thu Oct 22 2009 Ray Strode 2.28.1-4 +- Fix autologin window spasms +- Fix autologin timer animation +- Make autologin and multistack play better together +- Add padding to notification tray + +* Wed Oct 21 2009 Ray Strode 2.28.1-3 +- Move date from panel to clock tooltip + +* Tue Oct 20 2009 Ray Strode 2.28.1-2 +- Move shutdown functions to panel from login window + +* Tue Oct 20 2009 Ray Strode 2.28.1-1 +- Update to 2.28.1 + +* Fri Oct 09 2009 Ray Strode 2.28.0-9 +- Fix Other... user. + +* Fri Oct 9 2009 Matthias Clasen - 1:2.28.0-8 +- Move bubbles to the lower right on the login screen + +* Wed Oct 07 2009 Ray Strode - 1:2.28.0-7 +- Fix gdm-password / xguest interaction (bug 524421) + +* Mon Oct 5 2009 Matthias Clasen - 1:2.28.4-6 +- Fix the autostart file for at-spi-registryd + +* Thu Oct 1 2009 Matthias Clasen - 1:2.28.4-5 +- Handle keyboard layout variants + +* Mon Sep 28 2009 Ray Strode - 1:2.28.0-4 +- Add cache dir to package manifest + +* Mon Sep 28 2009 Richard Hughes - 1:2.28.0-3 +- Add a patch to use DeviceKit-power rather than the removed methods in + gnome-power-manager. + +* Fri Sep 25 2009 Ray Strode 1:2.28.0-2 +- Fix autologin + +* Wed Sep 23 2009 Matthias Clasen 1:2.28.0-1 +- Update to 2.28.0 + +* Sat Aug 29 2009 Caolán McNamara 1:2.27.90-2 +- rebuild with new audit + +* Mon Aug 24 2009 Ray Strode 1:2.27.90-1 +- update to 2.27.90 + +* Fri Aug 21 2009 Tomas Mraz - 1:2.27.4-7 +- rebuilt with new audit + +* Wed Aug 19 2009 Lennart Poettering 1:2.27.4-6 +- Add pulseaudio-gdm-hooks to dependencies + +* Thu Aug 06 2009 Ray Strode 1:2.27.4-5 +- rebuild + +* Sat Aug 1 2009 Matthias Clasen 1:2.27.4-4 +- Drop unneeded direct deps + +* Fri Jul 24 2009 Ray Strode 1:2.27.4-3 +- Fix delay during login + +* Mon Jul 20 2009 Ray Strode 1:2.27.4-2 +- Use correct multi-stack patch + +* Mon Jul 20 2009 Ray Strode 1:2.27.4-1 +- Update to 2.27.4 + +* Thu Jul 02 2009 Adam Jackson 1:2.26.1-13 +- Requires: xorg-x11-xkb-utils -> Requires: setxkbmap + +* Wed Jul 01 2009 Ray Strode - 1:2.26.1-12 +- Drop defunct arch conditional buildrequires + +* Tue Jun 30 2009 Matthias Clasen - 1:2.26.1-11 +- Rebuild against new libxklavier + +* Fri Jun 12 2009 Matthias Clasen - 1:2.26.1-10 +- Bump rev to fix upgrade path + +* Tue Jun 9 2009 Matthias Clasen - 1:2.26.1-8 +- Port to PolicyKit 1 + +* Wed Jun 03 2009 Ray Strode - 1:2.26.1-5 +- Fix language parsing code (bug 502778) + +* Mon Apr 27 2009 Matthias Clasen - 1:2.26.1-4 +- Don't drop schemas translations from po files + +* Fri Apr 24 2009 Ray Strode - 1:2.26.1-3 +- Add Requires for pam modules in plugins + +* Tue Apr 21 2009 Ray Strode - 1:2.26.1-2 +- Stop inactive pam conversations when one succeeds. + Should fix bug 496234 + +* Tue Apr 14 2009 Ray Strode - 1:2.26.1-1 +- Update to 2.26.1 + +* Mon Apr 13 2009 Ray Strode - 1:2.26.0-8 +- Add less boring multistack patch for testing + +* Mon Mar 23 2009 Ray Strode - 1:2.26.0-7 +- Load session and language settings when username is read on + Other user + +* Fri Mar 20 2009 Ray Strode - 1:2.26.0-6 +- Fix problem in keyboard layout selector (483195) + +* Thu Mar 19 2009 Ray Strode - 1:2.26.0-5 +- Use gethostname() _properly_ instead of g_get_host_name() when writing + out xauth files, because the hostname may change out from + under us and glib caches it. + +* Thu Mar 19 2009 Ray Strode - 1:2.26.0-4 +- Use gethostname() instead of g_get_host_name() when writing + out xauth files, because the hostname may change out from + under us and glib caches it. + +* Wed Mar 18 2009 Ray Strode - 1:2.26.0-3 +- emit "user-selected" signal for non-user items in the list + as well. + +* Mon Mar 16 2009 Ray Strode - 1:2.26.0-2 +- Clean up empty auth dirs so they don't hang around forever + (bug 485974) + +* Mon Mar 16 2009 Ray Strode - 1:2.26.0-1 +- Update to 2.26.0 +- Drop gcc workaround. it might not be needed now. + +* Sat Mar 14 2009 Ray Strode - 1:2.25.2-20 +- Drop the use localhost patch because it broke things. + Instead add authorization that doesn't depend on a hostname + +* Thu Mar 12 2009 Ray Strode - 1:2.25.2-19 +- Add a lame patch in the off chance it might work around a + gcc bug on ppc: + unable to find register to spill in class 'LINK_OR_CTR_REGS' + Probably won't work. + +* Thu Mar 12 2009 Ray Strode - 1:2.25.2-18 +- Add Requires: libXau >= 1.0.4-4 to use localhost in xauth cookies +- Use localhost instead of g_get_host_name () + +* Thu Mar 12 2009 Ray Strode - 1:2.25.2-17 +- Don't force X server on active vt more than once + +* Tue Mar 10 2009 Ray Strode - 1:2.25.2-16 +- Store greeter's auth cookie under "localhost" instead + of g_get_host_name() since NetworkManager tries to synchronize + the internal hostname with the externally resolvable one. + +* Mon Mar 9 2009 Ray Strode - 1:2.25.2-15 +- Don't race with PAM modules that ask questions during + pam_open_session (and don't subsequently go bonkers when + losing the race). + +* Fri Mar 6 2009 Ray Strode - 1:2.25.2-14 +- Reset "start session when ready" state to FALSE when starting + new greeter from existing slave. May fix problem Chris Ball + is seeing with language selection in autologin the second time + after boot up. + +* Thu Mar 5 2009 Ray Strode - 1:2.25.2-13 +- 2.25.2-10 fixes were actually only for timed login. + Add same fix for auto login + +* Thu Mar 5 2009 Ray Strode - 1:2.25.2-12 +- Create settings object early to prevent assertion failures + when one pam conversation completes before another starts. + +* Wed Mar 4 2009 Ray Strode - 1:2.25.2-11 +- Bring back language/session/layout selector for autologin + +* Wed Mar 4 2009 Ray Strode - 1:2.25.2-10 +- Add some fixes for autologin + +* Tue Mar 3 2009 Ray Strode - 1:2.25.2-9 +- Add limited 'one-stack-only' version of multistack patch + (See https://fedoraproject.org/wiki/Features/MultiplePAMStacksInGDM) +- Drop 10 second delay in start up because of broken autostart + file + +* Fri Feb 27 2009 Matthias Clasen +- Require PolicyKit-authentication-agent + +* Tue Feb 24 2009 Matthias Clasen +- Refine the hal patch + +* Tue Feb 24 2009 Fedora Release Engineering - 1:2.25.2-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Fri Feb 20 2009 Matthias Clasen - 1:2.25.2-5 +- Get the default keyboard layout out of hal device properties + instead of /etc/sysconfig/keyboard + +* Fri Feb 20 2009 Ray Strode - 1:2.25.2-4 +- add Provides: service(graphical-login) to help anaconda + +* Thu Jan 22 2009 Ray Strode - 1:2.25.2-3 +- Open log files for append to make selinux lock down easier + +* Wed Dec 17 2008 Matthias Clasen - 1:2.25.2-2 +- Update to 2.25.2 +- Drop the xkb groups workaround to see if the issue disappeared + +* Thu Dec 4 2008 Matthias Clasen - 1:2.25.1-2 +- Update to 2.25.1 + +* Mon Oct 20 2008 Matthias Clasen - 1:2.24.0-11 +- Respect system keyboard setting + +* Wed Oct 15 2008 Ray Strode - 1:2.24.0-10 +- Rework "force X on vt1" code to work after the user logs out + +* Wed Oct 15 2008 Matthias Clasen - 1:2.24.0-9 +- Save some space + +* Fri Oct 3 2008 Matthias Clasen - 1:2.24.0-8 +- Don't show a non-functional help menuitem + +* Tue Sep 30 2008 Ray Strode - 1:2.24.0-7 +- Make panel slide in initially like the gnome panel + +* Tue Sep 30 2008 Ray Strode - 1:2.24.0-6 +- drop background priority change. Choppyiness in -3 ended up + being a bug in gnome-settings-daemon. +- pull patch from upstream to scale face icons with fontsize + +* Thu Sep 25 2008 Matthias Clasen - 1:2.24.0-5 +- Require gnome-session + +* Tue Sep 23 2008 Matthias Clasen - 1:2.24.0-4 +- Let /var/lib/gdm be owned by gdm, to make pulseaudio happy + +* Tue Sep 23 2008 Ray Strode - 1:2.24.0-3 +- Load background after everything else, so the crossfade + isn't choppy. + +* Mon Sep 22 2008 Ray Strode - 1:2.24.0-2 +- Fix permssions on spool dir + +* Mon Sep 22 2008 Matthias Clasen - 1:2.24.0-1 +- Update to 2.24.0 + +* Mon Sep 22 2008 Ray Strode - 1:2.23.92-10 +- Flush X event queue after setting _XROOTPMAP_ID so there's + no race with settings daemon reading the property + +* Fri Sep 19 2008 Ray Strode - 1:2.23.92-9 +- Fix crash from language dialog + +* Wed Sep 17 2008 Ray Strode - 1:2.23.92-8 +- canonicalize codeset to match output of locale -m +- filter duplicates from language list + +* Tue Sep 16 2008 Matthias Clasen - 1:2.23.92-7 +- Plug a few memory leaks + +* Tue Sep 16 2008 Ray Strode - 1:2.23.92-6 +- Use _XROOTPMAP_ID instead of _XSETROOT_ID + +* Tue Sep 16 2008 Ray Strode - 1:2.23.92-5 +- Save root window in XSETROOTID property for transition + +* Fri Sep 12 2008 Ray Strode - 1:2.23.92-4 +- Fix bug in last patch + +* Thu Sep 11 2008 Ray Strode - 1:2.23.92-3 +- Add hook to allow for plymouth transition + +* Tue Sep 9 2008 Jon McCann - 1:2.23.92-2 +- Disallow root login + +* Mon Sep 8 2008 Jon McCann - 1:2.23.92-1 +- Update to 2.23.92-1 + +* Thu Aug 28 2008 Jon McCann - 1:2.23.91-0.20080828.2 +- Update to non-broken snapshot + +* Thu Aug 28 2008 Jon McCann - 1:2.23.91-0.20080828.1 +- Update to snapshot + +* Mon Aug 25 2008 Jon McCann - 1:2.23.90-2 +- Add desktop file for metacity + +* Mon Aug 25 2008 Jon McCann - 1:2.23.90-1 +- Update to 2.23.90 + +* Thu Aug 14 2008 Behdad Esfahbod - 1:2.23.2-3 +- Add upstreamed patch gdm-2.23.2-unknown-lang.patch + +* Wed Aug 13 2008 Ray Strode - 1:2.23.2-2 +- Require plymouth-gdm-hooks so plymouth-log-viewer gets pulled + in on upgrades + +* Wed Jul 30 2008 Jon McCann - 1:2.23.2-1 +- Update to 2.23.2 + +* Mon Jul 28 2008 Jon McCann - 1:2.23.1.0.2008.07.28.1 +- Update to newer snapshot + +* Mon Jul 21 2008 Jon McCann - 1:2.23.1.0.2008.07.21.3 +- Update to newer snapshot + +* Mon Jul 21 2008 Jon McCann - 1:2.23.1.0.2008.07.21.2 +- Update to new snapshot + +* Mon Jul 21 2008 Jon McCann - 1:2.23.1.0.2008.07.21.1 +- Update to snapshot + +* Fri Jul 11 2008 Matthias Clasen - 1:2.22.0-12 +- Actually apply the patch + +* Thu Jul 10 2008 Matthias Clasen - 1:2.22.0-11 +- Fix some broken icons on the login screen + +* Thu Jul 10 2008 Matthias Clasen - 1:2.22.0-10 +- Improve rendering of languages + +* Thu Jul 3 2008 Jon McCann - 1:2.22.0-9 +- Check for a null filesystem type + +* Wed Jun 25 2008 Ray Strode - 1:2.22.0-8 +- After discussion with X team, turn tcp connections off by default, + but add back option to toggle on (bug 446672) + +* Wed Jun 25 2008 Ray Strode - 1:2.22.0-7 +- enable tcp connections by default + +* Thu May 8 2008 Matthias Clasen - 1:2.22.0-6 +- Add a GConf key to disable the user list + +* Mon May 5 2008 Matthias Clasen - 1:2.22.0-5 +- Autoreconf +- Bump rev + +* Mon May 5 2008 Matthias Clasen - 1:2.22.0-4 +- Add a keyboard chooser to the greeter + +* Sun May 4 2008 Matthias Clasen - 1:2.22.0-3 +- Fix source url + +* Fri May 1 2008 Jon McCann - 1:2.22.0-2 +- Retry tagging + +* Fri May 1 2008 Jon McCann - 1:2.22.0-1 +- Update to 2.22.0 +- Fix restarting when bus goes away + +* Thu May 1 2008 Ray Strode - 1:2.21.10-0.2008.05.01.1 +- ConsoleKit fixes +- Don't show session selector if only one session installed +- automatically pop up language/session selectors when using mnemonics + +* Tue Apr 29 2008 Jon McCann - 1:2.21.10-0.2008.04.29.2 +- Fix debugging +- Fix resetting slave after session migration +- Desensitize power buttons briefly after page switch +- Remove Users: label from greeter + +* Tue Apr 29 2008 Jon McCann - 1:2.21.10-0.2008.04.29.1 +- make transient greeter less transient to workaround spurious vt switch + +* Mon Apr 28 2008 Ray Strode - 1:2.21.10-0.2008.04.28.1 +- a11y improvements +- make "Suspend" desensitize properly when not-available +- make resize animation faster +- user switcher fixes + +* Fri Apr 18 2008 Ray Strode - 1:2.21.10-0.2008.04.18.2 +- Get Chinese back in language list + +* Fri Apr 18 2008 Ray Strode - 1:2.21.10-0.2008.04.18.1 +- start orca without main window +- add missing priorities for plugins +- add more failsafe lockdown + +* Wed Apr 16 2008 Ray Strode - 1:2.21.10-0.2008.04.16.1 +- Disable typeahead when asking for password so password can't get shown + in clear text (bug 442300) + +* Wed Apr 16 2008 Ray Strode - 1:2.21.10-0.2008.04.11.4 +- Use start-here instead of fedora-logo-icon to aid generic-logos + +* Fri Apr 11 2008 Matthias Clasen - 1:2.21.10-0.2008.04.11.3 +- Fix up the XKB workaround + +* Fri Apr 11 2008 Ray Strode - 1:2.21.10-0.2008.04.11.2 +- Fix security issue in last commit + +* Fri Apr 11 2008 Ray Strode - 1:2.21.10-0.2008.04.11.1 +- Fix focus handling when tabbing from user-chooser to buttons +- don't set real uid to user before setcred +- fix permissions on /var/run/gdm ... again + +* Thu Apr 10 2008 Matthias Clasen - 1:2.21.10-0.2008.04.08.4 +- Work around a XKB problem + +* Tue Apr 8 2008 Ray Strode - 1:2.21.10-0.2008.04.08.3 +- Language list was incomplete (bug 441613) + +* Tue Apr 8 2008 Ray Strode - 1:2.21.10-0.2008.04.08.2 +- Fix permissions on /var/run/gdm + +* Tue Apr 8 2008 Ray Strode - 1:2.21.10-0.2008.04.08.1 +- Install X auth cookies in /var/run/gdm instead of /tmp + +* Mon Apr 7 2008 Ray Strode - 1:2.21.10-0.2008.04.07.3 +- Disable image for automatic login and other user +- Act more sanely if gnome isn't installed + +* Mon Apr 7 2008 Ray Strode - 1:2.21.10-0.2008.04.07.2 +- Allow double-click to select language from list + +* Mon Apr 7 2008 Ray Strode - 1:2.21.10-0.2008.04.07.1 +- Make automatic login timer fade in +- No more checkboxes in user-switch applet + +* Sun Apr 6 2008 Ray Strode - 1:2.21.10-0.2008.04.06.1 +- Focus face browser after failed login attempt +- disable debug messages until 2.22.0 is released + +* Sat Apr 5 2008 Matthias Clasen - 1:2.21.10-0.2008.04.04.2 +- Improve handling of CK error messages + +* Sat Apr 5 2008 Ray Strode - 1:2.21.10-0.2008.04.04.1 +- Fix jump in animation for autologin +- Fix crash if LANG="somethingbogus" + +* Sat Apr 5 2008 Ray Strode - 1:2.21.10-0.2008.04.03.3 +- Fix crash when canceling autologin + +* Fri Apr 4 2008 Matthias Clasen - 1:2.21.10-0.2008.04.03.2 +- Uninstall gconf schemas before the files are gone + +* Thu Apr 3 2008 Ray Strode - 1:2.21.10-0.2008.04.03.1 +- Update to snapshot +- Improves shrink/grow animation of login window + +* Wed Apr 2 2008 Jon McCann - 1:2.21.10-0.2008.04.02.1 +- Update to snapshot + +* Mon Mar 31 2008 Matthias Clasen - 1:2.21.10-0.2008.03.26.4 +- Fix a directory ownership oversight + +* Wed Mar 26 2008 Jon McCann - 1:2.21.10-0.2008.03.26.3 +- Fix build due to #436349 + +* Wed Mar 26 2008 Jon McCann - 1:2.21.10-0.2008.03.26.2 +- Update to newer snapshot that includes more lockdown + +* Wed Mar 26 2008 Ray Strode - 1:2.21.10-0.2008.03.26.1 +- Update to snapshot +- Turn on profiling + +* Fri Mar 21 2008 Matthias Clasen - 1:2.21.10-0.2008.03.18.3 +- Don't require a theme we don't use + +* Wed Mar 19 2008 Ray Strode - 1:2.21.10-0.2008.03.18.2 +- Fix default path (bug 430187) + +* Tue Mar 18 2008 Jon McCann - 1:2.21.10-0.2008.03.18.1 +- Update to snapshot + +* Mon Mar 17 2008 Matthias Clasen - 1:2.21.9-5 +- Implement tooltips in the language selection dialog + +* Mon Mar 17 2008 Matthias Clasen - 1:2.21.9-4 +- Stop gvfs from using fuse in the sandbox session + +* Tue Mar 11 2008 Ray Strode - 1:2.21.9-3 +- remove duplication signal definition from bad patch merge + which led to crash for "Other" user + +* Mon Mar 10 2008 Jon McCann - 1:2.21.9-2 +- Fix case where we can't lookup a user. + +* Mon Mar 10 2008 Jon McCann - 1:2.21.9-1 +- Update to 2.21.9 + +* Mon Mar 10 2008 Ray Strode - 1:2.21.9-0.2008.03.10.2 +- Prevent some spurious wake ups caused by the + timed login timer animation + +* Mon Mar 10 2008 Ray Strode - 1:2.21.9-0.2008.03.10.1 +- Update to latest snapshot + +* Fri Mar 7 2008 David Woodhouse - 1:2.21.9-0.2008.02.29.3 +- Fix endianness breakage in signal pipes (#436333) + +* Mon Mar 3 2008 Ray Strode - 1:2.21.9-0.2008.02.29.2 +- Be more explicit in file list; use less globs +- Don't package user-switcher in both packages! + +* Fri Feb 29 2008 Ray Strode - 1:2.21.9-0.2008.02.29.1 +- Update to snapshot +- Split user-switcher out + +* Mon Feb 25 2008 Jon McCann - 1:2.21.8-1 +- Update to 2.21.8 + +* Tue Feb 12 2008 Jon McCann - 1:2.21.7-1 +- Update to 2.21.7 + +* Fri Feb 8 2008 Ray Strode - 1:2.21.7-0.2008.02.08.1 +- Update to snapshot + +* Wed Jan 30 2008 Jon McCann - 1:2.21.6-1 +- Update to 2.21.6 + +* Thu Jan 24 2008 Ray Strode - 1:2.21.5-2 +- add BuildRequires for iso-codes-devel + +* Fri Jan 18 2008 Jon McCann - 1:2.21.5-1 +- Update to 2.21.5 + +* Thu Jan 17 2008 Jon McCann - 1:2.21.2-0.2007.11.20.11 +- Rebuild + +* Mon Jan 15 2008 Dan Walsh - 1:2.21.2-0.2007.11.20.10 +- Fix gdm.pam file so that session include system-auth happens after other session setup + +* Mon Jan 7 2008 Ray Strode - 1:2.21.2-0.2007.11.20.9 +- hide guest account since it doesn't work + +* Fri Dec 21 2007 Ray Strode - 1:2.21.2-0.2007.11.20.8 +- Fix background (and other settings) + +* Wed Dec 19 2007 Ray Strode - 1:2.21.2-0.2007.11.20.7 +- Improve animation to be less jumpy + +* Fri Dec 14 2007 Ray Strode - 1:2.21.2-0.2007.11.20.6 +- Fix an uninitialized variable that makes the session list stop + growing before its finished sometimes + +* Thu Dec 13 2007 Ray Strode - 1:2.21.2-0.2007.11.20.5 +- add session chooser to login screen +- add hoaky animations + +* Fri Nov 30 2007 Matthias Clasen - 1:2.21.2-0.2007.11.20.4 +- Use the new "substack" support in pam to make keyring unlocking work + +* Tue Nov 20 2007 Ray Strode - 1:2.21.2-0.2007.11.20.3 +- use metacity for now + +* Tue Nov 20 2007 Ray Strode - 1:2.21.2-0.2007.11.20.2 +- Drop dont run profile patch since dwalsh changed /usr/sbin/gdm label + +* Tue Nov 20 2007 Ray Strode - 1:2.21.2-0.2007.11.20.1 +- Update to today's snapshot + +* Mon Nov 19 2007 Ray Strode - 1:2.21.2-0.2007.11.19.3 +- fix permissions on homedir + +* Mon Nov 19 2007 Ray Strode - 1:2.21.2-0.2007.11.19.2 +- move homedir to /var/lib/gdm + +* Mon Nov 19 2007 Ray Strode - 1:2.21.2-0.2007.11.19.1 +- Update to today's snapshot + +* Thu Nov 15 2007 Ray Strode - 1:2.21.2-0.2007.11.14.2 +- don't source /etc/profile at startup + +* Wed Nov 14 2007 Ray Strode - 1:2.21.2-0.2007.11.14.1 +- Update to today's snapshot + +* Fri Nov 9 2007 Ray Strode - 1:2.21.2-0.2007.11.09.1 +- Update to today's snapshot + +* Tue Oct 30 2007 Ray Strode - 1:2.21.1-0.2007.10.30.1 +- Update to today's snapshot + +* Tue Oct 23 2007 Ray Strode - 1:2.21.1-0.2007.10.23.1 +- Update to today's snapshot + +* Mon Oct 22 2007 Ray Strode - 1:2.21.1-0.2007.10.22.1 +- Add a snapshot gdm trunk, totally different unfinished ui... + +* Fri Oct 5 2007 Dan Walsh - 1:2.20.0-14 +- Added pam_selinux_permit and pam_namespace to gdm-pam + - This pam module allows user without a password to login when selinux is in enforcing mode +- Added pam_namespace to gdm-autologin-pam +- These changes were made to make it easier to setup the xguest user account + +* Tue Oct 3 2007 Alexander Larsson - 1:2.20.0-14 +- Fix up pam keyring integration to be what the latest version + of the docs says + +* Tue Oct 2 2007 Ray Strode - 1:2.20.0-13 +- Actually add said escape == cancel behavior back + +* Tue Oct 2 2007 Ray Strode - 1:2.20.0-12 +- Add escape == cancel behavior back + +* Mon Oct 1 2007 Matthias Clasen - 1:2.20.0-11 +- Fix a refcounting problem with user faces + +* Mon Oct 1 2007 Ray Strode - 1:2.20.0-10 +- apply upstream patch from Brady Anderson + to fix writing out .dmrc file when setting default language + (upstream bug 453916) + +* Fri Sep 28 2007 Ray Strode - 1:2.20.0-9 +- drop redhat-artwork dep, add fedorainfinity-gdm-theme dep + +* Fri Sep 28 2007 Ray Strode - 1:2.20.0-8 +- Another crack at 240853 + +* Fri Sep 28 2007 Matthias Clasen - 1:2.20.0-7 +- Fix the stupid bullets again + +* Thu Sep 27 2007 Ray Strode - 1:2.20.0-6 +- The previously mentioned typo didn't matter before because the + compiled in default matched what the config file was supposed to + say. This commit restores matched default behavior (bug 301031) + +* Thu Sep 27 2007 Ray Strode - 1:2.20.0-5 +- Fix an apparent typo in the securitytokens.conf config file + (bug 301031) + +* Thu Sep 20 2007 Matthias Clasen - 1:2.20.0-4 +- Reenable root login due to popular demand + +* Wed Sep 19 2007 Matthias Clasen - 1:2.20.0-3 +- Change default theme to FedoraInfinity + +* Wed Sep 19 2007 Matthias Clasen - 1:2.20.0-2 +- Fix a hang on restart (#240853) + +* Tue Sep 18 2007 Matthias Clasen - 1:2.20.0-1 +- Update to 2.20.0 + +* Wed Sep 12 2007 Ray Strode - 1:2.19.8-4 +- Change default password character back to circle instead of + asterisk (bug 287951) + +* Fri Sep 7 2007 Ray Strode - 1:2.19.8-3 +- rebuild --with-selinux + +* Fri Sep 7 2007 Ray Strode - 1:2.19.8-2 +- make things work better for xguest users (bug 254164) + +* Fri Sep 7 2007 Matthias Clasen - 1:2.19.8-1 +- Update to 2.19.8 + +* Tue Sep 4 2007 Matthias Clasen - 1:2.19.7-1 +- Update to 2.19.7 + +* Fri Aug 24 2007 Ray Strode - 1:2.19.6-5 +- use pam_selinux instead of home grown selinux code (bug 254164) + +* Wed Aug 22 2007 Kristian Høgsberg - 1:2.19.6-4 +- Pass -br to the default X server too. + +* Sat Aug 18 2007 Ray Strode - 1:2.19.6-3 +- disable root login (see "low-hanging fruit" discussion on + fedora-desktop-list) + +* Thu Aug 16 2007 Ray Strode - 1:2.19.6-2 +- disable type ahead in user list (bug 252991) + +* Wed Aug 15 2007 Matthias Clasen - 1:2.19.6-1 +- Update to 2.19.6 +- Use %%find_lang for help files + +* Sun Aug 12 2007 Adam Jackson 1:2.19.5-9 +- Remove the filereq on /etc/pam.d/system-auth, pam alone is sufficient. +- Bump the pam requirement to 0.99, 0.75 is ancient. + +* Sun Aug 12 2007 Matthias Clasen - 1:2.19.5-8 +- Make the previous fix actually work + +* Sun Aug 12 2007 Matthias Clasen - 1:2.19.5-7 +- Make gdmsetup work with consolehelper and pam again + +* Mon Aug 6 2007 Matthias Clasen - 1:2.19.5-6 +- Require gnome-keyring-pam + +* Mon Aug 6 2007 Ray Strode - 1:2.19.5-5 +- change previous patch to drop even more code + +* Mon Aug 6 2007 Ray Strode - 1:2.19.5-4 +- turn off dwellmouselistener if devices don't send core events. + don't warp pointer to stylus ever (upstream bug 457998) + +* Fri Aug 3 2007 Ray Strode - 1:2.19.5-3 +- remove dwellmouselistener module from default configuration. + It's pretty broken (bug 248752) + +* Fri Aug 3 2007 Matthias Clasen - 1:2.19.5-2 +- Update license field + +* Tue Jul 31 2007 Matthias Clasen - 1:2.19.5-1 +- Update to 2.19.5 + +* Mon Jul 30 2007 Matthias Clasen - 1:2.19.4-2 +- Add optional gnome-keyring support to the gdm pam stack + +* Tue Jul 10 2007 Ray Strode - 1:2.19.4-1 +- Update to 2.19.4 + +* Wed Jun 27 2007 Ray Strode - 1:2.19.3-3 +- set Browser=true by default + +* Wed Jun 27 2007 Matthias Clasen - 1:2.19.3-2 +- Drop an unnecessary file dependency + +* Mon Jun 18 2007 Ray Strode - 1:2.19.3-1 +- Update to 2.19.3 + +* Tue Jun 5 2007 Matthias Clasen - 1:2.19.2-1 +- Update to 2.19.2 + +* Mon May 21 2007 Matthias Clasen - 1:2.19.1-1 +- Update to 2.19.1 + +* Tue May 15 2007 Ray Strode - 1:2.18.0-14 +- hide users from userlist that have disabled shells + (bug 240148) + +* Thu May 10 2007 Matthias Clasen - 1:2.18.0-13 +- Follow packaging guidelines for scrollkeeper dependencies + +* Mon May 7 2007 Ray Strode - 1:2.18.0-12 +- reenable utmp logging (bug 209537) + +* Tue Apr 17 2007 Ray Strode - 1:2.18.0-11 +- Be more verbose to help isolate the problem in bug 234567 + +* Thu Apr 12 2007 Ray Strode - 1:2.18.0-10 +- add "Default" session back to the sessions menu (bug 234218) + +* Thu Apr 5 2007 Ray Strode - 1:2.18.0-9 +- don't expect utf-8 usernames for plain greeter face browser + either. + +* Thu Apr 5 2007 Ray Strode - 1:2.18.0-8 +- don't expect utf-8 usernames for face browser (bug 235351). + +* Thu Mar 29 2007 Ray Strode - 1:2.18.0-7 +- don't strcpy overlapping strings (bug 208181). + +* Tue Mar 27 2007 Matthias Clasen - 1:2.18.0-6 +- Hide gdmphotosetup by default, since About Me does the same + +* Tue Mar 20 2007 Ray Strode - 1:2.18.0-5 +- add fix to allow themes to cope with low resolution modes + better (bug 232672) + +* Mon Mar 19 2007 Ray Strode - 1:2.18.0-4 +- update and reenable security token patch + +* Mon Mar 19 2007 David Zeuthen - 1:2.18.0-3 +- Also pass AT's to the session from the plain greeter (#232518) +- New faces including new subpackage gdm-extra-faces + +* Tue Mar 13 2007 David Zeuthen - 1:2.18.0-2 +- Update to upstream release 2.18.0 +- Switch default theme to FedoraFlyingHigh and show /etc/passwd users +- Fix accessibility in the themed greeter (GNOME #412576) +- Enable accessible login, make sure gdm can access devices and + pass activated AT's to the login session (#229912) +- Disable smart card login for now as patch doesn't apply anymore + +* Fri Mar 9 2007 Ray Strode - 1:2.17.8-3 +- hide langauges that aren't displayable from the list (bug 206048) + +* Tue Mar 6 2007 Ray Strode - 1:2.17.8-2 +- turn off pam sanity check because it conflicts with audit + +* Wed Feb 28 2007 Matthias Clasen - 1:2.17.8-1 +- Update to 2.17.8 + +* Sat Feb 24 2007 Matthias Clasen - 1:2.17.7-5 +- Fix keynav in the face browser + +* Fri Feb 23 2007 David Zeuthen - 1:2.17.7-4 +- Add some enhancements to the greeter (bgo #411427) + +* Fri Feb 23 2007 Ray Strode - 1:2.17.7-3 +- Update to 2.17.7 + +* Fri Feb 23 2007 Matthias Clasen - 1:2.17.7-2 +- Don't own /usr/share/icons/hicolor +- Install all desktop files + +* Mon Feb 12 2007 Matthias Clasen - 1:2.17.7-1 +- try to update to 2.17.7 +- Drop upstreamed patches + +* Mon Feb 12 2007 Matthias Clasen - 1:2.17.6-4 +- Reuse existing sessions without asking +- Don't show failsafe sessions + +* Sat Feb 10 2007 Matthias Clasen - 1:2.17.6-3 +- Fix a problem with the ConsoleKit support + +* Tue Feb 6 2007 Matthias Clasen - 1:2.17.6-2 +- Apply a patch to improve fast user switching experience + +* Tue Jan 23 2007 Matthias Clasen - 1:2.17.6-1 +- Update to 2.17.6 + +* Sat Jan 13 2007 Matthias Clasen - 1:2.17.5-2 +- Enable ConsoleKit support + +* Thu Jan 11 2007 Matthias Clasen - 1:2.17.5-1 +- Update to 2.17.5 + +* Fri Dec 15 2006 Matthias Clasen - 1:2.17.4-1 +- Update to 2.17.4, which fixes CVE-2006-6105 + +* Tue Dec 5 2006 Matthias Clasen - 1:2.17.3-1 +- Update to 2.17.3 +- Update some patches + +* Tue Nov 7 2006 Matthias Clasen - 1:2.17.2-1 +- Update to 2.17.2 + +* Sun Nov 5 2006 Matthias Clasen - 1:2.17.1-1 +- Update to 2.17.1 + +* Thu Oct 26 2006 Matthias Clasen - 1:2.17.0-2 +- Fix a crash with launching a11y support + +* Sun Oct 22 2006 Matthias Clasen - 1:2.17.0-1 +- Update to 2.17.0 + +* Tue Oct 17 2006 Matthias Clasen - 1:2.16.0-17 +- Make photosetup help button work (#198138) + +* Sun Oct 15 2006 Ray Strode - 1:2.16.0-16.fc7 +- don't log canceled pam conversations as failed login attempts + +* Sun Oct 15 2006 Ray Strode - 1:2.16.0-15.fc7 +- Prefer modules in secmod db over hardcoded coolkey path + +* Sat Oct 14 2006 Ray Strode - 1:2.16.0-14.fc7 +- have security token monitor helper process kill itself when + the communication pipe to the main process goes away (bug 210677). + +* Wed Oct 10 2006 Ray Strode - 1:2.16.0-13.fc6 +- desensitize entry fields until pam asks for input, so if pam + doesn't initially ask for input (like in smart card required mode) + the user can't type something and confuse gdm (bug 201344) + +* Fri Oct 6 2006 Ray Strode - 1:2.16.0-12.fc6 +- invoke standard X server with -br option to ensure we get a + black root on startup + +* Thu Oct 5 2006 Ray Strode - 1:2.16.0-11.fc6 +- make monitoring code more reliable (bug 208018) + +* Wed Sep 27 2006 Matthias Clasen - 1:2.16.0-10.fc6 +- Fix small issues in gdmsetup (#208225) + +* Wed Sep 27 2006 Matthias Clasen - 1:2.16.0-9.fc6 +- Fix a problem with the display of the FedoraDNA theme + in gdmsetup + +* Tue Sep 19 2006 Ray Strode - 1:2.16.0-8.fc6 +- Add as_IN, si_LK to language list (bug 203917) + +* Mon Sep 18 2006 Ray Strode - 1:2.16.0-7.fc6 +- fix a problem recently introduced in the smart card forking + code + +* Mon Sep 18 2006 Ray Strode - 1:2.16.0-6.fc6 +- fix a problem recently introduced in the smart card driver + loading code (bug 206882) + +* Thu Sep 14 2006 Ray Strode - 1:2.16.0-5.fc6 +- don't leak pipe fds (bug 206709) + +* Thu Sep 14 2006 Ray Strode - 1:2.16.0-4.fc6 +- update security token patch to not poll + +* Fri Sep 8 2006 Jesse Keating - 1:2.16.0-3.fc6 +- Apply correct defaults patch + +* Thu Sep 7 2006 Matthias Clasen - 1:2.16.0-2.fc6 +- Change the default theme to FedoraDNA +- Bump redhat-artwork requirement + +* Tue Sep 5 2006 Matthias Clasen - 1:2.16.0-1.fc6 +- Update to 2.16.0 + +* Sat Aug 26 2006 Karsten Hopp - 1:2.15.10-2.fc6 +- buildrequire inttools as this isn't a requirement of scrollkeeper anymore + and thus missing from the buildroot + +* Mon Aug 21 2006 Matthias Clasen - 1:2.15.10-1.fc6 +- Update to 2.15.10 +- Drop upstreamed patch + +* Fri Aug 4 2006 Ray Strode - 1:2.15.9-1 +- update to 2.15.9 + +* Fri Aug 4 2006 Ray Strode - 1:2.15.7-2 +- update gdmsetup pam file to use config-util stacks + +* Thu Aug 3 2006 Ray Strode - 1:2.15.7-1 +- update to 2.15.7 +- drop selinux patch that I don't think was ever finished + +* Thu Aug 3 2006 Ray Strode - 1:2.15.6-14 +- fix face browser + (http://bugzilla.gnome.org/show_bug.cgi?id=349640) +- fix error message reporting + (http://bugzilla.gnome.org/show_bug.cgi?id=349758) + +* Fri Jul 21 2006 Ray Strode - 1:2.15.6-13 +- simply all the security token code by only using one pam stack +- drop lame kill on token removal feature + +* Fri Jul 21 2006 Ray Strode - 1:2.15.6-12 +- move authcookies out of home directories to prevent problems + on nfs/afs mounted home directories (bug 178233). + +* Fri Jul 21 2006 Ray Strode - 1:2.15.6-11 +- really fix annoying dialog problem mentioned in 2.15.6-6 + +* Wed Jul 19 2006 Ray Strode - 1:2.15.6-10 +- center cursor on xinerama head (bug 180085) + +* Tue Jul 18 2006 Ray Strode - 1:2.15.6-9 +- add "kill all sessions on token removal" feature + +* Tue Jul 18 2006 Ray Strode - 1:2.15.6-8 +- reenable session keyring support in pam module (bug 198629) + +* Mon Jul 17 2006 Ray Strode - 1:2.15.6-7 +- make security token support use its own config file in + preparation for modularizing it. + +* Mon Jul 17 2006 Ray Strode - 1:2.15.6-6 +- fix off-by-one in the process-all-ops patch that was causing + an anoying dialog to pop up on each login + +* Sun Jul 16 2006 Ray Strode - 1:2.15.6-5 +- add initial wtmp and btmp logging support + +* Fri Jul 14 2006 Ray Strode - 1:2.15.6-4 +- fix bug in security token support + +* Fri Jul 14 2006 Ray Strode - 1:2.15.6-3 +- fix hang in gdmsetup + +* Fri Jul 14 2006 Ray Strode - 1:2.15.6-2 +- put new pam module at top of stack (bug 198629) + +* Wed Jul 12 2006 Ray Strode - 1:2.15.6-1 +- Update to 2.15.6 + +* Wed Jul 12 2006 Ray Strode - 1:2.15.5-4 +- add new pam module to pam files to support kernel session keyring + +* Wed Jul 12 2006 Jesse Keating - 1:2.15.5-3.1 +- rebuild + +* Tue Jul 11 2006 Ray Strode 1:2.15.5-3 +- add initial support for smart card security tokens + +* Fri Jul 7 2006 Ray Strode 1:2.15.5-2 +- add patch to process all operations when more than one comes + in really quickly +- move default "Please enter your username" message to the + greeter instead of the slave so that it doesn't get stacked if + a pam module has a non default message +- add new message for reseting the current login operation + (like the cancel button does, but accessible via the gdm fifo) + +* Tue Jun 13 2006 Matthias Clasen 1:2.15.5-1 +- Update to 2.15.5 + +* Mon Jun 12 2006 Bill Nottingham 1:2.15.3-8 +- replace automake14 buildreq with automake + +* Thu Jun 8 2006 Ray Strode 1:2.15.3-7 +- fix CVE-2006-2452 + +* Wed Jun 7 2006 Jeremy Katz - 1:2.15.3-6 +- buildrequire the server so that we get the path right in the config file + +* Tue Jun 06 2006 Karsten Hopp 1:2.15.3-5 +- buildrequire libdmx-devel + +* Mon Jun 5 2006 Matthias Clasen - 1:2.15.3-4 +- Require system-logos, not fedora-logos + +* Tue May 23 2006 Ray Strode - 1:2.15.3-3 +- Support xdm -nodaemon option (bug 192461) + +* Mon May 22 2006 Matthias Clasen - 1:2.15.3-2 +- Add missing BuildRequires (#192494) + +* Wed May 17 2006 Matthias Clasen - 1:2.15.3-1 +- Update to 2.15.3 + +* Wed May 10 2006 Matthias Clasen - 1:2.15.0-1 +- Update to 2.15.0 + +* Wed Apr 26 2006 Matthias Clasen - 1:2.14.4-2 +- Update to 2.14.4 + +* Wed Apr 12 2006 Ray Strode - 1:2.14.1-4 +- fix libexecdir substitution problem in configuration file + +* Tue Apr 11 2006 Ray Strode - 1:2.14.1-3 +- Add gdmthemetester.in to the mix (upstream bug 338079) + +* Tue Apr 11 2006 Matthias Clasen - 1:2.14.1-2 +- Update to 2.14.1 + +* Mon Mar 13 2006 Ray Strode - 1:2.14.0-1 +- Update to 2.14.0 + +* Tue Mar 7 2006 Ray Strode - 1:2.13.0.9-4 +- Follow Solaris's lead and default to AlwaysRestartServer=True + (may work around bug 182957) + +* Mon Mar 6 2006 Ray Strode - 1:2.13.0.9-3 +- migrate users with baseXsession=/etc/X11/gdm/Xsession to + /etc/X11/xinit/Xsession + +* Mon Mar 6 2006 Ray Strode - 1:2.13.0.9-2 +- disable sounds completely when disabled in configuration file + (upstream bug 333435) + +* Tue Feb 28 2006 Ray Strode - 1:2.13.0.9-1 +- Update to 2.13.0.9 +- Use new %%post section, written by + Michal Jaegermann (bug 183082) + +* Sat Feb 25 2006 Ray Strode - 1:2.13.0.8-6 +- fix a broken link + +* Fri Feb 24 2006 Ray Strode - 1:2.13.0.8-5 +- change some /etc/X11 bits in the spec file to /etc + +* Sun Feb 19 2006 Ray Strode - 1:2.13.0.8-3 +- add server entry for accel-indirect branch of xorg + +* Wed Feb 15 2006 Ray and Matthias - 1:2.13.0.8-2 +- malloc memory that is later freed + +* Mon Feb 13 2006 Ray Strode - 1:2.13.0.8-1 +- update to 2.13.0.8 + +* Mon Feb 13 2006 Ray Strode - 1:2.13.0.7.0.2006.02.12-2 +- migrate custom.conf settings with /etc/X11/gdm to /etc/gdm + +* Sun Feb 12 2006 Ray Strode - 1:2.13.0.7.0.2006.02.12-1 +- update to cvs snapshot +- move gdm to /etc instead of /etc/X11 +- move custom gdm.conf to sysconfdir instead of symlinking from + datadir (bug 180364) + +* Fri Feb 10 2006 Jesse Keating - 1:2.13.0.7-2.1 +- bump again for double-long bug on ppc(64) + +* Thu Feb 9 2006 Matthias Clasen - 2.13.0.7-2 +- Make gdmsetup use consolehelper +- Don't use deprecated pam_stack + +* Tue Feb 07 2006 Jesse Keating - 1:2.13.0.7-1.1 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Tue Jan 31 2006 Ray Strode - 1:2.13.0.7-1 +- update to 2.13.0.7 + +* Mon Jan 30 2006 Bill Nottingham +- silence gdm-safe-restart + +* Thu Jan 19 2006 Ray Strode - 1:2.13.0.5-7 +- sed -ie isn't the same as sed -i -e (we want the latter) + +* Wed Jan 18 2006 Christopher Aillon - 1:2.13.0.5-6 +- Add patch to fix clock to default to 24h in locales that expect it (175453) + +* Tue Jan 17 2006 Ray Strode - 1:2.13.0.5-1 +- update to 2.13.0.5 (bug 178099) + +* Tue Jan 17 2006 Ray Strode - 1:2.13.0.4-5 +- add new theme by Diana Fong, Máirín Duffy, and me + +* Mon Jan 16 2006 Ray Strode - 1:2.13.0.4-4 +- improve migration snippet (bug 177443). + +* Fri Jan 13 2006 Ray Strode - 1:2.13.0.4-3 +- migrate X server configuration for pre-modular X configurations. + Problems reported by Dennis Gregorovic + +* Mon Jan 9 2006 Ray Strode - 1:2.13.0.4-2 +- use xinit Xsession again. + +* Mon Jan 9 2006 Ray Strode - 1:2.13.0.4-1 +- update to 2.13.0.4 + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Mon Nov 16 2005 Ray Strode - 1:2.8.0.4-13 +- Don't fallback to xsm, try gnome-session instead +- Require xorg-x11-xinit + +* Mon Nov 14 2005 Ray Strode - 1:2.8.0.4-12 +- Make sure that dbus-launch gets called if available + +* Mon Nov 14 2005 Ray Strode - 1:2.8.0.4-11 +- Don't use X session / setup files anymore. +- Don't install early login init scripts +- remove xsri dependency +- don't prune language lists anymore + +* Sun Nov 13 2005 Jeremy Katz - 1:2.8.0.4-10 +- also fix default xsession for where its moved in modular X + +* Sun Nov 13 2005 Jeremy Katz - 1:2.8.0.4-9 +- change requirements for modular X +- patch to find x server with modular X + +* Thu Oct 20 2005 Ray Strode 1:2.8.0.4-8 +- redhat-artwork was busted, require new version + +* Tue Oct 18 2005 Ray Strode 1:2.8.0.4-7 +- zero-initialize message buffer, + bug fixed by Josh Parson (jbparsons@usdavis.edu) (bug 160603) +- fix typo in redhat-artwork requires line + +* Mon Oct 17 2005 Steve Grubb 1:2.8.0.4-6 +- add login audit patch (bug 170569) + +* Mon Oct 17 2005 Ray Strode 1:2.8.0.4-5 +- bump redhat-artwork requirement to get rid of the boot + throbber for now, since it seems to have reappeared + mysteriously (bug 171025) +p +* Thu Oct 13 2005 Dan Walsh 1:2.8.0.4-4 +- Change to use getseuserbyname + +* Thu Sep 28 2005 Dan Walsh 1:2.8.0.4-3 +- Fix selinux not to fail when in permissive mode + +* Thu Sep 27 2005 Ray Strode 1:2.8.0.4-2 +- remove flexiserver from menus + +* Thu Sep 8 2005 Ray Strode 1:2.8.0.4-1 +- update to 2.8.0.4 + +* Tue Sep 6 2005 Ray Strode 1:2.8.0.2-4 +- Apply clean up patch from Steve Grubb (gnome bug 315388). + +* Tue Aug 30 2005 Ray Strode 1:2.8.0.2-3 +- Prune language list of installed languages +- Make config file noreplace again (bug 167087). + +* Sat Aug 20 2005 Ray Strode 1:2.8.0.2-2 +- hide throbber + +* Fri Aug 19 2005 Ray Strode 1:2.8.0.2-1 +- update to 2.8.0.2 +- disable early login stuff temporarily + +* Thu Aug 18 2005 Ray Strode 1:2.6.0.8-18 +- rebuild + +* Wed Aug 10 2005 Ray Strode 1:2.6.0.8-17 +- Prune uninstalled languages from language list. + +* Mon May 23 2005 Ray Strode 1:2.6.0.8-16 +- Make sure username/password incorrect message gets displayed + (bug 158127). +- reread system locale before starting gdm in early login mode + (bug 158376). + +* Thu May 19 2005 Ray Strode 1:2.6.0.8-15 +- Take out some syslog spew (bug 157711). + +* Thu May 12 2005 Ray Strode 1:2.6.0.8-14 +- Fix processing of new-line characters that got broken + in 2.6.0.8-11 (bug 157442). + +* Tue May 3 2005 Ray Strode 1:2.6.0.8-12 +- Fix processing of non-ascii characters that got broken + in 2.6.0.8-11, found by Miloslav Trmac , + (bug 156590). + +* Thu Apr 28 2005 Ray Strode 1:2.6.0.8-11 +- Fix halt command (bug 156299) +- Process all messages sent to the greeter in a read, not just + the first + +* Wed Apr 27 2005 Jeremy Katz - 1:2.6.0.8-10 +- silence %%postun + +* Tue Apr 26 2005 Ray Strode 1:2.6.0.8-9 +- Change default standard greeter theme to clearlooks and + default graphical greeter theme to Bluecurve specifically. + +- Change default path values (bug 154280) + +* Mon Apr 25 2005 Matthias Clasen 1:2.6.0.8-8 +- for early-login, delay XDMCP initialization until allow-login + +* Sun Apr 24 2005 Ray Strode 1:2.6.0.8-7 +- calling gdm_debug and g_strdup_printf from signal handlers are + bad news (Spotted by Mark McLoughlin ). + +* Tue Apr 19 2005 Matthias Clasen 1:2.6.0.8-6 +- Add a throbber for early login + +* Mon Apr 18 2005 Ray Strode 1:2.6.0.8-5 +- Don't install gnome.desktop to /usr/share/xsessions (bug 145791) + +* Thu Apr 14 2005 Matthias Clasen 1:2.6.0.8-4 +- Don't do early-login if firstboot is going to run +- Make early-login work with timed and automatic logins + +* Wed Apr 13 2005 Ray Strode 1:2.6.0.8-3 +- Don't hard code dpi setting to 96.0, but instead look at + Xft.dpi + +* Wed Apr 13 2005 Ray Strode 1:2.6.0.8-2 +- touch /var/lock/subsys/gdm-early-login so gdm gets killed on + runlevel changes (bug 154414) +- don't try to use system dpi settings for canvas text (bug 127532) +- merge resource database from displays other than :0 + +* Sat Apr 2 2005 Ray Strode 1:2.6.0.8-1 +- update to 2.6.0.8 +- add new init scripts to support early-login mode + +* Tue Mar 29 2005 Ray Strode 1:2.6.0.7-8 +- Add a --wait-for-bootup cmdline option. + +* Mon Mar 28 2005 Christopher Aillon +- rebuilt + +* Fri Mar 25 2005 Christopher Aillon 1:2.6.0.7-6 +- Update the GTK+ theme icon cache on (un)install + +* Fri Mar 11 2005 Alexandre Oliva 1:2.6.0.7-5 +- fix patch for bug 149899 (fixes bug 150745) + +* Wed Mar 09 2005 Than Ngo 1:2.6.0.7-4 +- add OnlyShowIn=GNOME; + +* Mon Feb 28 2005 Ray Strode 1:2.6.0.7-3 +- seteuid/egid as user before testing for presence of + user's home directory (fixes bug 149899) + +* Thu Feb 10 2005 Ray Strode 1:2.6.0.7-2 +- Turn off "switchdesk" mode by default which accidentally got + turned on by default in 2.6.0.5-4 + +* Wed Feb 2 2005 Matthias Clasen 1:2.6.0.7-1 +- Update to 2.6.0.7 + +* Tue Jan 25 2005 Ray Strode 1:2.6.0.5-11 +- Fix bug in greeter sort-session-list patch where selecting + a session did nothing (bug 145626) + +* Thu Dec 9 2004 Dan Walsh 1:2.6.0.5-10 +- Remove pam_selinux from gdmsetup pam file + +* Wed Dec 1 2004 Ray Strode 1:2.6.0.5-9 +- Look up and use username instead of assuming that user entered + login is cannonical. Patch from + Mike Patnode (fixes bug 141380). + +* Thu Nov 11 2004 Ray Strode 1:2.6.0.5-8 +- Sort session list so that default session comes out on top + (fixes bug 107324) + +* Wed Nov 10 2004 Ray Strode 1:2.6.0.5-7 +- Make desktop file symlink instead of absolute (bug 104390) +- Add flexiserver back to menus + +* Wed Oct 20 2004 Ray Strode 1:2.6.0.5-6 +- Clean up xses if the session was successfullly completed. + (fixes bug #136382) + +* Tue Oct 19 2004 Ray Strode 1:2.6.0.5-5 +- Prefer nb_NO over no_NO for Norwegian (fixes bug #136033) + +* Thu Oct 7 2004 Alexander Larsson - 1:2.6.0.5-4 +- Change default greeter theme to "Default", require + redhat-artwork with Default symlink. + +* Wed Sep 29 2004 Ray Strode 1:2.6.0.5-3 +- Check if there is a selected node before using iterator. + (fixes bug #133329). + +* Fri Sep 24 2004 Ray Strode 1:2.6.0.5-2 +- Don't mess with gdmphotosetup categories. Upstream categories + are fine. + +* Mon Sep 20 2004 Ray Strode 1:2.6.0.5-1 +- update to 2.6.0.5 + +* Tue Aug 3 2004 Matthias Clasen 1:2.6.0.3-5 +- fix messed up changelog + +* Tue Aug 3 2004 Matthias Clasen 1:2.6.0.3-4 +- rebuilt + +* Thu Aug 2 2004 Ray Strode 1:2.6.0.3-3 +- rebuilt + +* Mon Jul 26 2004 Bill Nottingham 1:2.6.0.3-2 +- fix theme (#128599) + +* Thu Jun 17 2004 Ray Strode 1:2.6.0.3-1 +- update to 2.6.0.3 (fixes bug #117677) + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Fri May 21 2004 Matthias Clasen 1:2.6.0.0-5 +- rebuild + +* Mon May 17 2004 Than Ngo 1:2.6.0.0-4 +- add patch to build gdm-binary with PIE + +* Thu Apr 22 2004 Mark McLoughlin - 1:2.6.0.0-3 +- Update the "use switchdesk" message to only be display when + switchdesk-gui is installed and to not reference a non existant + menu item (bug #121460) + +* Fri Apr 2 2004 Colin Walters 1:2.6.0.0-2 +- Always put session errors in /tmp, in preparation for + completely preventing gdm from writing to /home/ + +* Thu Apr 1 2004 Alex Larsson 1:2.6.0.0-1 +- update to 2.6.0.0 + +* Tue Mar 16 2004 Dan Walsh 1:2.5.90.3-1 +- Use selinux patch again + +* Tue Mar 16 2004 Dan Walsh 1:2.5.90.3-1 +- Stop using selinux patch and use pam_selinux instead. + +* Wed Mar 10 2004 Alex Larsson 1:2.5.90.2-1 +- update to 2.5.90.2 + +* Tue Mar 02 2004 Elliot Lee +- rebuilt + +* Thu Feb 26 2004 Alexander Larsson 1:2.5.90.1-1 +- update to 2.5.90.1 + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Tue Feb 03 2004 Warren Togami 1:2.4.4.5-9 +- add two lines to match upstream CVS to xdmcp_sessions.patch + Fully resolves #110315 and #113154 + +* Sun Feb 01 2004 Warren Togami 1:2.4.4.5-8 +- patch30 xdmcp_session counter fix from gdm-2.5.90.0 #110315 +- automake14 really needed, not automake +- BR libcroco-devel, libcroco-devel, libattr-devel, gettext +- conditionally BR libselinux-devel +- explicit epoch in all deps +- make the ja.po time format change with a sed expression rather than + overwriting the whole file (Petersen #113995) + +* Thu Jan 29 2004 Jeremy Katz - 1:2.4.4.5-7 +- fix build with current auto* + +* Tue Jan 27 2004 Jeremy Katz 1:2.4.4.5-5 +- try a simple rebuild for libcroco abi change + +* Mon Jan 26 2004 Dan Walsh 1:2.4.4.5-4 +- Fix call to is_selinux_enabled + +* Fri Jan 16 2004 Dan Walsh 1:2.4.4.5-3 +- Use /sbin/reboot and /sbin/poweroff instead of consolehelper version + +* Thu Oct 30 2003 Dan Walsh 1:2.4.4.5-2.sel +- turn on SELinux + +* Mon Oct 20 2003 Jonathan Blandford 2:2.4.4.5-1 +- get rid of the teal + +* Fri Oct 17 2003 Jonathan Blandford 1:2.4.4.5-1 +- new version + +* Thu Oct 9 2003 Jonathan Blandford 1:2.4.4.3-6.sel +- new patch from George to fix #106189 +- change bg color in rhdefaults patch +- turn off SELinux + +* Thu Oct 8 2003 Dan Walsh 1:2.4.4.3-6.sel +- turn on SELinux + +* Tue Oct 7 2003 Alexander Larsson 1:2.4.4.3-5 +- Fix greeter line-breaking crash (rest of #106189) + +* Tue Oct 7 2003 Alexander Larsson 1:2.4.4.3-4 +- Set the BaseXSession properly in the config. +- This fixes parts of bug #106189 + +* Mon Oct 6 2003 Havoc Pennington 1:2.4.4.3-3 +- change DefaultSession=Default.desktop to DefaultSession=default.desktop +- SELinux off again + +* Fri Oct 3 2003 Dan Walsh 1:2.4.4.3-2.sel +- turn on SELinux + +* Thu Oct 2 2003 Havoc Pennington 1:2.4.4.3-1 +- 2.4.4.3 +- --without-selinux for now, since libselinux not in the buildroot + +* Mon Sep 8 2003 Dan Walsh 1:2.4.4.0-4 +- turn off SELinux + +* Fri Sep 5 2003 Dan Walsh 1:2.4.4.0-3.sel +- turn on SELinux + +* Thu Sep 4 2003 Alexander Larsson 1:2.4.4.0-2 +- Use the right default session (#103546) + +* Wed Sep 3 2003 Alexander Larsson 1:2.4.4.0-1 +- update to 2.4.4.0 +- update to georges new selinux patch + +* Fri Aug 29 2003 Elliot Lee 1:2.4.2.102-2 +- Remove scrollkeeper files + +* Tue Aug 26 2003 George Lebl 1:2.4.2.102-1 +- updated to 2.4.2.102 +- removed outdated patches +- Use Xsetup_0 only for :0 since that's the way it works + for xdm +- remove the gnome.desktop file, its going into gnome-session + +* Thu Aug 14 2003 Havoc Pennington 1:2.4.1.6-1 +- update to latest bugfix version on george's advice +- remove setlocale patch that's upstream +- remove console setup patches that are upstream + +* Thu Jun 12 2003 Dan Walsh 2.4.1.3-9 +- Port to SELinux + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Tue Jun 3 2003 Jeff Johnson +- add explicit epoch's where needed. + +* Sun May 04 2003 Florian La Roche +- fix post: localstatedir -> _localstatedir + +* Thu May 1 2003 Havoc Pennington 1:2.4.1.3-6 +- enable UTF-8 for CJK + +* Mon Feb 24 2003 Elliot Lee +- debuginfo rebuild + +* Thu Feb 20 2003 Owen Taylor +- Run the error dialogs under /bin/sh --login, so we + get lang.sh, and thus unicode_start running. Fixes + the X-doesn't-start dialog showing up as random + blinking characters. + +* Fri Feb 14 2003 Havoc Pennington 1:2.4.1.3-2 +- nuke buildreq Xft + +* Wed Feb 5 2003 Havoc Pennington 1:2.4.1.3-1 +- upgrade to 2.4.1.3 + +* Mon Feb 3 2003 Matt Wilson 1:2.4.1.1-6 +- added gdm-2.4.1.1-64bit.patch to fix 64 bit crash in cookie + generation (#83334) + +* Mon Feb 3 2003 Owen Taylor +- Add patch to fix problem where setting LC_COLLATE=C would give LC_MESSAGES=wa_BE (#82019) + +* Thu Jan 30 2003 Matt Wilson 1:2.4.1.1-3 +- fix pam.d entry, pam_env wasn't properly patched +- disable optimizations on x86_64 to work around gcc bug + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Mon Jan 20 2003 Owen Taylor +- Upgrade to 2.4.1.1 (Fixes #81907) +- Redirect stdout of kill to /dev/null (#80814) + +* Thu Jan 9 2003 Havoc Pennington +- 2.4.1.0 +- add patch from george to ask "are you sure?" for shutdown/reboot since it's now just one click away + +* Thu Dec 19 2002 Havoc Pennington +- 2.4.0.12 +- update new patch for no-utf8-in-cjk +- drop patch to photo setup, now upstream +- drop confdocs patch now upstream +- move all the gdm.conf changes into single "rhconfig" patch +- remove "sid-fix" patch now upstream + +* Mon Nov 11 2002 Nalin Dahyabhai 2.4.0.7-14 +- remove the directory part of module specifications from the PAM config files, + allowing the same PAM config to work for either arch on multilib boxes + +* Thu Sep 5 2002 Owen Taylor +- Change zh_CN entry in language menu to zh_CN.GB18030 + +* Thu Sep 5 2002 Akira TAGOH 2.4.0.7-12 +- copied gdm-ja.po to ja.po. + +* Mon Sep 2 2002 Owen Taylor +- Fix problem where gdm was opening ~/.xsession-errors itself to bad effect + +* Sat Aug 31 2002 Havoc Pennington +- include ja.po with new date format + +* Wed Aug 28 2002 Havoc Pennington +- remove noreplace on gdm.conf #71309 +- make gnome-gdmsetup absolute, #72910 + +* Wed Aug 28 2002 Havoc Pennington +- put /usr/X11R6/bin in path for now fixes #72781 +- use proper i18n algorithm for word wrap, #71937 +- remove greek text from language picker due to lack + of greek font +- reorder PAM config file #72657 + +* Wed Aug 28 2002 Havoc Pennington +- improve gdmsetup icon +- remove GNOME session, we will instead put it in gnome-session +- apply patch from george to make gdmphotosetup file selector + work + +* Mon Aug 26 2002 Elliot Lee 2.4.0.7-6 +- Patches for #64902, #66486, #68483, #71308 +- post-install script changes from the gdm.spec mentioned in #70965 +- noreplace on gdm.conf for #71309 + +* Sun Aug 25 2002 Havoc Pennington +- put in a patch from george to fix some setsid()/kill() confusion + possibly fixing #72295 +- turn off UseCirclesInEntry for now, fixes #72433 + +* Tue Aug 20 2002 Alexander Larsson +- Set UseCirclesInEntry to true in config + +* Thu Aug 15 2002 Havoc Pennington +- rename Gnome session to GNOME, this was just bugging me + +* Thu Aug 8 2002 Havoc Pennington +- 2.4.0.7 with bugfixes George kindly did for me, + including mnemonics for the graphical greeter +- use Wonderland gtk theme for the nongraphical greeter +- remove patches that are now upstream + +* Tue Jul 30 2002 Havoc Pennington +- update rhconfig patch +- use pam_timestamp for the config tool +- link to a desktop file in redhat-menus +- update .gnome2 patch, filed upstream bug +- 2.4.0.4 +- rebuild with new gail, librsvg2 + +* Tue Jun 25 2002 Owen Taylor +- Require redhat-artwork, make the default greeter theme Wonderland +- Look for all configuration in .gnome2 not .gnome. This avoids problems + with changes in the set of session/lang. +- Remove English from locale.alias, make most locales UTF-8 +- Call find_lang with the right name + +* Sun Jun 16 2002 Havoc Pennington +- rebuild for new libs +- put gdm-autologin pam config file in file list, hope + its absence wasn't deliberate +- use desktop-file-install + +* Mon Jun 10 2002 Havoc Pennington +- rebuild in different environment + +* Mon Jun 10 2002 Havoc Pennington +- 2.4.0.0 + +* Tue May 21 2002 Havoc Pennington +- rebuild in different environment + +* Tue May 21 2002 Havoc Pennington +- 2.3.90.3 + +* Tue May 14 2002 Matt Wilson 2.3.90.2.90-1 +- pulled from current CVS, named it 2.3.90.2.90-1 + +* Thu Feb 14 2002 Havoc Pennington +- rebuild for new libs +- add URL tag + +* Mon Feb 11 2002 Alex Larsson 2.3.90.1.90-1 +- Updated to a cvs snapshot that has the new greeter. + +* Thu Jan 24 2002 Havoc Pennington +- rebuild in rawhide + +* Tue Sep 4 2001 Havoc Pennington +- fix #52997 (ukrainian in language list) + +* Fri Aug 31 2001 Havoc Pennington +- Add po files from sources.redhat.com + +* Mon Aug 27 2001 Havoc Pennington +- Add po files from sources.redhat.com + +* Wed Aug 15 2001 Nalin Dahyabhai +- set SESSION to true in console.apps control file + +* Tue Aug 14 2001 Havoc Pennington +- change default title font to work in CJK, #51698 + +* Wed Aug 8 2001 Bill Nottingham +- fix %%pre for using /var/gdm as home dir + +* Sun Aug 5 2001 Nalin Dahyabhai +- Tweak PAM setup for gdmconfig to match other consolehelper users + +* Fri Aug 3 2001 Owen Taylor +- Set RUNNING_UNDER_GDM when running display init script +- Run xsri as the background program + +* Thu Aug 02 2001 Havoc Pennington +- Change how session switching works, #49480 +- don't offer to make Failsafe the default, #49479 + +* Thu Aug 02 2001 Havoc Pennington +- clean up some format string mess, and don't + log username to syslog, #5681 +- own some directories #50692 + +* Wed Aug 01 2001 Havoc Pennington +- require/buildrequire latest gnome-libs, to compensate + for upstream crackrock. #50554 + +* Tue Jul 31 2001 Havoc Pennington +- get rid of GiveConsole/TakeConsole, bug #33710 + +* Sun Jul 22 2001 Havoc Pennington +- use Raleigh theme for gdm + +* Thu Jul 19 2001 Havoc Pennington +- depend on usermode, xinitrc + +* Thu Jul 19 2001 Havoc Pennington +- build requires pam-devel, should fix #49448 + +* Mon Jul 16 2001 Havoc Pennington +- log to /var/log/gdm/* + +* Mon Jul 16 2001 Havoc Pennington +- make Halt... power off + +* Tue Jul 10 2001 Havoc Pennington +- gdm user's homedir to /var/gdm not /home/gdm + +* Mon Jul 09 2001 Havoc Pennington +- put pam.d/gdm back in file list + +* Sun Jul 08 2001 Havoc Pennington +- upgrade to 2.2.3.1, pray this fixes more than it breaks + +* Thu Jul 05 2001 Havoc Pennington +- add "rpm" user to those not to show in greeter + +* Tue Jul 03 2001 Havoc Pennington +- Upgrade to 2.2.3 +- require usermode since configure script now checks for it + +* Fri Jun 01 2001 Havoc Pennington +- Prereq for scrollkeeper-update + +* Thu May 30 2001 Havoc Pennington +- New CVS snap with the "no weird sessions" options; + more default settings changes + +* Wed May 30 2001 Havoc Pennington +- Change a bunch of default settings; remaining fixes will involve C hacking + +* Wed May 30 2001 Havoc Pennington +- After, oh, 2 years or so, finally upgrade version and set + release to 1. Remove all hacks and patches, pretty much; + this will break a few things, will be putting them back + via GNOME CVS. All changes should go in 'gdm2' module in + CVS for now. + + This RPM enables all kinds of features that I'm going to turn + off shortly, so don't get excited about them. ;-) + +* Thu Mar 22 2001 Nalin Dahyabhai +- reinitialize pam credentials after calling initgroups() -- the + credentials may be group memberships + +* Mon Mar 19 2001 Owen Taylor +- Fix colors patch + +* Thu Mar 15 2001 Havoc Pennington +- translations + +* Mon Mar 5 2001 Preston Brown +- don't screw up color map on 8 bit displays + +* Fri Feb 23 2001 Trond Eivind Glomsrød +- langify +- Don't define and use "ver" and "nam" at the top of the spec file +- use %%{_tmppath} + +* Tue Feb 13 2001 Tim Powers +- don't allow gdm to show some system accounts in the browser bugzilla + #26898 + +* Fri Jan 19 2001 Akira TAGOH +- Updated Japanese translation. + +* Tue Jan 02 2001 Havoc Pennington +- add another close() to the fdleak patch, bugzilla #22794 + +* Sun Aug 13 2000 Owen Taylor +- Return to toplevel main loop and start Xdcmp if enabled + (Bug #16106) + +* Fri Aug 11 2000 Jonathan Blandford +- Up Epoch and release + +* Wed Aug 02 2000 Havoc Pennington +- Requires Xsession script + +* Wed Jul 19 2000 Owen Taylor +- Italian is better as it_IT than it_CH (bugzilla 12425) + +* Mon Jul 17 2000 Jonathan Blandford +- Don't instally gdmconfig as it doesn't work. + +* Fri Jul 14 2000 Havoc Pennington +- Rearrange code to avoid calling innumerable system calls + in a signal handler + +* Fri Jul 14 2000 Havoc Pennington +- Verbose debug spew for infinite loop stuff + +* Fri Jul 14 2000 Havoc Pennington +- Try to fix infinite loops on X server failure + +* Thu Jul 13 2000 Prospector +- automatic rebuild + +* Thu Jun 29 2000 Havoc Pennington +- Remove Docdir + +* Mon Jun 19 2000 Havoc Pennington +- Fix file descriptor leak (Bugzilla 12301) + +* Mon Jun 19 2000 Havoc Pennington +- Apply security errata patch we released for 6.2 +- Add Gnome.session back, don't know when it disappeared or why + +* Thu Jun 1 2000 Nalin Dahyabhai +- modify PAM setup to use system-auth + +* Fri May 19 2000 Havoc Pennington +- rebuild for the Winston tree + +* Fri Feb 04 2000 Havoc Pennington +- Modify Default.session and Failsafe.session not to add -login option to bash +- exec the session scripts with the user's shell with a hyphen prepended +- doesn't seem to actually work yet with tcsh, but it doesn't seem to + break anything. needs a look to see why it doesn't work + +* Fri Feb 04 2000 Havoc Pennington +- Link PreSession/Default to xdm/GiveConsole +- Link PostSession/Default to xdm/TakeConsole + +* Fri Feb 04 2000 Havoc Pennington +- Fix the fix to the fix (8877) +- remove docs/gdm-manual.txt which doesn't seem to exist from %%doc + +* Fri Feb 04 2000 Havoc Pennington +- Enhance 8877 fix by not deleting the "Please login" + message + +* Fri Feb 04 2000 Havoc Pennington +- Try to fix bug 8877 by clearing the message below + the entry box when the prompt changes. may turn + out to be a bad idea. + +* Mon Jan 17 2000 Elliot Lee +- Fix bug #7666: exec Xsession instead of just running it + +* Mon Oct 25 1999 Jakub Jelinek +- Work around so that russian works (uses koi8-r instead + of the default iso8859-5) + +* Tue Oct 12 1999 Owen Taylor +- Try again + +* Tue Oct 12 1999 Owen Taylor +- More fixes for i18n + +* Tue Oct 12 1999 Owen Taylor +- Fixes for i18n + +* Fri Sep 26 1999 Elliot Lee +- Fixed pipewrite bug (found by mkj & ewt). + +* Fri Sep 17 1999 Michael Fulbright +- added requires for pam >= 0.68 + +* Fri Sep 10 1999 Elliot Lee +- I just update this package every five minutes, so any recent changes are my fault. + +* Thu Sep 02 1999 Michael K. Johnson +- built gdm-2.0beta2 + +* Mon Aug 30 1999 Michael K. Johnson +- built gdm-2.0beta1 + +* Tue Aug 17 1999 Michael Fulbright +- included rmeier@liberate.com patch for tcp socket X connections + +* Mon Apr 19 1999 Michael Fulbright +- fix to handling ancient gdm config files with non-standard language specs +- dont close display connection for xdmcp connections, else we die if remote + end dies. + +* Fri Apr 16 1999 Michael Fulbright +- fix language handling to set GDM_LANG variable so gnome-session + can pick it up + +* Wed Apr 14 1999 Michael Fulbright +- fix so certain dialog boxes dont overwrite background images + +* Wed Apr 14 1999 Michael K. Johnson +- do not specify -r 42 to useradd -- it doesn't know how to fall back + if id 42 is already taken + +* Fri Apr 9 1999 Michael Fulbright +- removed suspend feature + +* Mon Apr 5 1999 Jonathan Blandford +- added patch from otaylor to not call gtk funcs from a signal. +- added patch to tab when username not added. +- added patch to center About box (and bring up only one) and ignore "~" + and ".rpm" files. + +* Fri Mar 26 1999 Michael Fulbright +- fixed handling of default session, merged all gdmgreeter patches into one + +* Tue Mar 23 1999 Michael Fulbright +- remove GNOME/KDE/AnotherLevel session scripts, these have been moved to + the appropriate packages instead. +- added patch to make option menus always active (security problem otherwise) +- added jrb's patch to disable stars in passwd entry field + +* Fri Mar 19 1999 Michael Fulbright +- made sure /usr/bin isnt in default path twice +- strip binaries + +* Wed Mar 17 1999 Michael Fulbright +- fixed to use proper system path when root logs in + +* Tue Mar 16 1999 Michael Fulbright +- linked Init/Default to Red Hat default init script for xdm +- removed logo from login dialog box + +* Mon Mar 15 1999 Michael Johnson +- pam_console integration + +* Tue Mar 09 1999 Michael Fulbright +- added session files for GNOME/KDE/AnotherLevel/Default/Failsafe +- patched gdmgreeter to not complete usernames +- patched gdmgreeter to not safe selected session permanently +- patched gdmgreeter to center dialog boxes + +* Mon Mar 08 1999 Michael Fulbright +- removed comments from gdm.conf file, these are not parsed correctly + +* Sun Mar 07 1999 Michael Fulbright +- updated source line for accuracy + +* Fri Feb 26 1999 Owen Taylor +- Updated patches for 1.0.0 +- Fixed some problems in 1.0.0 with installation directories +- moved /usr/var/gdm /var/gdm + +* Thu Feb 25 1999 Michael Fulbright +- moved files from /usr/etc to /etc + +* Tue Feb 16 1999 Michael Johnson +- removed commented-out #1 definition -- put back after testing gnome-libs + comment patch + +* Sat Feb 06 1999 Michael Johnson +- initial packaging