From 7fe0be8d4bca4bc59f755bc2ec521b0c750e95b0 Mon Sep 17 00:00:00 2001 From: liuxinhao Date: Mon, 29 May 2023 20:12:06 +0800 Subject: [PATCH 1/3] fix(auth): Verify the current password when logging features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 录入特征时,校验当前密码 Closes #I795QI --- CMakeLists.txt | 1 + .../input-dialog/input-dialog.cpp | 45 ++++--- .../input-dialog/input-dialog.h | 20 ++-- plugins/authentication/CMakeLists.txt | 1 + .../authentication/src/checkpasswd-dialog.cpp | 110 ++++++++++++++++++ ...n-rename-dialog.h => checkpasswd-dialog.h} | 28 +---- .../src/identification-rename-dialog.cpp | 108 ----------------- .../src/pages/face/face-page.cpp | 2 +- .../src/pages/finger/finger-page.cpp | 3 +- .../src/pages/iris/iris-page.cpp | 2 +- .../src/pages/ukey/ukey-page.cpp | 11 +- .../src/widgets/general-bio-page.cpp | 44 +++++-- .../src/widgets/general-bio-page.h | 5 +- .../kiran-cpanel-authentication.zh_CN.ts | 27 ++++- translations/kiran-control-panel.zh_CN.ts | 26 +++++ 15 files changed, 254 insertions(+), 179 deletions(-) rename plugins/authentication/src/ukey-pin-input-dialog.cpp => lib/common-widgets/input-dialog/input-dialog.cpp (74%) rename plugins/authentication/src/ukey-pin-input-dialog.h => lib/common-widgets/input-dialog/input-dialog.h (72%) create mode 100644 plugins/authentication/src/checkpasswd-dialog.cpp rename plugins/authentication/src/{identification-rename-dialog.h => checkpasswd-dialog.h} (51%) delete mode 100644 plugins/authentication/src/identification-rename-dialog.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f5b2cce..bdffa50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ configure_file(${CMAKE_SOURCE_DIR}/data/${PROJECT_NAME}.pc.in ${CMAKE_BINARY_DIR file(GLOB_RECURSE INCLUDE_SRC "./include/*") file(GLOB_RECURSE CONTROL_PANEL_SRC "./src/*") +file(GLOB_RECURSE LIB_SRC "./lib/*") set(RESOURCE ./resources/control-panel-resources.qrc) #资源文件名不能与插件资源名相同,否则会导致插件中部分图片无法正常加载显示。 file(GLOB TS_FILES "translations/*.ts") diff --git a/plugins/authentication/src/ukey-pin-input-dialog.cpp b/lib/common-widgets/input-dialog/input-dialog.cpp similarity index 74% rename from plugins/authentication/src/ukey-pin-input-dialog.cpp rename to lib/common-widgets/input-dialog/input-dialog.cpp index 312043b..e7305c3 100644 --- a/plugins/authentication/src/ukey-pin-input-dialog.cpp +++ b/lib/common-widgets/input-dialog/input-dialog.cpp @@ -1,16 +1,15 @@ -#include "ukey-pin-input-dialog.h" +#include "input-dialog.h" #include -#include #include +#include #include #include #include #include #include #include -#include "utils/kiran-auth-dbus-proxy.h" -UKeyPinCodeDialog::UKeyPinCodeDialog(QWidget* parent) +InputDialog::InputDialog(QWidget* parent) : KiranTitlebarWindow(parent,Qt::Dialog), m_success(false) { @@ -18,31 +17,42 @@ UKeyPinCodeDialog::UKeyPinCodeDialog(QWidget* parent) initUI(); } -UKeyPinCodeDialog::~UKeyPinCodeDialog() +InputDialog::~InputDialog() { } -QString UKeyPinCodeDialog::getPinCode() +QString InputDialog::getText() { return m_edit->lineEdit()->text(); } -int UKeyPinCodeDialog::exec() +void InputDialog::setDesc(const QString&desc) +{ + m_labelDesc->setText(desc); +} + +void InputDialog::setInputMode(QLineEdit::EchoMode mode,qint32 maxLength) +{ + m_edit->setEchoMode(mode); + m_edit->lineEdit()->setMaxLength(maxLength); +} + +int InputDialog::exec() { QEventLoop loop; - connect(this, &UKeyPinCodeDialog::completed, &loop, &QEventLoop::quit); + connect(this, &InputDialog::completed, &loop, &QEventLoop::quit); this->show(); loop.exec(QEventLoop::DialogExec); return m_success; } -void UKeyPinCodeDialog::closeEvent(QCloseEvent* event) +void InputDialog::closeEvent(QCloseEvent* event) { - emit completed(QPrivateSignal()); + emit completed(); return KiranTitlebarWindow::closeEvent(event); } -void UKeyPinCodeDialog::onConfirmClicked() +void InputDialog::onConfirmClicked() { QString text = m_edit->lineEdit()->text(); if (text.isEmpty()) @@ -50,15 +60,14 @@ void UKeyPinCodeDialog::onConfirmClicked() return; } m_success = true; - emit completed(QPrivateSignal()); + emit completed(); } -void UKeyPinCodeDialog::initUI() +void InputDialog::initUI() { setTitlebarColorBlockEnable(true); setButtonHints(TitlebarCloseButtonHint); setResizeable(false); - setTitle(tr("UKey Enroll")); auto container = new QWidget(this); auto containerLayout = new QBoxLayout(QBoxLayout::TopToBottom, container); @@ -71,8 +80,8 @@ void UKeyPinCodeDialog::initUI() auto layout = new QBoxLayout(QBoxLayout::TopToBottom, colorBlock); layout->setContentsMargins(24, 24, 24, 24); - auto label = new QLabel(tr("Please enter the ukey pin code"), this); - layout->addWidget(label); + m_labelDesc = new QLabel(this); + layout->addWidget(m_labelDesc); layout->addSpacerItem(new QSpacerItem(10, 16, QSizePolicy::Minimum, QSizePolicy::Fixed)); @@ -92,7 +101,7 @@ void UKeyPinCodeDialog::initUI() confirmButton->setFixedSize(QSize(110, 40)); confirmButton->setText(tr("Confirm")); Kiran::StylePropertyHelper::setButtonType(confirmButton, Kiran::BUTTON_Default); - connect(confirmButton, &QPushButton::clicked, this, &UKeyPinCodeDialog::onConfirmClicked); + connect(confirmButton, &QPushButton::clicked, this, &InputDialog::onConfirmClicked); boxlayout->addWidget(confirmButton); boxlayout->addSpacerItem(new QSpacerItem(40, 10, QSizePolicy::Fixed, QSizePolicy::Minimum)); @@ -101,7 +110,7 @@ void UKeyPinCodeDialog::initUI() cancelButton->setFixedSize(QSize(110, 40)); cancelButton->setText(tr("Cancel")); connect(cancelButton, &QPushButton::clicked, this, [this]() - { emit completed(QPrivateSignal()); }); + { emit completed(); }); boxlayout->addWidget(cancelButton); boxlayout->addStretch(); diff --git a/plugins/authentication/src/ukey-pin-input-dialog.h b/lib/common-widgets/input-dialog/input-dialog.h similarity index 72% rename from plugins/authentication/src/ukey-pin-input-dialog.h rename to lib/common-widgets/input-dialog/input-dialog.h index 064577d..39e1cd1 100644 --- a/plugins/authentication/src/ukey-pin-input-dialog.h +++ b/lib/common-widgets/input-dialog/input-dialog.h @@ -13,21 +13,24 @@ */ #pragma once #include +#include -class KiranAuthDBusProxy; class KiranPasswdEdit; -class UKeyPinCodeDialog : public KiranTitlebarWindow +class QLabel; +class InputDialog : public KiranTitlebarWindow { Q_OBJECT public: - UKeyPinCodeDialog(QWidget* parent = nullptr); - ~UKeyPinCodeDialog(); + InputDialog(QWidget* parent = nullptr); + ~InputDialog(); - QString getPinCode(); - int exec(); + void setDesc(const QString&desc); + void setInputMode(QLineEdit::EchoMode mode,qint32 maxLength); + virtual int exec(); + QString getText(); signals: - void completed(QPrivateSignal); + void completed(); private: virtual void closeEvent(QCloseEvent* event) override; @@ -38,7 +41,6 @@ private: private: bool m_success; + QLabel* m_labelDesc; KiranPasswdEdit* m_edit; - QString m_iid; - KiranAuthDBusProxy* m_proxy; }; \ No newline at end of file diff --git a/plugins/authentication/CMakeLists.txt b/plugins/authentication/CMakeLists.txt index d86b032..952df96 100644 --- a/plugins/authentication/CMakeLists.txt +++ b/plugins/authentication/CMakeLists.txt @@ -41,6 +41,7 @@ target_link_libraries(${TARGET_NAME} Qt5::Widgets Qt5::DBus Qt5::Svg + pam ${KIRAN_WIDGETS_LIBRARIES} ${KLOG_LIBRARIES} ${KIRAN_STYLE_LIBRARIES} diff --git a/plugins/authentication/src/checkpasswd-dialog.cpp b/plugins/authentication/src/checkpasswd-dialog.cpp new file mode 100644 index 0000000..f116966 --- /dev/null +++ b/plugins/authentication/src/checkpasswd-dialog.cpp @@ -0,0 +1,110 @@ +#include "checkpasswd-dialog.h" +#include +#include +#include +#include + +int conv_func(int num_msg, const struct pam_message **msg, + struct pam_response **resp, void *appdata_ptr) +{ + struct pam_response *reply = NULL; + int ret; + int replies; + char *passwd = (char *)appdata_ptr; + + ///分配回复包 + reply = (struct pam_response *)calloc(num_msg, sizeof(*reply)); + if (reply == nullptr) + { + return PAM_CONV_ERR; + } + + ret = PAM_SUCCESS; + //给每个ECHO_OFF消息填充密码,若出现ECHO_ON消息认证失败,释放 + for (replies = 0; replies < num_msg && ret == PAM_SUCCESS; replies++) + { + if (msg[replies]->msg_style == PAM_PROMPT_ECHO_ON) + { + goto failed; + } + reply[replies].resp = new char[strlen(passwd) + 1](); + strcpy(reply[replies].resp, passwd); + reply[replies].resp_retcode = PAM_SUCCESS; + } + *resp = reply; + return PAM_SUCCESS; + +failed: + ///释放之前分配的内存 + for (int i = 0; i < replies; i++) + { + if (reply[i].resp != nullptr) + { + delete reply[i].resp; + } + } + free(reply); + return PAM_CONV_ERR; +} + +void no_fail_delay(int status, unsigned int delay, void *appdata_ptr) +{ +} + +bool _checkUserPassword(const QString &user, const QString &pwd) +{ + KLOG_DEBUG() << "start check user passwd"; + std::string sPwd = pwd.toStdString(); + struct pam_conv conv = { + &conv_func, + (void *)sPwd.c_str()}; + + pam_handle *handler; + int res; + + res = pam_start("password-auth", user.toStdString().c_str(), + &conv, + &handler); + + pam_set_item(handler, PAM_FAIL_DELAY, (void *)no_fail_delay); + + res = pam_authenticate(handler, 0); + if (res != PAM_SUCCESS) + { + KLOG_DEBUG() << "check user passwd:"<< pam_strerror(handler, res) << res; + } + + pam_end(handler, res); + KLOG_DEBUG() << "end check user passwd"; + return res == PAM_SUCCESS; +} + +QString getCurrentUser() +{ + auto pwd = getpwuid(getuid()); + return pwd?pwd->pw_name:""; +} + +CheckpasswdDialog::CheckpasswdDialog(QWidget* parent) + :InputDialog(parent) +{ + setTitle(tr("Check password")); + setDesc(tr("Check the current password before you enroll the feature")); + setInputMode(QLineEdit::Password,32); +} + +CheckpasswdDialog::~CheckpasswdDialog() +{ + +} + +bool CheckpasswdDialog::checkPasswd(const QString& passwd) +{ + auto currentUser = getCurrentUser(); + if( currentUser.isEmpty() ) + { + return false; + } + + return _checkUserPassword(currentUser,passwd); +} \ No newline at end of file diff --git a/plugins/authentication/src/identification-rename-dialog.h b/plugins/authentication/src/checkpasswd-dialog.h similarity index 51% rename from plugins/authentication/src/identification-rename-dialog.h rename to plugins/authentication/src/checkpasswd-dialog.h index f692fb9..f482345 100644 --- a/plugins/authentication/src/identification-rename-dialog.h +++ b/plugins/authentication/src/checkpasswd-dialog.h @@ -12,32 +12,14 @@ * Author: liuxinhao */ #pragma once -#include +#include "input-dialog/input-dialog.h" -class KiranAuthDBusProxy; -class QLineEdit; -class IdentificationRenameDialog : public KiranTitlebarWindow +class CheckpasswdDialog:public InputDialog { Q_OBJECT public: - IdentificationRenameDialog(const QString& iid, KiranAuthDBusProxy* proxy, QWidget* parent = nullptr); - ~IdentificationRenameDialog(); + CheckpasswdDialog(QWidget* parent = nullptr); + ~CheckpasswdDialog(); - int exec(); - -signals: - void completed(QPrivateSignal); - -private: - virtual void closeEvent(QCloseEvent* event) override; - Q_INVOKABLE void onConfirmClicked(); - -private: - void initUI(); - -private: - bool m_success; - QLineEdit* m_edit; - QString m_iid; - KiranAuthDBusProxy* m_proxy; + static bool checkPasswd(const QString& passwd); }; \ No newline at end of file diff --git a/plugins/authentication/src/identification-rename-dialog.cpp b/plugins/authentication/src/identification-rename-dialog.cpp deleted file mode 100644 index a554283..0000000 --- a/plugins/authentication/src/identification-rename-dialog.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "identification-rename-dialog.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "utils/kiran-auth-dbus-proxy.h" - -IdentificationRenameDialog::IdentificationRenameDialog(const QString& iid, KiranAuthDBusProxy* proxy, QWidget* parent) - : KiranTitlebarWindow(parent,Qt::Dialog), - m_iid(iid), - m_proxy(proxy), - m_success(false) -{ - setAttribute(Qt::WA_ShowModal, true); - initUI(); -} - -IdentificationRenameDialog::~IdentificationRenameDialog() -{ -} - -int IdentificationRenameDialog::exec() -{ - QEventLoop loop; - connect(this, &IdentificationRenameDialog::completed, &loop, &QEventLoop::quit); - this->show(); - loop.exec(QEventLoop::DialogExec); - return m_success; -} - -void IdentificationRenameDialog::closeEvent(QCloseEvent* event) -{ - emit completed(QPrivateSignal()); - return KiranTitlebarWindow::closeEvent(event); -} - -void IdentificationRenameDialog::onConfirmClicked() -{ - QString text = m_edit->text(); - if (text.isEmpty()) - { - return; - } - m_proxy->renameIdentification(m_iid, text); - m_success = true; - emit completed(QPrivateSignal()); -} - -void IdentificationRenameDialog::initUI() -{ - setTitlebarColorBlockEnable(true); - setButtonHints(TitlebarCloseButtonHint); - setResizeable(false); - setTitle(tr("Rename Feature")); - - auto container = new QWidget(this); - auto containerLayout = new QBoxLayout(QBoxLayout::TopToBottom, container); - containerLayout->setContentsMargins(4, 4, 4, 4); - - auto colorBlock = new KiranColorBlock(container); - colorBlock->setDrawBackground(true); - containerLayout->addWidget(colorBlock); - - auto layout = new QBoxLayout(QBoxLayout::TopToBottom, colorBlock); - layout->setContentsMargins(24, 24, 24, 24); - - auto label = new QLabel(tr("Please enter the renamed feature name"), this); - layout->addWidget(label); - - layout->addSpacerItem(new QSpacerItem(10, 16, QSizePolicy::Minimum, QSizePolicy::Fixed)); - - m_edit = new QLineEdit(this); - m_edit->setMaxLength(30); - layout->addWidget(m_edit); - - layout->addSpacerItem(new QSpacerItem(10, 16, QSizePolicy::Minimum, QSizePolicy::Fixed)); - - auto boxlayout = new QBoxLayout(QBoxLayout::LeftToRight); - boxlayout->setContentsMargins(0, 0, 0, 0); - - boxlayout->addStretch(); - - auto confirmButton = new QPushButton(this); - confirmButton->setFixedSize(QSize(110, 40)); - confirmButton->setText(tr("Confirm")); - Kiran::StylePropertyHelper::setButtonType(confirmButton, Kiran::BUTTON_Default); - connect(confirmButton, &QPushButton::clicked, this, &IdentificationRenameDialog::onConfirmClicked); - boxlayout->addWidget(confirmButton); - - boxlayout->addSpacerItem(new QSpacerItem(40, 10, QSizePolicy::Fixed, QSizePolicy::Minimum)); - - auto cancelButton = new QPushButton(this); - cancelButton->setFixedSize(QSize(110, 40)); - cancelButton->setText(tr("Cancel")); - connect(cancelButton, &QPushButton::clicked, this, [this]() - { emit completed(QPrivateSignal()); }); - boxlayout->addWidget(cancelButton); - - boxlayout->addStretch(); - - layout->addLayout(boxlayout); - - setWindowContentWidget(container); -} diff --git a/plugins/authentication/src/pages/face/face-page.cpp b/plugins/authentication/src/pages/face/face-page.cpp index 6d042e2..5e0a0db 100644 --- a/plugins/authentication/src/pages/face/face-page.cpp +++ b/plugins/authentication/src/pages/face/face-page.cpp @@ -65,7 +65,7 @@ QWidget* FacePage::initFeatureManagerPage() m_featureManager->setFeatureNamePrefix(tr("face")); m_featureManager->setDefaultDeviceLabelDesc(tr("Default face device")); m_featureManager->setDeviceFeatureListDesc(tr("face feature list")); - connect(m_featureManager, &GeneralBioPage::enrollFeatureClicked, this, &FacePage::onEnrollFeatureClicked); + connect(m_featureManager, &GeneralBioPage::enrollFeature, this, &FacePage::onEnrollFeatureClicked); return m_featureManager; } diff --git a/plugins/authentication/src/pages/finger/finger-page.cpp b/plugins/authentication/src/pages/finger/finger-page.cpp index beeb9ae..86513a6 100644 --- a/plugins/authentication/src/pages/finger/finger-page.cpp +++ b/plugins/authentication/src/pages/finger/finger-page.cpp @@ -14,7 +14,6 @@ #include "finger-page.h" #include "auxiliary.h" -#include "identification-rename-dialog.h" #include "utils/kiran-auth-dbus-proxy.h" #include "widgets/auth-setting-container.h" #include "widgets/auth-setting-item.h" @@ -90,7 +89,7 @@ QWidget* FingerPage::initFeatureManager() m_featureManager->setFeatureNamePrefix(desc); m_featureManager->setDefaultDeviceLabelDesc(QString(tr("Default %1 device")).arg(desc)); m_featureManager->setDeviceFeatureListDesc(QString(tr("%1 list").arg(desc))); - connect(m_featureManager, &GeneralBioPage::enrollFeatureClicked, this, &FingerPage::onAddIdentificationClicked); + connect(m_featureManager, &GeneralBioPage::enrollFeature, this, &FingerPage::onAddIdentificationClicked); return m_featureManager; } diff --git a/plugins/authentication/src/pages/iris/iris-page.cpp b/plugins/authentication/src/pages/iris/iris-page.cpp index 65a3670..714c9c0 100644 --- a/plugins/authentication/src/pages/iris/iris-page.cpp +++ b/plugins/authentication/src/pages/iris/iris-page.cpp @@ -65,7 +65,7 @@ QWidget* IrisPage::initFeatureManagerPage() m_featureManager->setFeatureNamePrefix(tr("iris")); m_featureManager->setDefaultDeviceLabelDesc(tr("Default Iris device")); m_featureManager->setDeviceFeatureListDesc(tr("Iris feature list")); - connect(m_featureManager, &GeneralBioPage::enrollFeatureClicked, this, &IrisPage::onEnrollFeatureClicked); + connect(m_featureManager, &GeneralBioPage::enrollFeature, this, &IrisPage::onEnrollFeatureClicked); return m_featureManager; } diff --git a/plugins/authentication/src/pages/ukey/ukey-page.cpp b/plugins/authentication/src/pages/ukey/ukey-page.cpp index 2879d61..38051ca 100644 --- a/plugins/authentication/src/pages/ukey/ukey-page.cpp +++ b/plugins/authentication/src/pages/ukey/ukey-page.cpp @@ -12,7 +12,7 @@ * Author: liuxinhao */ #include "ukey-page.h" -#include "ukey-pin-input-dialog.h" +#include "input-dialog/input-dialog.h" #include "utils/kiran-auth-dbus-proxy.h" #include "widgets/auth-setting-container.h" #include "widgets/auth-setting-item.h" @@ -52,7 +52,7 @@ void UKeyPage::initUI() m_featureManager->setFeatureNamePrefix(tr("Ukey")); m_featureManager->setDefaultDeviceLabelDesc(tr("Default Ukey device")); m_featureManager->setDeviceFeatureListDesc(tr("List of devices bound to the Ukey")); - connect(m_featureManager, &GeneralBioPage::enrollFeatureClicked, this, &UKeyPage::onEnrollFeatureClicked); + connect(m_featureManager, &GeneralBioPage::enrollFeature, this, &UKeyPage::onEnrollFeatureClicked); mainLayout->addWidget(m_featureManager); } @@ -88,13 +88,16 @@ void UKeyPage::onEnrollFeatureClicked() return; } - UKeyPinCodeDialog dialog; + InputDialog dialog; + dialog.setTitle(tr("UKey Enroll")); + dialog.setDesc(tr("Please enter the ukey pin code")); + dialog.setInputMode(QLineEdit::Password,32); if (!dialog.exec()) { return; } - m_pinCode = dialog.getPinCode(); + m_pinCode = dialog.getText(); doEnroll(false); } diff --git a/plugins/authentication/src/widgets/general-bio-page.cpp b/plugins/authentication/src/widgets/general-bio-page.cpp index 443f3c1..36d0ef9 100644 --- a/plugins/authentication/src/widgets/general-bio-page.cpp +++ b/plugins/authentication/src/widgets/general-bio-page.cpp @@ -1,7 +1,8 @@ #include "general-bio-page.h" #include "auth-setting-container.h" #include "auth-setting-item.h" -#include "identification-rename-dialog.h" +#include "checkpasswd-dialog.h" +#include "input-dialog/input-dialog.h" #include "utils/kiran-auth-dbus-proxy.h" #include @@ -138,11 +139,18 @@ void GeneralBioPage::onFeatureRenameClicked() auto iid = settingItem->getUserData().toString(); auto name = settingItem->getText(); - QScopedPointer renameDialog(new IdentificationRenameDialog(iid, m_proxy, this)); - if (renameDialog->exec()) + InputDialog renameDialog(this); + renameDialog.setTitle(tr("Rename Feature")); + renameDialog.setDesc(tr("Please enter the renamed feature name")); + renameDialog.setInputMode(QLineEdit::Normal,32); + if (!renameDialog.exec()) { - refreshFeature(); + return; } + + QString newName = renameDialog.getText(); + m_proxy->renameIdentification(iid, newName); + refreshFeature(); } void GeneralBioPage::onFeatureTrashClicked() @@ -155,8 +163,9 @@ void GeneralBioPage::onFeatureTrashClicked() if (m_authType == KAD_AUTH_TYPE_UKEY) { text = QString(tr("Are you sure you want to delete the feature called %1, " - "Ensure that the Ukey device is inserted; " - "otherwise the information stored in the Ukey will not be deleted")).arg(name); + "Ensure that the Ukey device is inserted; " + "otherwise the information stored in the Ukey will not be deleted")) + .arg(name); } else { @@ -172,6 +181,27 @@ void GeneralBioPage::onFeatureTrashClicked() refreshFeature(); } +void GeneralBioPage::onEnrollFeatureClicked() +{ + CheckpasswdDialog dialog; + if (!dialog.exec()) + { + return; + } + dialog.hide(); + + auto passwd = dialog.getText(); + if (!dialog.checkPasswd(passwd)) + { + KiranMessageBox::message(this, tr("Error"), + tr(" Failed to enroll feature because the password verification failed!"), + KiranMessageBox::Ok); + return; + } + + emit enrollFeature(); +} + void GeneralBioPage::initUI() { auto featureManagerLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); @@ -204,7 +234,7 @@ void GeneralBioPage::initUI() featureManagerLayout->addWidget(addButton); addButton->setIcon(QPixmap(":/kcp-keyboard/images/addition.svg")); Kiran::StylePropertyHelper::setButtonType(addButton, Kiran::BUTTON_Default); - connect(addButton, &QPushButton::clicked, this, &GeneralBioPage::enrollFeatureClicked); + connect(addButton, &QPushButton::clicked, this, &GeneralBioPage::onEnrollFeatureClicked); featureManagerLayout->addStretch(); } diff --git a/plugins/authentication/src/widgets/general-bio-page.h b/plugins/authentication/src/widgets/general-bio-page.h index 9108dbe..fe2a0a1 100644 --- a/plugins/authentication/src/widgets/general-bio-page.h +++ b/plugins/authentication/src/widgets/general-bio-page.h @@ -38,13 +38,14 @@ public: int getDeviceCount(); signals: - void enrollFeatureClicked(); + void enrollFeature(); private slots: void onDefaultDeviceComboBoxCurrentIndexChanged(int idx); void onFeatureRenameClicked(); void onFeatureTrashClicked(); - + void onEnrollFeatureClicked(); + private: void initUI(); void addFeature(const QString& featureName,const QString& featureIID); diff --git a/plugins/authentication/translations/kiran-cpanel-authentication.zh_CN.ts b/plugins/authentication/translations/kiran-cpanel-authentication.zh_CN.ts index afd7b5a..1856b82 100644 --- a/plugins/authentication/translations/kiran-cpanel-authentication.zh_CN.ts +++ b/plugins/authentication/translations/kiran-cpanel-authentication.zh_CN.ts @@ -32,6 +32,17 @@ 人脸 + + CheckpasswdDialog + + Check password + 校验当前用户密码 + + + Check the current password before you enroll the feature + 录入特征之前需要校验当前密码 + + DriverPage @@ -179,6 +190,14 @@ tips 提示 + + Error + 错误 + + + Failed to enroll feature because the password verification failed! + 由于密码校验失败,录入特征失败! + IdentificationRenameDialog @@ -192,11 +211,11 @@ Confirm - 确认 + 确认 Cancel - 取消 + 取消 @@ -324,11 +343,11 @@ Confirm - 确认 + 确认 Cancel - 取消 + 取消 diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts index 96393c2..2116ffd 100644 --- a/translations/kiran-control-panel.zh_CN.ts +++ b/translations/kiran-control-panel.zh_CN.ts @@ -1,6 +1,19 @@ + + InputDialog + + + Confirm + 确认 + + + + Cancel + 取消 + + KiranModuleWidget @@ -11,6 +24,19 @@ The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? + + + Form + + + + + KiranTips + + + Form + + PanelWindow -- 2.33.0