ukui-biometric-auth/debian/patches/0001-update-changelog.patch

12283 lines
808 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From: yangmin100 <yangmin@kylinos.cn>
Date: Wed, 13 Nov 2024 19:58:45 +0800
Subject: update changelog
---
bioauth-bin/src/main.cpp | 16 +-
bioauth/include/bioauth.h | 2 +-
bioauth/include/loginoptionswidget.h | 16 +-
bioauth/src/bioauth.cpp | 6 +-
bioauth/src/biodevices.cpp | 281 ++--
bioauth/src/loginoptionswidget.cpp | 814 ++++++----
...desktop.plicykit.pkexec.bioctl-helper.policy.in | 8 +-
...freedesktop.plicykit.pkexec.biodrvctl.policy.in | 8 +-
...reedesktop.plicykit.pkexec.biorestart.policy.in | 8 +-
polkit-agent/CMakeLists.txt | 22 +-
polkit-agent/assets.qrc | 47 +
polkit-agent/assets/biowaiting/fingerprint0.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint1.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint10.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint11.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint12.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint13.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint14.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint2.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint3.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint4.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint5.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint6.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint7.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint8.svg | 1 +
polkit-agent/assets/biowaiting/fingerprint9.svg | 1 +
polkit-agent/assets/biowaiting/fingervein0.svg | 1 +
polkit-agent/assets/biowaiting/fingervein1.svg | 1 +
polkit-agent/assets/biowaiting/fingervein10.svg | 1 +
polkit-agent/assets/biowaiting/fingervein11.svg | 1 +
polkit-agent/assets/biowaiting/fingervein2.svg | 1 +
polkit-agent/assets/biowaiting/fingervein3.svg | 1 +
polkit-agent/assets/biowaiting/fingervein4.svg | 1 +
polkit-agent/assets/biowaiting/fingervein5.svg | 1 +
polkit-agent/assets/biowaiting/fingervein6.svg | 1 +
polkit-agent/assets/biowaiting/fingervein7.svg | 1 +
polkit-agent/assets/biowaiting/fingervein8.svg | 1 +
polkit-agent/assets/biowaiting/fingervein9.svg | 1 +
polkit-agent/assets/biowaiting/iris0.svg | 1 +
polkit-agent/assets/biowaiting/iris1.svg | 1 +
polkit-agent/assets/biowaiting/iris10.svg | 1 +
polkit-agent/assets/biowaiting/iris11.svg | 1 +
polkit-agent/assets/biowaiting/iris2.svg | 1 +
polkit-agent/assets/biowaiting/iris3.svg | 1 +
polkit-agent/assets/biowaiting/iris4.svg | 1 +
polkit-agent/assets/biowaiting/iris5.svg | 1 +
polkit-agent/assets/biowaiting/iris6.svg | 1 +
polkit-agent/assets/biowaiting/iris7.svg | 1 +
polkit-agent/assets/biowaiting/iris8.svg | 1 +
polkit-agent/assets/biowaiting/iris9.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint0.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint1.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint2.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint3.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint4.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint5.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint6.svg | 1 +
polkit-agent/assets/biowaiting/voiceprint7.svg | 1 +
polkit-agent/i18n_ts/bo.ts | 192 +--
polkit-agent/i18n_ts/bo_CN.ts | 180 ++-
polkit-agent/i18n_ts/de.ts | 180 ++-
polkit-agent/i18n_ts/es.ts | 180 ++-
polkit-agent/i18n_ts/fr.ts | 180 ++-
polkit-agent/i18n_ts/kk.ts | 180 ++-
polkit-agent/i18n_ts/ky.ts | 180 ++-
polkit-agent/i18n_ts/mn.ts | 180 ++-
polkit-agent/i18n_ts/pt.ts | 53 +-
polkit-agent/i18n_ts/ru.ts | 53 +-
polkit-agent/i18n_ts/tr.ts | 178 ++-
polkit-agent/i18n_ts/ug.ts | 180 ++-
polkit-agent/i18n_ts/zh_CN.ts | 180 ++-
polkit-agent/i18n_ts/zh_HK.ts | 182 ++-
polkit-agent/src/PolkitListener.cpp | 354 ++---
polkit-agent/src/PolkitListener.h | 48 +-
polkit-agent/src/fullscreenbackground.cpp | 513 ++++++
polkit-agent/src/fullscreenbackground.h | 173 ++
polkit-agent/src/kalabel.cpp | 16 +-
polkit-agent/src/kalabel.h | 3 +-
polkit-agent/src/mainwindow.cpp | 1654 ++++++++++----------
polkit-agent/src/mainwindow.h | 90 +-
polkit-agent/src/mainwindow.ui | 165 +-
polkit-agent/src/modeButton.h | 2 +-
polkit-agent/src/pam-tally.c | 16 +-
polkit-agent/src/pam-tally.h | 42 +-
polkit-agent/src/sessionmanager.cpp | 35 +-
polkit-agent/src/types.h | 36 +-
polkit-agent/src/usdblockshortcut.cpp | 61 +
polkit-agent/src/usdblockshortcut.h | 49 +
polkit-agent/src/users.cpp | 94 +-
polkit-agent/src/users.h | 13 +-
90 files changed, 4209 insertions(+), 2708 deletions(-)
create mode 100644 polkit-agent/assets/biowaiting/fingerprint0.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint1.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint10.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint11.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint12.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint13.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint14.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint2.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint3.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint4.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint5.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint6.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint7.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint8.svg
create mode 100644 polkit-agent/assets/biowaiting/fingerprint9.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein0.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein1.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein10.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein11.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein2.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein3.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein4.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein5.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein6.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein7.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein8.svg
create mode 100644 polkit-agent/assets/biowaiting/fingervein9.svg
create mode 100644 polkit-agent/assets/biowaiting/iris0.svg
create mode 100644 polkit-agent/assets/biowaiting/iris1.svg
create mode 100644 polkit-agent/assets/biowaiting/iris10.svg
create mode 100644 polkit-agent/assets/biowaiting/iris11.svg
create mode 100644 polkit-agent/assets/biowaiting/iris2.svg
create mode 100644 polkit-agent/assets/biowaiting/iris3.svg
create mode 100644 polkit-agent/assets/biowaiting/iris4.svg
create mode 100644 polkit-agent/assets/biowaiting/iris5.svg
create mode 100644 polkit-agent/assets/biowaiting/iris6.svg
create mode 100644 polkit-agent/assets/biowaiting/iris7.svg
create mode 100644 polkit-agent/assets/biowaiting/iris8.svg
create mode 100644 polkit-agent/assets/biowaiting/iris9.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint0.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint1.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint2.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint3.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint4.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint5.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint6.svg
create mode 100644 polkit-agent/assets/biowaiting/voiceprint7.svg
create mode 100644 polkit-agent/src/fullscreenbackground.cpp
create mode 100644 polkit-agent/src/fullscreenbackground.h
create mode 100644 polkit-agent/src/usdblockshortcut.cpp
create mode 100644 polkit-agent/src/usdblockshortcut.h
diff --git a/bioauth-bin/src/main.cpp b/bioauth-bin/src/main.cpp
index 81ffdb4..a88dfe8 100644
--- a/bioauth-bin/src/main.cpp
+++ b/bioauth-bin/src/main.cpp
@@ -21,6 +21,7 @@
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <termios.h>
+#include <signal.h>
#include <pwd.h>
@@ -38,7 +39,7 @@
bool enableDebug;
QString logPrefix;
-
+BioAuth bioAuth;
enum MsgType
{
START,
@@ -241,6 +242,13 @@ DeviceInfo showDevices(const QMap<int, QList<DeviceInfo>> &devicesMap)
return DeviceInfo();
}
+static void signal_handler(int signo)
+{
+ if (signo == SIGHUP) {
+ bioAuth.stopAuth();
+ }
+}
+
int main(int argc, char *argv[])
{
QCoreApplication::setSetuidAllowed(true);
@@ -310,7 +318,8 @@ int main(int argc, char *argv[])
showMessage(QObject::tr("Press Q or Esc to cancel"), PROMPT);
}
- BioAuth bioAuth(uid, deviceInfo);
+ bioAuth.setUid(uid);
+ bioAuth.setDevice(deviceInfo);
KeyWatcher watcher;
QMap<int,int> m_failedTimes;
@@ -403,7 +412,7 @@ int main(int argc, char *argv[])
bioAuth.startAuth();
- if(!isHiddenSwitchButton){
+ if (!isHiddenSwitchButton) {
QObject::connect(&watcher, &KeyWatcher::exit, &a, [&]{
showMessage(QObject::tr("AUTHENTICATION CANCELED"), START);
bioAuth.stopAuth();
@@ -411,6 +420,7 @@ int main(int argc, char *argv[])
});
}
watcher.start();
+ signal(SIGHUP, signal_handler);
return a.exec();
}
diff --git a/bioauth/include/bioauth.h b/bioauth/include/bioauth.h
index 477d3b3..bc7d325 100644
--- a/bioauth/include/bioauth.h
+++ b/bioauth/include/bioauth.h
@@ -36,6 +36,7 @@ public:
explicit BioAuth(QObject *parent = nullptr);
~BioAuth();
void setDevice(const DeviceInfoPtr deviceInfo);
+ void setUid(qint32 uid);
DeviceInfoPtr getDevice();
void startAuth();
void startUkeyAuth();
@@ -59,7 +60,6 @@ public:
*/
bool GetHasUkeyFeature(int uid, int indexStart = 0, int indexEnd = -1);
-
signals:
void authComplete(int uid, bool result, int retErrNo);
void authFinished();
diff --git a/bioauth/include/loginoptionswidget.h b/bioauth/include/loginoptionswidget.h
index dbbe1af..0eca34d 100644
--- a/bioauth/include/loginoptionswidget.h
+++ b/bioauth/include/loginoptionswidget.h
@@ -54,7 +54,7 @@ public:
unsigned getLoginOptCount();
DeviceInfoPtr getFirstDevInfo();
int convertDeviceType(int nDevType);
- void updateUIStatus(bool update);
+ void updateUIStatus(bool update, int nPreOptType = -1);
void updateUkeyUIStatus(int type);
void setUser(int uid);
void setCurrentDevice(int drvid);
@@ -97,6 +97,13 @@ public:
void SetExtraInfo(QString extra_info,QString info_type);
bool getHasUkeyOptions();
void setSelectedPassword();
+
+ // 设置所有生物识别的禁用状态
+ void setAllDeviceDisable(bool bDisable = true);
+
+ void startBioWaiting(unsigned uCurLoginOptType);
+ void stopBioWaiting(bool isDisable = false);
+
public slots:
void readDevicesInfo();
void onIdentifyComplete(int uid, bool ret, int retErrNo);
@@ -129,6 +136,7 @@ private:
QPixmap scaledPixmap(int width, int height, QString url);
QPixmap drawSymbolicColoredPixmap(QPixmap &source, QString cgColor);
void updatePixmap();
+ QPixmap scaledSmoothPixmap(const QPixmap &src, int nWidth, int nHeight);
private:
BioAuth *m_biomericProxy = nullptr;
@@ -164,6 +172,12 @@ private:
QTimer *w_timer;
bool isShowUkey = false;
+
+ // 指纹、指静脉、虹膜、声纹识别动图
+ QLabel *m_labelBioWaiting = nullptr; // 指纹、指静脉、虹膜、声纹识别动图提示
+ QTimer *m_timerBioWaiting = nullptr; // 指纹、指静脉、虹膜、声纹识别动图切换定时器
+ int m_nBioWaitingFrame = 0; // 当前显示的动图帧
+ int m_nCurBioWaitingType = -1; // 当前显示的动图类型
};
#endif // LOGINOPTIONSWIDGET_H
diff --git a/bioauth/src/bioauth.cpp b/bioauth/src/bioauth.cpp
index 98143e6..076f282 100644
--- a/bioauth/src/bioauth.cpp
+++ b/bioauth/src/bioauth.cpp
@@ -61,6 +61,11 @@ void BioAuth::setDevice(const DeviceInfoPtr deviceInfo)
this->deviceInfo = deviceInfo;
}
+void BioAuth::setUid(qint32 uid)
+{
+ this->uid = uid;
+}
+
void BioAuth::startUkeyAuth()
{
// stopAuth();
@@ -209,7 +214,6 @@ void BioAuth::onIdentityComplete(QDBusPendingCallWatcher *watcher)
/* 识别生物特征成功,发送认证结果 */
if(isInAuthentication){
-
isInAuthentication = false;
if(result == DBUS_RESULT_SUCCESS && retUid == uid){
diff --git a/bioauth/src/biodevices.cpp b/bioauth/src/biodevices.cpp
index e1287b0..29c2d09 100644
--- a/bioauth/src/biodevices.cpp
+++ b/bioauth/src/biodevices.cpp
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
-**/
+ *
+ **/
#include "biodevices.h"
#include <QDBusInterface>
#include <QSettings>
@@ -26,13 +26,12 @@
#include "generic.h"
-
BioDevices::BioDevices(bool isIgnoreQrCode, QObject *parent)
- : QObject(parent),
- m_uniAuthService(new UniAuthService(this)),
- isShowHotPlug(false),
- useFirstDevice(false),
- m_isIgnoreQrCode(isIgnoreQrCode)
+ : QObject(parent)
+ , m_uniAuthService(new UniAuthService(this))
+ , isShowHotPlug(false)
+ , useFirstDevice(false)
+ , m_isIgnoreQrCode(isIgnoreQrCode)
{
connectToService();
@@ -57,54 +56,45 @@ void BioDevices::connectToService()
qRegisterMetaType<DeviceInfo>();
qDBusRegisterMetaType<DeviceInfo>();
- serviceInterface = new QDBusInterface(BIO_DBUS_SERVICE,
- BIO_DBUS_PATH,
- BIO_DBUS_INTERFACE,
- QDBusConnection::systemBus());
+ serviceInterface
+ = new QDBusInterface(BIO_DBUS_SERVICE, BIO_DBUS_PATH, BIO_DBUS_INTERFACE, QDBusConnection::systemBus());
- connect(serviceInterface, SIGNAL(USBDeviceHotPlug(int, int, int)),
- this, SLOT(onUSBDeviceHotPlug(int,int,int)));
+ connect(serviceInterface, SIGNAL(USBDeviceHotPlug(int, int, int)), this, SLOT(onUSBDeviceHotPlug(int, int, int)));
serviceInterface->setTimeout(2147483647);
}
void BioDevices::onUSBDeviceHotPlug(int deviceId, int action, int devNumNow)
{
qDebug() << deviceId << action << devNumNow;
- QString text = "";
+ QString text = "";
- if(action == -1){
+ if (action == -1) {
DeviceInfoPtr device = findDevice(deviceId);
- if(device)
- text = tr("Unplugging of %1 device detected").arg(bioTypeToString_tr(device->biotype));
+ if (device)
+ text = tr("Unplugging of %1 device detected").arg(bioTypeToString_tr(device->biotype));
}
getDevicesList();
emit deviceCountChanged(deviceInfos.size());
- if(action == 1){
+ if (action == 1) {
DeviceInfoPtr device = findDevice(deviceId);
- if(device)
- text = tr("%1 device insertion detected").arg(bioTypeToString_tr(device->biotype));
+ if (device)
+ text = tr("%1 device insertion detected").arg(bioTypeToString_tr(device->biotype));
}
- if(isShowHotPlug && text != ""){
- QDBusInterface iface("org.freedesktop.Notifications",
- "/org/freedesktop/Notifications",
- "org.freedesktop.Notifications",
- QDBusConnection::sessionBus());
+ if (isShowHotPlug && text != "") {
+ QDBusInterface iface(
+ "org.freedesktop.Notifications",
+ "/org/freedesktop/Notifications",
+ "org.freedesktop.Notifications",
+ QDBusConnection::sessionBus());
QList<QVariant> args;
- args<<(tr("Biometric Manager"))
- <<((unsigned int) 0)
- <<"biometric-manager"
- <<tr("biometric")
- <<text
- <<QStringList()
- <<QVariantMap()
- <<(int)-1;
- iface.callWithArgumentList(QDBus::AutoDetect,"Notify",args);
+ args << (tr("Biometric Manager")) << ((unsigned int)0) << "biometric-manager" << tr("biometric") << text
+ << QStringList() << QVariantMap() << (int)-1;
+ iface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
}
-
}
bool BioDevices::GetBioAuthEnable(uid_t uid)
@@ -121,11 +111,11 @@ bool BioDevices::GetBioAuthEnable(uid_t uid)
QSettings settings(configPath, QSettings::IniFormat);
qDebug() << "configure path: " << settings.fileName();
- if(settings.allKeys().contains("EnableAuth")){
+ if (settings.allKeys().contains("EnableAuth")) {
return settings.value("EnableAuth").toBool();
- }else{
+ } else {
QSettings sysSettings(GET_STR(CONFIG_FILE), QSettings::IniFormat);
- if(sysSettings.contains("EnableAuth"))
+ if (sysSettings.contains("EnableAuth"))
return sysSettings.value("EnableAuth").toBool();
else
return true;
@@ -140,7 +130,7 @@ void BioDevices::getDevicesList()
{
/* 返回值为 i -- int 和 av -- array of variant */
QDBusMessage msg = serviceInterface->call("GetDevList");
- if(msg.type() == QDBusMessage::ErrorMessage){
+ if (msg.type() == QDBusMessage::ErrorMessage) {
LOG() << msg.errorMessage();
return;
}
@@ -155,21 +145,20 @@ void BioDevices::getDevicesList()
deviceInfos.clear();
- for(int i = 0; i < deviceNum; i++) {
+ for (int i = 0; i < deviceNum; i++) {
DeviceInfoPtr pDeviceInfo = std::make_shared<DeviceInfo>();
infos.at(i).value<QDBusArgument>() >> *pDeviceInfo;
- if(pDeviceInfo->device_available > 0) { //设备可用
+ if (pDeviceInfo->device_available > 0) { // 设备可用
if (pDeviceInfo->biotype == REMOTE_QRCODE_TYPE && m_isIgnoreQrCode)
continue;
if (!bEnableBioAuth && pDeviceInfo->biotype <= BIOTYPE_VOICEPRINT)
continue;
deviceInfos.push_back(pDeviceInfo);
- }
+ }
}
}
-
int BioDevices::count()
{
return deviceInfos.size();
@@ -179,7 +168,7 @@ int BioDevices::GetUserDevCount(int uid)
{
int count = 0;
QDBusMessage msg = serviceInterface->call("GetDevList");
- if(msg.type() == QDBusMessage::ErrorMessage){
+ if (msg.type() == QDBusMessage::ErrorMessage) {
LOG() << msg.errorMessage();
return 0;
}
@@ -190,14 +179,13 @@ int BioDevices::GetUserDevCount(int uid)
QList<QVariant> infos;
argument >> infos;
- for(int i = 0; i < deviceNum; i++) {
+ for (int i = 0; i < deviceNum; i++) {
DeviceInfoPtr pDeviceInfo = std::make_shared<DeviceInfo>();
infos.at(i).value<QDBusArgument>() >> *pDeviceInfo;
- if(pDeviceInfo->device_available > 0 && GetUserDevFeatureCount(uid,pDeviceInfo->device_id)>0) //设备可用
+ if (pDeviceInfo->device_available > 0 && GetUserDevFeatureCount(uid, pDeviceInfo->device_id) > 0) // 设备可用
count++;
}
return count;
-
}
FeatureMap BioDevices::GetUserFeatures(int uid)
@@ -206,8 +194,7 @@ FeatureMap BioDevices::GetUserFeatures(int uid)
QList<QDBusVariant> qlist;
int listsize;
QDBusMessage result = serviceInterface->call(QStringLiteral("GetAllFeatureList"), uid, 0, -1);
- if(result.type() == QDBusMessage::ErrorMessage)
- {
+ if (result.type() == QDBusMessage::ErrorMessage) {
qWarning() << "GetDevList error:" << result.errorMessage();
return featureMap;
}
@@ -224,13 +211,12 @@ FeatureMap BioDevices::GetUserFeatures(int uid)
return featureMap;
}
-int BioDevices::GetUserDevFeatureCount(int uid,int drvid)
+int BioDevices::GetUserDevFeatureCount(int uid, int drvid)
{
- QDBusMessage FeatureResult = serviceInterface->call(QStringLiteral("GetFeatureList"),drvid,uid,0,-1);
- if(FeatureResult.type() == QDBusMessage::ErrorMessage)
- {
- qWarning() << "GetFeatureList error:" << FeatureResult.errorMessage();
- return 0;
+ QDBusMessage FeatureResult = serviceInterface->call(QStringLiteral("GetFeatureList"), drvid, uid, 0, -1);
+ if (FeatureResult.type() == QDBusMessage::ErrorMessage) {
+ qWarning() << "GetFeatureList error:" << FeatureResult.errorMessage();
+ return 0;
}
return FeatureResult.arguments().takeFirst().toInt();
}
@@ -238,13 +224,13 @@ int BioDevices::GetUserDevFeatureCount(int uid,int drvid)
int BioDevices::getFeatureCount(int uid, int indexStart, int indexEnd)
{
int res = 0;
- for(int i = 0; i < deviceInfos.count(); i++) {
+ for (int i = 0; i < deviceInfos.count(); i++) {
DeviceInfoPtr deviceInfo = deviceInfos.at(i);
- QDBusMessage featurecount = serviceInterface->call("GetFeatureList",deviceInfo->device_id,uid,indexStart,indexEnd);
- if(featurecount.type() == QDBusMessage::ErrorMessage)
- {
- qWarning() << "GetFeatureList error:" << featurecount.errorMessage();
- }else{
+ QDBusMessage featurecount
+ = serviceInterface->call("GetFeatureList", deviceInfo->device_id, uid, indexStart, indexEnd);
+ if (featurecount.type() == QDBusMessage::ErrorMessage) {
+ qWarning() << "GetFeatureList error:" << featurecount.errorMessage();
+ } else {
res += featurecount.arguments().takeFirst().toInt();
}
}
@@ -255,11 +241,11 @@ QMap<int, QList<DeviceInfo>> BioDevices::getAllDevices()
{
QMap<int, QList<DeviceInfo>> devices;
- for(auto deviceInfo : deviceInfos) {
- if (deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 终端不使用扫码
+ for (auto deviceInfo : deviceInfos) {
+ if (deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 终端不使用扫码
continue;
- if(!GetDirveIsIdle(deviceInfo->device_id))
+ if (!GetDirveIsIdle(deviceInfo->device_id))
continue;
devices[deviceInfo->biotype].push_back(*deviceInfo);
@@ -272,9 +258,9 @@ QMap<int, QList<DeviceInfo>> BioDevices::getUserDevices(int uid)
{
QMap<int, QList<DeviceInfo>> devices;
bool isQRCodeEnable = GetQRCodeEnable();
- for(auto deviceInfo : deviceInfos) {
- if(GetUserDevFeatureCount(uid,deviceInfo->device_id) > 0) {
- if (!isQRCodeEnable && deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 关闭了二维码功能
+ for (auto deviceInfo : deviceInfos) {
+ if (GetUserDevFeatureCount(uid, deviceInfo->device_id) > 0) {
+ if (!isQRCodeEnable && deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 关闭了二维码功能
continue;
devices[deviceInfo->biotype].push_back(*deviceInfo);
}
@@ -287,7 +273,7 @@ QList<DeviceInfo> BioDevices::getDevices(int type)
{
QList<DeviceInfo> devices;
- for(auto deviceInfo : deviceInfos) {
+ for (auto deviceInfo : deviceInfos) {
if (deviceInfo->biotype == type)
devices.push_back(*deviceInfo);
}
@@ -316,7 +302,7 @@ bool BioDevices::GetHiddenSwitchButton()
return m_uniAuthService->getHiddenSwitchButton();
} else {
QSettings sysSettings("/etc/biometric-auth/ukui-biometric.conf", QSettings::IniFormat);
- if(sysSettings.contains("HiddenSwitchButton"))
+ if (sysSettings.contains("HiddenSwitchButton"))
return sysSettings.value("HiddenSwitchButton").toBool();
else
return false;
@@ -329,7 +315,7 @@ int BioDevices::getFailedTimes()
return m_uniAuthService->getMaxFailedTimes();
} else {
QSettings sysSettings("/etc/biometric-auth/ukui-biometric.conf", QSettings::IniFormat);
- if(sysSettings.contains("MaxFailedTimes"))
+ if (sysSettings.contains("MaxFailedTimes"))
return sysSettings.value("MaxFailedTimes").toInt();
else
return 3;
@@ -369,22 +355,22 @@ bool BioDevices::GetBioAuthEnable()
isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_BIO);
}
if (isEnable && !isShowHotPlug) {
- if(qAppName() == "polkit-ukui-authentication-agent-1") //获取polkit开关是否打开
+ if (qAppName() == "polkit-ukui-authentication-agent-1") // 获取polkit开关是否打开
isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_POLKIT);
- if(qAppName() == "bioauth"){ //获取父进程名称为sudosu或者login
- int ppid = getppid(); //获取父进程pid
+ if (qAppName() == "bioauth") { // 获取父进程名称为sudosu或者login
+ int ppid = getppid(); // 获取父进程pid
QString filename = "/proc/" + QString::number(ppid) + "/cmdline";
QFile file(filename);
- if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- qDebug()<<"Can't open the file!"<<endl;
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ qDebug() << "Can't open the file!" << endl;
}
QByteArray text = file.readAll();
file.close();
- if(text.contains("sudo")){
+ if (text.contains("sudo")) {
isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_SUDO);
- }else if(text.contains("su")){
+ } else if (text.contains("su")) {
isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_SU);
- }else if(text.contains("login")){
+ } else if (text.contains("login")) {
isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_LOGIN);
}
}
@@ -401,23 +387,23 @@ bool BioDevices::GetBioAuthEnable()
if (isEnable && sysSettings.allKeys().contains("EnableAuthApp")) {
isEnableApp = sysSettings.value("EnableAuthApp").toInt();
- if(qAppName() == "polkit-ukui-authentication-agent-1") //获取polkit开关是否打开
- isEnable = isEnableApp & (1<<2);
- if(qAppName() == "bioauth"){ //获取父进程名称为sudosu或者login
- int ppid = getppid(); //获取父进程pid
+ if (qAppName() == "polkit-ukui-authentication-agent-1") // 获取polkit开关是否打开
+ isEnable = isEnableApp & (1 << 2);
+ if (qAppName() == "bioauth") { // 获取父进程名称为sudosu或者login
+ int ppid = getppid(); // 获取父进程pid
QString filename = "/proc/" + QString::number(ppid) + "/cmdline";
QFile file(filename);
- if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- qDebug()<<"Can't open the file!"<<endl;
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ qDebug() << "Can't open the file!" << endl;
}
QByteArray text = file.readAll();
file.close();
- if(text.contains("sudo")){
- isEnable = isEnableApp & (1<<3);
- }else if(text.contains("su")){
- isEnable = isEnableApp & (1<<4);
- }else if(text.contains("login")){
- isEnable = isEnableApp & (1<<5);
+ if (text.contains("sudo")) {
+ isEnable = isEnableApp & (1 << 3);
+ } else if (text.contains("su")) {
+ isEnable = isEnableApp & (1 << 4);
+ } else if (text.contains("login")) {
+ isEnable = isEnableApp & (1 << 5);
}
}
}
@@ -426,9 +412,9 @@ bool BioDevices::GetBioAuthEnable()
}
}
-DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType)
+DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid, int bioType)
{
- if(deviceInfos.size() <= 0)
+ if (deviceInfos.size() <= 0)
return nullptr;
FeatureMap mapFeatures = GetUserFeatures(uid);
@@ -438,18 +424,18 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType)
DeviceInfoPtr ptrDevInfo = nullptr;
if (pwdInfo) {
QString strDeviceName = m_uniAuthService->getDefaultDevice(pwdInfo->pw_name, bioType);
- qDebug()<<strDeviceName;
- if(!strDeviceName.isEmpty()) {
+ qDebug() << strDeviceName;
+ if (!strDeviceName.isEmpty()) {
ptrDevInfo = findDevice(strDeviceName);
if (ptrDevInfo) {
int isIdle = GetDirveIsIdle(ptrDevInfo->device_id);
- if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){
+ if (isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)) {
defaultDeviceName = strDeviceName;
}
}
}
}
- if(defaultDeviceName.isEmpty()){
+ if (defaultDeviceName.isEmpty()) {
return nullptr;
}
return ptrDevInfo;
@@ -463,29 +449,28 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType)
defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
qDebug() << defaultDeviceName;
- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
+ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
QSettings sysConfig(GET_STR(CONFIG_FILE), QSettings::IniFormat);
defaultDeviceName = sysConfig.value(DEFAULT_DEVICE).toString();
}
- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)){
+ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf";
QSettings userConfig(userConfigFile, QSettings::IniFormat);
defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
}
qDebug() << "default device: " << defaultDeviceName;
// 终端不默认使用第一个设备
- if(defaultDeviceName.isEmpty()){
+ if (defaultDeviceName.isEmpty()) {
return nullptr;
}
bool defValid = false;
DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName);
if (ptrDevInfo) {
int isIdle = GetDirveIsIdle(ptrDevInfo->device_id);
- if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){
+ if (isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)) {
defValid = true;
}
-
}
if (!defValid) {
@@ -498,18 +483,18 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType)
void BioDevices::recordAuthDrive(QString appName, int drvid, bool insert)
{
- if(m_uniAuthService && m_uniAuthService->isActivatable()){
- m_uniAuthService->recordAuthDrive(appName,drvid,insert);
+ if (m_uniAuthService && m_uniAuthService->isActivatable()) {
+ m_uniAuthService->recordAuthDrive(appName, drvid, insert);
}
}
bool BioDevices::GetDirveIsIdle(int drvid)
{
- if(m_uniAuthService && m_uniAuthService->isActivatable()){
+ if (m_uniAuthService && m_uniAuthService->isActivatable()) {
QStringList appList = m_uniAuthService->getAuthingApp();
- for(QString appName : appList){
+ for (QString appName : appList) {
int id = m_uniAuthService->getAuthingAppDrivd(appName);
- if(id == drvid){
+ if (id == drvid) {
return false;
}
}
@@ -520,7 +505,7 @@ bool BioDevices::GetDirveIsIdle(int drvid)
DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid)
{
- if(deviceInfos.size() <= 0)
+ if (deviceInfos.size() <= 0)
return nullptr;
FeatureMap mapFeatures = GetUserFeatures(uid);
@@ -530,13 +515,16 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid)
DeviceInfoPtr ptrDevInfo = nullptr;
if (pwdInfo) {
for (auto bioType : m_listPriority) {
+ if (bioType == REMOTE_QRCODE_TYPE) {
+ continue;
+ }
QString strDeviceName = m_uniAuthService->getDefaultDevice(pwdInfo->pw_name, bioType);
- qDebug()<<strDeviceName;
- if(!strDeviceName.isEmpty()) {
+ qDebug() << strDeviceName;
+ if (!strDeviceName.isEmpty()) {
ptrDevInfo = findDevice(strDeviceName);
if (ptrDevInfo) {
int isIdle = GetDirveIsIdle(ptrDevInfo->device_id);
- if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){
+ if (isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)) {
defaultDeviceName = strDeviceName;
break;
}
@@ -544,7 +532,7 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid)
}
}
}
- if(defaultDeviceName.isEmpty()){
+ if (defaultDeviceName.isEmpty()) {
return nullptr;
}
return ptrDevInfo;
@@ -558,21 +546,19 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid)
defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
qDebug() << defaultDeviceName;
- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
+ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
QSettings sysConfig(GET_STR(CONFIG_FILE), QSettings::IniFormat);
defaultDeviceName = sysConfig.value(DEFAULT_DEVICE).toString();
}
- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)){
+ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf";
QSettings userConfig(userConfigFile, QSettings::IniFormat);
defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
-
-
}
qDebug() << "default device: " << defaultDeviceName;
// 终端不默认使用第一个设备
- if(defaultDeviceName.isEmpty()){
+ if (defaultDeviceName.isEmpty()) {
return nullptr;
}
bool defValid = false;
@@ -609,18 +595,18 @@ QStringList BioDevices::getAllDefDevices()
defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
qDebug() << defaultDeviceName;
- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
+ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
QSettings sysConfig(GET_STR(CONFIG_FILE), QSettings::IniFormat);
defaultDeviceName = sysConfig.value(DEFAULT_DEVICE).toString();
}
- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)){
+ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) {
QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf";
QSettings userConfig(userConfigFile, QSettings::IniFormat);
defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
}
qDebug() << "default device: " << defaultDeviceName;
- if(!defaultDeviceName.isEmpty()){
+ if (!defaultDeviceName.isEmpty()) {
listDefDevices.push_back(defaultDeviceName);
}
}
@@ -664,18 +650,18 @@ void BioDevices::SetLastDevice(const QString &userName, int drvid)
DeviceInfoPtr BioDevices::findDevice(const int id)
{
- for(auto deviceInfo : deviceInfos) {
- if(deviceInfo->device_id == id)
+ for (auto deviceInfo : deviceInfos) {
+ if (deviceInfo->device_id == id)
return deviceInfo;
}
- //qDebug() << deviceName << "doesn't exists";
+ // qDebug() << deviceName << "doesn't exists";
return nullptr;
}
DeviceInfoPtr BioDevices::findDevice(const QString &deviceName)
{
- for(auto deviceInfo : deviceInfos) {
- if(deviceInfo->device_shortname == deviceName)
+ for (auto deviceInfo : deviceInfos) {
+ if (deviceInfo->device_shortname == deviceName)
return deviceInfo;
}
qDebug() << deviceName << "doesn't exists";
@@ -695,21 +681,21 @@ DeviceInfoPtr BioDevices::getFirstDevice(int uid)
QString BioDevices::bioTypeToString_tr(int type)
{
- switch(type) {
- case BIOTYPE_FINGERPRINT:
- return tr("FingerPrint");
- case BIOTYPE_FINGERVEIN:
- return tr("FingerVein");
- case BIOTYPE_IRIS:
- return tr("Iris");
- case BIOTYPE_FACE:
- return tr("Face");
- case BIOTYPE_VOICEPRINT:
- return tr("VoicePrint");
- case LOGINOPT_TYPE_GENERAL_UKEY:
- return tr("Ukey");
- case REMOTE_QRCODE_TYPE:
- return tr("QRCode");
+ switch (type) {
+ case BIOTYPE_FINGERPRINT:
+ return tr("FingerPrint");
+ case BIOTYPE_FINGERVEIN:
+ return tr("FingerVein");
+ case BIOTYPE_IRIS:
+ return tr("Iris");
+ case BIOTYPE_FACE:
+ return tr("Face");
+ case BIOTYPE_VOICEPRINT:
+ return tr("VoicePrint");
+ case LOGINOPT_TYPE_GENERAL_UKEY:
+ return tr("Ukey");
+ case REMOTE_QRCODE_TYPE:
+ return tr("QRCode");
}
return QString();
}
@@ -723,19 +709,18 @@ StatusReslut BioDevices::UpdateStatus(int drvid)
{
StatusReslut status;
QDBusMessage result = serviceInterface->call(QStringLiteral("UpdateStatus"), drvid);
- if(result.type() == QDBusMessage::ErrorMessage)
- {
+ if (result.type() == QDBusMessage::ErrorMessage) {
qWarning() << "UpdateStatus error:" << result.errorMessage();
status.result = -1;
return status;
}
- status.result = result.arguments().at(0).toInt();
- status.enable = result.arguments().at(1).toInt();
- status.devNum = result.arguments().at(2).toInt();
- status.devStatus = result.arguments().at(3).toInt();
- status.opsStatus = result.arguments().at(4).toInt();
- status.notifyMessageId = result.arguments().at(5).toInt();
+ status.result = result.arguments().at(0).toInt();
+ status.enable = result.arguments().at(1).toInt();
+ status.devNum = result.arguments().at(2).toInt();
+ status.devStatus = result.arguments().at(3).toInt();
+ status.opsStatus = result.arguments().at(4).toInt();
+ status.notifyMessageId = result.arguments().at(5).toInt();
return status;
}
diff --git a/bioauth/src/loginoptionswidget.cpp b/bioauth/src/loginoptionswidget.cpp
index bc54363..f75be62 100644
--- a/bioauth/src/loginoptionswidget.cpp
+++ b/bioauth/src/loginoptionswidget.cpp
@@ -40,90 +40,69 @@
#include <QApplication>
#include <QFont>
#include <QDebug>
-
+#include <QPixmapCache>
LoginOptionsWidget::LoginOptionsWidget(QWidget *parent)
- : QWidget(parent)
- , m_biomericProxy(new BioAuth(this))
- , m_bioDevices(new BioDevices())
- , w_timer(nullptr)
+ : QWidget(parent), m_biomericProxy(new BioAuth(this)), m_bioDevices(new BioDevices()), w_timer(nullptr)
{
- m_bioDevices->recordAuthDrive("polkit",0,false);
+ m_bioDevices->recordAuthDrive("polkit", 0, false);
initUI();
initConnections();
m_mapDisableDev.clear();
}
-LoginOptionsWidget::~LoginOptionsWidget()
-{
-
-}
+LoginOptionsWidget::~LoginOptionsWidget() {}
void LoginOptionsWidget::initUI()
{
// 初始化UI
m_layoutMain = new QVBoxLayout();
- m_layoutMain->setContentsMargins(0,0,0,30);
+ m_layoutMain->setContentsMargins(0, 0, 0, 30);
m_layoutMain->setSpacing(12);
m_layoutMain->setAlignment(Qt::AlignTop);
- m_layoutOptBtns = new QHBoxLayout();
- m_layoutOptBtns->setContentsMargins(0,0,0,0);
- m_layoutOptBtns->setSpacing(16);
+
+ m_widgetImage = new QWidget();
+ m_widgetImage->setFixedSize(154, 154);
m_layoutImage = new QHBoxLayout();
- m_layoutImage->setContentsMargins(0,0,0,0);
+ m_layoutImage->setContentsMargins(0, 8, 0, 16);
m_layoutImage->setSpacing(0);
m_layoutImage->setAlignment(Qt::AlignCenter);
-
- m_labelOptTitle = new QLabel();
- m_labelOptTitle->setAlignment(Qt::AlignLeft);
- m_labelOptTitle->setText(tr("Login Options"));
- m_layoutMain->addWidget(m_labelOptTitle);
-
- m_btnGroup = new QButtonGroup(this);
- m_btnGroup->setExclusive(true);
-
- m_layoutOptBtns->setAlignment(Qt::AlignLeft);
- m_layoutMain->addLayout(m_layoutOptBtns);
-
- m_widgetImage = new QWidget();
- m_widgetImage->setFixedSize(154,154);
m_layoutImage->addSpacerItem(new QSpacerItem(109, 0, QSizePolicy::Expanding));
m_layoutImage->addWidget(m_widgetImage);
m_layoutImage->addSpacerItem(new QSpacerItem(109, 0, QSizePolicy::Expanding));
m_widgetImage->hide();
+
// 人脸识别
m_labelFace = new QLabel(m_widgetImage);
m_labelFace->setObjectName("faceLabel");
m_labelFace->setAlignment(Qt::AlignCenter);
- m_labelFace->setFixedSize(154,154);
+ m_labelFace->setFixedSize(154, 154);
QHBoxLayout *layoutFace = new QHBoxLayout();
- layoutFace->setContentsMargins(0,0,0,0);
+ layoutFace->setContentsMargins(0, 0, 0, 0);
layoutFace->setAlignment(Qt::AlignCenter);
m_labelFace->setLayout(layoutFace);
+ m_labelFace->hide();
m_labelFaceLoad = new QLabel();
m_labelFaceLoad->setAlignment(Qt::AlignCenter);
m_labelFaceLoad->setFixedSize(142, 142);
- m_labelFaceLoad->setStyleSheet(QString("QLabel{background-color: rgba(230,230,230,0.39); border-radius: %1px; border: 8px solid white;}").arg(71));
+ m_labelFaceLoad->setStyleSheet(
+ QString("QLabel{background-color: rgba(230,230,230,0.39); border-radius: %1px; border: 8px solid white;}")
+ .arg(71));
layoutFace->addWidget(m_labelFaceLoad, 0, Qt::AlignVCenter);
-
-// QImage img;
-// setFaceImg(img);
- m_labelFace->hide();
// 二维码窗口
m_labelQRCode = new QLabel(m_widgetImage);
m_labelQRCode->setObjectName("qrCodeLabel");
m_labelQRCode->setAlignment(Qt::AlignCenter);
- m_labelQRCode->setFixedSize(154,154);
+ m_labelQRCode->setFixedSize(154, 154);
m_labelQRCode->hide();
- m_layoutMain->addLayout(m_layoutImage);
QVBoxLayout *layoutQRCode = new QVBoxLayout();
layoutQRCode->setAlignment(Qt::AlignCenter);
layoutQRCode->setSpacing(5);
m_labelQRCode->setLayout(layoutQRCode);
m_labelQRCodeTip = new QLabel();
- m_labelQRCodeTip->setFixedSize(22,22);
- m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22,22)));
+ m_labelQRCodeTip->setFixedSize(22, 22);
+ m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22, 22)));
layoutQRCode->addWidget(m_labelQRCodeTip, 0, Qt::AlignHCenter);
m_labelQRCodeMsg = new QLabel();
m_labelQRCodeMsg->setFixedHeight(24);
@@ -133,9 +112,33 @@ void LoginOptionsWidget::initUI()
m_labelQRCodeMsg->setFont(font);
layoutQRCode->addWidget(m_labelQRCodeMsg, 0, Qt::AlignHCenter);
+ // 生物特征等待验证动画
+ m_labelBioWaiting = new QLabel(m_widgetImage);
+ m_labelBioWaiting->setAlignment(Qt::AlignCenter);
+ m_labelBioWaiting->setFixedSize(154, 154);
+ m_labelBioWaiting->hide();
+
+ m_layoutMain->addLayout(m_layoutImage);
+
+ m_layoutOptBtns = new QHBoxLayout();
+ m_layoutOptBtns->setContentsMargins(0, 0, 0, 0);
+ m_layoutOptBtns->setSpacing(16);
+
+ m_labelOptTitle = new QLabel();
+ m_labelOptTitle->setFixedHeight(30);
+ m_labelOptTitle->setAlignment(Qt::AlignLeft);
+ m_labelOptTitle->setText(tr("Login Options"));
+ m_layoutMain->addWidget(m_labelOptTitle);
+
+ m_btnGroup = new QButtonGroup(this);
+ m_btnGroup->setExclusive(true);
+
+ m_layoutOptBtns->setAlignment(Qt::AlignLeft);
+ m_layoutMain->addLayout(m_layoutOptBtns);
+
this->setLayout(m_layoutMain);
- //设置水平扩展
+ // 设置水平扩展
QSizePolicy sizePolicy = this->sizePolicy();
sizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
this->setSizePolicy(sizePolicy);
@@ -143,38 +146,32 @@ void LoginOptionsWidget::initUI()
void LoginOptionsWidget::SetExtraInfo(QString extra_info, QString info_type)
{
- if(!m_biomericProxy)
- {
+ if (!m_biomericProxy) {
qWarning() << "BiometricProxy doesn't exist.";
return;
}
- m_biomericProxy->SetExtraInfo(info_type,extra_info);
+ m_biomericProxy->SetExtraInfo(info_type, extra_info);
}
void LoginOptionsWidget::initConnections()
{
- if(m_biomericProxy) {
- connect(m_biomericProxy, &BioAuth::notifyDetail,
- this, &LoginOptionsWidget::onStatusChanged);
+ if (m_biomericProxy) {
+ connect(m_biomericProxy, &BioAuth::notifyDetail, this, &LoginOptionsWidget::onStatusChanged);
- connect(m_biomericProxy, &BioAuth::frameWritten,
- this, &LoginOptionsWidget::onFrameWritten);
+ connect(m_biomericProxy, &BioAuth::frameWritten, this, &LoginOptionsWidget::onFrameWritten);
- connect(m_biomericProxy, &BioAuth::authComplete,
- this, &LoginOptionsWidget::onIdentifyComplete);
+ connect(m_biomericProxy, &BioAuth::authComplete, this, &LoginOptionsWidget::onIdentifyComplete);
- connect(m_biomericProxy, &BioAuth::authFinished,
- this, &LoginOptionsWidget::onAuthFinished);
+ connect(m_biomericProxy, &BioAuth::authFinished, this, &LoginOptionsWidget::onAuthFinished);
}
if (m_bioDevices) {
- connect(m_bioDevices, &BioDevices::deviceCountChanged,
- this, &LoginOptionsWidget::onUSBDeviceCountChange);
- //readDevicesInfo();
+ connect(m_bioDevices, &BioDevices::deviceCountChanged, this, &LoginOptionsWidget::onUSBDeviceCountChange);
+ // readDevicesInfo();
}
connect(m_btnGroup, SIGNAL(buttonClicked(int)), this, SLOT(onOptionSelected(int)));
}
-bool LoginOptionsWidget::getCurLoginOpt(int& nLoginOptType, int& nDrvId)
+bool LoginOptionsWidget::getCurLoginOpt(int &nLoginOptType, int &nDrvId)
{
if (m_curDevInfo) {
nLoginOptType = convertDeviceType(m_curDevInfo->biotype);
@@ -192,18 +189,18 @@ unsigned LoginOptionsWidget::getLoginOptCount()
DeviceInfoPtr LoginOptionsWidget::getFirstDevInfo()
{
DeviceInfoPtr devInfo = nullptr;
- struct passwd* pwdInfo = getpwuid(m_uid);
+ struct passwd *pwdInfo = getpwuid(m_uid);
if (!pwdInfo)
return devInfo;
int nDrvId = m_bioDevices->GetLastDevice(pwdInfo->pw_name);
if (nDrvId >= 0) {
- qDebug()<<"GetLastDevice:"<<nDrvId;
+ qDebug() << "GetLastDevice:" << nDrvId;
DeviceMap::iterator itDevInfo = m_mapDevices.begin();
for (; itDevInfo != m_mapDevices.end(); itDevInfo++) {
for (auto devinfo : itDevInfo.value()) {
if (devinfo && devinfo->device_id == nDrvId) {
if (!isDeviceDisable(devinfo->device_id)) {
- devInfo = devinfo;
+ devInfo = devinfo;
break;
}
}
@@ -218,7 +215,7 @@ DeviceInfoPtr LoginOptionsWidget::getFirstDevInfo()
for (; itDevInfo != m_mapDevices.end(); itDevInfo++) {
for (auto devinfo : itDevInfo.value()) {
if (devinfo && !isDeviceDisable(devinfo->device_id)) {
- devInfo = devinfo;
+ devInfo = devinfo;
break;
}
}
@@ -238,53 +235,45 @@ bool LoginOptionsWidget::getHasUkeyOptions()
void LoginOptionsWidget::addOptionButton(unsigned uLoginOptType, int nDrvId, QString strDrvName)
{
if (m_mapOptBtns.contains(nDrvId)) {
- return ;
+ return;
}
QToolButton *newButton = new QToolButton();
-// newButton->setStyleSheet(QString("QToolButton{text-align:center;border: none;border-radius: 6px;outline: none;background-color: rgba(230, 230, 230, 100%);} \
-// QToolButton::hover{background-color: rgba(55, 144, 250, 40%);} \
-// QToolButton::pressed {background-color: rgba(55, 144, 250, 100%);} \
-// QToolButton::checked {background-color: rgba(55, 144, 250, 100%);} \
-// "));
newButton->setCheckable(true);
newButton->setChecked(false);
newButton->setFocusPolicy(Qt::NoFocus);
- newButton->setContentsMargins(16,16,16,16);
-// if (nDrvId == -1) {
-// newButton->setEnabled(false);
-// newButton->setChecked(true);
-// } else {
- int nLength = m_btnGroup->buttons().length();
- m_btnGroup->addButton(newButton, nLength);
- m_listDriveId.append(nDrvId);
-// }
+ newButton->setContentsMargins(16, 16, 16, 16);
+
+ int nLength = m_btnGroup->buttons().length();
+ m_btnGroup->addButton(newButton, nLength);
+ m_listDriveId.append(nDrvId);
+
QIcon icon;
switch (uLoginOptType) {
- case LOGINOPT_TYPE_PASSWORD:
- icon = QIcon(QString("%1/images/ukui-loginopt-password.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_GENERAL_UKEY:
- icon = QIcon(QString("%1/images/ukui-loginopt-ukey.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_FACE:
- icon = QIcon(QString("%1/images/ukui-loginopt-face.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_FINGERPRINT:
- icon = QIcon(QString("%1/images/ukui-loginopt-finger.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_IRIS:
- icon = QIcon(QString("%1/images/ukui-loginopt-iris.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_VOICEPRINT:
- icon = QIcon(QString("%1/images/ukui-loginopt-voice.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_FINGERVEIN:
- icon = QIcon(QString("%1/images/ukui-loginopt-fingervein.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
- case LOGINOPT_TYPE_QRCODE:
- icon = QIcon(QString("%1/images/ukui-loginopt-qrcode.svg").arg(GET_STR(UKUI_BIOMETRIC)));
- break;
+ case LOGINOPT_TYPE_PASSWORD:
+ icon = QIcon(QString("%1/images/ukui-loginopt-password.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_GENERAL_UKEY:
+ icon = QIcon(QString("%1/images/ukui-loginopt-ukey.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_FACE:
+ icon = QIcon(QString("%1/images/ukui-loginopt-face.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_FINGERPRINT:
+ icon = QIcon(QString("%1/images/ukui-loginopt-finger.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_IRIS:
+ icon = QIcon(QString("%1/images/ukui-loginopt-iris.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_VOICEPRINT:
+ icon = QIcon(QString("%1/images/ukui-loginopt-voice.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_FINGERVEIN:
+ icon = QIcon(QString("%1/images/ukui-loginopt-fingervein.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
+ case LOGINOPT_TYPE_QRCODE:
+ icon = QIcon(QString("%1/images/ukui-loginopt-qrcode.svg").arg(GET_STR(UKUI_BIOMETRIC)));
+ break;
}
newButton->setIcon(icon);
newButton->setToolTip(strDrvName);
@@ -301,8 +290,8 @@ void LoginOptionsWidget::addOptionButton(unsigned uLoginOptType, int nDrvId, QSt
void LoginOptionsWidget::clearOptionButtons()
{
- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin();
- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
+ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin();
+ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
if (itMapBtn.value()) {
m_btnGroup->removeButton(itMapBtn.value());
m_layoutOptBtns->removeWidget(itMapBtn.value());
@@ -319,66 +308,44 @@ void LoginOptionsWidget::updateOptionButtons()
clearOptionButtons();
addOptionButton(LOGINOPT_TYPE_PASSWORD, -1, tr("Password"));
DeviceMap::iterator itMapDev = m_mapDevices.begin();
- for ( ; itMapDev != m_mapDevices.end(); itMapDev++) {
+ for (; itMapDev != m_mapDevices.end(); itMapDev++) {
for (DeviceInfoPtr devPtr : itMapDev.value()) {
if (devPtr) {
- if(devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- //ukey 设备类型排在二维码前,但实际上应该显示在二维码之后,因此暂时不添加
+ if (devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ // ukey 设备类型排在二维码前,但实际上应该显示在二维码之后,因此暂时不添加
isShowUkey = true;
continue;
}
- addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype));
- }
+ addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype));
+ }
}
}
itMapDev = m_mapDevices.begin();
- if(isShowUkey){
- for ( ; itMapDev != m_mapDevices.end(); itMapDev++) {
+ if (isShowUkey) {
+ for (; itMapDev != m_mapDevices.end(); itMapDev++) {
for (DeviceInfoPtr devPtr : itMapDev.value()) {
- if(devPtr && devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- //此处才添加ukey
+ if (devPtr && devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ // 此处才添加ukey
addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype));
- }
+ }
}
}
}
- //存在特征但没有插入ukey
- if( !isShowUkey && m_biomericProxy->GetHasUkeyFeature(m_uid)){
- addOptionButton(LOGINOPT_TYPE_GENERAL_UKEY,-2,BioDevices::bioTypeToString_tr(LOGINOPT_TYPE_GENERAL_UKEY));
+ // 存在特征但没有插入ukey
+ if (!isShowUkey && m_biomericProxy->GetHasUkeyFeature(m_uid)) {
+ addOptionButton(LOGINOPT_TYPE_GENERAL_UKEY, -2, BioDevices::bioTypeToString_tr(LOGINOPT_TYPE_GENERAL_UKEY));
isShowUkey = true;
}
- if (m_mapOptBtns.size() <= 2 && !isShowUkey) {
- //因为默认添加一个密码选项因此当ukey没有显示出来时按钮数小于等于2时就隐藏选项界面
- m_labelOptTitle->hide();
- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin();
- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
- if (itMapBtn.value()) {
- itMapBtn.value()->hide();
- }
- }
- if (m_mapOptBtns.size() == 0) {
- m_labelFace->hide();
- m_labelQRCode->hide();
- }
- } else {
- m_labelOptTitle->show();
- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin();
- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
- if (itMapBtn.value()) {
- itMapBtn.value()->show();
- }
+ m_labelOptTitle->show();
+ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin();
+ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
+ if (itMapBtn.value()) {
+ itMapBtn.value()->show();
}
}
-
- m_mapOptBtns[-1]->hide();
- if(m_mapOptBtns.size() == 2 && isShowUkey) {
- m_mapOptBtns[-1]->show();
- }
-
- adjustSize();
}
void LoginOptionsWidget::setUser(int uid)
@@ -404,53 +371,49 @@ void LoginOptionsWidget::readDevicesInfo()
DeviceList deviceList = m_bioDevices->GetDevList();
QStringList listDefDevices = m_bioDevices->getAllDefDevices();
FeatureMap mapFeatures = m_bioDevices->GetUserFeatures(m_uid);
- qDebug() << m_uid <<",count:"<<mapFeatures.size();
+ qDebug() << m_uid << ",count:" << mapFeatures.size();
- for(auto pDeviceInfo : deviceList)
- {
+ for (auto pDeviceInfo : deviceList) {
int nDevFeatureCount = 0;
if (m_isInAuth && m_curDevInfo && m_curDevInfo->device_id == pDeviceInfo->device_id) {
nDevFeatureCount = 1;
} else {
if (m_uid == -1) {
nDevFeatureCount = 0;
- } else if(mapFeatures.contains(pDeviceInfo->device_shortname)){
+ } else if (mapFeatures.contains(pDeviceInfo->device_shortname)) {
nDevFeatureCount = mapFeatures[pDeviceInfo->device_shortname].size();
}
}
- qDebug() << *pDeviceInfo << ",FeatureCount:"<<nDevFeatureCount;
- if(nDevFeatureCount > 0) {
+ qDebug() << *pDeviceInfo << ",FeatureCount:" << nDevFeatureCount;
+ if (nDevFeatureCount > 0) {
if (!isAuthEnable && pDeviceInfo->biotype <= BIOTYPE_VOICEPRINT)
continue;
if (!isQRCodeEnable && pDeviceInfo->biotype == REMOTE_QRCODE_TYPE)
continue;
int nDevType = LOGINOPT_TYPE_OTHERS;
nDevType = convertDeviceType(pDeviceInfo->biotype);
- if (listDefDevices.contains(pDeviceInfo->device_shortname) &&
- !m_mapDevices.contains(nDevType)) {
+ if (listDefDevices.contains(pDeviceInfo->device_shortname) && !m_mapDevices.contains(nDevType)) {
m_mapDevices[nDevType].push_back(pDeviceInfo);
}
}
}
updateOptionButtons();
updateUIStatus(false);
- //Q_EMIT notifyOptionsChange(m_mapDevices.size());
+ // Q_EMIT notifyOptionsChange(m_mapDevices.size());
}
void LoginOptionsWidget::startAuth(DeviceInfoPtr device, int uid)
{
- if(!device || !m_biomericProxy || is_Lock)
- {
+ if (!device || !m_biomericProxy || is_Lock) {
qWarning() << "BiometricProxy doesn't exist.";
return;
}
- if(m_isInAuth)
- {
+ if (m_isInAuth) {
qDebug() << "Identification is currently under way, stop it";
stopAuth();
}
- qDebug()<<"deviceInfo:"<<device->device_id;
+ qDebug() << "deviceInfo:" << device->device_id;
this->m_curDevInfo = device;
this->m_uid = uid;
struct passwd *pwdInfo = getpwuid(uid);
@@ -469,7 +432,7 @@ void LoginOptionsWidget::startAuth(DeviceInfoPtr device, int uid)
void LoginOptionsWidget::setSelectedPassword()
{
if (m_mapOptBtns.contains(-1)) {
- QToolButton* btn = m_mapOptBtns[-1];
+ QToolButton *btn = m_mapOptBtns[-1];
if (btn && btn->isVisible()) {
btn->setChecked(true);
}
@@ -480,42 +443,41 @@ void LoginOptionsWidget::setSelectedPassword()
void LoginOptionsWidget::startAuth_()
{
if (!m_curDevInfo)
- return ;
+ return;
qDebug().noquote() << QString("Identify:[drvid: %1, uid: %2]").arg(m_curDevInfo->device_id).arg(m_uid);
m_isInAuth = true;
m_dupFD = -1;
- if(!w_timer)
- {
+ if (!w_timer) {
w_timer = new QTimer(this);
w_timer->setInterval(150);
connect(w_timer, &QTimer::timeout, this, &LoginOptionsWidget::updatePixmap);
}
m_waitingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(24, 24);
- if(m_curLoginOptType == LOGINOPT_TYPE_QRCODE) {
+ if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) {
m_labelQRCodeTip->setPixmap(m_waitingPixmap);
m_labelQRCodeTip->show();
m_labelQRCodeMsg->hide();
- } else if(m_curLoginOptType == LOGINOPT_TYPE_FACE) {
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,0.39);").arg(77));
+ } else if (m_curLoginOptType == LOGINOPT_TYPE_FACE) {
+ m_labelFace->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,0.39);").arg(77));
m_labelFace->setPixmap(QPixmap(""));
m_labelFaceLoad->setPixmap(m_waitingPixmap);
m_labelFaceLoad->show();
}
w_timer->start();
- m_bioDevices->recordAuthDrive("polkit",m_curDevInfo->device_id,true);
+ m_bioDevices->recordAuthDrive("polkit", m_curDevInfo->device_id, true);
m_biomericProxy->startAuth(m_uid, m_curDevInfo);
}
void LoginOptionsWidget::stopAuth()
{
m_isStopped = true;
- if(!m_isInAuth || !m_curDevInfo)
- {
+ if (!m_isInAuth || !m_curDevInfo) {
return;
}
m_biomericProxy->stopAuth();
- if(m_retrytimer&&m_retrytimer->isActive()){
+ if (m_retrytimer && m_retrytimer->isActive()) {
m_retrytimer->stop();
delete m_retrytimer;
m_retrytimer = nullptr;
@@ -531,27 +493,26 @@ void LoginOptionsWidget::updatePixmap()
QMatrix matrix;
matrix.rotate(90.0);
m_waitingPixmap = m_waitingPixmap.transformed(matrix, Qt::FastTransformation);
- if(m_curLoginOptType == LOGINOPT_TYPE_QRCODE)
+ if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE)
m_labelQRCodeTip->setPixmap(m_waitingPixmap);
- else if(m_curLoginOptType == LOGINOPT_TYPE_FACE) {
+ else if (m_curLoginOptType == LOGINOPT_TYPE_FACE) {
m_labelFaceLoad->setPixmap(m_waitingPixmap);
}
}
void LoginOptionsWidget::onAuthFinished()
{
- if(m_bioDevices){
- m_bioDevices->recordAuthDrive("polkit",0,false);
+ if (m_bioDevices) {
+ m_bioDevices->recordAuthDrive("polkit", 0, false);
}
}
void LoginOptionsWidget::onIdentifyComplete(int uid, bool ret, int retErrNo)
{
- if(m_isStopped == true)
- return ;
+ if (m_isStopped == true)
+ return;
- if(uid < 0)
- {
+ if (uid < 0) {
readDevicesInfo();
Q_EMIT authComplete(uid, false, -1);
return;
@@ -559,23 +520,28 @@ void LoginOptionsWidget::onIdentifyComplete(int uid, bool ret, int retErrNo)
qDebug() << retErrNo << uid << m_uid;
// 特征识别成功而且用户id匹配
- if(retErrNo == DBUS_RESULT_SUCCESS && uid == m_uid) {
+ if (retErrNo == DBUS_RESULT_SUCCESS && uid == m_uid) {
qDebug() << "Identify success";
Q_EMIT authComplete(uid, true, 0);
- } else if(retErrNo == -1) { // 特征识别不匹配
+ } else if (retErrNo == -1) { // 特征识别不匹配
qDebug() << "Identify failed";
Q_EMIT authComplete(uid, false, 2);
- } else if(retErrNo == -2) { //识别发生错误
+ } else if (retErrNo == -2) { // 识别发生错误
StatusReslut ret = m_bioDevices->UpdateStatus(m_curDevInfo->device_id);
- qDebug()<<"StatusReslut:"<<ret.result<<","<<ret.enable<<","<<ret.devNum<<","
- <<ret.devStatus<<","<<ret.opsStatus<<","<<ret.notifyMessageId;
- //识别操作超时
- if(ret.result == 0 && (ret.opsStatus == 404 || ret.opsStatus == 304
- || ret.opsStatus == 8)) { // 304认证超时 8网络异常
+ qDebug() << "StatusReslut:" << ret.result << "," << ret.enable << "," << ret.devNum << "," << ret.devStatus
+ << "," << ret.opsStatus << "," << ret.notifyMessageId;
+ // 识别操作超时
+ if (ret.result == 0 && ret.opsStatus == 10) { // 10 当前时间错误导致网络错误
+ Q_EMIT authComplete(uid, false, -4);
+ } else if (
+ ret.result == 0
+ && (ret.opsStatus == 404 || ret.opsStatus == 304 || ret.opsStatus == 8)) { // 304认证超时 8网络异常
Q_EMIT authComplete(uid, false, 1);
} else if (ret.opsStatus == OPS_IDENTIFY_STOP_BY_USER || ret.opsStatus == OPS_VERIFY_STOP_BY_USER) {
Q_EMIT authComplete(uid, false, -2); // 主动停止,直接重试
- } else if (ret.opsStatus == OPS_OPEN_FAIL || ret.opsStatus == OPS_OPEN_ERROR) { // 无法打开设备(设备是坏的/被占用),直接禁用
+ } else if (
+ ret.opsStatus == OPS_OPEN_FAIL
+ || ret.opsStatus == OPS_OPEN_ERROR) { // 无法打开设备(设备是坏的/被占用),直接禁用
Q_EMIT authComplete(uid, false, 5);
} else {
Q_EMIT authComplete(uid, false, 2);
@@ -592,14 +558,14 @@ QPixmap LoginOptionsWidget::PixmapToRound(const QPixmap &src, int radius)
}
QPixmap pixmapa(src);
- QPixmap pixmap(radius*2,radius*2);
+ QPixmap pixmap(radius * 2, radius * 2);
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
QPainterPath path;
- path.addEllipse(0, 0, radius*2, radius*2);
+ path.addEllipse(0, 0, radius * 2, radius * 2);
painter.setClipPath(path);
- painter.drawPixmap(0, 0, radius*2, radius*2, pixmapa);
+ painter.drawPixmap(0, 0, radius * 2, radius * 2, pixmapa);
return pixmap;
}
@@ -614,13 +580,13 @@ QPixmap LoginOptionsWidget::PixmapToRound(const QPixmap &src, int radius)
QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url)
{
QFile imgFile(url);
- if(!imgFile.exists()){
- qDebug()<< "not find the pixmap file";
+ if (!imgFile.exists()) {
+ qDebug() << "not find the pixmap file";
return QPixmap();
}
QImage image(url);
QPixmap pixmap = QPixmap::fromImage(image);
- if(pixmap.isNull()) {
+ if (pixmap.isNull()) {
qDebug() << "pixmap is null";
QProcess exec;
QString program("file " + url);
@@ -628,7 +594,7 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url)
exec.waitForFinished(1000);
QString output = exec.readAllStandardOutput();
qDebug() << output;
- if(output.contains("SVG")){
+ if (output.contains("SVG")) {
qDebug() << "image format is SVG";
QSvgRenderer render(url);
QImage image(width, height, QImage::Format_ARGB32);
@@ -636,9 +602,8 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url)
QPainter painter(&image);
render.render(&painter, image.rect());
pixmap.convertFromImage(image);
- } else if(output.contains("TIFF")) {
+ } else if (output.contains("TIFF")) {
qDebug() << "image format is TIFF";
-
}
}
@@ -647,42 +612,46 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url)
void LoginOptionsWidget::onFrameWritten(int drvid)
{
- if(!m_curDevInfo)
+ if (!m_curDevInfo)
return;
- if (m_curDevInfo && m_curDevInfo->device_id != drvid || !m_isInAuth) {
- return ;
+ if (m_curDevInfo && m_curDevInfo->device_id != drvid || !m_isInAuth) {
+ return;
}
- if(m_dupFD == -1){
+ if (m_dupFD == -1) {
m_dupFD = get_server_gvariant_stdout(drvid);
}
- if(m_dupFD <= 0)
- return ;
+ if (m_dupFD <= 0)
+ return;
cv::Mat img;
lseek(m_dupFD, 0, SEEK_SET);
- char base64_bufferData[1024*1024];
- int rc = read(m_dupFD, base64_bufferData, 1024*1024);
+ char base64_bufferData[1024 * 1024];
+ int rc = read(m_dupFD, base64_bufferData, 1024 * 1024);
Q_UNUSED(rc);
// printf("rc = %d\n", rc);
cv::Mat mat2(1, sizeof(base64_bufferData), CV_8U, base64_bufferData);
img = cv::imdecode(mat2, cv::IMREAD_COLOR);
if (!img.data)
- return ;
- cv::cvtColor(img,img,cv::COLOR_BGR2RGB);
+ return;
+ cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
- QImage srcQImage = QImage((uchar*)(img.data), img.cols, img.rows, QImage::Format_RGB888);
+ QImage srcQImage = QImage((uchar *)(img.data), img.cols, img.rows, QImage::Format_RGB888);
if (isAuthenticating()) {
if (m_curLoginOptType == LOGINOPT_TYPE_FACE) {
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);").arg(77));
+ m_labelFace->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);")
+ .arg(77));
setFaceImg(srcQImage);
m_labelFace->show();
m_labelQRCode->hide();
} else if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) {
- m_labelQRCode->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);").arg(6));
+ m_labelQRCode->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);")
+ .arg(6));
setQRCode(srcQImage);
m_labelQRCode->show();
m_labelQRCodeTip->hide();
@@ -695,14 +664,13 @@ void LoginOptionsWidget::onFrameWritten(int drvid)
m_labelFace->hide();
m_labelQRCode->hide();
}
- if(w_timer && w_timer->isActive())
- {
+ if (w_timer && w_timer->isActive()) {
w_timer->stop();
}
Q_EMIT updateImage(srcQImage);
}
-void LoginOptionsWidget::setQRCode(QImage& imgQRCode)
+void LoginOptionsWidget::setQRCode(QImage &imgQRCode)
{
if (imgQRCode.isNull()) {
imgQRCode.load(QString("%1/images/ukui-qrcode-null.svg").arg(GET_STR(UKUI_BIOMETRIC)));
@@ -716,41 +684,49 @@ void LoginOptionsWidget::setQRCodeMsg(QString strMsg)
{
if (strMsg.isEmpty()) {
m_labelQRCodeMsg->hide();
- //m_labelQRCodeTip->hide();
+ // m_labelQRCodeTip->hide();
} else {
- //一开始认证时就没有网,直接停止加载状态
- if(w_timer && w_timer->isActive())
- {
+ // 一开始认证时就没有网,直接停止加载状态
+ if (w_timer && w_timer->isActive()) {
w_timer->stop();
}
m_labelQRCodeMsg->setText(strMsg);
m_labelQRCodeMsg->show();
m_labelQRCodeTip->show();
- m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22,22)));
+ m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22, 22)));
}
}
-void LoginOptionsWidget::setFaceImg(QImage& imgFace, int nStatus)
+void LoginOptionsWidget::setFaceImg(QImage &imgFace, int nStatus)
{
QPixmap faceImage;
- m_labelFace->setFixedSize(154,154);
- //如果头像文件不存在,则使用默认头像
- if(!imgFace.isNull()) {
- faceImage = PixmapToRound(QPixmap::fromImage(imgFace),77);
+ m_labelFace->setFixedSize(154, 154);
+ // 如果头像文件不存在,则使用默认头像
+ if (!imgFace.isNull()) {
+ faceImage = PixmapToRound(QPixmap::fromImage(imgFace), 77);
} else {
- switch(nStatus) {
- case 1:
- faceImage = loadSvg(QString("%1/images/ukui-loginopt-lose.svg").arg(GET_STR(UKUI_BIOMETRIC)),"black",48);
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);").arg(77));
- break;
- case 2:
- faceImage = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)),"gray",48);
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,100%);").arg(77));
- break;
- default:
- faceImage = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)),"black",48);
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);").arg(77));
- break;
+ switch (nStatus) {
+ case 1:
+ faceImage
+ = loadSvg(QString("%1/images/ukui-loginopt-lose.svg").arg(GET_STR(UKUI_BIOMETRIC)), "black", 48);
+ m_labelFace->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);")
+ .arg(77));
+ break;
+ case 2:
+ faceImage
+ = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)), "gray", 48);
+ m_labelFace->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,100%);")
+ .arg(77));
+ break;
+ default:
+ faceImage
+ = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)), "black", 48);
+ m_labelFace->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);")
+ .arg(77));
+ break;
}
}
@@ -761,22 +737,19 @@ void LoginOptionsWidget::setFaceImg(QImage& imgFace, int nStatus)
void LoginOptionsWidget::onStatusChanged(int drvid, const QString &message)
{
- if(!m_isInAuth || !m_curDevInfo)
- {
+ if (!m_isInAuth || !m_curDevInfo) {
return;
}
- if(drvid != m_curDevInfo->device_id)
- {
+ if (drvid != m_curDevInfo->device_id) {
return;
}
- //Q_EMIT updateAuthMsg(message);
+ // Q_EMIT updateAuthMsg(message);
}
void LoginOptionsWidget::setCurrentDevice(int drvid)
{
DeviceInfoPtr pDeviceInfo = findDeviceById(drvid);
- if(pDeviceInfo)
- {
+ if (pDeviceInfo) {
setCurrentDevice(pDeviceInfo);
}
}
@@ -784,8 +757,7 @@ void LoginOptionsWidget::setCurrentDevice(int drvid)
void LoginOptionsWidget::setCurrentDevice(const QString &deviceName)
{
DeviceInfoPtr pDeviceInfo = findDeviceByName(deviceName);
- if(pDeviceInfo)
- {
+ if (pDeviceInfo) {
setCurrentDevice(pDeviceInfo);
}
}
@@ -797,15 +769,11 @@ void LoginOptionsWidget::setCurrentDevice(const DeviceInfoPtr &pDeviceInfo)
DeviceInfoPtr LoginOptionsWidget::findDeviceById(int drvid)
{
- for(int type : m_mapDevices.keys())
- {
+ for (int type : m_mapDevices.keys()) {
DeviceList &deviceList = m_mapDevices[type];
- auto iter = std::find_if(deviceList.begin(), deviceList.end(),
- [&](DeviceInfoPtr ptr){
- return ptr->device_id == drvid;
- });
- if(iter != deviceList.end())
- {
+ auto iter = std::find_if(
+ deviceList.begin(), deviceList.end(), [&](DeviceInfoPtr ptr) { return ptr->device_id == drvid; });
+ if (iter != deviceList.end()) {
return *iter;
}
}
@@ -814,25 +782,21 @@ DeviceInfoPtr LoginOptionsWidget::findDeviceById(int drvid)
DeviceInfoPtr LoginOptionsWidget::findDeviceByName(const QString &name)
{
- for(int type : m_mapDevices.keys())
- {
+ for (int type : m_mapDevices.keys()) {
DeviceList &deviceList = m_mapDevices[type];
- auto iter = std::find_if(deviceList.begin(), deviceList.end(),
- [&](DeviceInfoPtr ptr){
- return ptr->device_shortname == name;
- });
- if(iter != deviceList.end())
- {
+ auto iter = std::find_if(
+ deviceList.begin(), deviceList.end(), [&](DeviceInfoPtr ptr) { return ptr->device_shortname == name; });
+ if (iter != deviceList.end()) {
return *iter;
}
}
return DeviceInfoPtr();
}
-QString LoginOptionsWidget::GetDefaultDevice(uid_t uid,int bioType)
+QString LoginOptionsWidget::GetDefaultDevice(uid_t uid, int bioType)
{
QString defaultDeviceName = "";
- DeviceInfoPtr pDeviceInfo = m_bioDevices->getDefaultDevice(uid,bioType);
+ DeviceInfoPtr pDeviceInfo = m_bioDevices->getDefaultDevice(uid, bioType);
if (pDeviceInfo) {
defaultDeviceName = pDeviceInfo->device_shortname;
}
@@ -855,19 +819,19 @@ QString LoginOptionsWidget::GetDefaultDevice(uid_t uid)
void LoginOptionsWidget::onUSBDeviceCountChange(int newNum)
{
- qDebug()<<"deviceNewNum:"<<newNum;
+ qDebug() << "deviceNewNum:" << newNum;
int savedCount = 0;
- for(int type : m_mapDevices.keys())
+ for (int type : m_mapDevices.keys())
savedCount += m_mapDevices.value(type).count();
readDevicesInfo();
int count = 0;
- for(int type : m_mapDevices.keys())
+ for (int type : m_mapDevices.keys())
count += m_mapDevices.value(type).count();
-
- //设备数量发生了变化
- if(count != savedCount) {
+
+ // 设备数量发生了变化
+ if (count != savedCount) {
updateOptionButtons();
Q_EMIT notifyOptionsChange(count);
}
@@ -876,40 +840,25 @@ void LoginOptionsWidget::onUSBDeviceCountChange(int newNum)
void LoginOptionsWidget::updateUkeyUIStatus(int type)
{
- if (type == LOGINOPT_TYPE_FACE) {
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);").arg(77));
- m_labelFace->show();
- m_labelQRCode->hide();
- m_widgetImage->show();
- } else if (type == LOGINOPT_TYPE_QRCODE) {
- m_labelQRCode->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);").arg(6));
- QImage img;
- setQRCode(img);
- m_labelQRCode->show();
- m_labelFace->hide();
- m_widgetImage->show();
- } else {
- m_labelFace->hide();
- m_labelQRCode->hide();
- m_widgetImage->hide();
- }
+ m_labelFace->hide();
+ m_labelQRCode->hide();
+ m_widgetImage->hide();
+ setFixedHeight(m_labelOptTitle->height() + 12 + 36);
- QTimer::singleShot(0,this,[&,this](){
- Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size());
- });
+ Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size());
}
-void LoginOptionsWidget::updateUIStatus(bool update)
+void LoginOptionsWidget::updateUIStatus(bool update, int nPreOptType /* = -1*/)
{
if (m_mapOptBtns.contains(-1)) {
- QToolButton* btn = m_mapOptBtns[-1];
+ QToolButton *btn = m_mapOptBtns[-1];
if (btn && btn->isVisible()) {
btn->setChecked(true);
}
}
if (m_curDevInfo) {
if (m_mapOptBtns.contains(m_curDevInfo->device_id)) {
- QToolButton* btn = m_mapOptBtns[m_curDevInfo->device_id];
+ QToolButton *btn = m_mapOptBtns[m_curDevInfo->device_id];
if (btn) {
btn->setChecked(true);
}
@@ -917,27 +866,41 @@ void LoginOptionsWidget::updateUIStatus(bool update)
}
if (update) {
+ if (nPreOptType != -1) {
+ m_curLoginOptType = nPreOptType;
+ }
if (m_curLoginOptType == LOGINOPT_TYPE_FACE) {
- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);").arg(77));
+ m_labelFace->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);")
+ .arg(77));
m_labelFace->show();
m_labelQRCode->hide();
m_widgetImage->show();
+ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 12 + 154 + 48);
} else if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) {
- m_labelQRCode->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);").arg(6));
+ m_labelQRCode->setStyleSheet(
+ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);")
+ .arg(6));
QImage img;
setQRCode(img);
m_labelQRCode->show();
m_labelFace->hide();
m_widgetImage->show();
+ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 12 + 154 + 48);
} else {
m_labelFace->hide();
m_labelQRCode->hide();
- m_widgetImage->hide();
+ if (m_curLoginOptType == LOGINOPT_TYPE_FINGERPRINT || m_curLoginOptType == LOGINOPT_TYPE_FINGERVEIN
+ || m_curLoginOptType == LOGINOPT_TYPE_IRIS || m_curLoginOptType == LOGINOPT_TYPE_VOICEPRINT) {
+ m_widgetImage->show();
+ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 12 + 154 + 48);
+ } else {
+ m_widgetImage->hide();
+ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 24);
+ }
}
- }
- QTimer::singleShot(0,this,[&,this](){
Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size());
- });
+ }
}
void LoginOptionsWidget::onOptionSelected(int nIndex)
@@ -949,17 +912,17 @@ void LoginOptionsWidget::onOptionSelected(int nIndex)
if (info && !isDeviceDisable(info->device_id)) {
Q_EMIT optionSelected(convertDeviceType(info->biotype), info);
this->m_curLoginOptType = convertDeviceType(info->biotype);
- }else if(nIndex == 0 && m_listDriveId[nIndex] == -1){
+ } else if (nIndex == 0 && m_listDriveId[nIndex] == -1) {
stopAuth();
m_curDevInfo = nullptr;
- Q_EMIT optionSelected(LOGINOPT_TYPE_PASSWORD,nullptr);
+ Q_EMIT optionSelected(LOGINOPT_TYPE_PASSWORD, nullptr);
this->m_curLoginOptType = LOGINOPT_TYPE_PASSWORD;
- }else if(m_listDriveId[nIndex] == -2){
- //存在ukey特征但未插入ukey
+ } else if (m_listDriveId[nIndex] == -2) {
+ // 存在ukey特征但未插入ukey
stopAuth();
m_curDevInfo = nullptr;
- Q_EMIT optionSelected(LOGINOPT_TYPE_GENERAL_UKEY,nullptr);
+ Q_EMIT optionSelected(LOGINOPT_TYPE_GENERAL_UKEY, nullptr);
this->m_curLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY;
}
}
@@ -969,33 +932,33 @@ int LoginOptionsWidget::convertDeviceType(int nDevType)
{
int nLoginOptType = LOGINOPT_TYPE_OTHERS;
switch (nDevType) {
- case BIOTYPE_FINGERPRINT:
- nLoginOptType = LOGINOPT_TYPE_FINGERPRINT;
- break;
- case BIOTYPE_FINGERVEIN:
- nLoginOptType = LOGINOPT_TYPE_FINGERVEIN;
- break;
- case BIOTYPE_IRIS:
- nLoginOptType = LOGINOPT_TYPE_IRIS;
- break;
- case BIOTYPE_FACE:
- nLoginOptType = LOGINOPT_TYPE_FACE;
- break;
- case BIOTYPE_VOICEPRINT:
- nLoginOptType = LOGINOPT_TYPE_VOICEPRINT;
- break;
- case UniT_General_Ukey:
- nLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY;
- break;
- case UniT_Advanced_Ukey:
- nLoginOptType = LOGINOPT_TYPE_ADVANCED_UKEY;
- break;
- case REMOTE_QRCODE_TYPE:
- nLoginOptType = LOGINOPT_TYPE_QRCODE;
- break;
- default:
- nLoginOptType = LOGINOPT_TYPE_OTHERS;
- break;
+ case BIOTYPE_FINGERPRINT:
+ nLoginOptType = LOGINOPT_TYPE_FINGERPRINT;
+ break;
+ case BIOTYPE_FINGERVEIN:
+ nLoginOptType = LOGINOPT_TYPE_FINGERVEIN;
+ break;
+ case BIOTYPE_IRIS:
+ nLoginOptType = LOGINOPT_TYPE_IRIS;
+ break;
+ case BIOTYPE_FACE:
+ nLoginOptType = LOGINOPT_TYPE_FACE;
+ break;
+ case BIOTYPE_VOICEPRINT:
+ nLoginOptType = LOGINOPT_TYPE_VOICEPRINT;
+ break;
+ case UniT_General_Ukey:
+ nLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY;
+ break;
+ case UniT_Advanced_Ukey:
+ nLoginOptType = LOGINOPT_TYPE_ADVANCED_UKEY;
+ break;
+ case REMOTE_QRCODE_TYPE:
+ nLoginOptType = LOGINOPT_TYPE_QRCODE;
+ break;
+ default:
+ nLoginOptType = LOGINOPT_TYPE_OTHERS;
+ break;
}
return nLoginOptType;
}
@@ -1004,8 +967,8 @@ void LoginOptionsWidget::setDeviceDisable(int nDevId, bool bDisable)
{
if (bDisable) {
m_mapDisableDev[m_uid][nDevId] = true;
- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin();
- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
+ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin();
+ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
if (itMapBtn.key() == nDevId && itMapBtn.value()) {
itMapBtn.value()->setDisabled(true);
break;
@@ -1013,8 +976,8 @@ void LoginOptionsWidget::setDeviceDisable(int nDevId, bool bDisable)
}
} else {
m_mapDisableDev[m_uid][nDevId] = false;
- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin();
- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
+ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin();
+ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
if (itMapBtn.key() == nDevId && itMapBtn.value()) {
itMapBtn.value()->setDisabled(false);
break;
@@ -1023,6 +986,28 @@ void LoginOptionsWidget::setDeviceDisable(int nDevId, bool bDisable)
}
}
+void LoginOptionsWidget::setAllDeviceDisable(bool bDisable)
+{
+ if (bDisable) {
+ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin();
+ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
+
+ m_mapDisableDev[m_uid][itMapBtn.key()] = true;
+ if (itMapBtn.value()) {
+ itMapBtn.value()->setDisabled(true);
+ }
+ }
+ } else {
+ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin();
+ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
+ m_mapDisableDev[m_uid][itMapBtn.key()] = false;
+ if (itMapBtn.value()) {
+ itMapBtn.value()->setDisabled(false);
+ }
+ }
+ }
+}
+
bool LoginOptionsWidget::isDeviceDisable(int nDevId)
{
if (m_mapDisableDev[m_uid].contains(nDevId)) {
@@ -1033,7 +1018,7 @@ bool LoginOptionsWidget::isDeviceDisable(int nDevId)
void LoginOptionsWidget::lockStatusChanged(bool locked)
{
- if(locked){
+ if (locked) {
is_Lock = true;
stopAuth();
} else {
@@ -1046,7 +1031,7 @@ QPixmap LoginOptionsWidget::loadSvg(QString path, QString color, int size)
{
int origSize = size;
const auto ratio = qApp->devicePixelRatio();
- if ( 2 == ratio) {
+ if (2 == ratio) {
size += origSize;
} else if (3 == ratio) {
size += origSize;
@@ -1071,22 +1056,22 @@ QPixmap LoginOptionsWidget::drawSymbolicColoredPixmap(QPixmap &source, QString c
for (int y = 0; y < img.height(); y++) {
auto color = img.pixelColor(x, y);
if (color.alpha() > 0) {
- if ( "white" == cgColor) {
+ if ("white" == cgColor) {
color.setRed(255);
color.setGreen(255);
color.setBlue(255);
img.setPixelColor(x, y, color);
- } else if( "black" == cgColor) {
+ } else if ("black" == cgColor) {
color.setRed(0);
color.setGreen(0);
color.setBlue(0);
img.setPixelColor(x, y, color);
- } else if ("gray"== cgColor) {
+ } else if ("gray" == cgColor) {
color.setRed(152);
color.setGreen(163);
color.setBlue(164);
img.setPixelColor(x, y, color);
- } else if ("blue" == cgColor){
+ } else if ("blue" == cgColor) {
color.setRed(61);
color.setGreen(107);
color.setBlue(229);
@@ -1099,3 +1084,160 @@ QPixmap LoginOptionsWidget::drawSymbolicColoredPixmap(QPixmap &source, QString c
}
return QPixmap::fromImage(img);
}
+
+QPixmap LoginOptionsWidget::scaledSmoothPixmap(const QPixmap &src, int nWidth, int nHeight)
+{
+ if (src.isNull()) {
+ return QPixmap();
+ }
+
+ QPixmap pixmapa(src);
+ QPixmap pixmap(nWidth, nHeight);
+ pixmap.fill(Qt::transparent);
+ QPainter painter(&pixmap);
+ painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
+ painter.drawPixmap(0, 0, nWidth, nHeight, pixmapa);
+ return pixmap;
+}
+
+void LoginOptionsWidget::startBioWaiting(unsigned uCurLoginOptType)
+{
+ if (uCurLoginOptType == m_nCurBioWaitingType
+ || (uCurLoginOptType != LOGINOPT_TYPE_FINGERPRINT && uCurLoginOptType != LOGINOPT_TYPE_FINGERVEIN
+ && uCurLoginOptType != LOGINOPT_TYPE_IRIS && uCurLoginOptType != LOGINOPT_TYPE_VOICEPRINT)) {
+ return;
+ }
+ m_nCurBioWaitingType = uCurLoginOptType;
+ if (!m_timerBioWaiting) {
+ m_timerBioWaiting = new QTimer(this);
+ m_timerBioWaiting->setInterval(100);
+ }
+ if (m_timerBioWaiting) {
+ if (m_timerBioWaiting->isActive()) {
+ m_timerBioWaiting->stop();
+ }
+ // 重新连接信号槽
+ disconnect(m_timerBioWaiting, nullptr, this, nullptr);
+ connect(m_timerBioWaiting, &QTimer::timeout, this, [&, this, uCurLoginOptType]() {
+ m_nBioWaitingFrame += 1;
+ QString strPicName = "";
+ switch (uCurLoginOptType) {
+ case LOGINOPT_TYPE_FINGERPRINT: {
+ if (m_nBioWaitingFrame >= 15) {
+ m_nBioWaitingFrame = 0;
+ }
+ strPicName = QString(":/image/assets/biowaiting/fingerprint%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_FINGERVEIN: {
+ if (m_nBioWaitingFrame >= 12) {
+ m_nBioWaitingFrame = 0;
+ }
+ strPicName = QString(":/image/assets/biowaiting/fingervein%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_IRIS: {
+ if (m_nBioWaitingFrame >= 12) {
+ m_nBioWaitingFrame = 0;
+ }
+ strPicName = QString(":/image/assets/biowaiting/iris%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_VOICEPRINT: {
+ if (m_nBioWaitingFrame >= 8) {
+ m_nBioWaitingFrame = 0;
+ }
+ strPicName = QString(":/image/assets/biowaiting/voiceprint%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ default:
+ break;
+ }
+ if (!strPicName.isEmpty()) {
+ QPixmap pixmap;
+ if (QPixmapCache::find(strPicName, &pixmap)) {
+ m_labelBioWaiting->setPixmap(pixmap);
+ } else {
+ pixmap = scaledSmoothPixmap(QPixmap(strPicName), 154, 154);
+ if (!pixmap.isNull()) {
+ QPixmapCache::insert(strPicName, pixmap);
+ m_labelBioWaiting->setPixmap(pixmap);
+ }
+ }
+ m_labelBioWaiting->show();
+ }
+ });
+ m_timerBioWaiting->start();
+ m_nBioWaitingFrame = 0;
+ QString strPicName = "";
+ switch (uCurLoginOptType) {
+ case LOGINOPT_TYPE_FINGERPRINT: {
+ strPicName = QString(":/image/assets/biowaiting/fingerprint%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_FINGERVEIN: {
+ strPicName = QString(":/image/assets/biowaiting/fingervein%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_IRIS: {
+ strPicName = QString(":/image/assets/biowaiting/iris%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_VOICEPRINT: {
+ strPicName = QString(":/image/assets/biowaiting/voiceprint%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ default:
+ break;
+ }
+ if (!strPicName.isEmpty()) {
+ QPixmap pixmap;
+ if (QPixmapCache::find(strPicName, &pixmap)) {
+ m_labelBioWaiting->setPixmap(pixmap);
+ } else {
+ pixmap = scaledSmoothPixmap(QPixmap(strPicName), 154, 154);
+ if (!pixmap.isNull()) {
+ QPixmapCache::insert(strPicName, pixmap);
+ m_labelBioWaiting->setPixmap(pixmap);
+ }
+ }
+ m_labelBioWaiting->show();
+ }
+ }
+}
+
+void LoginOptionsWidget::stopBioWaiting(bool isDisable /* = false*/)
+{
+ if (m_timerBioWaiting) {
+ if (m_timerBioWaiting->isActive()) {
+ m_timerBioWaiting->stop();
+ }
+ }
+ m_nBioWaitingFrame = 0;
+ if (isDisable) {
+ QString strPicName = "";
+ switch (m_nCurBioWaitingType) {
+ case LOGINOPT_TYPE_FINGERPRINT: {
+ strPicName = QString(":/image/assets/biowaiting/fingerprint%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_FINGERVEIN: {
+ strPicName = QString(":/image/assets/biowaiting/fingervein%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_IRIS: {
+ strPicName = QString(":/image/assets/biowaiting/iris%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ case LOGINOPT_TYPE_VOICEPRINT: {
+ strPicName = QString(":/image/assets/biowaiting/voiceprint%1.svg").arg(m_nBioWaitingFrame);
+ } break;
+ default:
+ break;
+ }
+ if (!strPicName.isEmpty()) {
+ QPixmap pixmap;
+ if (QPixmapCache::find(strPicName, &pixmap)) {
+ m_labelBioWaiting->setPixmap(pixmap);
+ } else {
+ pixmap = scaledSmoothPixmap(QPixmap(strPicName), 154, 154);
+ if (!pixmap.isNull()) {
+ QPixmapCache::insert(strPicName, pixmap);
+ m_labelBioWaiting->setPixmap(pixmap);
+ }
+ }
+ }
+ } else {
+ m_labelBioWaiting->hide();
+ }
+ m_nCurBioWaitingType = -1;
+}
diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in
index e5601cc..415e7cc 100644
--- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in
+++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in
@@ -10,13 +10,17 @@
<description xml:lang="bo">འཁོར་སྐྱོད་སྐྱེ་དངོས་ཀྱི་ངོས་འཛིན་ཁས་ལེན་ཚོད་འཛིན་ཡོ་བྱད།།</description>
<description xml:lang="mn">ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠤ ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠵᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ </description>
<description xml:lang="zh_HK">運行生物識別認證控制工具</description>
- <description xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتلاش كونترول قىلىش قورالى</description>
+ <description xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتلاش كونترول قىلىش قورالى</description>
+ <description xml:lang="kk">بىئولوگىيەلىك پارىقتاندىرۋ سپاتتاۋ مەڭگەرۋ ەتۋ قۇرالى</description>
+ <description xml:lang="ky">بىئولوگىيەلىك ايىرمالاندىرىش ىسپاتتوو تىزگىندۅۅ جاسوو ،اتقارۇۇ قۇرالى</description>
<message>Authentication is required to enable or disable biometric authentication</message>
<message xml:lang="zh_CN">开启或关闭生物识别认证需要进行身份验证</message>
<message xml:lang="bo">སྒོ་རྒྱག་པའམ་ཡང་ན་སྒོ་རྒྱག་པའི་སྐྱེ་དངོས་ངོས་འཛིན་བདེན་དཔངར་སྤྲོད་བྱེད་པར་ཐོབ་ཐང་གི་ཚོད་ལྟསར་སྤྲོད་བྱ་དགོས།</message>
<message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠪᠤᠶᠤ ᠬᠠᠭᠠᠬᠤ ᠳᠤ ᠪᠡᠶ᠎ᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨ᠎ᠠ᠃</message>
<message xml:lang="zh_HK">開啟或關閉生物識別認證需要進行身份驗證</message>
- <message xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتىنى ئېچىش ياكى تاقاش ئۈچۈن دەلىللەش كېرەك</message>
+ <message xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتىنى ئېچىش ياكى تاقاش ئۈچۈن دەلىللەش كېرەك</message>
+ <message xml:lang="kk">بىئولوگىيەلىك پارىقتاندىرۋ سىپاتىن ٸشٸۋ ياكي تاقاۋ ٷشٸن دالەلدەۋ كەرەك</message>
+ <message xml:lang="ky">بىئولوگىيەلىك ايىرمالاندىرىش دالىلىن اچۇۇ كۅرۉنۉشتۅرۉ بەكىتىش ۉچۉن دالىلدۅ كەرەك</message>
<icon_name>stock_person</icon_name>
<defaults>
<allow_any>no</allow_any>
diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in
index 3efa12e..476cb88 100644
--- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in
+++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in
@@ -10,13 +10,17 @@
<description xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་ཚོད་འཛིན་ཡོ་བྱད་</description>
<description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠡᠷ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠤᠨ᠎ᠠ </description>
<description xml:lang="zh_HK">運行生物識別設備驅動控制工具</description>
- <description xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنى قوزغىتىش كونترول قىلىش ئەسۋابىنى يۈرگۈزۈش</description>
+ <description xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنى قوزغىتىش كونترول قىلىش ئەسۋابىنى يۈرگۈزۈش</description>
+ <description xml:lang="kk">شايمانىن جۉرگۅزۉ</description>
+ <description xml:lang="ky">شايمانىن جۉرگۅزۉ</description>
<message>Authentication is required to change the status of biometric device's driver</message>
<message xml:lang="zh_CN">改变生物识别设备驱动状态需要进行身份验证</message>
<message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་གནས་ཚུལ་ལ་འགྱུར་ལྡོག་གཏོང་བར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message>
<message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠶᠢᠨ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠠᠶᠢᠳᠠᠯ ᠢ ᠬᠤᠪᠢᠷᠠᠭᠤᠯᠬᠤ ᠳᠤ ᠪᠡᠶ᠎ᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ᠃</message>
<message xml:lang="zh_HK">改變生物識別設備驅動狀態需要進行身份驗證</message>
- <message xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنىڭ قوزغىتىش ھالىتىنى ئۆزگەرتىشتە دەلىللەش كېرەك</message>
+ <message xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنىڭ قوزغىتىش ھالىتىنى ئۆزگەرتىشتە دەلىللەش كېرەك</message>
+ <message xml:lang="kk">بىئولوگىيەلىك پارىقتاندىرۋ اسپابىنىڭ قوزعالتۋ كۇيىن وزگەتۋگە دالەلدەۋ كەرەك</message>
+ <message xml:lang="ky">بىئولوگىيەلىك ايىرمالاندىرىش شايمانىنىن قوزعوتۇۇ ابالىن ۅزگۅرتۉۉدۅ دالىلدۅ كەرەك</message>
<icon_name>stock_person</icon_name>
<defaults>
<allow_any>auth_admin</allow_any>
diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in
index f77a55f..a5f82f3 100644
--- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in
+++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in
@@ -11,12 +11,16 @@
<description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠤᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠡᠭᠢᠯᠡᠭᠦᠯᠪᠡ᠃</description>
<message>Authentication is required to restart biometric service</message>
<description xml:lang="zh_HK">重啟生物特徵服務</description>
- <description xml:lang="uy">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش</description>
+ <description xml:lang="ug">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش</description>
+ <description xml:lang="kk">بىئولوگىيەلىك ەرەكشەلىك قىزىمەتتى قايتادان قوزعالتۋ</description>
+ <description xml:lang="ky">بىئولوگىيەلىك ۅزگۅچۅلۉك مۇلازىمەتىردى قايتادان قوزعوتۇۇ</description>
<message xml:lang="zh_CN">重启生物特征服务需要身份验证</message>
<message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་ཞབས་ཞུ་སླར་གསོ་བྱེད་པར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message>
<message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠰᠢᠨᠵᠢ ᠲᠡᠮᠳᠡᠭ ᠦᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠰᠡᠩᠬᠡᠷᠡᠭᠦᠯᠬᠦ ᠳᠦ ᠪᠡᠶ᠎ᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠢ ᠰᠢᠯᠭᠠᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨ᠎ᠠ </message>
- <message xml:lang="uy">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش ئۈچۈن دەلىللەش كېرەك </message>
+ <message xml:lang="ug">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش ئۈچۈن دەلىللەش كېرەك </message>
<message xml:lang="zh_HK">重啟生物特徵服務需要身份驗證</message>
+ <message xml:lang="kk">بىئولوگىيەلىك ەرەكشەلىك قىزىمەتتى قايتادان قوزعالتۋ ٷشٸن دالەلدەۋ كەرەك بىئولوگىيەلىك پارىقتاندىرۋ اسبابٸن قوزعالتۋ مەڭگەرۋ ەتۋ اسپاپتى جۇرگىزۋ</message>
+ <message xml:lang="ky">بىئولوگىيەلىك ۅزگۅچۅلۉك مۇلازىمەتىردى قايتادان قوزعوتۇۇ ۉچۉن دالىلدۅ كەرەك بىئولوگىيەلىك ايىرمالاندىرىش جابدۇۇسۇن قوزعوتۇۇ تىزگىندۅۅ جاسوو ،اتقارۇۇ</message>
<icon_name>stock_person</icon_name>
<defaults>
<allow_any>auth_admin</allow_any>
diff --git a/polkit-agent/CMakeLists.txt b/polkit-agent/CMakeLists.txt
index cb8e3e9..2f97cad 100644
--- a/polkit-agent/CMakeLists.txt
+++ b/polkit-agent/CMakeLists.txt
@@ -3,7 +3,8 @@ project(ukui-polkit-agent)
pkg_check_modules(QGS REQUIRED gsettings-qt)
pkg_check_modules(KDKINFO REQUIRED kysdk-sysinfo)
-pkg_check_modules(KYSDKWAYLANDHELPER_PKG REQUIRED kysdk-waylandhelper)
+pkg_check_modules(KDKWIDGETS REQUIRED kysdk-qtwidgets)
+pkg_check_modules(KYSDKWAYLANDHELPER REQUIRED kysdk-waylandhelper)
find_package(PolkitQt5-1 REQUIRED 0.103.0)
find_package(Qt5 COMPONENTS Core Widgets DBus X11Extras Xml Network Svg)
@@ -23,16 +24,22 @@ configure_file(
include_directories(
${QGS_INCLUDE_DIRS}
${KDKINFO_INCLUDE_DIRS}
+ ${KDKWIDGETS_INCLUDE_DIRS}
+ ${KYSDKWAYLANDHELPER_INCLUDE_DIRS}
)
link_directories(
${KDKINFO_LIBRARY_DIRS}
+ ${KDKWIDGETS_LIBRARY_DIRS}
+ ${KYSDKWAYLANDHELPER_LIBRARY_DIRS}
)
set(EXTRA_LIBS
${EXTRA_LIBS}
${QGS_LIBRARIES}
${KDKINFO_LIBRARIES}
+ ${KDKWIDGETS_LIBRARIES}
+ ${KYSDKWAYLANDHELPER_LIBRARIES}
)
include_directories(
@@ -58,17 +65,20 @@ set(polkit_SRCS
src/modeButton.cpp
src/kalabel.cpp
../common/generic.cpp
+ src/fullscreenbackground.h
+ src/fullscreenbackground.cpp
+ src/usdblockshortcut.h
+ src/usdblockshortcut.cpp
)
add_executable(polkit-ukui-authentication-agent-1 ${polkit_SRCS})
-target_include_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_INCLUDE_DIRS})
-target_link_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_LIBRARY_DIRS})
+target_include_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKQTWIDGETS_PKG_INCLUDE_DIRS})
+target_link_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKQTWIDGETS_PKG_LIBRARY_DIRS})
target_link_libraries(polkit-ukui-authentication-agent-1
- Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS}
+ Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} KF5::WindowSystem
${POLKITQT-1_LIBRARIES}
- ${KYSDKWAYLANDHELPER_PKG_LIBRARIES}
+ ${KYSDKQTWIDGETS_PKG_LIBRARIES}
BioAuthWidgets
- KF5::WindowSystem
-lrt
-lukui-log4qt
)
diff --git a/polkit-agent/assets.qrc b/polkit-agent/assets.qrc
index 6fc96aa..2581d94 100644
--- a/polkit-agent/assets.qrc
+++ b/polkit-agent/assets.qrc
@@ -4,6 +4,53 @@
<file>assets/arrow_right.svg</file>
<file>assets/hide-password.png</file>
<file>assets/show-password.png</file>
+ <file>assets/biowaiting/fingerprint0.svg</file>
+ <file>assets/biowaiting/fingerprint1.svg</file>
+ <file>assets/biowaiting/fingerprint2.svg</file>
+ <file>assets/biowaiting/fingerprint3.svg</file>
+ <file>assets/biowaiting/fingerprint4.svg</file>
+ <file>assets/biowaiting/fingerprint5.svg</file>
+ <file>assets/biowaiting/fingerprint6.svg</file>
+ <file>assets/biowaiting/fingerprint7.svg</file>
+ <file>assets/biowaiting/fingerprint8.svg</file>
+ <file>assets/biowaiting/fingerprint9.svg</file>
+ <file>assets/biowaiting/fingerprint10.svg</file>
+ <file>assets/biowaiting/fingerprint11.svg</file>
+ <file>assets/biowaiting/fingerprint12.svg</file>
+ <file>assets/biowaiting/fingerprint13.svg</file>
+ <file>assets/biowaiting/fingerprint14.svg</file>
+ <file>assets/biowaiting/fingervein0.svg</file>
+ <file>assets/biowaiting/fingervein1.svg</file>
+ <file>assets/biowaiting/fingervein2.svg</file>
+ <file>assets/biowaiting/fingervein3.svg</file>
+ <file>assets/biowaiting/fingervein4.svg</file>
+ <file>assets/biowaiting/fingervein5.svg</file>
+ <file>assets/biowaiting/fingervein6.svg</file>
+ <file>assets/biowaiting/fingervein7.svg</file>
+ <file>assets/biowaiting/fingervein8.svg</file>
+ <file>assets/biowaiting/fingervein9.svg</file>
+ <file>assets/biowaiting/fingervein10.svg</file>
+ <file>assets/biowaiting/fingervein11.svg</file>
+ <file>assets/biowaiting/iris0.svg</file>
+ <file>assets/biowaiting/iris1.svg</file>
+ <file>assets/biowaiting/iris2.svg</file>
+ <file>assets/biowaiting/iris3.svg</file>
+ <file>assets/biowaiting/iris4.svg</file>
+ <file>assets/biowaiting/iris5.svg</file>
+ <file>assets/biowaiting/iris6.svg</file>
+ <file>assets/biowaiting/iris7.svg</file>
+ <file>assets/biowaiting/iris8.svg</file>
+ <file>assets/biowaiting/iris9.svg</file>
+ <file>assets/biowaiting/iris10.svg</file>
+ <file>assets/biowaiting/iris11.svg</file>
+ <file>assets/biowaiting/voiceprint0.svg</file>
+ <file>assets/biowaiting/voiceprint1.svg</file>
+ <file>assets/biowaiting/voiceprint2.svg</file>
+ <file>assets/biowaiting/voiceprint3.svg</file>
+ <file>assets/biowaiting/voiceprint4.svg</file>
+ <file>assets/biowaiting/voiceprint5.svg</file>
+ <file>assets/biowaiting/voiceprint6.svg</file>
+ <file>assets/biowaiting/voiceprint7.svg</file>
</qresource>
<qresource prefix="/qss">
<file>src/main.qss</file>
diff --git a/polkit-agent/assets/biowaiting/fingerprint0.svg b/polkit-agent/assets/biowaiting/fingerprint0.svg
new file mode 100644
index 0000000..a5e84bd
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint0.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint1.svg b/polkit-agent/assets/biowaiting/fingerprint1.svg
new file mode 100644
index 0000000..0856372
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint1.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176A76.03029,76.03029,0,0,1,102.56085,12h15.351a96.77876,96.77876,0,0,0-15.782-6.724A45.00584,45.00584,0,0,0,91.80237,3.09192Z"/><path class="cls-2" d="M41.63989,12H57.42126A75.41744,75.41744,0,0,1,78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2a77.85348,77.85348,0,0,0-36.29651,9.67188C42.01575,11.77832,41.83093,11.89227,41.63989,12Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint10.svg b/polkit-agent/assets/biowaiting/fingerprint10.svg
new file mode 100644
index 0000000..315aaf0
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint10.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M33.93249,119a74.46006,74.46006,0,0,0,.45343-27.4751c-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948A66.87594,66.87594,0,0,1,27.47662,119Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M58.79314,85.75293h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112A94.35,94.35,0,0,1,53.06023,119h6.25434c.03076-.218.07361-.43164.10266-.65039A108.40174,108.40174,0,0,0,58.79314,85.75293Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561A109.31694,109.31694,0,0,1,65.899,119h6.11938A120.607,120.607,0,0,0,71.15051,82.94727Z"/><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M54.56774,19.78174a3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881-2.03235-13.102-7.19562-24.64307-16.11261-34.31275C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333A64.56588,64.56588,0,0,0,54.56774,19.78174Z"/><path class="cls-2" d="M14.82623,119h6.68389c2.45581-7.93066,1.976-16.22021.82789-24.51172-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A59.14042,59.14042,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437C15.45483,116.90015,15.14068,118.00366,14.82623,119Z"/><path class="cls-2" d="M84.93749,119a109.15166,109.15166,0,0,0,.76349-14.84424,75.85951,75.85951,0,0,0-.46789-9.98364,114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732A115.89424,115.89424,0,0,1,78.6997,119Z"/><path class="cls-2" d="M147.49975,118.03955c0-3.4314.46789-7.01929.3117-10.29517a31.74131,31.74131,0,0,0,0-5.4602v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589A5.85688,5.85688,0,0,0,141.352,119h6.049A4.8957,4.8957,0,0,0,147.49975,118.03955Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M135.09362,119c.28638-3.91992.42383-7.71533.35822-11.25562a217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051A167.89466,167.89466,0,0,1,128.7799,119Z"/><path class="cls-2" d="M97.59063,118.1958a3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737c-.067.4773-.1413.9524-.21179,1.42847H97.481C97.51641,118.73145,97.55682,118.46533,97.59063,118.1958Z"/><path class="cls-2" d="M122.5595,119c.38214-4.52686.58307-9.10278.53247-13.75a159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853A153.35944,153.35944,0,0,1,116.25793,119Z"/><path class="cls-2" d="M103.689,119h6.40527q.62714-6.47863.638-12.96948A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint11.svg b/polkit-agent/assets/biowaiting/fingerprint11.svg
new file mode 100644
index 0000000..73ab76d
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint11.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M30.34148,130c5.40314-12.1875,6.08313-25.26245,4.04444-38.4751-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948.623,10.74194-.77826,21.1748-5.60871,30.83105Z"/><path class="cls-2" d="M45.02288,125.83545a3.02982,3.02982,0,0,0-2.03229-3.89795,3.19793,3.19793,0,0,0-3.91137,2.18408c-.3125.78028-.4679,1.71607-.78254,2.49561-.38446,1.1499-.79632,2.27343-1.22418,3.38281h6.6789C44.223,128.62256,44.65173,127.23486,45.02288,125.83545Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M29.84612,48.63428A58.71554,58.71554,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437-.4679,1.55981-.93811,3.27514-1.40827,4.52319a3.12376,3.12376,0,0,0,3.12885,3.43017c1.87695,0,2.65869-1.092,3.285-2.6521,3.285-8.57763,2.81714-17.623,1.56446-26.66943-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A58.80522,58.80522,0,0,1,29.84612,48.63428Z"/><path class="cls-2" d="M147.81145,102.28418v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589,0,2.3396,1.09424,3.58789,2.971,3.7439,1.87841,0,3.28729-1.24829,3.28729-3.58838,0-3.4314.46789-7.01929.3117-10.29517A31.74131,31.74131,0,0,0,147.81145,102.28418Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M128.88177,36.469C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333a64.56588,64.56588,0,0,0-25.34363,5.14844,3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67969,137.79876,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M50.46655,130h6.53192a82.66267,82.66267,0,0,0,2.41876-11.65039,108.40174,108.40174,0,0,0-.62409-32.59668h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112,84.89,84.89,0,0,1-1.87677,19.1836C51.74847,125.60254,51.14989,127.81641,50.46655,130Z"/><path class="cls-2" d="M133.93694,130a150.35686,150.35686,0,0,0,1.5149-22.25562,217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051A167.37135,167.37135,0,0,1,127.584,130Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M121.23455,130a148.83457,148.83457,0,0,0,1.85742-24.75,159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853A153.35038,153.35038,0,0,1,114.87652,130Z"/><path class="cls-2" d="M97.59063,118.1958a3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737Q90.451,123.85461,89.13329,130h6.44983C96.39861,126.1377,97.08685,122.2124,97.59063,118.1958Z"/><path class="cls-2" d="M85.701,104.15576a75.85951,75.85951,0,0,0-.46789-9.98364,114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732A107.19115,107.19115,0,0,1,76.62749,130h6.4181A109.166,109.166,0,0,0,85.701,104.15576Z"/><path class="cls-2" d="M102.09509,130h6.49407a137.10134,137.10134,0,0,0,2.14307-23.96948A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139C103.32018,122.68433,102.7738,126.356,102.09509,130Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561A103.2327,103.2327,0,0,1,63.66741,130h6.28925C73.633,114.80322,73.87145,99.12134,71.15051,82.94727Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint12.svg b/polkit-agent/assets/biowaiting/fingerprint12.svg
new file mode 100644
index 0000000..2b0c41e
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint12.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M14.35967,120.37964a3.12376,3.12376,0,0,0,3.12885,3.43017c1.87695,0,2.65869-1.092,3.285-2.6521,3.285-8.57763,2.81714-17.623,1.56446-26.66943-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A59.14042,59.14042,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437C15.3,117.41626,14.82983,119.13159,14.35967,120.37964Z"/><path class="cls-2" d="M49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948.624,10.75952-.78174,21.20874-5.63123,30.87841a3.0328,3.0328,0,0,0-.47015,2.02759,2.85307,2.85307,0,0,0,2.65863,2.6521,3.38147,3.38147,0,0,0,3.44275-2.02783c6.57-12.9458,7.51019-26.9812,5.32019-41.17432-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M147.81145,102.28418v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589,0,2.3396,1.09424,3.58789,2.971,3.7439,1.87841,0,3.28729-1.24829,3.28729-3.58838,0-3.4314.46789-7.01929.3117-10.29517A31.74131,31.74131,0,0,0,147.81145,102.28418Z"/><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M129.34966,138.7832c2.03522.31177,3.44348-.78027,3.755-3.11963a162.6075,162.6075,0,0,0,2.34717-27.91919,217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051a167.16955,167.16955,0,0,1-2.34692,33.0647C126.53539,137.06714,127.47118,138.4707,129.34966,138.7832Z"/><path class="cls-2" d="M128.88177,36.469C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333a64.56588,64.56588,0,0,0-25.34363,5.14844,3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67969,137.79876,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M119.35662,140a154.2285,154.2285,0,0,0,3.73535-34.75,159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853A154.445,154.445,0,0,1,112.9295,140Z"/><path class="cls-2" d="M99.86944,140h6.57776a139.82764,139.82764,0,0,0,4.285-33.96948A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139A139.47424,139.47424,0,0,1,99.86944,140Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M45.02288,125.83545a3.02982,3.02982,0,0,0-2.03229-3.89795,3.19793,3.19793,0,0,0-3.91137,2.18408c-.3125.78028-.4679,1.71607-.78254,2.49561a101.972,101.972,0,0,1-5.00714,12.01A4.05833,4.05833,0,0,0,32.93041,140h6.62073A78.5383,78.5383,0,0,0,45.02288,125.83545Z"/><path class="cls-2" d="M93.21142,139.87744a161.52283,161.52283,0,0,0,4.37921-21.68164,3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737A161.54006,161.54006,0,0,1,86.62359,140h6.55493C93.18865,139.95874,93.20135,139.919,93.21142,139.87744Z"/><path class="cls-2" d="M59.41723,118.34961a108.40174,108.40174,0,0,0-.62409-32.59668h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112,84.89,84.89,0,0,1-1.87677,19.1836A80.92519,80.92519,0,0,1,46.636,140h6.86078A85.938,85.938,0,0,0,59.41723,118.34961Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561a100.7663,100.7663,0,0,1-4.69312,39.77Q61.168,137.93139,60.36217,140H67.022C73.40533,121.70972,74.47247,102.69385,71.15051,82.94727Z"/><path class="cls-2" d="M85.23309,94.17212a114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732,106.72018,106.72018,0,0,1-2.97253,31.50488c-.4679,2.02759.31176,3.7439,2.03442,4.21167,1.87695.468,3.44141-.624,4.06775-2.80811a109.18045,109.18045,0,0,0,3.12866-27.917A75.85951,75.85951,0,0,0,85.23309,94.17212Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint13.svg b/polkit-agent/assets/biowaiting/fingerprint13.svg
new file mode 100644
index 0000000..9f37f06
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint13.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M25.623,134.72705a3.38147,3.38147,0,0,0,3.44275-2.02783c6.57-12.9458,7.51019-26.9812,5.32019-41.17432-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948.624,10.75952-.78174,21.20874-5.63123,30.87841a3.0328,3.0328,0,0,0-.47015,2.02759A2.85307,2.85307,0,0,0,25.623,134.72705Z"/><path class="cls-2" d="M113.70556,149.38867a3.12978,3.12978,0,0,0,4.06695-2.65185A158.74374,158.74374,0,0,0,123.092,105.25a159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853a155.41963,155.41963,0,0,1-5.00794,47.2583C111.20245,147.20483,111.98266,149.07715,113.70556,149.38867Z"/><path class="cls-2" d="M35.95037,143.30688c1.40826.156,2.34631-.77954,2.97266-2.02783a81.2963,81.2963,0,0,0,6.09985-15.4436,3.02982,3.02982,0,0,0-2.03229-3.89795,3.19793,3.19793,0,0,0-3.91137,2.18408c-.3125.78028-.4679,1.71607-.78254,2.49561a101.972,101.972,0,0,1-5.00714,12.01C32.1953,140.96729,33.445,143.30688,35.95037,143.30688Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M14.35967,120.37964a3.12376,3.12376,0,0,0,3.12885,3.43017c1.87695,0,2.65869-1.092,3.285-2.6521,3.285-8.57763,2.81714-17.623,1.56446-26.66943-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A59.14042,59.14042,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437C15.3,117.41626,14.82983,119.13159,14.35967,120.37964Z"/><path class="cls-2" d="M147.81145,102.28418v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589,0,2.3396,1.09424,3.58789,2.971,3.7439,1.87841,0,3.28729-1.24829,3.28729-3.58838,0-3.4314.46789-7.01929.3117-10.29517A31.74131,31.74131,0,0,0,147.81145,102.28418Z"/><path class="cls-2" d="M129.34966,138.7832c2.03522.31177,3.44348-.78027,3.755-3.11963a162.6075,162.6075,0,0,0,2.34717-27.91919,217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051a167.16955,167.16955,0,0,1-2.34692,33.0647C126.53539,137.06714,127.47118,138.4707,129.34966,138.7832Z"/><path class="cls-2" d="M128.88177,36.469C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333a64.56588,64.56588,0,0,0-25.34363,5.14844,3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67969,137.79876,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M78.50457,145.02075a3.22325,3.22325,0,0,0-1.72266-4.21167,3.00909,3.00909,0,0,0-4.06695,1.87158L69.7127,150h6.85645Q77.59344,147.53321,78.50457,145.02075Z"/><path class="cls-2" d="M93.21142,139.87744a161.52283,161.52283,0,0,0,4.37921-21.68164,3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737,161.03368,161.03368,0,0,1-4.84949,22.928C85.57519,143.666,84.5014,146.833,83.38421,150h6.7409A104.796,104.796,0,0,0,93.21142,139.87744Z"/><path class="cls-2" d="M110.73223,106.03052A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139A148.68041,148.68041,0,0,1,96.95287,150H103.59A142.91971,142.91971,0,0,0,110.73223,106.03052Z"/><path class="cls-2" d="M85.23309,94.17212a114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732,106.72018,106.72018,0,0,1-2.97253,31.50488c-.4679,2.02759.31176,3.7439,2.03442,4.21167,1.87695.468,3.44141-.624,4.06775-2.80811a109.18045,109.18045,0,0,0,3.12866-27.917A75.85951,75.85951,0,0,0,85.23309,94.17212Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M49.71832,148.14062a90.13545,90.13545,0,0,0,9.69891-29.791,108.40174,108.40174,0,0,0-.62409-32.59668h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112,84.89,84.89,0,0,1-1.87677,19.1836,87.66422,87.66422,0,0,1-7.822,21.36718,4.07726,4.07726,0,0,0-.78272,2.65186A2.99783,2.99783,0,0,0,45.91943,150h1.58313A3.59038,3.59038,0,0,0,49.71832,148.14062Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561a100.7663,100.7663,0,0,1-4.69312,39.77A111.03121,111.03121,0,0,1,55.976,149.85645c-.027.04711-.046.09594-.07068.14355h7.03808C72.84978,128.6665,75.08245,106.31982,71.15051,82.94727Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint14.svg b/polkit-agent/assets/biowaiting/fingerprint14.svg
new file mode 100644
index 0000000..c3c6675
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint14.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}</style></defs><g id="文字标注"><path class="cls-1" d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint2.svg b/polkit-agent/assets/biowaiting/fingerprint2.svg
new file mode 100644
index 0000000..ce0a21b
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint2.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M54.56775,19.78162A4.3956,4.3956,0,0,0,54.14148,20H106.447a67.23276,67.23276,0,0,0-26.53558-5.3667A64.57,64.57,0,0,0,54.56775,19.78162Z"/><path class="cls-2" d="M78.50458,2a77.85348,77.85348,0,0,0-36.29651,9.67188A78.8284,78.8284,0,0,0,29.98193,20H40.88556C51.89252,12.71936,64.44763,8.82861,78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2Z"/><path class="cls-2" d="M91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176A71.20917,71.20917,0,0,1,119.1936,20h10.78968a87.41029,87.41029,0,0,0-27.8534-14.724A45.00584,45.00584,0,0,0,91.80237,3.09192Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint3.svg b/polkit-agent/assets/biowaiting/fingerprint3.svg
new file mode 100644
index 0000000..3ff19ba
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint3.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M42.51965,26.32928C40.848,27.471,39.24213,28.70074,37.69611,30h9.79473a2.9788,2.9788,0,0,0,.19306-2.4234C46.90118,25.3927,44.71039,24.92487,42.51965,26.32928Z"/><path class="cls-2" d="M92.89679,28.82489a45.9554,45.9554,0,0,0-13.1416-1.55981,34.70686,34.70686,0,0,0-9.69892.93573A58.17287,58.17287,0,0,0,62.98737,30H94.66962A3.4225,3.4225,0,0,0,92.89679,28.82489Z"/><path class="cls-2" d="M78.50458,2a77.85348,77.85348,0,0,0-36.29651,9.67188A76.9855,76.9855,0,0,0,20.00146,30h8.79C42.41681,16.25873,58.94067,8.99628,78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2Z"/><path class="cls-2" d="M79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.23308,3.23308,0,0,0-2.03461,4.20953,3.15929,3.15929,0,0,0,4.38153,1.56A60.10983,60.10983,0,0,1,85.54486,21.183,57.00643,57.00643,0,0,1,111.48492,30h10.78821C110.467,19.8385,96.29218,14.7641,79.91138,14.6333Z"/><path class="cls-2" d="M102.12988,5.276A45.00584,45.00584,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176A70.54954,70.54954,0,0,1,131.26257,30H140.16Q126.19251,13.19439,102.12988,5.276Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint4.svg b/polkit-agent/assets/biowaiting/fingerprint4.svg
new file mode 100644
index 0000000..c3c80d4
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint4.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M105.571,33.661a3.00191,3.00191,0,0,0-4.22515,1.09192c-.93885,1.55981-.46869,3.276,1.25189,4.368a3.91989,3.91989,0,0,0,1.09424.62421c.136.08294.26544.17114.40039.25494h10.69751A44.31528,44.31528,0,0,0,105.571,33.661Z"/><path class="cls-2" d="M46.11945,31.47687A3.29681,3.29681,0,0,0,47.6839,27.5766c-.78272-2.1839-2.97351-2.65173-5.16425-1.24732A60.84768,60.84768,0,0,0,29.37823,38.49677c-.4038.49646-.78784,1.00042-1.17486,1.50323H36.4093A62.09994,62.09994,0,0,1,46.11945,31.47687Z"/><path class="cls-2" d="M78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2A77.81365,77.81365,0,0,0,12.93646,40h7.531a67.905,67.905,0,0,1,6.72-8.367C41.11157,16.81946,58.16449,9.0199,78.663,8.39581Z"/><path class="cls-2" d="M102.12988,5.276A45.00584,45.00584,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72949,70.72949,0,0,1,40.36347,22.457A73.76489,73.76489,0,0,1,139.47937,40h7.6394Q132.85458,15.39228,102.12988,5.276Z"/><path class="cls-2" d="M72.69672,40H87.29114c-1.08441-.17377-2.18378-.319-3.31073-.41132A44.76672,44.76672,0,0,0,72.69672,40Z"/><path class="cls-2" d="M128.88177,36.46906C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.23308,3.23308,0,0,0-2.03461,4.20953,3.15929,3.15929,0,0,0,4.38153,1.56A60.10983,60.10983,0,0,1,85.54486,21.183a57.79889,57.79889,0,0,1,35.04474,15.91c.99469.94659,1.9361,1.9198,2.84985,2.90692h8.46192Q130.46828,38.19624,128.88177,36.46906Z"/><path class="cls-2" d="M92.89679,28.82489a45.9554,45.9554,0,0,0-13.1416-1.55981,34.70686,34.70686,0,0,0-9.69892.93573A51.56847,51.56847,0,0,0,45.14117,40H55.8147a46.03094,46.03094,0,0,1,22.21991-6.49542,44.314,44.314,0,0,1,12.82983,1.24829,3.86144,3.86144,0,0,0,1.87677.15613,2.8594,2.8594,0,0,0,2.5025-2.80811A3.0393,3.0393,0,0,0,92.89679,28.82489Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint5.svg b/polkit-agent/assets/biowaiting/fingerprint5.svg
new file mode 100644
index 0000000..fdec768
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint5.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M52.70563,50H63.65228a33.76275,33.76275,0,0,1,22.83063-3.706A37.323,37.323,0,0,1,96.63849,50H107.6944a38.44086,38.44086,0,0,0-23.714-10.41138C71.70941,38.53613,61.22681,42.05127,52.70563,50Z"/><path class="cls-2" d="M15.61237,48.32043v.00232A67.882,67.882,0,0,1,27.18744,31.63306C41.11157,16.81946,58.16449,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50458,2A77.94379,77.94379,0,0,0,10.13446,45.04443a5.77132,5.77132,0,0,0-.624,2.18409A2.7058,2.7058,0,0,0,11.01868,50h3.1997A3.89256,3.89256,0,0,0,15.61237,48.32043Z"/><path class="cls-2" d="M29.84613,48.63428A58.71554,58.71554,0,0,1,46.11945,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78272-2.184-2.97351-2.65186-5.16425-1.24731A60.84289,60.84289,0,0,0,29.37823,38.49683,66.78172,66.78172,0,0,0,21.813,50H29.0545C29.31915,49.54492,29.56952,49.085,29.84613,48.63428Z"/><path class="cls-2" d="M92.89679,28.825a45.94691,45.94691,0,0,0-13.1416-1.55981,34.70234,34.70234,0,0,0-9.69892.93567A51.16784,51.16784,0,0,0,36.27124,50h7.79443a49.27766,49.27766,0,0,1,5.809-5.73364,45.38883,45.38883,0,0,1,28.16-10.76172,44.30568,44.30568,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85935,2.85935,0,0,0,2.5025-2.80811A3.03909,3.03909,0,0,0,92.89679,28.825Z"/><path class="cls-2" d="M102.12988,5.276A45.009,45.009,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A70.09713,70.09713,0,0,1,145.11847,50h6.87982Q138.76745,17.33435,102.12988,5.276Z"/><path class="cls-2" d="M115.74017,40.83472A46.09864,46.09864,0,0,0,105.571,33.66089a3.0019,3.0019,0,0,0-4.22515,1.092c-.93885,1.55981-.46869,3.27588,1.25189,4.36792a3.92165,3.92165,0,0,0,1.09424.62427A50.65843,50.65843,0,0,1,115.91486,50h7.85681A54.40942,54.40942,0,0,0,115.74017,40.83472Z"/><path class="cls-2" d="M128.88177,36.469C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.1594,3.1594,0,0,0,4.38153,1.55994,60.1104,60.1104,0,0,1,28.63019-4.368A57.799,57.799,0,0,1,120.5896,37.093,60.2336,60.2336,0,0,1,130.93127,50h7.43866A61.47308,61.47308,0,0,0,128.88177,36.469Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint6.svg b/polkit-agent/assets/biowaiting/fingerprint6.svg
new file mode 100644
index 0000000..e682cb6
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint6.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M27.18744,31.63306C41.11157,16.81946,58.16449,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50458,2A77.94379,77.94379,0,0,0,10.13446,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.7244,2.7244,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.882,67.882,0,0,1,27.18744,31.63306Z"/><path class="cls-2" d="M79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.1594,3.1594,0,0,0,4.38153,1.55994,60.1104,60.1104,0,0,1,28.63019-4.368A57.799,57.799,0,0,1,120.5896,37.093,58.88274,58.88274,0,0,1,135.65485,60h6.82385a61.76983,61.76983,0,0,0-13.59693-23.531C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333Z"/><path class="cls-2" d="M89.76794,53.62427v.00219a28.1576,28.1576,0,0,0-18.92913-.15625c-2.66077.78052-3.44349,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624A22.13267,22.13267,0,0,1,88.68811,60H99.93243A28.63882,28.63882,0,0,0,89.76794,53.62427Z"/><path class="cls-2" d="M8.88391,55.81055c-1.72064-.46875-3.285.62329-3.91138,2.4956C4.81232,58.87061,4.67078,59.4353,4.52411,60H11.1134A3.28977,3.28977,0,0,0,8.88391,55.81055Z"/><path class="cls-2" d="M29.84613,48.63428A58.71554,58.71554,0,0,1,46.11945,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78272-2.184-2.97351-2.65186-5.16425-1.24731A60.84289,60.84289,0,0,0,29.37823,38.49683,64.50631,64.50631,0,0,0,17.69727,60h6.65606A62.03815,62.03815,0,0,1,29.84613,48.63428Z"/><path class="cls-2" d="M102.12988,5.276A45.009,45.009,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457,69.1805,69.1805,0,0,1,13.92413,22.61524Q148.0401,57.24658,148.83527,60h6.53057Q144.12574,19.09863,102.12988,5.276Z"/><path class="cls-2" d="M115.74017,40.83472A46.09864,46.09864,0,0,0,105.571,33.66089a3.0019,3.0019,0,0,0-4.22515,1.092c-.93885,1.55981-.46869,3.27588,1.25189,4.36792a3.92165,3.92165,0,0,0,1.09424.62427A46.95911,46.95911,0,0,1,122.37378,60h6.80768A52.617,52.617,0,0,0,115.74017,40.83472Z"/><path class="cls-2" d="M112.14038,58.9281c1.09424-1.40442.93884-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42993,38.34058,57.38257,43.489,48.15387,54.8717A41.09643,41.09643,0,0,0,44.60156,60h7.54022c7.67536-10.36462,21.2165-16.34607,34.34113-13.706a35.2907,35.2907,0,0,1,20.18243,11.85376,8.899,8.899,0,0,0,1.72,1.71618A2.60451,2.60451,0,0,0,108.74268,60h1.75146A3.53427,3.53427,0,0,0,112.14038,58.9281Z"/><path class="cls-2" d="M49.87463,44.26636a45.38883,45.38883,0,0,1,28.16-10.76172,44.30568,44.30568,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85935,2.85935,0,0,0,2.5025-2.80811A3.03909,3.03909,0,0,0,92.89679,28.825a45.94691,45.94691,0,0,0-13.1416-1.55981,34.70234,34.70234,0,0,0-9.69892.93567c-15.801,2.96423-27.8482,11.54431-36.14111,25.42346A52.36716,52.36716,0,0,0,30.74011,60h6.81983A45.95626,45.95626,0,0,1,49.87463,44.26636Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint7.svg b/polkit-agent/assets/biowaiting/fingerprint7.svg
new file mode 100644
index 0000000..b63d893
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint7.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M27.18744,31.63306C41.11157,16.81946,58.16449,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50458,2A77.94379,77.94379,0,0,0,10.13446,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.7244,2.7244,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.882,67.882,0,0,1,27.18744,31.63306Z"/><path class="cls-2" d="M21.24377,73.43372A59.1404,59.1404,0,0,1,46.11945,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78272-2.184-2.97351-2.65186-5.16425-1.24731A60.84289,60.84289,0,0,0,29.37823,38.49683,64.52222,64.52222,0,0,0,14.67145,78.26746c-.02362.579-.01044,1.15539-.00885,1.73254h6.21386A47.4584,47.4584,0,0,1,21.24377,73.43372Z"/><path class="cls-2" d="M11.07465,60.178a3.312,3.312,0,0,0-2.19074-4.36743c-1.72064-.46875-3.285.62329-3.91138,2.4956A79.36971,79.36971,0,0,0,2.0069,80H8.22131a70.73238,70.73238,0,0,1,2.85334-19.82446Z"/><path class="cls-2" d="M62.54608,60.79761a2.98066,2.98066,0,0,0-3.91138.93628A26.8757,26.8757,0,0,0,51.871,80h6.43A21.1615,21.1615,0,0,1,63.6424,65.63342a2.80487,2.80487,0,0,0,.62426-1.40368C64.42279,62.66992,64.11029,61.42163,62.54608,60.79761Z"/><path class="cls-2" d="M157.04248,67.03784Q147.65476,20.24817,102.12988,5.276A45.009,45.009,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457,69.1805,69.1805,0,0,1,13.92413,22.61524,74.06108,74.06108,0,0,1,4.694,23.2395A3.86858,3.86858,0,0,0,152.52161,80h4.71673a4.58878,4.58878,0,0,0,.74207-3.29248A41.3474,41.3474,0,0,0,157.04248,67.03784Z"/><path class="cls-2" d="M128.88177,36.469C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.1594,3.1594,0,0,0,4.38153,1.55994,60.1104,60.1104,0,0,1,28.63019-4.368A57.799,57.799,0,0,1,120.5896,37.093c10.32434,9.82519,16.268,21.83508,18.30566,36.0282.3183,2.29333.60431,4.58618.87134,6.87878h6.47894c-.36224-3.07288-.76367-6.14563-1.25116-9.21826C142.962,57.67981,137.79877,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M78.1908,64.5415c-7.60834.876-13.847,8.02832-13.59766,15.4585h6.20538a7.61429,7.61429,0,0,1,.352-2.66907,9.1107,9.1107,0,0,1,9.70124-6.55139c4.2229.15552,7.66638,3.27612,8.60217,7.95581.08295.42066.1535.84326.23212,1.26465h6.45031q-.13311-.86626-.26629-1.73254A15.95811,15.95811,0,0,0,78.1908,64.5415Z"/><path class="cls-2" d="M121.05963,78.26746A60.2951,60.2951,0,0,0,118.555,67.19324a3.10565,3.10565,0,0,0-3.91137-2.02771,2.97016,2.97016,0,0,0-2.03229,3.9A103.82461,103.82461,0,0,1,114.87317,80h6.44037C121.22894,79.42236,121.14935,78.844,121.05963,78.26746Z"/><path class="cls-2" d="M86.48291,46.294a35.2907,35.2907,0,0,1,20.18243,11.85376,8.899,8.899,0,0,0,1.72,1.71618,3.1924,3.1924,0,0,0,3.75507-.93579c1.09424-1.40442.93884-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42993,38.34058,57.38257,43.489,48.15387,54.8717A38.07922,38.07922,0,0,0,39.44556,80H45.8092a39.08563,39.08563,0,0,1,.62177-7.34668C50.03,55.02808,68.64819,42.70654,86.48291,46.294Z"/><path class="cls-2" d="M132.79315,73.12122c-2.03461-12.79175-7.51044-23.55115-17.053-32.2865A46.09864,46.09864,0,0,0,105.571,33.66089a3.0019,3.0019,0,0,0-4.22515,1.092c-.93885,1.55981-.46869,3.27588,1.25189,4.36792a3.92165,3.92165,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13659A103.2,103.2,0,0,1,127.62378,80H133.759C133.46936,77.69324,133.15253,75.40161,132.79315,73.12122Z"/><path class="cls-2" d="M108.07361,76.39514c-2.03461-11.07348-7.97833-18.87146-18.30567-22.77087v.00219a28.1576,28.1576,0,0,0-18.92913-.15625c-2.66077.78052-3.44349,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624a21.72724,21.72724,0,0,1,28.47247,16.84277c.23816,1.25378.45477,2.50757.66333,3.76123H108.678Q108.39414,78.19642,108.07361,76.39514Z"/><path class="cls-2" d="M92.89679,28.825a45.94691,45.94691,0,0,0-13.1416-1.55981,34.70234,34.70234,0,0,0-9.69892.93567c-15.801,2.96423-27.8482,11.54431-36.14111,25.42346A49.96274,49.96274,0,0,0,26.92523,80h6.24695a39.78137,39.78137,0,0,1,.11737-4.54065,45.82518,45.82518,0,0,1,16.58508-31.193,45.38883,45.38883,0,0,1,28.16-10.76172,44.30568,44.30568,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85935,2.85935,0,0,0,2.5025-2.80811A3.03909,3.03909,0,0,0,92.89679,28.825Z"/><path class="cls-2" d="M83.0423,79.5127a3.09175,3.09175,0,0,0-3.59961-2.49585A2.99226,2.99226,0,0,0,76.99078,80h6.15058C83.10565,79.83765,83.079,79.67505,83.0423,79.5127Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint8.svg b/polkit-agent/assets/biowaiting/fingerprint8.svg
new file mode 100644
index 0000000..a9023c0
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint8.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81946,58.16448,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M138.89526,73.12122q1.16922,8.42468,1.876,16.84375c.4679,1.87158,1.72058,3.11975,3.44123,3.11975a3.1886,3.1886,0,0,0,2.97265-3.43225V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67981,137.79876,46.13867,128.88177,36.469,115.89556,21.96338,99.46893,14.78943,79.91137,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.15941,3.15941,0,0,0,4.38154,1.55994,60.11034,60.11034,0,0,1,28.63018-4.368A57.799,57.799,0,0,1,120.58959,37.093C130.91393,46.91821,136.8576,58.9281,138.89526,73.12122Z"/><path class="cls-2" d="M92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.70227,34.70227,0,0,0-9.69891.93567C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.368,1.40808,8.57983,1.71985,12.948.01611.27758.025.554.03833.83105h6.19269q-.25169-4.22094-.91083-8.47522c-.78253-5.30383-1.565-10.76379-1.09638-16.06543a45.82519,45.82519,0,0,1,16.58509-31.193,45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825Z"/><path class="cls-2" d="M86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89847,8.89847,0,0,0,1.72,1.71618,3.19239,3.19239,0,0,0,3.75506-.93579c1.09424-1.40442.93885-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42992,38.34058,57.38256,43.489,48.15386,54.8717a38.57458,38.57458,0,0,0-8.29291,30.569A121.534,121.534,0,0,1,41.55645,100h6.37079q-.12268-3.84779-.55585-7.69556c-.47021-4.21179-1.87829-8.26745-1.56445-12.16772a39.31138,39.31138,0,0,1,.624-7.4834C50.03,55.02808,68.64819,42.70654,86.4829,46.294Z"/><path class="cls-2" d="M11.07464,60.17554V60.178A3.312,3.312,0,0,0,8.8839,55.81055c-1.72064-.46875-3.285.62329-3.91137,2.4956A79.56615,79.56615,0,0,0,2,80.45154a66.60613,66.60613,0,0,0,.31177,7.64319A80.489,80.489,0,0,0,4.508,100h6.60614A70.25859,70.25859,0,0,1,11.07464,60.17554Z"/><path class="cls-2" d="M58.79314,85.75293h-.00232c-1.25054-7.48547-.3117-14.19153,4.85157-20.11951a2.80487,2.80487,0,0,0,.62426-1.40368c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98064,2.98064,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19543-6.41388,22.77319A146.55217,146.55217,0,0,1,53.92071,100h6.34271A105.137,105.137,0,0,0,58.79314,85.75293Z"/><path class="cls-2" d="M95.87005,78.26746a15.95811,15.95811,0,0,0-17.67926-13.726c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561.09155,1.32031.15576,2.6366.20489,3.95093h6.08338a130.92316,130.92316,0,0,0-1.75061-17.05286v-.00232a11.40213,11.40213,0,0,1,0-5.61389,9.11068,9.11068,0,0,1,9.70123-6.55139c4.2229.15552,7.66638,3.27612,8.60217,7.95581A144.72222,144.72222,0,0,1,91.93957,100H98.3474c-.20983-3.1897-.38647-6.37939-.75445-9.56714C97.12273,86.3772,96.49639,82.3208,95.87005,78.26746Z"/><path class="cls-2" d="M121.05962,78.26746A60.29592,60.29592,0,0,0,118.555,67.19324a3.10566,3.10566,0,0,0-3.91138-2.02771,2.97017,2.97017,0,0,0-2.03229,3.9c2.5025,9.35962,3.44037,19.0271,4.067,28.85291.03375.69507.05664,1.38818.08105,2.08154h6.30756A167.10732,167.10732,0,0,0,121.05962,78.26746Z"/><path class="cls-2" d="M144.37029,99.322a3.09491,3.09491,0,0,0-1.71808.678h4.02131A3.14786,3.14786,0,0,0,144.37029,99.322Z"/><path class="cls-2" d="M157.04247,67.03784Q147.65475,20.24817,102.12988,5.276A45.0092,45.0092,0,0,0,91.80236,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02062,9.176c.62409.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.33948,1.8783,3.7439,4.06677,3.11987,1.56446-.46789,2.34711-1.71618,2.1908-4.21191A41.3474,41.3474,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M132.79314,73.12122c-2.0346-12.79175-7.51043-23.55115-17.053-32.2865A46.09888,46.09888,0,0,0,105.571,33.66089a3.00191,3.00191,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13659C127.95159,77.73022,128.796,88.85767,129.14,100h6.18017A214.67391,214.67391,0,0,0,132.79314,73.12122Z"/><path class="cls-2" d="M22.338,94.48828c-1.09424-7.019-2.03235-13.88354-1.09424-21.05456A59.14035,59.14035,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.184-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52217,64.52217,0,0,0,14.67144,78.26746c-.2995,7.34326,1.553,14.54065,2.11493,21.73254h6.19012C22.81164,98.16528,22.59258,96.3269,22.338,94.48828Z"/><path class="cls-2" d="M85.23309,94.17212a114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585,3.03675,3.03675,0,0,0-2.34619,3.90026,116.66963,116.66963,0,0,1,2.34619,18.2472c.01233.27868.01379.55713.02435.83569h6.19886C85.57342,98.13928,85.40807,96.18628,85.23309,94.17212Z"/><path class="cls-2" d="M108.0736,76.39514c-2.03461-11.07348-7.97833-18.87146-18.30566-22.77087v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624a21.72724,21.72724,0,0,1,28.47247,16.84277,163.59068,163.59068,0,0,1,2.34693,17.31372q.29818,3.2113.41839,6.44751h6.34656A168.52224,168.52224,0,0,0,108.0736,76.39514Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingerprint9.svg b/polkit-agent/assets/biowaiting/fingerprint9.svg
new file mode 100644
index 0000000..4c0be88
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingerprint9.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M62.54607,60.79761a2.98064,2.98064,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19543-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112q0,2.96339-.14044,5.8418h6.22674a106.70743,106.70743,0,0,0-1.39075-24.24707h-.00232c-1.25054-7.48547-.3117-14.19153,4.85157-20.11951a2.80487,2.80487,0,0,0,.62426-1.40368C64.42278,62.66992,64.11028,61.42163,62.54607,60.79761Z"/><path class="cls-2" d="M86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89847,8.89847,0,0,0,1.72,1.71618,3.19239,3.19239,0,0,0,3.75506-.93579c1.09424-1.40442.93885-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42992,38.34058,57.38256,43.489,48.15386,54.8717a38.57458,38.57458,0,0,0-8.29291,30.569c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,2.96252-.00678,5.92163-.16126,8.80566h6.32941a99.29774,99.29774,0,0,0-.37848-17.69556c-.47021-4.21179-1.87829-8.26745-1.56445-12.16772a39.31138,39.31138,0,0,1,.624-7.4834C50.03,55.02808,68.64819,42.70654,86.4829,46.294Z"/><path class="cls-2" d="M35.25219,110a81.58384,81.58384,0,0,0-.86627-18.47522c-.78253-5.30383-1.565-10.76379-1.09638-16.06543a45.82519,45.82519,0,0,1,16.58509-31.193,45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.70227,34.70227,0,0,0-9.69891.93567C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.368,1.40808,8.57983,1.71985,12.948A74.7003,74.7003,0,0,1,28.93688,110Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81946,58.16448,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M54.56774,19.78162a3.2331,3.2331,0,0,0-2.03461,4.20959,3.15941,3.15941,0,0,0,4.38154,1.55994,60.11034,60.11034,0,0,1,28.63018-4.368A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.83508,18.30567,36.0282q1.16922,8.42468,1.876,16.84375c.4679,1.87158,1.72058,3.11975,3.44123,3.11975a3.1886,3.1886,0,0,0,2.97265-3.43225V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67981,137.79876,46.13867,128.88177,36.469,115.89556,21.96338,99.46893,14.78943,79.91137,14.6333A64.57,64.57,0,0,0,54.56774,19.78162Z"/><path class="cls-2" d="M4.97253,58.30615A79.56615,79.56615,0,0,0,2,80.45154a66.60613,66.60613,0,0,0,.31177,7.64319A76.27443,76.27443,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M23.15173,110A74.91063,74.91063,0,0,0,22.338,94.48828c-1.09424-7.019-2.03235-13.88354-1.09424-21.05456A59.14035,59.14035,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.184-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52217,64.52217,0,0,0,14.67144,78.26746c-.31177,7.64343,1.72284,15.1289,2.19073,22.61462A59.2241,59.2241,0,0,1,16.90051,110Z"/><path class="cls-2" d="M147.83147,110c.01563-.76367.01514-1.51831-.02-2.25562a31.74131,31.74131,0,0,0,0-5.4602v.00244a3.08455,3.08455,0,0,0-3.44116-2.9646,3.01957,3.01957,0,0,0-2.81653,3.27612c.07532,2.49268.03876,4.94776-.0343,7.40186Z"/><path class="cls-2" d="M135.45751,110c.00281-.75769.008-1.51831-.00567-2.25562a217.74154,217.74154,0,0,0-2.6587-34.62316c-2.0346-12.79175-7.51043-23.55115-17.053-32.2865A46.09888,46.09888,0,0,0,105.571,33.66089a3.00191,3.00191,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13659,3.12885,11.38807,3.91077,23.08326,4.22308,34.78064q.11738,4.17.0279,8.33765Z"/><path class="cls-2" d="M71.15051,82.94714v-.00232a11.40213,11.40213,0,0,1,0-5.61389,9.11068,9.11068,0,0,1,9.70123-6.55139c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.276v-2.80823h.15631c-.3125-4.05542-.4679-8.11193-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.1654a15.95811,15.95811,0,0,0-17.67926-13.726c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561A115.64049,115.64049,0,0,1,66.75665,110h6.08563A125.08914,125.08914,0,0,0,71.15051,82.94714Z"/><path class="cls-2" d="M157.04247,67.03784Q147.65475,20.24817,102.12988,5.276A45.0092,45.0092,0,0,0,91.80236,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02062,9.176c.62409.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.33948,1.8783,3.7439,4.06677,3.11987,1.56446-.46789,2.34711-1.71618,2.1908-4.21191A41.3474,41.3474,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M85.63354,110c.07037-1.946.10138-3.89441.06744-5.84424a75.85951,75.85951,0,0,0-.46789-9.98364,114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585,3.03675,3.03675,0,0,0-2.34619,3.90026,116.66963,116.66963,0,0,1,2.34619,18.2472q.23969,5.425.00525,10.83569Z"/><path class="cls-2" d="M123.05425,110c.03546-1.5769.05506-3.1582.03772-4.75a159.07167,159.07167,0,0,0-2.03235-26.98254A60.29592,60.29592,0,0,0,118.555,67.19324a3.10566,3.10566,0,0,0-3.91138-2.02771,2.97017,2.97017,0,0,0-2.03229,3.9c2.5025,9.35962,3.44037,19.0271,4.067,28.85291q.29535,6.08184.11456,12.08154Z"/><path class="cls-2" d="M108.0736,76.39514c-2.03461-11.07348-7.97833-18.87146-18.30566-22.77087v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624a21.72724,21.72724,0,0,1,28.47247,16.84277,163.59068,163.59068,0,0,1,2.34693,17.31372,128.85744,128.85744,0,0,1,.42,16.44751h6.39728c.03955-1.323.06677-2.64624.06677-3.96948A167.06591,167.06591,0,0,0,108.0736,76.39514Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein0.svg b/polkit-agent/assets/biowaiting/fingervein0.svg
new file mode 100644
index 0000000..746aba7
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein0.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein1.svg b/polkit-agent/assets/biowaiting/fingervein1.svg
new file mode 100644
index 0000000..cda8446
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein1.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="27" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="16"/><rect class="cls-2" x="22" y="24" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein10.svg b/polkit-agent/assets/biowaiting/fingervein10.svg
new file mode 100644
index 0000000..ecc78f5
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein10.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="126" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="115"/><rect class="cls-2" x="22" y="123" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein11.svg b/polkit-agent/assets/biowaiting/fingervein11.svg
new file mode 100644
index 0000000..478d000
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein11.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="137" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="126"/><rect class="cls-2" x="22" y="134" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein2.svg b/polkit-agent/assets/biowaiting/fingervein2.svg
new file mode 100644
index 0000000..b04c496
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein2.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="38" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="27"/><rect class="cls-2" x="22" y="35" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein3.svg b/polkit-agent/assets/biowaiting/fingervein3.svg
new file mode 100644
index 0000000..7217db0
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein3.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="49" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="38"/><rect class="cls-2" x="22" y="46" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein4.svg b/polkit-agent/assets/biowaiting/fingervein4.svg
new file mode 100644
index 0000000..92d47ea
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein4.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="60" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="49"/><rect class="cls-2" x="22" y="57" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein5.svg b/polkit-agent/assets/biowaiting/fingervein5.svg
new file mode 100644
index 0000000..7f53c6c
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein5.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="71" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="60"/><rect class="cls-2" x="22" y="68" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein6.svg b/polkit-agent/assets/biowaiting/fingervein6.svg
new file mode 100644
index 0000000..4a6776e
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein6.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="82" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="71"/><rect class="cls-2" x="22" y="79" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein7.svg b/polkit-agent/assets/biowaiting/fingervein7.svg
new file mode 100644
index 0000000..f7adf46
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein7.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="93" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="82"/><rect class="cls-2" x="22" y="90" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein8.svg b/polkit-agent/assets/biowaiting/fingervein8.svg
new file mode 100644
index 0000000..1ea6843
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein8.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="104" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="93"/><rect class="cls-2" x="22" y="101" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/fingervein9.svg b/polkit-agent/assets/biowaiting/fingervein9.svg
new file mode 100644
index 0000000..6e00868
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/fingervein9.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="116" x2="80" y2="12" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="12" width="116" height="104"/><rect class="cls-2" x="22" y="112" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris0.svg b/polkit-agent/assets/biowaiting/iris0.svg
new file mode 100644
index 0000000..6fb8a60
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris0.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}</style></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris1.svg b/polkit-agent/assets/biowaiting/iris1.svg
new file mode 100644
index 0000000..052eefb
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris1.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="27" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="16"/><rect class="cls-1" x="22" y="24" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris10.svg b/polkit-agent/assets/biowaiting/iris10.svg
new file mode 100644
index 0000000..0df7826
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris10.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="126" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="115"/><rect class="cls-1" x="22" y="123" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris11.svg b/polkit-agent/assets/biowaiting/iris11.svg
new file mode 100644
index 0000000..8ab52bd
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris11.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="137" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="126"/><rect class="cls-1" x="22" y="134" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris2.svg b/polkit-agent/assets/biowaiting/iris2.svg
new file mode 100644
index 0000000..68c4479
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris2.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="38" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="27"/><rect class="cls-1" x="22" y="35" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris3.svg b/polkit-agent/assets/biowaiting/iris3.svg
new file mode 100644
index 0000000..b750b2e
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris3.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="49" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="38"/><rect class="cls-1" x="22" y="46" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris4.svg b/polkit-agent/assets/biowaiting/iris4.svg
new file mode 100644
index 0000000..141450c
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris4.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="60" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="49"/><rect class="cls-1" x="22" y="57" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris5.svg b/polkit-agent/assets/biowaiting/iris5.svg
new file mode 100644
index 0000000..e879021
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris5.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="71" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="60"/><rect class="cls-1" x="22" y="68" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris6.svg b/polkit-agent/assets/biowaiting/iris6.svg
new file mode 100644
index 0000000..f4e971d
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris6.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="82" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="71"/><rect class="cls-1" x="22" y="79" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris7.svg b/polkit-agent/assets/biowaiting/iris7.svg
new file mode 100644
index 0000000..9cf5557
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris7.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="93" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="82"/><rect class="cls-1" x="22" y="90" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris8.svg b/polkit-agent/assets/biowaiting/iris8.svg
new file mode 100644
index 0000000..551dddd
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris8.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="104" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="93"/><rect class="cls-1" x="22" y="101" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/iris9.svg b/polkit-agent/assets/biowaiting/iris9.svg
new file mode 100644
index 0000000..4304442
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/iris9.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="115" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="104"/><rect class="cls-1" x="22" y="112" width="116" height="4"/></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint0.svg b/polkit-agent/assets/biowaiting/voiceprint0.svg
new file mode 100644
index 0000000..73e5a92
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint0.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7562"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7562)"><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><g><rect x="63" y="70" width="8" height="20" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="70" width="8" height="20" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="50" width="8" height="60" rx="4" fill="#3790FA" fill-opacity="1"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint1.svg b/polkit-agent/assets/biowaiting/voiceprint1.svg
new file mode 100644
index 0000000..083798e
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint1.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7581"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7581)"><g><g><rect x="63" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="56" width="8" height="48" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint2.svg b/polkit-agent/assets/biowaiting/voiceprint2.svg
new file mode 100644
index 0000000..16883e1
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint2.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7619"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7619)"><g><g><rect x="63" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="62" width="8" height="36" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint3.svg b/polkit-agent/assets/biowaiting/voiceprint3.svg
new file mode 100644
index 0000000..509ceae
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint3.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7657"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7657)"><g><g><rect x="63" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="66" width="8" height="28" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint4.svg b/polkit-agent/assets/biowaiting/voiceprint4.svg
new file mode 100644
index 0000000..5208d79
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint4.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7695"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7695)"><g><g><rect x="63" y="64" width="8" height="32" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="64" width="8" height="32" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint5.svg b/polkit-agent/assets/biowaiting/voiceprint5.svg
new file mode 100644
index 0000000..19be4b0
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint5.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7676"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7676)"><g><g><rect x="63" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="66" width="8" height="28" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint6.svg b/polkit-agent/assets/biowaiting/voiceprint6.svg
new file mode 100644
index 0000000..9304c58
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint6.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7638"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7638)"><g><g><rect x="63" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="62" width="8" height="36" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/assets/biowaiting/voiceprint7.svg b/polkit-agent/assets/biowaiting/voiceprint7.svg
new file mode 100644
index 0000000..dc96601
--- /dev/null
+++ b/polkit-agent/assets/biowaiting/voiceprint7.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7600"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7600)"><g><g><rect x="63" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="56" width="8" height="48" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg>
\ No newline at end of file
diff --git a/polkit-agent/i18n_ts/bo.ts b/polkit-agent/i18n_ts/bo.ts
index 50e8ba8..bc85390 100644
--- a/polkit-agent/i18n_ts/bo.ts
+++ b/polkit-agent/i18n_ts/bo.ts
@@ -1,6 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
<context>
<name>MainWindow</name>
<message>
@@ -9,205 +18,210 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
- <source>Authentication</source>
+ <location filename="../src/mainwindow.cpp" line="85"/>
+ <source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
- <source>Insert the ukey into the USB port</source>
+ <location filename="../src/mainwindow.cpp" line="87"/>
+ <source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
- <source>Enter the ukey password</source>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
- <source>Failed to verify %1, you still have %2 verification opportunities</source>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
- <source>Please enter your password or enroll your fingerprint </source>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
- <source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
- <source>Password: </source>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
- <source>_Password: </source>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
- <source>_Password:</source>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
+ <source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
- <source>Account locked,</source>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <source>days left</source>
+ <location filename="../src/mainwindow.cpp" line="165"/>
+ <source>Please enter your password or enroll your fingerprint </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <source>hours left</source>
+ <location filename="../src/mainwindow.cpp" line="517"/>
+ <source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <source>minutes left</source>
+ <location filename="../src/mainwindow.cpp" line="522"/>
+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
- <source>seconds left</source>
+ <location filename="../src/mainwindow.cpp" line="582"/>
+ <source>Password: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
- <source>Password cannot be empty</source>
+ <location filename="../src/mainwindow.cpp" line="584"/>
+ <source>_Password: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
- <source>Input your password to authentication</source>
+ <location filename="../src/mainwindow.cpp" line="586"/>
+ <source>_Password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
- <source>Use password</source>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
+ <source>Account locked,</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
- <source>Please try again in %1 minutes.</source>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <source>days left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
- <source>Please try again in %1 seconds.</source>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <source>hours left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
- <source>Account locked permanently.</source>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <source>minutes left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="644"/>
+ <source>seconds left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
- <source>Verify face recognition or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
+ <source>Password cannot be empty</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
- <source>Press fingerprint or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
+ <source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
- <source>Verify voiceprint or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="876"/>
+ <source>Use password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
- <source>Verify finger vein or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
+ <source>Please try again in %1 minutes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
- <source>Verify iris or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
+ <source>Please try again in %1 seconds.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
- <source>Use the bound wechat scanning code or enter the password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
+ <source>Account locked permanently.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -215,17 +229,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation type="unfinished"></translation>
</message>
diff --git a/polkit-agent/i18n_ts/bo_CN.ts b/polkit-agent/i18n_ts/bo_CN.ts
index e0a54e7..deb149d 100644
--- a/polkit-agent/i18n_ts/bo_CN.ts
+++ b/polkit-agent/i18n_ts/bo_CN.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">དབང་བསྐུར།</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>དབང་བསྐུར།</translation>
+ <translation type="vanished">དབང་བསྐུར།</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>སྐྱེ་དངོས་དབྱེ་འབྱེད་བཀོལ་བ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>ཕྱིར་འཐེན།</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>དབང་བསྐུར་བ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>%1ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>ཁྱོད་ཀྱིས་དུས་ཚོད་སྐར་ཆ་གཅིག་གི་ནང་དུ་ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>དུས་གཏན་དུ་ཟྭ་བརྒྱབ་པའི་རྩིས་ཐོ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>གསང་གྲངས་སྟོང་པ་ཡིན་མི་སྲིད།</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། ཁྱེད་ཚོར་ད་དུང་%2ལ་ཞིབ་བཤེར་བྱེད་པའི་གོ་སྐབས་ཡོད།</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>གསང་གྲངས་ནི། </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས་ནང་འཇུག་བྱེད་པ། </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་བ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>ཐེངས་འདིའི་བཀོལ་སྤྱོད་ལ་དོ་དམ་པའི་དབང་ཆ་ཐོབ་ན་ད་གཟོད་མུ་མཐུད་དུ་ལག་བསྟར་བྱེད་ཐུབ།གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཐེངས་འདིའི་བཀོལ་སྤྱོད་བྱེད་ཆོག</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>གསང་གྲངས། </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>གསང་གྲངས།:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>བདེན་དཔང་ར་སྤྲོད་ལ་ཕམ་ཁ་བྱུང་བས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>གནམ་རྒྱབ་ཟྭ་འབྱེད།</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>%1ལ་ཞིབ་བཤེར་བྱེད་ཐབས་བྲལ་བ་དང་། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>གོ་རིམ་ཞིག་གིས་ཁྱད་དབང་དགོས་པའི་འགུལ་སྟངས་ཤིག་ལག་བསྟར་བྱེད་པར་ཚོད་ལྟ་བྱེད་བཞིན་ཡོད་པ་དང་།་འགུལ་སྟངས་འདི་ལག་བསྟར་བྱེད་པའི་དབང་ཆ་སྤྲོད་དགོས་པའི་རེ་བ་བཏོན།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>ནང་འཇུག་གི་གསང་གྲངས།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation>སྒོ་རྒྱག་པ་</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation>ཕམ་ཉེས་བྱུང་བ་རེད</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>དུས་ཚོད་འགའ་ལས་ལྷག་མེད</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>སྐར་མ་རྗེས་ནས་ཟྭ་ཕྱེ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>སྐར་ཆའི་རྗེས་ནས་ཟྭ་ཕྱེ་བ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་དབང་ཡོད།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
+ <translation type="vanished">དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
+ <translation type="vanished">མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
+ <translation type="vanished">སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation>
+ <translation type="vanished">ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
+ <translation type="vanished">འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation>
+ <translation type="vanished">སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>རྩིས་ཐོ་ཟྭ་བརྒྱབ་པ།</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>མཁོ་མཁན་གཞན་པ་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད།ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད།</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད།</translation>
</message>
diff --git a/polkit-agent/i18n_ts/de.ts b/polkit-agent/i18n_ts/de.ts
index 8521a6d..e17acdc 100644
--- a/polkit-agent/i18n_ts/de.ts
+++ b/polkit-agent/i18n_ts/de.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">Authentifizierung</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>Authentifizierung</translation>
+ <translation type="vanished">Authentifizierung</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>Biometrisch</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>Passwort verwenden</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>Beglaubigen</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>Passwort verwenden</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>Versuchen Sie es in %1 Minuten erneut.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>Bitte versuchen Sie es in %1 Sekunden erneut.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>Das Konto wurde dauerhaft gesperrt.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>Das Kennwort darf nicht leer sein.</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>%1 konnte nicht verifiziert werden, Sie haben immer noch %2 Überprüfungsmöglichkeiten</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>Passwort: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>Bitte geben Sie Ihr Passwort ein oder registrieren Sie Ihren Fingerabdruck </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>Ungewöhnliches Netzwerk</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>Für diesen Vorgang ist die Autorisierung des Administrators erforderlich. Bitte geben Sie Ihr Passwort ein, um diesen Vorgang zuzulassen.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>_Passwort: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>_Passwort:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>Authentifizierung fehlgeschlagen, bitte versuchen Sie es erneut.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>Verbleibende Tage</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>%1 konnte nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>%1 kann nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>Ein Programm versucht, eine Aktion auszuführen, für die Berechtigungen erforderlich sind. Zum Ausführen der Aktion ist eine Autorisierung erforderlich.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>Passwort eingeben</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>Verbleibende Stunden</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>Noch Minuten</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>Verbleibende Sekunden</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation>
+ <translation type="vanished">Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation>
+ <translation type="vanished">Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation>
+ <translation type="vanished">Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation>
+ <translation type="vanished">Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation>
+ <translation type="vanished">Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation>
+ <translation type="vanished">Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>Konto gesperrt,</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>Ein anderer Client authentifiziert sich bereits, bitte versuchen Sie es später noch einmal.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>Authentifizierungsfehler, bitte versuchen Sie es erneut.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>Fehler bei der Passworteingabe!</translation>
</message>
diff --git a/polkit-agent/i18n_ts/es.ts b/polkit-agent/i18n_ts/es.ts
index 133ff59..11060b3 100644
--- a/polkit-agent/i18n_ts/es.ts
+++ b/polkit-agent/i18n_ts/es.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">Autenticación</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>Autenticación</translation>
+ <translation type="vanished">Autenticación</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>Biométrico</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>Usar contraseña</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>Autentificar</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>Usar contraseña</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>Inténtelo de nuevo en %1 minutos.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>Inténtelo de nuevo en %1 segundos.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>Cuenta bloqueada permanentemente.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>La contraseña no puede estar vacía</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>No se pudo verificar %1, todavía tiene %2 oportunidades de verificación</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>Contraseña: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>Ingrese su contraseña o registre su huella dactilar </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>Red anormal</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>Esta operación requiere la autorización del administrador. Introduzca su contraseña para permitir esta operación.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>_Contraseña: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>_Contraseña:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>Error de autenticación, inténtelo de nuevo.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>Días restantes</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>No se pudo verificar %1, ingrese la contraseña para desbloquear</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>No se puede verificar %1, ingrese la contraseña para desbloquear</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>Un programa está intentando realizar una acción que requiere privilegios. Requiere autorización para realizar la acción.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>Contraseña de entrada</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>horas restantes</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>Quedan minutos</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>segundos restantes</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation>
+ <translation type="vanished">Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>Presione la huella dactilar o ingrese la contraseña para desbloquear</translation>
+ <translation type="vanished">Presione la huella dactilar o ingrese la contraseña para desbloquear</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>Verifica la huella de voz o ingresa la contraseña para desbloquear</translation>
+ <translation type="vanished">Verifica la huella de voz o ingresa la contraseña para desbloquear</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation>
+ <translation type="vanished">Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>Verifique el iris o ingrese la contraseña para desbloquear</translation>
+ <translation type="vanished">Verifique el iris o ingrese la contraseña para desbloquear</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation>
+ <translation type="vanished">Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>Cuenta bloqueada,</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>Otro cliente ya se está autenticando, inténtelo de nuevo más tarde.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>Error de autenticación, inténtelo de nuevo.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>¡Error de entrada de contraseña!</translation>
</message>
diff --git a/polkit-agent/i18n_ts/fr.ts b/polkit-agent/i18n_ts/fr.ts
index 357fb71..f1c41cf 100644
--- a/polkit-agent/i18n_ts/fr.ts
+++ b/polkit-agent/i18n_ts/fr.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">Authentification</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>Authentification</translation>
+ <translation type="vanished">Authentification</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>Biométrique</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>Utiliser le mot de passe</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>Authentifier</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>Utiliser le mot de passe</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>Veuillez réessayer dans %1 minutes.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>Veuillez réessayer dans %1 secondes.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>Compte verrouillé définitivement.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>Le mot de passe ne peut pas être vide</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>Échec de la vérification %1, vous avez encore %2 possibilités de vérification</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>Mot de passe: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>Veuillez saisir votre mot de passe ou enregistrer votre empreinte digitale </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>Réseau anormal</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>Cette opération nécessite lautorisation de ladministrateur. Veuillez saisir votre mot de passe pour autoriser cette opération.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>_Mot de passe: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>_Mot de passe:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>Lauthentification a échoué, veuillez réessayer.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>jours restants</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>Un programme tente deffectuer une action qui nécessite des privilèges. Il nécessite une autorisation pour effectuer laction.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>Mot de passe dentrée</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>Heures restantes</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>minutes restantes</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>secondes restantes</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation>
+ <translation type="vanished">Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>Appuyez sur lempreinte digitale ou entrez le mot de passe pour déverrouiller</translation>
+ <translation type="vanished">Appuyez sur lempreinte digitale ou entrez le mot de passe pour déverrouiller</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>Vérifier lempreinte vocale ou saisir le mot de passe pour déverrouiller</translation>
+ <translation type="vanished">Vérifier lempreinte vocale ou saisir le mot de passe pour déverrouiller</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation>
+ <translation type="vanished">Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>Vérifiez liris ou entrez le mot de passe pour déverrouiller</translation>
+ <translation type="vanished">Vérifiez liris ou entrez le mot de passe pour déverrouiller</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>Utilisez le code danalyse wechat lié ou entrez le mot de passe pour déverrouiller</translation>
+ <translation type="vanished">Utilisez le code danalyse wechat lié ou entrez le mot de passe pour déverrouiller</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>Compte verrouillé,</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>Un autre client est déjà en train de sauthentifier, veuillez réessayer plus tard.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>Échec de lauthentification, veuillez réessayer.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>Erreur de saisie du mot de passe !</translation>
</message>
diff --git a/polkit-agent/i18n_ts/kk.ts b/polkit-agent/i18n_ts/kk.ts
index d112f69..4a77b8f 100644
--- a/polkit-agent/i18n_ts/kk.ts
+++ b/polkit-agent/i18n_ts/kk.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">شىندىقتى دالەلدەۋ</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>شىندىقتى دالەلدەۋ</translation>
+ <translation type="vanished">شىندىقتى دالەلدەۋ</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>بىئولەگىيەلىك ەرەكشەلىكتى ٸستەتۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>قۇپيا نومەر ٸستەتۋ</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>كۇشىنەن قالدىرۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>ۇقىق بەرۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>قۇپيا نومەر ٸستەتۋ ارقىلى دالەلدەۋ</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>٪1 مينۋت ٸشٸندە قاتە سىناپ كور.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>٪1 سەكونت ٸشٸندە قاتە سىناپ كور.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>ەسەپات ماڭگىلىك قۇلىپتالادى.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>قۇپيا نۇمىردى بوس قويۋعا بولمايدى</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، سىزدە جانەدە ٪2 دالەلدەۋ ورايى بار</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>قۇپيا نومەر </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>قۇپيا نۇمىرىڭىزدى كىرگىزىڭىز ياكي بارماقشى ئىزىڭىزنى تونۇتۇڭ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>بينورمال تور</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>نۇ جوبالاۋ باسقارعٸشتٸڭ ۇقىق بىرىستى تالاپ ىستەيدى.قۇپيا نۇمىردى كىرەۈزۈپ بي رەتكى جوبالاۋنىڭ الىپ بېرىلىشىغا جول قويىڭىز.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>قۇپيا نومەر </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>قۇپيا نومەر</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>دالەلدەۋ جەڭىلىپ قالدى، قاتە سىناڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>1 كۇننەن كەيىن سناپ كور</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، قۇپيا نومەر كىرگىزىڭىز</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>٪1 نى دالەلدەۋگە امالسٸز، قۇپيا نۇمىردى كىرەۈزۈپ قۇلىبىن ٴٸشڭٸز</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>بٸر پٸروگٸرامما ۇقىق تالاپ ىستەيتىن ارەكەتتى ىستەۋگە ئۇرۇنماقتا. نۇ ارەكەتتى اتقار ەتۋ ٷشٸن ۇقىق تالاپ ىستەيدى.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>قۇپيا نومەر كىرگىزۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>ukey نى USB اۋزىنا چېتىپ قويىڭىز</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>ukey قۇپيا نۇمىردى كىرگىزىڭىز</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>بٸر ساعاتتان كەيىن اشٸلدٸ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>بٸر مينوتتىن كەيىن اشٸلدٸ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>بٸر سەكونتىن كەيىن اشٸلدٸ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>قۇپيا نۇمىردى كىرەۈزۈپ ازاماتتىق كۋالىك دالەلدەۋ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>چىراي تانىسن دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
+ <translation type="vanished">چىراي تانىسن دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>بارماقشى ٴٸزدٸ باسٸۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
+ <translation type="vanished">بارماقشى ٴٸزدٸ باسٸۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>اۋا ٴٸزدٸ دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
+ <translation type="vanished">اۋا ٴٸزدٸ دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>بارماقشى ٴٸزٸ ارقىلى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
+ <translation type="vanished">بارماقشى ٴٸزٸ ارقىلى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>Iris نى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
+ <translation type="vanished">Iris نى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>بايلانعان ئۈندىدارنى كەسكىندەۋ بەلگىسى ياكي قۇپيا نۇمىردى كىرەۈزۈپ قۇلىپ ٸشٸۋ</translation>
+ <translation type="vanished">بايلانعان ئۈندىدارنى كەسكىندەۋ بەلگىسى ياكي قۇپيا نۇمىردى كىرەۈزۈپ قۇلىپ ٸشٸۋ</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>ٸستەتۋ نومەرىڭىز قۇلىپتانىپ قالدى</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>جانە بٸر قاريدار دالەلدەپ جاتىر، سەل تۇرٸپ قاتە سىناڭ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>دالەلدەۋ جەڭىلىپ قالدى، قاتە سىناڭ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>كىرگىزگەن قۇپيا نومەر قاتە قالدى</translation>
</message>
diff --git a/polkit-agent/i18n_ts/ky.ts b/polkit-agent/i18n_ts/ky.ts
index 8ccad26..47cb3c6 100644
--- a/polkit-agent/i18n_ts/ky.ts
+++ b/polkit-agent/i18n_ts/ky.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">راستىنى دالىلدۅ</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>راستىنى دالىلدۅ</translation>
+ <translation type="vanished">راستىنى دالىلدۅ</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>بىئولەگىيەلىك ۅزگۅچۅلۉگۉ ىشتەتىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>جاشىرۇۇن نومۇر ىشتەتىش</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>ارعادان قالتىرىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>ۇقۇق بەرۉۉ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>جاشىرۇۇن نومۇر ىشتەتىش ارقىلۇۇ دالىلدۅ</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>٪1 مىنۇت ىچىندە قايرا سىناپ باعىڭ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>٪1 سىكونت ىچىندە قايرا سىناپ باعىڭ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>ەسابات تۉبۅلۉك قۇلۇپلىنىدۇ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>جاشىرۇۇن نومۇردۇ بوش ،بەكەر قويۇشقا بولبويت</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىزدە داعى ەلە ٪2 دالىلدۅ مۅۅرتۉ بار</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>جاشىرۇۇن نومۇر </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>جاشىرۇۇن نومۇرۇڭۇزدۇ كىرگىزىڭ كۅرۉنۉشتۅرۉ بارماق ئىزىڭىزنى تونۇتۇڭ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>بۅتۅنچۅ تور</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>بۇل ماشقۇلدانۇۇ باشقارۇۇچۇنۇن ۇقۇق بەرۉۉنۉ تالاپ جاسايت .جاشىرۇۇن نومۇردۇ كىيىرىپ بي قاتىمقى ماشقۇلدانۇۇ نىڭ الىپ بېرىلىشىغا جول قويۇڭ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>جاشىرۇۇن نومۇر </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>جاشىرۇۇن نومۇر</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>دالىلدۅ جەڭىلۉۉ بولدۇ ، قايرا سىناڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>1 كۉندۅن كىيىن سىناپ باعىڭ</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىرلۇۇ نومۇر كىرگىزىڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>٪1 نى دالىلدۅۅگۅ ايلاسىز، جاشىرۇۇن نومۇردۇ كىيىرىپ قۇلۇپنى اچىڭ</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>بىر پراگرامما ۇقۇق تالاپ جاسايتۇرعان قىيمىلدى جاسووعو ئۇرۇنماقتا. بۇل قىيمىلدى اتقارماق جاسوو ،اتقارۇۇ ۉچۉن ۇقۇق تالاپ جاسايت .</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>جاشىرۇۇن نومۇر كىرگىزۉۉ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>ukey نى USB ووزۇنا چېتىپ قويۇڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>ukey جاشىرۇۇن نومۇرۇن كىرگىزىڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>بىر سائەتتىن كىيىن اچىلات</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>بىر مىنۇتتان كىيىن اچىلات</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>بىر سەكۇنتتان كىيىن اچىلات</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>جاشىرۇۇن نومۇردۇ كىيىرىپ كۉبۅلۉك دالىلدۅ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>چىراي تاانىشتى دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
+ <translation type="vanished">چىراي تاانىشتى دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>بارماق ىزىن باسۇۇدا كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
+ <translation type="vanished">بارماق ىزىن باسۇۇدا كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>دووش ىزىن دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
+ <translation type="vanished">دووش ىزىن دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>بارماق ئزى ارقىلۇۇ انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
+ <translation type="vanished">بارماق ئزى ارقىلۇۇ انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>Iris نى انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
+ <translation type="vanished">Iris نى انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>بايلانعان ئۈندىدارنى ىسكاننىردوو قۇپۇيا نومۇرۇ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇرۇن كىيىرىپ قۇلپ اچۇۇ</translation>
+ <translation type="vanished">بايلانعان ئۈندىدارنى ىسكاننىردوو قۇپۇيا نومۇرۇ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇرۇن كىيىرىپ قۇلپ اچۇۇ</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>ىشتەتىش نومۇرۇڭۇز قۇلۇپتالىپ قالدى</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>داعى بىر سووداگەر ، جولووچۇ دالىلدەپ جاتات، سەل تۇرۇپ قايرا سىناڭ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>دالىلدۅ جەڭىلۉۉ بولدۇ ، قايرا سىناڭ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>كىيىرگەن جاشىرۇۇن نومۇر قاتاا بولدۇ</translation>
</message>
diff --git a/polkit-agent/i18n_ts/mn.ts b/polkit-agent/i18n_ts/mn.ts
index 4f8ed3c..7f6bfe9 100644
--- a/polkit-agent/i18n_ts/mn.ts
+++ b/polkit-agent/i18n_ts/mn.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation>
+ <translation type="vanished">ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>ᠠᠮᠢᠳᠤ ᠪᠤᠳᠠᠰ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠢᠯᠭᠠᠨ ᠳᠠᠨᠢᠬᠤ</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>%1 ᠮᠢᠨᠦ᠋ᠲ᠎ᠦᠨ ᠳᠠᠷᠠᠭ᠎ᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>%1 ᠮᠢᠨᠦ᠋ᠲ᠎ᠦᠨ ᠳᠠᠷᠠᠭ᠎ᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>ᠳᠠᠩᠰᠠ ᠨᠢᠭᠡᠨᠳᠡ ᠦᠨᠢᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠭᠳᠠᠪᠠ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠬᠤᠭᠤᠰᠤᠨ ᠪᠠᠢᠵᠤ ᠪᠤᠯᠬᠤ ᠦᠬᠡᠢ</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>%1ᠶᠢᠨ/᠎ᠦᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠢᠴᠠᠭᠠᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠲᠠ ᠪᠠᠰᠠ%2 ᠤᠳᠠᠭᠠᠨ᠎ᠤ ᠳᠤᠷᠱᠢᠬᠤ ᠵᠠᠪᠱᠢᠶᠠᠨ ᠲᠠᠢ</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋᠄ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠪᠤᠶᠤ ᠬᠤᠷᠤᠭᠤᠨ ᠤ᠋ ᠤᠷᠤᠮ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠤᠭᠠᠷᠠᠢ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>ᠲᠤᠷ ᠰᠦᠯᠵᠢᠶ᠎ᠡ ᠬᠡᠪ ᠤ᠋ᠨ ᠪᠤᠰᠤ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>ᠳᠤᠰ ᠤᠳᠠᠭᠠᠨ ᠤ᠋ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠴᠢ ᠵᠢᠨ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠯᠳᠠ ᠪᠡᠷ ᠰᠠᠶᠢ ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠨ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠦᠨ᠎ᠡ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠵᠦᠪᠰᠢᠶᠡᠷᠡᠭᠡᠷᠡᠢ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>ᠡᠳᠦᠷ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭ᠎ᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨ᠎ᠠ</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>%1ᠶᠢ/᠎ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭ᠎ᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>%1ᠶᠢ/᠎ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭ᠎ᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>ᠨᠢᠭᠡ ᠫᠡᠷᠦᠭᠷᠡᠮ ᠶᠠᠭ ᠨᠢᠭᠡ ᠤᠨᠠᠴᠠ ᠡᠷᠬᠡ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠬᠦ ᠪᠡᠷ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠠᠢᠨ᠎ᠠ᠂ ᠳᠤᠰ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠬᠦ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ ᠵᠢ ᠱᠠᠭᠠᠷᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠬᠤ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠦ ᠨᠢᠭᠤᠴᠠ ᠶᠢ USB ᠦᠵᠦᠭᠦᠷ ᠲᠦ ᠬᠠᠳᠬᠤᠵᠤ ᠣᠷᠣᠭᠠᠷᠠᠢ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠢ ᠣᠷᠣᠭᠤᠯᠤᠨ᠎ᠠ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation>ᠬᠠᠭᠠᠬᠤ</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation>ᠢᠯᠠᠭᠳᠠᠯ ᠢ ᠣᠯᠪᠠ </translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>ᠨᠢᠭᠡ ᠴᠠᠭ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭ᠎ᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨ᠎ᠠ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>ᠮᠢᠨᠦ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭ᠎ᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨ᠎ᠠ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>ᠰᠸᠺᠦᠨ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭ᠎ᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨ᠎ᠠ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠳᠤ ᠡᠷᠬᠡ ᠣᠯᠭᠣᠨ᠎ᠠ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
+ <translation type="vanished">ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>ᠬᠤᠷᠤᠭᠤᠨ᠎ᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
+ <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨ᠎ᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>ᠳᠠᠭᠤ᠎ᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
+ <translation type="vanished">ᠳᠠᠭᠤ᠎ᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>ᠬᠤᠷᠤᠭᠤᠨ᠎ᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯ᠎ᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
+ <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨ᠎ᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯ᠎ᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>ᠰᠤᠯᠤᠩᠭ᠎ᠠ ᠪᠦᠷᠬᠦᠪᠴᠢ᠎ᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
+ <translation type="vanished">ᠰᠤᠯᠤᠩᠭ᠎ᠠ ᠪᠦᠷᠬᠦᠪᠴᠢ᠎ᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲ᠎ᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
+ <translation type="vanished">ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲ᠎ᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤ᠎ᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>ᠳᠠᠨᠭᠰᠠ ᠵᠢ ᠨᠢᠬᠡᠨᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠪᠠ</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>ᠦᠬᠡᠷ᠎ᠡ ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷᠯᠢᠭ ᠢ᠋ ᠶᠠᠭ ᠨᠤᠳᠠᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ᠂ ᠤᠳᠠᠰᠬᠢᠭᠠᠳ ᠳᠠᠬᠢᠨ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠪᠤᠷᠤᠭᠤ ᠤᠷᠤᠭᠤᠯᠪᠠ!</translation>
</message>
diff --git a/polkit-agent/i18n_ts/pt.ts b/polkit-agent/i18n_ts/pt.ts
index 155dec7..90bc880 100644
--- a/polkit-agent/i18n_ts/pt.ts
+++ b/polkit-agent/i18n_ts/pt.ts
@@ -15,6 +15,13 @@
<translation type="obsolete">Formato</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <source>Authentication</source>
+ <translation type="unfinished">Autenticação</translation>
+ </message>
+</context>
<context>
<name>MainWindow</name>
<message>
@@ -59,7 +66,7 @@
</message>
<message>
<source>Authentication</source>
- <translation>Autenticação</translation>
+ <translation type="vanished">Autenticação</translation>
</message>
<message>
<source>in authentication, please wait...</source>
@@ -126,75 +133,83 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify face recognition or enter password to unlock</source>
+ <source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Press fingerprint or enter password to unlock</source>
+ <source>Input Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify voiceprint or enter password to unlock</source>
+ <source>Failed to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify finger vein or enter password to unlock</source>
+ <source>Unable to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify iris or enter password to unlock</source>
+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to verify %1, you still have %2 verification opportunities</source>
+ <source>_Password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Input Password</source>
+ <source>_Password: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Use the bound wechat scanning code or enter the password to unlock</source>
+ <source>Abnormal network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to verify %1, please enter password to unlock</source>
+ <source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Unable to verify %1, please enter password to unlock</source>
+ <source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
+ <source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>_Password:</source>
+ <source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>_Password: </source>
+ <source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Abnormal network</source>
+ <source>Acquisition failure</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
+ <source>Facial recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Insert the ukey into the USB port</source>
+ <source>Fingerprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enter the ukey password</source>
+ <source>Voiceprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Input your password to authentication</source>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use the bound wechat scanning code to authorization</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/polkit-agent/i18n_ts/ru.ts b/polkit-agent/i18n_ts/ru.ts
index c75c155..e8c5d91 100644
--- a/polkit-agent/i18n_ts/ru.ts
+++ b/polkit-agent/i18n_ts/ru.ts
@@ -15,6 +15,13 @@
<translation type="obsolete">форма</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <source>Authentication</source>
+ <translation type="unfinished">Аутентификация</translation>
+ </message>
+</context>
<context>
<name>MainWindow</name>
<message>
@@ -59,7 +66,7 @@
</message>
<message>
<source>Authentication</source>
- <translation>Аутентификация</translation>
+ <translation type="vanished">Аутентификация</translation>
</message>
<message>
<source>in authentication, please wait...</source>
@@ -126,75 +133,83 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify face recognition or enter password to unlock</source>
+ <source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Press fingerprint or enter password to unlock</source>
+ <source>Input Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify voiceprint or enter password to unlock</source>
+ <source>Failed to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify finger vein or enter password to unlock</source>
+ <source>Unable to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Verify iris or enter password to unlock</source>
+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to verify %1, you still have %2 verification opportunities</source>
+ <source>_Password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Input Password</source>
+ <source>_Password: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Use the bound wechat scanning code or enter the password to unlock</source>
+ <source>Abnormal network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to verify %1, please enter password to unlock</source>
+ <source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Unable to verify %1, please enter password to unlock</source>
+ <source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
+ <source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>_Password:</source>
+ <source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>_Password: </source>
+ <source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Abnormal network</source>
+ <source>Acquisition failure</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
+ <source>Facial recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Insert the ukey into the USB port</source>
+ <source>Fingerprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enter the ukey password</source>
+ <source>Voiceprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Input your password to authentication</source>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use the bound wechat scanning code to authorization</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/polkit-agent/i18n_ts/tr.ts b/polkit-agent/i18n_ts/tr.ts
index f59c7a3..89b19dd 100644
--- a/polkit-agent/i18n_ts/tr.ts
+++ b/polkit-agent/i18n_ts/tr.ts
@@ -31,160 +31,178 @@
<translation type="obsolete">Ses İzi</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">Kimlik Doğrulama</translation>
+ </message>
+</context>
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>Kimlik Doğrulama</translation>
+ <translation type="vanished">Kimlik Doğrulama</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
- <source>Account locked,</source>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <source>days left</source>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <source>hours left</source>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <source>minutes left</source>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
- <source>seconds left</source>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
- <source>Password cannot be empty</source>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
- <source>Input your password to authentication</source>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
- <source>Use password</source>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
- <source>Please try again in %1 minutes.</source>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
+ <source>Account locked,</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
- <source>Please try again in %1 seconds.</source>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <source>days left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
- <source>Account locked permanently.</source>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <source>hours left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <source>minutes left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="644"/>
+ <source>seconds left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
- <source>Verify face recognition or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
+ <source>Password cannot be empty</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
- <source>Press fingerprint or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
+ <source>Input your password to authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
- <source>Verify voiceprint or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="876"/>
+ <source>Use password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
- <source>Verify finger vein or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
+ <source>Please try again in %1 minutes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
- <source>Verify iris or enter password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
+ <source>Please try again in %1 seconds.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
- <source>Use the bound wechat scanning code or enter the password to unlock</source>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
+ <source>Account locked permanently.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -205,9 +223,9 @@
<translation type="obsolete">Parola</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>Biyometrik</translation>
</message>
@@ -256,19 +274,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>İptal</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>Kimlik Doğrulaması</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation type="unfinished"></translation>
</message>
@@ -277,7 +295,7 @@
<translation type="obsolete">Kimlik Doğrulaması</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation type="unfinished"></translation>
</message>
@@ -290,22 +308,22 @@
<translation type="vanished">Bir uygulama, ayrıcalıklar gerektiren bir eylem gerçekleştirmeye çalışıyor. Bu işlemi gerçekleştirmek için kimlik doğrulaması gerekiyor.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation type="unfinished">Parola </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation type="unfinished">_Parola </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation type="unfinished">_Parola</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>Kimlik doğrulama başarısız, lütfen tekrar deneyin.</translation>
</message>
@@ -317,17 +335,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>Başka bir hesap zaten kimlik doğrulaması yapıyor, lütfen daha sonra tekrar deneyin.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>Kimlik doğrulama hatalı, lütfen tekrar deneyin.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation type="unfinished"></translation>
</message>
diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts
index 58164c0..8614ae4 100644
--- a/polkit-agent/i18n_ts/ug.ts
+++ b/polkit-agent/i18n_ts/ug.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">راستىنى دەلىللەش</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>راستىنى دەلىللەش</translation>
+ <translation type="vanished">راستىنى دەلىللەش</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>بىئولەگىيەلىك ئالاھىدىلىكنى ئىشلىتىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>مەخپىي نومۇر ئىشلىتىش</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>ئەمەلدىن قالدۇرۇش</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>ھوقۇق بېرىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>مەخپىي نومۇر ئىشلىتىش ئارقىلىق دەلىللەش</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>مەخپىي نومۇر </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تونۇتۇڭ </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>بىنورمال تور</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ.مەخپىي نومۇرنى كىرگۈزۈپ بي قېتىمقى مەشغۇلاتنىڭ ئېلىپ بېرىلىشىغا يول قويۇڭ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>مەخپىي نومۇر </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>مەخپىي نومۇر</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>1 كۈندىن كېيىن سىناب بېقىڭ</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئېچىڭ</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>ئىم كىرگۈزۈش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>ukey نى USB ئېغىزىغا چېتىپ قويۇڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>ukey مەخپىي نومۇرىنى كىرگۈزۈڭ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>بىر سائەتتىن كېيىن ئېچىلىدۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>بىر مىنۇتتىن كېيىن ئېچىلىدۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>بىر سېكۇنتتىن كېيىن ئېچىلىدۇ</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>مەخپىي نومۇرنى كىرگۈزۈپ كىملىك دەلىللەش.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
+ <translation type="vanished">چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
+ <translation type="vanished">بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
+ <translation type="vanished">ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>بارماق ئىزى ئارقىلىق ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
+ <translation type="vanished">بارماق ئىزى ئارقىلىق ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
+ <translation type="vanished">Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation>
+ <translation type="vanished">باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>ئىشلىتىش نومۇرىڭىز قۇلۇپلىنىپ قالدى</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>يەنە بىر خېرىدار دەلىللەۋاتىدۇ، سەل تۇرۇپ قايتا سىناڭ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ.</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>كىرگۈزگەن مەخپىي نومۇر خاتا بولدى</translation>
</message>
diff --git a/polkit-agent/i18n_ts/zh_CN.ts b/polkit-agent/i18n_ts/zh_CN.ts
index 070732c..5fc6ea0 100644
--- a/polkit-agent/i18n_ts/zh_CN.ts
+++ b/polkit-agent/i18n_ts/zh_CN.ts
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">授权</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>授权</translation>
+ <translation type="vanished">授权</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>使用生物识别</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>使用密码验证</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>授权</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>使用密码验证</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>请%1分钟后再试</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>请%1秒后再试</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>账号已被永久锁定</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>密码不能为空</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>验证%1失败您还有%2次尝试机会</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>密码: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>请输入密码或者录入指纹</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>本次操作需要通过管理员的授权才能继续执行,请输入密码以允许本次操作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>密码: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>密码:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>认证失败,请重试。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>天后解锁</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>验证%1失败请输入密码解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>无法验证%1请输入密码解锁</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>一个程序正试图执行一个需要特权的动作,要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>输入密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>请将安全密钥插入USB端口</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>输入安全密钥密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation>识别人脸以授权</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation>识别指纹以授权</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation>识别声纹以授权</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation>识别指静脉以授权</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation>识别虹膜以授权</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation>微信扫码以授权</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation>获取失败</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>小时后解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>分钟后解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>秒后解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>输入密码以授权</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>验证人脸识别或输入密码解锁</translation>
+ <translation type="vanished">验证人脸识别或输入密码解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>按压指纹或输入密码解锁</translation>
+ <translation type="vanished">按压指纹或输入密码解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>验证声纹或输入密码解锁</translation>
+ <translation type="vanished">验证声纹或输入密码解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>验证指静脉或输入密码解锁</translation>
+ <translation type="vanished">验证指静脉或输入密码解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>验证虹膜或输入密码解锁</translation>
+ <translation type="vanished">验证虹膜或输入密码解锁</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>使用绑定的微信扫码或输入密码解锁</translation>
+ <translation type="vanished">使用绑定的微信扫码或输入密码解锁</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>账户已锁定,</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>有另外一个客户端正在认证,请稍后重试。</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>认证失败,请重试。</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>密码输入错误!</translation>
</message>
diff --git a/polkit-agent/i18n_ts/zh_HK.ts b/polkit-agent/i18n_ts/zh_HK.ts
index 95c8c43..52c432d 100644
--- a/polkit-agent/i18n_ts/zh_HK.ts
+++ b/polkit-agent/i18n_ts/zh_HK.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.1" language="zh_Hant">
+<TS version="2.1" language="zh">
<context>
<name>BioAuthWidget</name>
<message>
@@ -51,6 +51,15 @@
<translation type="vanished">二维码</translation>
</message>
</context>
+<context>
+ <name>FullScreenBackground</name>
+ <message>
+ <location filename="../src/fullscreenbackground.cpp" line="75"/>
+ <location filename="../src/fullscreenbackground.cpp" line="104"/>
+ <source>Authentication</source>
+ <translation type="unfinished">授權</translation>
+ </message>
+</context>
<context>
<name>LoginOptionsWidget</name>
<message>
@@ -65,9 +74,8 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../src/mainwindow.cpp" line="66"/>
<source>Authentication</source>
- <translation>授權</translation>
+ <translation type="vanished">授權</translation>
</message>
<message>
<source>Fingerprint authentication failed, you still have %1 verification opportunities</source>
@@ -91,14 +99,14 @@
<translation type="vanished">密码</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="409"/>
- <location filename="../src/mainwindow.cpp" line="1075"/>
- <location filename="../src/mainwindow.cpp" line="1143"/>
+ <location filename="../src/mainwindow.ui" line="398"/>
+ <location filename="../src/mainwindow.cpp" line="874"/>
+ <location filename="../src/mainwindow.cpp" line="943"/>
<source>Biometric</source>
<translation>使用生物識別</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="480"/>
+ <location filename="../src/mainwindow.ui" line="493"/>
<source>use password</source>
<translation>使用密碼驗證</translation>
</message>
@@ -147,20 +155,19 @@
<translation type="vanished">Polkit.caller-pid</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="441"/>
- <location filename="../src/mainwindow.cpp" line="1077"/>
+ <location filename="../src/mainwindow.ui" line="436"/>
+ <location filename="../src/mainwindow.cpp" line="875"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
<message>
- <location filename="../src/mainwindow.ui" line="460"/>
- <location filename="../src/mainwindow.cpp" line="1073"/>
+ <location filename="../src/mainwindow.ui" line="461"/>
+ <location filename="../src/mainwindow.cpp" line="873"/>
<source>Authenticate</source>
<translation>授權</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1079"/>
- <location filename="../src/mainwindow.cpp" line="1183"/>
+ <location filename="../src/mainwindow.cpp" line="876"/>
<source>Use password</source>
<translation>使用密碼驗證</translation>
</message>
@@ -185,30 +192,30 @@
<translation type="vanished">认证中,请稍等...</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1219"/>
- <location filename="../src/mainwindow.cpp" line="1292"/>
- <location filename="../src/mainwindow.cpp" line="1293"/>
+ <location filename="../src/mainwindow.cpp" line="1003"/>
+ <location filename="../src/mainwindow.cpp" line="1081"/>
+ <location filename="../src/mainwindow.cpp" line="1082"/>
<source>Please try again in %1 minutes.</source>
<translation>請%1分鐘后再試</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1230"/>
- <location filename="../src/mainwindow.cpp" line="1302"/>
- <location filename="../src/mainwindow.cpp" line="1303"/>
+ <location filename="../src/mainwindow.cpp" line="1015"/>
+ <location filename="../src/mainwindow.cpp" line="1093"/>
+ <location filename="../src/mainwindow.cpp" line="1094"/>
<source>Please try again in %1 seconds.</source>
<translation>請%1秒後再試</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1240"/>
- <location filename="../src/mainwindow.cpp" line="1241"/>
- <location filename="../src/mainwindow.cpp" line="1311"/>
- <location filename="../src/mainwindow.cpp" line="1312"/>
+ <location filename="../src/mainwindow.cpp" line="1026"/>
+ <location filename="../src/mainwindow.cpp" line="1027"/>
+ <location filename="../src/mainwindow.cpp" line="1104"/>
+ <location filename="../src/mainwindow.cpp" line="1105"/>
<source>Account locked permanently.</source>
<translation>帳號已被永久鎖定</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="834"/>
- <location filename="../src/mainwindow.cpp" line="835"/>
+ <location filename="../src/mainwindow.cpp" line="688"/>
+ <location filename="../src/mainwindow.cpp" line="689"/>
<source>Password cannot be empty</source>
<translation>密碼不能為空</translation>
</message>
@@ -221,8 +228,8 @@
<translation type="vanished">无法验证%1请输入密码.</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="242"/>
- <location filename="../src/mainwindow.cpp" line="246"/>
+ <location filename="../src/mainwindow.cpp" line="1558"/>
+ <location filename="../src/mainwindow.cpp" line="1562"/>
<source>Failed to verify %1, you still have %2 verification opportunities</source>
<translation>驗證%1失敗您還有%2次嘗試機會</translation>
</message>
@@ -231,42 +238,42 @@
<translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="731"/>
+ <location filename="../src/mainwindow.cpp" line="582"/>
<source>Password: </source>
<translation>密碼: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="335"/>
+ <location filename="../src/mainwindow.cpp" line="165"/>
<source>Please enter your password or enroll your fingerprint </source>
<translation>請輸入密碼或者錄入指紋 </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="259"/>
+ <location filename="../src/mainwindow.cpp" line="1575"/>
<source>Abnormal network</source>
<translation>網路異常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="665"/>
+ <location filename="../src/mainwindow.cpp" line="517"/>
<source>This operation requires the administrator&apos;s authorization. Please enter your password to allow this operation.</source>
<translation>本次操作需要通過管理員的授權才能繼續執行,請輸入密碼以允許本次操作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="733"/>
+ <location filename="../src/mainwindow.cpp" line="584"/>
<source>_Password: </source>
<translation>密碼: </translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="735"/>
+ <location filename="../src/mainwindow.cpp" line="586"/>
<source>_Password:</source>
<translation>密碼:</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="850"/>
+ <location filename="../src/mainwindow.cpp" line="704"/>
<source>Authentication failed, please try again.</source>
<translation>認證失敗,請重試。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
<source>days left</source>
<translation>天后解鎖</translation>
</message>
@@ -279,16 +286,16 @@
<translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="226"/>
- <location filename="../src/mainwindow.cpp" line="1415"/>
- <location filename="../src/mainwindow.cpp" line="1417"/>
+ <location filename="../src/mainwindow.cpp" line="1243"/>
+ <location filename="../src/mainwindow.cpp" line="1246"/>
+ <location filename="../src/mainwindow.cpp" line="1539"/>
<source>Failed to verify %1, please enter password to unlock</source>
<translation>驗證%1失敗請輸入密碼解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="231"/>
- <location filename="../src/mainwindow.cpp" line="233"/>
- <location filename="../src/mainwindow.cpp" line="1419"/>
+ <location filename="../src/mainwindow.cpp" line="1249"/>
+ <location filename="../src/mainwindow.cpp" line="1545"/>
+ <location filename="../src/mainwindow.cpp" line="1548"/>
<source>Unable to verify %1, please enter password to unlock</source>
<translation>無法驗證%1請輸入密碼解鎖</translation>
</message>
@@ -297,86 +304,121 @@
<translation type="vanished">网络异常</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="671"/>
+ <location filename="../src/mainwindow.cpp" line="522"/>
<source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source>
<translation>一個程式正試圖執行一個需要特權的動作,要求授權以執行該動作。</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="108"/>
- <location filename="../src/mainwindow.cpp" line="729"/>
+ <location filename="../src/mainwindow.cpp" line="88"/>
+ <location filename="../src/mainwindow.cpp" line="580"/>
<source>Input Password</source>
<translation>輸入密碼</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="105"/>
+ <location filename="../src/mainwindow.cpp" line="85"/>
<source>Insert the ukey into the USB port</source>
<translation>請將安全金鑰插入USB埠</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="107"/>
+ <location filename="../src/mainwindow.cpp" line="87"/>
<source>Enter the ukey password</source>
<translation>輸入安全金鑰密碼</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="783"/>
+ <location filename="../src/mainwindow.cpp" line="93"/>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1261"/>
+ <source>Facial recognition to authorization</source>
+ <translation>識別人臉以授權</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1264"/>
+ <source>Fingerprint recognition to authorization</source>
+ <translation>識別指紋以授權</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1267"/>
+ <source>Voiceprint recognition to authorization</source>
+ <translation>識別聲紋以授權</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1270"/>
+ <source>Finger veins recognition to authorization</source>
+ <translation>識別指靜脈以授權</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1273"/>
+ <source>Iris recognition to authorization</source>
+ <translation>識別虹膜以授權</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1276"/>
+ <source>Use the bound wechat scanning code to authorization</source>
+ <translation>微信掃碼以授權</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="1579"/>
+ <source>Acquisition failure</source>
+ <translation>獲取失敗</translation>
+ </message>
+ <message>
+ <location filename="../src/mainwindow.cpp" line="638"/>
<source>hours left</source>
<translation>小時後解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="787"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
<source>minutes left</source>
<translation>分鐘後解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>seconds left</source>
<translation>秒後解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="880"/>
- <location filename="../src/mainwindow.cpp" line="888"/>
+ <location filename="../src/mainwindow.cpp" line="734"/>
+ <location filename="../src/mainwindow.cpp" line="742"/>
+ <location filename="../src/mainwindow.cpp" line="1258"/>
<source>Input your password to authentication</source>
<translation>輸入密碼以認證</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1434"/>
<source>Verify face recognition or enter password to unlock</source>
- <translation>驗證人臉識別或輸入密碼解鎖</translation>
+ <translation type="vanished">驗證人臉識別或輸入密碼解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1439"/>
<source>Press fingerprint or enter password to unlock</source>
- <translation>按壓指紋或輸入密碼解鎖</translation>
+ <translation type="vanished">按壓指紋或輸入密碼解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1444"/>
<source>Verify voiceprint or enter password to unlock</source>
- <translation>驗證聲紋或輸入密碼解鎖</translation>
+ <translation type="vanished">驗證聲紋或輸入密碼解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1449"/>
<source>Verify finger vein or enter password to unlock</source>
- <translation>驗證指靜脈或輸入密碼解鎖</translation>
+ <translation type="vanished">驗證指靜脈或輸入密碼解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1454"/>
<source>Verify iris or enter password to unlock</source>
- <translation>驗證虹膜或輸入密碼解鎖</translation>
+ <translation type="vanished">驗證虹膜或輸入密碼解鎖</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="1459"/>
<source>Use the bound wechat scanning code or enter the password to unlock</source>
- <translation>使用綁定的微信掃碼或輸入密碼解鎖</translation>
+ <translation type="vanished">使用綁定的微信掃碼或輸入密碼解鎖</translation>
</message>
<message>
<source>Use the bound wechat scanning code or enter the password to log in</source>
<translation type="vanished">使用绑定的微信扫码或输入密码登录</translation>
</message>
<message>
- <location filename="../src/mainwindow.cpp" line="779"/>
- <location filename="../src/mainwindow.cpp" line="783"/>
- <location filename="../src/mainwindow.cpp" line="787"/>
- <location filename="../src/mainwindow.cpp" line="791"/>
+ <location filename="../src/mainwindow.cpp" line="635"/>
+ <location filename="../src/mainwindow.cpp" line="638"/>
+ <location filename="../src/mainwindow.cpp" line="641"/>
+ <location filename="../src/mainwindow.cpp" line="644"/>
<source>Account locked,</source>
<translation>帳戶已鎖定,</translation>
</message>
@@ -388,17 +430,17 @@
<context>
<name>PolkitListener</name>
<message>
- <location filename="../src/PolkitListener.cpp" line="88"/>
+ <location filename="../src/PolkitListener.cpp" line="86"/>
<source>Another client is already authenticating, please try again later.</source>
<translation>有另外一個用戶端正在認證,請稍後重試。</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="265"/>
+ <location filename="../src/PolkitListener.cpp" line="253"/>
<source>Authentication failure, please try again.</source>
<translation>認證失敗,請重試。</translation>
</message>
<message>
- <location filename="../src/PolkitListener.cpp" line="272"/>
+ <location filename="../src/PolkitListener.cpp" line="259"/>
<source>Password input error!</source>
<translation>密碼輸入錯誤!</translation>
</message>
diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp
index 749e551..6a37a22 100644
--- a/polkit-agent/src/PolkitListener.cpp
+++ b/polkit-agent/src/PolkitListener.cpp
@@ -31,28 +31,21 @@
#include <QApplication>
#include <QScreen>
#include <fcntl.h>
-#include <kysdk/kysdk-system/libkysysinfo.h>
#include "PolkitListener.h"
#include "mainwindow.h"
#include "generic.h"
#include <libkysysinfo.h>
-#include "windowmanager/windowmanager.h"
PolkitListener::PolkitListener(QObject *parent)
- : Listener(parent),
- inProgress(false),
- currentIdentity(0),
- mainWindow(nullptr)
+ : Listener(parent), inProgress(false), currentIdentity(0), m_managerFullScreen(nullptr)
{
m_isSupportTableMode = isSupportTableMode();
- m_isMavis = isMavis();
- qDebug()<<"isSupportTableMode:"<<m_isSupportTableMode;
+ m_isMavis = isMavis();
+ qDebug() << "isSupportTableMode:" << m_isSupportTableMode;
}
-PolkitListener::~PolkitListener()
-{
-}
+PolkitListener::~PolkitListener() {}
bool PolkitListener::isMavis()
{
@@ -81,12 +74,15 @@ bool PolkitListener::isSupportTableMode()
/* initiateAuthentication message from polkit */
void PolkitListener::initiateAuthentication(
- const QString &actionId, const QString &message,
- const QString &iconName, const PolkitQt1::Details &details,
- const QString &cookie, const PolkitQt1::Identity::List &identities,
+ const QString &actionId,
+ const QString &message,
+ const QString &iconName,
+ const PolkitQt1::Details &details,
+ const QString &cookie,
+ const PolkitQt1::Identity::List &identities,
PolkitQt1::Agent::AsyncResult *result)
{
- if(inProgress){
+ if (inProgress) {
result->setError(tr("Another client is already authenticating, please try again later."));
result->setCompleted();
qDebug() << "Another client is already authenticating, please try again later.";
@@ -107,13 +103,13 @@ void PolkitListener::initiateAuthentication(
subjectPid = details.lookup("polkit.subject-pid");
callerPid = details.lookup("polkit.caller-pid");
+ implicitActiveStr = details.lookup("implicit_authorization");
/* find action description for actionId */
- foreach(const PolkitQt1::ActionDescription &desc,
- PolkitQt1::Authority::instance()->enumerateActionsSync()) {
+ foreach (const PolkitQt1::ActionDescription &desc, PolkitQt1::Authority::instance()->enumerateActionsSync()) {
if (actionId == desc.actionId()) {
actionDesc = desc;
- qDebug() << "Action description has been found" ;
+ qDebug() << "Action description has been found";
break;
}
}
@@ -135,117 +131,103 @@ void PolkitListener::initiateAuthentication(
this->result = result;
session.clear();
if (identities.length() == 1) {
- this->currentIdentity = identities[0];
+ this->currentIdentity = identities[0];
} else {
currentIdentity = identities[0];
}
/* Create the polkit window */
- mainWindow = new MainWindow;
-// MotifWmHints hints;
-// hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS;
-// hints.functions = MWM_FUNC_ALL;
-// hints.decorations = MWM_DECOR_BORDER;
-// XAtomHelper::getInstance()->setWindowMotifHint(mainWindow->winId(), hints);
- mainWindow->setIcon(iconName);
- mainWindow->setCurProject(m_isMavis);
- mainWindow->setHeader(message);
- mainWindow->setUsers(usersList);
- mainWindow->setEditInputMethod(m_isSupportTableMode);
- mainWindow->setFixedSize(420, 297);
- /*
- mainWindow->setDetails(subjectPid, callerPid,
- actionDesc.actionId(),
- actionDesc.description(),
- actionDesc.vendorName(),
- actionDesc.vendorUrl());
- */
- /* set the position of the mainwindow */
- QPoint pos = QCursor::pos();
- QRect desScreenGeometry;
- for (QScreen *screen : qApp->screens()) {
- if (screen->geometry().contains(pos)) {
- desScreenGeometry = screen->geometry();
- }
- }
-
- if (desScreenGeometry.isEmpty()) {
- desScreenGeometry = qApp->primaryScreen()->geometry();
- }
-// mainWindow->move(desScreenGeometry.x() + (desScreenGeometry.width() - mainWindow->width())/2,
-// desScreenGeometry.y() + (desScreenGeometry.height() - mainWindow->height())/2);
-// qDebug()<<"MoveWindow to center1:"<<desScreenGeometry<<","<<mainWindow->geometry()<<QGuiApplication::platformName();;
-
-
-
- connect(mainWindow, &MainWindow::accept, this, &PolkitListener::onResponse);
- connect(mainWindow, &MainWindow::canceled, this, [&]{
- wasCancelled = true;
- unacknowledged_messages = false;
- if(!session.isNull()) {
- session.data()->cancel();
- }
- });
-
- connect(mainWindow, &MainWindow::switchToBiometric, this, [&]{
- wasSwitchToBiometric = true;
- startAuthentication();
- });
-
- connect(mainWindow, &MainWindow::restartAuth, this, [&]{
- startAuthentication();
- });
-
- connect(mainWindow, &MainWindow::userChanged, this, [&](const QString &userName){
- for(int i = 0; i < this->identities.size(); i++) {
- auto identity = this->identities.at(i);
- if(identity.toString().remove("unix-user:") == userName) {
- this->currentIdentity = this->identities.at(i);
- numTries = 0;
- startAuthentication();
- break;
+ m_managerFullScreen = new FullScreenBackground();
+ m_managerFullScreen->initMainWindow(
+ iconName, message, usersList, subjectPid, callerPid, actionDesc, m_isMavis, m_isSupportTableMode);
+
+ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) {
+ connect(m_managerFullScreen->getMainWindow(), &MainWindow::accept, this, &PolkitListener::onResponse);
+ connect(m_managerFullScreen->getMainWindow(), &MainWindow::canceled, this, [&] {
+ if (inProgress && !gainedAuthorization) {
+ wasCancelled = true;
+ unacknowledged_messages = false;
+ if (!session.isNull()) {
+ session.data()->cancel();
+ }
+ finishObtainPrivilege();
}
- }
- });
+ });
+
+ connect(m_managerFullScreen->getMainWindow(), &MainWindow::switchToBiometric, this, [&] {
+ wasSwitchToBiometric = true;
+ startAuthentication();
+ });
+
+ connect(m_managerFullScreen->getMainWindow(), &MainWindow::yesPrompted, this, [=] {
+ result->setCompleted();
+ this->gainedAuthorization = true;
+ finishObtainPrivilege();
+ });
+
+ connect(m_managerFullScreen->getMainWindow(), &MainWindow::restartAuth, this, [&] { startAuthentication(); });
+
+ connect(m_managerFullScreen->getMainWindow(), &MainWindow::userChanged, this, [&](const QString &userName) {
+ for (int i = 0; i < this->identities.size(); i++) {
+ auto identity = this->identities.at(i);
+ if (identity.toString().remove("unix-user:") == userName) {
+ this->currentIdentity = this->identities.at(i);
+ numTries = 0;
+ startAuthentication();
+ break;
+ }
+ }
+ });
- numTries = 0;
- wasCancelled = false;
- wasSwitchToBiometric = false;
+ numTries = 0;
+ wasCancelled = false;
+ wasSwitchToBiometric = false;
- mainWindow->userChanged(usersList.at(0));
+ if (implicitActiveStr == "yes_prompt") {
+ m_managerFullScreen->getMainWindow()->onShowYesPrompt();
+ m_managerFullScreen->getMainWindow()->setFixedSize(m_managerFullScreen->getMainWindow()->width(), 200);
+ m_managerFullScreen->getMainWindow()->show();
+ m_managerFullScreen->getMainWindow()->activateWindow();
+ return;
+ }
+ m_managerFullScreen->getMainWindow()->userChanged(usersList.at(0));
+ }
}
-static
-int get_pam_tally(int *deny, int *unlock_time)
+static int get_pam_tally(int *deny, int *unlock_time)
{
char buf[128];
- FILE *auth_file;
+ FILE *auth_file = NULL;
- if( (auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL)
+ if ((auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL)
return -1;
- while(fgets(buf, sizeof(buf), auth_file)) {
- if(strlen(buf) == 0 || buf[0] == '#')
+ while (fgets(buf, sizeof(buf), auth_file)) {
+ if (strlen(buf) == 0 || buf[0] == '#')
continue;
- if(!strstr(buf, "deny"))
+ if (!strstr(buf, "deny"))
continue;
char *ptr = strtok(buf, " \t");
- while(ptr) {
- if(strncmp(ptr, "deny=", 5)==0){
+ while (ptr) {
+ if (strncmp(ptr, "deny=", 5) == 0) {
sscanf(ptr, "deny=%d", deny);
- //gs_debug("-------------------- deny=%d", *deny);
+ // gs_debug("-------------------- deny=%d", *deny);
}
- if(strncmp(ptr, "unlock_time=", 12)==0){
+ if (strncmp(ptr, "unlock_time=", 12) == 0) {
sscanf(ptr, "unlock_time=%d", unlock_time);
- //gs_debug("-------------------- unlock_time=%d", *unlock_time);
+ // gs_debug("-------------------- unlock_time=%d", *unlock_time);
}
ptr = strtok(NULL, " \t");
}
+ fclose(auth_file);
+ auth_file = NULL;
return 1;
}
+ fclose(auth_file);
+ auth_file = NULL;
return 0;
}
@@ -253,54 +235,59 @@ void PolkitListener::finishObtainPrivilege()
{
/* Number of tries increase only when some user is selected */
if (currentIdentity.isValid()) {
- numTries++;
+ numTries++;
}
qDebug().noquote() << QString("Finishing obtaining "
- "privileges (G:%1, C:%2, D:%3).")
- .arg(gainedAuthorization)
- .arg(wasCancelled)
- .arg(mainWindow != NULL);
-
- if (!gainedAuthorization && !wasCancelled && (mainWindow != NULL)) {
- int deny = 0, unlock_time = 0;
- mainWindow->stopDoubleAuth();
- if(!get_pam_tally(&deny, &unlock_time)||(deny == 0 &&unlock_time == 0)) {
- //if(!wasSwitchToBiometric){
- if (!unacknowledged_messages)
- mainWindow->setAuthResult(gainedAuthorization, tr("Authentication failure, please try again."));
- //}
- startAuthentication();
- return;
- }
- else {
- if (!unacknowledged_messages) {
- mainWindow->setAuthResult(gainedAuthorization, tr("Password input error!"));
- }
- startAuthentication();
- return;
- }
-
- startAuthentication();
+ "privileges (G:%1, C:%2, D:%3).")
+ .arg(gainedAuthorization)
+ .arg(wasCancelled)
+ .arg(m_managerFullScreen && m_managerFullScreen->getMainWindow());
+
+ if (!gainedAuthorization && !wasCancelled && (m_managerFullScreen && m_managerFullScreen->getMainWindow())) {
+ int deny = 0, unlock_time = 0;
+ m_managerFullScreen->getMainWindow()->stopDoubleAuth();
+ if (!get_pam_tally(&deny, &unlock_time) || (deny == 0 && unlock_time == 0)) {
+ // if(!wasSwitchToBiometric){
+ if (!unacknowledged_messages)
+ m_managerFullScreen->getMainWindow()->setAuthResult(
+ gainedAuthorization, tr("Authentication failure, please try again."));
+ //}
+ startAuthentication();
return;
+ } else {
+ if (!unacknowledged_messages) {
+ m_managerFullScreen->getMainWindow()->setAuthResult(gainedAuthorization, tr("Password input error!"));
+ }
+ startAuthentication();
+ return;
+ }
+
+ startAuthentication();
+ return;
}
- if (mainWindow) {
- mainWindow->hide();
- mainWindow->stopDoubleAuth();
- mainWindow->close();
- mainWindow->deleteLater();
- mainWindow = NULL;
+ if (m_managerFullScreen) {
+ m_managerFullScreen->closeDialog();
+ m_managerFullScreen->deleteLater();
+ m_managerFullScreen = nullptr;
+ }
+
+ if ((implicitActiveStr == "yes_prompt") && wasCancelled) {
+ result->setError("polkit-ukui-authentication-agent-1 cancel");
}
if (!session.isNull()) {
session.data()->result()->setCompleted();
+ session.data()->deleteLater();
+ session.clear();
} else {
result->setCompleted();
}
- session.data()->deleteLater();
this->inProgress = false;
+ implicitActiveStr = "";
qDebug() << "Finish obtain authorization:" << gainedAuthorization;
+ gainedAuthorization = false;
}
void establishToBioPAM()
@@ -308,12 +295,12 @@ void establishToBioPAM()
FILE *file;
const char *data = "polkit-ukui-authentication-agent-1";
- if( (file = fopen(BIO_COM_FILE, "w")) == NULL){
+ if ((file = fopen(BIO_COM_FILE, "w")) == NULL) {
qWarning() << "open communication file failed: " << strerror(errno);
return;
}
- if(fputs(data, file) == EOF) {
+ if (fputs(data, file) == EOF) {
qWarning() << "write to communication file error: " << strerror(errno);
}
fclose(file);
@@ -323,7 +310,7 @@ void PolkitListener::startAuthentication()
{
qDebug() << "start authenticate user " << currentIdentity.toString();
unacknowledged_messages = false;
- if(!session.isNull()) {
+ if (!session.isNull()) {
session.data()->deleteLater();
}
@@ -332,92 +319,61 @@ void PolkitListener::startAuthentication()
establishToBioPAM();
- session = new Session(currentIdentity, cookie, result);
- connect(session.data(), SIGNAL(request(QString, bool)), this,
- SLOT(onShowPrompt(QString,bool)));
- connect(session.data(), SIGNAL(completed(bool)), this,
- SLOT(onAuthCompleted(bool)));
- connect(session.data(), SIGNAL(showError(QString)), this,
- SLOT(onShowError(QString)));
- connect(session.data(), SIGNAL(showInfo(QString)), this,
- SLOT(onShowError(QString)));
- session.data()->initiate();
+ session = new Session(currentIdentity, cookie, result);
+ connect(session.data(), SIGNAL(request(QString, bool)), this, SLOT(onShowPrompt(QString, bool)));
+ connect(session.data(), SIGNAL(completed(bool)), this, SLOT(onAuthCompleted(bool)));
+ connect(session.data(), SIGNAL(showError(QString)), this, SLOT(onShowError(QString)));
+ connect(session.data(), SIGNAL(showInfo(QString)), this, SLOT(onShowError(QString)));
+ session.data()->initiate();
}
- mainWindow->clearEdit();
+ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) {
+ m_managerFullScreen->getMainWindow()->clearEdit();
+ }
}
void PolkitListener::onShowPrompt(const QString &prompt, bool echo)
{
qDebug() << "Prompt: " << prompt << "echo: " << echo;
-
- if(prompt == BIOMETRIC_PAM || prompt == BIOMETRIC_PAM_QRCODE) {
- mainWindow->setDoubleAuth(false);
- mainWindow->switchAuthMode(MainWindow::BIOMETRIC);
- }else if(prompt == BIOMETRIC_PAM_DOUBLE){
- mainWindow->setDoubleAuth(true);
- mainWindow->switchAuthMode(MainWindow::BIOMETRIC);
- //这时候不需要显示授权弹窗下一次收到prompt请求的时候再显示
+ if (!m_managerFullScreen || !m_managerFullScreen->getMainWindow()) {
return;
}
- else {
+ if (prompt == BIOMETRIC_PAM || prompt == BIOMETRIC_PAM_QRCODE) {
+ m_managerFullScreen->getMainWindow()->setDoubleAuth(false);
+ m_managerFullScreen->getMainWindow()->switchAuthMode(MainWindow::BIOMETRIC);
+ } else if (prompt == BIOMETRIC_PAM_DOUBLE) {
+ m_managerFullScreen->getMainWindow()->setDoubleAuth(true);
+ m_managerFullScreen->getMainWindow()->switchAuthMode(MainWindow::BIOMETRIC);
+ //这时候不需要显示授权弹窗下一次收到prompt请求的时候再显示
+ return;
+ } else {
unacknowledged_messages = false;
- mainWindow->switchAuthMode(MainWindow::PASSWORD);
- mainWindow->setPrompt(prompt, echo);
+ m_managerFullScreen->getMainWindow()->switchAuthMode(MainWindow::PASSWORD);
+ m_managerFullScreen->getMainWindow()->setPrompt(prompt, echo);
+ m_managerFullScreen->showDialog();
}
- mainWindow->setFixedSize(mainWindow->width(),mainWindow->height());
-
- /* set the position of the mainwindow */
- QPoint pos = QCursor::pos();
- QRect desScreenGeometry;
- for (QScreen *screen : qApp->screens()) {
- if (screen->geometry().contains(pos)) {
- desScreenGeometry = screen->geometry();
- }
- }
-
- if (desScreenGeometry.isEmpty()) {
- desScreenGeometry = qApp->primaryScreen()->geometry();
- }
-
- kdk::WindowManager::setGeometry(mainWindow->windowHandle(),
- QRect(desScreenGeometry.left() + (desScreenGeometry.width() - mainWindow->width())/2,
- desScreenGeometry.top() + (desScreenGeometry.height() - mainWindow->height())/2,
- mainWindow->width(), mainWindow->height()));
-
- mainWindow->show();
- // 重新开始认证不调整窗口位置
-// QPoint pos = QCursor::pos();
-// for(auto screen : QGuiApplication::screens())
-// {
-// if(screen->geometry().contains(pos))
-// {
-// mainWindow->move(screen->geometry().left() + (screen->geometry().width() - mainWindow->width()) / 2,
-// screen->geometry().top() + (screen->geometry().height() - mainWindow->height()) / 2);
-// }
-// }
-
- mainWindow->activateWindow();
}
//目前返回的pam错误就onShowErroronShowInfo两类
void PolkitListener::onShowError(const QString &text)
{
- qDebug() << "[Polkit]:" << "Error:" << text;
+ qDebug() << "[Polkit]:"
+ << "Error:" << text;
unacknowledged_messages = true;
- if(mainWindow){
- QString strText = mainWindow->check_is_pam_message(text);
- mainWindow->setMessage(strText);
+ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) {
+ QString strText = m_managerFullScreen->getMainWindow()->check_is_pam_message(text);
+ m_managerFullScreen->getMainWindow()->setMessage(strText);
}
}
void PolkitListener::onShowInfo(const QString &text)
{
- qDebug() << "[Polkit]:" << "Info:" << text;
+ qDebug() << "[Polkit]:"
+ << "Info:" << text;
unacknowledged_messages = true;
- if(mainWindow){
- QString strText = mainWindow->check_is_pam_message(text);
- mainWindow->setMessage(strText);
+ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) {
+ QString strText = m_managerFullScreen->getMainWindow()->check_is_pam_message(text);
+ m_managerFullScreen->getMainWindow()->setMessage(strText);
}
}
diff --git a/polkit-agent/src/PolkitListener.h b/polkit-agent/src/PolkitListener.h
index 850077c..4137f79 100644
--- a/polkit-agent/src/PolkitListener.h
+++ b/polkit-agent/src/PolkitListener.h
@@ -22,45 +22,47 @@
#include <QPointer>
#include "mainwindow.h"
+#include "fullscreenbackground.h"
using namespace PolkitQt1::Agent;
class PolkitListener : public Listener
{
- Q_OBJECT
+ Q_OBJECT
public:
- PolkitListener(QObject *parent = 0);
- virtual ~PolkitListener();
+ PolkitListener(QObject *parent = 0);
+ virtual ~PolkitListener();
private:
bool isSupportTableMode();
bool isMavis();
public slots:
- void initiateAuthentication(const QString &actionId,
- const QString &message,
- const QString &iconName,
- const PolkitQt1::Details &details,
- const QString &cookie,
- const PolkitQt1::Identity::List &identities,
- PolkitQt1::Agent::AsyncResult *result);
- bool initiateAuthenticationFinish();
- void cancelAuthentication();
- void finishObtainPrivilege();
-
+ void initiateAuthentication(
+ const QString &actionId,
+ const QString &message,
+ const QString &iconName,
+ const PolkitQt1::Details &details,
+ const QString &cookie,
+ const PolkitQt1::Identity::List &identities,
+ PolkitQt1::Agent::AsyncResult *result);
+ bool initiateAuthenticationFinish();
+ void cancelAuthentication();
+ void finishObtainPrivilege();
private:
- bool gainedAuthorization;
- bool wasCancelled;
- bool wasSwitchToBiometric;
+ bool gainedAuthorization = false;
+ bool wasCancelled = false;
+ bool wasSwitchToBiometric = false;
bool inProgress;
- int numTries;
+ int numTries;
+ QString implicitActiveStr;
QPointer<Session> session;
- PolkitQt1::Identity::List identities;
- PolkitQt1::Identity currentIdentity;
- PolkitQt1::Agent::AsyncResult *result;
- QString cookie;
- MainWindow *mainWindow;
+ PolkitQt1::Identity::List identities;
+ PolkitQt1::Identity currentIdentity;
+ PolkitQt1::Agent::AsyncResult *result;
+ QString cookie;
+ FullScreenBackground *m_managerFullScreen;
bool unacknowledged_messages = false;
bool m_isSupportTableMode = false;
bool m_isMavis = false;
diff --git a/polkit-agent/src/fullscreenbackground.cpp b/polkit-agent/src/fullscreenbackground.cpp
new file mode 100644
index 0000000..9bbaa3d
--- /dev/null
+++ b/polkit-agent/src/fullscreenbackground.cpp
@@ -0,0 +1,513 @@
+/*
+ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ **/
+#include "fullscreenbackground.h"
+#include "mainwindow.h"
+#include <unistd.h>
+#include <QDebug>
+#include <QImageReader>
+#include <QPixmap>
+#include <QApplication>
+#include <QScreen>
+#include <QCursor>
+#include <QTimer>
+#include <QDesktopWidget>
+#include <QPainter>
+#include <QPainterPath>
+#include <KWindowSystem>
+#include <windowmanager/windowmanager.h>
+
+using namespace kdk;
+
+#define PERSONALSIE_SCHEMA "org.mate.background"
+#define PERSONALSIE_TRAN_KEY "picture-filename"
+
+#define USD_MEDIA_KEYS_SCHEMA "org.ukui.SettingsDaemon.plugins.media-keys"
+#define USD_MEDIA_KEYS_WINDOW_SWTICH_KEY "ukuiWindowSwitch"
+#define USD_MEDIA_KEYS_WINDOW_SWTICH2_KEY "ukuiWindowSwitch2"
+
+FullScreenBackground::FullScreenBackground(QWidget *parent) : QWidget(parent)
+{
+ m_isWayland = QString(qgetenv("XDG_SESSION_TYPE")) == "wayland";
+ initUI();
+ initConnections();
+}
+
+FullScreenBackground::~FullScreenBackground()
+{
+ closeDialog();
+}
+
+void FullScreenBackground::initMainWindow(
+ const QString &strIconName,
+ const QString &strMsg,
+ const QStringList &listUsers,
+ const QString &subjectPid,
+ const QString &callerPid,
+ const PolkitQt1::ActionDescription &actionDesc,
+ const bool &isMavis,
+ const bool &isSupportTableMode)
+{
+ if (!m_wndMain) {
+ if (m_isWayland) {
+ m_wndMain = new MainWindow();
+ m_wndMain->setWindowFlags(windowFlags() | Qt::Tool | Qt::WindowStaysOnTopHint);
+ KWindowSystem::setState(m_wndMain->winId(), NET::State::KeepAbove | NET::State::SkipTaskbar);
+ } else {
+ m_wndMain = new MainWindow(this);
+ m_wndMain->setModal(true);
+ }
+ setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint);
+ m_wndMain->setWindowTitle(tr("Authentication"));
+ WindowManager::setSkipTaskBar(m_wndMain->windowHandle(), true);
+ m_wndMain->setIcon(strIconName);
+ m_wndMain->setCurProject(isMavis);
+ m_wndMain->setHeader(strMsg);
+ m_wndMain->setUsers(listUsers);
+ m_wndMain->setEditInputMethod(isSupportTableMode);
+ m_wndMain->setFixedSize(420, 337);
+ /*
+ *
+ mainWindow->setDetails(subjectPid, callerPid,
+ actionDesc.actionId(),
+ actionDesc.description(),
+ actionDesc.vendorName(),
+ actionDesc.vendorUrl());
+ */
+ connect(m_wndMain, &MainWindow::finished, this, [=](int nResult) {
+ qDebug() << "auth dialog finished:" << nResult;
+ });
+ }
+ if (m_isWayland) {
+ hide();
+ } else {
+ show();
+ }
+}
+
+void FullScreenBackground::initUI()
+{
+ setWindowTitle(tr("Authentication"));
+ if (m_isWayland) {
+ setAttribute(Qt::WA_TranslucentBackground);
+ setGeometry(0, 0, 0, 0);
+ } else {
+ setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
+ setWindowOpacity(0.25);
+ KWindowSystem::setState(winId(), NET::State::KeepAbove | NET::State::SkipTaskbar);
+ WindowManager::setSkipTaskBar(this->windowHandle(), true);
+ installEventFilter(this);
+
+ if (!isSupportCompositing()) {
+ m_pixmapBackground = getBackground();
+ }
+ setGeometry(0, 0, 7680, 4320);
+ }
+ qDebug() << "Window geometry:" << geometry();
+}
+
+void FullScreenBackground::initConnections()
+{
+ QDesktopWidget *desktop = QApplication::desktop();
+ if (desktop) {
+ connect(desktop, &QDesktopWidget::resized, this, &FullScreenBackground::onDesktopResized);
+ connect(desktop, &QDesktopWidget::workAreaResized, this, &FullScreenBackground::onWorkAreaResized);
+ connect(desktop, &QDesktopWidget::primaryScreenChanged, this, &FullScreenBackground::onPrimaryScreenChanged);
+ connect(desktop, &QDesktopWidget::screenCountChanged, this, &FullScreenBackground::onScreenCountChanged);
+ }
+}
+
+void FullScreenBackground::onScreenCountChanged(int)
+{
+ qDebug() << "onScreenCountChanged----";
+ if (m_isWayland) {
+ update();
+ moveToCursorScreen();
+ return;
+ }
+ QDesktopWidget *desktop = QApplication::desktop();
+ if ((desktop->geometry().x() != 0 || desktop->geometry().y() != 0) && this->geometry().contains(desktop->geometry())
+ && (QApplication::screens().count() == 1)) {
+ return;
+ }
+ if (desktop->geometry().height() > height() || desktop->geometry().width() > width()) {
+ setGeometry(
+ desktop->geometry().x(),
+ desktop->geometry().y(),
+ desktop->geometry().width() + 1,
+ desktop->geometry().height() + 1);
+ }
+
+ update();
+ moveToCursorScreen();
+ qDebug() << desktop->geometry();
+}
+
+void FullScreenBackground::onWorkAreaResized()
+{
+ qDebug() << "onWorkAreaResized----";
+ update();
+}
+
+void FullScreenBackground::onPrimaryScreenChanged()
+{
+ qDebug() << "onPrimaryScreenChanged----";
+ moveToCursorScreen();
+}
+
+void FullScreenBackground::onDesktopResized()
+{
+ qDebug() << "onDesktopResized----";
+ if (m_isWayland) {
+ update();
+ moveToCursorScreen();
+ return;
+ }
+ QDesktopWidget *desktop = QApplication::desktop();
+ if ((desktop->geometry().x() != 0 || desktop->geometry().y() != 0) && this->geometry().contains(desktop->geometry())
+ && (QGuiApplication::screens().count() == 1)) {
+ return;
+ }
+ if (desktop->geometry().height() > height() || desktop->geometry().width() > width()) {
+ setGeometry(
+ desktop->geometry().x(),
+ desktop->geometry().y(),
+ desktop->geometry().width() + 1,
+ desktop->geometry().height() + 1);
+ }
+
+ update();
+ moveToCursorScreen();
+ qDebug() << desktop->geometry();
+}
+
+void FullScreenBackground::showDialog()
+{
+ if (m_isFirstShow) {
+ m_isFirstShow = false;
+ blockSomeShortCut(true);
+ if (!m_isWayland) {
+ show();
+ }
+ if (m_wndMain) {
+ qDebug() << "DialogGeometry:" << m_wndMain->geometry();
+ m_wndMain->show();
+ m_wndMain->activateWindow();
+ // move auth dialog to cursor screen
+ moveToCursorScreen();
+ }
+ }
+}
+
+void FullScreenBackground::closeDialog()
+{
+ blockSomeShortCut(false);
+ if (m_wndMain) {
+ m_wndMain->hide();
+ m_wndMain->stopDoubleAuth();
+ m_wndMain->close();
+ m_wndMain->deleteLater();
+ m_wndMain = nullptr;
+ }
+}
+
+bool FullScreenBackground::isSupportCompositing()
+{
+ if (QString(qgetenv("XDG_SESSION_TYPE")) == "wayland") {
+ return true;
+ }
+ QDBusInterface kwinCompositor(
+ "org.ukui.KWin", "/Compositor", "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus());
+ QDBusReply<QDBusVariant> sessionReply = kwinCompositor.call("Get", "org.kde.kwin.Compositing", "compositingType");
+ if (!sessionReply.isValid()) {
+ qWarning() << sessionReply.error();
+ } else {
+ QString strType = sessionReply.value().variant().toString();
+ if (strType.isEmpty() || strType == "none")
+ return false;
+ }
+ return true;
+}
+
+QPixmap FullScreenBackground::getBackground()
+{
+ QPixmap pixmapBackground;
+ QString strPicName = "";
+
+ // 获取桌面壁纸路径
+ QGSettings *personalGSettings = nullptr;
+ if (QGSettings::isSchemaInstalled(PERSONALSIE_SCHEMA)) {
+ personalGSettings = new QGSettings(PERSONALSIE_SCHEMA, QByteArray(), this);
+ QStringList keys = personalGSettings->keys();
+ if (keys.contains(PERSONALSIE_TRAN_KEY)) {
+ strPicName = personalGSettings->get(PERSONALSIE_TRAN_KEY).toString();
+ }
+ delete personalGSettings;
+ personalGSettings = nullptr;
+ }
+
+ // 文件存在且可读则加载图片
+ QFileInfo fileInfo(strPicName);
+ if (fileInfo.exists() && fileInfo.isReadable()) {
+ // do nothing
+ } else {
+ strPicName = getAccountBackground();
+ }
+
+ if (!strPicName.isEmpty()) {
+ QImageReader reader;
+ reader.setFileName(strPicName);
+ reader.setAutoTransform(true);
+ reader.setDecideFormatFromContent(true);
+ pixmapBackground = QPixmap::fromImageReader(&reader);
+ }
+
+ return pixmapBackground;
+}
+
+QString FullScreenBackground::getAccountBackground()
+{
+ QString strTmpPicName = "/usr/share/backgrounds/ubuntukylin-default-settings.jpg";
+
+ uid_t uid = getuid();
+ QDBusInterface iface(
+ "org.freedesktop.Accounts",
+ "/org/freedesktop/Accounts",
+ "org.freedesktop.Accounts",
+ QDBusConnection::systemBus());
+
+ QDBusReply<QDBusObjectPath> userPath = iface.call("FindUserById", (qint64)uid);
+ if (!userPath.isValid()) {
+ return strTmpPicName;
+ } else {
+ QDBusInterface userIface(
+ "org.freedesktop.Accounts",
+ userPath.value().path(),
+ "org.freedesktop.DBus.Properties",
+ QDBusConnection::systemBus());
+ QDBusReply<QDBusVariant> backgroundReply
+ = userIface.call("Get", "org.freedesktop.Accounts.User", "BackgroundFile");
+ if (backgroundReply.isValid()) {
+ QString strPicName = backgroundReply.value().variant().toString();
+ if (!strPicName.isEmpty()) {
+ QFileInfo fileInfo(strPicName);
+ if (fileInfo.exists() && fileInfo.isReadable()) {
+ return strPicName;
+ }
+ }
+ }
+ }
+
+ return strTmpPicName;
+}
+
+void FullScreenBackground::moveToScreen(QScreen *screen)
+{
+ // 将主全屏更新到新屏幕上,并重新将对话框居中
+ if (!screen) {
+ return;
+ }
+
+ if (m_wndMain) {
+ QRect rectParent = screen->geometry();
+ QRect rectDes = QRect(
+ rectParent.x() + (rectParent.width() - m_wndMain->width()) / 2,
+ rectParent.y() + (rectParent.height() - m_wndMain->height()) / 2,
+ m_wndMain->width(),
+ m_wndMain->height());
+
+ WindowManager::setGeometry(m_wndMain->windowHandle(), rectDes);
+ qDebug() << "new rect:" << rectParent << "," << rectDes << "," << m_wndMain->geometry();
+ }
+}
+
+void FullScreenBackground::moveToCursorScreen()
+{
+ bool isFoundScreen = false;
+ if (m_isWayland) {
+ QString strCurScreen = WindowManager::currentOutputName();
+ for (auto screen : QApplication::screens()) {
+ qDebug() << "Screen:" << screen->name() << "," << screen->geometry();
+ if (screen && screen->name() == strCurScreen) {
+ isFoundScreen = true;
+ moveToScreen(screen);
+ break;
+ }
+ }
+ } else {
+ QPoint cursor = QCursor::pos();
+ for (auto screen : QApplication::screens()) {
+ qDebug() << "Screen:" << screen->name() << "," << screen->geometry();
+ if (screen && screen->geometry().contains(cursor)) {
+ isFoundScreen = true;
+ moveToScreen(screen);
+ break;
+ }
+ }
+ }
+ if (!isFoundScreen) {
+ if (QApplication::primaryScreen()) {
+ moveToScreen(QApplication::primaryScreen());
+ }
+ isFoundScreen = true;
+ }
+}
+
+void FullScreenBackground::paintEvent(QPaintEvent *event)
+{
+ if (!m_isWayland) {
+ for (auto screen : QApplication::screens()) {
+ QPainter painter(this);
+ if (!m_pixmapBackground.isNull()) {
+ painter.drawPixmap(screen->geometry(), m_pixmapBackground);
+ }
+ }
+ }
+ return QWidget::paintEvent(event);
+}
+
+void FullScreenBackground::closeEvent(QCloseEvent *event)
+{
+ qDebug() << "FullScreenBackground::closeEvent";
+ if (!m_isWayland) {
+ // 断开屏幕变化信号
+ QDesktopWidget *desktop = QApplication::desktop();
+ disconnect(desktop, &QDesktopWidget::resized, this, &FullScreenBackground::onDesktopResized);
+ disconnect(desktop, &QDesktopWidget::workAreaResized, this, &FullScreenBackground::onWorkAreaResized);
+ disconnect(desktop, &QDesktopWidget::primaryScreenChanged, this, &FullScreenBackground::onPrimaryScreenChanged);
+ disconnect(desktop, &QDesktopWidget::screenCountChanged, this, &FullScreenBackground::onScreenCountChanged);
+ }
+
+ return QWidget::closeEvent(event);
+}
+
+void FullScreenBackground::resizeEvent(QResizeEvent *event)
+{
+ Q_UNUSED(event);
+ qDebug() << "WndSize:" << this->size();
+}
+
+void FullScreenBackground::blockSomeShortCut(bool isBlock /* = false*/)
+{
+ static bool sIsBlocked = false;
+ if (sIsBlocked == isBlock) {
+ return;
+ }
+ QStringList listBlockShortCut = {
+ "Minimize All Window", // 最小化所有窗口
+ "Minimize Or Unminimize All Window Besides Active Window", // 最小化或还原非焦点窗口
+ "Multitask View show", // 显示工作区
+ "Show/Hide Desktop", // 显示/隐藏桌面
+ "ShowDesktopGrid", // Show Desktop Grid
+ "ShowMultitaskView", // Show Multitask View
+ "Switch One Desktop Down", // 切换到下面的桌面
+ "Switch One Desktop Up", // 切换到上面的桌面
+ "Switch One Desktop to the Left", // 切换到左边的工作区
+ "Switch One Desktop to the Right", // 切换到右边的工作区
+ "Switch to Desktop 1", // 切换到桌面 1
+ "Switch to Desktop 2", // 切换到桌面 2
+ "Switch to Desktop 3", // 切换到桌面 3
+ "Switch to Desktop 4", // 切换到桌面 4
+ "Switch to Next Screen", // 切换到下一屏幕
+ "Switch to Previous Screen", // 切换到上一个屏幕
+ "Toggle Window Raise/Lower", // 窗口置前或置后
+ "Unminimize All Window", // 还原所有最小化窗口
+ "Walk Through Desktop List", // 遍历桌面列表
+ "Walk Through Desktop List (Reverse)", // 遍历桌面列表(反向)
+ "Walk Through Desktops", // 遍历桌面
+ "Walk Through Desktops (Reverse)", // 遍历桌面(反向)
+ "Walk Through Windows", // 遍历窗口
+ "Walk Through Windows (Reverse)", // 遍历窗口(反向)
+ "Walk Through Windows Alternative", // 遍历窗口候选
+ "Walk Through Windows Alternative (Reverse)", // 遍历窗口候选(反向)
+ "Walk Through Windows of Current Application", // 遍历当前应用程序窗口
+ "Walk Through Windows of Current Application (Reverse)", // 遍历当前应用程序窗口(反向)
+ "Walk Through Windows of Current Application Alternative", // 遍历当前应用程序窗口候选
+ "Walk Through Windows of Current Application Alternative (Reverse)", // 遍历当前应用程序窗口候选(反向)
+ "Walk Through fullscreenWindows", // 遍历所有最大化或全屏窗口
+ "Window Lower", // 降低窗口
+ "Window Maximize", // 最大化窗口
+ "Window Maximize Horizontal", // 水平最大化窗口
+ "Window Maximize Vertical", // 垂直最大化窗口
+ "Window Minimize", // 最小化窗口
+ "Window On All Desktops", // 将窗口放到全部桌面
+ "Window One Desktop Down", // 窗口下移一个桌面
+ "Window One Desktop Up", // 窗口上移一个桌面
+ "Window One Desktop to the Left", // 窗口左移一个桌面
+ "Window One Desktop to the Right", // 窗口右移一个桌面
+ "Window Operations Menu", // 窗口操作菜单
+ "Window Quick Move And Maximize Left Screen", // 窗口快速移动并最大化到下一个屏幕
+ "Window Quick Move And Maximize Right Screen", // 窗口快速移动并最大化到上一个屏幕
+ "Window Quick Move Left Screen", // 窗口快速移动到下一个屏幕
+ "Window Quick Move Right Screen", // 窗口快速移动到上一个屏幕
+ "Window to Desktop 1", // 窗口到桌面 1
+ "Window to Desktop 2", // 窗口到桌面 2
+ "Window to Desktop 3", // 窗口到桌面 3
+ "Window to Desktop 4", // 窗口到桌面 4
+ "Window to Next Desktop", // 窗口到下一桌面
+ "Window to Next Screen", // 窗口到下一屏幕
+ "Window to Previous Desktop", // 窗口到前一桌面
+ "Window to Previous Screen", // 窗口到前一屏幕
+ "Window to Screen 0", // 窗口到屏幕 0
+ "Window to Screen 1", // 窗口到屏幕 1
+ "Window to Screen 2", // 窗口到屏幕 2
+ "Window to Screen 3", // 窗口到屏幕 3
+ "Window to Screen 4", // 窗口到屏幕 4
+ };
+ sIsBlocked = isBlock;
+ if (sIsBlocked) {
+ if (!m_isWayland) {
+ // kwin shortcut
+ QDBusInterface kwinInterface("org.ukui.KWin", "/KWin", "org.kde.KWin", QDBusConnection::sessionBus());
+ for (QString strShortCut : listBlockShortCut) {
+ QDBusMessage blockMessage = kwinInterface.call("blockShortcut", strShortCut, true);
+ if (blockMessage.type() == QDBusMessage::ErrorMessage) {
+ qWarning() << "Kwin dbus error:" << blockMessage.errorMessage();
+ break;
+ }
+ }
+ }
+
+ // usd shortcut
+ if (!m_usdBlockShortCut) {
+ m_usdBlockShortCut = new USDBlockShortCut(this);
+ }
+ } else {
+ if (!m_isWayland) {
+ // kwin shortcut
+ QDBusInterface kwinInterface("org.ukui.KWin", "/KWin", "org.kde.KWin", QDBusConnection::sessionBus());
+ for (QString strShortCut : listBlockShortCut) {
+ QDBusMessage blockMessage = kwinInterface.call("blockShortcut", strShortCut, false);
+ if (blockMessage.type() == QDBusMessage::ErrorMessage) {
+ qWarning() << "Kwin dbus error1:" << blockMessage.errorMessage();
+ break;
+ }
+ }
+ }
+
+ // usd shortcut
+ if (m_usdBlockShortCut) {
+ delete m_usdBlockShortCut;
+ m_usdBlockShortCut = nullptr;
+ }
+ }
+}
+
+bool FullScreenBackground::eventFilter(QObject *obj, QEvent *event)
+{
+ return QWidget::eventFilter(obj, event);
+}
diff --git a/polkit-agent/src/fullscreenbackground.h b/polkit-agent/src/fullscreenbackground.h
new file mode 100644
index 0000000..90c0665
--- /dev/null
+++ b/polkit-agent/src/fullscreenbackground.h
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ **/
+#ifndef FULLSCREENMANAGER_H
+#define FULLSCREENMANAGER_H
+
+#include <QWidget>
+#include <QList>
+#include <QPair>
+#include <QRect>
+#include <PolkitQt1/ActionDescription>
+#include <QPixmap>
+#include <QScreen>
+#include "usdblockshortcut.h"
+
+class MainWindow;
+class FullScreenBackground : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit FullScreenBackground(QWidget *parent = nullptr);
+ virtual ~FullScreenBackground();
+
+ /**
+ * @brief getMainWindow 获取认证对话框
+ * @return 认证对话框指针
+ */
+ inline MainWindow *getMainWindow()
+ {
+ return m_wndMain;
+ }
+
+ /**
+ * @brief initMainWindow 初始化认证对话框
+ * @param strIconName 认证图标名称
+ * @param strMsg 认证消息
+ * @param listUsers 认证用户列表
+ * @param subjectPid 项目进程号
+ * @param callerPid 调用者进程号
+ * @param actionDesc 动作描述
+ * @param isMavis 是否为mavis平台
+ * @param isSupportTableMode 是否支持平板模式
+ */
+ void initMainWindow(
+ const QString &strIconName,
+ const QString &strMsg,
+ const QStringList &listUsers,
+ const QString &subjectPid,
+ const QString &callerPid,
+ const PolkitQt1::ActionDescription &actionDesc,
+ const bool &isMavis,
+ const bool &isSupportTableMode);
+
+ /**
+ * @brief showDialog 显示认证对话框
+ */
+ void showDialog();
+
+ /**
+ * @brief closeDialog 关闭认证对话框
+ */
+ void closeDialog();
+
+protected:
+ /**
+ * @brief paintEvent 绘制事件处理
+ * @param event 事件指针
+ */
+ void paintEvent(QPaintEvent *event);
+
+ /**
+ * @brief closeEvent 窗口关闭事件处理
+ * @param event 事件指针
+ */
+ void closeEvent(QCloseEvent *event);
+
+ /**
+ * @brief resizeEvent 窗口大小改变事件处理
+ * @param event 事件指针
+ */
+ void resizeEvent(QResizeEvent *event);
+
+ bool eventFilter(QObject *obj, QEvent *event);
+
+private Q_SLOTS:
+ /**
+ * @brief onScreenCountChanged 屏幕数变化处理
+ */
+ void onScreenCountChanged(int);
+
+ /**
+ * @brief onDesktopResized 桌面大小变化处理
+ */
+ void onDesktopResized();
+
+ /**
+ * @brief onPrimaryScreenChanged 主屏变化处理
+ */
+ void onPrimaryScreenChanged();
+
+ /**
+ * @brief onWorkAreaResized 工作区大小变化处理
+ */
+ void onWorkAreaResized();
+
+private:
+ /**
+ * @brief initUI 初始化UI
+ */
+ void initUI();
+
+ /**
+ * @brief initConnections 初始化信号槽连接
+ */
+ void initConnections();
+ /**
+ * @brief isSupportCompositing 是否支持窗口复合
+ * @return true 支持,否则不支持
+ */
+ bool isSupportCompositing();
+
+ /**
+ * @brief getBackground 获取背景
+ * @return 背景pixmap
+ */
+ QPixmap getBackground();
+
+ /**
+ * @brief getAccountBackground 获取账户背景
+ * @return 背景路径
+ */
+ QString getAccountBackground();
+
+ /**
+ * @brief moveToScreen 移动认证弹窗到指定屏幕
+ * @param screen 屏幕信息指针
+ */
+ void moveToScreen(QScreen *screen);
+
+ /**
+ * @brief moveToCursorScreen 移动认证窗口到光标屏幕
+ */
+ void moveToCursorScreen();
+
+ /**
+ * @brief blockSomeShortCut 禁启用快捷键
+ * @param isBlock 是否为禁用
+ */
+ void blockSomeShortCut(bool isBlock = false);
+
+private:
+ MainWindow *m_wndMain = nullptr; // 认证对话框
+ QPixmap m_pixmapBackground; // 背景图
+ bool m_isFirstShow = true; // 第一次显示才主动移动对话框居中
+ USDBlockShortCut *m_usdBlockShortCut = nullptr; // usd禁启用快捷键实例
+ bool m_isWayland = false;
+};
+
+#endif // FULLSCREENMANAGER_H
diff --git a/polkit-agent/src/kalabel.cpp b/polkit-agent/src/kalabel.cpp
index a74f9da..9f14c79 100644
--- a/polkit-agent/src/kalabel.cpp
+++ b/polkit-agent/src/kalabel.cpp
@@ -17,15 +17,12 @@
**/
#include "kalabel.h"
-
-KALabel::KALabel(QWidget *parent)
- : QLabel(parent)
+KALabel::KALabel(QWidget *parent) : QLabel(parent)
{
m_strText = "";
}
-KALabel::KALabel(QString strText, QWidget *parent)
- : QLabel(strText, parent)
+KALabel::KALabel(QString strText, QWidget *parent) : QLabel(strText, parent)
{
m_strText = strText;
}
@@ -38,7 +35,7 @@ void KALabel::setText(const QString &strText)
void KALabel::paintEvent(QPaintEvent *event)
{
- QString strEText = getElidedText(font(), width() ,m_strText);
+ QString strEText = getElidedText(font(), width(), m_strText);
if (strEText != m_strText) {
QLabel::setText(strEText);
setToolTip(m_strText);
@@ -49,13 +46,12 @@ void KALabel::paintEvent(QPaintEvent *event)
QLabel::paintEvent(event);
}
-QString KALabel::getElidedText(QFont font,int width,QString strInfo)
+QString KALabel::getElidedText(QFont font, int width, QString strInfo)
{
QFontMetrics fontMetrics(font);
//如果当前字体下,字符串长度大于指定宽度
- if(fontMetrics.width(strInfo) > width)
- {
- strInfo= QFontMetrics(font).elidedText(strInfo, Qt::ElideRight, width);
+ if (fontMetrics.width(strInfo) > width) {
+ strInfo = QFontMetrics(font).elidedText(strInfo, Qt::ElideRight, width);
}
return strInfo;
}
diff --git a/polkit-agent/src/kalabel.h b/polkit-agent/src/kalabel.h
index 8fc9b53..7ee60cb 100644
--- a/polkit-agent/src/kalabel.h
+++ b/polkit-agent/src/kalabel.h
@@ -26,7 +26,8 @@ class KALabel : public QLabel
public:
KALabel(QWidget *parent = nullptr);
KALabel(QString strText, QWidget *parent = nullptr);
- QString getElidedText(QFont font,int width,QString strInfo);
+ QString getElidedText(QFont font, int width, QString strInfo);
+
public slots:
void setText(const QString &);
diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp
index 74a0730..1a99b89 100644
--- a/polkit-agent/src/mainwindow.cpp
+++ b/polkit-agent/src/mainwindow.cpp
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
-**/
+ *
+ **/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMovie>
@@ -44,58 +44,38 @@
#include "biotypes.h"
#include "modeButton.h"
#include <QDebug>
+#include <windowmanager/windowmanager.h>
#define _(string) gettext(string)
extern void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed);
-MainWindow::MainWindow(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::MainWindow),
- users(new Users(this)),
- enableBioAuth(false),
- receiveBioPAM(false),
- authMode(UNDEFINED),
- useDoubleAuth(false),
- m_timer(nullptr),
- w_timer(nullptr),
- isLockingFlg(false),
- m_nCurLockMin(0),
- isbioSuccess(false)
+MainWindow::MainWindow(QWidget *parent)
+ : kdk::KDialog(parent)
+ , ui(new Ui::MainWindow)
+ , users(new Users(this))
+ , enableBioAuth(false)
+ , receiveBioPAM(false)
+ , authMode(UNDEFINED)
+ , useDoubleAuth(false)
+ , m_timer(nullptr)
+ , w_timer(nullptr)
+ , isLockingFlg(false)
+ , m_nCurLockMin(0)
+ , isbioSuccess(false)
{
- setWindowFlags(Qt::Tool | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint);
ui->setupUi(this);
- setWindowTitle(tr("Authentication"));
+ mainLayout()->addLayout(ui->verticalLayout_2);
pam_tally_init(); //
-// headerLayout = new QHBoxLayout();
-// headerLayout->setContentsMargins(8,0,8,0);
-// headerLayout->setSpacing(8);
-// logoLabel = new QLabel();
-// logoLabel->setPixmap(QIcon::fromTheme("ukui-polkit").pixmap(QSize(24,24)));
-// headerLayout->addWidget(logoLabel);
-// titleLabel = new QLabel();
-// titleLabel->setText(tr("Authenticate"));
-// headerLayout->addWidget(titleLabel);
-// ui->headerWidget->setLayout(headerLayout);
-// headerLayout->addStretch();
-// closeBtn = new QPushButton();
-// closeBtn->setFixedSize(30, 30);
-// closeBtn->setToolTip(tr("Close"));
-// closeBtn->setProperty("isWindowButton", 0x02);
-// closeBtn->setProperty("useIconHighlightEffect", 0x08);
-// closeBtn->setFlat(true);
-// closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic"));
-// connect(closeBtn, &QPushButton::clicked, this, &MainWindow::close);
-// headerLayout->addWidget(closeBtn);
-
// 登录选项
m_labelTip = new KALabel();
m_labelTip->setText("");
+ m_labelTip->setFixedHeight(30);
m_labelTip->hide();
m_loginOptsWidget = new LoginOptionsWidget();
m_loginOptsWidget->hide();
ui->titleTipLayout->addWidget(m_labelTip);
- ui->loginOptionsLayout->setAlignment(Qt::AlignTop|Qt::AlignCenter);
+ ui->loginOptionsLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
ui->loginOptionsLayout->addWidget(m_loginOptsWidget);
ui->loadingUkeyWidget->adjustSize();
ui->loadingUkeyWidget->hide();
@@ -103,174 +83,19 @@ MainWindow::MainWindow(QWidget *parent) :
ui->loadingUkeyBtn->setAttribute(Qt::WA_TransparentForMouseEvents, true);
ui->ukeyPassword->setEchoMode(QLineEdit::Password);
ui->loadingUkeyLbl->setText(tr("Insert the ukey into the USB port"));
- ui->loadingUkeyLbl->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
+ ui->loadingUkeyLbl->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
ui->ukeyTipLbl->setText(tr("Enter the ukey password"));
ui->ukeyPassword->setPlaceholderText(tr("Input Password"));
+ ui->btnCancel->setAutoDefault(false);
+ ui->btnCancel->setDefault(false);
maxFailedTimes = bioDevices.getFailedTimes();
isHiddenSwitchButton = bioDevices.GetHiddenSwitchButton();
+ closeButton()->setToolTip(tr("Close"));
- connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected,
- this, [&](unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo){
- isLoadingUkey = false;
-
- if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){
- stopLoadingUkey();
- }
-
- if(uCurLoginOptType == LOGINOPT_TYPE_PASSWORD){
- switchLoginOptType(uCurLoginOptType);
- if(m_loginOptsWidget){
- m_loginOptsWidget->stopAuth();
- }
- m_deviceInfo = nullptr;
- authMode = PASSWORD;
- emit restartAuth();
- return;
- }
-
- if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo)
- return;
-
- if(deviceInfo)
- qDebug() << "device changed: " << deviceInfo->biotype;
-
- if(deviceInfo && m_failMap[getUid(userName)][deviceInfo->device_id] >= maxFailedTimes){
- qDebug() << "Failed MAX!!";
- return ;
- }
-
- if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo){
- isLoadingUkey = true;
- startLoadingUkey();
- m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY);
- }else if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo){
- stopLoadingUkey();
- m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY);
- }
-
- if (deviceInfo == m_deviceInfo) {
- return;
- }
-
- if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo == m_deviceInfo) {
- return ;
- }
-
- if(m_bioTimer)
- m_bioTimer->stop();
-
- m_deviceInfo = deviceInfo;
- switchLoginOptType(uCurLoginOptType);
- if(!isbioSuccess && m_deviceInfo) {
- startBioAuth();
- }
- });
-
- connect(m_loginOptsWidget, &LoginOptionsWidget::notifyOptionsChange,
- this, [&](unsigned uOptionsCount){
- if (uOptionsCount > 0) {
- m_loginOptsWidget->show();
- } else {
- //m_loginOptsWidget->hide();
- }
-
- if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- stopLoadingUkey();
- }
-
- if (!m_deviceInfo || !m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)
- || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) {
- m_loginOptsWidget->stopAuth();
- if (authMode != UNDEFINED) {
- authMode = UNDEFINED;
- emit switchToBiometric();
- }
- }
- });
-
- connect(m_loginOptsWidget, &LoginOptionsWidget::authComplete,
- this, [&](uid_t uid, bool ret, int nStatus){
- qDebug() << "biometric authentication complete: " << uid << ret << nStatus;
-
- if(m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY && ui->widgetUkeyAuth->isVisible()){
- ui->ukeyPassword->setText("");
- }
-
- if(uid == getUid(userName) && ret) {
- isbioSuccess = true;
- emit switchToBiometric();
- authMode = UNDEFINED;
- } else {
- if (nStatus == 5 && m_deviceInfo) {
- if(w_timer && w_timer->isActive())
- w_timer->stop();
- QImage imgFailed;
- m_loginOptsWidget->setFaceImg(imgFailed, 2);
- return;
- } else if (nStatus >= 2 && nStatus != 5)if (nStatus >= 2) {
- if (m_deviceInfo) {
- uid_t curUid = getUid(userName);
- if(m_failMap.contains(curUid) && m_failMap[curUid].contains(m_deviceInfo->device_id)){
- m_failMap[curUid][m_deviceInfo->device_id] = m_failMap[curUid][m_deviceInfo->device_id] + 1;
- }else{
- m_failMap[curUid][m_deviceInfo->device_id] = 1;
- }
- qDebug()<<"Failed count:"<<m_failMap[curUid][m_deviceInfo->device_id]<<",Max:"<<maxFailedTimes;
- if (m_deviceInfo->biotype == BIOTYPE_FACE) {
- QImage imgFailed;
- m_loginOptsWidget->setFaceImg(imgFailed, 1);
- }
- if(m_failMap[curUid][m_deviceInfo->device_id] >= maxFailedTimes){
- no_changes = true;
- if (m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) {
- setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
- QImage nullImage;
- m_loginOptsWidget->setQRCode(nullImage);
- } else if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- ui->ukeyPassword->setReadOnly(true);
- setUkeyTypeTip(tr("Unable to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
- }else {
- setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
- }
-
- m_loginOptsWidget->setDeviceDisable(m_deviceInfo->device_id, true);
- useDoubleAuth = false;
- return ;
- }
- no_changes = false;
- if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- setUkeyTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities")
- .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))
- .arg(maxFailedTimes-m_failMap[curUid][m_deviceInfo->device_id]));
- }else{
- setLoginTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities")
- .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))
- .arg(maxFailedTimes-m_failMap[curUid][m_deviceInfo->device_id]));
- }
- }
- }
- if(!isbioSuccess) {
- // dbus error
- if (nStatus == -1) {
- qDebug()<<"Biometric dbus error:"<<authMode;
- }
- if (m_uCurLoginOptType == LOGINOPT_TYPE_QRCODE && nStatus == 1) {
- m_isNetworkErr = true;
- m_loginOptsWidget->setQRCodeMsg(tr("Abnormal network"));
- startBioAuth(10000);
- } else {
- startBioAuth();
- }
- if (nStatus >= 2 && m_deviceInfo) {
- if (m_deviceInfo->biotype == BIOTYPE_FACE) {
- QImage imgFailed;
- m_loginOptsWidget->setFaceImg(imgFailed, 1);
- }
- }
- }
- }
- });
-
+ // 连接登录选项信号响应槽
+ connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected, this, &MainWindow::onOptionSelected);
+ connect(m_loginOptsWidget, &LoginOptionsWidget::notifyOptionsChange, this, &MainWindow::onNotifyOptionsChanged);
+ connect(m_loginOptsWidget, &LoginOptionsWidget::authComplete, this, &MainWindow::onLoginOptionsAuthCompleted);
connect(m_loginOptsWidget, &LoginOptionsWidget::updateAuthMsg, this, &MainWindow::onUpdateBioAuthMsg);
connect(m_loginOptsWidget, &LoginOptionsWidget::updateWndSize, this, &MainWindow::onUpdateWndSize);
@@ -279,36 +104,29 @@ MainWindow::MainWindow(QWidget *parent) :
setStyleSheet(qssFile.readAll());
qssFile.close();
- //ui->cmbUsers->hide();
- //ui->widgetDetails->hide();
- //ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_right.svg"));
- //ui->btnDetails->hide();
ui->lePassword->installEventFilter(this);
+ // 初始化UI状态
switchWidget(UNDEFINED);
editIcon();
ui->lblContent->adjustSize();
- ui->lblContent->height();
- ui->lblMessage->adjustSize();
+ ui->lblContent->hide();
+ ui->lblMessage->setFixedSize(372, 30);
ui->widgetPasswdAuth->adjustSize();
ui->widgetUkeyAuth->adjustSize();
- ui->lblMessage->height();
ui->cmbUsers->view()->setTextElideMode(Qt::ElideRight);
-
- settings = new QGSettings("org.ukui.style","",this);
- fontSize = settings->get("system-font-size").toInt();
- connect(settings, &QGSettings::changed,
- this, &MainWindow::onConfigurationChanged);
-
- QDBusInterface *interfaceScreensaver = new QDBusInterface(
- "org.ukui.ScreenSaver",
- "/",
- "org.ukui.ScreenSaver",
- QDBusConnection::sessionBus());
- connect(interfaceScreensaver, SIGNAL(lock()),
- this, SLOT(onLockStatus()));
- connect(interfaceScreensaver, SIGNAL(unlock()),
- this, SLOT(onUnlockStatus()));
-
+ ui->cmbUsers->setFixedHeight(36);
+ ui->lePassword->setFixedHeight(36);
+ ui->btnBioAuth->hide();
+ ui->returnButton->hide();
+
+ settings = new QGSettings("org.ukui.style", "", this);
+ fontSize = settings->get("system-font-size").toInt();
+ connect(settings, &QGSettings::changed, this, &MainWindow::onConfigurationChanged);
+
+ QDBusInterface *interfaceScreensaver
+ = new QDBusInterface("org.ukui.ScreenSaver", "/", "org.ukui.ScreenSaver", QDBusConnection::sessionBus());
+ connect(interfaceScreensaver, SIGNAL(lock()), this, SLOT(onLockStatus()));
+ connect(interfaceScreensaver, SIGNAL(unlock()), this, SLOT(onUnlockStatus()));
}
MainWindow::~MainWindow()
@@ -318,19 +136,31 @@ MainWindow::~MainWindow()
void MainWindow::onConfigurationChanged(QString key)
{
- if(key == "systemFontSize"){
+ if (key == "systemFontSize") {
m_loginOptsWidget->updateUIStatus(false);
- fontSize = settings->get("system-font-size").toInt();
+ fontSize = settings->get("system-font-size").toInt();
}
- if(key == "iconThemeName") {
+ if (key == "iconThemeName") {
setIcon(app_IconName);
}
+ if (key == "styleName") {
+ QPalette pe;
+ if (no_changes) {
+ pe.setColor(QPalette::WindowText, Qt::red);
+ m_labelTip->setPalette(pe);
+ } else {
+ QColor color = palette().color(QPalette::WindowText);
+ QPalette pal(this->palette());
+ pal.setColor(QPalette::WindowText, QColor(color));
+ m_labelTip->setPalette(pal);
+ }
+ }
}
void MainWindow::restart_bio_identify()
{
DeviceInfoPtr device = bioDevices.getDefaultDevice(getUid(userName));
- if(device){
+ if (device) {
m_loginOptsWidget->startAuth(device, getUid(userName));
setMessage(tr("Please enter your password or enroll your fingerprint "));
}
@@ -338,21 +168,20 @@ void MainWindow::restart_bio_identify()
void MainWindow::closeEvent(QCloseEvent *event)
{
- m_loginOptsWidget->stopAuth();
+ if (m_loginOptsWidget) {
+ m_loginOptsWidget->stopAuth();
+ }
m_failMap.clear();
emit canceled();
-
- return QWidget::closeEvent(event);
+ return kdk::KDialog::closeEvent(event);
}
void MainWindow::setUkeyTypeTip(QString text)
{
QString textTip = text;
if (!textTip.isEmpty()) {
-// QFontMetrics font(m_ukeyMessageLabel->font());
-// QString textTip = font.elidedText(textTip, Qt::ElideRight, m_messageLabel->width()-8);
QPalette pe;
- pe.setColor(QPalette::WindowText,Qt::red);
+ pe.setColor(QPalette::WindowText, Qt::red);
ui->ukeyMessage->setPalette(pe);
ui->ukeyMessage->setText(textTip);
ui->ukeyMessage->setToolTip(text);
@@ -364,7 +193,7 @@ void MainWindow::setUkeyTypeTip(QString text)
void MainWindow::startLoadingUkey()
{
- m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27);
+ m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27, 27);
ui->loadingUkeyBtn->setIcon(m_loadingPixmap);
ui->loadingUkeyBtn->setIconSize(QSize(27, 27));
@@ -378,8 +207,7 @@ void MainWindow::startLoadingUkey()
isLoadingUkey = true;
ui->loadingUkeyWidget->show();
- if(!m_loadingTimer)
- {
+ if (!m_loadingTimer) {
m_loadingTimer = new QTimer(this);
m_loadingTimer->setInterval(150);
connect(m_loadingTimer, &QTimer::timeout, this, &MainWindow::updateLoadingPixmap);
@@ -390,13 +218,13 @@ void MainWindow::startLoadingUkey()
void MainWindow::stopLoadingUkey()
{
isLoadingUkey = false;
- if(m_loadingTimer){
+ if (m_loadingTimer) {
m_loadingTimer->stop();
}
ui->loadingUkeyWidget->hide();
- //ui->cmbUsers->show();
- //ui->widgetUkeyAuth->show();
+ // ui->cmbUsers->show();
+ // ui->widgetUkeyAuth->show();
}
void MainWindow::updateLoadingPixmap()
@@ -409,20 +237,19 @@ void MainWindow::updateLoadingPixmap()
void MainWindow::paintEvent(QPaintEvent *event)
{
-
Q_UNUSED(event);
QStyleOption *option = new QStyleOption();
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
QPainterPath rectPath;
- rectPath.addRoundedRect(this->rect().adjusted(0,0,0,0),0,0);
+ rectPath.addRoundedRect(this->rect().adjusted(0, 0, 0, 0), 0, 0);
// 画一个黑底
QPixmap pixmap(this->rect().size());
pixmap.fill(Qt::transparent);
QPainter pixmapPainter(&pixmap);
pixmapPainter.setRenderHint(QPainter::Antialiasing);
pixmapPainter.setPen(Qt::transparent);
- pixmapPainter.setBrush(QColor(0,0,0,100));
+ pixmapPainter.setBrush(QColor(0, 0, 0, 100));
pixmapPainter.drawPath(rectPath);
pixmapPainter.end();
@@ -444,34 +271,49 @@ void MainWindow::paintEvent(QPaintEvent *event)
// 绘制一个背景
p.save();
- p.fillPath(rectPath,option->palette.color(QPalette::Base));
+ p.fillPath(rectPath, option->palette.color(QPalette::Base));
p.restore();
- //绘制一个矩形
-
- p.setPen(Qt::red);
- QRectF rect(0,290,20,20);
-
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
- if(obj == ui->lePassword){
- if(event->type() == QEvent::KeyPress){ //禁止复制粘贴功能。
+ if (obj == ui->lePassword) {
+ if (event->type() == QEvent::KeyPress) { // 禁止复制粘贴功能。
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
- if(keyEvent->matches(QKeySequence::Copy) || keyEvent->matches(QKeySequence::Cut) || keyEvent->matches(QKeySequence::Paste)){
+ if (keyEvent->matches(QKeySequence::Copy) || keyEvent->matches(QKeySequence::Cut)
+ || keyEvent->matches(QKeySequence::Paste)) {
event->ignore();
return true;
}
}
- if(event->type() == QEvent::MouseButtonRelease) { //禁用鼠标中键
- QMouseEvent *mouseevent = static_cast<QMouseEvent*>(event);
- if(mouseevent->button() == Qt::MidButton){
+ if (event->type() == QEvent::MouseButtonRelease) { // 禁用鼠标中键
+ QMouseEvent *mouseevent = static_cast<QMouseEvent *>(event);
+ if (mouseevent->button() == Qt::MidButton) {
event->ignore();
return true;
}
}
+ } else if (obj == this) {
+ if (event->type() == QEvent::Show || event->type() == QEvent::UpdateRequest) {
+ if (QString(qgetenv("XDG_SESSION_TYPE")) == "wayland") {
+ WindowManager::setWindowLayer(this->windowHandle(), (kdk::WindowLayer)15);
+ }
+ }
+ }
+ return kdk::KDialog::eventFilter(obj, event);
+}
+
+void MainWindow::keyPressEvent(QKeyEvent *event)
+{
+ switch (event->key()) {
+ case Qt::Key_Escape: {
+ break;
+ }
+ default: {
+ kdk::KDialog::keyPressEvent(event);
+ break;
+ }
}
- return false;
}
/*** main ***/
@@ -479,14 +321,14 @@ void MainWindow::on_cmbUsers_currentTextChanged(const QString &userName)
{
qDebug() << "user changed to " << userName;
m_loginOptsWidget->stopAuth();
- if(m_bioTimer && m_bioTimer->isActive())
+ if (m_bioTimer && m_bioTimer->isActive())
m_bioTimer->stop();
- authMode=UNDEFINED;
+ authMode = UNDEFINED;
QList<UserItem> accountUsers = users->getUsers();
this->userName = userName;
- for(UserItem user:accountUsers){
- if(user.realName == userName){
+ for (UserItem user : accountUsers) {
+ if (user.realName == userName) {
this->userName = user.name;
}
}
@@ -506,36 +348,35 @@ int MainWindow::enable_biometric_authentication()
char line[1024], is_enable[16];
int i;
-
- if((file = fopen(conf_file, "r")) == NULL){
+ if ((file = fopen(conf_file, "r")) == NULL) {
return 0;
}
- while(fgets(line, sizeof(line), file)) {
- i = sscanf(line, "EnableAuth=%s\n", is_enable);
- if(i > 0) {
+ while (fgets(line, sizeof(line), file)) {
+ i = sscanf(line, "EnableAuth=%s\n", is_enable);
+ if (i > 0) {
break;
}
}
fclose(file);
- if(!strcmp(is_enable, "true"))
+ if (!strcmp(is_enable, "true"))
return 1;
return 0;
}
void MainWindow::on_btnDetails_clicked()
-{/*
- if(ui->widgetDetails->isHidden()) {
- ui->widgetDetails->show();
- ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_down.svg"));
-// resize(width(), height() + ui->widgetDetails->height());
- }
- else {
- ui->widgetDetails->hide();
- ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_right.svg"));
-// resize(width(), height() - ui->widgetDetails->height());
- }
- adjustSize();*/
+{ /*
+ if(ui->widgetDetails->isHidden()) {
+ ui->widgetDetails->show();
+ ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_down.svg"));
+ // resize(width(), height() + ui->widgetDetails->height());
+ }
+ else {
+ ui->widgetDetails->hide();
+ ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_right.svg"));
+ // resize(width(), height() - ui->widgetDetails->height());
+ }
+ adjustSize();*/
}
void MainWindow::on_btnCancel_clicked()
@@ -545,22 +386,37 @@ void MainWindow::on_btnCancel_clicked()
void MainWindow::on_btnAuth_clicked()
{
- if(ui->widgetUkeyAuth->isVisible()){
+ if (doNotNeedAuth) {
+ emit yesPrompted();
+ return;
+ }
+
+ if (ui->widgetUkeyAuth->isVisible()) {
on_ukeyPassword_returnPressed();
- }else{
+ } else {
on_lePassword_returnPressed();
}
}
+void MainWindow::onShowYesPrompt()
+{
+ doNotNeedAuth = true;
+ ui->widgetPasswdAuth->hide();
+ ui->cmbUsers->hide();
+ ui->btnBioAuth->hide();
+ ui->returnButton->hide();
+ ui->btnAuth->show();
+}
+
void MainWindow::onLockStatus()
{
- //m_loginOptsWidget->stopAuth();
+ // m_loginOptsWidget->stopAuth();
m_loginOptsWidget->lockStatusChanged(true);
}
void MainWindow::onUnlockStatus()
{
- //m_loginOptsWidget->readDevicesInfo();
+ // m_loginOptsWidget->readDevicesInfo();
m_loginOptsWidget->lockStatusChanged(false);
startBioAuth();
}
@@ -570,7 +426,7 @@ void MainWindow::editIcon()
{
m_modeButton = new ModeButton(ui->lePassword);
m_modeButton->setFocusPolicy(Qt::NoFocus);
- connect(m_modeButton, &QPushButton::clicked, this, [=](){
+ connect(m_modeButton, &QPushButton::clicked, this, [=]() {
if (ui->lePassword->echoMode() == QLineEdit::Password) {
ui->lePassword->setEchoMode(QLineEdit::Normal);
} else {
@@ -580,15 +436,15 @@ void MainWindow::editIcon()
QHBoxLayout *layout = new QHBoxLayout(ui->lePassword);
layout->addStretch();
layout->addWidget(m_modeButton);
- layout->setContentsMargins(0,0,8,0);
+ layout->setContentsMargins(0, 0, 8, 0);
- ui->lePassword->setTextMargins(1, 1, 4+ m_modeButton->width(), 1);
+ ui->lePassword->setTextMargins(1, 1, 4 + m_modeButton->width(), 1);
}
void MainWindow::on_ukeyPassword_returnPressed()
{
- if(m_loginOptsWidget && m_deviceInfo){
- m_loginOptsWidget->SetExtraInfo(ui->ukeyPassword->text(),"pincode");
+ if (m_loginOptsWidget && m_deviceInfo) {
+ m_loginOptsWidget->SetExtraInfo(ui->ukeyPassword->text(), "pincode");
m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName));
}
}
@@ -598,8 +454,7 @@ void MainWindow::on_lePassword_returnPressed()
emit accept(ui->lePassword->text());
ui->btnAuth->hide();
ui->btnLoading->show();
- if(!w_timer)
- {
+ if (!w_timer) {
w_timer = new QTimer(this);
w_timer->setInterval(150);
connect(w_timer, &QTimer::timeout, this, &MainWindow::updatePixmap);
@@ -625,20 +480,19 @@ void MainWindow::on_returnButton_clicked()
}
/*** end of control's slot ***/
-
/*** public member ***/
void MainWindow::setIcon(const QString &iconName)
{
-// QIcon::setThemeName("ukui-icon-theme");
+ // QIcon::setThemeName("ukui-icon-theme");
app_IconName = iconName;
- if(!QIcon::hasThemeIcon("ukui-polkit")) {
+ if (!QIcon::hasThemeIcon("ukui-polkit")) {
QDir iconsDir("/usr/share/icons");
auto themesList = iconsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
qDebug() << themesList;
- for(auto theme : themesList) {
+ for (auto theme : themesList) {
QIcon::setThemeName(theme);
- if(QIcon::hasThemeIcon("ukui-polkit")) {
+ if (QIcon::hasThemeIcon("ukui-polkit")) {
qDebug() << theme << "has ukui-polkit icon";
break;
}
@@ -649,25 +503,22 @@ void MainWindow::setIcon(const QString &iconName)
QPainter painter;
painter.begin(&icon);
- QRect rect(32,
- 32,
- 32, 32);
+ QRect rect(32, 32, 32, 32);
painter.drawPixmap(rect, actionIcon);
painter.end();
setWindowIcon(icon);
- //ui->lblIcon->setPixmap(icon);
+ // ui->lblIcon->setPixmap(icon);
}
void MainWindow::setHeader(const QString &text)
{
- if(is_Mavis)
+ if (is_Mavis)
ui->lblHeader->setText(tr("This operation requires the administrator's authorization. "
- "Please enter your password to allow this operation."));
+ "Please enter your password to allow this operation."));
else
ui->lblHeader->setText(text);
ui->lblHeader->adjustSize();
- ui->lblHeader->height();
ui->lblContent->setText(tr("A program is attempting to perform an action that requires privileges."
"It requires authorization to perform the action."));
ui->lblContent->adjustSize();
@@ -675,24 +526,24 @@ void MainWindow::setHeader(const QString &text)
void MainWindow::setUsers(const QStringList &usersList)
{
- if(usersList.isEmpty())
+ if (usersList.isEmpty())
return;
- if(usersList.size() == 1) {
+ if (usersList.size() == 1) {
UserItem user = users->getUserByName(usersList.at(0));
- if(user.realName != ""){
+ if (user.realName != "") {
userName = user.realName;
- }else{
+ } else {
userName = usersList.at(0);
}
}
QList<UserItem> accountUsers = users->getUsers();
- for(QString identifyUser:usersList){
+ for (QString identifyUser : usersList) {
bool isFoundAccount = false;
- for(UserItem user:accountUsers){
- if(identifyUser == user.name){
- if(user.realName != "")
+ for (UserItem user : accountUsers) {
+ if (identifyUser == user.name) {
+ if (user.realName != "")
ui->cmbUsers->addItem(user.realName);
else
ui->cmbUsers->addItem(user.name);
@@ -706,7 +557,7 @@ void MainWindow::setUsers(const QStringList &usersList)
}
ui->cmbUsers->show();
- //ui->cmbUsers->adjustSize();
+ // ui->cmbUsers->adjustSize();
}
/*
void MainWindow::setDetails(const QString &subPid, const QString &callerPid, const QString &actionId,
@@ -725,7 +576,7 @@ void MainWindow::setPrompt(const QString &text, bool echo)
{
QString prompt = text;
- if(text == "Input Password"){
+ if (text == "Input Password") {
prompt = tr("Input Password");
} else if (text == "Password: " || text == "Password:") {
prompt = tr("Password: ");
@@ -734,18 +585,18 @@ void MainWindow::setPrompt(const QString &text, bool echo)
} else if (text == "_Password:") {
prompt = tr("_Password:");
}
- if(!m_timer){
+ if (!m_timer) {
m_timer = new QTimer(this);
m_timer->setInterval(200);
connect(m_timer, &QTimer::timeout, this, &MainWindow::unlock_countdown);
}
- //qDebug() << "6666";
+ // qDebug() << "6666";
m_timer->start();
unlock_countdown();
ui->lePassword->clear();
ui->lePassword->setPlaceholderText(prompt);
- // switchWidget(PASSWORD);
+ // switchWidget(PASSWORD);
}
/*
@@ -756,89 +607,92 @@ void MainWindow::setPrompt(const QString &text, bool echo)
*/
QString MainWindow::check_is_pam_message(QString text)
{
- setlocale(LC_ALL,"");
- bindtextdomain("Linux-PAM","/usr/share/locale");
- bind_textdomain_codeset("Linux-PAM","UTF-8");
+ if (text.isEmpty()) {
+ return text;
+ }
+ setlocale(LC_ALL, "");
+ bindtextdomain("Linux-PAM", "/usr/share/locale");
+ bind_textdomain_codeset("Linux-PAM", "UTF-8");
textdomain("Linux-PAM");
- char* str;
+ char *str;
QString strTrans = "";
QByteArray ba = text.toLocal8Bit(); // must
- str=ba.data();
+ str = ba.data();
char l_str[1024];
- int a,b;
- //兼容旧版本翻译,以及适配新版本翻译
- //因为不知道什么原因pam发过来的始终为英文因此这里主动加载pam的翻译文件使用gettext获取翻译
- if(text.contains("attemps",Qt::CaseSensitive) && sscanf(str,"Authenticated failed, %d login attemps left",&a))
- snprintf(l_str,1024,_("Authenticated failed, %d login attemps left"),a);
- else if(text.contains("attempts",Qt::CaseSensitive) && sscanf(str,"Authenticated failed, %d login attempts left",&a))
- snprintf(l_str,1024,_("Authenticated failed, %d login attempts left"),a);
- else if(text.contains("attempt",Qt::CaseSensitive) && sscanf(str,"Authenticated failed, %d login attempt left",&a))
- snprintf(l_str,1024,_("Authenticated failed, %d login attempt left"),a);
- else if(text.contains("days",Qt::CaseSensitive) && sscanf(str,"Account locked, %d days left",&a)){
- //这里的消息是多个字符串拼接起来的,无法在翻译文件中找到对应的句子,只能自己翻译
+ int a, b;
+ // 兼容旧版本翻译,以及适配新版本翻译
+ // 因为不知道什么原因pam发过来的始终为英文因此这里主动加载pam的翻译文件使用gettext获取翻译
+ if (text.contains("attemps", Qt::CaseSensitive) && sscanf(str, "Authenticated failed, %d login attemps left", &a))
+ snprintf(l_str, 1024, _("Authenticated failed, %d login attemps left"), a);
+ else if (
+ text.contains("attempts", Qt::CaseSensitive) && sscanf(str, "Authenticated failed, %d login attempts left", &a))
+ snprintf(l_str, 1024, _("Authenticated failed, %d login attempts left"), a);
+ else if (
+ text.contains("attempt", Qt::CaseSensitive) && sscanf(str, "Authenticated failed, %d login attempt left", &a))
+ snprintf(l_str, 1024, _("Authenticated failed, %d login attempt left"), a);
+ else if (text.contains("days", Qt::CaseSensitive) && sscanf(str, "Account locked, %d days left", &a)) {
+ // 这里的消息是多个字符串拼接起来的,无法在翻译文件中找到对应的句子,只能自己翻译
strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("days left");
return strTrans;
- }
- else if(text.contains("hours",Qt::CaseSensitive) && sscanf(str,"Account locked, %d hours left",&a)){
+ } else if (text.contains("hours", Qt::CaseSensitive) && sscanf(str, "Account locked, %d hours left", &a)) {
strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("hours left");
return strTrans;
- }
- else if(text.contains("minutes",Qt::CaseSensitive) && sscanf(str,"Account locked, %d minutes left",&a)){
+ } else if (text.contains("minutes", Qt::CaseSensitive) && sscanf(str, "Account locked, %d minutes left", &a)) {
strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("minutes left");
return strTrans;
- }
- else if(text.contains("seconds",Qt::CaseSensitive) && sscanf(str,"Account locked, %d seconds left",&a)){
+ } else if (text.contains("seconds", Qt::CaseSensitive) && sscanf(str, "Account locked, %d seconds left", &a)) {
strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("seconds left");
return strTrans;
- }else if(text.contains("Warning: ",Qt::CaseSensitive) && sscanf(str,"Warning: your password will expire in %d day",&a)){
- snprintf(l_str,1024,_("Warning: your password will expire in %d day"),a);
- }else if(text.contains("Warning: ",Qt::CaseSensitive) && sscanf(str,"Warning: your password will expire in %d days",&a)){
- snprintf(l_str,1024,_("Warning: your password will expire in %d days"),a);
- }
- else{
+ } else if (
+ text.contains("Warning: ", Qt::CaseSensitive)
+ && sscanf(str, "Warning: your password will expire in %d day", &a)) {
+ snprintf(l_str, 1024, _("Warning: your password will expire in %d day"), a);
+ } else if (
+ text.contains("Warning: ", Qt::CaseSensitive)
+ && sscanf(str, "Warning: your password will expire in %d days", &a)) {
+ snprintf(l_str, 1024, _("Warning: your password will expire in %d days"), a);
+ } else {
return _(str);
}
-
- qDebug()<<"l_str = "<<l_str;
+
+ qDebug() << "l_str = " << l_str;
return QString(l_str);
}
-void MainWindow::setMessage(const QString &text,situation situat)
+void MainWindow::setMessage(const QString &text, situation situat)
{
- if(situat == ERROR){
+ if (situat == ERROR) {
QPalette pe;
- pe.setColor(QPalette::WindowText,Qt::red);
+ pe.setColor(QPalette::WindowText, Qt::red);
ui->lblMessage->setPalette(pe);
-// ui->lePassword->setStyleSheet("QLineEdit{background-color: palette(Button);"
-// "border-radius: 6px;border: 1px solid #F3222D;}");
- }else if(situat == TRUE){
- QColor color = palette().color(QPalette::WindowText);
- QPalette pal(this->palette());
- pal.setColor(QPalette::WindowText,QColor(color));
- ui->lblMessage->setPalette(pal);
+ // ui->lePassword->setStyleSheet("QLineEdit{background-color: palette(Button);"
+ // "border-radius: 6px;border: 1px solid #F3222D;}");
+ } else if (situat == TRUE) {
+ QColor color = palette().color(QPalette::WindowText);
+ QPalette pal(this->palette());
+ pal.setColor(QPalette::WindowText, QColor(color));
+ ui->lblMessage->setPalette(pal);
}
// qDebug()<<"receivetext = "<<text;
- if (text.indexOf("account locked") != -1 || text.indexOf("账户已锁定") != -1
- || text.indexOf("Account locked") != -1 || text.indexOf("永久锁定") != -1)
- {
- if(!m_timer){
+ if (text.indexOf("account locked") != -1 || text.indexOf("账户已锁定") != -1 || text.indexOf("Account locked") != -1
+ || text.indexOf("永久锁定") != -1) {
+ if (!m_timer) {
m_timer = new QTimer(this);
m_timer->setInterval(800);
connect(m_timer, &QTimer::timeout, this, &MainWindow::unlock_countdown);
}
m_timer->start();
- }else if (text.indexOf("No password received, please input password") != -1)
- {
+ } else if (text.indexOf("No password received, please input password") != -1) {
ui->lblMessage->setText(tr("Password cannot be empty"));
ui->lblMessage->setToolTip(tr("Password cannot be empty"));
- }else{
+ } else {
ui->lblMessage->setText(text);
ui->lblMessage->setToolTip(text);
}
- ui->lblMessage->adjustSize();
- //ui->widgetPasswdAuth->adjustSize();
+ // ui->lblMessage->adjustSize();
+ // ui->widgetPasswdAuth->adjustSize();
// ui->lblMessage->setText(text);
}
@@ -846,36 +700,36 @@ void MainWindow::setAuthResult(bool result, const QString &text)
{
QString message = text;
- if(!result && text.isEmpty()){
+ if (!result && text.isEmpty()) {
message = tr("Authentication failed, please try again.");
}
- if(authMode == PASSWORD) {
+ if (authMode == PASSWORD) {
switchWidget(PASSWORD);
- setMessage(message,ERROR);
- }
- else if(authMode == BIOMETRIC)
- setMessage(message,ERROR);
-
-
+ setMessage(message, ERROR);
+ } else if (authMode == BIOMETRIC)
+ setMessage(message, ERROR);
}
void MainWindow::clearEdit()
{
ui->lePassword->setText("");
+ ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
ui->ukeyPassword->setText("");
+ ui->btnAuth->setDisabled(true);
}
void MainWindow::switchAuthMode(Mode mode)
{
- if(isbioSuccess){
+ if (isbioSuccess) {
accept(BIOMETRIC_SUCCESS);
- return ;
+ return;
}
int uid = getUid(userName);
m_loginOptsWidget->setUser(uid);
int count = m_loginOptsWidget->getLoginOptCount();
- enableBioAuth = count > 0;
+ enableBioAuth = count > 0;
if (count < 1) {
setLoginTypeTip(tr("Input your password to authentication"));
m_loginOptsWidget->hide();
@@ -884,185 +738,131 @@ void MainWindow::switchAuthMode(Mode mode)
m_loginOptsWidget->setEnabled(true);
}
- if(m_loginOptsWidget->getHasUkeyOptions()){
+ if (m_loginOptsWidget->getHasUkeyOptions()) {
setLoginTypeTip(tr("Input your password to authentication"));
m_loginOptsWidget->show();
}
-
- switch(mode){
- case PASSWORD:
- {
- qDebug() << "switch to password";
- authMode = mode;
+ switch (mode) {
+ case PASSWORD: {
+ qDebug() << "switch to password";
- if(!enableBioAuth || !receiveBioPAM || useDoubleAuth) {
- ui->btnBioAuth->hide();
- }else{
- ui->btnBioAuth->show();
- }
-
- if(isHiddenSwitchButton)
- ui->btnBioAuth->hide();
-
-
- // if(enableBioAuth && useDoubleAuth){
- // DeviceInfoPtr device = bioDevices.getDefaultDevice(getUid(userName));
- // if(device){
- // widgetBioAuth->startAuth(getUid(userName), device);
- // }
- // }
- }
- break;
- case BIOMETRIC:
- {
- if(authMode == PASSWORD){
- emit accept(BIOMETRIC_IGNORE);
- isFirstAuth = false;
- return;
- }
- authMode = mode;
- qDebug() << "switch to biometric";
- if (m_deviceInfo) {
- if (!m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)
- || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) {
- m_deviceInfo = DeviceInfoPtr();
- }
- }
+ authMode = mode;
- if(!enableBioAuth){
- qDebug() << "It doesn't meet the condition for enabling biometric authentication, switch to password.";
- emit accept(BIOMETRIC_IGNORE);
- isFirstAuth = false;
- return;
- } else if(authMode == BIOMETRIC) {
- QString strDeviceName;
- if(isLoadingUkey){
- strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid, UniT_General_Ukey);
- }else{
- strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid);
- }
- //如果默认设备为空的话,第一次不启动生物识别认证
- if(strDeviceName.isEmpty() && !m_deviceInfo)
- {
- qDebug() << "No default device";
- emit accept(BIOMETRIC_IGNORE);
- isFirstAuth = false;
- return;
+ if (!enableBioAuth || !receiveBioPAM || useDoubleAuth) {
+ ui->btnBioAuth->hide();
+ } else {
+ ui->btnBioAuth->show();
}
- //第一次,获取默认设备的设备信息,之后使用的则是从设备选择窗口传出的设备信息
- if(!m_deviceInfo)
- {
- m_deviceInfo = m_loginOptsWidget->findDeviceByName(strDeviceName);
+ if (isHiddenSwitchButton) {
+ ui->btnBioAuth->hide();
}
- if(!m_deviceInfo){
+ } break;
+ case BIOMETRIC: {
+ if (authMode == PASSWORD) {
emit accept(BIOMETRIC_IGNORE);
isFirstAuth = false;
return;
}
+ authMode = mode;
+ qDebug() << "switch to biometric";
+ if (m_deviceInfo) {
+ if (!m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)
+ || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) {
+ m_deviceInfo = DeviceInfoPtr();
+ }
+ }
- if(m_failMap.contains(uid) && m_failMap[uid].contains(m_deviceInfo->device_id)
- && m_failMap[uid][m_deviceInfo->device_id] >= maxFailedTimes){
+ if (!enableBioAuth) {
+ qDebug() << "It doesn't meet the condition for enabling biometric authentication, switch to password.";
emit accept(BIOMETRIC_IGNORE);
isFirstAuth = false;
return;
- }
-
- if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- if(isFirstAuth){
- isFirstAuth = false;
- m_deviceInfo = nullptr;
- emit accept(BIOMETRIC_IGNORE);
- return ;
+ } else if (authMode == BIOMETRIC) {
+ QString strDeviceName;
+ if (isLoadingUkey) {
+ strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid, UniT_General_Ukey);
+ } else {
+ strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid);
}
- switchLoginOptType(LOGINOPT_TYPE_GENERAL_UKEY);
- stopLoadingUkey();
- startBioAuth();
- m_loginOptsWidget->setCurrentDevice(m_deviceInfo);
- m_loginOptsWidget->updateUIStatus(false);
-
- return ;
- }
-
- isFirstAuth = false;
- startBioAuth();
- emit accept(BIOMETRIC_IGNORE);
- return;
- } /*else if(authMode == UNDEFINED){
- authMode = BIOMETRIC;
-
- if(enableBioAuth) {
- qDebug() << "enable biometric authenticaion";
- QString strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid);
- //如果默认设备为空的话,第一次不启动生物识别认证
- if(strDeviceName.isEmpty() && !m_deviceInfo)
- {
+ // 如果默认设备为空的话,第一次不启动生物识别认证
+ if (strDeviceName.isEmpty() && !m_deviceInfo) {
qDebug() << "No default device";
- if(useFirstDevice == true){
- m_deviceInfo = m_loginOptsWidget->getFirstDevInfo();
- }else{
- emit accept(BIOMETRIC_IGNORE);
- return;
- }
+ emit accept(BIOMETRIC_IGNORE);
+ isFirstAuth = false;
+ return;
}
- //第一次,获取默认设备的设备信息,之后使用的则是从设备选择窗口传出的设备信息
- if(!m_deviceInfo)
- {
+
+ // 第一次,获取默认设备的设备信息,之后使用的则是从设备选择窗口传出的设备信息
+ if (!m_deviceInfo) {
m_deviceInfo = m_loginOptsWidget->findDeviceByName(strDeviceName);
- if (!m_deviceInfo)
- m_deviceInfo = m_loginOptsWidget->getFirstDevInfo();
}
- if(!m_deviceInfo){
+
+ if (!m_deviceInfo) {
emit accept(BIOMETRIC_IGNORE);
+ isFirstAuth = false;
return;
}
- if(m_failMap.contains(uid) && m_failMap[uid].contains(m_deviceInfo->device_id)
- && m_failMap[uid][m_deviceInfo->device_id] >= maxFailedTimes){
+
+ if (m_failMap.contains(uid) && m_failMap[uid].contains(m_deviceInfo->device_id)
+ && m_failMap[uid][m_deviceInfo->device_id] >= maxFailedTimes) {
emit accept(BIOMETRIC_IGNORE);
+ isFirstAuth = false;
+ return;
+ }
+
+ if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ if (isFirstAuth) {
+ isFirstAuth = false;
+ m_deviceInfo = nullptr;
+ emit accept(BIOMETRIC_IGNORE);
+ return;
+ }
+ switchLoginOptType(LOGINOPT_TYPE_GENERAL_UKEY);
+ stopLoadingUkey();
+ startBioAuth();
+ m_loginOptsWidget->setCurrentDevice(m_deviceInfo);
+ m_loginOptsWidget->updateUIStatus(false);
return;
}
+
+ isFirstAuth = false;
+ switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
startBioAuth();
emit accept(BIOMETRIC_IGNORE);
return;
- } else {*/
- /* pass biometric's pam module if there are not available devices */
-// qDebug() << "It doesn't meet the condition for enabling biometric authentication, switch to password.";
-// emit accept(BIOMETRIC_IGNORE);
-// return;
-// }
-// }
- }
- break;
- default:
- break;
+ }
+ } break;
+ default:
+ break;
}
switchWidget(mode);
}
/*** end of public memeber ***/
-
/*** private member ***/
uid_t MainWindow::getUid(const QString &userName)
{
struct passwd *pwd = getpwnam(userName.toStdString().c_str());
- if(pwd == NULL) {
+ if (pwd == NULL) {
qWarning() << "getpwnam error: " << strerror(errno);
return -1;
}
return pwd->pw_uid;
}
-void MainWindow::setDoubleAuth(bool val){
- useDoubleAuth = val;
+void MainWindow::setDoubleAuth(bool val)
+{
+ useDoubleAuth = val;
}
void MainWindow::stopDoubleAuth()
{
-// if(useDoubleAuth && widgetBioAuth)
-// widgetBioAuth->stopAuth();
+ // if(useDoubleAuth && widgetBioAuth)
+ // widgetBioAuth->stopAuth();
}
void MainWindow::switchWidget(Mode mode)
@@ -1071,127 +871,110 @@ void MainWindow::switchWidget(Mode mode)
ui->btnAuth->hide();
ui->btnLoading->hide();
ui->btnAuth->setText(tr("Authenticate"));
- ui->btnAuth->adjustSize();
ui->btnBioAuth->setText(tr("Biometric"));
- ui->btnBioAuth->adjustSize();
ui->btnCancel->setText(tr("Cancel"));
- ui->btnCancel->adjustSize();
ui->returnButton->setText(tr("Use password"));
ui->btnLoading->setDisabled(true);
- ui->returnButton->adjustSize();
- m_labelTip->adjustSize();
- if(is_Mavis){
+ if (is_Mavis) {
ui->cmbUsers->setFixedHeight(48);
ui->lePassword->setFixedHeight(48);
ui->ukeyPassword->setFixedHeight(48);
ui->btnAuth->setFixedHeight(48);
ui->btnCancel->setFixedHeight(48);
- }
- switch(mode){
- case PASSWORD:
- {
- setFixedWidth(420);
-
- if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) {
- switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
- } else {
- switchLoginOptType(LOGINOPT_TYPE_PASSWORD);
- }
- if (!m_loginOptsWidget->isHidden()) {
- m_loginOptsWidget->adjustSize();
- }
- int height;
- if(fontSize = 10){
- height = 130 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if(fontSize = 11 ){
- height = 150 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 12){
- height = 160 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 13){
- height = 170 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 14){
- height = 190 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 15){
- height = 230 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- }
-// if (m_loginOptsWidget->isHidden()) {
-// height = height - m_labelTip->height() - 10;
-// }
-
- unsigned uOptsWidgetHeight = m_loginOptsWidget->height();
- if (m_loginOptsWidget->isHidden()) {
- uOptsWidgetHeight = 0;
- height = height + m_labelTip->height() - 10;
- }
- setFixedHeight(height + uOptsWidgetHeight + 10);
-
- //m_loginOptsWidget->updateUIStatus();
- ui->btnBioAuth->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}QPushButton:pressed{border:none;}");
- ui->btnBioAuth->setFlat(true);
- ui->btnBioAuth->setText(tr("Biometric"));
- ui->btnBioAuth->setAttribute(Qt::WA_UnderMouse,false);
- ui->btnBioAuth->adjustSize();
- ui->widgetPasswdAuth->show();
- ui->lePassword->setFocus();
- //ui->lePassword->setAttribute(Qt::WA_InputMethodEnabled, false);
- if (m_modeButton && m_modeButton->isShowPwd()) {
- ui->lePassword->setEchoMode(QLineEdit::Normal);
- } else {
- ui->lePassword->setEchoMode(QLineEdit::Password);
- }
- ui->btnAuth->show();
- ui->btnLoading->hide();
- //ui->lePassword->setDisabled(false);
- if(w_timer && w_timer->isActive())
- {
- w_timer->stop();
- }
- ui->btnCancel->show();
- //ui->lblContent->show();
- ui->returnButton->hide();
- ui->lblContent->hide();
- }
- break;
-
- case BIOMETRIC:
- setFixedWidth(420);
- if(m_loginOptsWidget->getLoginOptCount() <= 1){
- setFixedHeight(392+ui->cmbUsers->height()+ui->lblHeader->height());
- } else {
- setFixedHeight(482+ui->cmbUsers->height()+ui->lblHeader->height());
- }
-
- ui->btnCancel->hide();
- ui->lblContent->hide();
- ui->btnBioAuth->hide();
- ui->returnButton->show();
- ui->returnButton->setAttribute(Qt::WA_UnderMouse,false);
- ui->returnButton->setFlat(true);
- ui->returnButton->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}QPushButton:pressed{border:none;}");
- ui->returnButton->setText(tr("Use password"));
- ui->returnButton->adjustSize();
- break;
-// case DEVICES:
-// widgetBioAuth->show();
-
-// break;
- default:
- break;
+ } else {
+ ui->cmbUsers->setFixedHeight(36);
+ ui->lePassword->setFixedHeight(36);
+ ui->ukeyPassword->setFixedHeight(36);
+ ui->btnAuth->setFixedHeight(36);
+ ui->btnBioAuth->setFixedHeight(36);
+ ui->btnCancel->setFixedHeight(36);
+ ui->returnButton->setFixedHeight(36);
+ }
+ switch (mode) {
+ case PASSWORD: {
+ setFixedWidth(420);
+
+ if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) {
+ switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
+ } else {
+ switchLoginOptType(LOGINOPT_TYPE_PASSWORD);
+ }
+ // 标题+间隔+内容头+间隔+类型提示+间隔+用户列表+间隔+
+ // (密码输入框+间隔+验证提示+间隔+授权按钮+边距)/ --仅密码方式
+ // (密码输入框+间隔+验证提示+间隔+登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择密码
+ // (登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择生物识别
+ // ukey加载页+间隔+登录选项+间隔+授权按钮+边距)/ukey认证页+间隔+登录选项+间隔+授权按钮+边距)
+ // --选择Ukey
+ int height = 40 + 8 + ui->lblHeader->height() + 8 + m_labelTip->height() + 8;
+ switch (m_uCurLoginOptType) {
+ case LOGINOPT_TYPE_PASSWORD: {
+ height += ui->cmbUsers->height() + 8 + ui->lePassword->height() + 8 + ui->lblMessage->height() + 8;
+ } break;
+ case LOGINOPT_TYPE_FACE:
+ case LOGINOPT_TYPE_FINGERPRINT:
+ case LOGINOPT_TYPE_FINGERVEIN:
+ case LOGINOPT_TYPE_IRIS:
+ case LOGINOPT_TYPE_VOICEPRINT:
+ case LOGINOPT_TYPE_QRCODE: {
+ height += ui->cmbUsers->height() + 8;
+ } break;
+ case LOGINOPT_TYPE_GENERAL_UKEY:
+ case LOGINOPT_TYPE_ADVANCED_UKEY: {
+ if (!ui->widgetUkeyAuth->isHidden()) {
+ height += ui->widgetUkeyAuth->height() + 8;
+ } else if (!ui->loadingUkeyWidget->isHidden()) {
+ height += ui->loadingUkeyWidget->height() + 8;
+ }
+ } break;
+ default:
+ break;
+ }
+ if (!m_loginOptsWidget->isHidden()) {
+ height += m_loginOptsWidget->height() + 8;
+ }
+ height += ui->btnAuth->height() + 24;
+ setFixedSize(width(), height);
+ qInfo() << "MainWindow geometry:" << geometry() << height;
+
+ // m_loginOptsWidget->updateUIStatus();
+ ui->btnBioAuth->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}"
+ "QPushButton:pressed{border:none;}");
+ ui->btnBioAuth->setFlat(true);
+ ui->btnBioAuth->setText(tr("Biometric"));
+ ui->btnBioAuth->setAttribute(Qt::WA_UnderMouse, false);
+ ui->btnBioAuth->adjustSize();
+ if (m_uCurLoginOptType == LOGINOPT_TYPE_PASSWORD) {
+ ui->widgetPasswdAuth->show();
+ ui->lePassword->setFocus();
+ // ui->lePassword->setAttribute(Qt::WA_InputMethodEnabled, false);
+ if (m_modeButton && m_modeButton->isShowPwd()) {
+ ui->lePassword->setEchoMode(QLineEdit::Normal);
+ } else {
+ ui->lePassword->setEchoMode(QLineEdit::Password);
+ }
+ }
+ ui->btnAuth->show();
+ ui->btnLoading->hide();
+ if (w_timer && w_timer->isActive()) {
+ w_timer->stop();
+ }
+ ui->btnCancel->show();
+ // ui->lblContent->show();
+ ui->returnButton->hide();
+ ui->lblContent->hide();
+ } break;
+
+ case BIOMETRIC:
+ setFixedWidth(420);
+ ui->btnCancel->hide();
+ ui->lblContent->hide();
+ ui->btnBioAuth->hide();
+ break;
+ default:
+ break;
}
-// adjustSize();
+ // adjustSize();
}
void MainWindow::unlock_countdown()
@@ -1199,70 +982,75 @@ void MainWindow::unlock_countdown()
int failed_count = 0;
int time_left = 0;
int deny = 0;
- int fail_time =0;
+ int fail_time = 0;
int unlock_time = 0;
- pam_tally_unlock_time_left(getUid(userName),&failed_count, &time_left, &deny,&fail_time,&unlock_time);
+ pam_tally_unlock_time_left(getUid(userName), &failed_count, &time_left, &deny, &fail_time, &unlock_time);
- // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<< fail_time<<"unlock_time:" << unlock_time;
- if(time_left >= 60)//请多少分钟后重试
+ // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<<
+ // fail_time<<"unlock_time:" << unlock_time;
+ if (time_left >= 60) // 请多少分钟后重试
{
- int nMinuteleft = time_left/60;
- if (isLockingFlg == false){
- m_nCurLockMin = unlock_time/60;//获取当前需要锁定的分钟数
+ int nMinuteleft = time_left / 60;
+ if (isLockingFlg == false) {
+ m_nCurLockMin = unlock_time / 60; // 获取当前需要锁定的分钟数
}
- //如果当前设置的不是1min钟锁定那么1min显示成2min由2min直接跳到59s || 剩余分钟数小于当前设置的锁定时间并且大于1min自增+1
- if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin))
- {
+ // 如果当前设置的不是1min钟锁定那么1min显示成2min由2min直接跳到59s ||
+ // 剩余分钟数小于当前设置的锁定时间并且大于1min自增+1
+ if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin)) {
nMinuteleft = nMinuteleft + 1;
}
- setMessage(tr("Please try again in %1 minutes.").arg(nMinuteleft),TRUE);
- //ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinute));
+ setMessage(tr("Please try again in %1 minutes.").arg(nMinuteleft), ERROR);
+ // ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinute));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
ui->btnAuth->setDisabled(true);
isLockingFlg = true;
- return ;
- }
- else if(time_left > 0 && time_left < 60)//请多少秒后重试
+ setBiometricAuthDisabledStatus(isLockingFlg);
+ return;
+ } else if (time_left > 0 && time_left < 60) // 请多少秒后重试
{
- char ch[100]={0};
- setMessage(tr("Please try again in %1 seconds.").arg(time_left%60),TRUE);
- //ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60));
+ char ch[100] = { 0 };
+ setMessage(tr("Please try again in %1 seconds.").arg(time_left % 60), ERROR);
+ // ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
ui->btnAuth->setDisabled(true);
isLockingFlg = true;
- return ;
- }
- else if (failed_count == 0xFFFF)//账号被永久锁定
+ setBiometricAuthDisabledStatus(isLockingFlg);
+ return;
+ } else if (failed_count == 0xFFFF) // 账号被永久锁定
{
ui->lblMessage->setText(tr("Account locked permanently."));
ui->lblMessage->setToolTip(tr("Account locked permanently."));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
ui->btnAuth->setDisabled(true);
isLockingFlg = true;
- return ;
- }
- else
- {
- if(ui->lePassword){
+ setBiometricAuthDisabledStatus(isLockingFlg);
+ return;
+ } else {
+ if (ui->lePassword) {
ui->lePassword->setDisabled(false);
+ ui->lePassword->setReadOnly(false);
ui->lePassword->setFocus();
}
- if(ui->btnAuth){
+ if (ui->btnAuth) {
ui->btnAuth->setDisabled(false);
}
if (isLockingFlg) {
- //setMessage(tr("Authentication failed, please try again."),ERROR);
+ // setMessage(tr("Authentication failed, please try again."),ERROR);
setMessage("");
isLockingFlg = false;
+ setBiometricAuthDisabledStatus(isLockingFlg);
}
m_timer->stop();
}
- return ;
+ return;
}
void MainWindow::root_unlock_countdown()
@@ -1270,22 +1058,23 @@ void MainWindow::root_unlock_countdown()
int failed_count = 0;
int time_left = 0;
int deny = 0;
- int fail_time =0;
+ int fail_time = 0;
int unlock_time = 0;
- pam_tally_root_unlock_time_left(&failed_count, &time_left, &deny,&fail_time,&unlock_time);
+ pam_tally_root_unlock_time_left(&failed_count, &time_left, &deny, &fail_time, &unlock_time);
- // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<< fail_time<<"unlock_time:" << unlock_time;
- int nMinuteleft = time_left/60;
- if(time_left >= 60)//请多少分钟后重试
+ // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<<
+ // fail_time<<"unlock_time:" << unlock_time;
+ int nMinuteleft = time_left / 60;
+ if (time_left >= 60) // 请多少分钟后重试
{
- int nMinuteleft = time_left/60;
- if (isLockingFlg == false){
- m_nCurLockMin = unlock_time/60;//获取当前需要锁定的分钟数
+ int nMinuteleft = time_left / 60;
+ if (isLockingFlg == false) {
+ m_nCurLockMin = unlock_time / 60; // 获取当前需要锁定的分钟数
}
- //如果当前设置的不是1min钟锁定那么1min显示成2min由2min直接跳到59s || 剩余分钟数小于当前设置的锁定时间并且大于1min自增+1
- if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin))
- {
+ // 如果当前设置的不是1min钟锁定那么1min显示成2min由2min直接跳到59s ||
+ // 剩余分钟数小于当前设置的锁定时间并且大于1min自增+1
+ if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin)) {
nMinuteleft = nMinuteleft + 1;
}
@@ -1293,179 +1082,204 @@ void MainWindow::root_unlock_countdown()
ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinuteleft));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
+ ui->btnAuth->setDisabled(true);
isLockingFlg = true;
- return ;
- }
- else if(time_left > 0 && time_left < 60)//请多少秒后重试
+ setBiometricAuthDisabledStatus(isLockingFlg);
+ return;
+ } else if (time_left > 0 && time_left < 60) // 请多少秒后重试
{
- char ch[100]={0};
- ui->lblMessage->setText(tr("Please try again in %1 seconds.").arg(time_left%60));
- ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60));
+ char ch[100] = { 0 };
+ ui->lblMessage->setText(tr("Please try again in %1 seconds.").arg(time_left % 60));
+ ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left % 60));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
+ ui->btnAuth->setDisabled(true);
isLockingFlg = true;
- return ;
- }
- else if (failed_count == 0xFFFF)//账号被永久锁定
+ setBiometricAuthDisabledStatus(isLockingFlg);
+ return;
+ } else if (failed_count == 0xFFFF) // 账号被永久锁定
{
ui->lblMessage->setText(tr("Account locked permanently."));
ui->lblMessage->setToolTip(tr("Account locked permanently."));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(false);
+ ui->btnAuth->setDisabled(true);
isLockingFlg = true;
- return ;
- }
- else
- {
- if(ui->lePassword){
+ setBiometricAuthDisabledStatus(isLockingFlg);
+ return;
+ } else {
+ if (ui->lePassword) {
ui->lePassword->setDisabled(false);
+ ui->lePassword->setReadOnly(false);
ui->lePassword->setFocus();
}
+ if (ui->btnAuth) {
+ ui->btnAuth->setDisabled(false);
+ }
- if (isLockingFlg)
- {
- //setMessage(tr("Authentication failed, please try again."),ERROR);
+ if (isLockingFlg) {
+ // setMessage(tr("Authentication failed, please try again."),ERROR);
setMessage("");
isLockingFlg = false;
+ setBiometricAuthDisabledStatus(isLockingFlg);
}
-
+
m_timer->stop();
}
- return ;
+ return;
+}
+
+void MainWindow::setBiometricAuthDisabledStatus(bool locked)
+{
+ if (locked) {
+ if (m_loginOptsWidget) {
+ m_loginOptsWidget->stopAuth();
+ m_loginOptsWidget->setAllDeviceDisable(true);
+ if (m_bioTimer && m_bioTimer->isActive())
+ m_bioTimer->stop();
+ }
+ if (m_deviceInfo && m_deviceInfo->biotype == BIOTYPE_FACE) {
+ QImage imgFailed;
+ m_loginOptsWidget->setFaceImg(imgFailed, 1);
+ } else if (m_deviceInfo && m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) {
+ QImage nullImage;
+ m_loginOptsWidget->setQRCode(nullImage);
+ }
+ } else {
+ if (m_deviceInfo && m_loginOptsWidget) {
+ m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName));
+ m_loginOptsWidget->setAllDeviceDisable(false);
+ }
+ }
}
void MainWindow::onRespondUkey(const QString &text)
{
- if (m_loginOptsWidget){
- m_loginOptsWidget->SetExtraInfo(text,"pincode");
- }
+ if (m_loginOptsWidget) {
+ m_loginOptsWidget->SetExtraInfo(text, "pincode");
+ }
}
void MainWindow::switchLoginOptType(unsigned uLoginOptType)
{
- switch(uLoginOptType) {
- case LOGINOPT_TYPE_PASSWORD:
- {
- //m_loginOptsWidget->hide();
- ui->lePassword->show();
- ui->cmbUsers->show();
- ui->widgetPasswdAuth->show();
- ui->widgetUkeyAuth->hide();
- ui->ukeyPassword->clearFocus();
- ui->loadingUkeyWidget->hide();
- setFocusProxy(ui->lePassword);
- ui->cmbUsers->show();
- }
- break;
- case LOGINOPT_TYPE_FACE:
- case LOGINOPT_TYPE_FINGERPRINT:
- case LOGINOPT_TYPE_IRIS:
- case LOGINOPT_TYPE_VOICEPRINT:
- case LOGINOPT_TYPE_FINGERVEIN:
- case LOGINOPT_TYPE_QRCODE:
- {
- //m_loginOptsWidget->show();
- // 延迟检查错误状态
- m_isNetworkErr = false;
- QTimer::singleShot(500, this, [&,this](){
- if (!this->m_isNetworkErr) {
- m_loginOptsWidget->setQRCodeMsg("");
+ switch (uLoginOptType) {
+ case LOGINOPT_TYPE_PASSWORD: {
+ // m_loginOptsWidget->hide();
+ ui->lePassword->show();
+ ui->cmbUsers->show();
+ ui->widgetPasswdAuth->show();
+ ui->widgetUkeyAuth->hide();
+ ui->ukeyPassword->clearFocus();
+ ui->loadingUkeyWidget->hide();
+ setFocusProxy(ui->lePassword);
+ ui->cmbUsers->show();
+ m_loginOptsWidget->stopBioWaiting();
+ } break;
+ case LOGINOPT_TYPE_FACE:
+ case LOGINOPT_TYPE_FINGERPRINT:
+ case LOGINOPT_TYPE_IRIS:
+ case LOGINOPT_TYPE_VOICEPRINT:
+ case LOGINOPT_TYPE_FINGERVEIN:
+ case LOGINOPT_TYPE_QRCODE: {
+ switch (uLoginOptType) {
+ case LOGINOPT_TYPE_FINGERPRINT:
+ case LOGINOPT_TYPE_IRIS:
+ case LOGINOPT_TYPE_VOICEPRINT:
+ case LOGINOPT_TYPE_FINGERVEIN: {
+ m_loginOptsWidget->startBioWaiting(uLoginOptType);
+ } break;
+ default:
+ m_loginOptsWidget->stopBioWaiting();
+ break;
}
- });
-
- //m_loginOptsWidget->hide();
- ui->lePassword->show();
- ui->widgetUkeyAuth->hide();
- ui->loadingUkeyWidget->hide();
- ui->ukeyPassword->clearFocus();
- setFocusProxy(ui->lePassword);
- ui->cmbUsers->show();
- ui->widgetPasswdAuth->show();
- }
- break;
- case LOGINOPT_TYPE_GENERAL_UKEY:
- {
- ui->lePassword->hide();
- ui->cmbUsers->hide();
- if(m_deviceInfo){
- stopLoadingUkey();
- ui->widgetUkeyAuth->show();
- }else{
- startLoadingUkey();
- }
- setFocusProxy(ui->ukeyPassword);
- ui->ukeyPassword->setFocusPolicy(Qt::StrongFocus);
- ui->ukeyPassword->setFocus();
- ui->widgetPasswdAuth->hide();
- }
- break;
- default:
- return;
+
+ // 延迟检查错误状态
+ m_isNetworkErr = false;
+ QTimer::singleShot(500, this, [&, this]() {
+ if (!this->m_isNetworkErr) {
+ m_loginOptsWidget->setQRCodeMsg("");
+ }
+ });
+
+ ui->lePassword->show();
+ ui->widgetUkeyAuth->hide();
+ ui->loadingUkeyWidget->hide();
+ ui->ukeyPassword->clearFocus();
+ setFocusProxy(ui->lePassword);
+ ui->cmbUsers->show();
+ ui->widgetPasswdAuth->hide();
+ } break;
+ case LOGINOPT_TYPE_GENERAL_UKEY: {
+ ui->lePassword->hide();
+ ui->cmbUsers->hide();
+ if (m_deviceInfo) {
+ stopLoadingUkey();
+ ui->widgetUkeyAuth->show();
+ } else {
+ startLoadingUkey();
+ }
+ setFocusProxy(ui->ukeyPassword);
+ ui->ukeyPassword->setFocusPolicy(Qt::StrongFocus);
+ ui->ukeyPassword->setFocus();
+ ui->widgetPasswdAuth->hide();
+ m_loginOptsWidget->stopBioWaiting();
+ } break;
+ default:
+ return;
}
- qDebug()<<"CurOptType:"<<uLoginOptType;
- if(m_deviceInfo && m_failMap.contains(getUid(userName))
+ qDebug() << "CurOptType:" << uLoginOptType;
+ if (m_deviceInfo && m_failMap.contains(getUid(userName))
&& m_failMap[getUid(userName)].contains(m_deviceInfo->device_id)
- && m_failMap[getUid(userName)][m_deviceInfo->device_id] >= maxFailedTimes){
+ && m_failMap[getUid(userName)][m_deviceInfo->device_id] >= maxFailedTimes) {
if (m_deviceInfo->biotype == BIOTYPE_FACE) {
QImage imgFailed;
m_loginOptsWidget->setFaceImg(imgFailed, 1);
}
no_changes = true;
if (m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) {
- setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
- }else if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
- setUkeyTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
- }else {
- setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
+ setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
+ } else if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ setUkeyTypeTip(tr("Failed to verify %1, please enter password to unlock")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
+ } else {
+ setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
}
m_loginOptsWidget->setDeviceDisable(m_deviceInfo->device_id, true);
} else {
no_changes = false;
if (uLoginOptType != m_uCurLoginOptType || (m_deviceInfo && m_deviceInfo->device_id != m_nLastDeviceId)) {
- switch(uLoginOptType) {
- case LOGINOPT_TYPE_PASSWORD:
- {
- setLoginTypeTip("");
- //setMessage("",TRUE);
- }
- break;
- case LOGINOPT_TYPE_FACE:
- {
- setLoginTypeTip(tr("Verify face recognition or enter password to unlock"));
- }
- break;
- case LOGINOPT_TYPE_FINGERPRINT:
- {
- setLoginTypeTip(tr("Press fingerprint or enter password to unlock"));
- }
- break;
- case LOGINOPT_TYPE_VOICEPRINT:
- {
- setLoginTypeTip(tr("Verify voiceprint or enter password to unlock"));
- }
- break;
- case LOGINOPT_TYPE_FINGERVEIN:
- {
- setLoginTypeTip(tr("Verify finger vein or enter password to unlock"));
- }
- break;
- case LOGINOPT_TYPE_IRIS:
- {
- setLoginTypeTip(tr("Verify iris or enter password to unlock"));
- }
- break;
- case LOGINOPT_TYPE_QRCODE:
- {
- setLoginTypeTip(tr("Use the bound wechat scanning code or enter the password to unlock"));
- }
- break;
- case LOGINOPT_TYPE_GENERAL_UKEY:
- {
- setLoginTypeTip("");
- }
- break;
- default:
- return;
+ switch (uLoginOptType) {
+ case LOGINOPT_TYPE_PASSWORD: {
+ setLoginTypeTip(tr("Input your password to authentication"));
+ } break;
+ case LOGINOPT_TYPE_FACE: {
+ setLoginTypeTip(tr("Facial recognition to authorization"));
+ } break;
+ case LOGINOPT_TYPE_FINGERPRINT: {
+ setLoginTypeTip(tr("Fingerprint recognition to authorization"));
+ } break;
+ case LOGINOPT_TYPE_VOICEPRINT: {
+ setLoginTypeTip(tr("Voiceprint recognition to authorization"));
+ } break;
+ case LOGINOPT_TYPE_FINGERVEIN: {
+ setLoginTypeTip(tr("Finger veins recognition to authorization"));
+ } break;
+ case LOGINOPT_TYPE_IRIS: {
+ setLoginTypeTip(tr("Iris recognition to authorization"));
+ } break;
+ case LOGINOPT_TYPE_QRCODE: {
+ setLoginTypeTip(tr("Use the bound wechat scanning code to authorization"));
+ } break;
+ case LOGINOPT_TYPE_GENERAL_UKEY: {
+ setLoginTypeTip("");
+ } break;
+ default:
+ return;
}
}
}
@@ -1475,6 +1289,7 @@ void MainWindow::switchLoginOptType(unsigned uLoginOptType)
m_nLastDeviceId = -1;
}
m_uCurLoginOptType = uLoginOptType;
+ m_loginOptsWidget->updateUIStatus(true, m_uCurLoginOptType);
}
void MainWindow::setLoginTypeTip(QString strLoginTypeTip)
@@ -1484,13 +1299,13 @@ void MainWindow::setLoginTypeTip(QString strLoginTypeTip)
m_labelTip->hide();
} else {
QPalette pe;
- if(no_changes) {
- pe.setColor(QPalette::WindowText,Qt::red);
+ if (no_changes) {
+ pe.setColor(QPalette::WindowText, Qt::red);
m_labelTip->setPalette(pe);
} else {
QColor color = palette().color(QPalette::WindowText);
QPalette pal(this->palette());
- pal.setColor(QPalette::WindowText,QColor(color));
+ pal.setColor(QPalette::WindowText, QColor(color));
m_labelTip->setPalette(pal);
}
m_labelTip->setText(m_strLoginTypeTip);
@@ -1501,9 +1316,9 @@ void MainWindow::setLoginTypeTip(QString strLoginTypeTip)
void MainWindow::startBioAuthDelay()
{
if (m_deviceInfo) {
- if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
- }else{
+ } else {
m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName));
}
switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
@@ -1517,11 +1332,11 @@ void MainWindow::startBioAuth(unsigned uTimeout)
{
m_loginOptsWidget->stopAuth();
- if(m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
}
- if(!m_bioTimer){
+ if (!m_bioTimer) {
m_bioTimer = new QTimer(this);
connect(m_bioTimer, SIGNAL(timeout()), this, SLOT(startBioAuthDelay()));
}
@@ -1538,8 +1353,10 @@ void MainWindow::onUpdateBioAuthMsg(QString strMsg)
void MainWindow::updatePixmap()
{
ui->btnAuth->hide();
+ ui->btnAuth->setDisabled(true);
ui->btnLoading->show();
ui->lePassword->setDisabled(true);
+ ui->lePassword->setReadOnly(true);
QMatrix matrix;
matrix.rotate(90.0);
m_waitingPixmap = m_waitingPixmap.transformed(matrix, Qt::FastTransformation);
@@ -1549,64 +1366,49 @@ void MainWindow::updatePixmap()
void MainWindow::onUpdateWndSize(unsigned uLoginOptType, unsigned uLoginOptSize)
{
ui->lblContent->hide();
- if (!m_loginOptsWidget->isHidden()) {
- m_loginOptsWidget->adjustSize();
- }
- unsigned uOptsWidgetHeight = m_loginOptsWidget->height();
- if (m_loginOptsWidget->isHidden() ||
- (uLoginOptSize == 1 && uLoginOptType != LOGINOPT_TYPE_QRCODE && uLoginOptType != LOGINOPT_TYPE_FACE)) {
- uOptsWidgetHeight = 0;
- }
ui->lblHeader->adjustSize();
- if(uLoginOptType == LOGINOPT_TYPE_QRCODE && uLoginOptType == LOGINOPT_TYPE_FACE){
- uOptsWidgetHeight = m_loginOptsWidget->height() + 20;
- }
- else if(uLoginOptType == LOGINOPT_TYPE_FINGERPRINT){
- uOptsWidgetHeight = m_loginOptsWidget->height() + 10 ;
- }
-// ui->lblContent->adjustSize();
-// ui->lblHeader->adjustSize();
- int height;
- if(fontSize = 10){
- height = 130 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if(fontSize = 11 ){
- height = 150 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 12){
- height = 160 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 13){
- height = 170 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 14){
- height = 190 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 15){
- height = 230 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- }
- if (m_loginOptsWidget->isHidden()) {
- height = height + m_labelTip->height() - 10;
- }
- if(uLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){
- setLoginTypeTip("");
- setFixedSize(width(), height + uOptsWidgetHeight + 10);
- }else{
- setFixedSize(width(), height + uOptsWidgetHeight);
+ // 标题+间隔+内容头+间隔+类型提示+间隔+用户列表+间隔+
+ // (密码输入框+间隔+验证提示+间隔+授权按钮+边距)/ --仅密码方式
+ // (密码输入框+间隔+验证提示+间隔+登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择密码
+ // (登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择生物识别
+ // ukey加载页+间隔+登录选项+间隔+授权按钮+边距)/ukey认证页+间隔+登录选项+间隔+授权按钮+边距)
+ // --选择Ukey
+ int height = 40 + 8 + ui->lblHeader->height() + 8 + m_labelTip->height() + 8;
+ switch (m_uCurLoginOptType) {
+ case LOGINOPT_TYPE_PASSWORD: {
+ height += ui->cmbUsers->height() + 8 + ui->lePassword->height() + 8 + ui->lblMessage->height() + 8;
+ } break;
+ case LOGINOPT_TYPE_FACE:
+ case LOGINOPT_TYPE_FINGERPRINT:
+ case LOGINOPT_TYPE_FINGERVEIN:
+ case LOGINOPT_TYPE_IRIS:
+ case LOGINOPT_TYPE_VOICEPRINT:
+ case LOGINOPT_TYPE_QRCODE: {
+ height += ui->cmbUsers->height() + 8;
+ } break;
+ case LOGINOPT_TYPE_GENERAL_UKEY:
+ case LOGINOPT_TYPE_ADVANCED_UKEY: {
+ if (!ui->widgetUkeyAuth->isHidden()) {
+ height += ui->widgetUkeyAuth->height() + 8;
+ } else if (!ui->loadingUkeyWidget->isHidden()) {
+ height += ui->loadingUkeyWidget->height() + 8;
+ }
+ } break;
+ default:
+ break;
+ }
+ if (!m_loginOptsWidget->isHidden()) {
+ height += m_loginOptsWidget->height() + 8;
}
+ height += ui->btnAuth->height() + 24;
+ setFixedSize(width(), height);
+ qInfo() << "MainWindow geometry update:" << geometry() << height;
}
void MainWindow::setEditInputMethod(bool bEnable)
{
- qDebug()<<"setEditInputMethod:"<<bEnable;
+ qDebug() << "setEditInputMethod:" << bEnable;
if (bEnable) {
ui->lePassword->setAttribute(Qt::WA_InputMethodEnabled, true);
} else {
@@ -1619,4 +1421,174 @@ void MainWindow::setCurProject(bool isMavis)
is_Mavis = isMavis;
}
+void MainWindow::onOptionSelected(unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo)
+{
+ isLoadingUkey = false;
+
+ if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY) {
+ stopLoadingUkey();
+ }
+
+ if (uCurLoginOptType == LOGINOPT_TYPE_PASSWORD) {
+ switchLoginOptType(uCurLoginOptType);
+ if (m_loginOptsWidget) {
+ m_loginOptsWidget->stopAuth();
+ }
+ m_deviceInfo = nullptr;
+ authMode = PASSWORD;
+ emit restartAuth();
+ return;
+ }
+
+ if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo)
+ return;
+
+ if (deviceInfo)
+ qDebug() << "device changed: " << deviceInfo->biotype;
+
+ if (deviceInfo && m_failMap[getUid(userName)][deviceInfo->device_id] >= maxFailedTimes) {
+ qDebug() << "Failed MAX!!";
+ return;
+ }
+
+ if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo) {
+ isLoadingUkey = true;
+ startLoadingUkey();
+ m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY);
+ } else if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo) {
+ stopLoadingUkey();
+ m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY);
+ }
+
+ if (deviceInfo == m_deviceInfo) {
+ return;
+ }
+
+ if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo == m_deviceInfo) {
+ return;
+ }
+
+ if (m_bioTimer)
+ m_bioTimer->stop();
+
+ m_deviceInfo = deviceInfo;
+ switchLoginOptType(uCurLoginOptType);
+ if (!isbioSuccess && m_deviceInfo) {
+ startBioAuth();
+ }
+}
+
+void MainWindow::onNotifyOptionsChanged(unsigned uOptionsCount)
+{
+ if (uOptionsCount > 0) {
+ m_loginOptsWidget->show();
+ } else {
+ // m_loginOptsWidget->hide();
+ }
+
+ if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ stopLoadingUkey();
+ }
+
+ if (!m_deviceInfo || !m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)
+ || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) {
+ m_loginOptsWidget->stopAuth();
+ if (authMode != UNDEFINED) {
+ authMode = UNDEFINED;
+ emit switchToBiometric();
+ }
+ }
+}
+
+void MainWindow::onLoginOptionsAuthCompleted(uid_t uid, bool ret, int nStatus)
+{
+ qDebug() << "biometric authentication complete: " << uid << ret << nStatus;
+ if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY && ui->widgetUkeyAuth->isVisible()) {
+ ui->ukeyPassword->setText("");
+ }
+
+ if (uid == getUid(userName) && ret) {
+ isbioSuccess = true;
+ emit switchToBiometric();
+ authMode = UNDEFINED;
+ } else {
+ if (nStatus == 5 && m_deviceInfo) {
+ if (w_timer && w_timer->isActive())
+ w_timer->stop();
+ QImage imgFailed;
+ m_loginOptsWidget->setFaceImg(imgFailed, 2);
+ return;
+ } else if (nStatus >= 2 && nStatus != 5)
+ if (nStatus >= 2) {
+ if (m_deviceInfo) {
+ uid_t curUid = getUid(userName);
+ if (m_failMap.contains(curUid) && m_failMap[curUid].contains(m_deviceInfo->device_id)) {
+ m_failMap[curUid][m_deviceInfo->device_id] = m_failMap[curUid][m_deviceInfo->device_id] + 1;
+ } else {
+ m_failMap[curUid][m_deviceInfo->device_id] = 1;
+ }
+ qDebug() << "Failed count:" << m_failMap[curUid][m_deviceInfo->device_id]
+ << ",Max:" << maxFailedTimes;
+ if (m_deviceInfo->biotype == BIOTYPE_FACE) {
+ QImage imgFailed;
+ m_loginOptsWidget->setFaceImg(imgFailed, 1);
+ }
+ if (m_failMap[curUid][m_deviceInfo->device_id] >= maxFailedTimes) {
+ no_changes = true;
+ if (m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) {
+ setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
+ QImage nullImage;
+ m_loginOptsWidget->setQRCode(nullImage);
+ } else if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ ui->ukeyPassword->setReadOnly(true);
+ setUkeyTypeTip(tr("Unable to verify %1, please enter password to unlock")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
+ } else {
+ setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)));
+ }
+
+ m_loginOptsWidget->setDeviceDisable(m_deviceInfo->device_id, true);
+ useDoubleAuth = false;
+ return;
+ }
+ no_changes = false;
+ if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) {
+ setUkeyTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))
+ .arg(maxFailedTimes - m_failMap[curUid][m_deviceInfo->device_id]));
+ } else {
+ setLoginTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities")
+ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))
+ .arg(maxFailedTimes - m_failMap[curUid][m_deviceInfo->device_id]));
+ }
+ }
+ }
+ if (!isbioSuccess) {
+ // dbus error
+ if (nStatus == -1) {
+ qDebug() << "Biometric dbus error:" << authMode;
+ }
+ if (m_uCurLoginOptType == LOGINOPT_TYPE_QRCODE && nStatus == 1) {
+ m_isNetworkErr = true;
+ m_loginOptsWidget->setQRCodeMsg(tr("Abnormal network"));
+ startBioAuth(10000);
+ } else if (m_uCurLoginOptType == LOGINOPT_TYPE_QRCODE && nStatus == -4) {
+ m_isNetworkErr = true;
+ m_loginOptsWidget->setQRCodeMsg(tr("Acquisition failure"));
+ startBioAuth(10000);
+ } else {
+ startBioAuth();
+ }
+ if (nStatus >= 2 && m_deviceInfo) {
+ if (m_deviceInfo->biotype == BIOTYPE_FACE) {
+ QImage imgFailed;
+ m_loginOptsWidget->setFaceImg(imgFailed, 1);
+ }
+ }
+ }
+ }
+}
+
/*** end of private member ***/
diff --git a/polkit-agent/src/mainwindow.h b/polkit-agent/src/mainwindow.h
index 898f2d0..bf8e9ab 100644
--- a/polkit-agent/src/mainwindow.h
+++ b/polkit-agent/src/mainwindow.h
@@ -31,11 +31,14 @@
#include "loginoptionswidget.h"
#include "modeButton.h"
#include "kalabel.h"
+#include <kysdk/applications/kdialog.h>
+using namespace kdk;
+
namespace Ui {
class MainWindow;
}
-class MainWindow : public QWidget
+class MainWindow : public kdk::KDialog
{
Q_OBJECT
@@ -45,17 +48,32 @@ public:
void closeEvent(QCloseEvent *event);
bool eventFilter(QObject *obj, QEvent *event);
void paintEvent(QPaintEvent *event);
- enum Mode{UNDEFINED, PASSWORD, BIOMETRIC, DEVICES};
- enum situation{TRUE, ERROR};
+ void keyPressEvent(QKeyEvent *event); //屏蔽esc按钮
+ enum Mode
+ {
+ UNDEFINED,
+ PASSWORD,
+ BIOMETRIC,
+ DEVICES
+ };
+ enum situation
+ {
+ TRUE,
+ ERROR
+ };
void setIcon(const QString &iconName);
void setHeader(const QString &text);
void setUsers(const QStringList &usersList);
- void setDetails(const QString &subPid, const QString &callerPid,
- const QString &actionId, const QString &actionDesc,
- const QString vendorName, const QString vendorUrl);
+ void setDetails(
+ const QString &subPid,
+ const QString &callerPid,
+ const QString &actionId,
+ const QString &actionDesc,
+ const QString vendorName,
+ const QString vendorUrl);
void setPrompt(const QString &text, bool echo);
- void setMessage(const QString &text,situation situat = ERROR);
- void setAuthResult(bool result, const QString &text="");
+ void setMessage(const QString &text, situation situat = ERROR);
+ void setAuthResult(bool result, const QString &text = "");
void clearEdit();
void switchAuthMode(Mode mode);
void setDoubleAuth(bool val);
@@ -69,15 +87,14 @@ public:
void stopLoadingUkey();
void updateLoadingPixmap();
-private:
+private:
uid_t getUid(const QString &userName);
void setMovie();
void setPixmap();
- void startBioAuth(unsigned uTimeout = 1000);
+ void startBioAuth(unsigned uTimeout = 200);
void switchWidget(Mode mode);
int enable_biometric_authentication();
-
void root_unlock_countdown();
void unlock_countdown();
void editIcon();
@@ -85,11 +102,35 @@ private:
void setMavisSheel();
void updatePixmap();
+ void setBiometricAuthDisabledStatus(bool locked);
+
public slots:
void onUpdateBioAuthMsg(QString strMsg);
void onUpdateWndSize(unsigned uLoginOptType, unsigned uLoginOptSize);
+ void onShowYesPrompt();
private slots:
+ /**
+ * @brief onOptionSelected
+ * @param uCurLoginOptType
+ * @param deviceInfo
+ */
+ void onOptionSelected(unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo);
+
+ /**
+ * @brief onNotifyOptionsChanged
+ * @param uOptionsCount
+ */
+ void onNotifyOptionsChanged(unsigned uOptionsCount);
+
+ /**
+ * @brief onLoginOptionsAuthCompleted
+ * @param uid
+ * @param ret
+ * @param nStatus
+ */
+ void onLoginOptionsAuthCompleted(uid_t uid, bool ret, int nStatus);
+
void on_btnDetails_clicked();
void on_lePassword_returnPressed();
void on_ukeyPassword_returnPressed();
@@ -112,10 +153,11 @@ signals:
void switchToBiometric();
void userChanged(const QString &userName);
void restartAuth();
+ void yesPrompted();
private:
Ui::MainWindow *ui;
- Users *users;
+ Users *users;
QString userName;
bool enableBioAuth;
bool receiveBioPAM;
@@ -124,25 +166,25 @@ private:
bool isFirst;
bool useDoubleAuth;
bool isbioSuccess;
- QMap<qint32,QMap<int,int>> m_failMap;
- int maxFailedTimes;
+ QMap<qint32, QMap<int, int>> m_failMap;
+ int maxFailedTimes;
bool isHiddenSwitchButton;
ModeButton *m_modeButton;
QIcon modeIcon;
bool pwdShow = false;
bool isHover = false;
- //ukey优先级比密码低该变量用于判断是否第一次认证并选中密码
+ // ukey优先级比密码低该变量用于判断是否第一次认证并选中密码
bool isFirstAuth = true;
QTimer *m_timer;
- //const DeviceInfo *device = NULL;
- bool isLockingFlg; //判断当前是否正在锁定倒计时
- int m_nCurLockMin; //当前锁定的分钟数
+ // const DeviceInfo *device = NULL;
+ bool isLockingFlg; //判断当前是否正在锁定倒计时
+ int m_nCurLockMin; //当前锁定的分钟数
// 登录选项
KALabel *m_labelTip = nullptr;
LoginOptionsWidget *m_loginOptsWidget = nullptr;
- unsigned m_uCurLoginOptType = LOGINOPT_TYPE_PASSWORD; // 当前登录验证方式
+ unsigned m_uCurLoginOptType = LOGINOPT_TYPE_PASSWORD; // 当前登录验证方式
QString m_strLoginTypeTip = "";
QTimer *m_bioTimer = nullptr;
DeviceInfoPtr m_deviceInfo = nullptr;
@@ -153,7 +195,7 @@ private:
QLabel *titleLabel;
QPushButton *closeBtn;
- QGSettings *settings;
+ QGSettings *settings;
int fontSize;
QString app_IconName;
@@ -165,9 +207,11 @@ private:
QTimer *w_timer;
QPixmap m_waitingPixmap;
- QTimer *m_loadingTimer = nullptr;
- QPixmap m_loadingPixmap;
- bool isLoadingUkey = false;
+ QTimer *m_loadingTimer = nullptr;
+ QPixmap m_loadingPixmap;
+ bool isLoadingUkey = false;
+
+ bool doNotNeedAuth = false;
};
#endif // MAINWINDOW_H
diff --git a/polkit-agent/src/mainwindow.ui b/polkit-agent/src/mainwindow.ui
index 01fc13b..7a29dab 100644
--- a/polkit-agent/src/mainwindow.ui
+++ b/polkit-agent/src/mainwindow.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>459</width>
- <height>646</height>
+ <height>716</height>
</rect>
</property>
<property name="sizePolicy">
@@ -27,7 +27,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
- <number>0</number>
+ <number>8</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
@@ -36,7 +36,7 @@
<number>0</number>
</property>
<property name="topMargin">
- <number>6</number>
+ <number>8</number>
</property>
<property name="rightMargin">
<number>0</number>
@@ -45,21 +45,15 @@
<number>24</number>
</property>
<item>
- <layout class="QFormLayout" name="formLayout">
- <property name="fieldGrowthPolicy">
- <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
- </property>
- <property name="rowWrapPolicy">
- <enum>QFormLayout::WrapAllRows</enum>
- </property>
- <property name="horizontalSpacing">
- <number>0</number>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <property name="spacing">
+ <number>8</number>
</property>
<property name="leftMargin">
<number>24</number>
</property>
<property name="topMargin">
- <number>15</number>
+ <number>0</number>
</property>
<property name="rightMargin">
<number>24</number>
@@ -67,7 +61,7 @@
<property name="bottomMargin">
<number>0</number>
</property>
- <item row="0" column="1">
+ <item>
<widget class="QLabel" name="lblHeader">
<property name="minimumSize">
<size>
@@ -98,7 +92,7 @@
</property>
</widget>
</item>
- <item row="1" column="1">
+ <item>
<widget class="QLabel" name="lblContent">
<property name="styleSheet">
<string notr="true"/>
@@ -111,24 +105,20 @@
</property>
</widget>
</item>
- <item row="3" column="1">
- <layout class="QFormLayout" name="bioAuthLayout">
- <property name="bottomMargin">
- <number>8</number>
- </property>
- </layout>
- </item>
- <item row="4" column="1">
+ <item>
<layout class="QHBoxLayout" name="titleTipLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
<property name="topMargin">
- <number>8</number>
+ <number>0</number>
</property>
<property name="bottomMargin">
- <number>8</number>
+ <number>0</number>
</property>
</layout>
</item>
- <item row="5" column="1">
+ <item>
<widget class="QWidget" name="loadingUkeyWidget" native="true">
<property name="minimumSize">
<size>
@@ -140,6 +130,9 @@
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="spacing">
+ <number>8</number>
+ </property>
<property name="leftMargin">
<number>0</number>
</property>
@@ -149,6 +142,9 @@
<property name="rightMargin">
<number>0</number>
</property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
<item>
<widget class="QPushButton" name="loadingUkeyBtn">
<property name="text">
@@ -169,7 +165,7 @@
</layout>
</widget>
</item>
- <item row="6" column="1">
+ <item>
<widget class="QComboBox" name="cmbUsers">
<property name="enabled">
<bool>true</bool>
@@ -179,14 +175,7 @@
</property>
</widget>
</item>
- <item row="7" column="1">
- <layout class="QFormLayout" name="bioDeviceLayout">
- <property name="bottomMargin">
- <number>8</number>
- </property>
- </layout>
- </item>
- <item row="8" column="1">
+ <item>
<widget class="QWidget" name="widgetUkeyAuth" native="true">
<property name="minimumSize">
<size>
@@ -211,12 +200,9 @@
<number>9</number>
</property>
<item>
- <layout class="QFormLayout" name="formLayout_3">
- <property name="horizontalSpacing">
- <number>0</number>
- </property>
- <property name="verticalSpacing">
- <number>6</number>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <property name="spacing">
+ <number>8</number>
</property>
<property name="topMargin">
<number>0</number>
@@ -227,7 +213,17 @@
<property name="bottomMargin">
<number>0</number>
</property>
- <item row="1" column="0" colspan="2">
+ <item>
+ <widget class="QLabel" name="ukeyTipLbl">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLineEdit" name="ukeyPassword">
<property name="contextMenuPolicy">
<enum>Qt::NoContextMenu</enum>
@@ -237,7 +233,7 @@
</property>
</widget>
</item>
- <item row="3" column="0" colspan="2">
+ <item>
<widget class="KALabel" name="ukeyMessage">
<property name="minimumSize">
<size>
@@ -262,22 +258,12 @@
</property>
</widget>
</item>
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="ukeyTipLbl">
- <property name="text">
- <string/>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
</widget>
</item>
- <item row="9" column="1">
+ <item>
<widget class="QWidget" name="widgetPasswdAuth" native="true">
<property name="minimumSize">
<size>
@@ -299,17 +285,14 @@
<number>0</number>
</property>
<item>
- <layout class="QFormLayout" name="formLayout_2">
- <property name="horizontalSpacing">
- <number>0</number>
- </property>
- <property name="verticalSpacing">
- <number>6</number>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <property name="spacing">
+ <number>8</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
- <item row="0" column="0" colspan="2">
+ <item>
<widget class="QLineEdit" name="lePassword">
<property name="contextMenuPolicy">
<enum>Qt::NoContextMenu</enum>
@@ -319,7 +302,7 @@
</property>
</widget>
</item>
- <item row="2" column="0" colspan="2">
+ <item>
<widget class="KALabel" name="lblMessage">
<property name="minimumSize">
<size>
@@ -351,23 +334,10 @@
</item>
</layout>
</item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
<item>
<layout class="QVBoxLayout" name="loginOptionsLayout">
<property name="spacing">
- <number>8</number>
+ <number>0</number>
</property>
<property name="leftMargin">
<number>24</number>
@@ -383,6 +353,19 @@
</property>
</layout>
</item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="spacing">
@@ -399,6 +382,12 @@
</property>
<item>
<widget class="QPushButton" name="btnBioAuth">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>36</height>
+ </size>
+ </property>
<property name="cursor">
<cursorShape>ArrowCursor</cursorShape>
</property>
@@ -431,6 +420,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>36</height>
+ </size>
+ </property>
<property name="cursor">
<cursorShape>ArrowCursor</cursorShape>
</property>
@@ -450,6 +445,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>36</height>
+ </size>
+ </property>
<property name="cursor">
<cursorShape>ArrowCursor</cursorShape>
</property>
@@ -463,6 +464,12 @@
</item>
<item>
<widget class="QPushButton" name="btnLoading">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>36</height>
+ </size>
+ </property>
<property name="text">
<string/>
</property>
@@ -473,6 +480,12 @@
</item>
<item>
<widget class="QPushButton" name="returnButton">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>36</height>
+ </size>
+ </property>
<property name="styleSheet">
<string notr="true"/>
</property>
diff --git a/polkit-agent/src/modeButton.h b/polkit-agent/src/modeButton.h
index 51ab67f..63bc0fd 100644
--- a/polkit-agent/src/modeButton.h
+++ b/polkit-agent/src/modeButton.h
@@ -37,7 +37,7 @@ public:
bool isShowPwd();
protected:
- bool eventFilter(QObject *obj, QEvent *event) override; //事件过滤
+ bool eventFilter(QObject *obj, QEvent *event) override; //事件过滤
private:
void initStyleTheme();
diff --git a/polkit-agent/src/pam-tally.c b/polkit-agent/src/pam-tally.c
index da2651b..180c7d2 100644
--- a/polkit-agent/src/pam-tally.c
+++ b/polkit-agent/src/pam-tally.c
@@ -111,7 +111,7 @@ int get_is_open_other_authentication()
int get_pam_tally(int *deny, int *unlock_time , int *root_unlock_time)
{
char buf[128];
- FILE *auth_file;
+ FILE *auth_file = NULL;
if( (auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL)
return -1;
@@ -138,8 +138,12 @@ int get_pam_tally(int *deny, int *unlock_time , int *root_unlock_time)
}
ptr = strtok(NULL, " \t");
}
+ fclose(auth_file);
+ auth_file = NULL;
return 1;
}
+ fclose(auth_file);
+ auth_file = NULL;
return 0;
}
@@ -389,15 +393,15 @@ void get_tally(uid_t uid, int *tfile, struct tallylog *tally)
int pam_tally_unlock_time_left(int uid, int *fail_cnt,int *left_time, int *deny, int *fail_time, int *unlock_time1)
{
- pam_tally *tally_ptr;
+ pam_tally *tally_ptr;
- if((tally_ptr = pam_tally_memory()) == NULL)
- return 0;
+ if((tally_ptr = pam_tally_memory()) == NULL)
+ return 0;
- int unlock_time = tally_ptr->unlock_time;
+ int unlock_time = tally_ptr->unlock_time;
*deny = tally_ptr->deny;
if(unlock_time == 0)
- return 0;
+ return 0;
int tfile = -1;
struct tallylog tally;
diff --git a/polkit-agent/src/pam-tally.h b/polkit-agent/src/pam-tally.h
index 2585f56..5741e83 100644
--- a/polkit-agent/src/pam-tally.h
+++ b/polkit-agent/src/pam-tally.h
@@ -21,30 +21,32 @@
#include <time.h>
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
#define SHM_TALLY "/shm_tally"
-struct _pam_tally {
- int deny; //失败次数上限
- int unlock_time; //普通用户失败次数达到上限后,多少秒之后才能解锁
- int root_unlock_time; //root用户失败次数达到上限后多少秒之后才能解锁
- int failed; //当前失败的次数
- time_t lock_start_time; //失败次数达到上限后,开始计时
-};
-typedef struct _pam_tally pam_tally;
+ struct _pam_tally
+ {
+ int deny; //失败次数上限
+ int unlock_time; //普通用户失败次数达到上限后,多少秒之后才能解锁
+ int root_unlock_time; // root用户失败次数达到上限后多少秒之后才能解锁
+ int failed; //当前失败的次数
+ time_t lock_start_time; //失败次数达到上限后,开始计时
+ };
+ typedef struct _pam_tally pam_tally;
-int pam_tally_init();
-int pam_tally_add_failed();
-int pam_tally_clear_failed();
-int pam_tally_falure_is_out();
-int pam_tally_deny();
-int pam_tally_failed_count();
-int pam_tally_unlock_time();
-int pam_tally_is_enbled();
-int pam_tally_is_canUnlock();
-int pam_tally_unlock_time_left(int uid, int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time);
-int pam_tally_root_unlock_time_left(int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time1);
+ int pam_tally_init();
+ int pam_tally_add_failed();
+ int pam_tally_clear_failed();
+ int pam_tally_falure_is_out();
+ int pam_tally_deny();
+ int pam_tally_failed_count();
+ int pam_tally_unlock_time();
+ int pam_tally_is_enbled();
+ int pam_tally_is_canUnlock();
+ int pam_tally_unlock_time_left(int uid, int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time);
+ int pam_tally_root_unlock_time_left(int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time1);
#ifdef __cplusplus
}
diff --git a/polkit-agent/src/sessionmanager.cpp b/polkit-agent/src/sessionmanager.cpp
index 61d4ace..d9ee886 100644
--- a/polkit-agent/src/sessionmanager.cpp
+++ b/polkit-agent/src/sessionmanager.cpp
@@ -27,40 +27,35 @@
#define SM_DBUS_INTERFACE "org.gnome.SessionManager"
#define SM_DBUS_CLIENT_INTERFACE "org.gnome.SessionManager.ClientPrivate"
-
SessionManager::SessionManager(QObject *parent) : QObject(parent)
{
- smInterface = new QDBusInterface(SM_DBUS_SERVICE,
- SM_DBUS_PATH,
- SM_DBUS_INTERFACE,
- QDBusConnection::sessionBus());
+ smInterface = new QDBusInterface(SM_DBUS_SERVICE, SM_DBUS_PATH, SM_DBUS_INTERFACE, QDBusConnection::sessionBus());
QString appId("polkit-ukui-authentication-agent-1.desktop");
QString clientStartupId(qgetenv("DESKTOP_AUTOSTART_ID"));
- QDBusReply<QDBusObjectPath> reply = smInterface->call("RegisterClient",
- appId, clientStartupId);
+ QDBusReply<QDBusObjectPath> reply = smInterface->call("RegisterClient", appId, clientStartupId);
- if(!reply.isValid()) {
+ if (!reply.isValid()) {
qWarning() << "Register Client to gnome session failed";
}
clientId = reply.value().path();
qDebug() << "Register Client to gnome session: " << reply.value().path();
- clientInterface = new QDBusInterface(SM_DBUS_SERVICE,
- clientId,
- SM_DBUS_CLIENT_INTERFACE,
- QDBusConnection::sessionBus());
+ clientInterface
+ = new QDBusInterface(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, QDBusConnection::sessionBus());
qDebug() << clientInterface->isValid();
QDBusConnection conn = clientInterface->connection();
- conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE,
- "Stop", this, SLOT(onStop()));
- conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE,
- "EndSession", this, SLOT(onEndSession(unsigned int)));
- conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE,
- "QueryEndSession", this, SLOT(onQueryEndSession(unsigned int)));
-
+ conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, "Stop", this, SLOT(onStop()));
+ conn.connect(
+ SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, "EndSession", this, SLOT(onEndSession(unsigned int)));
+ conn.connect(SM_DBUS_SERVICE,
+ clientId,
+ SM_DBUS_CLIENT_INTERFACE,
+ "QueryEndSession",
+ this,
+ SLOT(onQueryEndSession(unsigned int)));
}
void SessionManager::onStop()
@@ -82,6 +77,6 @@ void SessionManager::onQueryEndSession(unsigned int flag)
void SessionManager::endSessionResponse()
{
QDBusMessage msg = clientInterface->call("EndSessionResponse", true, "");
- if(msg.type() == QDBusMessage::ErrorMessage)
+ if (msg.type() == QDBusMessage::ErrorMessage)
qDebug() << "Failed to call EndSessionResponse " << msg.errorMessage();
}
diff --git a/polkit-agent/src/types.h b/polkit-agent/src/types.h
index ded7185..3881c37 100644
--- a/polkit-agent/src/types.h
+++ b/polkit-agent/src/types.h
@@ -34,34 +34,34 @@ enum ScreenStatus
SCREEN_LOCK = 0x02
};
-#define SM_DBUS_SERVICE "org.gnome.SessionManager"
-#define SM_DBUS_PATH "/org/gnome/SessionManager/Presence"
-#define SM_DBUS_INTERFACE "org.gnome.SessionManager.Presence"
+#define SM_DBUS_SERVICE "org.gnome.SessionManager"
+#define SM_DBUS_PATH "/org/gnome/SessionManager/Presence"
+#define SM_DBUS_INTERFACE "org.gnome.SessionManager.Presence"
-#define DM_DBUS_SERVICE "org.freedesktop.DisplayManager"
-#define DM_DBUS_PATH "/org/freedesktop/DisplayManager"
-#define DM_DBUS_INTERFACE "org.freedesktop.DisplayManager"
-#define DM_SEAT_INTERFACE "org.freedesktop.DisplayManager.Seat"
+#define DM_DBUS_SERVICE "org.freedesktop.DisplayManager"
+#define DM_DBUS_PATH "/org/freedesktop/DisplayManager"
+#define DM_DBUS_INTERFACE "org.freedesktop.DisplayManager"
+#define DM_SEAT_INTERFACE "org.freedesktop.DisplayManager.Seat"
-#define ACT_DBUS_SERVICE "org.freedesktop.Accounts"
-#define ACT_DBUS_PATH "/org/freedesktop/Accounts"
-#define ACT_DBUS_INTERFACE "org.freedesktop.Accounts"
-#define ACT_USER_INTERFACE "org.freedesktop.Accounts.User"
+#define ACT_DBUS_SERVICE "org.freedesktop.Accounts"
+#define ACT_DBUS_PATH "/org/freedesktop/Accounts"
+#define ACT_DBUS_INTERFACE "org.freedesktop.Accounts"
+#define ACT_USER_INTERFACE "org.freedesktop.Accounts.User"
#define DBUS_PROP_INTERFACE "org.freedesktop.DBus.Properties"
-#define SS_DBUS_SERVICE "org.ukui.ScreenSaver"
-#define SS_DBUS_PATH "/"
-#define SS_DBUS_INTERFACE "org.ukui.ScreenSaver"
+#define SS_DBUS_SERVICE "org.ukui.ScreenSaver"
+#define SS_DBUS_PATH "/"
+#define SS_DBUS_INTERFACE "org.ukui.ScreenSaver"
#define BIO_ERROR -1
#define BIO_FAILED 0
#define BIO_SUCCESS 1
#define BIO_IGNORE 2
-#define BIOMETRIC_PAM "BIOMETRIC_PAM"
-#define BIOMETRIC_IGNORE "BIOMETRIC_IGNORE"
-#define BIOMETRIC_SUCCESS "BIOMETRIC_SUCCESS"
-#define BIOMETRIC_FAILED "BIOMETRIC_FAILED"
+#define BIOMETRIC_PAM "BIOMETRIC_PAM"
+#define BIOMETRIC_IGNORE "BIOMETRIC_IGNORE"
+#define BIOMETRIC_SUCCESS "BIOMETRIC_SUCCESS"
+#define BIOMETRIC_FAILED "BIOMETRIC_FAILED"
#endif // TYPES_H
diff --git a/polkit-agent/src/usdblockshortcut.cpp b/polkit-agent/src/usdblockshortcut.cpp
new file mode 100644
index 0000000..2d0b57c
--- /dev/null
+++ b/polkit-agent/src/usdblockshortcut.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ **/
+#include "usdblockshortcut.h"
+#include <QDBusConnection>
+#include <QDBusError>
+#include <QDBusMetaType>
+#include <QDebug>
+
+USDBlockShortCut::USDBlockShortCut(QObject *parent) : QObject(parent)
+{
+ QString displayNum = QString(qgetenv("DISPLAY")).replace(":", "").replace(".", "_");
+ m_strDbusPath = QString("%1%2").arg(QString("org.ukui.settingsDaemon.shortcut.ukui-polkit")).arg(displayNum);
+ m_isRegistService = QDBusConnection::sessionBus().registerService(m_strDbusPath);
+ if (!m_isRegistService) {
+ qInfo() << "registerService " << m_strDbusPath << " failed!!";
+ } else {
+ m_isRegistObject = QDBusConnection::sessionBus().registerObject(
+ "/org/ukui/settingsDaemon/shortcut",
+ "org.ukui.settingsDaemon.shortcut",
+ this,
+ QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllProperties);
+ if (!m_isRegistObject) {
+ qInfo() << "registerObject /org/ukui/settingsDaemon/shortcut failed!!";
+ }
+ }
+}
+
+USDBlockShortCut::~USDBlockShortCut()
+{
+ if (m_isRegistObject) {
+ QDBusConnection::sessionBus().unregisterObject("/org/ukui/settingsDaemon/shortcut");
+ m_isRegistObject = false;
+ }
+ if (m_isRegistService) {
+ QDBusConnection::sessionBus().unregisterService(m_strDbusPath);
+ m_isRegistService = false;
+ }
+}
+
+QStringList USDBlockShortCut::blockShortcuts()
+{
+ QStringList listShortCut = {
+ "WINDOWSWITCH_KEY", "WLCOM_SWITCH_WORKSPACE", "WLCOM_WINDOW_ACTION", "WLCOM_MAXIMIZED_VIEWS", "WLCOM_CTRL_VIEWS"
+ };
+ return listShortCut;
+}
diff --git a/polkit-agent/src/usdblockshortcut.h b/polkit-agent/src/usdblockshortcut.h
new file mode 100644
index 0000000..645cba9
--- /dev/null
+++ b/polkit-agent/src/usdblockshortcut.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ **/
+#ifndef USDBLOCKSHORTCUT_H
+#define USDBLOCKSHORTCUT_H
+
+#include <QObject>
+#include <QDBusAbstractAdaptor>
+#include <QDBusContext>
+#include <QStringList>
+
+class USDBlockShortCut : public QObject, public QDBusContext
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.ukui.settingsDaemon.shortcut")
+ Q_PROPERTY(QStringList blockShortcuts READ blockShortcuts)
+
+public:
+ USDBlockShortCut(QObject *parent = nullptr);
+ virtual ~USDBlockShortCut();
+
+public slots:
+ /**
+ * @brief blockShortcuts 禁用按键列表
+ * @return 禁用按键字符串列表
+ */
+ QStringList blockShortcuts();
+
+private:
+ bool m_isRegistService = false; /**是否已注册服务*/
+ bool m_isRegistObject = false; /**是否已注册对象*/
+ QString m_strDbusPath; /**dbus服务路径*/
+};
+
+#endif // USDBLOCKSHORTCUT_H
diff --git a/polkit-agent/src/users.cpp b/polkit-agent/src/users.cpp
index 64395c5..d9908f5 100644
--- a/polkit-agent/src/users.cpp
+++ b/polkit-agent/src/users.cpp
@@ -29,8 +29,7 @@
QDebug operator<<(QDebug stream, const UserItem &user)
{
- stream << user.name << user.realName << user.uid
- << user.icon << user.path;
+ stream << user.name << user.realName << user.uid << user.icon << user.path;
return stream;
}
@@ -47,26 +46,20 @@ QList<UserItem> Users::getUsers()
UserItem Users::getUserByName(const QString &name)
{
- for(int i = 0 ; i < users.size() ; i++) {
- if(users.at(i).name == name)
- {
+ for (int i = 0; i < users.size(); i++) {
+ if (users.at(i).name == name) {
return users.at(i);
}
}
UserItem user;
- if(name == "root")
- {
+ if (name == "root") {
user.icon = "/root/.face";
- if(!QFile(user.icon).exists())
- {
+ if (!QFile(user.icon).exists()) {
user.icon = defaultIcon;
}
- }
- else
- {
- user.icon = qgetenv("HOME")+"/.face";
- if(!QFile(user.icon).exists())
- {
+ } else {
+ user.icon = qgetenv("HOME") + "/.face";
+ if (!QFile(user.icon).exists()) {
user.icon = defaultIcon;
}
}
@@ -81,29 +74,23 @@ QString Users::getDefaultIcon()
return defaultIcon;
}
-
-//https://stackoverflow.com/questions/20206376/
-//how-do-i-extract-the-returned-data-from-qdbusmessage-in-a-qt-dbus-call
+// https://stackoverflow.com/questions/20206376/
+// how-do-i-extract-the-returned-data-from-qdbusmessage-in-a-qt-dbus-call
void Users::loadUsers()
{
qDebug() << "loadUsers";
- actService = new QDBusInterface(ACT_DBUS_SERVICE,
- ACT_DBUS_PATH,
- ACT_DBUS_INTERFACE,
- QDBusConnection::systemBus());
+ actService = new QDBusInterface(ACT_DBUS_SERVICE, ACT_DBUS_PATH, ACT_DBUS_INTERFACE, QDBusConnection::systemBus());
- connect(actService, SIGNAL(UserAdded(const QDBusObjectPath&)),
- this, SLOT(onUserAdded(const QDBusObjectPath&)));
- connect(actService, SIGNAL(UserDeleted(const QDBusObjectPath&)),
- this, SLOT(onUserDeleted(const QDBusObjectPath&)));
+ connect(actService, SIGNAL(UserAdded(const QDBusObjectPath &)), this, SLOT(onUserAdded(const QDBusObjectPath &)));
+ connect(
+ actService, SIGNAL(UserDeleted(const QDBusObjectPath &)), this, SLOT(onUserDeleted(const QDBusObjectPath &)));
QDBusMessage ret = actService->call("ListCachedUsers");
- QList<QVariant> outArgs = ret.arguments(); //(QVariant(QDBusArgument,))
- QVariant first = outArgs.at(0); //QVariant(QDBusArgument,)
+ QList<QVariant> outArgs = ret.arguments(); //(QVariant(QDBusArgument,))
+ QVariant first = outArgs.at(0); // QVariant(QDBusArgument,)
const QDBusArgument &dbusArgs = first.value<QDBusArgument>();
QDBusObjectPath path;
dbusArgs.beginArray();
- while (!dbusArgs.atEnd())
- {
+ while (!dbusArgs.atEnd()) {
dbusArgs >> path;
getUser(path.path());
}
@@ -112,10 +99,7 @@ void Users::loadUsers()
UserItem Users::getUser(const QString &path)
{
- QDBusInterface iface(ACT_DBUS_SERVICE,
- path,
- DBUS_PROP_INTERFACE,
- QDBusConnection::systemBus());
+ QDBusInterface iface(ACT_DBUS_SERVICE, path, DBUS_PROP_INTERFACE, QDBusConnection::systemBus());
QDBusMessage ret = iface.call("GetAll", ACT_USER_INTERFACE);
QList<QVariant> outArgs = ret.arguments();
QVariant first = outArgs.at(0);
@@ -123,57 +107,45 @@ UserItem Users::getUser(const QString &path)
UserItem user;
user.path = path;
dbusArgs.beginMap();
- while(!dbusArgs.atEnd())
- {
+ while (!dbusArgs.atEnd()) {
QString key;
QVariant value;
dbusArgs.beginMapEntry();
dbusArgs >> key >> value;
- if(key == "UserName")
- {
- user.name = value.toString();
- }
- else if(key == "RealName")
- {
+ if (key == "UserName") {
+ user.name = value.toString();
+ } else if (key == "RealName") {
user.realName = value.toString();
- }
- else if(key == "IconFile")
- {
+ } else if (key == "IconFile") {
user.icon = value.toString();
- if(!QFile(user.icon).exists())
- {
+ if (!QFile(user.icon).exists()) {
user.icon = defaultIcon;
}
- }
- else if(key == "Uid")
- {
+ } else if (key == "Uid") {
user.uid = value.toUInt();
}
dbusArgs.endMapEntry();
}
dbusArgs.endMap();
- if(user.realName.isEmpty())
- {
+ if (user.realName.isEmpty()) {
user.realName = user.name;
}
users.push_back(user);
return user;
}
-void Users::onUserAdded(const QDBusObjectPath& path)
+void Users::onUserAdded(const QDBusObjectPath &path)
{
int index = findUserByPath(path.path());
- if(index >=0 &&index<users.count())
- {
+ if (index >= 0 && index < users.count()) {
UserItem user = getUser(path.path());
Q_EMIT userAdded(user);
}
}
-void Users::onUserDeleted(const QDBusObjectPath& path)
+void Users::onUserDeleted(const QDBusObjectPath &path)
{
int index = findUserByPath(path.path());
- if(index >= 0 && index<users.count())
- {
+ if (index >= 0 && index < users.count()) {
UserItem user = users.at(index);
users.removeAt(index);
Q_EMIT userDeleted(user);
@@ -182,13 +154,9 @@ void Users::onUserDeleted(const QDBusObjectPath& path)
int Users::findUserByPath(const QString &path)
{
- auto iter = std::find_if(users.begin(), users.end(),
- [&](const UserItem &user){
- return user.path == path;
- });
+ auto iter = std::find_if(users.begin(), users.end(), [&](const UserItem &user) { return user.path == path; });
int index = iter - users.begin();
return index;
}
-
diff --git a/polkit-agent/src/users.h b/polkit-agent/src/users.h
index 509cb3f..747bcc3 100644
--- a/polkit-agent/src/users.h
+++ b/polkit-agent/src/users.h
@@ -20,14 +20,13 @@
#include <QObject>
-
struct UserItem
{
QString name;
QString realName;
QString icon;
quint64 uid;
- QString path; //accounts service path
+ QString path; // accounts service path
friend QDebug operator<<(QDebug stream, const UserItem &user);
};
@@ -48,17 +47,17 @@ private:
int findUserByPath(const QString &path);
private Q_SLOTS:
- void onUserAdded(const QDBusObjectPath& path);
- void onUserDeleted(const QDBusObjectPath& path);
+ void onUserAdded(const QDBusObjectPath &path);
+ void onUserDeleted(const QDBusObjectPath &path);
Q_SIGNALS:
void userAdded(const UserItem &user);
void userDeleted(const UserItem &user);
private:
- QDBusInterface *actService;
- QList<UserItem> users;
- QString defaultIcon;
+ QDBusInterface *actService;
+ QList<UserItem> users;
+ QString defaultIcon;
};
#endif // USERS_H