Add latest session type propagation fixes from upstream
Related: #2009044
This commit is contained in:
parent
a3e00efd60
commit
7d29b260c0
122
0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
Normal file
122
0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
From 984690b76527baae0f7da0af00467669b49886ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Tue, 14 Sep 2021 11:00:33 -0400
|
||||||
|
Subject: [PATCH 1/3] xdmcp-display-factory: Set supported session types for
|
||||||
|
XDMCP displays
|
||||||
|
|
||||||
|
The lower levels of GDM now expect the session types supported by a
|
||||||
|
display to be specified up front.
|
||||||
|
|
||||||
|
This commit makes sure XDMCP displays do that.
|
||||||
|
---
|
||||||
|
daemon/gdm-xdmcp-display-factory.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
|
||||||
|
index ce8f026e..abb58fae 100644
|
||||||
|
--- a/daemon/gdm-xdmcp-display-factory.c
|
||||||
|
+++ b/daemon/gdm-xdmcp-display-factory.c
|
||||||
|
@@ -2104,94 +2104,100 @@ on_display_status_changed (GdmDisplay *display,
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_MANAGED:
|
||||||
|
if (session != NULL) {
|
||||||
|
g_signal_connect_object (G_OBJECT (session),
|
||||||
|
"client-disconnected",
|
||||||
|
G_CALLBACK (on_client_disconnected),
|
||||||
|
display, G_CONNECT_SWAPPED);
|
||||||
|
g_signal_connect_object (G_OBJECT (session),
|
||||||
|
"disconnected",
|
||||||
|
G_CALLBACK (on_client_disconnected),
|
||||||
|
display, G_CONNECT_SWAPPED);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_clear_object (&launch_environment);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdmDisplay *
|
||||||
|
gdm_xdmcp_display_create (GdmXdmcpDisplayFactory *factory,
|
||||||
|
const char *hostname,
|
||||||
|
GdmAddress *address,
|
||||||
|
int displaynum)
|
||||||
|
{
|
||||||
|
GdmDisplay *display;
|
||||||
|
GdmDisplayStore *store;
|
||||||
|
gboolean use_chooser;
|
||||||
|
+ const char *session_types[] = { "x11", NULL };
|
||||||
|
|
||||||
|
g_debug ("GdmXdmcpDisplayFactory: Creating xdmcp display for %s:%d",
|
||||||
|
hostname ? hostname : "(null)", displaynum);
|
||||||
|
|
||||||
|
use_chooser = FALSE;
|
||||||
|
if (factory->honor_indirect) {
|
||||||
|
IndirectClient *ic;
|
||||||
|
|
||||||
|
ic = indirect_client_lookup (factory, address);
|
||||||
|
|
||||||
|
/* This was an indirect thingie and nothing was yet chosen,
|
||||||
|
* use a chooser */
|
||||||
|
if (ic != NULL && ic->chosen_address == NULL) {
|
||||||
|
use_chooser = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_chooser) {
|
||||||
|
display = gdm_xdmcp_chooser_display_new (hostname,
|
||||||
|
displaynum,
|
||||||
|
address,
|
||||||
|
get_next_session_serial (factory));
|
||||||
|
g_signal_connect (display, "hostname-selected", G_CALLBACK (on_hostname_selected), factory);
|
||||||
|
} else {
|
||||||
|
display = gdm_xdmcp_display_new (hostname,
|
||||||
|
displaynum,
|
||||||
|
address,
|
||||||
|
get_next_session_serial (factory));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display == NULL) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ g_object_set (G_OBJECT (display),
|
||||||
|
+ "session-type", session_types[0],
|
||||||
|
+ "supported-session-types", session_types,
|
||||||
|
+ NULL);
|
||||||
|
+
|
||||||
|
if (! gdm_display_prepare (display)) {
|
||||||
|
gdm_display_unmanage (display);
|
||||||
|
g_object_unref (display);
|
||||||
|
display = NULL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_connect_after (display,
|
||||||
|
"notify::status",
|
||||||
|
G_CALLBACK (on_display_status_changed),
|
||||||
|
factory);
|
||||||
|
|
||||||
|
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
|
||||||
|
gdm_display_store_add (store, display);
|
||||||
|
|
||||||
|
factory->num_pending_sessions++;
|
||||||
|
out:
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdm_xdmcp_send_accept (GdmXdmcpDisplayFactory *factory,
|
||||||
|
GdmAddress *address,
|
||||||
|
CARD32 session_id,
|
||||||
|
ARRAY8Ptr authentication_name,
|
||||||
|
ARRAY8Ptr authentication_data,
|
||||||
|
ARRAY8Ptr authorization_name,
|
||||||
|
ARRAY8Ptr authorization_data)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
109
0002-daemon-Don-t-update-session-type-if-no-saved-session.patch
Normal file
109
0002-daemon-Don-t-update-session-type-if-no-saved-session.patch
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
From 1e877db3a4a8cb8e4eb4fbdaef3f6a7434e6a57d 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/3] 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.31.1
|
||||||
|
|
@ -0,0 +1,87 @@
|
|||||||
|
From 3eea287750d63cfe94fe777111e1cd04141eecb3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Wed, 29 Sep 2021 11:03:41 -0400
|
||||||
|
Subject: [PATCH 3/3] daemon: Infer session type from desktop file if user has
|
||||||
|
no saved session type
|
||||||
|
|
||||||
|
The accountsservice user cache file can specify a session type
|
||||||
|
associated with the saved session. This is optional though. If one
|
||||||
|
isn't specified GDM needs to figure out the session type based on the
|
||||||
|
list of preferred session types for the system and the session file
|
||||||
|
itself.
|
||||||
|
|
||||||
|
It was failing to do the latter, though. This commit fixes that.
|
||||||
|
---
|
||||||
|
daemon/gdm-session.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
|
||||||
|
index b54687d5..a65fa0f9 100644
|
||||||
|
--- a/daemon/gdm-session.c
|
||||||
|
+++ b/daemon/gdm-session.c
|
||||||
|
@@ -1009,60 +1009,62 @@ worker_on_saved_language_name_read (GdmDBusWorker *worker,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
worker_on_saved_session_name_read (GdmDBusWorker *worker,
|
||||||
|
const char *session_name,
|
||||||
|
GdmSessionConversation *conversation)
|
||||||
|
{
|
||||||
|
GdmSession *self = conversation->session;
|
||||||
|
|
||||||
|
if (! get_session_command_for_name (self, session_name, self->saved_session_type, NULL)) {
|
||||||
|
/* ignore sessions that don't exist */
|
||||||
|
g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name);
|
||||||
|
g_free (self->saved_session);
|
||||||
|
self->saved_session = NULL;
|
||||||
|
update_session_type (self);
|
||||||
|
} else {
|
||||||
|
if (strcmp (session_name,
|
||||||
|
get_default_session_name (self)) != 0) {
|
||||||
|
g_free (self->saved_session);
|
||||||
|
self->saved_session = g_strdup (session_name);
|
||||||
|
|
||||||
|
if (self->greeter_interface != NULL) {
|
||||||
|
gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface,
|
||||||
|
session_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self->saved_session_type != NULL)
|
||||||
|
set_session_type (self, self->saved_session_type);
|
||||||
|
+ else
|
||||||
|
+ update_session_type (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
worker_on_saved_session_type_read (GdmDBusWorker *worker,
|
||||||
|
const char *session_type,
|
||||||
|
GdmSessionConversation *conversation)
|
||||||
|
{
|
||||||
|
GdmSession *self = conversation->session;
|
||||||
|
|
||||||
|
g_free (self->saved_session_type);
|
||||||
|
self->saved_session_type = g_strdup (session_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdmSessionConversation *
|
||||||
|
find_conversation_by_pid (GdmSession *self,
|
||||||
|
GPid pid)
|
||||||
|
{
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
|
|
||||||
|
g_hash_table_iter_init (&iter, self->conversations);
|
||||||
|
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||||
|
GdmSessionConversation *conversation;
|
||||||
|
|
||||||
|
conversation = (GdmSessionConversation *) value;
|
||||||
|
|
||||||
|
if (conversation->worker_pid == pid) {
|
||||||
|
return conversation;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
10
gdm.spec
10
gdm.spec
@ -11,7 +11,7 @@
|
|||||||
Name: gdm
|
Name: gdm
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
Version: 40.1
|
Version: 40.1
|
||||||
Release: 7%{?dist}
|
Release: 8%{?dist}
|
||||||
Summary: The GNOME Display Manager
|
Summary: The GNOME Display Manager
|
||||||
|
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
@ -25,6 +25,10 @@ Source5: default.pa-for-gdm
|
|||||||
# Upstream backports
|
# Upstream backports
|
||||||
Patch10001: 0001-local-display-factory-Provide-more-flexibility-for-c.patch
|
Patch10001: 0001-local-display-factory-Provide-more-flexibility-for-c.patch
|
||||||
|
|
||||||
|
Patch20001: 0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
|
||||||
|
Patch20002: 0002-daemon-Don-t-update-session-type-if-no-saved-session.patch
|
||||||
|
Patch20003: 0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch
|
||||||
|
|
||||||
# Downstream patches
|
# Downstream patches
|
||||||
Patch70001: 0001-data-disable-wayland-on-certain-hardware.patch
|
Patch70001: 0001-data-disable-wayland-on-certain-hardware.patch
|
||||||
Patch80001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
|
Patch80001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
|
||||||
@ -311,6 +315,10 @@ dconf update || :
|
|||||||
%{_libdir}/pkgconfig/gdm-pam-extensions.pc
|
%{_libdir}/pkgconfig/gdm-pam-extensions.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Oct 13 2021 Ray Strode <rstrode@redhat.com> - 40.1-8
|
||||||
|
- Add latest session type propagation fixes from upstream
|
||||||
|
Related: #2009044
|
||||||
|
|
||||||
* Mon Aug 23 2021 Ray Strode <rstrode@redhat.com> - 40.1-7
|
* Mon Aug 23 2021 Ray Strode <rstrode@redhat.com> - 40.1-7
|
||||||
- Don't use gdm-disable-wayland binary in udev rules.
|
- Don't use gdm-disable-wayland binary in udev rules.
|
||||||
It doesn't exist anymore.
|
It doesn't exist anymore.
|
||||||
|
Loading…
Reference in New Issue
Block a user