kiran-authentication-devices/0005-fix-When-the-driver-is-enabled-the-device-is-scanned.patch

387 lines
14 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

From eb1053adb52785aa02992690d5444d4068e0e780 Mon Sep 17 00:00:00 2001
From: luoqing <luoqing@kylinsec.com.cn>
Date: Wed, 17 Jan 2024 16:32:34 +0800
Subject: [PATCH 5/6] fix(*):When the driver is enabled, the device is scanned
and the corresponding device object is created.When the driver is
disabled,the corresponding device object is released.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 启用驱动时,扫描当前设备,创建对应的设备对象;禁用驱动时,释放当前对应的设备对象
Close #25387
---
include/auth-enum.h | 15 +++-
src/auth-device-manager.cpp | 69 +++++++++++++------
src/auth-device-manager.h | 1 +
src/config-helper.cpp | 48 +++++++++++++
src/config-helper.h | 6 +-
src/device/device-creator.cpp | 1 +
src/device/finger-vein/fv-sd-device.cpp | 1 +
src/device/fingerprint/fp-zk-device.cpp | 1 +
.../multi-function/mf-iristar-device.cpp | 2 +
src/device/ukey/ukey-skf-device.cpp | 1 +
src/utils.cpp | 24 +++++++
src/utils.h | 4 ++
12 files changed, 149 insertions(+), 24 deletions(-)
diff --git a/include/auth-enum.h b/include/auth-enum.h
index b9e9e49..1b663cd 100644
--- a/include/auth-enum.h
+++ b/include/auth-enum.h
@@ -26,7 +26,7 @@ namespace Kiran
#define UKEY_CONTAINER_NAME "1003-3001"
#define UKEY_SKF_DRIVER_NAME "ukey-skf"
-#define IRISTAR_DRIVER_NAME "irs_sdk2"
+#define IRISTAR_DRIVER_NAME "irs_sdk2"
#define FINGERPRINT_ZK_DRIVER_NAME "zkfp"
#define FINGER_VEIN_SD_DRIVER_NAME "sdfv"
@@ -55,6 +55,19 @@ struct DeviceInfo
return false;
};
+
+ bool operator==(const DeviceInfo& dev) const
+ {
+ if (this->idVendor == dev.idVendor &&
+ this->idProduct == dev.idProduct)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
};
enum GeneralResult
diff --git a/src/auth-device-manager.cpp b/src/auth-device-manager.cpp
index a9f5fb0..481caf3 100644
--- a/src/auth-device-manager.cpp
+++ b/src/auth-device-manager.cpp
@@ -183,43 +183,53 @@ void AuthDeviceManager::onRemove(const QDBusMessage& message, const QString& fea
// TODO:是否需要监听配置文件的改变
void AuthDeviceManager::onSetEnableDriver(const QDBusMessage& message, const QString& driver_name, bool enable)
{
+ KLOG_DEBUG() << "set driver name:" << driver_name << "enable:" << enable;
QStringList driverList = ConfigHelper::getDriverList();
QDBusMessage replyMessage;
- do
+ if (!driverList.contains(driver_name))
{
- if (!driverList.contains(driver_name))
- {
- replyMessage = message.createErrorReply(QDBusError::Failed, "No driver with the corresponding name was found.");
- break;
- }
- ConfigHelper::setDriverEnabled(driver_name, enable);
- replyMessage = message.createReply();
+ replyMessage = message.createErrorReply(QDBusError::Failed, "No driver with the corresponding name was found.");
+ QDBusConnection::systemBus().send(replyMessage);
+ return;
+ }
+
+ bool oldDriverStatus = ConfigHelper::driverEnabled(driver_name);
- if (enable)
+ ConfigHelper::setDriverEnabled(driver_name, enable);
+ replyMessage = message.createReply();
+ QDBusConnection::systemBus().send(replyMessage);
+
+ // 若之前驱动已经关闭,启用驱动后,遍历设备,加载可用的设备
+ if (enable && !oldDriverStatus)
+ {
+ //NOTE注意此处是从配置文件中读出所支持的Vid和Pid获取不到所支持的设备的BusPath因此这里返回的DeviceInfo的BusPath为空
+ QList<DeviceInfo> devices = ConfigHelper::getDeviceIDsSupportedByDriver(driver_name);
+ for (auto device : devices)
{
- break;
+ if(!Utils::isExistDevice(device.idVendor,device.idProduct))
+ {
+ continue;
+ }
+ device.busPath = Utils::getBusPath(device.idVendor,device.idProduct);
+ handleDeviceAdded(device);
}
+ return;
+ }
- // 驱动被禁用,将当前正在使用的设备释放掉
+ // 若之前驱动开启,现在关闭驱动,将当前正在使用的设备释放掉
+ if (!enable && oldDriverStatus)
+ {
auto devices = m_deviceMap.values();
- Q_FOREACH (AuthDevicePtr device, devices)
+ for (AuthDevicePtr device : devices)
{
if (device->driverName() != driver_name)
{
continue;
}
- QString deviceID = device->deviceID();
- int deviceType = device->deviceType();
- device->deleteLater();
- QString key = m_deviceMap.key(device);
- m_deviceMap.remove(key);
- Q_EMIT m_dbusAdaptor->DeviceDeleted(deviceType, deviceID);
- KLOG_INFO() << QString("destroyed deviceType: %1, deviceID:%2").arg(deviceType).arg(deviceID);
+ removeDevice(device);
}
- } while (false);
-
- QDBusConnection::systemBus().send(replyMessage);
+ }
}
AuthDeviceList AuthDeviceManager::createDevices(const DeviceInfo& deviceInfo)
@@ -258,6 +268,21 @@ AuthDeviceList AuthDeviceManager::createDevices(const DeviceInfo& deviceInfo)
return deviceList;
}
+void AuthDeviceManager::removeDevice(QSharedPointer<AuthDevice> device)
+{
+ QString deviceID = device->deviceID();
+ int deviceType = device->deviceType();
+ QString deviceName = device->driverName();
+
+ QString key = m_deviceMap.key(device);
+ int count = m_deviceMap.remove(key);
+ KLOG_DEBUG() << "remove device count:" << count;
+
+ device->deleteLater();
+ Q_EMIT m_dbusAdaptor->DeviceDeleted(deviceType, deviceID);
+ KLOG_INFO() << QString("destroyed deviceName: %1 , bus path : %2 , deviceType: %3, deviceID:%4").arg(deviceName).arg(key).arg(deviceType).arg(deviceID);
+}
+
CHECK_AUTH_WITH_1ARGS(AuthDeviceManager, Remove, onRemove, AUTH_USER_ADMIN, const QString&)
CHECK_AUTH_WITH_2ARGS(AuthDeviceManager, SetEnableDriver, onSetEnableDriver, AUTH_USER_ADMIN, const QString&, bool)
diff --git a/src/auth-device-manager.h b/src/auth-device-manager.h
index 95e68e9..150a372 100644
--- a/src/auth-device-manager.h
+++ b/src/auth-device-manager.h
@@ -62,6 +62,7 @@ private:
void onRemove(const QDBusMessage &message, const QString &feature_id);
void onSetEnableDriver(const QDBusMessage &message, const QString &driver_name, bool enable);
QList<QSharedPointer<AuthDevice>> createDevices(const DeviceInfo &deviceInfo);
+ void removeDevice(QSharedPointer<AuthDevice> device);
private:
static AuthDeviceManager *m_instance;
diff --git a/src/config-helper.cpp b/src/config-helper.cpp
index 8fc5a47..880296b 100644
--- a/src/config-helper.cpp
+++ b/src/config-helper.cpp
@@ -113,6 +113,18 @@ bool ConfigHelper::driverEnabled(const QString &vid, const QString &pid)
return enable;
}
+bool ConfigHelper::driverEnabled(const QString &driverName)
+{
+ bool enable = false;
+ QSettings confSettings(DRIVER_CONF, QSettings::NativeFormat);
+ QStringList driverList = confSettings.childGroups();
+ if (driverList.contains(driverName))
+ {
+ enable = confSettings.value(QString("%1/Enable").arg(driverName)).toBool();
+ }
+ return enable;
+}
+
void ConfigHelper::setDriverEnabled(const QString &driverName, bool enable)
{
QSettings confSettings(DRIVER_CONF, QSettings::NativeFormat);
@@ -147,4 +159,40 @@ bool ConfigHelper::isDeviceSupported(const QString &vid, const QString &pid)
return false;
}
+QList<DeviceInfo> ConfigHelper::getDeviceIDsSupportedByDriver(const QString &driverName)
+{
+ QList<DeviceInfo> deviceInfos;
+
+ QSettings confSettings(DEVICE_CONF, QSettings::NativeFormat);
+ QStringList deviceList = confSettings.childGroups();
+ for (auto deviceConf : deviceList)
+ {
+ confSettings.beginGroup(deviceConf);
+ if (confSettings.value("Driver").toString() != driverName)
+ {
+ confSettings.endGroup();
+ continue;
+ }
+
+ QStringList idList = confSettings.value("Id").toStringList();
+ for (const QString &id : idList)
+ {
+ QStringList idItems = id.split(":");
+ if (idItems.count() != 2)
+ {
+ continue;
+ }
+
+ DeviceInfo deviceinfo;
+ deviceinfo.idVendor = idItems.value(0);
+ deviceinfo.idProduct = idItems.value(1);
+
+ deviceInfos << deviceinfo;
+ }
+ confSettings.endGroup();
+ }
+
+ return deviceInfos;
+}
+
} // namespace Kiran
\ No newline at end of file
diff --git a/src/config-helper.h b/src/config-helper.h
index 91cf895..0e1a5f5 100644
--- a/src/config-helper.h
+++ b/src/config-helper.h
@@ -13,6 +13,7 @@
*/
#pragma once
#include <QString>
+#include "auth-enum.h"
namespace Kiran
{
@@ -50,9 +51,12 @@ public:
static QStringList getDriverList();
static bool driverEnabled(const QString &vid, const QString &pid);
+ static bool driverEnabled(const QString & driverName);
+
static void setDriverEnabled(const QString& driverName, bool enable);
static bool isDeviceSupported(const QString &vid, const QString &pid);
-
+
+ static QList<DeviceInfo> getDeviceIDsSupportedByDriver(const QString& driverName);
private:
};
diff --git a/src/device/device-creator.cpp b/src/device/device-creator.cpp
index 1fb760f..90ea201 100644
--- a/src/device/device-creator.cpp
+++ b/src/device/device-creator.cpp
@@ -45,6 +45,7 @@ DeviceCereator::~DeviceCereator()
{
}
+//TODO:将设备的BusPath作为入參创建设备处理存在多个一模一样vid和pid相同的设备同时存在的场景
AuthDeviceList DeviceCereator::createDevices(const QString &vid, const QString &pid, DriverPtr driver)
{
AuthDeviceList deviceList;
diff --git a/src/device/finger-vein/fv-sd-device.cpp b/src/device/finger-vein/fv-sd-device.cpp
index 442f227..80ca4be 100644
--- a/src/device/finger-vein/fv-sd-device.cpp
+++ b/src/device/finger-vein/fv-sd-device.cpp
@@ -42,6 +42,7 @@ FVSDDevice::FVSDDevice(const QString &vid, const QString &pid, DriverPtr driver,
FVSDDevice::~FVSDDevice()
{
+ KLOG_DEBUG() << "destroy FVSD Device";
if (m_driver->isLoaded())
{
acquireFeatureStop();
diff --git a/src/device/fingerprint/fp-zk-device.cpp b/src/device/fingerprint/fp-zk-device.cpp
index 3a818f3..659e9ab 100644
--- a/src/device/fingerprint/fp-zk-device.cpp
+++ b/src/device/fingerprint/fp-zk-device.cpp
@@ -49,6 +49,7 @@ FPZKDevice::FPZKDevice(const QString& vid, const QString& pid, DriverPtr driver,
// 析构时对设备进行资源回收
FPZKDevice::~FPZKDevice()
{
+ KLOG_DEBUG() << "destroy FPZK Device";
acquireFeatureStop();
if (m_driver->isLoaded())
diff --git a/src/device/multi-function/mf-iristar-device.cpp b/src/device/multi-function/mf-iristar-device.cpp
index 27e1809..58ed89c 100644
--- a/src/device/multi-function/mf-iristar-device.cpp
+++ b/src/device/multi-function/mf-iristar-device.cpp
@@ -33,6 +33,7 @@ MFIriStarDevice::MFIriStarDevice(const QString &vid, const QString &pid, DriverP
m_driver = driver.dynamicCast<MFIriStarDriver>();
m_driver->ref();
m_driver->setDeviceInfo(vid,pid);
+ setDriverName(IRISTAR_DRIVER_NAME);
qRegisterMetaType<EnrollProcess>("EnrollProcess");
qRegisterMetaType<IdentifyProcess>("IdentifyProcess");
@@ -44,6 +45,7 @@ MFIriStarDevice::MFIriStarDevice(const QString &vid, const QString &pid, DriverP
MFIriStarDevice::~MFIriStarDevice()
{
+ KLOG_DEBUG() << "destroy MFIriStar Device";
m_driver->unref();
if (m_driver->refCount() <= 0)
{
diff --git a/src/device/ukey/ukey-skf-device.cpp b/src/device/ukey/ukey-skf-device.cpp
index 82bd13d..c8feb7b 100644
--- a/src/device/ukey/ukey-skf-device.cpp
+++ b/src/device/ukey/ukey-skf-device.cpp
@@ -51,6 +51,7 @@ UKeySKFDevice::UKeySKFDevice(const QString &vid, const QString &pid, DriverPtr d
UKeySKFDevice::~UKeySKFDevice()
{
+ KLOG_DEBUG() << "destroy UKey SKF Device";
int index = m_existingSerialNumber.indexOf(deviceSerialNumber());
m_existingSerialNumber.removeAt(index);
KLOG_DEBUG() << "destory device, serialNumber:" << deviceSerialNumber();
diff --git a/src/utils.cpp b/src/utils.cpp
index 3061263..0e11b04 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -101,5 +101,29 @@ QJsonValue getValueFromJsonString(const QString& json, const QString& key)
return jsonObject.value(key);
}
+bool isExistDevice(const QString& idVendor, const QString& idProduct)
+{
+ DeviceInfo deviceInfo;
+ deviceInfo.idVendor = idVendor;
+ deviceInfo.idProduct = idProduct;
+ deviceInfo.busPath = "";
+ QList<DeviceInfo> devices = enumerateDevices();
+ return devices.contains(deviceInfo);
+}
+
+QString getBusPath(const QString& idVendor, const QString& idProduct)
+{
+ QList<DeviceInfo> devices = enumerateDevices();
+ for (auto device : devices)
+ {
+ if (device.idVendor == idVendor &&
+ device.idProduct == idProduct)
+ {
+ return device.busPath;
+ }
+ }
+ return QString();
+}
+
} // namespace Utils
} // namespace Kiran
\ No newline at end of file
diff --git a/src/utils.h b/src/utils.h
index 1c28065..9ba5598 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -28,5 +28,9 @@ QString getDeviceName(const QString& idVendor, const QString& idProduct);
QJsonValue getValueFromJsonString(const QString& json, const QString& key);
+bool isExistDevice(const QString& idVendor, const QString& idProduct);
+
+QString getBusPath(const QString& idVendor, const QString& idProduct);
+
} // namespace Utils
} // namespace Kiran
--
2.33.0