1 Star 0 Fork 6

liubuguiii/src-kiran-session-guard

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0005-fix-avatar-Update-authentication-users-and-user-list.patch 9.46 KB
一键复制 编辑 原始数据 按行查看 历史
liubuguiii 提交于 2024-01-18 11:52 . 同步更新,修复BUG
From 251ad1e695739b2fc16a2be2bae4830fa4f9428c Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinsec.com.cn>
Date: Mon, 21 Aug 2023 17:32:45 +0800
Subject: [PATCH 5/7] fix(avatar): Update authentication users and user list
avatars in real time
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 实时更新认证用户以及用户列表头像
Closes #12711
---
lib/common-widgets/user-avatar.cpp | 7 ++++
lib/common-widgets/user-avatar.h | 2 ++
lib/login-frame/login-frame.cpp | 44 ++++++++++++++++++-----
lib/login-frame/login-frame.h | 3 +-
src/lightdm-greeter/widgets/user-list.cpp | 44 +++++++++++++++++++++--
src/lightdm-greeter/widgets/user-list.h | 1 +
6 files changed, 90 insertions(+), 11 deletions(-)
diff --git a/lib/common-widgets/user-avatar.cpp b/lib/common-widgets/user-avatar.cpp
index 8716461..c23a1f4 100644
--- a/lib/common-widgets/user-avatar.cpp
+++ b/lib/common-widgets/user-avatar.cpp
@@ -31,10 +31,16 @@ UserAvatar::UserAvatar(QWidget *parent) : QWidget(parent)
setDefaultImage();
}
+QString UserAvatar::getCurrentImage()
+{
+ return m_pixmapPath;
+}
+
void UserAvatar::setImage(const QString &path)
{
if (m_pixmap.load(path))
{
+ m_pixmap = path;
m_scaledPixmap = scalePixmapAdjustSize(m_pixmap);
}
else
@@ -95,6 +101,7 @@ void UserAvatar::setDefaultImage()
KLOG_WARNING() << "user avatar load default avatar failed";
return;
}
+ m_pixmapPath = DEFAULT_USER_AVATAR;
m_scaledPixmap = scalePixmapAdjustSize(m_pixmap);
update();
}
diff --git a/lib/common-widgets/user-avatar.h b/lib/common-widgets/user-avatar.h
index 78cf832..3bb825f 100644
--- a/lib/common-widgets/user-avatar.h
+++ b/lib/common-widgets/user-avatar.h
@@ -26,6 +26,7 @@ class UserAvatar : public QWidget
public:
explicit UserAvatar(QWidget *parent = nullptr);
+ QString getCurrentImage();
void setImage(const QString &path);
void setDefaultImage();
@@ -37,6 +38,7 @@ private:
QPixmap scalePixmapAdjustSize(const QPixmap &pixmap);
private:
+ QString m_pixmapPath;
QPixmap m_scaledPixmap;
QPixmap m_pixmap;
};
diff --git a/lib/login-frame/login-frame.cpp b/lib/login-frame/login-frame.cpp
index 8e49d84..1657296 100644
--- a/lib/login-frame/login-frame.cpp
+++ b/lib/login-frame/login-frame.cpp
@@ -26,6 +26,7 @@
#include <QTime>
#include <QTimer>
#include <QToolButton>
+#include <QDBusConnection>
namespace Kiran
{
@@ -184,9 +185,18 @@ void LoginFrame::initUI()
respond(text);
}
});
- connect(ui->btn_reAuth, &QPushButton::clicked, [this]{
+ connect(ui->btn_reAuth, &QPushButton::clicked, [this]{
startAuthUser(m_specifyUser);
});
+
+ // 连接至AccountServce, 处理用户属性变更信号,用于更新正在登录用户头像
+ auto connected = QDBusConnection::systemBus().connect("", "", "org.freedesktop.Accounts.User",
+ "Changed", this,
+ SLOT(onAuthUserPropertyChanged()));
+ if (!connected)
+ {
+ KLOG_WARNING() << "login frame: can not connect to user property changed!";
+ }
// clang-format on
QBoxLayout* centerBottomLayout = qobject_cast<QBoxLayout*>(ui->center_bottom->layout());
@@ -280,15 +290,15 @@ void LoginFrame::onAuthComplete(bool authRes)
KLOG_DEBUG() << "auth complete" << authRes;
authenticateComplete(authRes, m_authController->authenticationUser());
- if( !authRes )
+ if (!authRes)
{
- #if 0
+#if 0
if (m_prompted)
{
startAuthUser(m_authController->authenticationUser());
}
else
- #endif
+#endif
{
// 未存在prompt消息,应切换至显示重新认真按钮,点击重新认证按钮再开始认证
switchControlPage(CONTROL_PAGE_REAUTH);
@@ -306,6 +316,25 @@ void LoginFrame::onSupportedAuthTypeChanged(QList<KADAuthType> supportedTypes)
m_switcher->setAuthTypes(supportedTypes);
}
+// 检查当前认证的用户头像变更
+void LoginFrame::onAuthUserPropertyChanged()
+{
+ if (m_specifyUser.isEmpty())
+ {
+ return;
+ }
+
+ QString imagePath = UserManager::getUserIcon(m_specifyUser);
+ QString currentImagePath = ui->avatar->getCurrentImage();
+ if (imagePath == currentImagePath)
+ {
+ return;
+ }
+
+ ui->avatar->setImage(imagePath);
+ return;
+}
+
void LoginFrame::onAuthTypeChanged(KADAuthType type)
{
if (m_switcher->getCurrentAuthType() != type)
@@ -315,13 +344,12 @@ void LoginFrame::onAuthTypeChanged(KADAuthType type)
ui->tips->clear();
- static QSet<KADAuthType> emptyControlAuthType= {
+ static QSet<KADAuthType> emptyControlAuthType = {
KAD_AUTH_TYPE_FINGERPRINT,
KAD_AUTH_TYPE_FINGERVEIN,
KAD_AUTH_TYPE_IRIS,
- KAD_AUTH_TYPE_FACE
- };
- if ( emptyControlAuthType.contains(type) )
+ KAD_AUTH_TYPE_FACE};
+ if (emptyControlAuthType.contains(type))
{
switchControlPage(CONTROL_PAGE_EMPTY);
}
diff --git a/lib/login-frame/login-frame.h b/lib/login-frame/login-frame.h
index f3c55ee..01299f6 100644
--- a/lib/login-frame/login-frame.h
+++ b/lib/login-frame/login-frame.h
@@ -87,13 +87,14 @@ private:
// 认证完成,子类根据认证结果以及用户名执行各自操作
virtual void authenticateComplete(bool authRes, const QString& userName) = 0;
-private:
+private slots:
void onShowMessage(const QString& text, MessageType type);
void onShowPrmpt(const QString& text, PromptType type);
void onAuthComplete(bool authRes);
void onNotifyAuthMode(KADAuthMode mode);
void onSupportedAuthTypeChanged(QList<KADAuthType> supportedTypes);
void onAuthTypeChanged(KADAuthType type);
+ void onAuthUserPropertyChanged();
private:
Ui::LoginFrame* ui;
diff --git a/src/lightdm-greeter/widgets/user-list.cpp b/src/lightdm-greeter/widgets/user-list.cpp
index c84ed1d..b83efdf 100644
--- a/src/lightdm-greeter/widgets/user-list.cpp
+++ b/src/lightdm-greeter/widgets/user-list.cpp
@@ -42,7 +42,7 @@ UserList::UserList(QWidget *parent)
UserList::~UserList()
{
- disconnect(qApp, &QApplication::focusChanged,this,&UserList::onAppFocusChanged);
+ disconnect(qApp, &QApplication::focusChanged, this, &UserList::onAppFocusChanged);
delete ui;
}
@@ -138,7 +138,7 @@ void UserList::initUI()
/// 连接QApplication的焦点切换信号
/// 处理ListWidget内部焦点切换或焦点切换出ListWidge,滑动条特殊处理
/// 处理当焦点从外部到UserItem时,应默认到当前行
- connect(qApp, &QApplication::focusChanged,this,&UserList::onAppFocusChanged);
+ connect(qApp, &QApplication::focusChanged, this, &UserList::onAppFocusChanged);
}
void UserList::loadUserList()
@@ -162,6 +162,7 @@ void UserList::loadUserList()
connect(&m_filterModel, &QLightDM::UsersModel::rowsRemoved, this, &UserList::onModelRowsRemoved);
connect(&m_filterModel, &QLightDM::UsersModel::rowsInserted, this, &UserList::onModelRowsInserted);
+ connect(&m_filterModel, &QLightDM::UsersModel::dataChanged, this, &UserList::onDataChanged);
}
bool UserList::getCurrentSelected(UserInfo &userInfo)
@@ -380,6 +381,45 @@ void UserList::onAppFocusChanged(QWidget *oldFocus, QWidget *newFocus)
}
}
+void UserList::onDataChanged(const QModelIndex &topLeft,
+ const QModelIndex &bottomRight,
+ const QVector<int> roles)
+{
+ auto userInfoUpdateFunc = [this](const UserInfo &newInfo) -> void
+ {
+ for (int i = 0; i < ui->userList->count(); i++)
+ {
+ auto item = ui->userList->item(i);
+ auto userItem = dynamic_cast<UserItem *>(ui->userList->itemWidget(item));
+ auto itemUserInfo = userItem->getUserInfo();
+ if (newInfo.name != itemUserInfo.name)
+ {
+ continue;
+ }
+
+ if (itemUserInfo.imagePath != newInfo.imagePath ||
+ itemUserInfo.loggedIn != newInfo.loggedIn)
+ {
+ itemUserInfo.imagePath = newInfo.imagePath;
+ itemUserInfo.loggedIn = newInfo.loggedIn;
+ userItem->setUserInfo(itemUserInfo);
+ }
+ break;
+ }
+ };
+ int startRow = topLeft.row();
+ int endRow = topLeft.row();
+
+ // FIXME: QLightdDM此处信号发出时roles为默认参数, 无法判断数据变化范围
+ // 检查图片更新,用户列表中的顺序可能和用户不一致
+ for (int i = startRow; i <= endRow; i++)
+ {
+ UserInfo userInfo;
+ getUserInfoFromModel(i, userInfo);
+ userInfoUpdateFunc(userInfo);
+ }
+}
+
QSize UserList::sizeHint() const
{
QSize size(0, (ui->userList->count() * 62) + 2);
diff --git a/src/lightdm-greeter/widgets/user-list.h b/src/lightdm-greeter/widgets/user-list.h
index 9e45f61..e58b39c 100644
--- a/src/lightdm-greeter/widgets/user-list.h
+++ b/src/lightdm-greeter/widgets/user-list.h
@@ -62,6 +62,7 @@ private slots:
void onModelRowsRemoved(const QModelIndex &parent, int first, int last);
void onModelRowsInserted(const QModelIndex &parent, int first, int last);
void onAppFocusChanged(QWidget* oldFocus,QWidget* newFocus);
+ void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> roles);
Q_SIGNALS:
void userActivated(const UserInfo &userInfo);
--
2.27.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liubuguiii/src-kiran-session-guard.git
git@gitee.com:liubuguiii/src-kiran-session-guard.git
liubuguiii
src-kiran-session-guard
src-kiran-session-guard
master

搜索帮助