Compare commits

...

No commits in common. "c8" and "c9s" have entirely different histories.
c8 ... c9s

51 changed files with 4116 additions and 5853 deletions

View File

@ -1 +0,0 @@
05c48de8765bde97768b6740417ad6c374c20763 SOURCES/gdm-40.0.tar.xz

141
.gitignore vendored
View File

@ -1 +1,140 @@
SOURCES/gdm-40.0.tar.xz gdm-2.30.2.tar.bz2
/gdm-2.31.90.tar.bz2
/gdm-2.32.0.tar.bz2
/gdm-2.91.4.tar.bz2
/gdm-2.91.6.tar.bz2
/gdm-2.91.91.tar.bz2
/gdm-2.91.92.tar.bz2
/gdm-2.91.93.tar.bz2
/gdm-2.91.94.tar.bz2
/gdm-3.0.0.tar.bz2
/gdm-3.0.4.tar.bz2
/gdm-3.1.2.tar.xz
/gdm-3.2.0.tar.xz
/gdm-3.2.1.tar.xz
/gdm-3.2.1.1.tar.xz
/gdm-3.3.92.tar.xz
/gdm-3.3.92.1.tar.xz
/gdm-3.4.0.tar.xz
/gdm-3.4.0.1.tar.xz
/gdm-3.4.1.tar.xz
/gdm-3.5.2.tar.xz
/gdm-3.5.4.tar.xz
/gdm-3.5.4.1.tar.xz
/org.gnome.login-screen.gschema.override
/gdm-3.5.4.2.tar.xz
/gdm-3.5.5.tar.xz
/gdm-3.5.90.tar.xz
/gdm-3.5.91.tar.xz
/gdm-3.5.92.1.tar.xz
/gdm-3.6.0.tar.xz
/gdm-3.6.1.tar.xz
/gdm-3.6.2.tar.xz
/gdm-3.7.2.tar.xz
/gdm-3.7.3.1.tar.xz
/gdm-3.7.5.tar.xz
/gdm-3.7.90.tar.xz
/gdm-3.7.91.tar.xz
/gdm-3.7.92.tar.xz
/gdm-3.8.0.tar.xz
/gdm-3.8.1.tar.xz
/gdm-3.8.1.1.tar.xz
/gdm-3.8.3.tar.xz
/gdm-3.8.3.1.tar.xz
/gdm-3.9.5.tar.xz
/gdm-3.9.90.tar.xz
/gdm-3.10.0.tar.xz
/gdm-3.10.0.1.tar.xz
/gdm-3.11.2.tar.xz
/gdm-3.11.3.tar.xz
/gdm-3.11.4.tar.xz
/gdm-3.11.90.tar.xz
/gdm-3.11.92.1.tar.xz
/gdm-3.12.0.tar.xz
/gdm-3.12.1.tar.xz
/gdm-3.12.2.tar.xz
/gdm-3.13.91.tar.xz
/gdm-3.13.92.tar.xz
/gdm-3.14.0.tar.xz
/gdm-3.14.1.tar.xz
/gdm-3.15.2.tar.xz
/gdm-3.15.3.tar.xz
/gdm-3.15.3.1.tar.xz
/gdm-3.15.90.tar.xz
/gdm-3.15.90.1.tar.xz
/gdm-3.15.90.2.tar.xz
/gdm-3.15.90.3.tar.xz
/gdm-3.15.90.4.tar.xz
/gdm-3.15.90.5.tar.xz
/gdm-3.15.91.tar.xz
/gdm-3.15.91.1.tar.xz
/gdm-3.15.91.2.tar.xz
/gdm-3.15.92.tar.xz
/gdm-3.16.0.tar.xz
/gdm-3.16.0.1.tar.xz
/gdm-3.16.1.tar.xz
/gdm-3.16.1.1.tar.xz
/gdm-3.17.2.tar.xz
/gdm-3.17.3.tar.xz
/gdm-3.17.3.1.tar.xz
/gdm-3.17.4.tar.xz
/gdm-3.17.90.tar.xz
/gdm-3.17.92.tar.xz
/gdm-3.18.0.tar.xz
/gdm-3.19.2.tar.xz
/gdm-3.19.4.tar.xz
/gdm-3.19.4.1.tar.xz
/gdm-3.19.90.tar.xz
/gdm-3.19.91.tar.xz
/gdm-3.19.92.tar.xz
/gdm-3.20.0.tar.xz
/gdm-3.20.1.tar.xz
/gdm-3.21.3.tar.xz
/gdm-3.21.4.tar.xz
/gdm-3.21.90.tar.xz
/gdm-3.21.91.tar.xz
/gdm-3.22.0.tar.xz
/gdm-3.22.1.tar.xz
/gdm-3.23.4.tar.xz
/gdm-3.23.91.1.tar.xz
/gdm-3.23.92.tar.xz
/gdm-3.24.0.tar.xz
/gdm-3.24.1.tar.xz
/gdm-3.24.2.tar.xz
/gdm-3.25.3.tar.xz
/gdm-3.25.4.1.tar.xz
/gdm-3.25.90.1.tar.xz
/gdm-3.25.92.tar.xz
/gdm-3.26.0.tar.xz
/gdm-3.26.1.tar.xz
/gdm-3.26.2.1.tar.xz
/gdm-3.27.4.tar.xz
/gdm-3.27.91.tar.xz
/gdm-3.27.92.tar.xz
/gdm-3.28.0.tar.xz
/gdm-3.28.1.tar.xz
/gdm-3.28.2.tar.xz
/gdm-3.29.90.tar.xz
/gdm-3.29.91.tar.xz
/gdm-3.30.0.tar.xz
/gdm-3.30.1.tar.xz
/gdm-3.30.2.tar.xz
/gdm-3.30.3.tar.xz
/gdm-3.31.91.tar.xz
/gdm-3.32.0.tar.xz
/gdm-3.33.4.tar.xz
/gdm-3.33.90.tar.xz
/gdm-3.33.92.tar.xz
/gdm-3.34.0.tar.xz
/gdm-3.34.1.tar.xz
/gdm-3.37.1.tar.xz
/gdm-3.37.3.tar.xz
/gdm-3.37.90.tar.xz
/gdm-3.38.0.tar.xz
/gdm-3.38.1.tar.xz
/gdm-3.38.2.tar.xz
/gdm-3.38.2.1.tar.xz
/gdm-40.beta.tar.xz
/gdm-40.rc.tar.xz
/gdm-40.0.tar.xz
/gdm-40.1.tar.xz

View File

@ -1,4 +1,4 @@
From a447cd87b99868348ecf69479eb7958f20a318a2 Mon Sep 17 00:00:00 2001 From f6ebcec5d48aeff718a9db9b8ff812fd404a61ed Mon Sep 17 00:00:00 2001
From: Rui Matos <tiagomatos@gmail.com> From: Rui Matos <tiagomatos@gmail.com>
Date: Mon, 23 Jan 2017 20:19:51 +0100 Date: Mon, 23 Jan 2017 20:19:51 +0100
Subject: [PATCH] Honor initial setup being disabled by distro installer Subject: [PATCH] Honor initial setup being disabled by distro installer
@ -18,10 +18,10 @@ https://bugzilla.gnome.org/show_bug.cgi?id=777708
1 file changed, 29 insertions(+) 1 file changed, 29 insertions(+)
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 687e7da4b..b3bdf066d 100644 index 34467856..9438fe72 100644
--- a/daemon/gdm-display.c --- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c +++ b/daemon/gdm-display.c
@@ -1591,103 +1591,132 @@ kernel_cmdline_initial_setup_force_state (gboolean *force_state) @@ -1621,103 +1621,132 @@ kernel_cmdline_initial_setup_force_state (gboolean *force_state)
GError *error = NULL; GError *error = NULL;
gchar *contents = NULL; gchar *contents = NULL;
gchar *setup_argument = NULL; gchar *setup_argument = NULL;
@ -155,5 +155,5 @@ index 687e7da4b..b3bdf066d 100644
auth_file = gdm_display_access_file_get_path (priv->access_file); auth_file = gdm_display_access_file_get_path (priv->access_file);
} }
-- --
2.28.0 2.32.0

View File

@ -1,7 +1,7 @@
From cebcf2a4d29f01061dedf8714db2842b9582900c Mon Sep 17 00:00:00 2001 From aa1c4a7708df2edbc12f2ada7249208aef586d1e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org> From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Tue, 8 Jun 2021 20:45:00 +0200 Date: Tue, 8 Jun 2021 20:45:00 +0200
Subject: [PATCH 1/3] data: Disable network configuration on login screen Subject: [PATCH] data: Disable network configuration on login screen
--- ---
data/meson.build | 10 ++++++++++ data/meson.build | 10 ++++++++++
@ -10,17 +10,17 @@ Subject: [PATCH 1/3] data: Disable network configuration on login screen
create mode 100644 data/org.gnome.gdm.rules.in create mode 100644 data/org.gnome.gdm.rules.in
diff --git a/data/meson.build b/data/meson.build diff --git a/data/meson.build b/data/meson.build
index 23e2d7f9f..cbd6a6a21 100644 index 7c5222ea..20d39a36 100644
--- a/data/meson.build --- a/data/meson.build
+++ b/data/meson.build +++ b/data/meson.build
@@ -131,60 +131,70 @@ pam_data_files_map = { @@ -130,60 +130,70 @@ pam_data_files_map = {
],
'arch': [ 'arch': [
'gdm-autologin', 'gdm-autologin',
'gdm-launch-environment', 'gdm-launch-environment',
'gdm-fingerprint', 'gdm-fingerprint',
'gdm-smartcard', 'gdm-smartcard',
'gdm-password', 'gdm-password',
'gdm-pin',
], ],
'none': [], 'none': [],
# We should no longer have 'autodetect' at this point # We should no longer have 'autodetect' at this point
@ -86,7 +86,7 @@ index 23e2d7f9f..cbd6a6a21 100644
format: 'cmake' format: 'cmake'
diff --git a/data/org.gnome.gdm.rules.in b/data/org.gnome.gdm.rules.in diff --git a/data/org.gnome.gdm.rules.in b/data/org.gnome.gdm.rules.in
new file mode 100644 new file mode 100644
index 000000000..09544f11e index 00000000..09544f11
--- /dev/null --- /dev/null
+++ b/data/org.gnome.gdm.rules.in +++ b/data/org.gnome.gdm.rules.in
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
@ -99,5 +99,5 @@ index 000000000..09544f11e
+ return polkit.Result.NOT_HANDLED; + return polkit.Result.NOT_HANDLED;
+}); +});
-- --
2.30.1 2.32.0

View File

@ -1,7 +1,7 @@
From 8c9fe8ebd9e584adaec0a80ee4c4eaf5357422a5 Mon Sep 17 00:00:00 2001 From 3e62d7b423175102bd2376adc9cf58ad736b23b0 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Wed, 31 Jul 2013 17:32:55 -0400 Date: Wed, 31 Jul 2013 17:32:55 -0400
Subject: [PATCH 1/2] data: add system dconf databases to gdm profile Subject: [PATCH] data: add system dconf databases to gdm profile
This way system settings can affect the login screen. This way system settings can affect the login screen.
--- ---
@ -9,7 +9,7 @@ This way system settings can affect the login screen.
1 file changed, 4 insertions(+) 1 file changed, 4 insertions(+)
diff --git a/data/dconf/gdm.in b/data/dconf/gdm.in diff --git a/data/dconf/gdm.in b/data/dconf/gdm.in
index 4d8bf1748..9694078fb 100644 index 4d8bf174..9694078f 100644
--- a/data/dconf/gdm.in --- a/data/dconf/gdm.in
+++ b/data/dconf/gdm.in +++ b/data/dconf/gdm.in
@@ -1,2 +1,6 @@ @@ -1,2 +1,6 @@
@ -20,5 +20,5 @@ index 4d8bf1748..9694078fb 100644
+system-db:distro +system-db:distro
file-db:@DATADIR@/@PACKAGE@/greeter-dconf-defaults file-db:@DATADIR@/@PACKAGE@/greeter-dconf-defaults
-- --
2.30.1 2.32.0

View File

@ -1,4 +1,4 @@
From 7f910ee7554703a2e775e73ace10ced5d7a0fe66 Mon Sep 17 00:00:00 2001 From a4743b9b2b355f84da3904e7da93ec3c7a521895 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Fri, 26 Jul 2019 14:06:16 -0400 Date: Fri, 26 Jul 2019 14:06:16 -0400
Subject: [PATCH] data: reap gdm sessions on shutdown Subject: [PATCH] data: reap gdm sessions on shutdown
@ -12,7 +12,7 @@ lingering after the orderly shutdown.
1 file changed, 1 insertion(+) 1 file changed, 1 insertion(+)
diff --git a/data/gdm.service.in b/data/gdm.service.in diff --git a/data/gdm.service.in b/data/gdm.service.in
index 17e8a8de8..195bd0fdc 100644 index 17e8a8de..195bd0fd 100644
--- a/data/gdm.service.in --- a/data/gdm.service.in
+++ b/data/gdm.service.in +++ b/data/gdm.service.in
@@ -1,33 +1,34 @@ @@ -1,33 +1,34 @@
@ -51,5 +51,5 @@ index 17e8a8de8..195bd0fdc 100644
[Install] [Install]
Alias=display-manager.service Alias=display-manager.service
-- --
2.28.0 2.32.0

View File

@ -0,0 +1,219 @@
From f7295f73f424e22eacb940c92e43326d75c901e1 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 22 Jul 2024 14:58:47 -0400
Subject: [PATCH 1/3] display: Add new FAILING state
We need to be able to detect failure and quit plymouth before
reacting to the failure (and starting Xorg).
This commit adds a new FAILING state that gets run before FAILED,
so things can be ordered properly
d#
---
daemon/gdm-display.c | 1 +
daemon/gdm-display.h | 1 +
daemon/gdm-local-display-factory.c | 2 ++
3 files changed, 4 insertions(+)
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 9438fe72c..0e6249896 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -667,60 +667,61 @@ gdm_display_disconnect (GdmDisplay *self)
xcb_flush (priv->xcb_connection);
g_clear_pointer (&priv->xcb_connection, xcb_disconnect);
}
gboolean
gdm_display_unmanage (GdmDisplay *self)
{
GdmDisplayPrivate *priv;
g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
priv = gdm_display_get_instance_private (self);
gdm_display_disconnect (self);
if (priv->user_access_file != NULL) {
gdm_display_access_file_close (priv->user_access_file);
g_object_unref (priv->user_access_file);
priv->user_access_file = NULL;
}
if (priv->access_file != NULL) {
gdm_display_access_file_close (priv->access_file);
g_object_unref (priv->access_file);
priv->access_file = NULL;
}
if (!priv->session_registered) {
g_warning ("GdmDisplay: Session never registered, failing");
+ _gdm_display_set_status (self, GDM_DISPLAY_FAILING);
_gdm_display_set_status (self, GDM_DISPLAY_FAILED);
} else {
_gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED);
}
return TRUE;
}
gboolean
gdm_display_get_id (GdmDisplay *self,
char **id,
GError **error)
{
GdmDisplayPrivate *priv;
g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
priv = gdm_display_get_instance_private (self);
if (id != NULL) {
*id = g_strdup (priv->id);
}
return TRUE;
}
gboolean
gdm_display_get_x11_display_name (GdmDisplay *self,
char **x11_display,
GError **error)
{
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
index ef3736cd3..bd048cd0d 100644
--- a/daemon/gdm-display.h
+++ b/daemon/gdm-display.h
@@ -9,60 +9,61 @@
*
* 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_DISPLAY_H
#define __GDM_DISPLAY_H
#include <glib-object.h>
#include <gio/gio.h>
G_BEGIN_DECLS
#define GDM_TYPE_DISPLAY (gdm_display_get_type ())
G_DECLARE_DERIVABLE_TYPE (GdmDisplay, gdm_display, GDM, DISPLAY, GObject)
typedef enum {
GDM_DISPLAY_UNMANAGED = 0,
GDM_DISPLAY_PREPARED,
GDM_DISPLAY_MANAGED,
GDM_DISPLAY_WAITING_TO_FINISH,
GDM_DISPLAY_FINISHED,
+ GDM_DISPLAY_FAILING,
GDM_DISPLAY_FAILED,
} GdmDisplayStatus;
struct _GdmDisplayClass
{
GObjectClass parent_class;
/* methods */
gboolean (*prepare) (GdmDisplay *display);
void (*manage) (GdmDisplay *self);
};
typedef enum
{
GDM_DISPLAY_ERROR_GENERAL,
GDM_DISPLAY_ERROR_GETTING_USER_INFO,
GDM_DISPLAY_ERROR_GETTING_SESSION_INFO,
} GdmDisplayError;
#define GDM_DISPLAY_ERROR gdm_display_error_quark ()
GQuark gdm_display_error_quark (void);
int gdm_display_get_status (GdmDisplay *display);
time_t gdm_display_get_creation_time (GdmDisplay *display);
char * gdm_display_open_session_sync (GdmDisplay *display,
GPid pid_of_caller,
uid_t uid_of_caller,
GCancellable *cancellable,
GError **error);
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 61522dbf0..5dc0aebe5 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -544,60 +544,62 @@ on_display_status_changed (GdmDisplay *display,
"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 */
factory->num_failures = 0;
gdm_local_display_factory_sync_seats (factory);
}
break;
+ case GDM_DISPLAY_FAILING:
+ break;
case GDM_DISPLAY_FAILED:
/* leave the display number in factory->used_display_numbers
so that it doesn't get reused */
gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory));
/* Create a new equivalent display if it was static */
if (is_local) {
factory->num_failures++;
/* oh shit */
if (factory->num_failures > MAX_DISPLAY_FAILURES)
g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
else
ensure_display_for_seat (factory, seat_id);
}
break;
case GDM_DISPLAY_UNMANAGED:
break;
case GDM_DISPLAY_PREPARED:
break;
case GDM_DISPLAY_MANAGED:
#if defined(ENABLE_USER_DISPLAY_SERVER)
g_signal_connect_object (display,
"notify::session-registered",
G_CALLBACK (on_session_registered_cb),
factory,
0);
#endif
break;
--
2.44.0

View File

@ -0,0 +1,88 @@
From bcab8852cf7249a2220f6c737f7bb8a17b99249a Mon Sep 17 00:00:00 2001
From: rpm-build <rpm-build>
Date: Mon, 27 Nov 2023 15:29:09 -0500
Subject: [PATCH 1/2] gdm-session: Force reuse vt mode for legacy Xorg mode
In the legacy Xorg mode, the X session and user session are
supposed to use the same VT.
Unfortunately, right now GDM thinks they will use different
VTs and that breaks PreferredDisplayServer=legacy-xorg.
This commit fixes that.
---
daemon/gdm-session.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 9f68166..43e3ea6 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -3343,60 +3343,64 @@ gdm_session_bypasses_xsession (GdmSession *self)
if (error) {
bypasses_xsession = FALSE;
g_error_free (error);
goto out;
}
}
out:
if (bypasses_xsession) {
g_debug ("GdmSession: Session %s bypasses Xsession wrapper script", filename);
}
g_free (filename);
return bypasses_xsession;
}
GdmSessionDisplayMode
gdm_session_get_display_mode (GdmSession *self)
{
g_debug ("GdmSession: type %s, program? %s, seat %s",
self->session_type,
self->is_program_session? "yes" : "no",
self->display_seat_id);
/* Non-seat0 sessions share their X server with their login screen
* for now.
*/
if (g_strcmp0 (self->display_seat_id, "seat0") != 0) {
return GDM_SESSION_DISPLAY_MODE_REUSE_VT;
}
+ if (self->display_x11_authority_file != NULL) {
+ return GDM_SESSION_DISPLAY_MODE_REUSE_VT;
+ }
+
#ifdef ENABLE_USER_DISPLAY_SERVER
/* All other cases (wayland login screen, X login screen,
* wayland user session, X user session) use the NEW_VT
* display mode. That display mode means that GDM allocates
* a new VT and jumps to it before starting the session. The
* session is expected to use logind to gain access to the
* display and input devices.
*
* GDM also has a LOGIND_MANAGED display mode which we can't
* use yet. The difference between it and NEW_VT, is with it,
* GDM doesn't do any VT handling at all, expecting the session
* and logind to do everything. The problem is, for wayland
* sessions it will cause flicker until * this bug is fixed:
*
* https://bugzilla.gnome.org/show_bug.cgi?id=745141
*
* Likewise, for X sessions it's problematic because
* 1) X doesn't call TakeControl before switching VTs
* 2) X doesn't support getting started "in the background"
* right now. It will die with an error if logind devices
* are paused when handed out.
*/
return GDM_SESSION_DISPLAY_MODE_NEW_VT;
#else
#ifdef ENABLE_WAYLAND_SUPPORT
/* Wayland sessions are for now assumed to run in a
* mutter-launch-like environment, so we allocate
* a new VT for them. */
if (g_strcmp0 (self->session_type, "wayland") == 0) {
--
2.41.0

View File

@ -1,4 +1,4 @@
From d8fd8d4d6ff6a119f6bd27eb07316384c4776d12 Mon Sep 17 00:00:00 2001 From 9261fcd05667fc5f8b81880577e41a566db821a8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Wed, 15 Sep 2021 11:23:17 -0400 Date: Wed, 15 Sep 2021 11:23:17 -0400
Subject: [PATCH] local-display-factory: Don't try to respawn displays on Subject: [PATCH] local-display-factory: Don't try to respawn displays on
@ -18,7 +18,7 @@ path.
2 files changed, 12 insertions(+), 1 deletion(-) 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 11dcda2c..a0884893 100644 index 141d64c6..bca41f6e 100644
--- a/daemon/gdm-local-display-factory.c --- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c
@@ -46,60 +46,62 @@ @@ -46,60 +46,62 @@
@ -84,7 +84,7 @@ index 11dcda2c..a0884893 100644
{ {
static GQuark ret = 0; static GQuark ret = 0;
if (ret == 0) { if (ret == 0) {
@@ -478,60 +480,64 @@ on_session_registered_cb (GObject *gobject, @@ -416,60 +418,64 @@ on_session_registered_cb (GObject *gobject,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data) gpointer user_data)
{ {
@ -149,7 +149,7 @@ index 11dcda2c..a0884893 100644
*/ */
if (is_local && g_strcmp0 (session_class, "greeter") != 0) { if (is_local && g_strcmp0 (session_class, "greeter") != 0) {
/* reset num failures */ /* reset num failures */
@@ -1250,99 +1256,102 @@ on_display_added (GdmDisplayStore *display_store, @@ -1204,99 +1210,102 @@ on_display_added (GdmDisplayStore *display_store,
display = gdm_display_store_lookup (display_store, id); display = gdm_display_store_lookup (display_store, id);
@ -254,10 +254,10 @@ index 11dcda2c..a0884893 100644
static gboolean static gboolean
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index b3d0a2b5..4b62b8b1 100644 index 4c2752fe..cc61efc9 100644
--- a/daemon/gdm-manager.c --- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c +++ b/daemon/gdm-manager.c
@@ -2774,60 +2774,62 @@ unexport_display (const char *id, @@ -2741,60 +2741,62 @@ unexport_display (const char *id,
GdmDisplay *display, GdmDisplay *display,
GdmManager *manager) GdmManager *manager)
{ {
@ -321,5 +321,5 @@ index b3d0a2b5..4b62b8b1 100644
g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager)); g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager));
} }
-- --
2.31.1 2.32.0

View File

@ -0,0 +1,729 @@
From e88779b0785fe781608b10478ae092e8fd79ae0b Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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 | 168 ++++++++++++++++++++++++++---
daemon/meson.build | 4 +
meson.build | 2 +
3 files changed, 162 insertions(+), 12 deletions(-)
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index ca14c31f5..56be1d9db 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 <mccann@jhu.edu>
*
* 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 <stdlib.h>
#include <stdio.h>
#include <glib.h>
#include <glib/gi18n.h>
#include <glib-object.h>
#include <gio/gio.h>
+#ifdef HAVE_UDEV
+#include <gudev/gudev.h>
+#endif
+
#include <systemd/sd-login.h>
#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", &current, 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 +1244,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 2e61b6447..41f30abef 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 02d609dc0..05d8da412 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.40.0

View File

@ -1,7 +1,7 @@
From 20725e4c65555178ed64a3cb77ee979ec98998f8 Mon Sep 17 00:00:00 2001 From d9dd381a574a02b239438db4fcc9d6ac2fd82ee0 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Wed, 19 Oct 2022 14:50:33 -0400 Date: Wed, 19 Oct 2022 14:50:33 -0400
Subject: [PATCH 2/2] manager: Fix btmp record accounting Subject: [PATCH] manager: Fix btmp record accounting
Before a user logs in they don't have a display. Before a user logs in they don't have a display.
@ -19,10 +19,10 @@ the seat id instead.
2 files changed, 15 insertions(+), 4 deletions(-) 2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 4b62b8b1..c70248f3 100644 index cc61efc9..e1bc62d7 100644
--- a/daemon/gdm-manager.c --- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c +++ b/daemon/gdm-manager.c
@@ -641,113 +641,120 @@ switch_to_compatible_user_session (GdmManager *manager, @@ -628,113 +628,120 @@ switch_to_compatible_user_session (GdmManager *manager,
ret = TRUE; ret = TRUE;
@ -223,5 +223,5 @@ index 7719d0a8..310323b6 100644
g_debug ("using ut_type USER_PROCESS"); g_debug ("using ut_type USER_PROCESS");
#endif #endif
-- --
2.31.1 2.37.3

View File

@ -1,4 +1,4 @@
From d80807171a457ff87bdc9bd861939161749a37a8 Mon Sep 17 00:00:00 2001 From 58f2bb3560f1066d0cda93a749a6d1648e3c3d0c Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Thu, 20 Dec 2018 14:51:38 -0500 Date: Thu, 20 Dec 2018 14:51:38 -0500
Subject: [PATCH 1/3] manager: allow multiple xdmcp logins for the same user Subject: [PATCH 1/3] manager: allow multiple xdmcp logins for the same user
@ -10,7 +10,7 @@ Subject: [PATCH 1/3] manager: allow multiple xdmcp logins for the same user
3 files changed, 59 insertions(+), 18 deletions(-) 3 files changed, 59 insertions(+), 18 deletions(-)
diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h
index 87685d3cd..4b3a1ffeb 100644 index 87685d3c..4b3a1ffe 100644
--- a/common/gdm-settings-keys.h --- a/common/gdm-settings-keys.h
+++ b/common/gdm-settings-keys.h +++ b/common/gdm-settings-keys.h
@@ -30,37 +30,38 @@ G_BEGIN_DECLS @@ -30,37 +30,38 @@ G_BEGIN_DECLS
@ -53,7 +53,7 @@ index 87685d3cd..4b3a1ffeb 100644
#endif /* _GDM_SETTINGS_KEYS_H */ #endif /* _GDM_SETTINGS_KEYS_H */
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index e433acf3b..ce8565bf9 100644 index e1bc62d7..08c3cc17 100644
--- a/daemon/gdm-manager.c --- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c +++ b/daemon/gdm-manager.c
@@ -566,93 +566,106 @@ get_display_and_details_for_bus_sender (GdmManager *self, @@ -566,93 +566,106 @@ get_display_and_details_for_bus_sender (GdmManager *self,
@ -180,8 +180,8 @@ index e433acf3b..ce8565bf9 100644
SessionRecord record) SessionRecord record)
{ {
const char *username; const char *username;
char *display_name, *hostname, *display_device; char *display_name, *hostname, *display_device, *display_seat_id;
@@ -1089,92 +1102,114 @@ open_temporary_reauthentication_channel (GdmManager *self, @@ -1096,92 +1109,114 @@ open_temporary_reauthentication_channel (GdmManager *self,
g_signal_connect (session, g_signal_connect (session,
"client-disconnected", "client-disconnected",
G_CALLBACK (on_reauthentication_client_disconnected), G_CALLBACK (on_reauthentication_client_disconnected),
@ -297,7 +297,7 @@ index e433acf3b..ce8565bf9 100644
uid, uid,
is_remote); is_remote);
diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in
index a1035f95e..929d13d90 100644 index a1035f95..929d13d9 100644
--- a/data/gdm.schemas.in --- a/data/gdm.schemas.in
+++ b/data/gdm.schemas.in +++ b/data/gdm.schemas.in
@@ -112,33 +112,38 @@ @@ -112,33 +112,38 @@
@ -340,5 +340,5 @@ index a1035f95e..929d13d90 100644
</gdmschemafile> </gdmschemafile>
-- --
2.30.1 2.37.3

View File

@ -1,4 +1,4 @@
From f101371f418bb0013af1e5e1ef522277011fd48d Mon Sep 17 00:00:00 2001 From b8caa1a18f284cc9b59a2e0273780a51b6fd7528 Mon Sep 17 00:00:00 2001
From: Alan Coopersmith <alan.coopersmith@oracle.com> From: Alan Coopersmith <alan.coopersmith@oracle.com>
Date: Thu, 7 Oct 2021 18:22:11 -0700 Date: Thu, 7 Oct 2021 18:22:11 -0700
Subject: [PATCH 1/2] meson: Fix detection of Xorg versions that need -listen Subject: [PATCH 1/2] meson: Fix detection of Xorg versions that need -listen
@ -10,7 +10,7 @@ Closes #704
1 file changed, 4 insertions(+) 1 file changed, 4 insertions(+)
diff --git a/meson.build b/meson.build diff --git a/meson.build b/meson.build
index e6fcf4b8..06d09659 100644 index 64b98628..52ac1941 100644
--- a/meson.build --- a/meson.build
+++ b/meson.build +++ b/meson.build
@@ -42,60 +42,63 @@ udev_dep = dependency('udev') @@ -42,60 +42,63 @@ udev_dep = dependency('udev')
@ -68,7 +68,7 @@ index e6fcf4b8..06d09659 100644
endif endif
xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp')) xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp'))
if xdmcp_dep.found() and get_option('tcp-wrappers') if xdmcp_dep.found() and get_option('tcp-wrappers')
libwrap_dep = cc.find_library('libwrap') libwrap_dep = cc.find_library('wrap')
endif endif
# systemd # systemd
systemd_dep = dependency('systemd') systemd_dep = dependency('systemd')
@ -140,5 +140,5 @@ index e6fcf4b8..06d09659 100644
# Subdirs # Subdirs
-- --
2.33.1 2.34.1

View File

@ -0,0 +1,45 @@
From cf4664891ede9648d096569900e8b95abd91a633 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 7 Apr 2022 12:44:10 -0400
Subject: [PATCH] session-settings: Explicitly cache remote users
Right now a user's cache file won't get written out if they are logging
in with entirely default settings.
This means remote users have to type in their usernames manually until
they change their session.
This commit explicitly caches remote users.
Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/743
---
daemon/gdm-session-settings.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c
index 5b64cb65b..ef5d72e7f 100644
--- a/daemon/gdm-session-settings.c
+++ b/daemon/gdm-session-settings.c
@@ -406,6 +406,19 @@ gdm_session_settings_save (GdmSessionSettings *settings,
if (settings->priv->language_name != NULL) {
act_user_set_language (user, settings->priv->language_name);
}
+
+ if (!act_user_is_local_account (user)) {
+ g_autoptr (GError) error = NULL;
+
+ act_user_manager_cache_user (settings->priv->user_manager, username, &error);
+
+ if (error != NULL) {
+ g_debug ("GdmSessionSettings: Could not locally cache remote user: %s", error->message);
+ g_object_unref (user);
+ return FALSE;
+ }
+
+ }
g_object_unref (user);
return TRUE;
--
GitLab

View File

@ -0,0 +1,89 @@
From 8a29f79124f38e2106b263bacb6b5ab4cdb255d0 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -1,4 +1,4 @@
From 56d12ad9697d5695c780a5be0065d23fec6bd1a5 Mon Sep 17 00:00:00 2001 From 26705ee64f4d3628eaaf45db980c435fa26e112a Mon Sep 17 00:00:00 2001
From: Chingkai Chu <3013329+chuchingkai@users.noreply.github.com> From: Chingkai Chu <3013329+chuchingkai@users.noreply.github.com>
Date: Thu, 12 Aug 2021 10:34:01 +0800 Date: Thu, 12 Aug 2021 10:34:01 +0800
Subject: [PATCH] session-worker: Set session_vt=0 out of pam uninitialization Subject: [PATCH] session-worker: Set session_vt=0 out of pam uninitialization
@ -13,7 +13,7 @@ https://gitlab.gnome.org/GNOME/gdm/-/issues/719
1 file changed, 2 deletions(-) 1 file changed, 2 deletions(-)
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index c1201b70..9cff53a5 100644 index 7d7d2496..3ad94e2a 100644
--- a/daemon/gdm-session-worker.c --- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c
@@ -1076,62 +1076,60 @@ gdm_session_worker_set_state (GdmSessionWorker *worker, @@ -1076,62 +1076,60 @@ gdm_session_worker_set_state (GdmSessionWorker *worker,
@ -80,5 +80,5 @@ index c1201b70..9cff53a5 100644
} }
if (auth) { if (auth) {
-- --
2.31.1 2.32.0

View File

@ -1,7 +1,7 @@
From b5472a30b1a71aec537ac309e2985cbac61b3136 Mon Sep 17 00:00:00 2001 From 36b9fd4f6e055e236175979d9a1527df71aeac1f Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Tue, 14 Sep 2021 11:00:33 -0400 Date: Tue, 14 Sep 2021 11:00:33 -0400
Subject: [PATCH 3/4] xdmcp-display-factory: Set supported session types for Subject: [PATCH 1/5] xdmcp-display-factory: Set supported session types for
XDMCP displays XDMCP displays
The lower levels of GDM now expect the session types supported by a The lower levels of GDM now expect the session types supported by a

View File

@ -0,0 +1,356 @@
From d3e073fa1cd314b344db1ec22f0add2702a6c299 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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 <mccann@jhu.edu>
*
* 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 <glib-object.h>
#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 <glib-object.h>
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

View File

@ -0,0 +1,109 @@
From b09ab8a73d5a4133f72846d529bbbfb7802ca535 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -1,4 +1,4 @@
From d3823a5084e12d8f342fd4cbec29e23bdb646de7 Mon Sep 17 00:00:00 2001 From cc67c8de39358031fddc5ca7d8c993271d6606a7 Mon Sep 17 00:00:00 2001
From: Alan Coopersmith <alan.coopersmith@oracle.com> From: Alan Coopersmith <alan.coopersmith@oracle.com>
Date: Thu, 7 Oct 2021 18:22:11 -0700 Date: Thu, 7 Oct 2021 18:22:11 -0700
Subject: [PATCH 2/2] daemon: Support X servers built with -Dlisten_tcp=true Subject: [PATCH 2/2] daemon: Support X servers built with -Dlisten_tcp=true
@ -112,7 +112,7 @@ index 1ba00d45..e5d23521 100644
} }
diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c
index b1548361..d2a8aeb3 100644 index 5962da57..0b07ab5b 100644
--- a/daemon/gdm-x-session.c --- a/daemon/gdm-x-session.c
+++ b/daemon/gdm-x-session.c +++ b/daemon/gdm-x-session.c
@@ -233,70 +233,70 @@ spawn_x_server (State *state, @@ -233,70 +233,70 @@ spawn_x_server (State *state,
@ -193,7 +193,7 @@ index b1548361..d2a8aeb3 100644
if (subprocess == NULL) { if (subprocess == NULL) {
g_debug ("could not start X server: %s", error->message); g_debug ("could not start X server: %s", error->message);
diff --git a/meson.build b/meson.build diff --git a/meson.build b/meson.build
index 06d09659..8328dd97 100644 index 52ac1941..02d609dc 100644
--- a/meson.build --- a/meson.build
+++ b/meson.build +++ b/meson.build
@@ -44,61 +44,61 @@ glib_min_version = '2.56.0' @@ -44,61 +44,61 @@ glib_min_version = '2.56.0'
@ -250,7 +250,7 @@ index 06d09659..8328dd97 100644
endif endif
xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp')) xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp'))
if xdmcp_dep.found() and get_option('tcp-wrappers') if xdmcp_dep.found() and get_option('tcp-wrappers')
libwrap_dep = cc.find_library('libwrap') libwrap_dep = cc.find_library('wrap')
endif endif
# systemd # systemd
systemd_dep = dependency('systemd') systemd_dep = dependency('systemd')
@ -323,5 +323,5 @@ index 06d09659..8328dd97 100644
# Subdirs # Subdirs
-- --
2.33.1 2.34.1

View File

@ -1,4 +1,4 @@
From 874b26e3674d540df37d7f145df853bcf81e5a26 Mon Sep 17 00:00:00 2001 From ea1de1173b46f76fe00b4f52b2b71ad16e35acc3 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Wed, 5 Feb 2020 15:20:48 -0500 Date: Wed, 5 Feb 2020 15:20:48 -0500
Subject: [PATCH 2/3] gdm-x-session: run session bus on non-seat0 seats Subject: [PATCH 2/3] gdm-x-session: run session bus on non-seat0 seats
@ -13,10 +13,10 @@ seats get their own session bus.
1 file changed, 10 insertions(+), 1 deletion(-) 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 418240dc0..77d6b8ff0 100644 index a65fa0f9..f13b54af 100644
--- a/daemon/gdm-session.c --- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c +++ b/daemon/gdm-session.c
@@ -2822,119 +2822,128 @@ on_start_program_cb (GdmDBusWorker *worker, @@ -2864,119 +2864,128 @@ on_start_program_cb (GdmDBusWorker *worker,
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) || if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) ||
g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
return; return;
@ -147,5 +147,5 @@ index 418240dc0..77d6b8ff0 100644
self->selected_program); self->selected_program);
} }
-- --
2.30.1 2.37.3

View File

@ -0,0 +1,384 @@
From 510566699c480226b189215c6222f7e72979baf8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 22 May 2024 14:05:20 -0400
Subject: [PATCH 2/2] local-display-factory: Fix user switching with legacy
xorg
legacy-xorg sessions currently fail to completely user switch.
This is because the wrong session types are attached to the generated
login screen display.
This commit refactors the code so the same session types are used for
user switching as are used for the initial login.
---
daemon/gdm-local-display-factory.c | 78 +++++++++++++++++++++---------
1 file changed, 54 insertions(+), 24 deletions(-)
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 7447b985a..4efbf0a6d 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -331,118 +331,131 @@ gdm_local_display_factory_get_session_types (GdmLocalDisplayFactory *factory,
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));
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);
}
+static GdmDisplay *
+create_legacy_xorg_display (GdmLocalDisplayFactory *factory)
+{
+ guint32 display_number;
+ const char *session_types[] = { "x11", NULL };
+ GdmDisplay *display;
+
+ display_number = take_next_display_number (factory);
+
+ g_debug ("GdmLocalDisplayFactory: Creating legacy Xorg display at :%d", display_number);
+
+ display = gdm_legacy_display_new (display_number);
+ g_object_set (G_OBJECT (display),
+ "session-type", session_types[0],
+ "supported-session-types", session_types,
+ NULL);
+
+ return 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) {
g_auto(GStrv) session_types = 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_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 (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0)
+ display = create_legacy_xorg_display (factory);
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 */
@@ -591,70 +604,87 @@ on_display_status_changed (GdmDisplay *display,
case GDM_DISPLAY_WAITING_TO_FINISH:
break;
default:
g_assert_not_reached ();
break;
}
g_free (seat_id);
g_free (session_type);
g_free (session_class);
}
static gboolean
lookup_by_seat_id (const char *id,
GdmDisplay *display,
gpointer user_data)
{
const char *looking_for = user_data;
char *current;
gboolean res;
g_object_get (G_OBJECT (display), "seat-id", &current, NULL);
res = g_strcmp0 (current, looking_for) == 0;
g_free(current);
return res;
}
+static gboolean
+lookup_initial_display (const char *id,
+ GdmDisplay *display)
+{
+ gboolean is_initial = FALSE;
+ int status;
+
+ status = gdm_display_get_status (display);
+
+ if (status != GDM_DISPLAY_PREPARED && status != GDM_DISPLAY_MANAGED)
+ return FALSE;
+
+ g_object_get (G_OBJECT (display), "is-initial", &is_initial, NULL);
+
+ return is_initial;
+}
+
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)
+ if (status != GDM_DISPLAY_PREPARED && status != GDM_DISPLAY_MANAGED)
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;
}
@@ -834,115 +864,115 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
/* 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;
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_types != NULL)
g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
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
+ if (is_seat0) {
+ display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
+ if (display != NULL && g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
+ GdmDisplay *initial_display = NULL;
+
+ initial_display = gdm_display_store_find (store, lookup_initial_display, (gpointer) NULL);
+
+ if (initial_display == NULL)
+ display = NULL;
+ }
+ } 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) {
display = gdm_local_display_new ();
g_object_set (G_OBJECT (display),
"session-type", session_types[0],
"supported-session-types", session_types,
NULL);
}
}
#endif
- if (display == NULL) {
- guint32 num;
-
- num = take_next_display_number (factory);
-
- display = gdm_legacy_display_new (num);
- g_object_set (G_OBJECT (display),
- "session-type", legacy_session_types[0],
- "supported-session-types", legacy_session_types,
- NULL);
- }
+ if (display == NULL)
+ display = create_legacy_xorg_display (factory);
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
gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory)
--
2.40.0

View File

@ -0,0 +1,375 @@
From 27c78eb4efc598281eed9cd521ba1b05ee08e3d2 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 22 Jul 2024 14:59:43 -0400
Subject: [PATCH 2/3] manager: Quit plymouth at first sign of failure
Rather than quit plymouth after a replacement X server is already
started, this commit does it a bit earlier, so there is a battle
of display servers.
---
common/gdm-address.c | 4 ++--
daemon/gdm-manager.c | 5 +++++
daemon/gdm-xdmcp-display-factory.c | 10 ++++++----
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/common/gdm-address.c b/common/gdm-address.c
index a8b73e286..3a507d0af 100644
--- a/common/gdm-address.c
+++ b/common/gdm-address.c
@@ -107,61 +107,61 @@ gdm_address_new_from_sockaddr (struct sockaddr *sa,
g_return_val_if_fail (sa != NULL, NULL);
g_return_val_if_fail (size >= sizeof (struct sockaddr), NULL);
g_return_val_if_fail (size <= sizeof (struct sockaddr_storage), NULL);
addr = g_new0 (GdmAddress, 1);
addr->ss = g_new0 (struct sockaddr_storage, 1);
memcpy (addr->ss, sa, size);
return addr;
}
/**
* gdm_address_get_sockaddr_storage:
* @address: A #GdmAddress
*
* This function tanslates @address into a equivalent
* sockaddr_storage
*
* Return value: A newly allocated sockaddr_storage structure the caller must free
* or %NULL if @address did not point to a valid #GdmAddress.
**/
struct sockaddr_storage *
gdm_address_get_sockaddr_storage (GdmAddress *address)
{
struct sockaddr_storage *ss;
g_return_val_if_fail (address != NULL, NULL);
g_return_val_if_fail (address->ss != NULL, NULL);
- ss = g_memdup (address->ss, sizeof (struct sockaddr_storage));
+ ss = g_memdup2 (address->ss, sizeof (struct sockaddr_storage));
return ss;
}
struct sockaddr_storage *
gdm_address_peek_sockaddr_storage (GdmAddress *address)
{
g_return_val_if_fail (address != NULL, NULL);
return address->ss;
}
static gboolean
v4_v4_equal (const struct sockaddr_in *a,
const struct sockaddr_in *b)
{
return a->sin_addr.s_addr == b->sin_addr.s_addr;
}
#ifdef ENABLE_IPV6
static gboolean
v6_v6_equal (struct sockaddr_in6 *a,
struct sockaddr_in6 *b)
{
return IN6_ARE_ADDR_EQUAL (&a->sin6_addr, &b->sin6_addr);
}
#endif
#define SA(__s) ((struct sockaddr *) __s)
#define SIN(__s) ((struct sockaddr_in *) __s)
@@ -502,50 +502,50 @@ gdm_address_is_local (GdmAddress *address)
while (list != NULL) {
GdmAddress *addr = list->data;
if (gdm_address_equal (address, addr)) {
return TRUE;
}
list = list->next;
}
return FALSE;
}
/**
* gdm_address_copy:
* @address: A #GdmAddress.
*
* Duplicates @address.
*
* Return value: Duplicated @address or %NULL if @address was not valid.
**/
GdmAddress *
gdm_address_copy (GdmAddress *address)
{
GdmAddress *addr;
g_return_val_if_fail (address != NULL, NULL);
addr = g_new0 (GdmAddress, 1);
- addr->ss = g_memdup (address->ss, sizeof (struct sockaddr_storage));
+ addr->ss = g_memdup2 (address->ss, sizeof (struct sockaddr_storage));
return addr;
}
/**
* gdm_address_free:
* @address: A #GdmAddress.
*
* Frees the memory allocated for @address.
**/
void
gdm_address_free (GdmAddress *address)
{
g_return_if_fail (address != NULL);
g_free (address->ss);
g_free (address);
}
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 08c3cc177..100b967fb 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -1551,70 +1551,75 @@ on_display_status_changed (GdmDisplay *display,
g_object_get (display,
"is-local", &display_is_local,
NULL);
quit_plymouth = display_is_local && manager->priv->plymouth_is_running;
#endif
g_object_get (display,
"x11-display-number", &display_number,
"session-type", &session_type,
"doing-initial-setup", &doing_initial_setup,
NULL);
status = gdm_display_get_status (display);
switch (status) {
case GDM_DISPLAY_PREPARED:
case GDM_DISPLAY_MANAGED:
if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) ||
(display_number != -1 && status == GDM_DISPLAY_MANAGED)) {
char *session_class;
g_object_get (display,
"session-class", &session_class,
NULL);
if (g_strcmp0 (session_class, "greeter") == 0)
set_up_session (manager, display);
g_free (session_class);
}
break;
+
+ case GDM_DISPLAY_FAILING:
case GDM_DISPLAY_FAILED:
case GDM_DISPLAY_UNMANAGED:
case GDM_DISPLAY_FINISHED:
#ifdef WITH_PLYMOUTH
if (quit_plymouth) {
plymouth_quit_without_transition ();
manager->priv->plymouth_is_running = FALSE;
}
#endif
+ if (status == GDM_DISPLAY_FAILING)
+ break;
+
g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
if (display == manager->priv->automatic_login_display) {
g_clear_weak_pointer (&manager->priv->automatic_login_display);
manager->priv->did_automatic_login = TRUE;
#ifdef ENABLE_WAYLAND_SUPPORT
if (g_strcmp0 (session_type, "wayland") != 0 && status == GDM_DISPLAY_FAILED) {
/* we're going to fall back to X11, so try to autologin again
*/
manager->priv->did_automatic_login = FALSE;
}
#endif
}
break;
default:
break;
}
}
static void
on_display_removed (GdmDisplayStore *display_store,
GdmDisplay *display,
GdmManager *manager)
{
char *id;
gdm_display_get_id (display, &id, NULL);
diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index abb58faeb..e82cfe1b4 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -891,87 +891,87 @@ gdm_xdmcp_send_unwilling (GdmXdmcpDisplayFactory *factory,
header.length = 4 + factory->servhost.length + status.length;
header.version = XDM_PROTOCOL_VERSION;
XdmcpWriteHeader (&factory->buf, &header);
XdmcpWriteARRAY8 (&factory->buf, &factory->servhost);
XdmcpWriteARRAY8 (&factory->buf, &status);
XdmcpFlush (factory->socket_fd,
&factory->buf,
(XdmcpNetaddr)gdm_address_peek_sockaddr_storage (address),
(int)gdm_sockaddr_len (gdm_address_peek_sockaddr_storage (address)));
last_time = time (NULL);
}
#define SIN(__s) ((struct sockaddr_in *) __s)
#define SIN6(__s) ((struct sockaddr_in6 *) __s)
static void
set_port_for_request (GdmAddress *address,
ARRAY8 *port)
{
struct sockaddr_storage *ss;
ss = gdm_address_peek_sockaddr_storage (address);
/* we depend on this being 2 elsewhere as well */
port->length = 2;
switch (ss->ss_family) {
case AF_INET:
- port->data = (CARD8 *)g_memdup (&(SIN (ss)->sin_port), port->length);
+ port->data = (CARD8 *)g_memdup2 (&(SIN (ss)->sin_port), port->length);
break;
case AF_INET6:
- port->data = (CARD8 *)g_memdup (&(SIN6 (ss)->sin6_port), port->length);
+ port->data = (CARD8 *)g_memdup2 (&(SIN6 (ss)->sin6_port), port->length);
break;
default:
port->data = NULL;
break;
}
}
static void
set_address_for_request (GdmAddress *address,
ARRAY8 *addr)
{
struct sockaddr_storage *ss;
ss = gdm_address_peek_sockaddr_storage (address);
switch (ss->ss_family) {
case AF_INET:
addr->length = sizeof (struct in_addr);
- addr->data = g_memdup (&SIN (ss)->sin_addr, addr->length);
+ addr->data = g_memdup2 (&SIN (ss)->sin_addr, addr->length);
break;
case AF_INET6:
addr->length = sizeof (struct in6_addr);
- addr->data = g_memdup (&SIN6 (ss)->sin6_addr, addr->length);
+ addr->data = g_memdup2 (&SIN6 (ss)->sin6_addr, addr->length);
break;
default:
addr->length = 0;
addr->data = NULL;
break;
}
}
static void
gdm_xdmcp_send_forward_query (GdmXdmcpDisplayFactory *factory,
IndirectClient *ic,
GdmAddress *address,
GdmAddress *display_address,
ARRAYofARRAY8Ptr authlist)
{
XdmcpHeader header;
int i;
ARRAY8 addr;
ARRAY8 port;
char *host;
char *serv;
g_assert (ic != NULL);
g_assert (ic->chosen_address != NULL);
host = NULL;
gdm_address_get_numeric_info (ic->chosen_address, &host, NULL);
g_debug ("GdmXdmcpDisplayFactory: Sending forward query to %s",
host ? host : "(null)");
@@ -2063,60 +2063,62 @@ on_display_status_changed (GdmDisplay *display,
{
int status;
GdmLaunchEnvironment *launch_environment;
GdmSession *session;
GdmAddress *address;
gint32 session_number;
int display_number;
launch_environment = NULL;
g_object_get (display, "launch-environment", &launch_environment, NULL);
session = NULL;
if (launch_environment != NULL) {
session = gdm_launch_environment_get_session (launch_environment);
}
status = gdm_display_get_status (display);
g_debug ("GdmXdmcpDisplayFactory: xdmcp display status changed: %d", status);
switch (status) {
case GDM_DISPLAY_FINISHED:
g_object_get (display,
"remote-address", &address,
"x11-display-number", &display_number,
"session-number", &session_number,
NULL);
gdm_xdmcp_send_alive (factory, address, display_number, session_number);
gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory));
break;
+ case GDM_DISPLAY_FAILING:
+ break;
case GDM_DISPLAY_FAILED:
gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory));
break;
case GDM_DISPLAY_UNMANAGED:
if (session != NULL) {
g_signal_handlers_disconnect_by_func (G_OBJECT (session),
G_CALLBACK (on_client_disconnected),
display);
}
break;
case GDM_DISPLAY_PREPARED:
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);
--
2.44.0

View File

@ -0,0 +1,155 @@
From a9928bfcc9c6d81d60e047b7838d4107835b8f89 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -1,8 +1,8 @@
From ff689b18fd0a5fd03e5941723cb2adff3b7e4b24 Mon Sep 17 00:00:00 2001 From 7084aea50bdc16ccecb4474ca79403429e79ec0e Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Wed, 29 Sep 2021 11:03:41 -0400 Date: Wed, 29 Sep 2021 11:03:41 -0400
Subject: [PATCH] daemon: Infer session type from desktop file if user has no Subject: [PATCH 3/5] daemon: Infer session type from desktop file if user has
saved session type no saved session type
The accountsservice user cache file can specify a session type The accountsservice user cache file can specify a session type
associated with the saved session. This is optional though. If one associated with the saved session. This is optional though. If one
@ -16,10 +16,10 @@ It was failing to do the latter, though. This commit fixes that.
1 file changed, 2 insertions(+) 1 file changed, 2 insertions(+)
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 29459346..72afe7b2 100644 index b54687d5..a65fa0f9 100644
--- a/daemon/gdm-session.c --- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c +++ b/daemon/gdm-session.c
@@ -988,60 +988,62 @@ worker_on_saved_language_name_read (GdmDBusWorker *worker, @@ -1009,60 +1009,62 @@ worker_on_saved_language_name_read (GdmDBusWorker *worker,
} }
} }
} }
@ -31,7 +31,7 @@ index 29459346..72afe7b2 100644
{ {
GdmSession *self = conversation->session; GdmSession *self = conversation->session;
if (! get_session_command_for_name (self, session_name, NULL)) { if (! get_session_command_for_name (self, session_name, self->saved_session_type, NULL)) {
/* ignore sessions that don't exist */ /* ignore sessions that don't exist */
g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name); g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name);
g_free (self->saved_session); g_free (self->saved_session);
@ -56,6 +56,17 @@ index 29459346..72afe7b2 100644
} }
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 * static GdmSessionConversation *
find_conversation_by_pid (GdmSession *self, find_conversation_by_pid (GdmSession *self,
GPid pid) GPid pid)
@ -71,17 +82,6 @@ index 29459346..72afe7b2 100644
if (conversation->worker_pid == pid) { if (conversation->worker_pid == pid) {
return conversation; return conversation;
}
}
return NULL;
}
static gboolean
allow_worker_function (GDBusAuthObserver *observer,
GIOStream *stream,
GCredentials *credentials,
GdmSession *self)
-- --
2.33.1 2.34.1

View File

@ -0,0 +1,94 @@
From 190a9f31446ddab66c8b5c2e246a6253f85bde76 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 24 Jul 2024 08:40:08 -0400
Subject: [PATCH 3/3] manager: Quit plymouth synchronously
Plymouth needs to finish quitting before we start Xorg, so we can't
run it async. This command makes sure it gets run synchronously.
---
daemon/gdm-manager.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 100b967fb..d4ad949fe 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -167,67 +167,72 @@ plymouth_prepare_for_transition (void)
error = NULL;
res = g_spawn_command_line_sync ("plymouth deactivate",
NULL, NULL, NULL, &error);
if (! res) {
g_warning ("Could not deactivate plymouth: %s", error->message);
g_error_free (error);
}
}
static gboolean
plymouth_quit_with_transition (void)
{
gboolean res;
GError *error;
error = NULL;
res = g_spawn_command_line_async ("plymouth quit --retain-splash", &error);
if (! res) {
g_warning ("Could not quit plymouth: %s", error->message);
g_error_free (error);
}
return G_SOURCE_REMOVE;
}
static void
plymouth_quit_without_transition (void)
{
gboolean res;
- GError *error;
+ g_autoptr (GError) error = NULL;
+ g_autofree char *standard_error = NULL;
+ int wait_status = 0;
error = NULL;
- res = g_spawn_command_line_async ("plymouth quit", &error);
+ res = g_spawn_command_line_sync ("plymouth quit", NULL, &standard_error, &wait_status, &error);
if (! res) {
g_warning ("Could not quit plymouth: %s", error->message);
- g_error_free (error);
+ } else if (!WIFEXITED (wait_status) || WEXITSTATUS (wait_status) != 0) {
+ g_warning ("plymouth errored on quit command%s%s",
+ standard_error? ":" : "",
+ standard_error?: "");
}
}
#endif
static char *
get_session_id_for_pid (pid_t pid,
GError **error)
{
char *session, *gsession;
int ret;
session = NULL;
ret = sd_pid_get_session (pid, &session);
if (ret < 0) {
g_set_error (error,
GDM_DISPLAY_ERROR,
GDM_DISPLAY_ERROR_GETTING_SESSION_INFO,
"Error getting session id from systemd: %s",
g_strerror (-ret));
return NULL;
}
if (session != NULL) {
gsession = g_strdup (session);
free (session);
return gsession;
} else {
return NULL;
}
--
2.44.0

View File

@ -1,4 +1,4 @@
From 64e8db8432158e5115df18a03bb87ecc1d58ae63 Mon Sep 17 00:00:00 2001 From 73ccd50cabda8102b724d9bf647ac5a74963040d Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Mon, 11 Feb 2019 10:32:55 -0500 Date: Mon, 11 Feb 2019 10:32:55 -0500
Subject: [PATCH 3/3] session: ensure login screen over XDMCP connects to its Subject: [PATCH 3/3] session: ensure login screen over XDMCP connects to its
@ -17,10 +17,10 @@ the session is X11.
1 file changed, 19 insertions(+) 1 file changed, 19 insertions(+)
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 77d6b8ff0..357e4a297 100644 index f13b54af..9f68166e 100644
--- a/daemon/gdm-session.c --- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c +++ b/daemon/gdm-session.c
@@ -2697,60 +2697,79 @@ set_up_session_environment (GdmSession *self) @@ -2739,60 +2739,79 @@ set_up_session_environment (GdmSession *self)
} }
static void static void
@ -101,5 +101,5 @@ index 77d6b8ff0..357e4a297 100644
gpointer key, value; gpointer key, value;
-- --
2.30.1 2.37.3

View File

@ -0,0 +1,559 @@
From d76d6ff0761d47df938f1dab0daeeecac2feb56e Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -0,0 +1,149 @@
From 0131864b339dc0cc5f23def75e6caa5872c9ed11 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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,123 @@
+# 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"
+
+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

View File

@ -1,7 +1,7 @@
From dfca67899ea33da08d3aa9e84c1b4487991adad0 Mon Sep 17 00:00:00 2001 From 0e467e3fb32d9e2a7499069699527638eb2c2be1 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com> From: Ray Strode <rstrode@redhat.com>
Date: Thu, 7 Oct 2021 15:34:27 -0400 Date: Thu, 7 Oct 2021 15:34:27 -0400
Subject: [PATCH 4/4] local-display-factory: Don't crash if Xorg and Wayland Subject: [PATCH 5/5] local-display-factory: Don't crash if Xorg and Wayland
are both unavailable are both unavailable
At the moment if Wayland doesn't work, the login screen will fall back At the moment if Wayland doesn't work, the login screen will fall back

View File

@ -1,241 +0,0 @@
From 85951a0384cb7f37d99669575fad4aea155f25a8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 5 May 2021 10:50:56 -0400
Subject: [PATCH 1/5] Revert "gdm-{wayland,x}-session: don't overwrite user env
with fallback vars"
This reverts commit ccecd9c975d04da80db4cd547b67a1a94fa83292.
---
daemon/gdm-wayland-session.c | 22 +---------------------
daemon/gdm-x-session.c | 22 +---------------------
2 files changed, 2 insertions(+), 42 deletions(-)
diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c
index d0404d2c1..35679b194 100644
--- a/daemon/gdm-wayland-session.c
+++ b/daemon/gdm-wayland-session.c
@@ -262,112 +262,92 @@ on_session_finished (GSubprocess *subprocess,
state->session_exit_status = exit_status;
} else {
int signal_number;
signal_number = g_subprocess_get_term_sig (subprocess);
g_debug ("session was killed with status %d", signal_number);
}
g_clear_object (&state->session_subprocess);
out:
g_main_loop_quit (state->main_loop);
}
static gboolean
spawn_session (State *state,
GCancellable *cancellable)
{
GSubprocessLauncher *launcher = NULL;
GSubprocess *subprocess = NULL;
GError *error = NULL;
gboolean is_running = FALSE;
int ret;
char **argv = NULL;
static const char *session_variables[] = { "DISPLAY",
"XAUTHORITY",
"WAYLAND_DISPLAY",
"WAYLAND_SOCKET",
"GNOME_SHELL_SESSION_MODE",
NULL };
- /* The environment variables listed below are those we have set (or
- * received from our own execution environment) only as a fallback to
- * make things work, as opposed to a information directly pertaining to
- * the session about to be started. Variables listed here will not
- * overwrite the existing environment (possibly) imported from the
- * systemd --user instance.
- * As an example: We need a PATH for some of the launched subprocesses
- * to work, but if the user (or the distributor) has customized the PATH
- * via one of systemds user-environment-generators, that version should
- * be preferred. */
- static const char *fallback_variables[] = { "PATH", NULL };
g_debug ("Running wayland session");
ret = g_shell_parse_argv (state->session_command,
NULL,
&argv,
&error);
if (!ret) {
g_debug ("could not parse session arguments: %s", error->message);
goto out;
}
launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_NONE);
if (state->environment != NULL) {
size_t i;
for (i = 0; state->environment[i] != NULL; i++) {
g_auto(GStrv) environment_entry = NULL;
if (state->environment[i][0] == '\0') {
continue;
}
environment_entry = g_strsplit (state->environment[i], "=", 2);
if (environment_entry[0] == NULL || environment_entry[1] == NULL) {
continue;
}
- /* Merge the environment block imported from systemd --user with the
- * environment we have set for ourselves (and thus pass on to the
- * launcher process). Variables we have set have precedence, as to not
- * import stale data from prior user sessions, with the exception of
- * those listed in fallback_variables. See the comment there for more
- * explanations. */
- g_subprocess_launcher_setenv (launcher,
- environment_entry[0],
- environment_entry[1],
- g_strv_contains (fallback_variables, environment_entry[0]));
+ g_subprocess_launcher_setenv (launcher, environment_entry[0], environment_entry[1], FALSE);
}
/* Don't allow session specific environment variables from earlier sessions to
* leak through */
for (i = 0; session_variables[i] != NULL; i++) {
if (g_getenv (session_variables[i]) == NULL) {
g_subprocess_launcher_unsetenv (launcher, session_variables[i]);
}
}
}
if (state->bus_address != NULL) {
g_subprocess_launcher_setenv (launcher, "DBUS_SESSION_BUS_ADDRESS", state->bus_address, TRUE);
}
subprocess = g_subprocess_launcher_spawnv (launcher,
(const char * const *) argv,
&error);
g_strfreev (argv);
if (subprocess == NULL) {
g_debug ("could not start session: %s", error->message);
goto out;
}
state->session_subprocess = g_object_ref (subprocess);
g_subprocess_wait_async (state->session_subprocess,
cancellable,
(GAsyncReadyCallback)
diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c
index 5962da572..b15483614 100644
--- a/daemon/gdm-x-session.c
+++ b/daemon/gdm-x-session.c
@@ -588,102 +588,82 @@ on_session_finished (GSubprocess *subprocess,
state->session_exit_status = exit_status;
} else {
int signal_number;
signal_number = g_subprocess_get_term_sig (subprocess);
g_debug ("session was killed with status %d", signal_number);
}
g_clear_object (&state->session_subprocess);
out:
g_main_loop_quit (state->main_loop);
}
static gboolean
spawn_session (State *state,
gboolean run_script,
GCancellable *cancellable)
{
GSubprocessLauncher *launcher = NULL;
GSubprocess *subprocess = NULL;
GError *error = NULL;
gboolean is_running = FALSE;
const char *vt;
static const char *session_variables[] = { "DISPLAY",
"XAUTHORITY",
"WAYLAND_DISPLAY",
"WAYLAND_SOCKET",
"GNOME_SHELL_SESSION_MODE",
NULL };
- /* The environment variables listed below are those we have set (or
- * received from our own execution environment) only as a fallback to
- * make things work, as opposed to a information directly pertaining to
- * the session about to be started. Variables listed here will not
- * overwrite the existing environment (possibly) imported from the
- * systemd --user instance.
- * As an example: We need a PATH for some of the launched subprocesses
- * to work, but if the user (or the distributor) has customized the PATH
- * via one of systemds user-environment-generators, that version should
- * be preferred. */
- static const char *fallback_variables[] = { "PATH", NULL };
g_debug ("Running X session");
launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_NONE);
if (state->environment != NULL) {
size_t i;
for (i = 0; state->environment[i] != NULL; i++) {
g_auto(GStrv) environment_entry = NULL;
if (state->environment[i][0] == '\0') {
continue;
}
environment_entry = g_strsplit (state->environment[i], "=", 2);
if (environment_entry[0] == NULL || environment_entry[1] == NULL) {
continue;
}
- /* Merge the environment block imported from systemd --user with the
- * environment we have set for ourselves (and thus pass on to the
- * launcher process). Variables we have set have precedence, as to not
- * import stale data from prior user sessions, with the exception of
- * those listed in fallback_variables. See the comment there for more
- * explanations. */
- g_subprocess_launcher_setenv (launcher,
- environment_entry[0],
- environment_entry[1],
- g_strv_contains (fallback_variables, environment_entry[0]));
+ g_subprocess_launcher_setenv (launcher, environment_entry[0], environment_entry[1], FALSE);
}
/* Don't allow session specific environment variables from earlier sessions to
* leak through */
for (i = 0; session_variables[i] != NULL; i++) {
if (g_getenv (session_variables[i]) == NULL) {
g_subprocess_launcher_unsetenv (launcher, session_variables[i]);
}
}
}
g_subprocess_launcher_setenv (launcher, "DISPLAY", state->display_name, TRUE);
g_subprocess_launcher_setenv (launcher, "XAUTHORITY", state->auth_file, TRUE);
if (state->bus_address != NULL) {
g_subprocess_launcher_setenv (launcher, "DBUS_SESSION_BUS_ADDRESS", state->bus_address, TRUE);
}
vt = g_getenv ("XDG_VTNR");
if (vt != NULL) {
g_subprocess_launcher_setenv (launcher, "WINDOWPATH", vt, TRUE);
}
if (run_script) {
subprocess = g_subprocess_launcher_spawn (launcher,
&error,
GDMCONFDIR "/Xsession",
state->session_command,
NULL);
--
2.30.1

View File

@ -1,86 +0,0 @@
From 2fc7d94280a82e079129468d9b0db312725e5926 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 12 Dec 2022 15:37:38 -0500
Subject: [PATCH 1/2] build: Support keyutils 1.5.11 and older
keyutils didn't get a pkgconfig file until 1.6.
This commit looks for the library directly if it can't find
the pkgconfig file.
---
meson.build | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/meson.build b/meson.build
index 4a286f97..1a557e9a 100644
--- a/meson.build
+++ b/meson.build
@@ -26,60 +26,65 @@ lang_config_file = (get_option('lang-file') != '')? get_option('lang-file') : gd
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')
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)
+
+if not keyutils_dep.found()
+ keyutils_dep = cc.find_library('libkeyutils')
+endif
+
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_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
--
2.35.1

View File

@ -1,570 +0,0 @@
From fbdb5fdfc5f4c5569643239cae1d6fe5fac13717 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 12 Dec 2022 10:52:58 -0500
Subject: [PATCH] daemon: Don't error on shutdown
Right now we complain if shutdown happens while the display is
comming up.
This commit detects that case and avoids the error in that case.
---
daemon/gdm-display.c | 28 +++++++++++++++++++++++++++-
daemon/gdm-manager.c | 11 +++++++----
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 9438fe72..a93857e9 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -66,86 +66,88 @@ 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;
+ guint shutting_down : 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,
+ PROP_SHUTTING_DOWN,
};
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);
@@ -665,61 +667,61 @@ gdm_display_disconnect (GdmDisplay *self)
}
xcb_flush (priv->xcb_connection);
g_clear_pointer (&priv->xcb_connection, xcb_disconnect);
}
gboolean
gdm_display_unmanage (GdmDisplay *self)
{
GdmDisplayPrivate *priv;
g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
priv = gdm_display_get_instance_private (self);
gdm_display_disconnect (self);
if (priv->user_access_file != NULL) {
gdm_display_access_file_close (priv->user_access_file);
g_object_unref (priv->user_access_file);
priv->user_access_file = NULL;
}
if (priv->access_file != NULL) {
gdm_display_access_file_close (priv->access_file);
g_object_unref (priv->access_file);
priv->access_file = NULL;
}
- if (!priv->session_registered) {
+ if (!priv->session_registered && !priv->shutting_down) {
g_warning ("GdmDisplay: Session never registered, failing");
_gdm_display_set_status (self, GDM_DISPLAY_FAILED);
} else {
_gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED);
}
return TRUE;
}
gboolean
gdm_display_get_id (GdmDisplay *self,
char **id,
GError **error)
{
GdmDisplayPrivate *priv;
g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
priv = gdm_display_get_instance_private (self);
if (id != NULL) {
*id = g_strdup (priv->id);
}
return TRUE;
}
gboolean
gdm_display_get_x11_display_name (GdmDisplay *self,
char **x11_display,
GError **error)
@@ -851,60 +853,70 @@ _gdm_display_set_x11_cookie (GdmDisplay *self,
{
GdmDisplayPrivate *priv;
priv = gdm_display_get_instance_private (self);
g_free (priv->x11_cookie);
priv->x11_cookie = g_strdup (x11_cookie);
}
static void
_gdm_display_set_is_local (GdmDisplay *self,
gboolean is_local)
{
GdmDisplayPrivate *priv;
priv = gdm_display_get_instance_private (self);
g_debug ("GdmDisplay: local: %s", is_local? "yes" : "no");
priv->is_local = is_local;
}
static void
_gdm_display_set_session_registered (GdmDisplay *self,
gboolean registered)
{
GdmDisplayPrivate *priv;
priv = gdm_display_get_instance_private (self);
g_debug ("GdmDisplay: session registered: %s", registered? "yes" : "no");
priv->session_registered = registered;
}
+static void
+_gdm_display_set_shutting_down (GdmDisplay *self,
+ gboolean shutting_down)
+{
+ GdmDisplayPrivate *priv;
+
+ priv = gdm_display_get_instance_private (self);
+ priv->shutting_down = shutting_down;
+}
+
static void
_gdm_display_set_launch_environment (GdmDisplay *self,
GdmLaunchEnvironment *launch_environment)
{
GdmDisplayPrivate *priv;
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;
@@ -962,60 +974,63 @@ gdm_display_set_property (GObject *object,
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;
+ case PROP_SHUTTING_DOWN:
+ _gdm_display_set_shutting_down (self, g_value_get_boolean (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);
@@ -1043,60 +1058,63 @@ gdm_display_get_property (GObject *object,
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;
+ case PROP_SHUTTING_DOWN:
+ g_value_set_boolean (value, priv->shutting_down);
+ 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);
@@ -1397,60 +1415,68 @@ gdm_display_class_init (GdmDisplayClass *klass)
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));
+
+ g_object_class_install_property (object_class,
+ PROP_SHUTTING_DOWN,
+ g_param_spec_boolean ("shutting-down",
+ NULL,
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE | 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);
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index c70248f3..05851001 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -2759,117 +2759,120 @@ gdm_manager_init (GdmManager *manager)
NULL,
(GDestroyNotify)
g_object_unref);
manager->priv->transient_sessions = g_hash_table_new_full (NULL,
NULL,
(GDestroyNotify)
NULL,
(GDestroyNotify)
g_object_unref);
g_signal_connect (G_OBJECT (manager->priv->display_store),
"display-added",
G_CALLBACK (on_display_added),
manager);
g_signal_connect (G_OBJECT (manager->priv->display_store),
"display-removed",
G_CALLBACK (on_display_removed),
manager);
}
static void
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)
+shut_down_display (const char *id,
+ GdmDisplay *display,
+ GdmManager *manager)
{
gdm_display_stop_greeter_session (display);
+
+ g_object_set (G_OBJECT (display), "shutting-down", TRUE, NULL);
+
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));
}
gdm_display_store_foreach (manager->priv->display_store,
- (GdmDisplayStoreFunc) finish_display,
+ (GdmDisplayStoreFunc) shut_down_display,
manager);
gdm_display_store_clear (manager->priv->display_store);
g_dbus_object_manager_server_set_connection (manager->priv->object_manager, NULL);
g_clear_object (&manager->priv->connection);
g_clear_object (&manager->priv->object_manager);
g_clear_object (&manager->priv->display_store);
G_OBJECT_CLASS (gdm_manager_parent_class)->dispose (object);
}
GdmManager *
gdm_manager_new (void)
{
if (manager_object != NULL) {
g_object_ref (manager_object);
} else {
gboolean res;
manager_object = g_object_new (GDM_TYPE_MANAGER, NULL);
g_object_add_weak_pointer (manager_object,
(gpointer *) &manager_object);
res = register_manager (manager_object);
if (! res) {
g_object_unref (manager_object);
return NULL;
}
}
--
2.37.0.rc1

View File

@ -1,63 +0,0 @@
From e01c0894669f5fe3d1a1c4148b7507e61b95d035 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 11 Feb 2019 18:14:07 -0500
Subject: [PATCH] data: disable wayland on certain hardware
We're having issues with wayland on passthrough to virt
setups and with the vendor nvidia driver on hybrid graphics
setups, so disable it in those cases.
Also disable it on server chips for performance reasons.
---
data/61-gdm.rules.in | 39 +++++++++++++++++++++++++++++++++++----
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in
index b1da191f..d599a146 100644
--- a/data/61-gdm.rules.in
+++ b/data/61-gdm.rules.in
@@ -1,6 +1,37 @@
# 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", RUN+="@libexecdir@/gdm-disable-wayland"
+
+# disable Wayland on Matrox chipsets
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0522", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0524", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0530", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0532", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0533", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0534", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0536", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x102b", ATTR{device}=="0x0538", RUN+="@libexecdir@/gdm-disable-wayland"
+
+# disable Wayland on aspeed chipsets
+ATTR{vendor}=="0x1a03", ATTR{device}=="0x2010", RUN+="@libexecdir@/gdm-disable-wayland"
+ATTR{vendor}=="0x1a03", ATTR{device}=="0x2000", RUN+="@libexecdir@/gdm-disable-wayland"
+
+# disable Wayland on hybrid systems with vendor nvidia driver
+# default to Xorg on single gpu vendor nvidia systems
+DRIVER=="nvidia", ENV{GDM_HAS_VENDOR_NVIDIA_DRIVER}="1"
+DRIVER=="nvidia", RUN+="@libexecdir@/gdm-runtime-config set daemon PreferredDisplayServer xorg"
+SUBSYSTEM=="drm", KERNEL=="card[1-9]*", ENV{GDM_HAS_NVIDIA_DRIVER}=="1", RUN+="@libexecdir@/gdm-disable-wayland"
+ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia_drm", ATTR{parameters/modeset}=="N", RUN+="/usr/libexec/gdm-disable-wayland"
+
+# disable Wayland on HyperV guests
+DRIVER=="hyperv_fb", RUN+="@libexecdir@/gdm-disable-wayland"
+
+# disable Wayland on passthrough graphics setups for now (assumes passthrough if
+# there is more than one card, and one of the cards is virt: cirrus, bochs, qxl)
+ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", ENV{GDM_HAS_VIRTUAL_GPU}="1"
+ATTR{vendor}=="0x1b36", ATTR{device}=="0x0100", ENV{GDM_HAS_VIRTUAL_GPU}="1"
+ATTR{vendor}=="0x1234", ATTR{device}=="0x1111", ENV{GDM_HAS_VIRTUAL_GPU}="1"
+
+SUBSYSTEM=="drm", KERNEL=="card[1-9]*", ENV{GDM_HAS_VIRTUAL_GPU}=="1", RUN+="@libexecdir@/gdm-disable-wayland"
+
# disable Wayland if modesetting is disabled
-IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false"
+IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-disable-wayland"
--
2.27.0

View File

@ -1,155 +0,0 @@
From cbfb3ef99ecc9cbb4e6850e5dd0cc9fb65dd398a Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 1 Sep 2020 13:49:27 -0400
Subject: [PATCH 1/3] display: Handle failure before display registration
Normally, e.g., gdm-wayland-session would register its display
before starting the session. This display registration is how
the display moves to the "managed" state. We currently detect
session failure in gdm_display_unmanage. If gdm-wayland-session
is killed before it registers the display, gdm_display_unmanage
won't run, and failure won't be detected.
This commit make gdm_display_unmanage get called, even if the
display isn't yet fully managed.
---
daemon/gdm-display.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 7c954ad24..3a260923a 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -648,62 +648,60 @@ gdm_display_disconnect (GdmDisplay *self)
/* resource_id_mask is the bits given to each client for
* addressing resources */
highest_client = (XID) ~unused_bits & ~setup->resource_id_mask;
client_increment = setup->resource_id_mask + 1;
/* Kill every client but ourselves, then close our own connection
*/
for (client = 0;
client <= highest_client;
client += client_increment) {
if (client != setup->resource_id_base)
xcb_kill_client (priv->xcb_connection, client);
}
xcb_flush (priv->xcb_connection);
g_clear_pointer (&priv->xcb_connection, xcb_disconnect);
}
gboolean
gdm_display_unmanage (GdmDisplay *self)
{
GdmDisplayPrivate *priv;
g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
priv = gdm_display_get_instance_private (self);
- g_debug ("GdmDisplay: unmanage display");
-
gdm_display_disconnect (self);
if (priv->user_access_file != NULL) {
gdm_display_access_file_close (priv->user_access_file);
g_object_unref (priv->user_access_file);
priv->user_access_file = NULL;
}
if (priv->access_file != NULL) {
gdm_display_access_file_close (priv->access_file);
g_object_unref (priv->access_file);
priv->access_file = NULL;
}
if (!priv->session_registered) {
g_warning ("GdmDisplay: Session never registered, failing");
_gdm_display_set_status (self, GDM_DISPLAY_FAILED);
} else {
_gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED);
}
return TRUE;
}
gboolean
gdm_display_get_id (GdmDisplay *self,
char **id,
GError **error)
{
GdmDisplayPrivate *priv;
@@ -1446,63 +1444,63 @@ gdm_display_get_object_skeleton (GdmDisplay *self)
{
GdmDisplayPrivate *priv;
priv = gdm_display_get_instance_private (self);
return priv->object_skeleton;
}
static void
on_launch_environment_session_opened (GdmLaunchEnvironment *launch_environment,
GdmDisplay *self)
{
char *session_id;
g_debug ("GdmDisplay: Greeter session opened");
session_id = gdm_launch_environment_get_session_id (launch_environment);
_gdm_display_set_session_id (self, session_id);
g_free (session_id);
}
static void
on_launch_environment_session_started (GdmLaunchEnvironment *launch_environment,
GdmDisplay *self)
{
g_debug ("GdmDisplay: Greeter started");
}
static void
self_destruct (GdmDisplay *self)
{
g_object_ref (self);
- if (gdm_display_get_status (self) == GDM_DISPLAY_MANAGED) {
- gdm_display_unmanage (self);
- }
+
+ g_debug ("GdmDisplay: initiating display self-destruct");
+ gdm_display_unmanage (self);
if (gdm_display_get_status (self) != GDM_DISPLAY_FINISHED) {
queue_finish (self);
}
g_object_unref (self);
}
static void
on_launch_environment_session_stopped (GdmLaunchEnvironment *launch_environment,
GdmDisplay *self)
{
g_debug ("GdmDisplay: Greeter stopped");
self_destruct (self);
}
static void
on_launch_environment_session_exited (GdmLaunchEnvironment *launch_environment,
int code,
GdmDisplay *self)
{
g_debug ("GdmDisplay: Greeter exited: %d", code);
self_destruct (self);
}
static void
on_launch_environment_session_died (GdmLaunchEnvironment *launch_environment,
int signal,
GdmDisplay *self)
{
g_debug ("GdmDisplay: Greeter died: %d", signal);
--
2.31.1

View File

@ -1,81 +0,0 @@
From 5a2d5dbdf8c6f6d3c896082a5a07b4292f5fb410 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Tue, 5 Jul 2022 01:47:35 +0100
Subject: [PATCH 1/2] meson: set -D_GNU_SOURCE for updwtmpx
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Without setting GNU_SOURCE, we end up getting:
```
../gdm-42.0/daemon/gdm-session-record.c:200:9: error: implicit declaration of function updwtmpx; did you mean updwtmp? [-Werror=implicit-function-declaration]
updwtmpx (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
```
This ended up exposing a bug in updwtmp(3) (which is now fixed
thanks to the man-pages maintainers!) as it didn't mention that updwtmpx
is a GNU extension (and hence needs GNU_SOURCE in order to be available).
Alternatively, we could just #define _GNU_SOURCE in gdm-session-record.c
for updwtmpx.
Bug: https://bugzilla.kernel.org/show_bug.cgi?id=216168
---
meson.build | 3 +++
1 file changed, 3 insertions(+)
diff --git a/meson.build b/meson.build
index 8328dd97..4a286f97 100644
--- a/meson.build
+++ b/meson.build
@@ -1,44 +1,47 @@
project('gdm', 'c',
version: '40.0',
license: 'GPL2+',
meson_version: '>= 0.50',
)
# Modules
gnome = import('gnome')
pkgconfig = import('pkgconfig')
i18n = import('i18n')
# Compiler
cc = meson.get_compiler('c')
+# Use GNU extensions if available
+add_project_arguments('-D_GNU_SOURCE', language: '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')
glib_min_version = '2.56.0'
glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
--
2.31.1

View File

@ -1,362 +0,0 @@
From 7b5ee288d992f85eaefbfbc4dac663a29fcae446 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 5 May 2021 11:06:58 -0400
Subject: [PATCH] 0001-utils-Drop-gdm-screenshot.patch
---
utils/gdm-screenshot.c | 296 -----------------------------------------
utils/meson.build | 15 ---
2 files changed, 311 deletions(-)
delete mode 100644 utils/gdm-screenshot.c
diff --git a/utils/gdm-screenshot.c b/utils/gdm-screenshot.c
deleted file mode 100644
index 5d20929a3..000000000
--- a/utils/gdm-screenshot.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
- *
- * 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 <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <locale.h>
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <canberra-gtk.h>
-
-#include <X11/Xatom.h>
-#include <gdk/gdkx.h>
-
-#define SELECTION_NAME "_GDM_SCREENSHOT"
-static GtkWidget *selection_window;
-
-static gboolean debug_in;
-
-/* Keep all config options for compatibility even if they are noops */
-GOptionEntry options [] = {
- { "debug", 'd', 0, G_OPTION_ARG_NONE, &debug_in, N_("Debugging output"), NULL },
- { NULL }
-};
-
-/* To make sure there is only one screenshot taken at a time,
- * (Imagine key repeat for the print screen key) we hold a selection
- * until we are done taking the screenshot
- */
-/* * Copyright (C) 2001-2006 Jonathan Blandford <jrb@alum.mit.edu> */
-static gboolean
-screenshot_grab_lock (void)
-{
- Atom selection_atom;
- GdkCursor *cursor;
- gboolean result = FALSE;
-
- selection_atom = gdk_x11_get_xatom_by_name (SELECTION_NAME);
- XGrabServer (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
- if (XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), selection_atom) != None) {
- goto out;
- }
-
- selection_window = gtk_invisible_new ();
- gtk_widget_show (selection_window);
-
- if (!gtk_selection_owner_set (selection_window,
- gdk_atom_intern (SELECTION_NAME, FALSE),
- GDK_CURRENT_TIME)) {
- gtk_widget_destroy (selection_window);
- selection_window = NULL;
- goto out;
- }
-
- cursor = gdk_cursor_new_for_display (gdk_display_get_default (), GDK_WATCH);
- gdk_pointer_grab (gtk_widget_get_window (selection_window), FALSE, 0, NULL,
- cursor, GDK_CURRENT_TIME);
- g_object_unref (cursor);
-
- result = TRUE;
-
- out:
- XUngrabServer (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
- gdk_flush ();
-
- return result;
-}
-
-/* * Copyright (C) 2001-2006 Jonathan Blandford <jrb@alum.mit.edu> */
-static void
-screenshot_release_lock (void)
-{
- if (selection_window != NULL) {
- gtk_widget_destroy (selection_window);
- selection_window = NULL;
- }
- gdk_flush ();
-}
-
-/* * Copyright (C) 2001-2006 Jonathan Blandford <jrb@alum.mit.edu> */
-static GdkPixbuf *
-screenshot_get_pixbuf (Window w)
-{
- GdkWindow *window;
- GdkWindow *root;
- GdkPixbuf *screenshot;
- int x_real_orig;
- int y_real_orig;
- int x_orig;
- int y_orig;
- int real_width;
- int real_height;
- int width;
- int height;
-
- window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), w);
- if (window == NULL) {
- return NULL;
- }
-
- root = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), GDK_ROOT_WINDOW ());
- gdk_window_get_geometry (window, NULL, NULL, &real_width, &real_height);
- gdk_window_get_origin (window, &x_real_orig, &y_real_orig);
-
- x_orig = x_real_orig;
- y_orig = y_real_orig;
- width = real_width;
- height = real_height;
-
- if (x_orig < 0) {
- width = width + x_orig;
- x_orig = 0;
- }
- if (y_orig < 0) {
- height = height + y_orig;
- y_orig = 0;
- }
-
- if (x_orig + width > gdk_screen_width ()) {
- width = gdk_screen_width () - x_orig;
- }
- if (y_orig + height > gdk_screen_height ()) {
- height = gdk_screen_height () - y_orig;
- }
-
- screenshot = gdk_pixbuf_get_from_window (root,
- x_orig,
- y_orig,
- width,
- height);
-
- return screenshot;
-}
-
-static char *
-screenshot_save (GdkPixbuf *pixbuf)
-{
- char *filename;
- gboolean res;
- GError *error;
-
- filename = g_build_filename (GDM_SCREENSHOT_DIR,
- "GDM-Screenshot.png",
- NULL);
-
- error = NULL;
- res = gdk_pixbuf_save (pixbuf,
- filename,
- "png",
- &error,
- "tEXt::CREATOR", "gdm-screenshot",
- NULL);
- if (! res) {
- g_warning ("Unable to save screenshot: %s", error->message);
- g_error_free (error);
- g_free (filename);
- filename = NULL;
- }
-
- return filename;
-}
-
-static void
-sound_effect_finished (ca_context *c,
- uint32_t id,
- int error_code,
- void *userdata)
-{
-}
-
-static void
-play_sound_effect (Window xid)
-{
- ca_context *c;
- ca_proplist *p;
- int res;
-
- c = ca_gtk_context_get ();
-
- p = NULL;
- res = ca_proplist_create (&p);
- if (res < 0) {
- goto done;
- }
-
- res = ca_proplist_sets (p, CA_PROP_EVENT_ID, "screen-capture");
- if (res < 0) {
- goto done;
- }
-
- res = ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Screenshot taken"));
- if (res < 0) {
- goto done;
- }
-
- res = ca_proplist_setf (p,
- CA_PROP_WINDOW_X11_XID,
- "%lu",
- (unsigned long) xid);
- if (res < 0) {
- goto done;
- }
-
- ca_context_play_full (c, 0, p, sound_effect_finished, NULL);
-
- done:
- if (p != NULL) {
- ca_proplist_destroy (p);
- }
-
-}
-
-static void
-prepare_screenshot (void)
-{
- Window win;
- GdkPixbuf *screenshot;
- char *filename;
-
- if (!screenshot_grab_lock ()) {
- exit (EXIT_SUCCESS);
- }
-
- win = GDK_ROOT_WINDOW ();
-
- screenshot = screenshot_get_pixbuf (win);
-
- screenshot_release_lock ();
-
- if (screenshot == NULL) {
- /* FIXME: dialog? */
- exit (EXIT_FAILURE);
- }
-
- play_sound_effect (win);
-
- filename = screenshot_save (screenshot);
- if (filename != NULL) {
- g_print ("Wrote %s\n", filename);
- /* FIXME: show a dialog or something */
- g_free (filename);
- }
-}
-
-int
-main (int argc, char *argv[])
-{
- GOptionContext *ctx;
- gboolean res;
- GError *error;
-
- bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
- setlocale (LC_ALL, "");
-
- /* Option parsing */
- ctx = g_option_context_new (N_("Take a picture of the screen"));
- g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
- g_option_context_add_main_entries (ctx, options, NULL);
- g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
- error = NULL;
- res = g_option_context_parse (ctx, &argc, &argv, &error);
- g_option_context_free (ctx);
-
- if (! res) {
- g_warning ("%s", error->message);
- g_error_free (error);
- exit (EXIT_FAILURE);
- }
-
- prepare_screenshot ();
-
- return 1;
-}
diff --git a/utils/meson.build b/utils/meson.build
index d59f167b0..1edd7bce4 100644
--- a/utils/meson.build
+++ b/utils/meson.build
@@ -1,41 +1,26 @@
# gdm-flexiserver
gdm_flexiserver_deps = [
glib_dep,
libgdmcommon_dep,
]
gdm_flexiserver = executable('gdmflexiserver',
'gdmflexiserver.c',
dependencies: gdm_flexiserver_deps,
include_directories: config_h_dir,
install: true,
)
-# gdm-screenshot
-gdm_screenshot_deps = [
- glib_dep,
- gtk_dep,
- x_deps,
- libcanberra_gtk_dep,
-]
-
-gdm_screenshot = executable('gdm-screenshot',
- 'gdm-screenshot.c',
- dependencies: gdm_screenshot_deps,
- include_directories: config_h_dir,
- install: true,
-)
-
# gdm-runtime-config
gdm_runtime_config_deps = [
glib_dep,
]
gdm_runtime_config = executable('gdm-runtime-config',
'gdm-runtime-config.c',
dependencies: gdm_runtime_config_deps,
include_directories: config_h_dir,
install: true,
install_dir: get_option('libexecdir'),
)
--
2.31.1

View File

@ -1,565 +0,0 @@
From f0dce28fa02210caa445e96d9cbec1d150b79e80 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 15 Aug 2018 10:48:16 -0400
Subject: [PATCH 1/4] worker: don't load user settings for program sessions
We don't need or want the login greeter to access accountsservice
for its session name
---
daemon/gdm-session-worker.c | 37 ++++++++++++++++++++++++++-----------
1 file changed, 26 insertions(+), 11 deletions(-)
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index 9b8e0d87..438348df 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -400,103 +400,108 @@ gdm_session_execute (const char *file,
*/
static gboolean
gdm_session_worker_get_username (GdmSessionWorker *worker,
char **username)
{
gconstpointer item;
g_assert (worker->priv->pam_handle != NULL);
if (pam_get_item (worker->priv->pam_handle, PAM_USER, &item) == PAM_SUCCESS) {
if (username != NULL) {
*username = g_strdup ((char *) item);
g_debug ("GdmSessionWorker: username is '%s'",
*username != NULL ? *username : "<unset>");
}
if (worker->priv->auditor != NULL) {
gdm_session_auditor_set_username (worker->priv->auditor, (char *)item);
}
return TRUE;
}
return FALSE;
}
static void
attempt_to_load_user_settings (GdmSessionWorker *worker,
const char *username)
{
+ if (worker->priv->user_settings == NULL)
+ return;
+
+ if (gdm_session_settings_is_loaded (worker->priv->user_settings))
+ return;
+
g_debug ("GdmSessionWorker: attempting to load user settings");
gdm_session_settings_load (worker->priv->user_settings,
username);
}
static void
gdm_session_worker_update_username (GdmSessionWorker *worker)
{
char *username;
gboolean res;
username = NULL;
res = gdm_session_worker_get_username (worker, &username);
if (res) {
g_debug ("GdmSessionWorker: old-username='%s' new-username='%s'",
worker->priv->username != NULL ? worker->priv->username : "<unset>",
username != NULL ? username : "<unset>");
gdm_session_auditor_set_username (worker->priv->auditor, worker->priv->username);
if ((worker->priv->username == username) ||
((worker->priv->username != NULL) && (username != NULL) &&
(strcmp (worker->priv->username, username) == 0)))
goto out;
g_debug ("GdmSessionWorker: setting username to '%s'", username);
g_free (worker->priv->username);
worker->priv->username = username;
username = NULL;
gdm_dbus_worker_emit_username_changed (GDM_DBUS_WORKER (worker),
worker->priv->username);
/* We have a new username to try. If we haven't been able to
* read user settings up until now, then give it a go now
* (see the comment in do_setup for rationale on why it's useful
* to keep trying to read settings)
*/
if (worker->priv->username != NULL &&
- worker->priv->username[0] != '\0' &&
- !gdm_session_settings_is_loaded (worker->priv->user_settings)) {
+ worker->priv->username[0] != '\0') {
attempt_to_load_user_settings (worker, worker->priv->username);
}
}
out:
g_free (username);
}
static gboolean
gdm_session_worker_ask_question (GdmSessionWorker *worker,
const char *question,
char **answerp)
{
return gdm_dbus_worker_manager_call_info_query_sync (worker->priv->manager,
worker->priv->service,
question,
answerp,
NULL,
NULL);
}
static gboolean
gdm_session_worker_ask_for_secret (GdmSessionWorker *worker,
const char *question,
char **answerp)
{
return gdm_dbus_worker_manager_call_secret_info_query_sync (worker->priv->manager,
worker->priv->service,
question,
answerp,
@@ -2598,87 +2603,89 @@ gdm_session_worker_get_property (GObject *object,
g_value_set_boolean (value, self->priv->is_reauth_session);
break;
case PROP_STATE:
g_value_set_enum (value, self->priv->state);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static gboolean
gdm_session_worker_handle_set_environment_variable (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *key,
const char *value)
{
GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
gdm_session_worker_set_environment_variable (worker, key, value);
gdm_dbus_worker_complete_set_environment_variable (object, invocation);
return TRUE;
}
static gboolean
gdm_session_worker_handle_set_session_name (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *session_name)
{
GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
g_debug ("GdmSessionWorker: session name set to %s", session_name);
- gdm_session_settings_set_session_name (worker->priv->user_settings,
- session_name);
+ if (worker->priv->user_settings != NULL)
+ gdm_session_settings_set_session_name (worker->priv->user_settings,
+ session_name);
gdm_dbus_worker_complete_set_session_name (object, invocation);
return TRUE;
}
static gboolean
gdm_session_worker_handle_set_session_display_mode (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *str)
{
GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
g_debug ("GdmSessionWorker: session display mode set to %s", str);
worker->priv->display_mode = gdm_session_display_mode_from_string (str);
gdm_dbus_worker_complete_set_session_display_mode (object, invocation);
return TRUE;
}
static gboolean
gdm_session_worker_handle_set_language_name (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *language_name)
{
GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
g_debug ("GdmSessionWorker: language name set to %s", language_name);
- gdm_session_settings_set_language_name (worker->priv->user_settings,
- language_name);
+ if (worker->priv->user_settings != NULL)
+ gdm_session_settings_set_language_name (worker->priv->user_settings,
+ language_name);
gdm_dbus_worker_complete_set_language_name (object, invocation);
return TRUE;
}
static void
on_saved_language_name_read (GdmSessionWorker *worker)
{
char *language_name;
language_name = gdm_session_settings_get_language_name (worker->priv->user_settings);
g_debug ("GdmSessionWorker: Saved language is %s", language_name);
gdm_dbus_worker_emit_saved_language_name_read (GDM_DBUS_WORKER (worker),
language_name);
g_free (language_name);
}
static void
on_saved_session_name_read (GdmSessionWorker *worker)
{
char *session_name;
session_name = gdm_session_settings_get_session_name (worker->priv->user_settings);
g_debug ("GdmSessionWorker: Saved session is %s", session_name);
gdm_dbus_worker_emit_saved_session_name_read (GDM_DBUS_WORKER (worker),
session_name);
g_free (session_name);
}
@@ -2756,110 +2763,113 @@ do_authorize (GdmSessionWorker *worker)
g_dbus_method_invocation_take_error (worker->priv->pending_invocation, error);
}
worker->priv->pending_invocation = NULL;
}
static void
do_accredit (GdmSessionWorker *worker)
{
GError *error;
gboolean res;
/* get kerberos tickets, setup group lists, etc
*/
error = NULL;
res = gdm_session_worker_accredit_user (worker, &error);
if (res) {
gdm_dbus_worker_complete_establish_credentials (GDM_DBUS_WORKER (worker), worker->priv->pending_invocation);
} else {
g_dbus_method_invocation_take_error (worker->priv->pending_invocation, error);
}
worker->priv->pending_invocation = NULL;
}
static void
save_account_details_now (GdmSessionWorker *worker)
{
g_assert (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCREDITED);
g_debug ("GdmSessionWorker: saving account details for user %s", worker->priv->username);
+
gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_ACCOUNT_DETAILS_SAVED);
- if (!gdm_session_settings_save (worker->priv->user_settings,
- worker->priv->username)) {
- g_warning ("could not save session and language settings");
+ if (worker->priv->user_settings != NULL) {
+ if (!gdm_session_settings_save (worker->priv->user_settings,
+ worker->priv->username)) {
+ g_warning ("could not save session and language settings");
+ }
}
queue_state_change (worker);
}
static void
on_settings_is_loaded_changed (GdmSessionSettings *user_settings,
GParamSpec *pspec,
GdmSessionWorker *worker)
{
if (!gdm_session_settings_is_loaded (worker->priv->user_settings)) {
return;
}
/* These signal handlers should be disconnected after the loading,
* so that gdm_session_settings_set_* APIs don't cause the emitting
* of Saved*NameRead D-Bus signals any more.
*/
g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
G_CALLBACK (on_saved_session_name_read),
worker);
g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
G_CALLBACK (on_saved_language_name_read),
worker);
if (worker->priv->state == GDM_SESSION_WORKER_STATE_NONE) {
g_debug ("GdmSessionWorker: queuing setup for user: %s %s",
worker->priv->username, worker->priv->display_device);
queue_state_change (worker);
} else if (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCREDITED) {
save_account_details_now (worker);
} else {
return;
}
g_signal_handlers_disconnect_by_func (G_OBJECT (worker->priv->user_settings),
G_CALLBACK (on_settings_is_loaded_changed),
worker);
}
static void
do_save_account_details_when_ready (GdmSessionWorker *worker)
{
g_assert (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCREDITED);
- if (!gdm_session_settings_is_loaded (worker->priv->user_settings)) {
+ if (worker->priv->user_settings != NULL && !gdm_session_settings_is_loaded (worker->priv->user_settings)) {
g_signal_connect (G_OBJECT (worker->priv->user_settings),
"notify::is-loaded",
G_CALLBACK (on_settings_is_loaded_changed),
worker);
g_debug ("GdmSessionWorker: user %s, not fully loaded yet, will save account details later",
worker->priv->username);
gdm_session_settings_load (worker->priv->user_settings,
worker->priv->username);
return;
}
save_account_details_now (worker);
}
static void
do_open_session (GdmSessionWorker *worker)
{
GError *error;
gboolean res;
error = NULL;
res = gdm_session_worker_open_session (worker, &error);
if (res) {
char *session_id = worker->priv->session_id;
if (session_id == NULL) {
session_id = "";
}
gdm_dbus_worker_complete_open (GDM_DBUS_WORKER (worker), worker->priv->pending_invocation, session_id);
@@ -3103,155 +3113,161 @@ gdm_session_worker_handle_initialize (GdmDBusWorker *object,
if (g_strcmp0 (key, "service") == 0) {
worker->priv->service = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "extensions") == 0) {
worker->priv->extensions = filter_extensions (g_variant_get_strv (value, NULL));
} else if (g_strcmp0 (key, "username") == 0) {
worker->priv->username = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "is-program-session") == 0) {
worker->priv->is_program_session = g_variant_get_boolean (value);
} else if (g_strcmp0 (key, "log-file") == 0) {
worker->priv->log_file = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "x11-display-name") == 0) {
worker->priv->x11_display_name = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "x11-authority-file") == 0) {
worker->priv->x11_authority_file = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "console") == 0) {
worker->priv->display_device = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "seat-id") == 0) {
worker->priv->display_seat_id = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "hostname") == 0) {
worker->priv->hostname = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "display-is-local") == 0) {
worker->priv->display_is_local = g_variant_get_boolean (value);
} else if (g_strcmp0 (key, "display-is-initial") == 0) {
worker->priv->display_is_initial = g_variant_get_boolean (value);
}
}
worker->priv->pending_invocation = invocation;
if (!worker->priv->is_program_session) {
+ worker->priv->user_settings = gdm_session_settings_new ();
+
g_signal_connect_swapped (worker->priv->user_settings,
"notify::language-name",
G_CALLBACK (on_saved_language_name_read),
worker);
g_signal_connect_swapped (worker->priv->user_settings,
"notify::session-name",
G_CALLBACK (on_saved_session_name_read),
worker);
if (worker->priv->username) {
wait_for_settings = !gdm_session_settings_load (worker->priv->user_settings,
worker->priv->username);
}
}
if (wait_for_settings) {
/* Load settings from accounts daemon before continuing
*/
g_signal_connect (G_OBJECT (worker->priv->user_settings),
"notify::is-loaded",
G_CALLBACK (on_settings_is_loaded_changed),
worker);
} else {
queue_state_change (worker);
}
return TRUE;
}
static gboolean
gdm_session_worker_handle_setup (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *service,
const char *x11_display_name,
const char *x11_authority_file,
const char *console,
const char *seat_id,
const char *hostname,
gboolean display_is_local,
gboolean display_is_initial)
{
GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE);
worker->priv->service = g_strdup (service);
worker->priv->x11_display_name = g_strdup (x11_display_name);
worker->priv->x11_authority_file = g_strdup (x11_authority_file);
worker->priv->display_device = g_strdup (console);
worker->priv->display_seat_id = g_strdup (seat_id);
worker->priv->hostname = g_strdup (hostname);
worker->priv->display_is_local = display_is_local;
worker->priv->display_is_initial = display_is_initial;
worker->priv->username = NULL;
+ worker->priv->user_settings = gdm_session_settings_new ();
+
g_signal_connect_swapped (worker->priv->user_settings,
"notify::language-name",
G_CALLBACK (on_saved_language_name_read),
worker);
g_signal_connect_swapped (worker->priv->user_settings,
"notify::session-name",
G_CALLBACK (on_saved_session_name_read),
worker);
return TRUE;
}
static gboolean
gdm_session_worker_handle_setup_for_user (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *service,
const char *username,
const char *x11_display_name,
const char *x11_authority_file,
const char *console,
const char *seat_id,
const char *hostname,
gboolean display_is_local,
gboolean display_is_initial)
{
GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
if (!validate_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE))
return TRUE;
worker->priv->service = g_strdup (service);
worker->priv->x11_display_name = g_strdup (x11_display_name);
worker->priv->x11_authority_file = g_strdup (x11_authority_file);
worker->priv->display_device = g_strdup (console);
worker->priv->display_seat_id = g_strdup (seat_id);
worker->priv->hostname = g_strdup (hostname);
worker->priv->display_is_local = display_is_local;
worker->priv->display_is_initial = display_is_initial;
worker->priv->username = g_strdup (username);
+ worker->priv->user_settings = gdm_session_settings_new ();
+
g_signal_connect_swapped (worker->priv->user_settings,
"notify::language-name",
G_CALLBACK (on_saved_language_name_read),
worker);
g_signal_connect_swapped (worker->priv->user_settings,
"notify::session-name",
G_CALLBACK (on_saved_session_name_read),
worker);
/* Load settings from accounts daemon before continuing
*/
worker->priv->pending_invocation = invocation;
if (gdm_session_settings_load (worker->priv->user_settings, username)) {
queue_state_change (worker);
} else {
g_signal_connect (G_OBJECT (worker->priv->user_settings),
"notify::is-loaded",
G_CALLBACK (on_settings_is_loaded_changed),
worker);
}
return TRUE;
}
static gboolean
gdm_session_worker_handle_setup_for_program (GdmDBusWorker *object,
GDBusMethodInvocation *invocation,
const char *service,
const char *username,
@@ -3589,61 +3605,60 @@ static void
reauthentication_request_free (ReauthenticationRequest *request)
{
g_signal_handlers_disconnect_by_func (request->session,
G_CALLBACK (on_reauthentication_client_connected),
request);
g_signal_handlers_disconnect_by_func (request->session,
G_CALLBACK (on_reauthentication_client_disconnected),
request);
g_signal_handlers_disconnect_by_func (request->session,
G_CALLBACK (on_reauthentication_cancelled),
request);
g_signal_handlers_disconnect_by_func (request->session,
G_CALLBACK (on_reauthentication_conversation_started),
request);
g_signal_handlers_disconnect_by_func (request->session,
G_CALLBACK (on_reauthentication_conversation_stopped),
request);
g_signal_handlers_disconnect_by_func (request->session,
G_CALLBACK (on_reauthentication_verification_complete),
request);
g_clear_object (&request->session);
g_slice_free (ReauthenticationRequest, request);
}
static void
gdm_session_worker_init (GdmSessionWorker *worker)
{
worker->priv = GDM_SESSION_WORKER_GET_PRIVATE (worker);
- worker->priv->user_settings = gdm_session_settings_new ();
worker->priv->reauthentication_requests = g_hash_table_new_full (NULL,
NULL,
NULL,
(GDestroyNotify)
reauthentication_request_free);
}
static void
gdm_session_worker_unwatch_child (GdmSessionWorker *worker)
{
if (worker->priv->child_watch_id == 0)
return;
g_source_remove (worker->priv->child_watch_id);
worker->priv->child_watch_id = 0;
}
static void
gdm_session_worker_finalize (GObject *object)
{
GdmSessionWorker *worker;
g_return_if_fail (object != NULL);
g_return_if_fail (GDM_IS_SESSION_WORKER (object));
worker = GDM_SESSION_WORKER (object);
g_return_if_fail (worker->priv != NULL);
--
2.33.1

View File

@ -1,131 +0,0 @@
From c00daca1579c47f3f62894ff2378c37e6cbebfd3 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 20 Jul 2021 13:36:45 -0400
Subject: [PATCH 2/4] libgdm: Sort session list
Right now the session list comes out in hash table order.
This commit changes the code to sort by description.
---
libgdm/gdm-sessions.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/libgdm/gdm-sessions.c b/libgdm/gdm-sessions.c
index 97ed5ef3..f078e04b 100644
--- a/libgdm/gdm-sessions.c
+++ b/libgdm/gdm-sessions.c
@@ -311,92 +311,111 @@ collect_sessions (void)
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);
}
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 (!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
#endif
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
*/
char **
gdm_get_session_ids (void)
{
GHashTableIter iter;
gpointer key, value;
GPtrArray *array;
if (!gdm_sessions_map_is_initialized) {
collect_sessions ();
gdm_sessions_map_is_initialized = TRUE;
}
array = g_ptr_array_new ();
g_hash_table_iter_init (&iter, gdm_available_sessions_map);
while (g_hash_table_iter_next (&iter, &key, &value)) {
GdmSessionFile *session;
session = (GdmSessionFile *) value;
g_ptr_array_add (array, g_strdup (session->id));
}
g_ptr_array_add (array, NULL);
+ g_ptr_array_sort (array, compare_session_ids);
+
return (char **) g_ptr_array_free (array, FALSE);
}
/**
* gdm_get_session_name_and_description:
* @id: an id from gdm_get_session_ids()
* @description: (out): optional returned session description
*
* Takes an xsession id and returns the name and comment about it.
*
* Returns: The session name if found, or %NULL otherwise
*/
char *
gdm_get_session_name_and_description (const char *id,
char **description)
{
GdmSessionFile *session;
char *name;
if (!gdm_sessions_map_is_initialized) {
collect_sessions ();
gdm_sessions_map_is_initialized = TRUE;
}
session = (GdmSessionFile *) g_hash_table_lookup (gdm_available_sessions_map,
id);
if (session == NULL) {
return NULL;
--
2.34.1

View File

@ -1,119 +0,0 @@
From 9f4b4ef1b5e1458ca67cff235b655060b27e357b Mon Sep 17 00:00:00 2001
From: Graham Rogers <graham@rogers.me.uk>
Date: Sun, 18 Apr 2021 12:22:14 +0100
Subject: [PATCH 2/2] pam_gdm: Use the last cryptsetup password instead of the
first
---
pam_gdm/pam_gdm.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/pam_gdm/pam_gdm.c b/pam_gdm/pam_gdm.c
index 767a6c8c..ef77f161 100644
--- a/pam_gdm/pam_gdm.c
+++ b/pam_gdm/pam_gdm.c
@@ -11,75 +11,95 @@
* 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 <unistd.h>
#include <security/_pam_macros.h>
#include <security/pam_ext.h>
#include <security/pam_misc.h>
#include <security/pam_modules.h>
#include <security/pam_modutil.h>
#ifdef HAVE_KEYUTILS
#include <keyutils.h>
#endif
int
pam_sm_authenticate (pam_handle_t *pamh,
int flags,
int argc,
const char **argv)
{
#ifdef HAVE_KEYUTILS
- int r;
- void *cached_password = NULL;
+ long r;
+ size_t cached_passwords_length;
+ char *cached_passwords = NULL;
+ char *last_cached_password = NULL;
key_serial_t serial;
+ size_t i;
serial = find_key_by_type_and_desc ("user", "cryptsetup", 0);
if (serial == 0)
return PAM_AUTHINFO_UNAVAIL;
- r = keyctl_read_alloc (serial, &cached_password);
- if (r < 0 || r != strlen (cached_password))
+ r = keyctl_read_alloc (serial, &cached_passwords);
+ if (r < 0)
return PAM_AUTHINFO_UNAVAIL;
+
+ cached_passwords_length = r;
+
+ /*
+ Find the last password in the NUL-separated list of passwords.
+ Multiple passwords are returned either when the user enters an
+ incorrect password or there are multiple encrypted drives.
+ In the case of an incorrect password the last one is correct.
+ In the case of multiple drives, choosing the last drive is as
+ arbitrary a choice as any other, but choosing the last password at
+ least supports multiple attempts on the last drive.
+ */
+ last_cached_password = cached_passwords;
+ for (i = 0; i < cached_passwords_length; i++) {
+ last_cached_password = cached_passwords + i;
+ i += strlen (last_cached_password);
+ }
- r = pam_set_item (pamh, PAM_AUTHTOK, cached_password);
+ r = pam_set_item (pamh, PAM_AUTHTOK, last_cached_password);
- free (cached_password);
+ free (cached_passwords);
if (r < 0)
return PAM_AUTH_ERR;
else
return PAM_SUCCESS;
#endif
return PAM_AUTHINFO_UNAVAIL;
}
int
pam_sm_setcred (pam_handle_t *pamh,
int flags,
int argc,
const char **argv)
{
return PAM_SUCCESS;
}
int
pam_sm_acct_mgmt (pam_handle_t *pamh,
int flags,
int argc,
const char **argv)
{
return PAM_SUCCESS;
}
int
pam_sm_chauthtok (pam_handle_t *pamh,
--
2.35.1

View File

@ -1,611 +0,0 @@
From de95917e0e9d142703a86f94961ef9fd4151739d Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 20 Aug 2018 14:30:59 -0400
Subject: [PATCH 3/4] daemon: save os-release in accountsservice
It can be useful to know what OS a user was running
when they logged in (to detect upgrades).
This commit saves that information in accountsservice.
---
.../com.redhat.AccountsServiceUser.System.xml | 10 ++
daemon/gdm-session-settings.c | 98 +++++++++++++++++++
daemon/gdm-session.c | 4 +-
daemon/meson.build | 8 ++
4 files changed, 118 insertions(+), 2 deletions(-)
create mode 100644 daemon/com.redhat.AccountsServiceUser.System.xml
diff --git a/daemon/com.redhat.AccountsServiceUser.System.xml b/daemon/com.redhat.AccountsServiceUser.System.xml
new file mode 100644
index 00000000..67f5f302
--- /dev/null
+++ b/daemon/com.redhat.AccountsServiceUser.System.xml
@@ -0,0 +1,10 @@
+<node>
+ <interface name="com.redhat.AccountsServiceUser.System">
+
+ <annotation name="org.freedesktop.Accounts.VendorExtension" value="true"/>
+
+ <property name="id" type="s" access="readwrite"/>
+ <property name="version-id" type="s" access="readwrite"/>
+
+ </interface>
+</node>
diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c
index f2b1addd..a4b7f1a6 100644
--- a/daemon/gdm-session-settings.c
+++ b/daemon/gdm-session-settings.c
@@ -1,70 +1,77 @@
/* gdm-session-settings.c - Loads session and language from ~/.dmrc
*
* Copyright (C) 2008 Red Hat, Inc.
*
* 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, 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.
*
* Written by: Ray Strode <rstrode@redhat.com>
*/
#include "config.h"
#include "gdm-session-settings.h"
+#include "gdm-common.h"
+
+#include "com.redhat.AccountsServiceUser.System.h"
#include <errno.h>
#include <pwd.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <glib.h>
#include <glib-object.h>
#include <glib/gi18n.h>
#include <act/act-user-manager.h>
struct _GdmSessionSettingsPrivate
{
ActUserManager *user_manager;
ActUser *user;
+
+ /* used for retrieving the last OS user logged in with */
+ GdmAccountsServiceUserSystem *user_system_proxy;
+
char *session_name;
char *session_type;
char *language_name;
};
static void gdm_session_settings_finalize (GObject *object);
static void gdm_session_settings_class_install_properties (GdmSessionSettingsClass *
settings_class);
static void gdm_session_settings_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gdm_session_settings_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
enum {
PROP_0 = 0,
PROP_SESSION_NAME,
PROP_SESSION_TYPE,
PROP_LANGUAGE_NAME,
PROP_IS_LOADED
};
G_DEFINE_TYPE_WITH_PRIVATE (GdmSessionSettings,
gdm_session_settings,
G_TYPE_OBJECT)
@@ -107,60 +114,62 @@ gdm_session_settings_class_install_properties (GdmSessionSettingsClass *settings
g_object_class_install_property (object_class, PROP_LANGUAGE_NAME, param_spec);
param_spec = g_param_spec_boolean ("is-loaded", NULL, NULL,
FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_IS_LOADED, param_spec);
}
static void
gdm_session_settings_init (GdmSessionSettings *settings)
{
settings->priv = G_TYPE_INSTANCE_GET_PRIVATE (settings,
GDM_TYPE_SESSION_SETTINGS,
GdmSessionSettingsPrivate);
settings->priv->user_manager = act_user_manager_get_default ();
}
static void
gdm_session_settings_finalize (GObject *object)
{
GdmSessionSettings *settings;
GObjectClass *parent_class;
settings = GDM_SESSION_SETTINGS (object);
if (settings->priv->user != NULL) {
g_object_unref (settings->priv->user);
}
+ g_clear_object (&settings->priv->user_system_proxy);
+
g_free (settings->priv->session_name);
g_free (settings->priv->language_name);
parent_class = G_OBJECT_CLASS (gdm_session_settings_parent_class);
if (parent_class->finalize != NULL) {
parent_class->finalize (object);
}
}
void
gdm_session_settings_set_language_name (GdmSessionSettings *settings,
const char *language_name)
{
g_return_if_fail (GDM_IS_SESSION_SETTINGS (settings));
if (settings->priv->language_name == NULL ||
strcmp (settings->priv->language_name, language_name) != 0) {
settings->priv->language_name = g_strdup (language_name);
g_object_notify (G_OBJECT (settings), "language-name");
}
}
void
gdm_session_settings_set_session_name (GdmSessionSettings *settings,
const char *session_name)
{
g_return_if_fail (GDM_IS_SESSION_SETTINGS (settings));
if (settings->priv->session_name == NULL ||
@@ -261,69 +270,86 @@ gdm_session_settings_get_property (GObject *object,
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
GdmSessionSettings *
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 *object_path;
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;
}
+ object_path = act_user_get_object_path (settings->priv->user);
+
+ if (object_path != NULL) {
+ g_autoptr (GError) error = NULL;
+ settings->priv->user_system_proxy = gdm_accounts_service_user_system_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ "org.freedesktop.Accounts",
+ object_path,
+ NULL,
+ &error);
+ if (error != NULL) {
+ g_debug ("GdmSessionSettings: couldn't retrieve user system proxy from accountsservice: %s",
+ error->message);
+ }
+ }
+
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,
@@ -349,64 +375,136 @@ gdm_session_settings_load (GdmSessionSettings *settings,
g_return_val_if_fail (!gdm_session_settings_is_loaded (settings), FALSE);
if (settings->priv->user != NULL) {
old_user = settings->priv->user;
g_signal_handlers_disconnect_by_func (G_OBJECT (settings->priv->user),
G_CALLBACK (on_user_is_loaded_changed),
settings);
} else {
old_user = NULL;
}
settings->priv->user = act_user_manager_get_user (settings->priv->user_manager,
username);
g_clear_object (&old_user);
if (!act_user_is_loaded (settings->priv->user)) {
g_signal_connect (settings->priv->user,
"notify::is-loaded",
G_CALLBACK (on_user_is_loaded_changed),
settings);
return FALSE;
}
load_settings_from_user (settings);
return TRUE;
}
+static void
+save_os_release (GdmSessionSettings *settings,
+ ActUser *user)
+{
+ g_autoptr(GFile) file = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autofree char *contents = NULL;
+ g_auto(GStrv) lines = NULL;
+ size_t i;
+
+ if (settings->priv->user_system_proxy == NULL) {
+ g_debug ("GdmSessionSettings: not saving OS version to user account because accountsservice doesn't support it");
+ return;
+ }
+
+ file = g_file_new_for_path ("/etc/os-release");
+
+ if (!g_file_load_contents (file, NULL, &contents, NULL, NULL, &error)) {
+ g_debug ("GdmSessionSettings: couldn't load /etc/os-release: %s", error->message);
+ return;
+ }
+
+ lines = g_strsplit (contents, "\n", -1);
+ for (i = 0; lines[i] != NULL; i++) {
+ char *p, *name, *name_end, *value, *value_end;
+
+ p = lines[i];
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ if (*p == '#' || *p == '\0')
+ continue;
+ name = p;
+ while (gdm_shell_var_is_valid_char (*p, p == name))
+ p++;
+ name_end = p;
+ while (g_ascii_isspace (*p))
+ p++;
+ if (name == name_end || *p != '=') {
+ continue;
+ }
+ *name_end = '\0';
+
+ p++;
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ value = p;
+ value_end = value + strlen(value) - 1;
+
+ if (value != value_end && *value == '"' && *value_end == '"') {
+ value++;
+ *value_end = '\0';
+ }
+
+ if (strcmp (name, "ID") == 0) {
+ gdm_accounts_service_user_system_set_id (settings->priv->user_system_proxy,
+ value);
+ g_debug ("GdmSessionSettings: setting system OS for user to '%s'", value);
+ } else if (strcmp (name, "VERSION_ID") == 0) {
+ gdm_accounts_service_user_system_set_version_id (settings->priv->user_system_proxy,
+ value);
+ g_debug ("GdmSessionSettings: setting system OS version for user to '%s'", value);
+ }
+ }
+}
+
gboolean
gdm_session_settings_save (GdmSessionSettings *settings,
const char *username)
{
ActUser *user;
g_return_val_if_fail (GDM_IS_SESSION_SETTINGS (settings), FALSE);
g_return_val_if_fail (username != NULL, FALSE);
g_return_val_if_fail (gdm_session_settings_is_loaded (settings), FALSE);
user = act_user_manager_get_user (settings->priv->user_manager,
username);
if (!act_user_is_loaded (user)) {
g_object_unref (user);
return FALSE;
}
if (settings->priv->session_name != NULL) {
act_user_set_session (user, settings->priv->session_name);
}
if (settings->priv->session_type != NULL) {
act_user_set_session_type (user, settings->priv->session_type);
}
if (settings->priv->language_name != NULL) {
act_user_set_language (user, settings->priv->language_name);
}
+
+ save_os_release (settings, user);
+
g_object_unref (user);
return TRUE;
}
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index f4d0bef9..d1e2c301 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -351,72 +351,72 @@ supports_session_type (GdmSession *self,
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, 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 *));
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") ||
+ 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));
}
#ifdef ENABLE_WAYLAND_SUPPORT
- if (g_str_equal (supported_type, "wayland") ||
+ 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);
}
g_array_append_val (search_array, wayland_search_dir);
}
#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;
}
diff --git a/daemon/meson.build b/daemon/meson.build
index 2e61b644..71c65039 100644
--- a/daemon/meson.build
+++ b/daemon/meson.build
@@ -15,114 +15,122 @@ local_display_dbus_gen = gnome.gdbus_codegen('gdm-local-display-glue',
'gdm-local-display.xml',
namespace: 'GdmDBus',
interface_prefix: 'org.gnome.DisplayManager',
autocleanup: 'all',
)
local_display_factory_dbus_gen = gnome.gdbus_codegen('gdm-local-display-factory-glue',
'gdm-local-display-factory.xml',
namespace: 'GdmDBus',
interface_prefix: 'org.gnome.DisplayManager',
autocleanup: 'all',
)
manager_dbus_gen = gnome.gdbus_codegen('gdm-manager-glue',
'gdm-manager.xml',
namespace: 'GdmDBus',
interface_prefix: 'org.gnome.DisplayManager',
autocleanup: 'all',
)
session_dbus_gen = gnome.gdbus_codegen('gdm-session-glue',
'gdm-session.xml',
namespace: 'GdmDBus',
interface_prefix: 'org.gnome.DisplayManager',
autocleanup: 'all',
)
session_worker_dbus_gen = gnome.gdbus_codegen('gdm-session-worker-glue',
'gdm-session-worker.xml',
namespace: 'GdmDBus',
interface_prefix: 'org.gnome.DisplayManager',
autocleanup: 'all',
)
+accountsservice_system_user_dbus_gen = gnome.gdbus_codegen('com.redhat.AccountsServiceUser.System',
+ 'com.redhat.AccountsServiceUser.System.xml',
+ namespace: 'Gdm',
+ interface_prefix: 'com.redhat',
+ autocleanup: 'all',
+)
+
gdm_session_enums = gnome.mkenums('gdm-session-enum-types',
h_template: 'gdm-session-enum-types.h.in',
c_template: 'gdm-session-enum-types.c.in',
sources: 'gdm-session.h',
)
gdm_session_worker_enums = gnome.mkenums('gdm-session-worker-enum-types',
h_template: 'gdm-session-worker-enum-types.h.in',
c_template: 'gdm-session-worker-enum-types.c.in',
sources: 'gdm-session-worker.h',
)
# Daemons deps
gdm_daemon_deps = [
libgdmcommon_dep,
accountsservice_dep,
gobject_dep,
gio_dep,
gio_unix_dep,
libpam_dep,
x_deps,
xcb_dep,
]
if xdmcp_dep.found() and get_option('tcp-wrappers')
gdm_daemon_deps += libwrap_dep
endif
# test-session-client
test_session_client_src = [
'test-session-client.c',
session_dbus_gen,
manager_dbus_gen,
]
test_session_client = executable('test-session-client',
test_session_client_src,
dependencies: gdm_daemon_deps,
include_directories: config_h_dir,
)
# Session worker
gdm_session_worker_src = [
'session-worker-main.c',
'gdm-session.c',
'gdm-session-settings.c',
'gdm-session-auditor.c',
'gdm-session-record.c',
'gdm-session-worker.c',
'gdm-session-worker-job.c',
'gdm-session-worker-common.c',
'gdm-dbus-util.c',
dbus_gen,
session_dbus_gen,
session_worker_dbus_gen,
+ accountsservice_system_user_dbus_gen,
gdm_session_enums,
gdm_session_worker_enums,
]
gdm_session_worker_deps = [
gdm_daemon_deps,
]
gdm_session_worker_includes = [
config_h_dir,
]
if pam_extensions_supported
gdm_session_worker_src += '../pam-extensions/gdm-pam-extensions.h'
gdm_session_worker_includes += pam_extensions_inc
endif
if libaudit_dep.found()
gdm_session_worker_deps += libaudit_dep
gdm_session_worker_src += [
'gdm-session-linux-auditor.c',
]
endif
if have_adt
gdm_session_worker_src += 'gdm-session-solaris-auditor.c'
endif
gdm_session_worker = executable('gdm-session-worker',
--
2.33.1

View File

@ -1,250 +0,0 @@
From 738a10ca78e154ad4c3df9a1298eaad01516457e Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 20 Aug 2018 14:30:59 -0400
Subject: [PATCH 4/4] daemon: handle upgrades from RHEL 7
RHEL 7 users need to stay on X if they were using X,
and they need to stay on gnome-classic if they were using
gnome-classic.
This commit examines the user's config to deduce whether
or not they were using RHEL 7 and in the event they were
try to get the right settings.
---
daemon/gdm-session-settings.c | 19 +++++++++++++++++++
daemon/gdm-session.c | 19 ++++++++-----------
2 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c
index a4b7f1a6..a84b2ffa 100644
--- a/daemon/gdm-session-settings.c
+++ b/daemon/gdm-session-settings.c
@@ -270,95 +270,114 @@ gdm_session_settings_get_property (GObject *object,
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
GdmSessionSettings *
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 *system_id = NULL, *system_version_id = NULL;
const char *object_path;
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;
}
object_path = act_user_get_object_path (settings->priv->user);
if (object_path != NULL) {
g_autoptr (GError) error = NULL;
settings->priv->user_system_proxy = gdm_accounts_service_user_system_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
"org.freedesktop.Accounts",
object_path,
NULL,
&error);
if (error != NULL) {
g_debug ("GdmSessionSettings: couldn't retrieve user system proxy from accountsservice: %s",
error->message);
+ } else {
+ system_id = gdm_accounts_service_user_system_get_id (settings->priv->user_system_proxy);
+ system_version_id = gdm_accounts_service_user_system_get_version_id (settings->priv->user_system_proxy);
}
}
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 (system_id == NULL || (g_strcmp0 (system_id, "rhel") == 0 && g_str_has_prefix (system_version_id, "7."))) {
+ /* if there's also no session name in the file and we're coming from RHEL 7,
+ * then we should assume classic session
+ */
+ if (session_name == NULL || session_name[0] == '\0')
+ session_name = "gnome-classic";
+
+ /* only presume wayland if the user specifically picked it in RHEL 7
+ */
+ if (g_strcmp0 (session_name, "gnome-wayland") == 0)
+ session_type = "wayland";
+ else
+ session_type = "x11";
+ }
+
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)) {
load_settings_from_user (settings);
g_signal_handlers_disconnect_by_func (G_OBJECT (settings->priv->user),
G_CALLBACK (on_user_is_loaded_changed),
settings);
}
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index d1e2c301..d4a46d87 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -3207,98 +3207,95 @@ gdm_session_get_session_id (GdmSession *self)
return conversation->session_id;
}
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;
+ g_autoptr (GKeyFile) key_file = NULL;
gboolean is_wayland_session = FALSE;
- char *filename;
- char *full_path = NULL;
+ g_autofree char *filename = NULL;
+ 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);
if (supports_session_type (self, "wayland")) {
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;
+ 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);
+ g_debug ("GdmSession: checking if file '%s' is wayland session: %s", filename, is_wayland_session? "yes" : "no");
return is_wayland_session;
}
#endif
static void
update_session_type (GdmSession *self)
{
#ifdef ENABLE_WAYLAND_SUPPORT
gboolean is_wayland_session = FALSE;
- if (supports_session_type (self, "wayland"))
- is_wayland_session = gdm_session_is_wayland_session (self);
+ is_wayland_session = gdm_session_is_wayland_session (self);
if (is_wayland_session) {
set_session_type (self, "wayland");
} else {
set_session_type (self, NULL);
}
#endif
}
gboolean
gdm_session_session_registers (GdmSession *self)
{
g_autoptr(GError) error = NULL;
g_autoptr(GKeyFile) key_file = NULL;
gboolean session_registers = FALSE;
g_autofree char *filename = 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, NULL, NULL);
session_registers = g_key_file_get_boolean (key_file,
G_KEY_FILE_DESKTOP_GROUP,
"X-GDM-SessionRegisters",
&error);
if (!session_registers &&
error != NULL &&
--
2.33.1

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-9
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: desktop-qe.desktop-ci.tier1-gating.functional}

7
gdm-tmpfiles.conf Normal file
View File

@ -0,0 +1,7 @@
# These directories should be automatically created by systemd-tmpfiles(8) during boot
d /run/gdm 0711 root gdm - -
d /var/lib/gdm 1770 gdm gdm - -
d /var/lib/gdm/.config 0700 gdm gdm - -
d /var/lib/gdm/.config/pulse 0700 gdm gdm - -
d /var/log/gdm 0711 root gdm - -

View File

@ -1,4 +1,3 @@
%global _changelog_trimtime %(date +%s -d "1 year ago")
%global _hardened_build 1 %global _hardened_build 1
%define libauditver 1.0.6 %define libauditver 1.0.6
@ -11,75 +10,68 @@
Name: gdm Name: gdm
Epoch: 1 Epoch: 1
Version: 40.0 Version: 40.1
Release: 27%{?dist} Release: 27%{?dist}
Summary: The GNOME Display Manager Summary: The GNOME Display Manager
License: GPLv2+ License: GPLv2+
URL: https://wiki.gnome.org/Projects/GDM URL: https://wiki.gnome.org/Projects/GDM
Source0: http://download.gnome.org/sources/gdm/40/gdm-%{version}.tar.xz Source0: http://download.gnome.org/sources/gdm/40/gdm-%{tarball_version}.tar.xz
Source1: org.gnome.login-screen.gschema.override Source1: org.gnome.login-screen.gschema.override
Source2: gdm-tmpfiles.conf
# Lets customers using vendor nvidia driver pick wayland sessions from the login screen # 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 Patch10001: 0001-local-display-factory-Provide-more-flexibility-for-c.patch
Patch10002: 0002-libgdm-Sort-session-list.patch
Patch10003: 0003-xdmcp-display-factory-Set-supported-session-types-fo.patch
Patch10004: 0004-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch
# Race fix Patch20001: 0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
Patch40001: 0001-display-Handle-failure-before-display-registration.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
# Don't bother building gdm-screenshot, nothing uses it Patch30001: 0001-local-display-factory-Don-t-try-to-respawn-displays-.patch
Patch50001: 0001-utils-Drop-gdm-screenshot.patch
# Questionable feature to support logging in over multiple XDMCP consoles at the same time Patch40001: 0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch
Patch60001: 0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch
Patch60002: 0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch
Patch60003: 0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch
# Upstream change that's moderately risky so revert it Patch50001: 0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch
Patch70001: 0001-Revert-gdm-wayland-x-session-don-t-overwrite-user-en.patch Patch50002: 0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch
# Crash fix Patch60001: 0001-session-settings-Fetch-session-from-user-even-if-use.patch
Patch80001: 0001-local-display-factory-Don-t-try-to-respawn-displays-.patch
# VT handling fix from upstream Patch70001: 0001-manager-Fix-btmp-record-accounting.patch
Patch90001: 0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch
# Wayland fix from upstream Patch80002: 0001-session-settings-Explicitly-cache-remote-users.patch
Patch100001: 0001-daemon-Infer-session-type-from-desktop-file-if-user-.patch
# Fix DisallowTcp=false from upstream # Latest udev rules and support code
Patch110001: 0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch Patch90001: 0001-local-display-factory-Stall-startup-until-main-graph.patch
Patch110002: 0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch Patch90002: 0002-common-Add-API-to-reload-settings-from-disk.patch
Patch90003: 0003-common-Reload-settings-when-graphics-initialize.patch
Patch90004: 0004-data-Use-latest-upstream-udev-rules.patch
# Fix btmp accounting Patch100001: 0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch
Patch120001: 0001-meson-set-D_GNU_SOURCE-for-updwtmpx.patch Patch100002: 0002-local-display-factory-Fix-user-switching-with-legacy.patch
Patch120002: 0002-manager-Fix-btmp-record-accounting.patch
# Fix status error when stoppping gdm quickly after starting it Patch110001: 0001-display-Add-new-FAILING-state.patch
Patch130001: 0001-daemon-Don-t-error-on-shutdown.patch Patch110002: 0002-manager-Quit-plymouth-at-first-sign-of-failure.patch
Patch110003: 0003-manager-Quit-plymouth-synchronously.patch
# Fix LUKS password propagation
Patch140001: 0001-build-Support-keyutils-1.5.11-and-older.patch
Patch140002: 0002-pam_gdm-Use-the-last-cryptsetup-password-instead-of-.patch
# Non-upstreamable workarounds # Non-upstreamable workarounds
Patch66620001: 0001-data-reap-gdm-sessions-on-shutdown.patch 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 # Non-upstreamable integration patches
Patch99910001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch Patch99910001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
Patch99920001: 0001-worker-don-t-load-user-settings-for-program-sessions.patch
Patch99920002: 0002-session-support-new-accountsservice-Session-and-Sess.patch
Patch99920003: 0003-daemon-save-os-release-in-accountsservice.patch
Patch99920004: 0004-daemon-handle-upgrades-from-RHEL-7.patch
Patch99920006: 0001-data-Disable-network-configuration-on-login-screen.patch
Patch99930001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch Patch99930001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch
Patch99940001: 0001-data-disable-wayland-on-certain-hardware.patch Patch99950001: 0001-data-Disable-network-configuration-on-login-screen.patch
BuildRequires: accountsservice-devel BuildRequires: accountsservice-devel
@ -92,7 +84,6 @@ BuildRequires: keyutils-libs-devel
BuildRequires: libXdmcp-devel BuildRequires: libXdmcp-devel
BuildRequires: libattr-devel BuildRequires: libattr-devel
BuildRequires: libdmx-devel BuildRequires: libdmx-devel
BuildRequires: audit-libs-devel >= %{libauditver}
BuildRequires: meson BuildRequires: meson
BuildRequires: nss-devel >= %{nss_version} BuildRequires: nss-devel >= %{nss_version}
BuildRequires: pam-devel >= 0:%{pam_version} BuildRequires: pam-devel >= 0:%{pam_version}
@ -100,6 +91,7 @@ BuildRequires: pkgconfig(accountsservice) >= 0.6.3
BuildRequires: pkgconfig(check) BuildRequires: pkgconfig(check)
BuildRequires: pkgconfig(gobject-introspection-1.0) BuildRequires: pkgconfig(gobject-introspection-1.0)
BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version} BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version}
BuildRequires: pkgconfig(gudev-1.0)
BuildRequires: pkgconfig(iso-codes) BuildRequires: pkgconfig(iso-codes)
BuildRequires: pkgconfig(libcanberra-gtk3) BuildRequires: pkgconfig(libcanberra-gtk3)
BuildRequires: pkgconfig(libselinux) BuildRequires: pkgconfig(libselinux)
@ -113,10 +105,9 @@ BuildRequires: plymouth-devel
BuildRequires: systemd BuildRequires: systemd
BuildRequires: systemd-devel BuildRequires: systemd-devel
BuildRequires: which BuildRequires: which
%ifnarch s390 s390x ppc ppc64
BuildRequires: xorg-x11-server-Xorg BuildRequires: xorg-x11-server-Xorg
%endif
BuildRequires: xorg-x11-server-devel BuildRequires: xorg-x11-server-devel
BuildRequires: yelp-devel
BuildRequires: yelp-tools BuildRequires: yelp-tools
Requires(pre): /usr/sbin/useradd Requires(pre): /usr/sbin/useradd
@ -124,7 +115,7 @@ Requires(pre): /usr/sbin/useradd
Provides: service(graphical-login) = %{name} Provides: service(graphical-login) = %{name}
Requires: accountsservice >= 0.6.50-3.el8 Requires: accountsservice
Requires: audit-libs >= %{libauditver} Requires: audit-libs >= %{libauditver}
Requires: dconf Requires: dconf
# since we use it, and pam spams the log if the module is missing # since we use it, and pam spams the log if the module is missing
@ -139,32 +130,19 @@ Requires: libXau >= 1.0.4-4
Requires: pam >= 0:%{pam_version} Requires: pam >= 0:%{pam_version}
Requires: /sbin/nologin Requires: /sbin/nologin
Requires: setxkbmap Requires: setxkbmap
Requires: systemd >= 239-50 Requires: systemd >= 186
Requires: system-logos Requires: system-logos
Requires: xorg-x11-server-utils Requires: xhost xmodmap xrdb
Requires: xorg-x11-xinit Requires: xorg-x11-xinit
Recommends: xorg-x11-server-Xorg
Conflicts: xorg-x11-server-Xorg < 1.20.8-4
# Until the greeter gets dynamic user support, it can't # Until the greeter gets dynamic user support, it can't
# use a user bus # use a user bus
Requires: /usr/bin/dbus-run-session Requires: /usr/bin/dbus-run-session
Obsoletes: gdm-libs < 1:3.12.0-3 Requires(posttrans): dconf
Provides: gdm-libs%{?_isa} = %{epoch}:%{version}-%{release} Provides: gdm-libs%{?_isa} = %{epoch}:%{version}-%{release}
# Swallow up old fingerprint/smartcard plugins
Obsoletes: gdm-plugin-smartcard < 1:3.2.1
Provides: gdm-plugin-smartcard = %{epoch}:%{version}-%{release}
Obsoletes: gdm-plugin-fingerprint < 1:3.2.1
Provides: gdm-plugin-fingerprint = %{epoch}:%{version}-%{release}
# moved here from pulseaudio-gdm-hooks-11.1-16
Source5: default.pa-for-gdm
Obsoletes: pulseaudio-gdm-hooks < 1:11.1-17
Provides: pulseaudio-gdm-hooks = 1:%{version}-%{release}
%description %description
GDM, the GNOME Display Manager, handles authentication-related backend GDM, the GNOME Display Manager, handles authentication-related backend
functionality for logging in a user and unlocking the user's session after functionality for logging in a user and unlocking the user's session after
@ -186,7 +164,6 @@ files needed to build custom greeters.
%package pam-extensions-devel %package pam-extensions-devel
Summary: Macros for developing GDM extensions to PAM Summary: Macros for developing GDM extensions to PAM
Group: Development/Libraries
Requires: pam-devel Requires: pam-devel
%description pam-extensions-devel %description pam-extensions-devel
@ -195,18 +172,20 @@ files that are helpful to PAM modules wishing to support
GDM specific authentication features. GDM specific authentication features.
%prep %prep
%autosetup -S git %autosetup -S git -n gdm-%{tarball_version}
%build %build
%meson -Dpam-prefix=%{_sysconfdir} \ %meson -Dpam-prefix=%{_sysconfdir} \
-Drun-dir=/run/gdm \ -Drun-dir=/run/gdm \
-Dudev-dir=%{_udevrulesdir} \ -Dudev-dir=%{_udevrulesdir} \
-Ddefault-path=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \ -Ddefault-path=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \
-Dipv6=true \
-Dprofiling=true \ -Dprofiling=true \
-Dplymouth=enabled \ -Dplymouth=enabled \
-Dselinux=enabled -Dselinux=enabled
%meson_build %meson_build
%install %install
mkdir -p %{buildroot}%{_sysconfdir}/gdm/Init mkdir -p %{buildroot}%{_sysconfdir}/gdm/Init
mkdir -p %{buildroot}%{_sysconfdir}/gdm/PreSession mkdir -p %{buildroot}%{_sysconfdir}/gdm/PreSession
@ -214,6 +193,7 @@ mkdir -p %{buildroot}%{_sysconfdir}/gdm/PostSession
%meson_install %meson_install
install -p -m644 -D %{SOURCE2} %{buildroot}%{_tmpfilesdir}/%{name}.conf
install -p -m644 -D %{SOURCE5} %{buildroot}%{_localstatedir}/lib/gdm/.config/pulse/default.pa install -p -m644 -D %{SOURCE5} %{buildroot}%{_localstatedir}/lib/gdm/.config/pulse/default.pa
rm -f %{buildroot}%{_sysconfdir}/pam.d/gdm rm -f %{buildroot}%{_sysconfdir}/pam.d/gdm
@ -224,9 +204,6 @@ cp -a %{SOURCE1} %{buildroot}%{_datadir}/glib-2.0/schemas
# docs go elsewhere # docs go elsewhere
rm -rf %{buildroot}/%{_prefix}/doc rm -rf %{buildroot}/%{_prefix}/doc
# we're not doing user sessions in rhel 8
rm -rf %{buildroot}%{_prefix}/lib/systemd/user
# create log dir # create log dir
mkdir -p %{buildroot}/var/log/gdm mkdir -p %{buildroot}/var/log/gdm
@ -238,12 +215,6 @@ mkdir -p %{buildroot}/run/gdm
mkdir -p %{buildroot}%{_sysconfdir}/dconf/db/gdm.d/locks mkdir -p %{buildroot}%{_sysconfdir}/dconf/db/gdm.d/locks
cat << EOF > %{buildroot}%{_libexecdir}/gdm-disable-wayland
#!/bin/sh
%{_libexecdir}/gdm-runtime-config set daemon WaylandEnable false
EOF
chmod a+x %{buildroot}%{_libexecdir}/gdm-disable-wayland
%find_lang gdm --with-gnome %find_lang gdm --with-gnome
%pre %pre
@ -254,8 +225,6 @@ chmod a+x %{buildroot}%{_libexecdir}/gdm-disable-wayland
exit 0 exit 0
%post %post
%{?ldconfig}
# if the user already has a config file, then migrate it to the new # if the user already has a config file, then migrate it to the new
# location; rpm will ensure that old file will be renamed # location; rpm will ensure that old file will be renamed
@ -309,9 +278,11 @@ fi
%systemd_preun gdm.service %systemd_preun gdm.service
%postun %postun
%{?ldconfig}
%systemd_postun gdm.service %systemd_postun gdm.service
%posttrans
dconf update || :
%files -f gdm.lang %files -f gdm.lang
%doc AUTHORS NEWS README.md %doc AUTHORS NEWS README.md
%license COPYING %license COPYING
@ -335,15 +306,15 @@ fi
%dir %{_sysconfdir}/dconf/db/gdm.d/locks %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.xml
%{_datadir}/glib-2.0/schemas/org.gnome.login-screen.gschema.override %{_datadir}/glib-2.0/schemas/org.gnome.login-screen.gschema.override
%{_libexecdir}/gdm-disable-wayland
%{_libexecdir}/gdm-runtime-config
%{_libexecdir}/gdm-host-chooser %{_libexecdir}/gdm-host-chooser
%{_libexecdir}/gdm-runtime-config
%{_libexecdir}/gdm-session-worker %{_libexecdir}/gdm-session-worker
%{_libexecdir}/gdm-simple-chooser %{_libexecdir}/gdm-simple-chooser
%{_libexecdir}/gdm-wayland-session %{_libexecdir}/gdm-wayland-session
%{_libexecdir}/gdm-x-session %{_libexecdir}/gdm-x-session
%{_sbindir}/gdm %{_sbindir}/gdm
%{_bindir}/gdmflexiserver %{_bindir}/gdmflexiserver
%{_bindir}/gdm-screenshot
%dir %{_datadir}/dconf %dir %{_datadir}/dconf
%dir %{_datadir}/dconf/profile %dir %{_datadir}/dconf/profile
%{_datadir}/dconf/profile/gdm %{_datadir}/dconf/profile/gdm
@ -372,6 +343,9 @@ fi
%{_sysconfdir}/pam.d/gdm-launch-environment %{_sysconfdir}/pam.d/gdm-launch-environment
%{_udevrulesdir}/61-gdm.rules %{_udevrulesdir}/61-gdm.rules
%{_unitdir}/gdm.service %{_unitdir}/gdm.service
%dir %{_userunitdir}/gnome-session@gnome-login.target.d/
%{_userunitdir}/gnome-session@gnome-login.target.d/session.conf
%{_tmpfilesdir}/%{name}.conf
%files devel %files devel
%dir %{_includedir}/gdm %dir %{_includedir}/gdm
@ -386,247 +360,276 @@ fi
%{_libdir}/pkgconfig/gdm-pam-extensions.pc %{_libdir}/pkgconfig/gdm-pam-extensions.pc
%changelog %changelog
* Mon Dec 12 2022 Ray Strode <rstrode@redhat.com> - 40.0-27 * Wed Jul 24 2024 Ray Strode <rstrode@redhat.com> - 40.1-27
- Fix LUKs password handling - More fixes with wayland->xorg fallback
Resolves: #2150649 Related: RHEL-35045
Resolves: RHEL-50393
* Mon Dec 12 2022 Ray Strode <rstrode@redhat.com> - 40.0-26 * Tue Jul 23 2024 Ray Strode <rstrode@redhat.com> - 40.1-26
- Fix error in service status log - Fix failure doing wayland->xorg fallback
Resolves: #1924079 Related: RHEL-35045
* Wed Oct 19 2022 Ray Strode <rstrode@redhat.com> - 40.0-25 * Wed May 01 2024 Ray Strode <rstrode@redhat.com> - 40.1-25
- Fix user switching with PreferredDisplayServer=legacy-xorg
Related: RHEL-29845
* Tue Jan 16 2024 Andrew Lukoshko <alukoshko@almalinux.org> - 40.1-24
- Explicitly cache remote users
Resolves: RHEL-21791
* Fri Dec 15 2023 Ray Strode <rstrode@redhat.com> - 40.1-23
- Make /var/log/gdm tmpfiles.d snippet match files manifest
to fix installability test
Related: RHEL-19410
* Mon Nov 27 2023 Ray Strode <rstrode@redhat.com> - 40.1-22
- Fix PreferredDisplayServer=legacy-xorg in /etc/gdm/custom.conf
Resolves: RHEL-19410
* Fri Jan 27 2023 Ray Strode <rstrode@redhat.com> - 40.1-21
- Enable IPV6 support
Resolves: #2165049
* Wed Jan 18 2023 Ray Strode <rstrode@redhat.com> - 40.1-20
- Ensure /run/gdm and other gdm directories are created at boot up
Resolves: #2047942
* Wed Jan 11 2023 Ray Strode <rstrode@redhat.com> - 40.1-19
- Re-enable Wayland on aspeed
Resolves: #2131203
* Wed Nov 02 2022 Ray Strode <rstrode@redhat.com> - 40.1-18
- Fix btmp accounting - Fix btmp accounting
Resolves: #2030043 Resolves: #2073275
* Mon May 16 2022 Ray Strode <rstrode@redhat.com> - 40.0-24 * Thu Sep 29 2022 Ray Strode <rstrode@redhat.com> - 40.1-17
- Disable Wayland on aspeed
Related: #2097308
* Tue Apr 12 2022 Ray Strode <rstrode@redhat.com> - 40.1-16
- Reenable Wayland for matrox and aspeed
Resolves: #2097308
* Tue Apr 12 2022 Ray Strode <rstrode@redhat.com> - 40.1-15
- Fix accountsservice user templates
Resolves: #2062827
- Properly force Xorg on matrox cards
Related: #2074013
- Fix typo that prevents the correct session type from being - Fix typo that prevents the correct session type from being
used when user switching. used when user switching.
Resolves: #2034092 Resolves: #2074014
* Thu Jan 27 2022 Ray Strode <rstrode@redhat.com> - 40.0-23 * Tue Mar 22 2022 Ray Strode <rstrode@redhat.com> - 40.1-14
- Fix crash when neither Xorg nor wayland is working great - Fix erroneous jump back to login screen on udev events after login
Resolves: #2032180 Resolves: #2065901
* Wed Dec 22 2021 Ray Strode <rstrode@redhat.com> - 40.1-22 * Mon Mar 07 2022 Ray Strode <rstrode@redhat.com> - 40.1-13
- Fix DisallowTCP - Pull in latest udev rules and race fixes for handling
Resolves: #2025768 udev rules.
Related: #2060793
* Tue Dec 21 2021 Ray Strode <rstrode@redhat.com> - 40.1-21 * Tue Feb 22 2022 Ray Strode <rstrode@redhat.com> - 40.1-12
- Fix Xorg/Wayland selection in some cases - More fixes from RHEL 8:
Resolves: #2009045 - Fix DisallowTCP=false
- Fix crash when both wayland and xorg are unavailable
Related: #2056931
* Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.1-20 * Wed Oct 27 2021 Ray Strode <rstrode@redhat.com> - 40.1-11
- Pull in RHEL 8 patches and drop unused patches
Related: #2017859
* Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.1-10
- Remove module-rescue-stream from default.pa - Remove module-rescue-stream from default.pa
Resolves: #1969846 Resolves: #2017439
* Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.0-19 * Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.1-9
- Synchronize permission and group ownership for log dir between - Synchronize permission and group ownership for log dir between
rpm file manifest and daemon expectations. rpm file manifest and daemon expectations.
Resolves: #1878119 Resolves: #1999586
* Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.0-18 * Wed Oct 13 2021 Ray Strode <rstrode@redhat.com> - 40.1-8
- Drop usleep workaround for problem that's now fixed properly in systemd - Add latest session type propagation fixes from upstream
Resolves: #1921732 Related: #2009044
* Wed Oct 13 2021 Ray Strode <rstrode@redhat.com> - 40.0-17 * Mon Aug 23 2021 Ray Strode <rstrode@redhat.com> - 40.1-7
- Properly switch VTs when jumping to multi-user target - Don't use gdm-disable-wayland binary in udev rules.
Related: #1988958 It doesn't exist anymore.
Related: #1985099
* Wed Sep 15 2021 Ray Strode <rstrode@redhat.com> - 40.0-16 * Thu Aug 19 2021 Ray Strode <rstrode@redhat.com> - 40.1-6
- Fix XDMCP - Disable wayland on server chips
Resolves: #2005011 Resolves: #1963919
- Fix crash at shutdown
Related: #2005011
* Wed Sep 01 2021 Ray Strode <rstrode@redhat.com> - 40.0-14 * Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1:40.1-5
- Disable Wayland on HyperV - Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
- Fix Xorg fallback Related: rhbz#1991688
Related: #2000904
* Thu Aug 19 2021 Ray Strode <rstrode@redhat.com> - 40.0-12 * Wed Jul 28 2021 Ray Strode <rstrode@redhat.com> - 40.1-4
- Redisable on server chips since rebase - Update to 40.1
Related: #1909300 - Allow vendor nvidia users to choose wayland sessions
Related: #1985099
* Wed Aug 04 2021 Ray Strode <rstrode@redhat.com> - 40.0-11 * Wed Jun 16 2021 Ray Strode <rstrode@redhat.com> - 40.0-5
- Read session settings from users even if they've never saved - Ensure gdm dconf db is generated at install time
before. Needed to support accountsservice templated user Related: #1972234
defaults.
Related: #1812788
* Tue Jul 27 2021 Ray Strode <rstrode@redhat.com> - 40.0-10 * Tue Jun 15 2021 Ray Strode - 1:40.0-4
- Let customers using vendor nvidia driver choose wayland sessions - Provide gdm specific dconf sources
Resolves: #1962211 Related: #1972234
- Drop unused patches
* Tue Jun 08 2021 Florian Müllner <fmuellner@redhat.com> - 40.0-3 * Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 1:40.0-2
- Disable network items on login screen - Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
Resolves: #1935261
* Wed May 19 2021 Ray Strode <rstrode@redhat.com> - 40.0-2 * Tue Mar 30 2021 Kalev Lember <klember@redhat.com> - 1:40.0-1
- Fix workaround for systemd bug that's breaking X11 fallback - Update to 40.0
Resolves: #1962049 - Remove old obsoletes and provides
* Wed May 05 2021 Ray Strode <rstrode@redhat.com> - 40.0-1 * Tue Mar 16 2021 Kalev Lember <klember@redhat.com> - 1:40~rc-1
- Rebase to 40.0 - Update to 40.rc
Resolves: #1909300
* Wed Jan 27 2021 Ray Strode <rstrode@redhat.com> - 3.28.3-39 * Wed Mar 10 2021 Benjamin Berg <bberg@redhat.com> - 1:40~beta-2
- Ensure login screen display server is is killed at log in - Add patch to fix issues with the first login after boot
- Pull in fixes for two security issues Resolves: #1937308
Resolves: #1918391
* Tue Nov 10 2020 Jonas Ådahl <jadahl@redhat.com> - 3.28.3-38 * Fri Feb 26 2021 Kalev Lember <klember@redhat.com> - 1:40~beta-1
- Re-add disabling Wayland for server GPUs - Update to 40.beta
Related: #1670273
* Tue Nov 10 2020 Jonas Ådahl <jadahl@redhat.com> - 3.28.3-35 * Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.38.2.1-2
- Stop disabling Wayland for server GPUs - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
Related: #1670273
* Tue Sep 15 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-34 * Sat Dec 19 2020 Kalev Lember <klember@redhat.com> - 1:3.38.2.1-1
- Fix file descriptor leak - Update to 3.38.2.1
Resolves: #1877853
* Tue Sep 01 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-33 * Wed Nov 4 2020 Kalev Lember <klember@redhat.com> - 1:3.38.2-1
- Fix problem with Xorg fallback - Update to 3.38.2
Resolves: #1868260
* Tue Aug 11 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-32 * Tue Oct 13 2020 Ray Strode <rstrode@redhat.com> - 3.38.1-1
- Add dconf db to file manifest - Update to 3.38.1
Related: #1833158
* Thu Jul 23 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-31 * Sat Sep 12 2020 Kalev Lember <klember@redhat.com> - 1:3.38.0-1
- add back gdm system db to dconf profile - Update to 3.38.0
Resolves: #1833158
* Mon Jul 13 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-30 * Tue Sep 08 2020 Dan Horák <dan[at]danny.cz> - 3.37.90-2
- Make sure login screen is killed during login - Remove stale and unnecessary architecture-specific exceptions
Resolves: #1618481
* Wed Feb 05 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-29 * Mon Aug 17 2020 Kalev Lember <klember@redhat.com> - 1:3.37.90-1
- Make GNOME work slightly better in the multiple logins case. - Update to 3.37.90
Related: #1710882
* Sun Dec 15 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-28 * Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.37.3-4
- Correct wayland session detection logic when deciding - Second attempt - Rebuilt for
whether or not to run Xsession script https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Resolves: #1728330
* Sun Dec 15 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-27 * Tue Jul 28 2020 Adam Jackson <ajax@redhat.com> - 3.37.3-3
- Don't run initial-setup for machines enrolled in IPA setup. - Requires xhost xmodmap xrdb, not xorg-x11-server-utils
Resolves: #1750516
* Fri Dec 13 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-26 * Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.37.3-2
- Forward port RHEL 7 patch to allow multiple logins for the - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
same user with XDMCP connections.
Resolves: #1710882
* Thu Dec 12 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-25 * Mon Jul 20 2020 Ray Strode <rstrode@redhat.com> - 3.37.3-1
- Reenable wayland on hybrid setups (except virt pass through) - Update to 3.37.3
Resolves: #1749960 - Kills login screen after login on Xorg systems
- Reenable wayland on qxl - Fixes user switching bug
Resolves: #1744452 Resolves: #1829079
* Fri Dec 06 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-24 * Tue May 05 2020 Ray Strode <rstrode@redhat.com> - 3.37.1-2
- Reenable wayland on cirrus - Make sure users have dbus-run-session installed since
Resolves: #1744527 the greeter depends on it.
* Thu Nov 21 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-23 * Mon May 04 2020 Ray Strode <rstrode@redhat.com> - 3.37.1-1
- Correct timedlogin based screenlock bypass - Update to 3.37.1
Resolves: #1672829
* Mon Jun 24 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-22 * Tue Apr 07 2020 Ray Strode <rstrode@redhat.com> - 3.34.1-3
- Ensure user session is killed with its worker and that all - Fix autologin when gdm is started from VT other than VT 1
user sessions are cleaned up on shutdown
Resolves: #1690714
* Mon Jun 17 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-21 * Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.34.1-2
- Drop gdm-screenshot - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
Resolves: #1680164
* Mon Feb 11 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-20 * Mon Oct 07 2019 Kalev Lember <klember@redhat.com> - 1:3.34.1-1
- Disable wayland on hybrid gpu machines, and server machines - Update to 3.34.1
again
Related: #1662087
Related: #1591250 1670273
* Mon Feb 11 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-19 * Wed Sep 25 2019 Benjamin Berg <bberg@redhat.com> - 1:3.34.0-2
- Fix XDMCP sessions when local console is using wayland - Add patch to fix fast user switching
Resolves: #1640043 https://gitlab.gnome.org/GNOME/gdm/merge_requests/86
- Resolves: #1751673
* Thu Jan 31 2019 Adam Jackson <ajax@redhat.com> - 3.28.3-18 * Wed Sep 11 2019 Kalev Lember <klember@redhat.com> - 1:3.34.0-1
- Add Recommends: xorg-x11-server-Xorg to fix more fallback cases - Update to 3.34.0
Resolves: #1617991
* Mon Jan 14 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-17 * Wed Sep 04 2019 Kalev Lember <klember@redhat.com> - 1:3.33.92-1
- Reenable wayland on other server cards (missed one in -14) - Update to 3.33.92
Related: #1591250
* Mon Jan 14 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-15 * Wed Sep 04 2019 Benjamin Berg <bberg@redhat.com> - 1:3.33.90-4
- Disable wayland on QXL devices - Add patch to fix environment setup
Related: #1641763 https://gitlab.gnome.org/GNOME/gdm/merge_requests/82
See also #1746563
* Fri Jan 04 2019 Ray Strode <rstrode@redhat.com> - 3.28.3-14 * Mon Aug 26 2019 Adam Williamson <awilliam@redhat.com> - 1:3.33.90-3
- Reenable wayland on server cards - Drop patch from -2, better fix was applied to systemd
Related: #1591250
* Wed Nov 28 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-13 * Thu Aug 22 2019 Adam Williamson <awilliam@redhat.com> - 1:3.33.90-2
- rebuild - Revert upstream commit that gives sbin priority in non-root $PATH
Related: #1625683 - Resolves: #1744059
* Tue Nov 13 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-12 * Tue Aug 20 2019 Kalev Lember <klember@redhat.com> - 1:3.33.90-1
- rebuild - Update to 3.33.90
Related: #1625683
* Fri Nov 02 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-11 * Mon Aug 12 2019 Kalev Lember <klember@redhat.com> - 1:3.33.4-1
- Fix non-autologin which go broken in previous build - Update to 3.33.4
Related: #1645135
* Thu Nov 01 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-10 * Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.32.0-4
- Fix autologin when X falls back - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
Resolves: #1645135
* Mon Oct 29 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-9 * Mon Apr 15 2019 Ray Strode <rstrode@redhat.com> - 1:3.32.0-3
- workaround logind bug that breaks X fallback - avoid wayland if nomodeset is on kernel command line
Resolves: #1643874 Related: #1691909
* Wed Oct 24 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-8 * Mon Apr 15 2019 Ray Strode <rstrode@redhat.com> - 1:3.32.0-2
- Disable wayland on proprietary nvidia - Drop CanGraphical patch for now. It's causing problems.
Related: #1639782 Resolves: #1683197
* Mon Oct 15 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-7 * Wed Mar 13 2019 Kalev Lember <klember@redhat.com> - 1:3.32.0-1
- Drop dead code that makes coverity unhappy - Update to 3.32.0
Resolves: #1602510
* Fri Oct 12 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-6 * Wed Feb 27 2019 Ray Strode <rstrode@redhat.com> - 3.31.91-1
- Move AccountsServiceUser extension from gdm to accountsservice, - Update to 3.31.91
since we need to use it when creating users from gnome-initial-setup
Related: #1628060
* Mon Oct 08 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-5 * Tue Feb 26 2019 Kalev Lember <klember@redhat.com> - 1:3.30.3-1
- Fix WaylandEnable=false for autologin displays - Update to 3.30.3
Resolves: #1637102
* Wed Sep 12 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-4 * Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.30.2-2
- Fix typo in RHEL-7 upgrade patch causing classic to get - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
picked too often
Resolves: #1628060
Related: #1595825
* Thu Aug 23 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-3 * Wed Dec 19 2018 Kalev Lember <klember@redhat.com> - 1:3.30.2-1
- Fix crash when wayland is disabled - Update to 3.30.2
Related: #1612915 1621226
* Tue Aug 21 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-2 * Sat Oct 06 2018 Ray Strode <rstrode@redhat.com> - 1:3.30.1-2
- Handle upgrades from RHEL 7 better - Fix login screen for machines that boot to fast
Related: #1612915 1595825 - Fix autologin crash
- Fix wayland blacklisting and blacklist mga200 cards from
using wayland.
Related: #1591250
* Mon Aug 13 2018 Ray Strode <rstrode@redhat.com> - 3.28.3-1 * Sat Sep 29 2018 Kalev Lember <klember@redhat.com> - 1:3.30.1-1
- Update to 3.28.3 - Update to 3.30.1
Resolves: #1615447
* Fri Sep 07 2018 Kalev Lember <klember@redhat.com> - 1:3.30.0-3
- Rebuilt against fixed atk (#1626575)
* Fri Sep 07 2018 Ray Strode <rstrode@redhat.com> - 3.30.0-2
- More initial setup fixes
Resolves: #1625572
* Tue Sep 04 2018 Ray Strode <rstrode@redhat.com> - 3.30.0-1
- Update to 3.30.0
- Fixes initial setup
Resolves: #1624534
* Fri Aug 24 2018 Ray Strode <rstrode@redhat.com> - 1:3.29.91-1
- Update to 3.29.91
- Fix race at startup
* Mon Aug 13 2018 Kalev Lember <klember@redhat.com> - 1:3.29.90-1
- Update to 3.29.90
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.28.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Thu May 17 2018 Kalev Lember <klember@redhat.com> - 1:3.28.2-1 * Thu May 17 2018 Kalev Lember <klember@redhat.com> - 1:3.28.2-1
- Update to 3.28.2 - Update to 3.28.2
@ -661,7 +664,7 @@ fi
* Fri Mar 02 2018 Kalev Lember <klember@redhat.com> - 1:3.27.91-1 * Fri Mar 02 2018 Kalev Lember <klember@redhat.com> - 1:3.27.91-1
- Update to 3.27.91 - Update to 3.27.91
* Mon Feb 19 2018 Ray Strode <rstrode@redhat.com> - 1:3.27.4-4 * Mon Feb 19 2018 Ray Strode <rstrode@redhat.com>> - 1:3.27.4-4
- Make sure GDM checks systemd dconf databases - Make sure GDM checks systemd dconf databases
Related: #1546644 Related: #1546644

2
rpminspect.yaml Normal file
View File

@ -0,0 +1,2 @@
inspections:
xml: off

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (gdm-40.1.tar.xz) = 34e3d905195c9d44f3681fcf8170b67e739cef60fe3987802b7006e5063b9cdf5ca047470d0aebd6e9b47dbbb660040648a647ed8d3186a3099b8c6532c5ded7