uint64_t UserAuthService::AuthWidget(int32_t apiVersion, const AuthParam &authParam, const WidgetParam &widgetParam, sptr<UserAuthCallbackInterface> &callback) { IAM_LOGI("start"); auto contextCallback = GetAuthContextCallback(authParam.challenge, authParam.authTrustLevel, callback); if (contextCallback == nullptr) { IAM_LOGE("contextCallback is nullptr"); return BAD_CONTEXT_ID; } Attributes extraInfo; ResultCode checkRet = CheckWidgetNorthPermission(authParam.authType, authParam.authTrustLevel); if (checkRet != SUCCESS) { IAM_LOGE("CheckNorthPermission failed. errCode: %{public}d", checkRet); contextCallback->OnResult(checkRet, extraInfo); return BAD_CONTEXT_ID; } int32_t userId; if (IpcCommon::GetCallingUserId(*this, userId) != SUCCESS) { IAM_LOGE("get callingUserId failed"); contextCallback->OnResult(ResultCode::GENERAL_ERROR, extraInfo); return BAD_CONTEXT_ID; } contextCallback->SetTraceUserId(userId); if (authParam.authTrustLevel != ATL1 && authParam.authTrustLevel != ATL2 && authParam.authTrustLevel != ATL3 && authParam.authTrustLevel != ATL4) { IAM_LOGE("authTrustLevel is not in correct range"); contextCallback->OnResult(ResultCode::TRUST_LEVEL_NOT_SUPPORT, extraInfo); return BAD_CONTEXT_ID; } if (!CheckValidSolution(userId, authParam.authType, authParam.authTrustLevel)) { IAM_LOGE("no valid solution, userId:%{public}d", userId); contextCallback->OnResult(ResultCode::NOT_ENROLLED, extraInfo); // return BAD_CONTEXT_ID; } ContextFactory::AuthWidgetContextPara para; InitWidgetContextParam(userId, authParam, widgetParam, para); auto context = ContextFactory::CreateWidgetContext(para, contextCallback, userId, para.tokenId); const int32_t retryTimes = 3; if (!Insert2ContextPool(context, retryTimes)) { IAM_LOGE("insert context to pool failed, retry %{public}d times", retryTimes); contextCallback->OnResult(ResultCode::GENERAL_ERROR, extraInfo); return BAD_CONTEXT_ID; } contextCallback->SetCleaner(ContextHelper::Cleaner(context)); if (!context->Start()) { int32_t errorCode = context->GetLatestError(); IAM_LOGE("failed to start auth apiVersion:%{public}d errorCode:%{public}d", apiVersion, errorCode); contextCallback->OnResult(errorCode, extraInfo); return BAD_CONTEXT_ID; } return context->GetContextId(); }代码解析
时间: 2024-04-20 08:26:06 浏览: 123
这是一个名为UserAuthService的类的成员函数AuthWidget的实现代码。它接受一些参数,执行一系列操作,并返回一个uint64_t类型的值。
函数开始时打印日志"start"。
接下来,它调用GetAuthContextCallback函数,将authParam.challenge、authParam.authTrustLevel和callback作为参数传递进去,获取一个contextCallback对象。如果获取的contextCallback为空指针,则打印日志"contextCallback is nullptr"并返回BAD_CONTEXT_ID。
然后,定义了一个名为extraInfo的Attributes对象,并调用CheckWidgetNorthPermission函数检查widget的北向权限(authParam.authType和authParam.authTrustLevel作为参数传递进去)。如果检查不通过,则打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。
接下来,使用IpcCommon::GetCallingUserId函数获取调用者的用户ID,并将其存储在userId变量中。如果获取失败,则打印日志"get callingUserId failed",通过contextCallback对象调用OnResult函数,传递GENERAL_ERROR错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。
然后,通过contextCallback对象调用SetTraceUserId函数,将userId作为参数传递进去。
接着,在一系列if语句中,检查authParam.authTrustLevel是否在正确的范围内。如果不在范围内,则打印日志"authTrustLevel is not in correct range",通过contextCallback对象调用OnResult函数,传递TRUST_LEVEL_NOT_SUPPORT错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。
接下来,调用CheckValidSolution函数检查是否存在有效的解决方案,传递userId、authParam.authType和authParam.authTrustLevel作为参数。如果不存在有效的解决方案,则打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递NOT_ENROLLED错误代码和extraInfo对象作为参数。
然后,定义了一个名为para的ContextFactory::AuthWidgetContextPara对象,并调用InitWidgetContextParam函数初始化para对象,将userId、authParam、widgetParam和para作为参数传递进去。
接着,通过ContextFactory::CreateWidgetContext函数创建一个context对象,传递para、contextCallback、userId和para.tokenId作为参数。
然后,定义了一个retryTimes变量,并将其设置为3。
接下来,通过Insert2ContextPool函数将context对象插入到context池中,传递context和retryTimes作为参数。如果插入失败,则打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递GENERAL_ERROR错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。
然后,通过contextCallback对象调用SetCleaner函数,将ContextHelper::Cleaner(context)作为参数传递进去。
最后,通过调用context对象的Start函数启动认证过程。如果启动失败,则获取最新的错误代码并打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。
如果启动成功,则返回context的上下文ID。
这段代码实现了一个用户认证的逻辑流程,并通过回调函数通知结果。
阅读全文