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