diff --git a/frameworks/ets/ani/accesstoken/include/ani_common.h b/frameworks/ets/ani/accesstoken/include/ani_common.h index d83378d2b8ce848cfcc2c5d608d92a002fffa776..c89b44f4f8b92cc653b3f2a51a83c9148869ed46 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_common.h +++ b/frameworks/ets/ani/accesstoken/include/ani_common.h @@ -19,6 +19,7 @@ #include "ability_context.h" #include "ani.h" #include "ani_base_context.h" +#include "ani_hisysevent_adapter.h" #include "ani_request_base.h" #include "ui_content.h" #include "ui_extension_context.h" @@ -37,6 +38,7 @@ void CreateUIExtension( std::shared_ptr asyncContext, std::shared_ptr controller ); +int32_t GetDifferRequestErrorCode(const ReqPermFromUserErrorCode& errorCode, const AniRequestType& contextType); } // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/frameworks/ets/ani/accesstoken/include/ani_hisysevent_adapter.h b/frameworks/ets/ani/accesstoken/include/ani_hisysevent_adapter.h new file mode 100644 index 0000000000000000000000000000000000000000..4cd455e2f9b92d055a020bf7eb695a379b86e22f --- /dev/null +++ b/frameworks/ets/ani/accesstoken/include/ani_hisysevent_adapter.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ACCESSTOKEN_ANI_HISYSEVENT_ADAPTER_H +#define ACCESSTOKEN_ANI_HISYSEVENT_ADAPTER_H + +namespace OHOS { +namespace Security { +namespace AccessToken { +enum ReqPermFromUserErrorCode { + TOKENID_INCONSISTENCY = 0, + ABILITY_FLAG_ERROR = 1, + GET_UI_CONTENT_FAILED = 2, + CREATE_MODAL_UI_FAILED = 3, + TRIGGER_RELEASE = 4, + TRIGGER_ONERROR = 5, + TRIGGER_DESTROY = 6, +}; +enum VerifyAccessTokenEventCode { + VERIFY_TOKENID_INCONSISTENCY = 0, +}; +} // namespace AccessToken +} // namespace Security +} // namespace OHOS +#endif // ACCESSTOKEN_ANI_HISYSEVENT_ADAPTER_H diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_base.h b/frameworks/ets/ani/accesstoken/include/ani_request_base.h index 97dc0697afde2c7f8b6b8bf8ee0de76c03cf7cb5..b80499545aef77bc1a0daf1bc0648357b0d3aa52 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_base.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_base.h @@ -40,7 +40,6 @@ enum AniRequestType { struct RequestAsyncContextBase { AccessTokenID tokenId = 0; std::string bundleName; - AtmResult result; PermissionGrantInfo info; int32_t instanceId = -1; std::shared_ptr stageContext_ = nullptr; @@ -49,13 +48,17 @@ struct RequestAsyncContextBase { bool uiContentFlag = false; std::mutex lockReleaseFlag; + // result after requesting + AtmResult result_; + std::atomic needDynamicRequest_ = true; + #ifdef EVENTHANDLER_ENABLE std::shared_ptr handler_ = nullptr; #endif std::thread::id threadId_; ani_vm* vm_ = nullptr; ani_env* env_ = nullptr; - ani_ref callbackRef = nullptr; + ani_ref callbackRef_ = nullptr; AniRequestType contextType_; RequestAsyncContextBase(ani_vm* vm, ani_env* env, AniRequestType type); @@ -109,6 +112,7 @@ protected: private: int32_t sessionId_ = 0; + std::atomic isOnResult_ = false; }; } // namespace AccessToken diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h b/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h index 4ae216cf62776d37eedd3c686cf7f522e9c032c4..40b76ecd0d3b5d211387a2c15fdfefde52924d40 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h @@ -38,9 +38,11 @@ typedef enum { } SwitchType; struct RequestGlobalSwitchAsyncContext : public RequestAsyncContextBase { - bool isDynamic = true; - bool switchStatus = false; int32_t switchType = -1; + + // results after requesting + bool switchStatus = false; + RequestGlobalSwitchAsyncContext(ani_vm* vm, ani_env* env); ~RequestGlobalSwitchAsyncContext() override; int32_t ConvertErrorCode(int32_t errCode) override; diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_permission.h b/frameworks/ets/ani/accesstoken/include/ani_request_permission.h index ae8a192725090364048dc2aff368974e20b9cb5e..6598e1dd719c803be6b4e78a8365206ac2153dd2 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_permission.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_permission.h @@ -44,11 +44,12 @@ struct RequestAsyncContext : public RequestAsyncContextBase { int32_t ConvertErrorCode(int32_t code) override; ani_object WrapResult(ani_env* env) override; bool CheckDynamicRequest() override; - void HandleResult(const std::vector& permissionList, const std::vector& grantResults); + void HandleResult(const std::vector& grantResults); bool NoNeedUpdate() override; - bool needDynamicRequest = true; std::vector permissionList; + + // results after requesting std::vector grantResults; std::vector permissionsState; std::vector dialogShownResults; @@ -57,7 +58,7 @@ struct RequestAsyncContext : public RequestAsyncContextBase { class AuthorizationResult : public Security::AccessToken::TokenCallbackStub { public: - AuthorizationResult(std::shared_ptr& data); + AuthorizationResult(std::shared_ptr data); virtual ~AuthorizationResult() override; virtual void GrantResultsCallback( diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h b/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h index d64097bb516e0eb897afc461db88c8e920dfe58f..cd0b7a0aa39dd97a0b8ba6e081d86e0e1a2b0d2c 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h @@ -32,10 +32,10 @@ namespace OHOS { namespace Security { namespace AccessToken { struct RequestPermOnSettingAsyncContext: public RequestAsyncContextBase { - bool isDynamic = true; std::vector permissionList; - ani_object requestResult = nullptr; - std::vector stateList; + + // results after requesting + std::vector stateList_; RequestPermOnSettingAsyncContext(ani_vm* vm_, ani_env* env_); ~RequestPermOnSettingAsyncContext() override; diff --git a/frameworks/ets/ani/accesstoken/src/ani_ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ani_ability_access_ctrl.cpp index cdbdeef99b3d7ab42082a0d9fb059d234d84f2ee..e016d5e537a55be0288d71abf8f77d1eef31683c 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_ability_access_ctrl.cpp @@ -22,6 +22,7 @@ #include "access_token_error.h" #include "accesstoken_kit.h" #include "accesstoken_common_log.h" +#include "ani_hisysevent_adapter.h" #include "ani_request_global_switch_on_setting.h" #include "ani_request_permission.h" #include "ani_request_permission_on_setting.h" @@ -39,6 +40,8 @@ constexpr int32_t VALUE_MAX_LEN = 32; std::mutex g_lockCache; static PermissionParamCache g_paramCache; std::map g_cache; +static std::atomic g_tokenIdOtherCount = 0; +constexpr uint32_t REPORT_TIMES_REDUCE_FACTOR = 10; static constexpr const char* PERMISSION_STATUS_CHANGE_KEY = "accesstoken.permission.change"; } constexpr const char* PERM_STATE_CHANGE_FIELD_TOKEN_ID = "tokenID"; @@ -284,6 +287,13 @@ static ani_int CheckAccessTokenExecute([[maybe_unused]] ani_env* env, [[maybe_un asyncContext->permissionName = permissionName; static uint64_t selfTokenId = GetSelfTokenID(); if (asyncContext->tokenId != static_cast(selfTokenId)) { + int32_t cnt = g_tokenIdOtherCount.fetch_add(1); + if (!AccessTokenKit::IsSystemAppByFullTokenID(selfTokenId) && cnt % REPORT_TIMES_REDUCE_FACTOR == 0) { + AccessTokenID selfToken = static_cast(selfTokenId); + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "VERIFY_ACCESS_TOKEN_EVENT", + HiviewDFX::HiSysEvent::EventType::STATISTIC, "EVENT_CODE", VERIFY_TOKENID_INCONSISTENCY, + "SELF_TOKENID", selfToken, "CONTEXT_TOKENID", asyncContext->tokenId); + } asyncContext->grantStatus = AccessToken::AccessTokenKit::VerifyAccessToken(tokenID, permissionName); return static_cast(asyncContext->grantStatus); } @@ -705,13 +715,16 @@ static bool FindAndGetSubscriberInVector(RegisterPermStateChangeInf* unregisterP LOGI(ATM_DOMAIN, ATM_TAG, "Callback is null."); callbackEqual = IsCurrentThread(item->threadId); } else { - LOGI(ATM_DOMAIN, ATM_TAG, "Compare callback."); if (!AniIsCallbackRefEqual(unregisterPermStateChangeInf->env, callbackRef, - unregisterPermStateChangeInf->callbackRef, item->threadId, callbackEqual)) { + item->callbackRef, item->threadId, callbackEqual)) { + continue; + } + if (!callbackEqual) { continue; } } + LOGI(ATM_DOMAIN, ATM_TAG, "Callback is equal."); PermStateChangeScope scopeInfo; item->subscriber->GetScope(scopeInfo); if (scopeInfo.tokenIDs == targetTokenIDs && scopeInfo.permList == targetPermList) { diff --git a/frameworks/ets/ani/accesstoken/src/ani_common.cpp b/frameworks/ets/ani/accesstoken/src/ani_common.cpp index cf221cffe448378eb00a6adf31f577e2ac3732bb..a68ac352e87a4a7b0ae93b5fc210ba7e56280b2e 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_common.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_common.cpp @@ -14,6 +14,7 @@ */ #include "ani_common.h" #include "accesstoken_common_log.h" +#include "hisysevent.h" #include namespace OHOS { namespace Security { @@ -21,8 +22,14 @@ namespace AccessToken { namespace { constexpr const char* WRAPPER_CLASS_NAME = "L@ohos/abilityAccessCtrl/AsyncCallbackWrapper;"; constexpr const char* INVOKE_METHOD_NAME = "invoke"; +static const int32_t NUM_TWENTY_FOUR = 24; } // namespace +int32_t GetDifferRequestErrorCode(const ReqPermFromUserErrorCode& errorCode, const AniRequestType& contextType) +{ + return static_cast(errorCode | (contextType << NUM_TWENTY_FOUR)); +} + bool ExecuteAsyncCallback(ani_env* env, ani_object callback, ani_object error, ani_object result) { if (env == nullptr || callback == nullptr || error == nullptr || result == nullptr) { @@ -86,7 +93,7 @@ void CreateUIExtensionMainThread(std::shared_ptr asyncC OHOS::Ace::UIContent* uiContent = GetUIContent(asyncContext->stageContext_); if (uiContent == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Get ui content failed!"); - asyncContext->result.errorCode = AccessToken::RET_FAILED; + asyncContext->result_.errorCode = AccessToken::RET_FAILED; asyncContext->uiExtensionFlag = false; return; } @@ -98,8 +105,11 @@ void CreateUIExtensionMainThread(std::shared_ptr asyncC sessionId, asyncContext->tokenId); if (sessionId <= 0) { LOGE(ATM_DOMAIN, ATM_TAG, "Create component failed, sessionId is invalid"); - asyncContext->result.errorCode = AccessToken::RET_FAILED; + asyncContext->result_.errorCode = AccessToken::RET_FAILED; asyncContext->uiExtensionFlag = false; + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR", + HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", + GetDifferRequestErrorCode(CREATE_MODAL_UI_FAILED, asyncContext->contextType_)); return; } uiExtCallback->SetSessionId(sessionId); @@ -125,7 +135,7 @@ void CloseModalUIExtensionMainThread(std::shared_ptr as Ace::UIContent* uiContent = GetUIContent(asyncContext->stageContext_); if (uiContent == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Get ui content failed!"); - asyncContext->result.errorCode = RET_FAILED; + asyncContext->result_.errorCode = RET_FAILED; return; } uiContent->CloseModalUIExtension(sessionId); diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp index 143da38f176e48d7c0402d8c10daee87295a393b..6547b4d672115ea230eebdb4458197dec561d766 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp @@ -17,6 +17,8 @@ #include "accesstoken_common_log.h" #include "accesstoken_kit.h" #include "ani_common.h" +#include "ani_hisysevent_adapter.h" +#include "hisysevent.h" #include "token_setproc.h" #include "want.h" @@ -62,6 +64,9 @@ void RequestAsyncContextBase::GetInstanceId() Ace::UIContent* uiContent = GetUIContent(this->stageContext_); if (uiContent == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Get ui content failed!"); + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR", + HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", + GetDifferRequestErrorCode(GET_UI_CONTENT_FAILED, contextType_)); return; } this->uiContentFlag = true; @@ -94,7 +99,7 @@ void RequestAsyncContextBase::CopyResult(const std::shared_ptr(callbackRef), error, result); + int32_t stsCode = ConvertErrorCode(result_.errorCode); + ani_object aniError = BusinessErrorAni::CreateError(env, stsCode, GetErrorMessage(stsCode, result_.errorMsg)); + ani_object aniResult = WrapResult(env); + (void)ExecuteAsyncCallback(env, reinterpret_cast(callbackRef_), aniError, aniResult); if (!isSameThread && vm_->DetachCurrentThread() != ANI_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "DetachCurrentThread failed!"); @@ -133,9 +138,9 @@ void RequestAsyncContextBase::Clear() return; } - if (callbackRef != nullptr) { - curEnv->GlobalReference_Delete(callbackRef); - callbackRef = nullptr; + if (callbackRef_ != nullptr) { + curEnv->GlobalReference_Delete(callbackRef_); + callbackRef_ = nullptr; } } @@ -146,7 +151,9 @@ AniRequestType RequestAsyncContextBase::GetType() UIExtensionCallback::UIExtensionCallback(const std::shared_ptr reqContext) :reqContext_(reqContext) -{} +{ + isOnResult_.exchange(false); +} UIExtensionCallback::~UIExtensionCallback() {} @@ -175,6 +182,7 @@ void UIExtensionCallback::ReleaseHandler(int32_t code) void UIExtensionCallback::OnResult(int32_t resultCode, const OHOS::AAFwk::Want& result) { + isOnResult_.exchange(true); LOGI(ATM_DOMAIN, ATM_TAG, "ResultCode is %{public}d", resultCode); reqContext_->ProcessUIExtensionCallback(result); ReleaseHandler(0); @@ -196,6 +204,9 @@ void UIExtensionCallback::OnRelease(int32_t releaseCode) { LOGI(ATM_DOMAIN, ATM_TAG, "ReleaseCode is %{public}d", releaseCode); + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR", + HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", + GetDifferRequestErrorCode(TRIGGER_RELEASE, reqContext_->contextType_), "INNER_CODE", releaseCode); ReleaseHandler(-1); } @@ -207,6 +218,9 @@ void UIExtensionCallback::OnError(int32_t code, const std::string& name, const s LOGI(ATM_DOMAIN, ATM_TAG, "Code is %{public}d, name is %{public}s, message is %{public}s", code, name.c_str(), message.c_str()); + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR", + HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", + GetDifferRequestErrorCode(TRIGGER_ONERROR, reqContext_->contextType_), "INNER_CODE", code); ReleaseHandler(-1); } @@ -225,6 +239,11 @@ void UIExtensionCallback::OnRemoteReady(const std::shared_ptrcontextType_)); + } ReleaseHandler(-1); } diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp index 4537f39cfb872c8d5736fb34eedd03e6acabed6f..32e10fe829e8054b16d85bde05b20ee7f8c6e614 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp @@ -87,7 +87,7 @@ ani_object RequestGlobalSwitchAsyncContext::WrapResult(ani_env* env) void RequestGlobalSwitchAsyncContext::ProcessUIExtensionCallback(const OHOS::AAFwk::Want& result) { - this->result.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); + this->result_.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); this->switchStatus = result.GetBoolParam(GLOBAL_SWITCH_RESULT_KEY, 0); } @@ -120,14 +120,14 @@ void RequestGlobalSwitchAsyncContext::CopyResult(const std::shared_ptr(other); - this->result.errorCode = ptr->result.errorCode; + this->result_.errorCode = ptr->result_.errorCode; this->switchStatus = ptr->switchStatus; - this->isDynamic = false; + this->needDynamicRequest_ = false; } bool RequestGlobalSwitchAsyncContext::CheckDynamicRequest() { - if (!this->isDynamic) { + if (!this->needDynamicRequest_) { LOGI(ATM_DOMAIN, ATM_TAG, "It does not need to request permission extension"); FinishCallback(); return false; @@ -137,13 +137,13 @@ bool RequestGlobalSwitchAsyncContext::CheckDynamicRequest() bool RequestGlobalSwitchAsyncContext::NoNeedUpdate() { - return result.errorCode != RET_SUCCESS || switchStatus == false; + return result_.errorCode != RET_SUCCESS || switchStatus == false; } void RequestGlobalSwitchAsyncContext::ProcessFailResult(int32_t code) { if (code == -1) { - result.errorCode = code; + result_.errorCode = code; } } @@ -152,12 +152,12 @@ static bool ParseRequestGlobalSwitch(ani_env* env, ani_object& aniContext, ani_i { asyncContext->switchType = static_cast(type); - if (!asyncContext->FillInfoFromContext(aniContext) != ANI_OK) { + if (!asyncContext->FillInfoFromContext(aniContext)) { BusinessErrorAni::ThrowParameterTypeError(env, STS_ERROR_PARAM_ILLEGAL, GetParamErrorMsg("context", "UIAbility or UIExtension Context")); return false; } - if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef)) { + if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef_)) { return false; } return true; @@ -198,7 +198,7 @@ void RequestGlobalSwitchExecute([[maybe_unused]] ani_env* env, GetRequestInstanceControl()->AddCallbackByInstanceId(asyncContext); LOGI(ATM_DOMAIN, ATM_TAG, "Start to pop ui extension dialog"); - if (asyncContext->result.errorCode != RET_SUCCESS) { + if (asyncContext->result_.errorCode != RET_SUCCESS) { asyncContext->FinishCallback(); LOGW(ATM_DOMAIN, ATM_TAG, "Failed to pop uiextension dialog."); } diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp index 96ec8c3180d0dafdfac621f8b393002d3fc9d736..a440cd234c0b668bb0164a2adee166009605a230 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp @@ -23,6 +23,7 @@ #include "accesstoken_kit.h" #include "accesstoken_common_log.h" #include "ani_common.h" +#include "ani_hisysevent_adapter.h" #include "hisysevent.h" #include "token_setproc.h" #include "want.h" @@ -74,15 +75,17 @@ static void CreateServiceExtension(std::shared_ptr asyncCon if (abilityContext == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Convert to AbilityContext failed. " \ "UIExtension ability can not pop service ablility window!"); - asyncContext->needDynamicRequest = false; - asyncContext->result.errorCode = RET_FAILED; + asyncContext->needDynamicRequest_ = false; + asyncContext->result_.errorCode = RET_FAILED; + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR", + HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", ABILITY_FLAG_ERROR); return; } OHOS::sptr remoteObject = new (std::nothrow) AuthorizationResult(asyncContext); if (remoteObject == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Create window failed!"); - asyncContext->needDynamicRequest = false; - asyncContext->result.errorCode = RET_FAILED; + asyncContext->needDynamicRequest_ = false; + asyncContext->result_.errorCode = RET_FAILED; return; } OHOS::AAFwk::Want want; @@ -104,6 +107,11 @@ static void CreateServiceExtension(std::shared_ptr asyncCon want.SetParam(REQUEST_TOKEN_KEY, abilityContext->GetToken()); int32_t ret = OHOS::AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService( want, abilityContext->GetToken()); + if (ret != ERR_OK) { + LOGE(ATM_DOMAIN, ATM_TAG, "RequestDialogService failed!"); + asyncContext->needDynamicRequest_ = false; + asyncContext->result_.errorCode = RET_FAILED; + } LOGI(ATM_DOMAIN, ATM_TAG, "Request end, ret: %{public}d, tokenId: %{public}d, permNum: %{public}zu", ret, asyncContext->tokenId, asyncContext->permissionList.size()); } @@ -172,7 +180,7 @@ ani_object RequestAsyncContext::WrapResult(ani_env* env) LOGE(ATM_DOMAIN, ATM_TAG, "Object_New status %{public}d ", static_cast(status)); return nullptr; } - auto state = this->needDynamicRequest ? this->grantResults : this->permissionsState; + auto state = this->needDynamicRequest_ ? this->grantResults : this->permissionsState; ani_ref aniPerms = CreateAniArrayString(env, permissionList); ani_ref aniAuthRes = CreateAniArrayInt(env, state); ani_ref aniDiasShownRes = CreateAniArrayBool(env, dialogShownResults); @@ -191,15 +199,20 @@ ani_object RequestAsyncContext::WrapResult(ani_env* env) return aObject; } -void RequestAsyncContext::HandleResult(const std::vector& permissionList, - const std::vector& grantResults) +void RequestAsyncContext::HandleResult(const std::vector& grantResults) { + if (permissionsState.size() != grantResults.size()) { + LOGE(ATM_DOMAIN, ATM_TAG, "Size of permissionsState(%{public}zu) and " \ + "grantResults(%{public}zu) is not euqal", + permissionsState.size(), grantResults.size()); + return; + } std::vector newGrantResults; - size_t size = permissionList.size(); + size_t size = grantResults.size(); for (size_t i = 0; i < size; i++) { int32_t result = static_cast(this->permissionsState[i]); if (this->permissionsState[i] == AccessToken::DYNAMIC_OPER) { - result = this->result.errorCode == AccessToken::RET_SUCCESS ? + result = this->result_.errorCode == AccessToken::RET_SUCCESS ? grantResults[i] : AccessToken::INVALID_OPER; } newGrantResults.emplace_back(result); @@ -207,7 +220,7 @@ void RequestAsyncContext::HandleResult(const std::vector& permissio if (newGrantResults.empty()) { LOGE(ATM_DOMAIN, ATM_TAG, "GrantResults empty"); - result.errorCode = RET_FAILED; + result_.errorCode = RET_FAILED; } this->grantResults.assign(newGrantResults.begin(), newGrantResults.end()); } @@ -254,7 +267,7 @@ bool RequestAsyncContext::CheckDynamicRequest() permissionsState.clear(); dialogShownResults.clear(); if (!IsDynamicRequest()) { - HandleResult(this->permissionList, this->permissionsState); + HandleResult(this->permissionsState); FinishCallback(); return false; } @@ -265,12 +278,12 @@ void RequestAsyncContext::ProcessUIExtensionCallback(const OHOS::AAFwk::Want& re { this->permissionList = result.GetStringArrayParam(PERMISSION_KEY); this->permissionsState = result.GetIntArrayParam(RESULT_KEY); - HandleResult(permissionList, permissionsState); + HandleResult(this->permissionsState); } int32_t RequestAsyncContext::ConvertErrorCode(int32_t code) { - return BusinessErrorAni::GetStsErrorCode(result.errorCode); + return BusinessErrorAni::GetStsErrorCode(result_.errorCode); } bool RequestAsyncContext::NoNeedUpdate() @@ -278,14 +291,14 @@ bool RequestAsyncContext::NoNeedUpdate() return true; } -static void RequestPermissionsFromUserProcess(std::shared_ptr& asyncContext) +static void RequestPermissionsFromUserProcess(std::shared_ptr asyncContext) { if (!asyncContext->IsDynamicRequest()) { LOGE(ATM_DOMAIN, ATM_TAG, "It does not need to request permission"); - asyncContext->needDynamicRequest = false; - if ((asyncContext->permissionsState.empty()) && (asyncContext->result.errorCode == RET_SUCCESS)) { + asyncContext->needDynamicRequest_ = false; + if ((asyncContext->permissionsState.empty()) && (asyncContext->result_.errorCode == RET_SUCCESS)) { LOGE(ATM_DOMAIN, ATM_TAG, "GrantResults empty"); - asyncContext->result.errorCode = RET_FAILED; + asyncContext->result_.errorCode = RET_FAILED; } return; } @@ -320,7 +333,7 @@ static void RequestPermissionsFromUserProcess(std::shared_ptr& asyncContext) + ani_object callback, std::shared_ptr asyncContext) { if (!asyncContext->FillInfoFromContext(aniContext)) { LOGE(ATM_DOMAIN, ATM_TAG, "FillInfoFromContext failed."); @@ -329,7 +342,7 @@ static bool ParseParameter(ani_env* env, ani_object aniContext, ani_array_ref an return false; } asyncContext->permissionList = ParseAniStringVector(env, aniPermissionList); - if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef)) { + if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef_)) { return false; } return true; @@ -363,11 +376,14 @@ void RequestPermissionsFromUserExecute([[maybe_unused]] ani_env* env, [[maybe_un ani_object result = reinterpret_cast(nullRef); ani_object error = BusinessErrorAni::CreateError(env, STS_ERROR_INNER, GetErrorMessage(STS_ERROR_INNER, "The specified context does not belong to the current application.")); + (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR", + HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", TOKENID_INCONSISTENCY, + "SELF_TOKEN", selfTokenID, "CONTEXT_TOKEN", asyncContext->tokenId); (void)ExecuteAsyncCallback(env, callback, error, result); return; } RequestPermissionsFromUserProcess(asyncContext); - if (asyncContext->needDynamicRequest) { + if (asyncContext->needDynamicRequest_) { return; } asyncContext->FinishCallback(); @@ -376,7 +392,7 @@ void RequestPermissionsFromUserExecute([[maybe_unused]] ani_env* env, [[maybe_un } -AuthorizationResult::AuthorizationResult(std::shared_ptr& data) : data_(data) +AuthorizationResult::AuthorizationResult(std::shared_ptr data) : data_(data) { LOGI(ATM_DOMAIN, ATM_TAG, "AuthorizationResult"); } @@ -394,7 +410,7 @@ void AuthorizationResult::GrantResultsCallback( return; } LOGI(ATM_DOMAIN, ATM_TAG, "GrantResultsCallback"); - asyncContext->HandleResult(permissionList, grantResults); + asyncContext->HandleResult(grantResults); asyncContext->FinishCallback(); } diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp index aabb449cd9bc0927f562a5d5f52e0cf45e4ed64f..d06444f2dd730881067c7d93ba795a14ea835a56 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp @@ -79,7 +79,8 @@ ani_object RequestPermOnSettingAsyncContext::WrapResult(ani_env* env) } ani_object arrayObj; - if (env->Object_New(arrayCls, arrayCtor, &arrayObj, this->stateList.size()) != ANI_OK) { + if (env->Object_New(arrayCls, arrayCtor, &arrayObj, static_cast(this->stateList_.size())) + != ANI_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "Object new failed!"); return nullptr; } @@ -92,7 +93,7 @@ ani_object RequestPermOnSettingAsyncContext::WrapResult(ani_env* env) } ani_size index = 0; - for (const auto& state: this->stateList) { + for (const auto& state: this->stateList_) { ani_enum_item enumItem; ani_size enumIndex = 0; StateToEnumIndex(state, enumIndex); @@ -143,8 +144,8 @@ int32_t RequestPermOnSettingAsyncContext::ConvertErrorCode(int32_t errorCode) void RequestPermOnSettingAsyncContext::ProcessUIExtensionCallback(const OHOS::AAFwk::Want& result) { - this->result.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); - this->stateList = result.GetIntArrayParam(PERMISSION_RESULT_KEY); + this->result_.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); + this->stateList_ = result.GetIntArrayParam(PERMISSION_RESULT_KEY); } void RequestPermOnSettingAsyncContext::StartExtensionAbility(std::shared_ptr asyncContext) @@ -195,14 +196,14 @@ void RequestPermOnSettingAsyncContext::CopyResult(const std::shared_ptr(other); - this->result.errorCode = ptr->result.errorCode; - this->stateList = ptr->stateList; - this->isDynamic = false; + this->result_.errorCode = ptr->result_.errorCode; + this->stateList_ = ptr->stateList_; + this->needDynamicRequest_ = false; } bool RequestPermOnSettingAsyncContext::CheckDynamicRequest() { - if (!this->isDynamic) { + if (!this->needDynamicRequest_) { LOGI(ATM_DOMAIN, ATM_TAG, "It does not need to request permission extension"); FinishCallback(); return false; @@ -213,16 +214,16 @@ bool RequestPermOnSettingAsyncContext::CheckDynamicRequest() void RequestPermOnSettingAsyncContext::ProcessFailResult(int32_t code) { if (code == -1) { - this->result.errorCode = code; + this->result_.errorCode = code; } } bool RequestPermOnSettingAsyncContext::NoNeedUpdate() { - if (result.errorCode != RET_SUCCESS) { + if (result_.errorCode != RET_SUCCESS) { return true; } - for (int32_t item : this->stateList) { + for (int32_t item : this->stateList_) { if (item != PERMISSION_GRANTED) { return true; } @@ -239,7 +240,7 @@ static bool ParseRequestPermissionOnSetting(ani_env* env, ani_object& aniContext return false; } asyncContext->permissionList = ParseAniStringVector(env, aniPermissionList); - if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef)) { + if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef_)) { return false; } return true; @@ -282,7 +283,7 @@ void RequestPermissionOnSettingExecute([[maybe_unused]] ani_env* env, GetRequestInstanceControl()->AddCallbackByInstanceId(asyncContext); LOGI(ATM_DOMAIN, ATM_TAG, "Start to pop ui extension dialog."); - if (asyncContext->result.errorCode != RET_SUCCESS) { + if (asyncContext->result_.errorCode != RET_SUCCESS) { asyncContext->FinishCallback(); LOGW(ATM_DOMAIN, ATM_TAG, "Failed to pop uiextension dialog."); } diff --git a/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp b/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp index 2760db89c2b3a21306709d30ad30186947e60a1a..81f65d7183ef5ae1d6e3b19d33107ecda3a84584 100644 --- a/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp +++ b/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp @@ -811,7 +811,7 @@ bool NapiRequestPermission::ParseInputToGetQueryResult(const napi_env& env, cons void* data = nullptr; NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thatVar, &data), false); // 1: can request permissions minnum argc - if (argc < MAX_PARAMS_TWO - 1) { + if (argc < MAX_PARAMS_TWO) { NAPI_CALL_BASE(env, napi_throw(env, GenerateBusinessError(env, JsErrorCode::JS_ERROR_PARAM_ILLEGAL, "Parameter is missing.")), false); return false; diff --git a/frameworks/js/napi/accesstoken/src/napi_request_permission_on_setting.cpp b/frameworks/js/napi/accesstoken/src/napi_request_permission_on_setting.cpp index 59d0e6143489e3267021d3d6c4ad50e65536b6a8..20c944f7ab2fae917f4fb1ea9ef8de961ddc5513 100644 --- a/frameworks/js/napi/accesstoken/src/napi_request_permission_on_setting.cpp +++ b/frameworks/js/napi/accesstoken/src/napi_request_permission_on_setting.cpp @@ -586,7 +586,7 @@ bool NapiRequestPermissionOnSetting::ParseRequestPermissionOnSetting(const napi_ LOGE(ATM_DOMAIN, ATM_TAG, "Napi_get_cb_info failed"); return false; } - if (argc < MAX_PARAMS_TWO) { + if (argc < MAX_PARAMS_TWO - 1) { NAPI_CALL_BASE(env, napi_throw(env, GenerateBusinessError(env, JsErrorCode::JS_ERROR_PARAM_ILLEGAL, "Parameter is missing.")), false); return false; diff --git a/interfaces/innerkits/nativetoken/src/nativetoken.c b/interfaces/innerkits/nativetoken/src/nativetoken.c index 0fe51064750426b0bd2032e20ebcc75f482bc627..92d723feadff32f40b1cbbbe6b43f270c9904373 100644 --- a/interfaces/innerkits/nativetoken/src/nativetoken.c +++ b/interfaces/innerkits/nativetoken/src/nativetoken.c @@ -347,7 +347,7 @@ static uint32_t GetRandomTokenId(uint32_t *randNum) (void)fdsan_close_with_tag(fd, g_nativeFdTag); if (len != sizeof(random)) { - LOGC("Faild to read, len(%" PRIdPTR "", len); + LOGC("Failed to read, len(%" PRIdPTR "", len); return ATRET_FAILED; } *randNum = random; diff --git a/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp b/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp index 6fa6f389e00986bf3270f9778ce211621e13397f..5317211e40498119e12fb5b501b78a67a7f7f72c 100644 --- a/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp @@ -142,7 +142,6 @@ int ShortGrantManager::RefreshPermission(AccessTokenID tokenID, const std::strin shortGrantData_.begin(), shortGrantData_.end(), [tokenID, permission](const PermTimerData& data) { return data.tokenID == tokenID && data.permissionName == permission; }); - if (iter == shortGrantData_.end()) { auto iterator = std::find(g_shortGrantPermission.begin(), g_shortGrantPermission.end(), permission); if (iterator == g_shortGrantPermission.end()) { diff --git a/services/privacymanager/test/coverage/permission_record_manager_coverage_test.cpp b/services/privacymanager/test/coverage/permission_record_manager_coverage_test.cpp index 2d7743081d4c39df71d1a2ed0dea95b9c70c41cc..4759e7d9e41af08fed8a8be7de8ed2feb7ec3cea 100644 --- a/services/privacymanager/test/coverage/permission_record_manager_coverage_test.cpp +++ b/services/privacymanager/test/coverage/permission_record_manager_coverage_test.cpp @@ -1200,35 +1200,6 @@ HWTEST_F(PermissionRecordManagerTest, InsertPermissionUsedTypeColumn001, TestSiz ASSERT_EQ(Constant::FAILURE, PermissionUsedRecordDb::GetInstance().InsertPermissionUsedTypeColumn()); PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_ = dataTypeToSqlTable; // recovery } - -/* - * @tc.name: OnUpdate001 - * @tc.desc: PermissionUsedRecordDb::OnUpdate function test - * @tc.type: FUNC - * @tc.require: - */ -HWTEST_F(PermissionRecordManagerTest, OnUpdate001, TestSize.Level4) -{ - int32_t version = static_cast(PermissionUsedRecordDb::DataBaseVersion::VERISION_0); - PermissionUsedRecordDb::GetInstance().OnUpdate(version); - - version = static_cast(PermissionUsedRecordDb::DataBaseVersion::VERISION_1); - PermissionUsedRecordDb::GetInstance().OnUpdate(version); - - version = static_cast(PermissionUsedRecordDb::DataBaseVersion::VERISION_2); - PermissionUsedRecordDb::GetInstance().OnUpdate(version); - - version = static_cast(PermissionUsedRecordDb::DataBaseVersion::VERISION_3); - PermissionUsedRecordDb::GetInstance().OnUpdate(version); - - version = static_cast(PermissionUsedRecordDb::DataBaseVersion::VERISION_4); - PermissionUsedRecordDb::GetInstance().OnUpdate(version); - - auto it = PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_.find( - PermissionUsedRecordDb::DataType::PERMISSION_USED_RECORD_TOGGLE_STATUS); - ASSERT_NE(it, PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_.end()); - ASSERT_EQ(std::string(PermissionUsedRecordDb::PERMISSION_USED_RECORD_TOGGLE_STATUS_TABLE), it->second.tableName_); -} } // namespace AccessToken } // namespace Security } // namespace OHOS