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 @@ Unable to verify %1, please enter password. + + UKEY AUTHENTICATION + + + + BIOMETRIC AUTHENTICATION IS CLOSED + + + + AUTHENTICATION END + + + + Enter the ukey password + + + 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 - + Enter the ukey password + 输入ukey密码 + + + + Enter the ukey password + 输入ukey密码\n + + + Try it again 再试一次 @@ -81,7 +90,12 @@ - + + UKEY AUTHENTICATION + ukey认证 + + + BIOMETRIC AUTHENTICATION 生物识别认证 @@ -116,7 +130,12 @@ 无法验证%1,请输入密码. - + + AUTHENTICATION END + 认证结束 + + + BIOMETRIC AUTHENTICATION END 生物识别认证结束 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 @@ QRCode ཨང་ཀི་ཕྱག་པ། + + ukey + + BioDevicesWidget @@ -108,5 +112,9 @@ Login Options ཐོ་འགོད་ཀྱི་བསལ་འདེམས་ཀྱི་དབང་ཆ། + + Password + གསང་ཨང་། + 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 @@ Password - 密码 + 密码 Current Device: @@ -99,7 +99,12 @@ 声纹 - + + ukey + + + + QRCode 二维码 @@ -139,6 +144,11 @@ Login Options 登录选项 + + + Password + 密码 + Wechat 微信 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 @@ ནང་འཇུག་གི་གསང་གྲངས། - + + Insert the ukey into the USB port + བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས། + + + + Enter the ukey password + གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ། + + + hours left དུས་ཚོད་འགའ་ལས་ལྷག་མེད 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 @@ Password - 密码 + 密码 @@ -304,7 +304,17 @@ 输入密码 - + + Insert the ukey into the USB port + 请将安全密钥插入USB端口 + + + + Enter the ukey password + 输入安全密钥密码 + + + hours left 小时后解锁 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;