b7dd4d
From 54a8d932442d02f5a7dbf6038c8f557ce41f468b Mon Sep 17 00:00:00 2001
b7dd4d
From: David Tardon <dtardon@redhat.com>
b7dd4d
Date: Fri, 10 Jun 2022 15:07:01 +0200
b7dd4d
Subject: [PATCH] logind-session-dbus: allow to set display name via dbus
b7dd4d
b7dd4d
Currently, the only way to set display name of a graphical session is to
b7dd4d
pass it to CreateSession(). But modern display managers like gdm start
b7dd4d
the display server as part of the user session, which means that the
b7dd4d
display name isn't known yet when the session is being created. Hence,
b7dd4d
let's make it possible to set it later.
b7dd4d
b7dd4d
(cherry picked from commit 4885d7490b23e08d8444e5a68927ce9ce8727e5a)
b7dd4d
b7dd4d
Resolves: #1857969
b7dd4d
---
b7dd4d
 src/login/logind-session-dbus.c       | 26 ++++++++++++++++++++++++++
b7dd4d
 src/login/logind-session.c            | 20 ++++++++++++++++++++
b7dd4d
 src/login/logind-session.h            |  1 +
b7dd4d
 src/login/org.freedesktop.login1.conf |  4 ++++
b7dd4d
 4 files changed, 51 insertions(+)
b7dd4d
b7dd4d
diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c
b7dd4d
index 03585b7f8e..c935959e02 100644
b7dd4d
--- a/src/login/logind-session-dbus.c
b7dd4d
+++ b/src/login/logind-session-dbus.c
b7dd4d
@@ -381,6 +381,31 @@ static int method_release_control(sd_bus_message *message, void *userdata, sd_bu
b7dd4d
         return sd_bus_reply_method_return(message, NULL);
b7dd4d
 }
b7dd4d
 
b7dd4d
+static int method_set_display(sd_bus_message *message, void *userdata, sd_bus_error *error) {
b7dd4d
+        Session *s = userdata;
b7dd4d
+        const char *display;
b7dd4d
+        int r;
b7dd4d
+
b7dd4d
+        assert(message);
b7dd4d
+        assert(s);
b7dd4d
+
b7dd4d
+        r = sd_bus_message_read(message, "s", &display);
b7dd4d
+        if (r < 0)
b7dd4d
+                return r;
b7dd4d
+
b7dd4d
+        if (!session_is_controller(s, sd_bus_message_get_sender(message)))
b7dd4d
+                return sd_bus_error_set(error, BUS_ERROR_NOT_IN_CONTROL, "You must be in control of this session to set display");
b7dd4d
+
b7dd4d
+        if (!SESSION_TYPE_IS_GRAPHICAL(s->type))
b7dd4d
+                return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED, "Setting display is only supported for graphical sessions");
b7dd4d
+
b7dd4d
+        r = session_set_display(s, display);
b7dd4d
+        if (r < 0)
b7dd4d
+                return r;
b7dd4d
+
b7dd4d
+        return sd_bus_reply_method_return(message, NULL);
b7dd4d
+}
b7dd4d
+
b7dd4d
 static int method_take_device(sd_bus_message *message, void *userdata, sd_bus_error *error) {
b7dd4d
         Session *s = userdata;
b7dd4d
         uint32_t major, minor;
b7dd4d
@@ -523,6 +548,7 @@ const sd_bus_vtable session_vtable[] = {
b7dd4d
         SD_BUS_METHOD("TakeDevice", "uu", "hb", method_take_device, SD_BUS_VTABLE_UNPRIVILEGED),
b7dd4d
         SD_BUS_METHOD("ReleaseDevice", "uu", NULL, method_release_device, SD_BUS_VTABLE_UNPRIVILEGED),
b7dd4d
         SD_BUS_METHOD("PauseDeviceComplete", "uu", NULL, method_pause_device_complete, SD_BUS_VTABLE_UNPRIVILEGED),
b7dd4d
+        SD_BUS_METHOD("SetDisplay", "s", NULL, method_set_display, SD_BUS_VTABLE_UNPRIVILEGED),
b7dd4d
 
b7dd4d
         SD_BUS_SIGNAL("PauseDevice", "uus", 0),
b7dd4d
         SD_BUS_SIGNAL("ResumeDevice", "uuh", 0),
b7dd4d
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
b7dd4d
index e4c8bb36f6..1143a834a4 100644
b7dd4d
--- a/src/login/logind-session.c
b7dd4d
+++ b/src/login/logind-session.c
b7dd4d
@@ -953,6 +953,26 @@ void session_set_locked_hint(Session *s, bool b) {
b7dd4d
         session_send_changed(s, "LockedHint", NULL);
b7dd4d
 }
b7dd4d
 
b7dd4d
+int session_set_display(Session *s, const char *display) {
b7dd4d
+        int r;
b7dd4d
+
b7dd4d
+        assert(s);
b7dd4d
+        assert(display);
b7dd4d
+
b7dd4d
+        if (streq(s->display, display))
b7dd4d
+                return 0;
b7dd4d
+
b7dd4d
+        r = free_and_strdup(&s->display, display);
b7dd4d
+        if (r < 0)
b7dd4d
+                return r;
b7dd4d
+
b7dd4d
+        session_save(s);
b7dd4d
+
b7dd4d
+        session_send_changed(s, "Display", NULL);
b7dd4d
+
b7dd4d
+        return 1;
b7dd4d
+}
b7dd4d
+
b7dd4d
 static int session_dispatch_fifo(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
b7dd4d
         Session *s = userdata;
b7dd4d
 
b7dd4d
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
b7dd4d
index 7d17d9a25f..9bd0c96a03 100644
b7dd4d
--- a/src/login/logind-session.h
b7dd4d
+++ b/src/login/logind-session.h
b7dd4d
@@ -123,6 +123,7 @@ int session_get_idle_hint(Session *s, dual_timestamp *t);
b7dd4d
 void session_set_idle_hint(Session *s, bool b);
b7dd4d
 int session_get_locked_hint(Session *s);
b7dd4d
 void session_set_locked_hint(Session *s, bool b);
b7dd4d
+int session_set_display(Session *s, const char *display);
b7dd4d
 int session_create_fifo(Session *s);
b7dd4d
 int session_start(Session *s, sd_bus_message *properties, sd_bus_error *error);
b7dd4d
 int session_stop(Session *s, bool force);
b7dd4d
diff --git a/src/login/org.freedesktop.login1.conf b/src/login/org.freedesktop.login1.conf
b7dd4d
index dcde0c22c6..b780ae08cf 100644
b7dd4d
--- a/src/login/org.freedesktop.login1.conf
b7dd4d
+++ b/src/login/org.freedesktop.login1.conf
b7dd4d
@@ -314,6 +314,10 @@
b7dd4d
                        send_interface="org.freedesktop.login1.User"
b7dd4d
                        send_member="Kill"/>
b7dd4d
 
b7dd4d
+                
b7dd4d
+                       send_interface="org.freedesktop.login1.Session"
b7dd4d
+                       send_member="SetDisplay"/>
b7dd4d
+
b7dd4d
                 <allow receive_sender="org.freedesktop.login1"/>
b7dd4d
         </policy>
b7dd4d