From 8748a8bd1c69bfa8892761b13d8861e9e011b29e Mon Sep 17 00:00:00 2001 From: liujiangtao Date: Tue, 29 Sep 2026 11:02:50 +0800 Subject: [PATCH] fix(xwayland): refresh user Xauthority after Xwayland restart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Xwayland regenerates /tmp/.xauth_ on every start, but treeland-sd only fetched it at startup, on compositor re-registration, or after a failed activation. An in-place restart inside a running compositor triggers none of those, so the user's XAUTHORITY kept stale MIT-MAGIC-COOKIE-1 data and X11 clients failed with "Invalid MIT-MAGIC-COOKIE-1 key". Add XWaylandAuthChanged instead of reusing SessionChanged: an in-place restart re-generates the auth data without switching the active session, so reusing SessionChanged would also wake the wayland helper into re-running ActivateWayland. Xwayland now subscribes to the new signal, which requires dropping the per-type early return in tryStart(). Xwayland 每次(重)启动都会重新生成 /tmp/.xauth_,但 treeland-sd 只在 进程启动、compositor 重新注册或上次激活失败时才重新获取。compositor 运行期间 的 Xwayland 原地重启不会触发上述任何一条,导致用户 XAUTHORITY 文件保留过期的 MIT-MAGIC-COOKIE-1,X11 客户端报 Invalid MIT-MAGIC-COOKIE-1 key。 新增 XWaylandAuthChanged 而不复用 SessionChanged:原地重启只重新生成认证数据, 并未切换活动会话,复用 SessionChanged 会连带唤醒 wayland helper 重复执行 ActivateWayland。Xwayland 改为订阅新信号,因此需要去掉 tryStart() 中按类型提前 返回的分支。 Log: 修复 Xwayland 重启后用户 XAUTHORITY 未刷新 PMS: BUG-378331 Influence: treeland-sd(xwayland 类型)改订 XWaylandAuthChanged,Xwayland 重启 后用户侧 XAUTHORITY 自动刷新,X11 应用不再报 Invalid MIT-MAGIC-COOKIE-1 key。 新增 D-Bus 信号,旧客户端不受影响。 --- misc/dbus/org.deepin.compositor1.xml | 2 ++ src/core/treeland.cpp | 2 ++ src/core/treeland.h | 1 + src/seat/helper.cpp | 4 ++++ src/session/session.cpp | 1 + src/session/session.h | 1 + src/systemd-socket.cpp | 16 +++++++++------- 7 files changed, 20 insertions(+), 7 deletions(-) diff --git a/misc/dbus/org.deepin.compositor1.xml b/misc/dbus/org.deepin.compositor1.xml index 2fa81fa0a6..e2e0312f72 100644 --- a/misc/dbus/org.deepin.compositor1.xml +++ b/misc/dbus/org.deepin.compositor1.xml @@ -11,5 +11,7 @@ + + diff --git a/src/core/treeland.cpp b/src/core/treeland.cpp index 81e1c5b6b4..7ffe00bbdf 100644 --- a/src/core/treeland.cpp +++ b/src/core/treeland.cpp @@ -370,6 +370,7 @@ class Compositor1Adaptor: public QDBusAbstractAdaptor " \n" " \n" " \n" + " \n" " \n" "") public: @@ -396,6 +397,7 @@ public Q_SLOTS: // METHODS Q_SIGNALS: // SIGNALS void SessionChanged(); + void XWaylandAuthChanged(); }; Treeland::Treeland() diff --git a/src/core/treeland.h b/src/core/treeland.h index 9443854f85..5b38ab9039 100644 --- a/src/core/treeland.h +++ b/src/core/treeland.h @@ -44,6 +44,7 @@ class Treeland Q_SIGNALS: void socketDisconnected(); void SessionChanged(); + void XWaylandAuthChanged(); public Q_SLOTS: bool ActivateWayland(QDBusUnixFileDescriptor fd); diff --git a/src/seat/helper.cpp b/src/seat/helper.cpp index 1016c935d4..694e3ad038 100644 --- a/src/seat/helper.cpp +++ b/src/seat/helper.cpp @@ -1968,6 +1968,10 @@ void Helper::init(Treeland::Treeland *treeland) { m_treeland = treeland; connect(m_sessionManager, &SessionManager::sessionChanged, treeland, &Treeland::Treeland::SessionChanged); + connect(m_sessionManager, + &SessionManager::xwaylandAuthChanged, + treeland, + &Treeland::Treeland::XWaylandAuthChanged); auto engine = qmlEngine(); m_greeterProxy = engine->singletonInstance("Treeland", "GreeterProxy"); diff --git a/src/session/session.cpp b/src/session/session.cpp index 699f73a215..d0bdb58c7d 100644 --- a/src/session/session.cpp +++ b/src/session/session.cpp @@ -295,6 +295,7 @@ std::shared_ptr SessionManager::ensureSession(int id, QString username) xwayland->setOwnsSocket(socket); // Connect signals connect(xwayland, &WXWayland::ready, this, [this, xwayland] { + Q_EMIT xwaylandAuthChanged(); syncActiveSessionXWaylandPrimaryOutput(); if (auto session = sessionForXWayland(xwayland)) { session->m_noTitlebarAtom = diff --git a/src/session/session.h b/src/session/session.h index 59bd1494ef..36a44c01e0 100644 --- a/src/session/session.h +++ b/src/session/session.h @@ -89,6 +89,7 @@ class SessionManager : public QObject { Q_SIGNALS: void socketFileChanged(); void sessionChanged(); + void xwaylandAuthChanged(); private: std::shared_ptr ensureSession(int id, QString username); diff --git a/src/systemd-socket.cpp b/src/systemd-socket.cpp index 672809df00..bcc89d84d4 100644 --- a/src/systemd-socket.cpp +++ b/src/systemd-socket.cpp @@ -57,11 +57,6 @@ class SocketActivator : public QObject if (!test.isValid()) return false; - if (m_type == "xwayland") { - m_compositorBus = busFromConnection(connection); - return true; - } - return connectActivationSignal(connection); } @@ -264,12 +259,19 @@ public Q_SLOTS: if (m_compositorBus == bus) return true; + // Xwayland only has to react to auth refreshes. Its display number and + // the XAUTHORITY path survive a wlroots in-place Xwayland restart, so + // a session change does not affect it and must not re-run activation. + const QString signalName = m_type == "xwayland" + ? QStringLiteral("XWaylandAuthChanged") + : QStringLiteral("SessionChanged"); + if (m_compositorBus.has_value()) { auto oldConnection = dbusConnection(*m_compositorBus); oldConnection.disconnect("org.deepin.Compositor1", "/org/deepin/Compositor1", "org.deepin.Compositor1", - QStringLiteral("SessionChanged"), + signalName, this, SLOT(activate())); m_compositorBus.reset(); @@ -278,7 +280,7 @@ public Q_SLOTS: if (connection.connect("org.deepin.Compositor1", "/org/deepin/Compositor1", "org.deepin.Compositor1", - QStringLiteral("SessionChanged"), + signalName, this, SLOT(activate()))) { m_compositorBus = bus;