From d7c326dc762583e524f3c40abd896877911a7586 Mon Sep 17 00:00:00 2001 From: YangLulu9 Date: Sat, 22 Feb 2025 14:34:00 +0800 Subject: [PATCH] feat : Return authToken when simple password authenticated Signed-off-by: liuhu Change-Id: Ibe597279e5156fb4d335c9e94090bb8b52ce8ada --- .../user_auth/src/user_auth_callback_v10.cpp | 3 +- services/context/src/simple_auth_context.cpp | 6 +- services/context/src/widget_context.cpp | 14 ++++- .../services/src/widget_context_test.cpp | 60 +++++++++++++++++++ 4 files changed, 79 insertions(+), 4 deletions(-) diff --git a/frameworks/js/napi/user_auth/src/user_auth_callback_v10.cpp b/frameworks/js/napi/user_auth/src/user_auth_callback_v10.cpp index 0d6ee4c4f..05059353b 100644 --- a/frameworks/js/napi/user_auth/src/user_auth_callback_v10.cpp +++ b/frameworks/js/napi/user_auth/src/user_auth_callback_v10.cpp @@ -112,7 +112,7 @@ napi_status UserAuthCallbackV10::DoResultCallback(int32_t result, return ret; } } - if (UserAuthResultCode(result) == UserAuthResultCode::SUCCESS) { + if (UserAuthResultCode(result) == UserAuthResultCode::SUCCESS || !token.empty()) { ret = UserAuthNapiHelper::SetEnrolledStateProperty(env_, eventInfo, "enrolledState", enrolledState); if (ret != napi_ok) { IAM_LOGE("SetEnrolledStateProperty failed %{public}d", ret); @@ -156,6 +156,7 @@ void UserAuthCallbackV10::OnResult(int32_t result, const Attributes &extraInfo) if (!extraInfo.GetUint16Value(Attributes::ATTR_CREDENTIAL_COUNT, resultHolder->enrolledState.credentialCount)) { IAM_LOGE("ATTR_CREDENTIAL_COUNT is null"); } + IAM_LOGI("result token size: %{public}zu.", resultHolder->token.size()); auto task = [resultHolder] () { IAM_LOGI("start"); if (resultHolder == nullptr || resultHolder->callback == nullptr) { diff --git a/services/context/src/simple_auth_context.cpp b/services/context/src/simple_auth_context.cpp index 71d228e78..f48fdff05 100644 --- a/services/context/src/simple_auth_context.cpp +++ b/services/context/src/simple_auth_context.cpp @@ -185,12 +185,15 @@ void SimpleAuthContext::OnResult(int32_t resultCode, const std::shared_ptr API_VERSION_9) { + if ((resultInfo.result == SUCCESS || resultInfo.token.size() != 0) && resultInfo.sdkVersion > API_VERSION_9) { bool credentialDigest = SetCredentialDigest(resultInfo, finalResult); IF_FALSE_LOGE_AND_RETURN(credentialDigest == true); } @@ -292,6 +295,7 @@ void SimpleAuthContext::InvokeResultCallback(const Authentication::AuthResultInf IF_FALSE_LOGE_AND_RETURN(setExpiredRet == true); } if (resultInfo.token.size() != 0) { + IAM_LOGI("result token size: %{public}zu.", resultInfo.token.size()); bool setSignatureResult = finalResult.SetUint8ArrayValue(Attributes::ATTR_SIGNATURE, resultInfo.token); IF_FALSE_LOGE_AND_RETURN(setSignatureResult == true); } diff --git a/services/context/src/widget_context.cpp b/services/context/src/widget_context.cpp index 8583b0a4f..98849deb8 100644 --- a/services/context/src/widget_context.cpp +++ b/services/context/src/widget_context.cpp @@ -260,11 +260,15 @@ void WidgetContext::AuthResult(int32_t resultCode, int32_t authType, const Attri IF_FALSE_LOGE_AND_RETURN(callerCallback_ != nullptr); callerCallback_->SetTraceAuthType(authTypeTmp); IAM_LOGI("call schedule:"); - if (resultCode == ResultCode::SUCCESS) { + if (resultCode == ResultCode::SUCCESS || resultCode == ResultCode::COMPLEXITY_CHECK_FAILED) { finalResult.GetUint8ArrayValue(Attributes::ATTR_SIGNATURE, authResultInfo_.token); finalResult.GetUint64Value(Attributes::ATTR_CREDENTIAL_DIGEST, authResultInfo_.credentialDigest); finalResult.GetUint16Value(Attributes::ATTR_CREDENTIAL_COUNT, authResultInfo_.credentialCount); authResultInfo_.authType = authTypeTmp; + IAM_LOGI("widget token size: %{public}zu.", authResultInfo_.token.size()); + if (resultCode != ResultCode::SUCCESS) { + SetLatestError(resultCode); + } schedule_->SuccessAuth(authTypeTmp); } else { // failed @@ -427,6 +431,11 @@ void WidgetContext::SuccessAuth(AuthType authType) IAM_LOGI("success auth. authType:%{public}d", static_cast(authType)); std::lock_guard lock(mutex_); // report success to App + if (latestError_ == ResultCode::COMPLEXITY_CHECK_FAILED) { + IAM_LOGE("complexity check failed"); + End(TRUST_LEVEL_NOT_SUPPORT); + return; + } End(ResultCode::SUCCESS); } @@ -543,7 +552,7 @@ void WidgetContext::End(const ResultCode &resultCode) StopAllRunTask(resultCode); IF_FALSE_LOGE_AND_RETURN(callerCallback_ != nullptr); Attributes attr; - if (resultCode == ResultCode::SUCCESS) { + if (resultCode == ResultCode::SUCCESS || authResultInfo_.token.size() != 0) { if (!attr.SetInt32Value(Attributes::ATTR_AUTH_TYPE, authResultInfo_.authType)) { IAM_LOGE("set auth type failed."); callerCallback_->SetTraceAuthFinishReason("WidgetContext End set authType fail"); @@ -558,6 +567,7 @@ void WidgetContext::End(const ResultCode &resultCode) return; } } + IAM_LOGI("in End, token size: %{public}zu.", authResultInfo_.token.size()); if (!attr.SetUint64Value(Attributes::ATTR_CREDENTIAL_DIGEST, authResultInfo_.credentialDigest)) { IAM_LOGE("set credential digest failed."); callerCallback_->SetTraceAuthFinishReason("WidgetContext End set credentialDigest fail"); diff --git a/test/unittest/services/src/widget_context_test.cpp b/test/unittest/services/src/widget_context_test.cpp index 16910a1b3..524da7701 100644 --- a/test/unittest/services/src/widget_context_test.cpp +++ b/test/unittest/services/src/widget_context_test.cpp @@ -194,6 +194,53 @@ HWTEST_F(WidgetContextTest, WidgetContextTestAuthResult_0005, TestSize.Level0) handler->EnsureTask([]() {}); } +HWTEST_F(WidgetContextTest, WidgetContextTestAuthResult_0006, TestSize.Level0) +{ + uint64_t contextId = 1; + ContextFactory::AuthWidgetContextPara para; + auto widgetContext = CreateWidgetContext(contextId, para); + EXPECT_NE(widgetContext, nullptr); + EXPECT_TRUE(widgetContext->Start()); + Attributes finalResult; + finalResult.SetInt32Value(Attributes::ATTR_AUTH_TYPE, PIN); + widgetContext->AuthResult(ResultCode::COMPLEXITY_CHECK_FAILED, 1, finalResult); + auto handler = ThreadHandler::GetSingleThreadInstance(); + handler->EnsureTask([]() {}); +} + +HWTEST_F(WidgetContextTest, WidgetContextTestAuthResult_0007, TestSize.Level0) +{ + uint64_t contextId = 1; + ContextFactory::AuthWidgetContextPara para; + auto widgetContext = CreateWidgetContext(contextId, para); + EXPECT_NE(widgetContext, nullptr); + EXPECT_TRUE(widgetContext->Start()); + Attributes finalResult; + std::vector token = {1, 1}; + finalResult.SetInt32Value(Attributes::ATTR_AUTH_TYPE, PIN); + finalResult.SetUint8ArrayValue(Attributes::ATTR_SIGNATURE, token); + widgetContext->AuthResult(ResultCode::COMPLEXITY_CHECK_FAILED, 1, finalResult); + auto handler = ThreadHandler::GetSingleThreadInstance(); + handler->EnsureTask([]() {}); +} + +HWTEST_F(WidgetContextTest, WidgetContextTestAuthResult_0008, TestSize.Level0) +{ + uint64_t contextId = 1; + ContextFactory::AuthWidgetContextPara para; + auto widgetContext = CreateWidgetContext(contextId, para); + EXPECT_NE(widgetContext, nullptr); + EXPECT_TRUE(widgetContext->Start()); + Attributes finalResult; + std::vector token = {1, 1}; + finalResult.SetInt32Value(Attributes::ATTR_AUTH_TYPE, PIN); + finalResult.SetUint8ArrayValue(Attributes::ATTR_SIGNATURE, token); + finalResult.SetUint64Value(Attributes::ATTR_CREDENTIAL_DIGEST, 1); + widgetContext->AuthResult(ResultCode::COMPLEXITY_CHECK_FAILED, 1, finalResult); + auto handler = ThreadHandler::GetSingleThreadInstance(); + handler->EnsureTask([]() {}); +} + HWTEST_F(WidgetContextTest, WidgetContextTestLaunchWidget_001, TestSize.Level0) { uint64_t contextId = 1; @@ -364,6 +411,19 @@ HWTEST_F(WidgetContextTest, WidgetContextTestSuccessAuth_003, TestSize.Level0) handler->EnsureTask([]() {}); } +HWTEST_F(WidgetContextTest, WidgetContextTestSuccessAuth_004, TestSize.Level0) +{ + uint64_t contextId = 1; + ContextFactory::AuthWidgetContextPara para; + auto widgetContext = CreateWidgetContext(contextId, para); + AuthType authType = ALL; + widgetContext->SetLatestError(ResultCode::COMPLEXITY_CHECK_FAILED); + widgetContext->SuccessAuth(authType); + EXPECT_NE(widgetContext, nullptr); + auto handler = ThreadHandler::GetSingleThreadInstance(); + handler->EnsureTask([]() {}); +} + HWTEST_F(WidgetContextTest, WidgetContextTestExecuteAuthList_0001, TestSize.Level0) { uint64_t contextId = 1; -- Gitee