Skip to content

fix: release fingerprint claim after enrollment completion or failure#3299

Closed
fly602 wants to merge 1 commit into
linuxdeepin:masterfrom
fly602:master
Closed

fix: release fingerprint claim after enrollment completion or failure#3299
fly602 wants to merge 1 commit into
linuxdeepin:masterfrom
fly602:master

Conversation

@fly602

@fly602 fly602 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor
  1. Add new releaseFingerClaim method to CharaMangerWorker
  2. Call releaseFingerClaim after enrollment success, failure, and disconnection
  3. Ensure proper resource cleanup when fingerprint enrollment ends
  4. Prevent fingerprint device from remaining locked after use

Log: Improved fingerprint enrollment reliability by releasing device claims properly

Influence:

  1. Test fingerprint enrollment success scenario to verify claim is released
  2. Test enrollment failure scenario to ensure proper cleanup
  3. Test enrollment disconnection to confirm resource release
  4. Verify no memory leaks or device locks after enrollment completion
  5. Test multiple enrollment cycles to check consistent behavior
  6. Validate system stability after repeated enrollment attempts

fix: 在指纹登记完成或失败后释放指纹声明

  1. 向 CharaMangerWorker 添加新的 releaseFingerClaim 方法
  2. 在登记成功、失败和断开连接后调用 releaseFingerClaim
  3. 确保指纹登记结束时正确清理资源
  4. 防止指纹设备在使用后保持锁定状态

Log: 通过正确释放设备声明来提高指纹登记可靠性

Influence:

  1. 测试指纹登记成功场景,验证声明是否被释放
  2. 测试登记失败场景,确保正确清理
  3. 测试登记断开连接,确认资源释放
  4. 验证登记完成后无内存泄漏或设备锁
  5. 测试多次登记周期,检查行为一致性
  6. 验证重复登记尝试后的系统稳定性

PMS: BUG-364881

1. Add new releaseFingerClaim method to CharaMangerWorker
2. Call releaseFingerClaim after enrollment success, failure, and
disconnection
3. Ensure proper resource cleanup when fingerprint enrollment ends
4. Prevent fingerprint device from remaining locked after use

Log: Improved fingerprint enrollment reliability by releasing device
claims properly

Influence:
1. Test fingerprint enrollment success scenario to verify claim is
released
2. Test enrollment failure scenario to ensure proper cleanup
3. Test enrollment disconnection to confirm resource release
4. Verify no memory leaks or device locks after enrollment completion
5. Test multiple enrollment cycles to check consistent behavior
6. Validate system stability after repeated enrollment attempts

fix: 在指纹登记完成或失败后释放指纹声明

1. 向 CharaMangerWorker 添加新的 releaseFingerClaim 方法
2. 在登记成功、失败和断开连接后调用 releaseFingerClaim
3. 确保指纹登记结束时正确清理资源
4. 防止指纹设备在使用后保持锁定状态

Log: 通过正确释放设备声明来提高指纹登记可靠性

Influence:
1. 测试指纹登记成功场景,验证声明是否被释放
2. 测试登记失败场景,确保正确清理
3. 测试登记断开连接,确认资源释放
4. 验证登记完成后无内存泄漏或设备锁
5. 测试多次登记周期,检查行为一致性
6. 验证重复登记尝试后的系统稳定性

PMS: BUG-364881

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @fly602, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: fly602

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@fly602 fly602 requested a review from mhduiy June 17, 2026 03:14
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

★ 总体评分:75分

■ 【总体评价】

代码通过拆分函数修复了指纹设备Claim权限未释放的问题,但存在重复代码和同步阻塞UI的性能缺陷
逻辑正确但因代码重复和同步阻塞扣25分

■ 【详细分析】

  • 1.语法逻辑(正确)✓

修复准确切中了BUG核心,将原本在stopFingerEnroll中耦合的Claim释放逻辑独立为releaseFingerClaim,并在fingerprintauthcontroller.cpp的161行、170行、180行的三个结束流程中显式调用,确保了设备占用权限能被正确回收。
潜在问题:无
建议:无

  • 2.代码质量(一般)✕

fingerprintauthcontroller.cpp中连续三次重复调用m_worker->releaseFingerClaim(m_model->userName()),违反了DRY原则,增加了后续维护时漏改的风险。
潜在问题:后续若释放逻辑需要增加参数或前置校验,需要同步修改三处,极易引发遗漏。
建议:将stopEnroll()和releaseFingerClaim()封装为一个统一的私有方法如cleanupFingerEnroll(),在三个流程中统一调用该方法。

  • 3.代码性能(存在性能问题)✕

releaseFingerClaim函数内部调用了callClaim.waitForFinished(),这是一个同步阻塞调用。由于该函数由UI层的FingerprintAuthController触发,同步等待DBus后端响应会导致UI线程挂起。
潜在问题:若后端守护进程响应缓慢或卡死,将直接导致整个指纹认证界面冻结,影响用户体验。
建议:将waitForFinished()改为基于QDBusPendingCallWatcher的异步回调连接,避免无限期卡死UI线程。

  • 4.代码安全(存在0个安全漏洞)✓

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个
代码未引入命令注入、权限绕过等安全漏洞,传入Claim的userName来源于模型层,后端DBus服务会进行权限校验,整体安全可控。

  • 建议:保持现有的输入来源校验机制即可。

■ 【改进建议代码示例】

diff --git a/src/plugin-authentication/operation/fingerprintauthcontroller.cpp b/src/plugin-authentication/operation/fingerprintauthcontroller.cpp
--- a/src/plugin-authentication/operation/fingerprintauthcontroller.cpp
+++ b/src/plugin-authentication/operation/fingerprintauthcontroller.cpp
@@ -158,22 +158,28 @@ void FingerprintAuthController::onFingerEnrollFailed(const QString &title, const
 void FingerprintAuthController::onFingerEnrollFailed(const QString &title, const QString &message)
 {
-    // ...
-    setAddStage(CharaMangerModel::Fail);
-    emit fingerTipsChanged();
-    stopEnroll();
-    m_worker->releaseFingerClaim(m_model->userName());
+    setAddStage(CharaMangerModel::Fail);
+    emit fingerTipsChanged();
+    cleanupFingerEnroll();
 }
 
 void FingerprintAuthController::onFingerEnrollCompleted()
 {
-    // ...
-    setAddStage(CharaMangerModel::Success);
-    emit enrollCompleted();
-    stopEnroll();
-    m_worker->releaseFingerClaim(m_model->userName());
+    setAddStage(CharaMangerModel::Success);
+    emit enrollCompleted();
+    cleanupFingerEnroll();
 }
 
 void FingerprintAuthController::onFingerEnrollDisconnected()
 {
-    // ...
-    setAddStage(CharaMangerModel::Fail);
-    emit fingerTipsChanged();
-    stopEnroll();
-    m_worker->releaseFingerClaim(m_model->userName());
+    setAddStage(CharaMangerModel::Fail);
+    emit fingerTipsChanged();
+    cleanupFingerEnroll();
+}
+
+void FingerprintAuthController::cleanupFingerEnroll()
+{
+    stopEnroll();
+    m_worker->releaseFingerClaim(m_model->userName());
 }
diff --git a/src/plugin-authentication/operation/charamangerworker.cpp b/src/plugin-authentication/operation/charamangerworker.cpp
--- a/src/plugin-authentication/operation/charamangerworker.cpp
+++ b/src/plugin-authentication/operation/charamangerworker.cpp
@@ -380,10 +380,18 @@ void CharaMangerWorker::stopFingerEnroll(const QString &userName)
 void CharaMangerWorker::releaseFingerClaim(const QString &userName)
 {
     auto callClaim = m_charaMangerInter->Claim(userName, false);
-    callClaim.waitForFinished();
-    if (callClaim.isError()) {
-        // 原有的错误处理逻辑(仅提取到部分关键逻辑)
+    QPointer<CharaMangerWorker> self = this;
+    auto *watcher = new QDBusPendingCallWatcher(callClaim, this);
+    connect(watcher, &QDBusPendingCallWatcher::finished, this, [self, watcher](QDBusPendingCallWatcher *w) {
+        if (self) {
+            QDBusPendingReply<> reply = *w;
+            if (reply.isError()) {
+                // 原有的错误处理逻辑
+            }
+        } else {
+            w->deleteLater();
+            return;
+        }
+        w->deleteLater();
     });
 }

@fly602 fly602 closed this Jun 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants