teknoraver / rpms / systemd

Forked from rpms/systemd a month ago
Clone

Blame SOURCES/0137-logind-session-dbus-allow-to-set-display-name-via-db.patch

594167
From 5cfd162864213c5247d97ea31cfacce98b1caefc Mon Sep 17 00:00:00 2001
594167
From: David Tardon <dtardon@redhat.com>
594167
Date: Fri, 10 Jun 2022 15:07:01 +0200
594167
Subject: [PATCH] logind-session-dbus: allow to set display name via dbus
594167
594167
Currently, the only way to set display name of a graphical session is to
594167
pass it to CreateSession(). But modern display managers like gdm start
594167
the display server as part of the user session, which means that the
594167
display name isn't known yet when the session is being created. Hence,
594167
let's make it possible to set it later.
594167
594167
(cherry picked from commit 4885d7490b23e08d8444e5a68927ce9ce8727e5a)
594167
594167
Resolves: #2100340
594167
---
594167
 man/org.freedesktop.login1.xml        |  8 ++++++++
594167
 src/login/logind-session-dbus.c       | 29 +++++++++++++++++++++++++++
594167
 src/login/logind-session.c            | 20 ++++++++++++++++++
594167
 src/login/logind-session.h            |  1 +
594167
 src/login/org.freedesktop.login1.conf |  4 ++++
594167
 5 files changed, 62 insertions(+)
594167
594167
diff --git a/man/org.freedesktop.login1.xml b/man/org.freedesktop.login1.xml
594167
index d25287b18b..c11324ee3b 100644
594167
--- a/man/org.freedesktop.login1.xml
594167
+++ b/man/org.freedesktop.login1.xml
594167
@@ -1045,6 +1045,7 @@ node /org/freedesktop/login1/session/1 {
594167
       TakeControl(in  b force);
594167
       ReleaseControl();
594167
       SetType(in  s type);
594167
+      SetDisplay(in  s display);
594167
       TakeDevice(in  u major,
594167
                  in  u minor,
594167
                  out h fd,
594167
@@ -1142,6 +1143,8 @@ node /org/freedesktop/login1/session/1 {
594167
 
594167
     <variablelist class="dbus-method" generated="True" extra-ref="SetType()"/>
594167
 
594167
+    <variablelist class="dbus-method" generated="True" extra-ref="SetDisplay()"/>
594167
+
594167
     <variablelist class="dbus-method" generated="True" extra-ref="TakeDevice()"/>
594167
 
594167
     <variablelist class="dbus-method" generated="True" extra-ref="ReleaseDevice()"/>
594167
@@ -1238,6 +1241,11 @@ node /org/freedesktop/login1/session/1 {
594167
       connection. This should help prevent a session from entering an inconsistent state, for example if the
594167
       controller crashes. The only argument <varname>type</varname> is the new session type.</para>
594167
 
594167
+      <para><function>SetDisplay()</function> allows the display name of the graphical session to be changed. This is
594167
+      useful if the display server is started as part of the session. It can only be called by session's current
594167
+      controller. If <function>TakeControl()</function> has not been called, this method will fail. The only argument
594167
+      <varname>display</varname> is the new display name.</para>
594167
+
594167
       <para><function>TakeDevice()</function> allows a session controller to get a file descriptor for a
594167
       specific device. Pass in the major and minor numbers of the character device and
594167
       <filename>systemd-logind</filename> will return a file descriptor for the device. Only a limited set of
594167
diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c
594167
index ff4cd0a631..5480d7b2f4 100644
594167
--- a/src/login/logind-session-dbus.c
594167
+++ b/src/login/logind-session-dbus.c
594167
@@ -413,6 +413,30 @@ static int method_set_type(sd_bus_message *message, void *userdata, sd_bus_error
594167
         return sd_bus_reply_method_return(message, NULL);
594167
 }
594167
 
594167
+static int method_set_display(sd_bus_message *message, void *userdata, sd_bus_error *error) {
594167
+        Session *s = ASSERT_PTR(userdata);
594167
+        const char *display;
594167
+        int r;
594167
+
594167
+        assert(message);
594167
+
594167
+        r = sd_bus_message_read(message, "s", &display);
594167
+        if (r < 0)
594167
+                return r;
594167
+
594167
+        if (!session_is_controller(s, sd_bus_message_get_sender(message)))
594167
+                return sd_bus_error_set(error, BUS_ERROR_NOT_IN_CONTROL, "You must be in control of this session to set display");
594167
+
594167
+        if (!SESSION_TYPE_IS_GRAPHICAL(s->type))
594167
+                return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED, "Setting display is only supported for graphical sessions");
594167
+
594167
+        r = session_set_display(s, display);
594167
+        if (r < 0)
594167
+                return r;
594167
+
594167
+        return sd_bus_reply_method_return(message, NULL);
594167
+}
594167
+
594167
 static int method_take_device(sd_bus_message *message, void *userdata, sd_bus_error *error) {
594167
         Session *s = userdata;
594167
         uint32_t major, minor;
594167
@@ -901,6 +925,11 @@ static const sd_bus_vtable session_vtable[] = {
594167
                                 SD_BUS_NO_RESULT,
594167
                                 method_set_type,
594167
                                 SD_BUS_VTABLE_UNPRIVILEGED),
594167
+        SD_BUS_METHOD_WITH_ARGS("SetDisplay",
594167
+                                SD_BUS_ARGS("s", display),
594167
+                                SD_BUS_NO_RESULT,
594167
+                                method_set_display,
594167
+                                SD_BUS_VTABLE_UNPRIVILEGED),
594167
         SD_BUS_METHOD_WITH_ARGS("TakeDevice",
594167
                                 SD_BUS_ARGS("u", major, "u", minor),
594167
                                 SD_BUS_RESULT("h", fd, "b", inactive),
594167
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
594167
index ab98a5055d..a052596e57 100644
594167
--- a/src/login/logind-session.c
594167
+++ b/src/login/logind-session.c
594167
@@ -1044,6 +1044,26 @@ void session_set_type(Session *s, SessionType t) {
594167
         session_send_changed(s, "Type", NULL);
594167
 }
594167
 
594167
+int session_set_display(Session *s, const char *display) {
594167
+        int r;
594167
+
594167
+        assert(s);
594167
+        assert(display);
594167
+
594167
+        if (streq(s->display, display))
594167
+                return 0;
594167
+
594167
+        r = free_and_strdup(&s->display, display);
594167
+        if (r < 0)
594167
+                return r;
594167
+
594167
+        session_save(s);
594167
+
594167
+        session_send_changed(s, "Display", NULL);
594167
+
594167
+        return 1;
594167
+}
594167
+
594167
 static int session_dispatch_fifo(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
594167
         Session *s = userdata;
594167
 
594167
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
594167
index 5c35071dc5..6b6ac2d573 100644
594167
--- a/src/login/logind-session.h
594167
+++ b/src/login/logind-session.h
594167
@@ -137,6 +137,7 @@ int session_set_idle_hint(Session *s, bool b);
594167
 int session_get_locked_hint(Session *s);
594167
 void session_set_locked_hint(Session *s, bool b);
594167
 void session_set_type(Session *s, SessionType t);
594167
+int session_set_display(Session *s, const char *display);
594167
 int session_create_fifo(Session *s);
594167
 int session_start(Session *s, sd_bus_message *properties, sd_bus_error *error);
594167
 int session_stop(Session *s, bool force);
594167
diff --git a/src/login/org.freedesktop.login1.conf b/src/login/org.freedesktop.login1.conf
594167
index 95d2ef0f06..6113b64aa7 100644
594167
--- a/src/login/org.freedesktop.login1.conf
594167
+++ b/src/login/org.freedesktop.login1.conf
594167
@@ -346,6 +346,10 @@
594167
                        send_interface="org.freedesktop.login1.User"
594167
                        send_member="Kill"/>
594167
 
594167
+                
594167
+                       send_interface="org.freedesktop.login1.Session"
594167
+                       send_member="SetDisplay"/>
594167
+
594167
                 <allow receive_sender="org.freedesktop.login1"/>
594167
         </policy>
594167