From cd51ae5d266ca191963a7e5c71262fc707499f35 Mon Sep 17 00:00:00 2001 From: YinJie Date: Tue, 26 Nov 2024 19:14:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=AA=97=E7=AE=A1=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E7=99=BB=E5=BD=95=E8=BF=9B=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 窗管崩溃没有走systemd的注销流程,systemd的session信息错误,导致Accounts服务的已登录用户信息错误,走checkAccount方法的时候任务当前用户已登录直接跳过了。 临时解决方案:用DisplayManager的session信息过滤一下 Log: Bug: https://pms.uniontech.com/bug-view-283393.html Influence: kwin崩溃的场景 Change-Id: Ie573c4f1ad336ffc2be33f421efdc89ea84f6723 (cherry picked from commit b7539ff991d7f1c46f07a653e8340201dc665a5c) (cherry picked from commit 4f92bbd42aebd9020b018b9722c94a656be6eeba) --- src/session-widgets/sessionbasemodel.cpp | 27 ++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/session-widgets/sessionbasemodel.cpp b/src/session-widgets/sessionbasemodel.cpp index d323ac16..1dd53212 100644 --- a/src/session-widgets/sessionbasemodel.cpp +++ b/src/session-widgets/sessionbasemodel.cpp @@ -3,13 +3,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "sessionbasemodel.h" +#include "dconfig_helper.h" +#include "dbus/dbusdisplaymanager.h" #include - #include #include "dbusconstant.h" -#include "dconfig_helper.h" DCORE_USE_NAMESPACE @@ -462,6 +462,22 @@ void SessionBaseModel::updateUserList(const QStringList &list) void SessionBaseModel::updateLoginedUserList(const QString &list) { qCDebug(DDE_SHELL) << "Logined user list: " << list; + // kwin崩溃时systemd中的sessions不会被remove掉,这里通过DisplayManager的session信息过滤一遍(临时解决方案) + QStringList loggedUserNameList; + DBusDisplayManager displayManager("org.freedesktop.DisplayManager", "/org/freedesktop/DisplayManager", QDBusConnection::systemBus()); + const auto &sessions = displayManager.sessions(); + for (const auto &session : sessions) { + const QString &sessionPath = session.path(); + if (sessionPath.isEmpty()) + continue; + QDBusInterface interface("org.freedesktop.DisplayManager", sessionPath, "org.freedesktop.DisplayManager.Session", QDBusConnection::systemBus()); + if (interface.isValid()) { + const QString &userName = interface.property("UserName").toString(); + if (!userName.isEmpty()) + loggedUserNameList.append(userName); + } + } + qInfo(DDE_SHELL) << "Logined users from display manager: " << loggedUserNameList; QList loginedUsersTmp = m_loginedUsers->keys(); QJsonParseError jsonParseError; @@ -486,8 +502,11 @@ void SessionBaseModel::updateLoginedUserList(const QString &list) // 对于通过自定义窗口输入的账户(域账户), 此时账户还没添加进来,导致下面m_users->value(path)为空指针,调用会导致程序奔溃 // 因此在登录时,对于新增的账户,调用addUser先将账户添加进来,然后再去更新对应账户的登录状态 addUser(path); - m_loginedUsers->insert(path, m_users->value(path)); - m_users->value(path)->updateLoginState(true); + auto user = m_users->value(path); + if (user->name().isEmpty() || loggedUserNameList.contains(user->name())) { + m_loginedUsers->insert(path, user); + user->updateLoginState(true); + } } else { loginedUsersTmp.removeAll(path); }