kiran-session-guard/0009-fix-autologin-timeout-Fix-issues-caused-by-automatic.patch

136 lines
4.4 KiB
Diff
Raw Normal View History

2024-01-18 11:52:48 +08:00
From 833ef45aa88677c2b91643d9893479b3b9dcb07c Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinsec.com.cn>
Date: Tue, 9 Jan 2024 11:13:53 +0800
Subject: [PATCH 09/10] fix(autologin-timeout): Fix issues caused by automatic
login timeout
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修复自动登录超时时间导致的问题
Closes #25015
---
src/lightdm-greeter/frame.cpp | 70 +++++++++++++++++++++++++++++++++--
src/lightdm-greeter/frame.h | 1 +
2 files changed, 68 insertions(+), 3 deletions(-)
diff --git a/src/lightdm-greeter/frame.cpp b/src/lightdm-greeter/frame.cpp
index beb5ae5..3d8dada 100644
--- a/src/lightdm-greeter/frame.cpp
+++ b/src/lightdm-greeter/frame.cpp
@@ -155,7 +155,7 @@ void Frame::initMenus()
// clang-format off
connect(itemWidget, &GreeterMenuItem::sigChecked, [this](QString action){
m_specifiedSession = action;
- m_sessionMenu->hide();
+ m_sessionMenu->hide();
});
// clang-format on
}
@@ -316,6 +316,7 @@ void Frame::initAuth()
{
AuthLightdm* auth = new AuthLightdm(m_greeter);
LoginFrame::initAuth(auth);
+ connect(m_greeter.data(),&QLightDM::Greeter::autologinTimerExpired,this,&Frame::onAutoLoginTimeout);
}
void Frame::initConnection()
@@ -325,8 +326,8 @@ void Frame::initConnection()
connect(m_userList, &UserList::userCountChanged, this, &Frame::onUserListUserCountChanged);
connect(m_userList, &UserList::userRemoved,this,&Frame::onUserListUserRemoved);
connect(m_btnLoginOther, &QToolButton::clicked, this, &Frame::onLoginOtherClicked);
- connect(m_btnAutoLogin, &LoginButton::sigClicked, [this](){
- startAuthUser(m_userName);
+ connect(m_btnAutoLogin, &LoginButton::sigClicked, [this](){
+ startAuthUser(m_userName);
});
// clang-format on
}
@@ -497,6 +498,69 @@ void Frame::onLoginOtherClicked()
break;
}
}
+
+static bool getIsLoggedIn(const QString& userName)
+{
+ bool res = false;
+
+ QDBusInterface dmInterface("org.freedesktop.DisplayManager",
+ "/org/freedesktop/DisplayManager",
+ "org.freedesktop.DisplayManager",
+ QDBusConnection::systemBus());
+ QVariant sessionsVar = dmInterface.property("Sessions");
+ if (!sessionsVar.isValid())
+ {
+ KLOG_ERROR("can't get display manager property 'sessions'");
+ return res;
+ }
+
+ QList<QDBusObjectPath> sessions = sessionsVar.value<QList<QDBusObjectPath>>();
+ KLOG_DEBUG() << "sessions:" << sessions.count();
+ for (const auto& session : sessions)
+ {
+ KLOG_DEBUG() << "\t-" << session.path();
+ }
+ foreach (const auto& session, sessions)
+ {
+ QDBusInterface sessionInterface("org.freedesktop.DisplayManager",
+ session.path(),
+ "org.freedesktop.DisplayManager.Session",
+ QDBusConnection::systemBus());
+ QVariant userNameVar = sessionInterface.property("UserName");
+ if (!userNameVar.isValid())
+ {
+ KLOG_ERROR("can't get display manager session property 'UserName'");
+ continue;
+ }
+
+ QString sessionUser = userNameVar.toString();
+ if (sessionUser.compare(userName) == 0)
+ {
+ res = true;
+ break;
+ }
+ }
+
+ return res;
+}
+
+void Frame::onAutoLoginTimeout()
+{
+ if (m_greeter->autologinUserHint().isEmpty())
+ {
+ return;
+ }
+
+ // NOTE:修复#52982问题若自动登录用户已存在不自动触发延时自动登录
+ bool isLogged = getIsLoggedIn(m_greeter->autologinUserHint());
+ if (isLogged)
+ {
+ return;
+ }
+
+ startAuthUser(m_greeter->autologinUserHint());
+}
+
} // namespace Greeter
} // namespace SessionGuard
} // namespace Kiran
\ No newline at end of file
diff --git a/src/lightdm-greeter/frame.h b/src/lightdm-greeter/frame.h
index 73a3532..88e51ef 100644
--- a/src/lightdm-greeter/frame.h
+++ b/src/lightdm-greeter/frame.h
@@ -72,6 +72,7 @@ private slots:
void onUserListUserCountChanged(int oldCount, int newCount);
void onUserListUserRemoved(const QString& name);
void onLoginOtherClicked();
+ void onAutoLoginTimeout();
private:
Prefs* m_prefs;
--
2.27.0