diff --git a/bioauth-bin/i18n_ts/bo_CN.ts b/bioauth-bin/i18n_ts/bo_CN.ts
index 4db662a..149ffa2 100644
--- a/bioauth-bin/i18n_ts/bo_CN.ts
+++ b/bioauth-bin/i18n_ts/bo_CN.ts
@@ -87,5 +87,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bioauth-bin/i18n_ts/zh_CN.ts b/bioauth-bin/i18n_ts/zh_CN.ts
index d43bcb3..3361365 100644
--- a/bioauth-bin/i18n_ts/zh_CN.ts
+++ b/bioauth-bin/i18n_ts/zh_CN.ts
@@ -4,7 +4,16 @@
QObject
-
+
+ 输入ukey密码
+
+
+
+
+ 输入ukey密码\n
+
+
+
再试一次
@@ -81,7 +90,12 @@
-
+
+
+ ukey认证
+
+
+
生物识别认证
@@ -116,7 +130,12 @@
无法验证%1,请输入密码.
-
+
+
+ 认证结束
+
+
+
生物识别认证结束
diff --git a/bioauth-bin/src/main.cpp b/bioauth-bin/src/main.cpp
index 2bd5322..ed29e03 100644
--- a/bioauth-bin/src/main.cpp
+++ b/bioauth-bin/src/main.cpp
@@ -20,6 +20,7 @@
#include
#include
#include
+#include
#include
@@ -92,6 +93,39 @@ void showMessage(const QString &message, int type)
fprintf(stdout, RESET_COLOR);
}
+QString inputPinCode()
+{
+ struct termios current;
+ struct termios save;
+ tcgetattr(0, &save);
+
+ current = save;
+// current.c_lflag &= ~ICANON;
+ current.c_lflag &= ~ECHO;
+ current.c_cc[VMIN] = 0;
+ current.c_cc[VTIME] = 0;
+ tcsetattr(0, TCSANOW, ¤t);
+
+ QString password = "";
+ showMessage(QObject::tr("Enter the ukey password"), QUESTION);
+
+ char line[1024] = {0};
+ fgets(line, sizeof(line), stdin);
+ //scanf("%s",&line);
+
+ showMessage("\n", QUESTION);
+
+ line[1023] = '\0';
+
+ if(line[strlen(line) - 1] == '\n')
+ line[strlen(line) - 1] = '\0';
+
+ QString str(line);
+
+ tcsetattr(0, TCSANOW, &save); // 恢复原来的终端属性,以免干扰shall和之后的程序运行
+ return line;
+}
+
Option showOption(bool showSelectDevices)
{
QStringList optionList;
@@ -247,13 +281,18 @@ int main(int argc, char *argv[])
if(bioDevices.getFeatureCount(uid)<1)
exit(BIO_ERROR);
- showMessage(QObject::tr("BIOMETRIC AUTHENTICATION"), START);
- if(!isHiddenSwitchButton)
- showMessage(QObject::tr("Press Q or Esc to cancel"), PROMPT);
+ if(deviceInfo->biotype == 6){
+ showMessage(QObject::tr("UKEY AUTHENTICATION"), START);
+ }else{
+ showMessage(QObject::tr("BIOMETRIC AUTHENTICATION"), START);
+ if(!isHiddenSwitchButton)
+ showMessage(QObject::tr("Press Q or Esc to cancel"), PROMPT);
+ }
BioAuth bioAuth(uid, deviceInfo);
KeyWatcher watcher;
QMap m_failedTimes;
+
QObject::connect(&bioAuth, &BioAuth::notify, &a, [&](const QString &msg){
showMessage(msg, NOTIFY);
});
@@ -261,7 +300,11 @@ int main(int argc, char *argv[])
Q_UNUSED(retErrNo);
watcher.stop();
bool isBioEnable = bioDevices.GetBioAuthEnable(uid_);
- if(!isBioEnable){
+ bool isUkeyDevice = false;
+ if(deviceInfo && deviceInfo->biotype == 6){
+ isUkeyDevice = true;
+ }
+ if(!isBioEnable && !isUkeyDevice){
showMessage(QObject::tr("BIOMETRIC AUTHENTICATION IS CLOSED"), RESULT);
exit(BIO_IGNORE);
}
@@ -271,31 +314,43 @@ int main(int argc, char *argv[])
}
else {
showMessage(QObject::tr("AUTHENTICATION FAILED"), RESULT);
-
+ DeviceInfoPtr curDeviceInfo = bioAuth.getDevice();
if (m_failedTimes.contains(deviceInfo->device_id)) {
- m_failedTimes[deviceInfo->device_id] = m_failedTimes[deviceInfo->device_id] + 1;
+ m_failedTimes[curDeviceInfo->device_id] = m_failedTimes[curDeviceInfo->device_id] + 1;
} else {
- m_failedTimes[deviceInfo->device_id] = 1;
+ m_failedTimes[curDeviceInfo->device_id] = 1;
}
- if(m_failedTimes[deviceInfo->device_id]device_id]biotype)).arg(maxFailedTimes-m_failedTimes[deviceInfo->device_id]),RESULT);
+ showMessage(QObject::tr("Failed to verify %1, you still have %2 verification opportunities").arg(bioDevices.bioTypeToString_tr(curDeviceInfo->biotype)).arg(maxFailedTimes-m_failedTimes[deviceInfo->device_id]),RESULT);
}else{
- showMessage(QObject::tr("Unable to verify %1, please enter password.").arg(bioDevices.bioTypeToString_tr(deviceInfo->biotype)),RESULT);
+ showMessage(QObject::tr("Unable to verify %1, please enter password.").arg(bioDevices.bioTypeToString_tr(curDeviceInfo->biotype)),RESULT);
exit(BIO_IGNORE);
}
Option option = showOption(bioDevices.count() > 1);
switch(option) {
case OPTION_TRY_AGAIN:
+
+ if(deviceInfo->biotype == 6){
+ QString code = inputPinCode();
+ bioAuth.SetExtraInfo("pincode",code);
+ }
+
bioAuth.startAuth();
watcher.start();
break;
case OPTION_SELECT_DEVICE:
{
- DeviceInfoPtr deviceInfo = std::make_shared();
+ deviceInfo = std::make_shared();
*deviceInfo = showDevices(bioDevices.getAllDevices());
bioAuth.setDevice(deviceInfo);
+
+ if(deviceInfo->biotype == 6){
+ QString code = inputPinCode();
+ bioAuth.SetExtraInfo("pincode",code);
+ }
+
bioAuth.startAuth();
watcher.start();
break;
@@ -305,8 +360,12 @@ int main(int argc, char *argv[])
{
exit(BIO_ERROR);
}else{
- showMessage(QObject::tr("BIOMETRIC AUTHENTICATION END"), START);
- exit(BIO_IGNORE);
+ if(deviceInfo->biotype == 6){
+ showMessage(QObject::tr("AUTHENTICATION END"), START);
+ }else{
+ showMessage(QObject::tr("BIOMETRIC AUTHENTICATION END"), START);
+ }
+ exit(BIO_IGNORE);
break;
}
default:
@@ -314,6 +373,12 @@ int main(int argc, char *argv[])
}
}
});
+
+ if(deviceInfo->biotype == 6){
+ QString code = inputPinCode();
+ bioAuth.SetExtraInfo("pincode",code);
+ }
+
bioAuth.startAuth();
if(!isHiddenSwitchButton){
diff --git a/bioauth/i18n_ts/bo_CN.ts b/bioauth/i18n_ts/bo_CN.ts
index 42b8bca..4afb7e6 100644
--- a/bioauth/i18n_ts/bo_CN.ts
+++ b/bioauth/i18n_ts/bo_CN.ts
@@ -82,6 +82,10 @@
ཨང་ཀི་ཕྱག་པ།
+
+
+
+
BioDevicesWidget
@@ -108,5 +112,9 @@
ཐོ་འགོད་ཀྱི་བསལ་འདེམས་ཀྱི་དབང་ཆ།
+
+
+ གསང་ཨང་།
+
diff --git a/bioauth/i18n_ts/zh_CN.ts b/bioauth/i18n_ts/zh_CN.ts
index 6777054..d009954 100644
--- a/bioauth/i18n_ts/zh_CN.ts
+++ b/bioauth/i18n_ts/zh_CN.ts
@@ -28,7 +28,7 @@
- 密码
+ 密码
@@ -99,7 +99,12 @@
声纹
-
+
+
+
+
+
+
二维码
@@ -139,6 +144,11 @@
登录选项
+
+
+
+ 密码
+
微信
diff --git a/bioauth/include/bioauth.h b/bioauth/include/bioauth.h
index c3f4146..ee9d55b 100644
--- a/bioauth/include/bioauth.h
+++ b/bioauth/include/bioauth.h
@@ -36,11 +36,29 @@ public:
explicit BioAuth(QObject *parent = nullptr);
~BioAuth();
void setDevice(const DeviceInfoPtr deviceInfo);
+ DeviceInfoPtr getDevice();
void startAuth();
+ void startUkeyAuth();
void startAuth(qint32 uid, const DeviceInfoPtr deviceInfo);
void stopAuth();
bool isAuthenticating();
void init();
+ /**
+ * @brief 设置一些认证时所需的额外的信息
+ * @param info_type 额外的信息类型,ukey pincode认证时传 "pincode"
+ * @param extra_info 额外的信息内容,ukey pincode认证时传PIN码内容
+ * @return 结果: (设置额外信息的结果)
+ */
+ int SetExtraInfo(QString info_type, QString extra_info);
+ /**
+ * @brief 获取当前用户已连接设备对应特征数目
+ * @param uid 用户id
+ * @param indexStart 用于认证的特征索引范围
+ * @param indexEnd
+ * @return 返回是否存在ukey特征
+ */
+ bool GetHasUkeyFeature(int uid, int indexStart = 0, int indexEnd = -1);
+
signals:
void authComplete(int uid, bool result, int retErrNo);
diff --git a/bioauth/include/biodevices.h b/bioauth/include/biodevices.h
index 2aa8098..2308138 100644
--- a/bioauth/include/biodevices.h
+++ b/bioauth/include/biodevices.h
@@ -45,6 +45,7 @@ public:
QMap> getUserDevices(int uid);
QList getDevices(int type);
DeviceInfoPtr getDefaultDevice(uid_t uid);
+ DeviceInfoPtr getDefaultDevice(uid_t uid,int bioType);
int GetLastDevice(const QString &userName);
void SetLastDevice(const QString &userName, int drvid);
DeviceInfoPtr findDevice(const QString &deviceName);
diff --git a/bioauth/include/biotypes.h b/bioauth/include/biotypes.h
index 862d0ee..07a940f 100644
--- a/bioauth/include/biotypes.h
+++ b/bioauth/include/biotypes.h
@@ -34,6 +34,20 @@
#endif
#define LOG() qDebug() << "[BIOMETRIC]"
+enum LOGINOPT_TYPE {
+ LOGINOPT_TYPE_PASSWORD = 0, // 密码
+ LOGINOPT_TYPE_FACE, // 人脸
+ LOGINOPT_TYPE_FINGERPRINT, // 指纹
+ LOGINOPT_TYPE_IRIS, // 虹膜
+ LOGINOPT_TYPE_VOICEPRINT, // 声纹
+ LOGINOPT_TYPE_FINGERVEIN, // 指静脉
+ LOGINOPT_TYPE_GENERAL_UKEY, // 普通的ukey
+ LOGINOPT_TYPE_ADVANCED_UKEY, // 高阶的ukey
+ LOGINOPT_TYPE_QRCODE, // 二维码
+ LOGINOPT_TYPE_OTHERS, // 其他
+ LOGINOPT_TYPE_COUNT
+};
+
/* the type of device */
enum BioType {
BIOTYPE_FINGERPRINT,
@@ -173,6 +187,14 @@ struct StatusReslut
int notifyMessageId;
};
+struct FeatureInfo {
+ int uid;
+ int biotype;
+ QString device_shortname;
+ int index;
+ QString index_name;
+};
+
/* the info of device */
struct DeviceInfo {
int device_id;
@@ -207,6 +229,8 @@ typedef QMap DeviceMap;
QDBusArgument &operator<<(QDBusArgument &argument, const DeviceInfo &deviceInfo);
const QDBusArgument &operator>>(const QDBusArgument &argument, DeviceInfo &deviceInfo);
QDebug operator <<(QDebug stream, const DeviceInfo &deviceInfo);
+QDBusArgument &operator<<(QDBusArgument &argument, const FeatureInfo &featureInfo);
+const QDBusArgument &operator>>(const QDBusArgument &argument, FeatureInfo &featureInfo);
QString bioTypeToString(int type);
diff --git a/bioauth/include/loginoptionswidget.h b/bioauth/include/loginoptionswidget.h
index 14d1fd0..31c69e2 100644
--- a/bioauth/include/loginoptionswidget.h
+++ b/bioauth/include/loginoptionswidget.h
@@ -30,17 +30,18 @@ class QVBoxLayout;
class QToolButton;
class QTimer;
-enum LOGINOPT_TYPE {
- LOGINOPT_TYPE_PASSWORD = 0, // 密码
- LOGINOPT_TYPE_FACE, // 人脸
- LOGINOPT_TYPE_FINGERPRINT, // 指纹
- LOGINOPT_TYPE_IRIS, // 虹膜
- LOGINOPT_TYPE_VOICEPRINT, // 声纹
- LOGINOPT_TYPE_FINGERVEIN, // 指静脉
- LOGINOPT_TYPE_QRCODE, // 二维码
- LOGINOPT_TYPE_OTHERS, // 其他
- LOGINOPT_TYPE_COUNT
-};
+typedef enum {
+ BioT_FingerPrint, /** 指纹 **/
+ BioT_FingerVein, /** 指静脉 **/
+ BioT_Iris, /** 虹膜 **/
+ BioT_Face, /** 人脸 **/
+ BioT_VoicePrint, /** 声纹 **/
+
+ UniT_KCM, /** 安全管控 **/
+ UniT_General_Ukey, /** 普通的Ukey **/
+ UniT_Advanced_Ukey, /** 高阶的Ukey **/
+ UniT_Remote, /** 远程账户 **/
+}Bio_Type;
class LoginOptionsWidget : public QWidget
{
@@ -54,6 +55,7 @@ public:
DeviceInfoPtr getFirstDevInfo();
int convertDeviceType(int nDevType);
void updateUIStatus(bool update);
+ void updateUkeyUIStatus(int type);
void setUser(int uid);
void setCurrentDevice(int drvid);
void setCurrentDevice(const QString &deviceName);
@@ -69,6 +71,7 @@ public:
* @return
*/
QString GetDefaultDevice(uid_t uid);
+ QString GetDefaultDevice(uid_t uid,int bioType);
/**
* @brief 进行生物识别认证
@@ -91,6 +94,9 @@ public:
}
QPixmap loadSvg(QString path, QString color, int size);
+ void SetExtraInfo(QString extra_info,QString info_type);
+ bool getHasUkeyOptions();
+ void setSelectedPassword();
public slots:
void readDevicesInfo();
void onIdentifyComplete(int uid, bool ret, int retErrNo);
@@ -155,6 +161,8 @@ private:
bool is_Lock = false;
QPixmap m_waitingPixmap;
QTimer *w_timer;
+
+ bool isShowUkey = false;
};
#endif // LOGINOPTIONSWIDGET_H
diff --git a/bioauth/src/bioauth.cpp b/bioauth/src/bioauth.cpp
index 318f3d3..df66f19 100644
--- a/bioauth/src/bioauth.cpp
+++ b/bioauth/src/bioauth.cpp
@@ -60,6 +60,30 @@ void BioAuth::setDevice(const DeviceInfoPtr deviceInfo)
this->deviceInfo = deviceInfo;
}
+void BioAuth::startUkeyAuth()
+{
+ // stopAuth();
+ if (!deviceInfo) {
+ qDebug()<<"DeviceInfo not valid!!";
+ return;
+ }
+
+ /* 开始认证识别 */
+ LOG() << "start biometric verification";
+ QList args;
+ args << QVariant(deviceInfo->device_id) << QVariant(2)
+ << QVariant(uid);
+ isInAuthentication = true;
+
+ QDBusPendingCall call = serviceInterface->asyncCallWithArgumentList("UkeyIdentify", args);
+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
+ connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete);
+}
+DeviceInfoPtr BioAuth::getDevice()
+{
+ return this->deviceInfo;
+}
+
void BioAuth::startAuth()
{
// stopAuth();
@@ -75,9 +99,58 @@ void BioAuth::startAuth()
<< QVariant(0) << QVariant(-1);
isInAuthentication = true;
- QDBusPendingCall call = serviceInterface->asyncCallWithArgumentList("Identify", args);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
- connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete);
+ qDebug()<biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ QList args1;
+ args1 << QVariant(deviceInfo->device_id) << QVariant(2)
+ << QVariant(uid);
+
+ QDBusPendingCall call = serviceInterface->asyncCallWithArgumentList("UkeyIdentify", args1);
+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
+ connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete);
+ }else{
+ QDBusPendingCall call = serviceInterface->asyncCallWithArgumentList("Identify", args);
+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
+ connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete);
+ }
+}
+
+bool BioAuth::GetHasUkeyFeature(int uid, int indexStart, int indexEnd)
+{
+ QList qlist;
+ FeatureInfo *featureInfo;
+ int listsize;
+ QDBusMessage result = serviceInterface->call(QStringLiteral("GetAllFeatureList"),uid,indexStart,indexEnd);
+ if(result.type() == QDBusMessage::ErrorMessage)
+ {
+ qWarning() << "GetDevList error:" << result.errorMessage();
+ return false;
+ }
+ QList variantList = result.arguments();
+ listsize = variantList[0].value();
+ variantList[1].value() >> qlist;
+ for (int i = 0; i < listsize; i++) {
+ featureInfo = new FeatureInfo;
+ qlist[i].variant().value() >> *featureInfo;
+ if(featureInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ delete featureInfo;
+ return true;
+ }
+ delete featureInfo;
+ }
+ return false;
+}
+
+int BioAuth::SetExtraInfo(QString info_type,QString extra_info)
+{
+ QDBusReply reply = serviceInterface->call(QStringLiteral("SetExtraInfo"), info_type, extra_info);
+ if(!reply.isValid())
+ {
+ qWarning() << "SetExtraInfo error:" << reply.error();
+ return -1;
+ }
+ return reply.value();
}
void BioAuth::startAuth(qint32 uid, const DeviceInfoPtr deviceInfo)
diff --git a/bioauth/src/biodevices.cpp b/bioauth/src/biodevices.cpp
index 92fb32e..556ed1c 100644
--- a/bioauth/src/biodevices.cpp
+++ b/bioauth/src/biodevices.cpp
@@ -43,6 +43,7 @@ BioDevices::BioDevices(bool isIgnoreQrCode, QObject *parent)
m_listPriority.push_back(BIOTYPE_VOICEPRINT);
m_listPriority.push_back(BIOTYPE_FINGERVEIN);
m_listPriority.push_back(REMOTE_QRCODE_TYPE);
+ m_listPriority.push_back(LOGINOPT_TYPE_GENERAL_UKEY);
}
void BioDevices::setUId(int nUId)
@@ -70,6 +71,7 @@ void BioDevices::onUSBDeviceHotPlug(int deviceId, int action, int devNumNow)
{
qDebug() << deviceId << action << devNumNow;
QString text = "";
+
if(action == -1){
DeviceInfoPtr device = findDevice(deviceId);
if(device)
@@ -102,6 +104,7 @@ void BioDevices::onUSBDeviceHotPlug(int deviceId, int action, int devNumNow)
<<(int)-1;
iface.callWithArgumentList(QDBus::AutoDetect,"Notify",args);
}
+
}
bool BioDevices::GetBioAuthEnable(uid_t uid)
@@ -398,6 +401,72 @@ bool BioDevices::GetBioAuthEnable()
}
}
+DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType)
+{
+ if(deviceInfos.size() <= 0)
+ return nullptr;
+
+ if (m_uniAuthService && m_uniAuthService->isActivatable()) {
+ QString defaultDeviceName = "";
+ struct passwd *pwdInfo = getpwuid(uid);
+ DeviceInfoPtr ptrDevInfo = nullptr;
+ if (pwdInfo) {
+ QString strDeviceName = m_uniAuthService->getDefaultDevice(pwdInfo->pw_name, bioType);
+ qDebug()<device_id) > 0) {
+ defaultDeviceName = strDeviceName;
+ }
+ }
+ }
+ }
+ if(defaultDeviceName.isEmpty()){
+ return nullptr;
+ }
+ return ptrDevInfo;
+ } else {
+ QString defaultDeviceName;
+
+ struct passwd *pwd = getpwuid(uid);
+ QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf";
+ QSettings userConfig(userConfigFile, QSettings::IniFormat);
+ qDebug() << userConfig.fileName();
+ defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString();
+ qDebug() << 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)){
+ 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()){
+ return nullptr;
+ }
+ bool defValid = false;
+ DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName);
+ if (ptrDevInfo) {
+ if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) {
+ defValid = true;
+ }
+ }
+
+ if (!defValid) {
+ ptrDevInfo = nullptr;
+ }
+
+ return ptrDevInfo;
+ }
+}
+
DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid)
{
if(deviceInfos.size() <= 0)
@@ -410,6 +479,7 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid)
if (pwdInfo) {
for (auto bioType : m_listPriority) {
QString strDeviceName = m_uniAuthService->getDefaultDevice(pwdInfo->pw_name, bioType);
+ qDebug()<>(const QDBusArgument &argument, FeatureInfo &featureInfo)
+{
+ argument.beginStructure();
+ argument >> featureInfo.uid >> featureInfo.biotype
+ >> featureInfo.device_shortname >> featureInfo.index
+ >> featureInfo.index_name;
+ argument.endStructure();
+ return argument;
+}
+
QString bioTypeToString(int type)
{
switch(type) {
@@ -86,6 +107,8 @@ QString bioTypeToString(int type)
return ("Iris");
case BIOTYPE_FACE:
return ("Face");
+ case LOGINOPT_TYPE_GENERAL_UKEY:
+ return ("ukey");
case BIOTYPE_VOICEPRINT:
return ("VoicePrint");
}
diff --git a/bioauth/src/loginoptionswidget.cpp b/bioauth/src/loginoptionswidget.cpp
index 676aeb6..955270c 100644
--- a/bioauth/src/loginoptionswidget.cpp
+++ b/bioauth/src/loginoptionswidget.cpp
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -40,6 +41,7 @@
#include
#include
+
LoginOptionsWidget::LoginOptionsWidget(QWidget *parent)
: QWidget(parent)
, m_biomericProxy(new BioAuth(this))
@@ -72,19 +74,21 @@ void LoginOptionsWidget::initUI()
m_layoutImage->setAlignment(Qt::AlignCenter);
m_labelOptTitle = new QLabel();
- m_labelOptTitle->setAlignment(Qt::AlignCenter);
+ 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::AlignCenter);
+ 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);
@@ -100,6 +104,8 @@ void LoginOptionsWidget::initUI()
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));
layoutFace->addWidget(m_labelFaceLoad, 0, Qt::AlignVCenter);
+
+
// QImage img;
// setFaceImg(img);
m_labelFace->hide();
@@ -127,6 +133,21 @@ void LoginOptionsWidget::initUI()
layoutQRCode->addWidget(m_labelQRCodeMsg, 0, Qt::AlignHCenter);
this->setLayout(m_layoutMain);
+
+ //设置水平扩展
+ QSizePolicy sizePolicy = this->sizePolicy();
+ sizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
+ this->setSizePolicy(sizePolicy);
+}
+
+void LoginOptionsWidget::SetExtraInfo(QString extra_info, QString info_type)
+{
+ if(!m_biomericProxy)
+ {
+ qWarning() << "BiometricProxy doesn't exist.";
+ return;
+ }
+ m_biomericProxy->SetExtraInfo(info_type,extra_info);
}
void LoginOptionsWidget::initConnections()
@@ -205,11 +226,17 @@ DeviceInfoPtr LoginOptionsWidget::getFirstDevInfo()
return devInfo;
}
+bool LoginOptionsWidget::getHasUkeyOptions()
+{
+ return isShowUkey;
+}
+
void LoginOptionsWidget::addOptionButton(unsigned uLoginOptType, int nDrvId, QString strDrvName)
{
if (m_mapOptBtns.contains(nDrvId)) {
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%);} \
@@ -220,19 +247,22 @@ void LoginOptionsWidget::addOptionButton(unsigned uLoginOptType, int nDrvId, QSt
newButton->setChecked(false);
newButton->setFocusPolicy(Qt::NoFocus);
newButton->setContentsMargins(16,16,16,16);
- if (nDrvId == -1) {
- newButton->setEnabled(false);
- newButton->setChecked(true);
- } else {
+// 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);
- }
+// }
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;
@@ -281,17 +311,43 @@ void LoginOptionsWidget::clearOptionButtons()
void LoginOptionsWidget::updateOptionButtons()
{
+ isShowUkey = false;
clearOptionButtons();
- //addOptionButton(LOGINOPT_TYPE_PASSWORD, -1, tr("Password"));
+ addOptionButton(LOGINOPT_TYPE_PASSWORD, -1, tr("Password"));
DeviceMap::iterator itMapDev = m_mapDevices.begin();
for ( ; itMapDev != m_mapDevices.end(); itMapDev++) {
for (DeviceInfoPtr devPtr : itMapDev.value()) {
if (devPtr) {
- addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype));
+ if(devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ //ukey 设备类型排在二维码前,但实际上应该显示在二维码之后,因此暂时不添加
+ isShowUkey = true;
+ continue;
+ }
+ addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype));
+ }
+ }
+ }
+
+ itMapDev = m_mapDevices.begin();
+ if(isShowUkey){
+ for ( ; itMapDev != m_mapDevices.end(); itMapDev++) {
+ for (DeviceInfoPtr devPtr : itMapDev.value()) {
+ if(devPtr && devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ //此处才添加ukey
+ addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype));
+ }
}
}
}
- if (m_mapOptBtns.size() <= 1) {
+
+ //存在特征但没有插入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::iterator itMapBtn = m_mapOptBtns.begin();
for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) {
@@ -312,6 +368,12 @@ void LoginOptionsWidget::updateOptionButtons()
}
}
}
+
+ m_mapOptBtns[-1]->hide();
+ if(m_mapOptBtns.size() == 2 && isShowUkey) {
+ m_mapOptBtns[-1]->show();
+ }
+
adjustSize();
}
@@ -397,6 +459,17 @@ void LoginOptionsWidget::startAuth(DeviceInfoPtr device, int uid)
startAuth_();
}
+void LoginOptionsWidget::setSelectedPassword()
+{
+ if (m_mapOptBtns.contains(-1)) {
+ QToolButton* btn = m_mapOptBtns[-1];
+ if (btn && btn->isVisible()) {
+ btn->setChecked(true);
+ }
+ m_curDevInfo = nullptr;
+ }
+}
+
void LoginOptionsWidget::startAuth_()
{
if (!m_curDevInfo)
@@ -559,9 +632,13 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url)
void LoginOptionsWidget::onFrameWritten(int drvid)
{
- if (m_curDevInfo->device_id != drvid || !m_isInAuth) {
+ if(!m_curDevInfo)
+ return;
+
+ if (m_curDevInfo && m_curDevInfo->device_id != drvid || !m_isInAuth) {
return ;
}
+
if(m_dupFD == -1){
m_dupFD = get_server_gvariant_stdout(drvid);
}
@@ -737,6 +814,18 @@ DeviceInfoPtr LoginOptionsWidget::findDeviceByName(const QString &name)
return DeviceInfoPtr();
}
+QString LoginOptionsWidget::GetDefaultDevice(uid_t uid,int bioType)
+{
+ QString defaultDeviceName = "";
+ DeviceInfoPtr pDeviceInfo = m_bioDevices->getDefaultDevice(uid,bioType);
+ if (pDeviceInfo) {
+ defaultDeviceName = pDeviceInfo->device_shortname;
+ }
+ qDebug() << "default device: " << defaultDeviceName;
+
+ return defaultDeviceName;
+}
+
QString LoginOptionsWidget::GetDefaultDevice(uid_t uid)
{
QString defaultDeviceName = "";
@@ -761,7 +850,7 @@ void LoginOptionsWidget::onUSBDeviceCountChange(int newNum)
int count = 0;
for(int type : m_mapDevices.keys())
count += m_mapDevices.value(type).count();
-
+
//设备数量发生了变化
if(count != savedCount) {
updateOptionButtons();
@@ -770,11 +859,36 @@ void LoginOptionsWidget::onUSBDeviceCountChange(int newNum)
updateUIStatus(false);
}
+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();
+ }
+
+ QTimer::singleShot(0,this,[&,this](){
+ Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size());
+ });
+}
+
void LoginOptionsWidget::updateUIStatus(bool update)
{
if (m_mapOptBtns.contains(-1)) {
QToolButton* btn = m_mapOptBtns[-1];
- if (btn) {
+ if (btn && btn->isVisible()) {
btn->setChecked(true);
}
}
@@ -786,6 +900,7 @@ void LoginOptionsWidget::updateUIStatus(bool update)
}
}
}
+
if (update) {
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));
@@ -818,6 +933,19 @@ void LoginOptionsWidget::onOptionSelected(int nIndex)
DeviceInfoPtr info = findDeviceById(m_listDriveId[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){
+ stopAuth();
+ m_curDevInfo = nullptr;
+ Q_EMIT optionSelected(LOGINOPT_TYPE_PASSWORD,nullptr);
+ this->m_curLoginOptType = LOGINOPT_TYPE_PASSWORD;
+
+ }else if(m_listDriveId[nIndex] == -2){
+ //存在ukey特征,但未插入ukey
+ stopAuth();
+ m_curDevInfo = nullptr;
+ Q_EMIT optionSelected(LOGINOPT_TYPE_GENERAL_UKEY,nullptr);
+ this->m_curLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY;
}
}
}
@@ -841,6 +969,12 @@ int LoginOptionsWidget::convertDeviceType(int nDevType)
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;
diff --git a/debian/changelog b/debian/changelog
index bcb0bb5..1703ffa 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+ukui-biometric-auth (4.0.0.0-ok1~0426) yangtze; urgency=medium
+
+ * BUG号:无
+ * 需求号:无
+ * 其他修改说明:合并V101、V101-tablet代码
+
+ -- Yang Min Wed, 26 Apr 2023 21:58:51 +0800
+
ukui-biometric-auth (3.22.0.0-ok7~0420) yangtze; urgency=medium
* BUG号:无
diff --git a/debian/control b/debian/control
index cec231e..ef1f89e 100644
--- a/debian/control
+++ b/debian/control
@@ -15,7 +15,8 @@ Build-Depends: cmake (>= 2.6),
qtbase5-dev,
qttools5-dev,
qttools5-dev-tools,
- libkysdk-sysinfo-dev
+ libkysdk-sysinfo-dev,
+ libukui-log4qt-dev
Standards-Version: 4.5.0
Rules-Requires-Root: no
Homepage: https://github.com/ukui/ukui-biometric-auth
diff --git a/images/ukui-loginopt-face.svg b/images/ukui-loginopt-face.svg
index 6eacd5e..9da90ad 100644
--- a/images/ukui-loginopt-face.svg
+++ b/images/ukui-loginopt-face.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/images/ukui-loginopt-password.svg b/images/ukui-loginopt-password.svg
index d626f56..91273cf 100644
--- a/images/ukui-loginopt-password.svg
+++ b/images/ukui-loginopt-password.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/images/ukui-loginopt-ukey.svg b/images/ukui-loginopt-ukey.svg
new file mode 100644
index 0000000..0239a86
--- /dev/null
+++ b/images/ukui-loginopt-ukey.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/pam-biometric/CMakeLists.txt b/pam-biometric/CMakeLists.txt
index 2c82306..7711237 100644
--- a/pam-biometric/CMakeLists.txt
+++ b/pam-biometric/CMakeLists.txt
@@ -29,11 +29,12 @@ set(pam_SRCS
include_directories(
../common
${PAM_INCLUDE_DIR}
+ ${GLIB2_INCLUDE_DIRS}
)
add_library(pam_biometric SHARED ${pam_SRCS})
-target_link_libraries(pam_biometric ${PAM_LIB})
+target_link_libraries(pam_biometric ${PAM_LIB} ${GLIB2_LIBRARIES})
#去除lib前缀
set_target_properties(pam_biometric PROPERTIES PREFIX "")
diff --git a/pam-biometric/pam_biometric.c b/pam-biometric/pam_biometric.c
index 5d10c5a..68f6aab 100644
--- a/pam-biometric/pam_biometric.c
+++ b/pam-biometric/pam_biometric.c
@@ -31,6 +31,8 @@
#include
#include
#include
+#include
+#include
#define USER_CONFIG_FILE "/home/%s/.biometric_auth/ukui_biometric.conf"
@@ -86,11 +88,9 @@ int service_filter(char *service)
//syslog(LOG_INFO,"is_enable = %d service = %s\n",is_enable,service);
if (strcmp(service, "lightdm") == 0) {
- int ret = system("/bin/chmod -f a+wr /tmp/bio.log");
- (void)ret; /* Suppress gcc ignoring return value warning */
//if(is_enable & 1 == 0)
- // return 0;
- return 1;
+ // return 0;
+ return 1;
}
if (strcmp(service, "ukui-screensaver-qt") == 0){
//if((is_enable & (1<<1)) == 0)
@@ -163,12 +163,11 @@ int call_conversation(pam_handle_t *pamh, int msg_style, char *msg, char *resp)
/* GUI child process */
void child(char *service, char *username, char *xdisp)
{
- char *gui = "/usr/bin/bioauth";
pam_logger("Child process will be replaced.\n");
int fd = open("/dev/null", O_WRONLY);
dup2(fd, 2);
- execl(gui, "bioauth",
+ execl("/usr/bin/bioauth", "bioauth",
"--service", service,
"--user", username,
// "--display", xdisp,
@@ -318,15 +317,15 @@ int biometric_auth_independent(pam_handle_t *pamh , char *service, int need_call
/* Detach child process */
unsigned int pid;
pid = fork();
- if (pid == 0 ) {
- child(service, username, xdisp);
- pam_logger("Should never reach here.\n");
- return PAM_SYSTEM_ERR;
- } else if (pid > 0) {
- return parent(pid, pamh, need_call_conv);
- } else {
+ if (pid < 0) {
pam_logger("Fork Error!\n");
- return PAM_SYSTEM_ERR;
+ return PAM_SYSTEM_ERR;
+ } else if (pid != 0) {
+ return parent(pid, pamh, need_call_conv);
+ } else {
+ child(service, username, xdisp);
+ pam_logger("Should never reach here.\n");
+ return PAM_SYSTEM_ERR;
}
}
@@ -398,24 +397,82 @@ int biometric_auth_embeded(pam_handle_t *pamh)
void get_greeter_session(char buf[], int len)
{
- FILE *stream;
- char cmd[] = "ps -aux | grep greeter-session | grep -v grep | awk '{print $13}' | awk -F '/' '{print $4}'";
- memset(buf, 0, len);
- stream = popen(cmd, "r");
- if(fgets(buf, len, stream) == NULL)
- pam_logger("get greeter session error: %d\n", errno);
- buf[strlen(buf)-1] = '\0';
- if(strlen(buf) == 0) {
- char cmd1[] = "ps aux | grep ukui-greeter | grep -v grep | wc -l";
- pclose(stream);
- stream = popen(cmd1, "r");
- if(fgets(buf, len, stream) == NULL)
- pam_logger("get greeter session error: %d\n", errno);
- int i = atoi(buf);
- if(i > 0)
- strcpy(buf, "ukui-greeter");
+ GPtrArray *args_ps = NULL;
+ gchar *stdout_ps = NULL;
+ gchar *greeter_name = NULL;
+
+ args_ps = g_ptr_array_new ();
+ g_ptr_array_add(args_ps, (gpointer)"/usr/bin/ps");
+ g_ptr_array_add(args_ps, (gpointer)"-aux");
+ g_ptr_array_add(args_ps, (gpointer)"--columns");
+ g_ptr_array_add(args_ps, (gpointer)"256");
+ g_ptr_array_add(args_ps, NULL);
+
+ if (!g_spawn_sync(NULL, (char**)args_ps->pdata, NULL, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &stdout_ps, NULL, NULL, NULL)) {
+ if (stdout_ps)
+ g_free(stdout_ps);
+ g_ptr_array_free (args_ps, TRUE);
+ return ;
+ }
+ if (stdout_ps) {
+ gchar **lines = NULL;
+ lines = g_strsplit(stdout_ps, "\n", 0);
+ for (int n = 0; lines[n] != NULL; n++) {
+ if (lines[n][0] == '\0')
+ continue;
+ gchar *res = g_strstr_len(lines[n], 1024, "greeter-session");
+ if (res) {
+ gchar **greeter_args = g_strsplit(res, " ", 0);
+ int arg_index = 0;
+ for (int m = 0; greeter_args[m] != NULL; m++) {
+ if (greeter_args[m][0] == '\0')
+ continue;
+ // greeter-session arg1
+ if (arg_index == 1) {
+ gchar *greeter = g_strrstr_len(greeter_args[m], 256, "/");
+ if (greeter && strlen(greeter) > 1) {
+ greeter_name = g_strdup(greeter + 1);
+ break;
+ }
+ }
+ arg_index ++;
+ }
+ g_strfreev(greeter_args);
+ if (greeter_name) {
+ break;
+ }
+ }
+ }
+ g_strfreev(lines);
+ g_free(stdout_ps);
+ }
+ g_ptr_array_free (args_ps, TRUE);
+ if (greeter_name) {
+ g_strlcpy(buf, greeter_name, len);
+ g_free(greeter_name);
+ } else {
+ GPtrArray *args_pidof = NULL;
+ gchar *stdout_pidof = NULL;
+
+ args_pidof = g_ptr_array_new ();
+ g_ptr_array_add(args_pidof, (gpointer)"/usr/bin/pidof");
+ g_ptr_array_add(args_pidof, (gpointer)"ukui-greeter");
+ g_ptr_array_add(args_pidof, NULL);
+
+ if (!g_spawn_sync(NULL, (char**)args_pidof->pdata, NULL, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &stdout_pidof, NULL, NULL, NULL)) {
+ if (stdout_pidof)
+ g_free(stdout_pidof);
+ g_ptr_array_free (args_pidof, TRUE);
+ return ;
+ }
+ if (stdout_pidof) {
+ if (strlen(stdout_pidof) > 0 && atoi(stdout_pidof) > 0) {
+ g_strlcpy(buf, "ukui-greeter", len);
+ }
+ g_free(stdout_pidof);
+ }
+ g_ptr_array_free (args_pidof, TRUE);
}
- pclose(stream);
}
int enable_by_polkit()
diff --git a/polkit-agent/CMakeLists.txt b/polkit-agent/CMakeLists.txt
index a44cd23..fa7768e 100644
--- a/polkit-agent/CMakeLists.txt
+++ b/polkit-agent/CMakeLists.txt
@@ -40,6 +40,10 @@ include_directories(
qt5_add_resources(polkit_SRCS assets.qrc)
+qt5_wrap_ui(polkit_SRCS
+ src/mainwindow.ui
+ )
+
set(polkit_SRCS
${polkit_SRCS}
src/PolkitAgent.cpp
@@ -59,6 +63,7 @@ target_link_libraries(polkit-ukui-authentication-agent-1
${POLKITQT-1_LIBRARIES}
BioAuthWidgets
-lrt
+ -lukui-log4qt
)
install(TARGETS polkit-ukui-authentication-agent-1
DESTINATION lib/${CMAKE_LIBRARY_ARCHITECTURE}/ukui-polkit)
diff --git a/polkit-agent/i18n_ts/bo_CN.ts b/polkit-agent/i18n_ts/bo_CN.ts
index 59dbbc7..75bd971 100644
--- a/polkit-agent/i18n_ts/bo_CN.ts
+++ b/polkit-agent/i18n_ts/bo_CN.ts
@@ -304,7 +304,17 @@
ནང་འཇུག་གི་གསང་གྲངས།
-
+
+
+ བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས།
+
+
+
+
+ གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ།
+
+
+
དུས་ཚོད་འགའ་ལས་ལྷག་མེད
diff --git a/polkit-agent/i18n_ts/zh_CN.ts b/polkit-agent/i18n_ts/zh_CN.ts
index 7f79e26..34b82ac 100644
--- a/polkit-agent/i18n_ts/zh_CN.ts
+++ b/polkit-agent/i18n_ts/zh_CN.ts
@@ -88,7 +88,7 @@
- 密码
+ 密码
@@ -304,7 +304,17 @@
输入密码
-
+
+
+ 请将安全密钥插入USB端口
+
+
+
+
+ 输入安全密钥密码
+
+
+
小时后解锁
diff --git a/polkit-agent/src/PolkitAgent.cpp b/polkit-agent/src/PolkitAgent.cpp
index ef68e02..aa9d5c7 100644
--- a/polkit-agent/src/PolkitAgent.cpp
+++ b/polkit-agent/src/PolkitAgent.cpp
@@ -24,19 +24,19 @@
#include "generic.h"
#include "sessionmanager.h"
#include "biodevices.h"
+#include
bool enableDebug;
QString logPrefix;
-
-
-
int main(int argc, char *argv[])
{
enableDebug = true;
logPrefix = "[ukui-polkit]:";
- qInstallMessageHandler(outputMessage);
+ //qInstallMessageHandler(outputMessage);
+ initUkuiLog4qt("ukui-polkit");
qDebug() << "Polkit Agent Started";
+
#if(QT_VERSION>=QT_VERSION_CHECK(5,6,0))
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp
index 1642cca..88d9cdb 100644
--- a/polkit-agent/src/PolkitListener.cpp
+++ b/polkit-agent/src/PolkitListener.cpp
@@ -184,6 +184,10 @@ void PolkitListener::initiateAuthentication(
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);
diff --git a/polkit-agent/src/kalabel.cpp b/polkit-agent/src/kalabel.cpp
index dd529ab..2666f0b 100644
--- a/polkit-agent/src/kalabel.cpp
+++ b/polkit-agent/src/kalabel.cpp
@@ -1,20 +1,3 @@
-/*
- * Copyright (C) 2023 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 .
- *
- **/
#include "kalabel.h"
diff --git a/polkit-agent/src/kalabel.h b/polkit-agent/src/kalabel.h
index a78d4c9..f2678ac 100644
--- a/polkit-agent/src/kalabel.h
+++ b/polkit-agent/src/kalabel.h
@@ -1,20 +1,3 @@
-/*
- * Copyright (C) 2023 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 .
- *
- **/
#ifndef KALABEL_H
#define KALABEL_H
diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp
index 05a5db0..e8b66c1 100644
--- a/polkit-agent/src/mainwindow.cpp
+++ b/polkit-agent/src/mainwindow.cpp
@@ -24,6 +24,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -94,25 +95,74 @@ MainWindow::MainWindow(QWidget *parent) :
m_loginOptsWidget = new LoginOptionsWidget();
m_loginOptsWidget->hide();
ui->titleTipLayout->addWidget(m_labelTip);
- ui->loginOptionsLayout->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
+ ui->loginOptionsLayout->setAlignment(Qt::AlignTop|Qt::AlignCenter);
ui->loginOptionsLayout->addWidget(m_loginOptsWidget);
-
+ ui->loadingUkeyWidget->hide();
+ ui->widgetUkeyAuth->hide();
+ 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->ukeyTipLbl->setText(tr("Enter the ukey password"));
+ ui->ukeyPassword->setPlaceholderText(tr("Input Password"));
+ ui->loadingUkeyWidget->adjustSize();
maxFailedTimes = bioDevices.getFailedTimes();
isHiddenSwitchButton = bioDevices.GetHiddenSwitchButton();
connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected,
this, [&](unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo){
- qDebug() << "device changed: " << deviceInfo->biotype;
- if(m_failMap[getUid(userName)][deviceInfo->device_id] >= maxFailedTimes){
+
+ 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) {
+ if(!isbioSuccess && m_deviceInfo) {
startBioAuth();
}
});
@@ -122,10 +172,15 @@ MainWindow::MainWindow(QWidget *parent) :
if (uOptionsCount > 0) {
m_loginOptsWidget->show();
} else {
- m_loginOptsWidget->hide();
+ //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->isDeviceDisable(m_deviceInfo->device_id)) {
m_loginOptsWidget->stopAuth();
if (authMode != UNDEFINED) {
authMode = UNDEFINED;
@@ -138,6 +193,10 @@ MainWindow::MainWindow(QWidget *parent) :
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();
@@ -168,17 +227,27 @@ MainWindow::MainWindow(QWidget *parent) :
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 {
+ } 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;
- 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(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) {
@@ -222,6 +291,7 @@ MainWindow::MainWindow(QWidget *parent) :
ui->lblContent->height();
ui->lblMessage->adjustSize();
ui->widgetPasswdAuth->adjustSize();
+ ui->widgetUkeyAuth->adjustSize();
ui->lblMessage->height();
ui->cmbUsers->view()->setTextElideMode(Qt::ElideRight);
@@ -239,6 +309,7 @@ MainWindow::MainWindow(QWidget *parent) :
this, SLOT(onLockStatus()));
connect(interfaceScreensaver, SIGNAL(unlock()),
this, SLOT(onUnlockStatus()));
+
}
MainWindow::~MainWindow()
@@ -275,6 +346,64 @@ void MainWindow::closeEvent(QCloseEvent *event)
return QWidget::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);
+ ui->ukeyMessage->setPalette(pe);
+ ui->ukeyMessage->setText(textTip);
+ ui->ukeyMessage->setToolTip(text);
+ ui->ukeyMessage->show();
+ } else {
+ ui->ukeyMessage->hide();
+ }
+}
+
+void MainWindow::startLoadingUkey()
+{
+ isLoadingUkey = true;
+ ui->loadingUkeyWidget->show();
+ if(!m_loadingTimer)
+ {
+ m_loadingTimer = new QTimer(this);
+ m_loadingTimer->setInterval(150);
+ connect(m_loadingTimer, &QTimer::timeout, this, &MainWindow::updateLoadingPixmap);
+ }
+
+ m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27);
+ ui->loadingUkeyBtn->setIcon(m_loadingPixmap);
+ ui->loadingUkeyBtn->setIconSize(QSize(27, 27));
+ m_loadingTimer->start();
+ ui->loadingUkeyWidget->adjustSize();
+ ui->cmbUsers->hide();
+ ui->widgetUkeyAuth->hide();
+ ui->lePassword->hide();
+ ui->widgetPasswdAuth->hide();
+}
+
+void MainWindow::stopLoadingUkey()
+{
+ isLoadingUkey = false;
+ if(m_loadingTimer){
+ m_loadingTimer->stop();
+ }
+ ui->loadingUkeyWidget->hide();
+ //ui->cmbUsers->show();
+ ui->widgetUkeyAuth->show();
+}
+
+void MainWindow::updateLoadingPixmap()
+{
+ QMatrix matrix;
+ matrix.rotate(90.0);
+ m_loadingPixmap = m_loadingPixmap.transformed(matrix, Qt::FastTransformation);
+ ui->loadingUkeyBtn->setIcon(QIcon(m_loadingPixmap));
+}
+
void MainWindow::paintEvent(QPaintEvent *event)
{
@@ -331,6 +460,13 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event)
return true;
}
}
+ if(event->type() == QEvent::MouseButtonRelease) { //禁用鼠标中键
+ QMouseEvent *mouseevent = static_cast(event);
+ if(mouseevent->button() == Qt::MidButton){
+ event->ignore();
+ return true;
+ }
+ }
}
return false;
}
@@ -406,7 +542,11 @@ void MainWindow::on_btnCancel_clicked()
void MainWindow::on_btnAuth_clicked()
{
- on_lePassword_returnPressed();
+ if(ui->widgetUkeyAuth->isVisible()){
+ on_ukeyPassword_returnPressed();
+ }else{
+ on_lePassword_returnPressed();
+ }
}
void MainWindow::onLockStatus()
@@ -442,6 +582,14 @@ void MainWindow::editIcon()
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");
+ m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName));
+ }
+}
+
void MainWindow::on_lePassword_returnPressed()
{
emit accept(ui->lePassword->text());
@@ -469,10 +617,8 @@ void MainWindow::on_btnBioAuth_clicked()
void MainWindow::on_returnButton_clicked()
{
-
m_loginOptsWidget->stopAuth();
accept(BIOMETRIC_IGNORE);
-
}
/*** end of control's slot ***/
@@ -557,8 +703,7 @@ void MainWindow::setUsers(const QStringList &usersList)
}
ui->cmbUsers->show();
- ui->cmbUsers->adjustSize();
- ui->cmbUsers->height();
+ //ui->cmbUsers->adjustSize();
}
/*
void MainWindow::setDetails(const QString &subPid, const QString &callerPid, const QString &actionId,
@@ -593,10 +738,11 @@ void MainWindow::setPrompt(const QString &text, bool echo)
}
//qDebug() << "6666";
m_timer->start();
+ unlock_countdown();
ui->lePassword->clear();
ui->lePassword->setPlaceholderText(prompt);
- switchWidget(PASSWORD);
+ // switchWidget(PASSWORD);
}
/*
@@ -618,6 +764,7 @@ QString MainWindow::check_is_pam_message(QString text)
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))
@@ -625,6 +772,7 @@ QString MainWindow::check_is_pam_message(QString text)
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;
}
@@ -639,6 +787,10 @@ QString MainWindow::check_is_pam_message(QString text)
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{
return _(str);
@@ -661,7 +813,7 @@ void MainWindow::setMessage(const QString &text,situation situat)
QColor color = palette().color(QPalette::WindowText);
QPalette pal(this->palette());
pal.setColor(QPalette::WindowText,QColor(color));
- ui->lblMessage->setPalette(pal);
+ ui->lblMessage->setPalette(pal);
}
// qDebug()<<"receive:text = "<lblMessage->setToolTip(text);
}
ui->lblMessage->adjustSize();
- ui->widgetPasswdAuth->adjustSize();
+ //ui->widgetPasswdAuth->adjustSize();
// ui->lblMessage->setText(text);
}
@@ -708,6 +860,7 @@ void MainWindow::setAuthResult(bool result, const QString &text)
void MainWindow::clearEdit()
{
ui->lePassword->setText("");
+ ui->ukeyPassword->setText("");
}
void MainWindow::switchAuthMode(Mode mode)
@@ -727,6 +880,10 @@ void MainWindow::switchAuthMode(Mode mode)
m_loginOptsWidget->setEnabled(true);
}
+ if(m_loginOptsWidget->getHasUkeyOptions()){
+ m_loginOptsWidget->show();
+ }
+
switch(mode){
case PASSWORD:
{
@@ -743,6 +900,7 @@ void MainWindow::switchAuthMode(Mode mode)
if(isHiddenSwitchButton)
ui->btnBioAuth->hide();
+
// if(enableBioAuth && useDoubleAuth){
// DeviceInfoPtr device = bioDevices.getDefaultDevice(getUid(userName));
// if(device){
@@ -753,6 +911,11 @@ void MainWindow::switchAuthMode(Mode mode)
break;
case BIOMETRIC:
{
+ if(authMode == PASSWORD){
+ emit accept(BIOMETRIC_IGNORE);
+ isFirstAuth = false;
+ return;
+ }
authMode = mode;
qDebug() << "switch to biometric";
if (m_deviceInfo) {
@@ -761,22 +924,28 @@ void MainWindow::switchAuthMode(Mode mode)
m_deviceInfo = DeviceInfoPtr();
}
}
- /*if(authMode == PASSWORD) {
- emit accept(BIOMETRIC_IGNORE);
- return;
- }else */if(!enableBioAuth){
+
+ 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 = m_loginOptsWidget->GetDefaultDevice(uid);
- //如果默认设备为空的话,第一次不启动生物识别认证
+ 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(!m_deviceInfo)
{
@@ -784,13 +953,34 @@ void MainWindow::switchAuthMode(Mode mode)
}
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){
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;
startBioAuth();
emit accept(BIOMETRIC_IGNORE);
return;
@@ -887,6 +1077,7 @@ void MainWindow::switchWidget(Mode mode)
if(is_Mavis){
ui->cmbUsers->setFixedHeight(48);
ui->lePassword->setFixedHeight(48);
+ ui->ukeyPassword->setFixedHeight(48);
ui->btnAuth->setFixedHeight(48);
ui->btnCancel->setFixedHeight(48);
}
@@ -895,6 +1086,7 @@ void MainWindow::switchWidget(Mode mode)
{
setMinimumWidth(420);
setMaximumWidth(420);
+
if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) {
switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
} else {
@@ -905,27 +1097,27 @@ void MainWindow::switchWidget(Mode mode)
}
int height;
if(fontSize = 10){
- height = 120 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ 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 = 140 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 12){
height = 150 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
+ ui->btnAuth->height();
- } else if (fontSize = 13){
+ } 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 = 180 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ 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 = 220 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ height = 230 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
+ ui->btnAuth->height();
}
@@ -940,6 +1132,8 @@ void MainWindow::switchWidget(Mode mode)
}
setMinimumHeight(height + uOptsWidgetHeight + 10);
setMaximumHeight(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);
@@ -956,7 +1150,7 @@ void MainWindow::switchWidget(Mode mode)
}
ui->btnAuth->show();
ui->btnLoading->hide();
- ui->lePassword->setDisabled(false);
+ //ui->lePassword->setDisabled(false);
if(w_timer && w_timer->isActive())
{
w_timer->stop();
@@ -978,6 +1172,7 @@ void MainWindow::switchWidget(Mode mode)
setMinimumHeight(482+ui->cmbUsers->height()+ui->lblHeader->height());
setMaximumHeight(482+ui->cmbUsers->height()+ui->lblHeader->height());
}
+
ui->btnCancel->hide();
ui->lblContent->hide();
ui->btnBioAuth->hide();
@@ -995,6 +1190,7 @@ void MainWindow::switchWidget(Mode mode)
default:
break;
}
+
// adjustSize();
}
@@ -1024,6 +1220,7 @@ void MainWindow::unlock_countdown()
//ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinute));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->btnAuth->setDisabled(true);
isLockingFlg = true;
return ;
}
@@ -1034,6 +1231,7 @@ void MainWindow::unlock_countdown()
//ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->btnAuth->setDisabled(true);
isLockingFlg = true;
return ;
}
@@ -1043,6 +1241,7 @@ void MainWindow::unlock_countdown()
ui->lblMessage->setToolTip(tr("Account locked permanently."));
ui->lePassword->setText("");
ui->lePassword->setDisabled(true);
+ ui->btnAuth->setDisabled(true);
isLockingFlg = true;
return ;
}
@@ -1052,6 +1251,9 @@ void MainWindow::unlock_countdown()
ui->lePassword->setDisabled(false);
ui->lePassword->setFocus();
}
+ if(ui->btnAuth){
+ ui->btnAuth->setDisabled(false);
+ }
if (isLockingFlg) {
//setMessage(tr("Authentication failed, please try again."),ERROR);
@@ -1132,12 +1334,27 @@ void MainWindow::root_unlock_countdown()
return ;
}
+void MainWindow::onRespondUkey(const QString &text)
+{
+ if (m_loginOptsWidget){
+ m_loginOptsWidget->SetExtraInfo(text,"pincode");
+ }
+}
+
void MainWindow::switchLoginOptType(unsigned uLoginOptType)
{
switch(uLoginOptType) {
case LOGINOPT_TYPE_PASSWORD:
{
- m_loginOptsWidget->hide();
+ //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:
@@ -1155,6 +1372,31 @@ void MainWindow::switchLoginOptType(unsigned uLoginOptType)
m_loginOptsWidget->setQRCodeMsg("");
}
});
+
+ //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:
@@ -1171,7 +1413,9 @@ void MainWindow::switchLoginOptType(unsigned uLoginOptType)
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 {
+ }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);
@@ -1215,6 +1459,11 @@ void MainWindow::switchLoginOptType(unsigned uLoginOptType)
setLoginTypeTip(tr("Use the bound wechat scanning code or enter the password to unlock"));
}
break;
+ case LOGINOPT_TYPE_GENERAL_UKEY:
+ {
+ setLoginTypeTip("");
+ }
+ break;
default:
return;
}
@@ -1248,7 +1497,11 @@ void MainWindow::setLoginTypeTip(QString strLoginTypeTip)
void MainWindow::startBioAuthDelay()
{
if (m_deviceInfo) {
- m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName));
+ if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+
+ }else{
+ m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName));
+ }
switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
} else {
switchLoginOptType(LOGINOPT_TYPE_PASSWORD);
@@ -1259,6 +1512,11 @@ void MainWindow::startBioAuthDelay()
void MainWindow::startBioAuth(unsigned uTimeout)
{
m_loginOptsWidget->stopAuth();
+
+ if(m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){
+ switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype));
+ }
+
if(!m_bioTimer){
m_bioTimer = new QTimer(this);
connect(m_bioTimer, SIGNAL(timeout()), this, SLOT(startBioAuthDelay()));
@@ -1306,35 +1564,43 @@ void MainWindow::onUpdateWndSize(unsigned uLoginOptType, unsigned uLoginOptSize)
// ui->lblHeader->adjustSize();
int height;
if(fontSize = 10){
- height = 120 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ 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 = 140 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
- + ui->btnAuth->height();
- } else if (fontSize = 12){
height = 150 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height()
+ ui->btnAuth->height();
- } else if (fontSize = 13){
+ } 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 = 180 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ 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 = 220 + ui->lblHeader->height() /*+ ui->lblContent->height()*/
+ 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 -= 20 ;
}
- setMinimumHeight(height + uOptsWidgetHeight);
- setMaximumHeight(height + uOptsWidgetHeight);
+
+ if(uLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){
+
+ setMinimumHeight(height + uOptsWidgetHeight + 10);
+ setMaximumHeight(height + uOptsWidgetHeight + 10);
+ }else{
+
+ setMinimumHeight(height + uOptsWidgetHeight);
+ setMaximumHeight(height + uOptsWidgetHeight);
+ }
}
void MainWindow::setEditInputMethod(bool bEnable)
diff --git a/polkit-agent/src/mainwindow.h b/polkit-agent/src/mainwindow.h
index 894e938..8b3dbd2 100644
--- a/polkit-agent/src/mainwindow.h
+++ b/polkit-agent/src/mainwindow.h
@@ -64,6 +64,10 @@ public:
void switchLoginOptType(unsigned uLoginOptType);
void setEditInputMethod(bool bEnable);
void setCurProject(bool isMavis);
+ void setUkeyTypeTip(QString text);
+ void startLoadingUkey();
+ void stopLoadingUkey();
+ void updateLoadingPixmap();
private:
uid_t getUid(const QString &userName);
@@ -88,6 +92,7 @@ public slots:
private slots:
void on_btnDetails_clicked();
void on_lePassword_returnPressed();
+ void on_ukeyPassword_returnPressed();
void on_btnBioAuth_clicked();
void on_returnButton_clicked();
void on_cmbUsers_currentTextChanged(const QString &userName);
@@ -98,6 +103,7 @@ private slots:
void onConfigurationChanged(QString key);
void onLockStatus();
void onUnlockStatus();
+ void onRespondUkey(const QString &text);
signals:
void accept(const QString &text);
@@ -105,6 +111,7 @@ signals:
void switchToPassword();
void switchToBiometric();
void userChanged(const QString &userName);
+ void restartAuth();
private:
Ui::MainWindow *ui;
@@ -125,6 +132,9 @@ private:
bool pwdShow = false;
bool isHover = false;
+ //ukey优先级比密码低,该变量用于判断是否第一次认证,并选中密码
+ bool isFirstAuth = true;
+
QTimer *m_timer;
//const DeviceInfo *device = NULL;
bool isLockingFlg; //判断当前是否正在锁定倒计时
@@ -154,6 +164,10 @@ private:
QTimer *w_timer;
QPixmap m_waitingPixmap;
+
+ QTimer *m_loadingTimer = nullptr;
+ QPixmap m_loadingPixmap;
+ bool isLoadingUkey = false;
};
#endif // MAINWINDOW_H
diff --git a/polkit-agent/src/mainwindow.ui b/polkit-agent/src/mainwindow.ui
index 22b4aa5..e9cf404 100644
--- a/polkit-agent/src/mainwindow.ui
+++ b/polkit-agent/src/mainwindow.ui
@@ -7,7 +7,7 @@
0
0
459
- 432
+ 547
@@ -42,7 +42,7 @@
0
- 12
+ 24
-
@@ -67,6 +67,37 @@
0
+
-
+
+
+
+ 382
+ 0
+
+
+
+
+ 382
+ 16777215
+
+
+
+
+ 75
+ true
+
+
+
+
+
+
+
+
+
+ true
+
+
+
-
@@ -95,35 +126,155 @@
-
-
-
- true
-
+
0
- 36
+ 116
-
-
- 16777215
- 36
-
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+
+
+ true
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+ true
- -
+
-
8
- -
+
-
+
+
+
+ 0
+ 116
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 9
+
+
-
+
+
+ 0
+
+
+ 6
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Qt::NoContextMenu
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 25
+
+
+
+ Qt::LeftToRight
+
+
+
+
+
+
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ true
+
+
+
+ -
+
+
+
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+
+ -
@@ -131,6 +282,9 @@
80
+
+
+
0
@@ -154,18 +308,6 @@
-
-
-
- 372
- 36
-
-
-
-
- 16777215
- 36
-
-
Qt::NoContextMenu
@@ -204,37 +346,6 @@
- -
-
-
-
- 382
- 0
-
-
-
-
- 382
- 16777215
-
-
-
-
- 75
- true
-
-
-
-
-
-
-
-
-
- true
-
-
-
-
@@ -255,9 +366,15 @@
8
+
+ 24
+
0
+
+ 24
+
0
diff --git a/polkit-agent/src/modeButton.cpp b/polkit-agent/src/modeButton.cpp
index ddf2239..53d0ffc 100644
--- a/polkit-agent/src/modeButton.cpp
+++ b/polkit-agent/src/modeButton.cpp
@@ -1,20 +1,3 @@
-/*
- * Copyright (C) 2023 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 .
- *
- **/
#include "modeButton.h"
#include
diff --git a/polkit-agent/src/modeButton.h b/polkit-agent/src/modeButton.h
index 01d774f..b8fa08f 100644
--- a/polkit-agent/src/modeButton.h
+++ b/polkit-agent/src/modeButton.h
@@ -1,20 +1,3 @@
-/*
- * Copyright (C) 2023 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 .
- *
- **/
#ifndef MODEBUTTON_H
#define MODEBUTTON_H
diff --git a/uniauth-backend/CMakeLists.txt b/uniauth-backend/CMakeLists.txt
index 330a65e..4ba44ec 100644
--- a/uniauth-backend/CMakeLists.txt
+++ b/uniauth-backend/CMakeLists.txt
@@ -19,7 +19,7 @@ set(bin_SRCS
)
add_executable(uniauth-backend ${bin_SRCS})
-target_link_libraries(uniauth-backend Qt5::Core Qt5::DBus)
+target_link_libraries(uniauth-backend Qt5::Core Qt5::DBus -lukui-log4qt)
install(TARGETS uniauth-backend DESTINATION bin)
install(FILES org.ukui.UniauthBackend.conf DESTINATION /etc/dbus-1/system.d/)
diff --git a/uniauth-backend/src/biodeviceinfo.h b/uniauth-backend/src/biodeviceinfo.h
index 994bb17..3ec5c81 100644
--- a/uniauth-backend/src/biodeviceinfo.h
+++ b/uniauth-backend/src/biodeviceinfo.h
@@ -47,6 +47,7 @@ enum BioType {
__MAX_NR_BIOTYPES
};
+#define UNIT_GENERAL_UKEY (6)
#define REMOTE_QRCODE_TYPE (8)
Q_DECLARE_METATYPE(DeviceInfo)
diff --git a/uniauth-backend/src/main.cpp b/uniauth-backend/src/main.cpp
index dae33a6..e52bac8 100644
--- a/uniauth-backend/src/main.cpp
+++ b/uniauth-backend/src/main.cpp
@@ -17,9 +17,11 @@
**/
#include
#include "serviceinterface.h"
+#include
int main(int argc, char *argv[])
{
+ initUkuiLog4qt("ukui-biometric-uniauth");
QCoreApplication a(argc, argv);
ServiceInterface serviveInterface;
diff --git a/uniauth-backend/src/serviceinterface.cpp b/uniauth-backend/src/serviceinterface.cpp
index 3862868..b6ae9f0 100644
--- a/uniauth-backend/src/serviceinterface.cpp
+++ b/uniauth-backend/src/serviceinterface.cpp
@@ -86,6 +86,9 @@ void ServiceInterface::setDefaultDevice(QString userName, int bioDevType, QStrin
case BIOTYPE_VOICEPRINT:
settings.setValue("VP_DefaultDevice", deviceName);
break;
+ case UNIT_GENERAL_UKEY:
+ settings.setValue("GU_DefaultDevice",deviceName);
+ break;
case REMOTE_QRCODE_TYPE:
settings.setValue("WC_DefaultDevice", deviceName);
break;
@@ -138,6 +141,9 @@ QString ServiceInterface::getDefaultDevice(QString userName, int bioDevType)
case BIOTYPE_VOICEPRINT:
strBioDefType = "VP_DefaultDevice";
break;
+ case UNIT_GENERAL_UKEY:
+ strBioDefType = "GU_DefaultDevice";
+ break;
case REMOTE_QRCODE_TYPE:
strBioDefType = "WC_DefaultDevice";
break;
@@ -173,6 +179,9 @@ QString ServiceInterface::getDefaultDevice(QString userName, int bioDevType)
case BIOTYPE_VOICEPRINT:
defaultDevice = settings.value("VP_DefaultDevice").toString();
break;
+ case UNIT_GENERAL_UKEY:
+ defaultDevice = settings.value("GU_DefaultDevice").toString();
+ break;
case REMOTE_QRCODE_TYPE:
defaultDevice = settings.value("WC_DefaultDevice").toString();
break;
@@ -198,6 +207,9 @@ QString ServiceInterface::getDefaultDevice(QString userName, int bioDevType)
case BIOTYPE_VOICEPRINT:
defaultDevice = settings2.value("VP_DefaultDevice").toString();
break;
+ case UNIT_GENERAL_UKEY:
+ defaultDevice = settings2.value("GU_DefaultDevice").toString();
+ break;
case REMOTE_QRCODE_TYPE:
defaultDevice = settings2.value("WC_DefaultDevice").toString();
break;
@@ -238,6 +250,9 @@ QStringList ServiceInterface::getAllDefaultDevice(QString userName)
case BIOTYPE_VOICEPRINT:
strBioDefType = "VP_DefaultDevice";
break;
+ case UNIT_GENERAL_UKEY:
+ strBioDefType = "GU_DefaultDevice";
+ break;
case REMOTE_QRCODE_TYPE:
strBioDefType = "WC_DefaultDevice";
break;
@@ -277,6 +292,9 @@ QStringList ServiceInterface::getAllDefaultDevice(QString userName)
case BIOTYPE_VOICEPRINT:
defaultDevice = settings.value("VP_DefaultDevice").toString();
break;
+ case UNIT_GENERAL_UKEY:
+ defaultDevice = settings.value("GU_DefaultDevice").toString();
+ break;
case REMOTE_QRCODE_TYPE:
defaultDevice = settings.value("WC_DefaultDevice").toString();
break;
@@ -300,6 +318,9 @@ QStringList ServiceInterface::getAllDefaultDevice(QString userName)
case BIOTYPE_VOICEPRINT:
defaultDevice = settings2.value("VP_DefaultDevice").toString();
break;
+ case UNIT_GENERAL_UKEY:
+ defaultDevice = settings2.value("GU_DefaultDevice").toString();
+ break;
case REMOTE_QRCODE_TYPE:
defaultDevice = settings2.value("WC_DefaultDevice").toString();
break;
@@ -334,6 +355,9 @@ void ServiceInterface::setCommDefaultDevice(int bioDevType, QString deviceName)
case BIOTYPE_VOICEPRINT:
settings.setValue("VP_DefaultDevice", deviceName);
break;
+ case UNIT_GENERAL_UKEY:
+ settings.setValue("GU_DefaultDevice", deviceName);
+ break;
case REMOTE_QRCODE_TYPE:
settings.setValue("WC_DefaultDevice", deviceName);
break;
@@ -366,6 +390,9 @@ QString ServiceInterface::getCommDefaultDevice(int bioDevType)
case BIOTYPE_VOICEPRINT:
defaultDevice = settings2.value("VP_DefaultDevice").toString();
break;
+ case UNIT_GENERAL_UKEY:
+ defaultDevice = settings2.value("GU_DefaultDevice").toString();
+ break;
case REMOTE_QRCODE_TYPE:
defaultDevice = settings2.value("WC_DefaultDevice").toString();
break;
@@ -707,6 +734,9 @@ void ServiceInterface::initData()
case BIOTYPE_VOICEPRINT:
strBioDefType = "VP_DefaultDevice";
break;
+ case UNIT_GENERAL_UKEY:
+ strBioDefType = "GU_DefaultDevice";
+ break;
case REMOTE_QRCODE_TYPE:
strBioDefType = "WC_DefaultDevice";
break;
@@ -742,6 +772,9 @@ void ServiceInterface::initData()
case BIOTYPE_VOICEPRINT:
strBioDefType = "VP_DefaultDevice";
break;
+ case UNIT_GENERAL_UKEY:
+ strBioDefType = "GU_DefaultDevice";
+ break;
case REMOTE_QRCODE_TYPE:
strBioDefType = "WC_DefaultDevice";
break;