File sddm-relaxed-auth.patch of Package sddm

From a84e5b670aaef199d881b9f20e6bf886c21330c7 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
Date: Mon, 9 Nov 2020 22:15:13 +0100
Subject: [PATCH] Set XAUTHLOCALHOSTNAME to allow hostname changes

Our libxcb is patched to retry with $XAUTHLOCALHOSTNAME as hostname if the
Xauthority entry for the current hostname does not work.
There's a stale PR to do something similar (FamilyWild using libXau) upstream:
https://github.com/sddm/sddm/pull/863
FamilyWild is not a complete solution either, only when using a temporary
Xauthority file for each session separately.
---
 src/daemon/DaemonApp.cpp         | 3 ++-
 src/daemon/Display.cpp           | 4 +++-
 src/daemon/Greeter.cpp           | 2 ++
 src/daemon/XorgDisplayServer.cpp | 5 +++--
 src/helper/Backend.cpp           | 2 ++
 5 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/helper/Backend.cpp b/src/helper/Backend.cpp
index d6bb4d0..0fbbd75 100644
--- a/src/helper/Backend.cpp
+++ b/src/helper/Backend.cpp
@@ -27,6 +27,7 @@
 #include "UserSession.h"
 
 #include <QtCore/QProcessEnvironment>
+#include <QtNetwork/QHostInfo>
 
 #include <pwd.h>
 
@@ -69,6 +70,7 @@ namespace SDDM {
                         .arg(QString::fromLocal8Bit(pw->pw_dir))
                         .arg(mainConfig.X11.UserAuthFile.get());
                 env.insert(QStringLiteral("XAUTHORITY"), value);
+                env.insert(QStringLiteral("XAUTHLOCALHOSTNAME"), QHostInfo::localHostName());
             }
             // TODO: I'm fairly sure this shouldn't be done for PAM sessions, investigate!
             m_app->session()->setProcessEnvironment(env);
diff --git a/src/daemon/DaemonApp.cpp b/src/daemon/DaemonApp.cpp
index 537f9b4..fd6ca2f 100644
--- a/src/daemon/DaemonApp.cpp
+++ b/src/daemon/DaemonApp.cpp
@@ -96,7 +96,8 @@ namespace SDDM {
 
 
     QString DaemonApp::hostName() const {
-        return QHostInfo::localHostName();
+        static QString hostname = QHostInfo::localHostName();
+        return hostname;
     }
 
     DisplayManager *DaemonApp::displayManager() const {
diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp
index f6569e8..6a3a2df 100644
--- a/src/daemon/Display.cpp
+++ b/src/daemon/Display.cpp
@@ -316,8 +316,10 @@ namespace SDDM {
 
         QProcessEnvironment env;
         env.insert(QStringLiteral("PATH"), mainConfig.Users.DefaultPath.get());
-        if (session.xdgSessionType() == QLatin1String("x11"))
+        if (session.xdgSessionType() == QLatin1String("x11")) {
             env.insert(QStringLiteral("DISPLAY"), name());
+            env.insert(QStringLiteral("XAUTHLOCALHOSTNAME"), daemonApp->hostName());
+        }
         env.insert(QStringLiteral("XDG_SEAT_PATH"), daemonApp->displayManager()->seatPath(seat()->name()));
         env.insert(QStringLiteral("XDG_SESSION_PATH"), daemonApp->displayManager()->sessionPath(QStringLiteral("Session%1").arg(daemonApp->newSessionId())));
         env.insert(QStringLiteral("DESKTOP_SESSION"), session.desktopSession());
diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp
index 11ec19d..ee6a411 100644
--- a/src/daemon/Greeter.cpp
+++ b/src/daemon/Greeter.cpp
@@ -114,6 +114,7 @@ namespace SDDM {
             // set process environment
             QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
             env.insert(QStringLiteral("DISPLAY"), m_display->name());
+            env.insert(QStringLiteral("XAUTHLOCALHOSTNAME"), daemonApp->hostName());
             env.insert(QStringLiteral("XAUTHORITY"), m_authPath);
             env.insert(QStringLiteral("XCURSOR_THEME"), xcursorTheme);
             env.insert(QStringLiteral("QT_IM_MODULE"), mainConfig.InputMethod.get());
@@ -175,6 +176,7 @@ namespace SDDM {
             env.insert(QStringLiteral("PATH"), mainConfig.Users.DefaultPath.get());
             env.insert(QStringLiteral("DISPLAY"), m_display->name());
             env.insert(QStringLiteral("XAUTHORITY"), m_authPath);
+            env.insert(QStringLiteral("XAUTHLOCALHOSTNAME"), daemonApp->hostName());
             env.insert(QStringLiteral("XCURSOR_THEME"), xcursorTheme);
             env.insert(QStringLiteral("XDG_SEAT"), m_display->seat()->name());
             env.insert(QStringLiteral("XDG_SEAT_PATH"), daemonApp->displayManager()->seatPath(m_display->seat()->name()));
diff --git a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp
index bddef79..c5a0e3b 100644
--- a/src/daemon/XorgDisplayServer.cpp
+++ b/src/daemon/XorgDisplayServer.cpp
@@ -104,8 +104,8 @@ namespace SDDM {
         // check file
         if (!fp)
             return false;
-        fprintf(fp, "remove %s\n", qPrintable(m_display));
-        fprintf(fp, "add %s . %s\n", qPrintable(m_display), qPrintable(m_cookie));
+        fprintf(fp, "remove %s/unix%s\n", qPrintable(daemonApp->hostName()), qPrintable(m_display));
+        fprintf(fp, "add %s/unix%s . %s\n", qPrintable(daemonApp->hostName()), qPrintable(m_display), qPrintable(m_cookie));
         fprintf(fp, "exit\n");
 
         // close pipe
@@ -313,6 +313,7 @@ namespace SDDM {
         env.insert(QStringLiteral("HOME"), QStringLiteral("/"));
         env.insert(QStringLiteral("PATH"), mainConfig.Users.DefaultPath.get());
         env.insert(QStringLiteral("XAUTHORITY"), m_authPath);
+        env.insert(QStringLiteral("XAUTHLOCALHOSTNAME"), daemonApp->hostName());
         env.insert(QStringLiteral("SHELL"), QStringLiteral("/bin/sh"));
         env.insert(QStringLiteral("XCURSOR_THEME"), mainConfig.Theme.CursorTheme.get());
         setCursor->setProcessEnvironment(env);
-- 
2.25.1

openSUSE Build Service is sponsored by