Add ACCESS_TOKEN hisysevent

Signed-off-by: bigtea <tianqushen@huawei.com>
This commit is contained in:
bigtea
2025-01-10 18:46:37 +08:00
parent 733baf4d59
commit 4fe9c19de7
11 changed files with 165 additions and 46 deletions
@@ -15,6 +15,8 @@
#include "napi_atmanager.h"
#include "access_token.h"
#include "hisysevent.h"
#include "napi_hisysevent_adapter.h"
#include "napi_request_global_switch_on_setting.h"
#include "napi_request_permission.h"
#include "napi_request_permission_on_setting.h"
@@ -30,6 +32,8 @@ std::vector<RegisterPermStateChangeInfo*> g_permStateChangeRegisters;
std::mutex g_lockCache;
std::map<std::string, PermissionStatusCache> g_cache;
static PermissionParamCache g_paramCache;
static std::atomic<int32_t> g_cnt = 0;
constexpr uint32_t REPORT_CNT = 10;
namespace {
static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {
LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "AccessTokenAbilityAccessCtrl"
@@ -421,6 +425,15 @@ void NapiAtManager::VerifyAccessTokenExecute(napi_env env, void *data)
if (asyncContext == nullptr) {
return;
}
AccessTokenID selfTokenId = static_cast<AccessTokenID>(GetSelfTokenID());
if (asyncContext->tokenId != selfTokenId) {
int32_t cnt = g_cnt.fetch_add(1);
if (cnt % REPORT_CNT == 0) {
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "VERIFY_ACCESS_TOKEN_EVENT",
HiviewDFX::HiSysEvent::EventType::STATISTIC, "EVENT_CODE", VERIFY_TOKENID_INCONSISTENCY,
"SELF_TOKENID", selfTokenId, "CONTEXT_TOKENID", asyncContext->tokenId);
}
}
asyncContext->result = AccessTokenKit::VerifyAccessToken(asyncContext->tokenId, asyncContext->permissionName);
}
@@ -487,6 +500,15 @@ void NapiAtManager::CheckAccessTokenExecute(napi_env env, void *data)
asyncContext->errorCode = JS_ERROR_PARAM_INVALID;
return;
}
AccessTokenID selfTokenId = static_cast<AccessTokenID>(GetSelfTokenID());
if (asyncContext->tokenId != selfTokenId) {
int32_t cnt = g_cnt.fetch_add(1);
if (cnt % REPORT_CNT == 0) {
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "VERIFY_ACCESS_TOKEN_EVENT",
HiviewDFX::HiSysEvent::EventType::STATISTIC, "EVENT_CODE", VERIFY_TOKENID_INCONSISTENCY,
"SELF_TOKENID", selfTokenId, "CONTEXT_TOKENID", asyncContext->tokenId);
}
}
asyncContext->result = AccessTokenKit::VerifyAccessToken(asyncContext->tokenId,
asyncContext->permissionName);
@@ -616,6 +638,13 @@ napi_value NapiAtManager::VerifyAccessTokenSync(napi_env env, napi_callback_info
return nullptr;
}
if (asyncContext->tokenId != static_cast<AccessTokenID>(selfTokenId)) {
int32_t cnt = g_cnt.fetch_add(1);
if (cnt % REPORT_CNT == 0) {
AccessTokenID selfToken = static_cast<AccessTokenID>(selfTokenId);
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->result = AccessTokenKit::VerifyAccessToken(asyncContext->tokenId, asyncContext->permissionName);
napi_value result = nullptr;
NAPI_CALL(env, napi_create_int32(env, asyncContext->result, &result));
@@ -21,6 +21,7 @@
#include "accesstoken_log.h"
#include "hisysevent.h"
#include "napi_base_context.h"
#include "napi_hisysevent_adapter.h"
#include "token_setproc.h"
#include "want.h"
@@ -107,6 +108,8 @@ static void GetInstanceId(std::shared_ptr<RequestAsyncContext>& asyncContext)
Ace::UIContent* uiContent = GetUIContent(asyncContext);
if (uiContent == nullptr) {
ACCESSTOKEN_LOG_ERROR(LABEL, "Get ui content failed!");
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", GET_UI_CONTENT_FAILED);
return;
}
asyncContext->uiContentFlag = true;
@@ -148,6 +151,8 @@ static void CreateUIExtensionMainThread(std::shared_ptr<RequestAsyncContext>& as
ACCESSTOKEN_LOG_ERROR(LABEL, "Create component failed, sessionId is 0");
asyncContext->result = RET_FAILED;
asyncContext->uiExtensionFlag = false;
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", CREATE_MODAL_UI_FAILED);
return;
}
uiExtCallback->SetSessionId(sessionId);
@@ -409,6 +414,8 @@ static void CreateServiceExtension(std::shared_ptr<RequestAsyncContext> asyncCon
ACCESSTOKEN_LOG_ERROR(LABEL, "UIExtension ability can not pop service ablility window!");
asyncContext->needDynamicRequest = false;
asyncContext->result = RET_FAILED;
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", ABILITY_FLAG_ERROR);
return;
}
sptr<IRemoteObject> remoteObject = new (std::nothrow) AccessToken::AuthorizationResult(asyncContext);
@@ -497,6 +504,7 @@ void UIExtensionCallback::ReleaseHandler(int32_t code)
UIExtensionCallback::UIExtensionCallback(const std::shared_ptr<RequestAsyncContext>& reqContext)
{
this->reqContext_ = reqContext;
isOnResult_.exchange(false);
}
UIExtensionCallback::~UIExtensionCallback()
@@ -512,6 +520,7 @@ void UIExtensionCallback::SetSessionId(int32_t sessionId)
*/
void UIExtensionCallback::OnResult(int32_t resultCode, const AAFwk::Want& result)
{
isOnResult_.exchange(true);
ACCESSTOKEN_LOG_INFO(LABEL, "ResultCode is %{public}d", resultCode);
this->reqContext_->permissionList = result.GetStringArrayParam(PERMISSION_KEY);
this->reqContext_->permissionsState = result.GetIntArrayParam(RESULT_KEY);
@@ -533,7 +542,8 @@ void UIExtensionCallback::OnReceive(const AAFwk::WantParams& receive)
void UIExtensionCallback::OnRelease(int32_t releaseCode)
{
ACCESSTOKEN_LOG_INFO(LABEL, "ReleaseCode is %{public}d", releaseCode);
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", TRIGGER_RELEASE, "INNER_CODE", releaseCode);
ReleaseHandler(-1);
}
@@ -544,7 +554,8 @@ void UIExtensionCallback::OnError(int32_t code, const std::string& name, const s
{
ACCESSTOKEN_LOG_INFO(LABEL, "Code is %{public}d, name is %{public}s, message is %{public}s",
code, name.c_str(), message.c_str());
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", TRIGGER_ONERROR, "INNER_CODE", code);
ReleaseHandler(-1);
}
@@ -563,6 +574,10 @@ void UIExtensionCallback::OnRemoteReady(const std::shared_ptr<Ace::ModalUIExtens
void UIExtensionCallback::OnDestroy()
{
ACCESSTOKEN_LOG_INFO(LABEL, "UIExtensionAbility destructed.");
if (isOnResult_.load() == false) {
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", TRIGGER_DESTROY);
}
ReleaseHandler(-1);
}
@@ -690,6 +705,9 @@ void NapiRequestPermission::RequestPermissionsFromUserExecute(napi_env env, void
ACCESSTOKEN_LOG_ERROR(LABEL, "The context tokenID: %{public}d, selfTokenID: %{public}d.",
asyncContextHandle->asyncContextPtr->tokenId, selfTokenID);
asyncContextHandle->asyncContextPtr->result = RET_FAILED;
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "REQ_PERM_FROM_USER_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", TOKENID_INCONSISTENCY,
"SELF_TOKEN", selfTokenID, "CONTEXT_TOKEN", asyncContextHandle->asyncContextPtr->tokenId);
return;
}
+22
View File
@@ -114,3 +114,25 @@ SET_PERMISSION_DIALOG_CAP:
INSTINDEX: {type: INT32, desc: inst index}
ENABLE: {type: BOOL, desc: enable or disable}
REQ_PERM_FROM_USER_ERROR:
__BASE: {type: FAULT, level: CRITICAL, desc: failed to request permission from user}
ERROR_CODE: {type: INT32, desc: error code}
SELF_TOKENID: {type: UINT32, desc: self tokenID}
CONTEXT_TOKENID: {type: UINT32, desc: context tokenID}
UPDATE_PERMISSION_STATUS_ERROR:
__BASE: {type: FAULT, level: CRITICAL, desc: failed to grant or revoke permission}
ERROR_CODE: {type: INT32, desc: error code}
TOKENID: {type: UINT32, desc: tokenID}
PERM: {type: STRING, desc: permission name}
BUNDLE_NAME: {type: STRING, desc: bundle name}
INT_VAL1: {type: INT32, desc: hap dlp type/return value}
INT_VAL2: {type: INT32, desc: permission dlp mode/update permission flag}
NEED_KILL: {type: BOOL, desc: need kill hap}
VERIFY_ACCESS_TOKEN_EVENT:
__BASE: {type: STATISTIC, level: CRITICAL, desc: verify access token event}
EVENT_CODE: {type: INT32, desc: event code}
SELF_TOKENID: {type: UINT32, desc: self tokenID}
CONTEXT_TOKENID: {type: UINT32, desc: context tokenID}
@@ -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_NAPI_HISYSEVENT_ADAPTER_H
#define ACCESSTOKEN_NAPI_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_NAPI_HISYSEVENT_ADAPTER_H
@@ -93,6 +93,7 @@ public:
private:
int32_t sessionId_ = 0;
std::shared_ptr<RequestAsyncContext> reqContext_ = nullptr;
std::atomic<bool> isOnResult_;
};
struct ResultCallback {
@@ -27,6 +27,12 @@ enum SceneCode {
INIT_HAP_TOKENINFO_ERROR,
INIT_NATIVE_TOKENINFO_ERROR,
INIT_PERM_DEF_JSON_ERROR,
TOKENID_NOT_EQUAL,
};
enum UpdatePermStatusErrorCode {
GRANT_TEMP_PERMISSION_FAILED = 0,
DLP_CHECK_FAILED = 1,
UPDATE_PERMISSION_STATUS_FAILED = 2,
};
void ReportSysEventPerformance();
void ReportSysEventServiceStart(int32_t pid, uint32_t hapSize, uint32_t nativeSize, uint32_t permDefSize);
@@ -113,6 +113,8 @@ private:
int32_t ScopeFilter(const PermStateChangeScope& scopeSrc, PermStateChangeScope& scopeRes);
int32_t UpdateTokenPermissionState(
AccessTokenID id, const std::string& permission, bool isGranted, uint32_t flag, bool needKill);
int32_t UpdateTokenPermissionStateCheck(const std::shared_ptr<HapTokenInfoInner>& infoPtr,
AccessTokenID id, const std::string& permission, bool isGranted, uint32_t flag);
bool IsPermissionVaild(const std::string& permissionName);
bool GetLocationPermissionIndex(std::vector<PermissionListStateParcel>& reqPermList, LocationIndex& locationIndex);
bool GetLocationPermissionState(AccessTokenID tokenID, std::vector<PermissionListStateParcel>& reqPermList,
@@ -34,6 +34,7 @@
#include "dlp_permission_set_manager.h"
#endif
#include "ipc_skeleton.h"
#include "hisysevent_adapter.h"
#include "parameter.h"
#include "permission_definition_cache.h"
#include "short_grant_manager.h"
@@ -496,32 +497,21 @@ int32_t PermissionManager::UpdateTokenPermissionState(
ACCESSTOKEN_LOG_ERROR(LABEL, "tokenInfo is null, tokenId=%{public}u", id);
return AccessTokenError::ERR_TOKENID_NOT_EXIST;
}
if (infoPtr->IsRemote()) {
ACCESSTOKEN_LOG_ERROR(LABEL, "Remote token can not update");
return AccessTokenError::ERR_IDENTITY_CHECK_FAILED;
}
if ((flag == PERMISSION_ALLOW_THIS_TIME) && isGranted) {
if (!TempPermissionObserver::GetInstance().IsAllowGrantTempPermission(id, permission)) {
ACCESSTOKEN_LOG_ERROR(LABEL, "Id:%{public}d fail to grant permission:%{public}s", id, permission.c_str());
return ERR_IDENTITY_CHECK_FAILED;
}
int32_t ret = UpdateTokenPermissionStateCheck(infoPtr, id, permission, isGranted, flag);
if (ret != ERR_OK) {
return ret;
}
#ifdef SUPPORT_SANDBOX_APP
int32_t hapDlpType = infoPtr->GetDlpType();
if (hapDlpType != DLP_COMMON) {
int32_t permDlpMode = DlpPermissionSetManager::GetInstance().GetPermDlpMode(permission);
if (!DlpPermissionSetManager::GetInstance().IsPermDlpModeAvailableToDlpHap(hapDlpType, permDlpMode)) {
ACCESSTOKEN_LOG_DEBUG(LABEL, "%{public}s cannot to be granted to %{public}u", permission.c_str(), id);
return AccessTokenError::ERR_IDENTITY_CHECK_FAILED;
}
}
#endif
// statusBefore cannot use VerifyPermissionStatus in permPolicySet, because the function exclude secComp
bool isSecCompGrantedBefore = HapTokenInfoInner::IsPermissionGrantedWithSecComp(id, permission);
bool statusChanged = false;
int32_t ret = infoPtr->UpdatePermissionStatus(permission, isGranted, flag, statusChanged);
ret = infoPtr->UpdatePermissionStatus(permission, isGranted, flag, statusChanged);
if (ret != RET_SUCCESS) {
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "UPDATE_PERMISSION_STATUS_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", UPDATE_PERMISSION_STATUS_FAILED, "TOKENID", id,
"PERM", permission, "BUNDLE_NAME", infoPtr->GetBundleName(), "INT_VAL1", ret,
"INT_VAL2", static_cast<int32_t>(flag), "NEED_KILL", needKill);
return ret;
}
if (statusChanged) {
@@ -541,6 +531,36 @@ int32_t PermissionManager::UpdateTokenPermissionState(
return RET_SUCCESS;
}
int32_t PermissionManager::UpdateTokenPermissionStateCheck(const std::shared_ptr<HapTokenInfoInner>& infoPtr,
AccessTokenID id, const std::string& permission, bool isGranted, uint32_t flag)
{
if (infoPtr->IsRemote()) {
ACCESSTOKEN_LOG_ERROR(LABEL, "Remote token can not update");
return AccessTokenError::ERR_IDENTITY_CHECK_FAILED;
}
if ((flag == PERMISSION_ALLOW_THIS_TIME) && isGranted) {
if (!TempPermissionObserver::GetInstance().IsAllowGrantTempPermission(id, permission)) {
ACCESSTOKEN_LOG_ERROR(LABEL, "Id:%{public}d fail to grant permission:%{public}s", id, permission.c_str());
return ERR_IDENTITY_CHECK_FAILED;
}
}
#ifdef SUPPORT_SANDBOX_APP
int32_t hapDlpType = infoPtr->GetDlpType();
if (hapDlpType != DLP_COMMON) {
int32_t permDlpMode = DlpPermissionSetManager::GetInstance().GetPermDlpMode(permission);
if (!DlpPermissionSetManager::GetInstance().IsPermDlpModeAvailableToDlpHap(hapDlpType, permDlpMode)) {
ACCESSTOKEN_LOG_DEBUG(LABEL, "%{public}s cannot to be granted to %{public}u", permission.c_str(), id);
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "UPDATE_PERMISSION_STATUS_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", DLP_CHECK_FAILED, "TOKENID", id, "PERM",
permission, "BUNDLE_NAME", infoPtr->GetBundleName(), "INT_VAL1", hapDlpType, "INT_VAL2", permDlpMode);
return AccessTokenError::ERR_IDENTITY_CHECK_FAILED;
}
}
#endif
return ERR_OK;
}
int32_t PermissionManager::UpdatePermission(AccessTokenID tokenID, const std::string& permissionName,
bool isGranted, uint32_t flag, bool needKill)
{
@@ -27,6 +27,7 @@
#endif
#include "form_manager_access_client.h"
#include "hisysevent.h"
#include "hisysevent_adapter.h"
#include "ipc_skeleton.h"
namespace OHOS {
@@ -481,6 +482,9 @@ bool TempPermissionObserver::CheckPermissionState(AccessTokenID tokenID,
AddTempPermTokenToList(tokenID, bundleName, permissionName, list);
return true;
}
HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "UPDATE_PERMISSION_STATUS_ERROR",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_CODE", GRANT_TEMP_PERMISSION_FAILED,
"TOKENID", tokenID, "PERM", permissionName, "BUNDLE_NAME", bundleName);
return false;
}
@@ -759,11 +759,6 @@ void AccessTokenInfoManager::TryUpdateExistNativeToken(const std::shared_ptr<Nat
std::vector<AccessTokenID>& deleteTokenList, std::vector<GenericValues>& nativeTokenValues,
std::vector<GenericValues>& permStateValues)
{
if (infoPtr == nullptr) {
ACCESSTOKEN_LOG_WARN(LABEL, "Info is null.");
return;
}
AccessTokenID cfgTokenId = infoPtr->GetTokenID();
std::string cfgProcessName = infoPtr->GetProcessName();
AccessTokenID oriTokenId = INVALID_TOKENID;
@@ -796,6 +791,10 @@ void AccessTokenInfoManager::TryUpdateExistNativeToken(const std::shared_ptr<Nat
if (!idExist && processExist) { // this process is exist, but id is not same, perhaps libat lose his data
IdFalseWithProcessTrueCache(infoPtr, cfgTokenId, cfgProcessName, oriTokenId);
std::string errMsg = "processName=" + cfgProcessName + ", newTokenID=" + std::to_string(cfgTokenId) +
", oldTokenID=" + std::to_string(oriTokenId);
ReportSysEventServiceStartError(TOKENID_NOT_EQUAL, errMsg, TOKENID_NOT_EQUAL);
deleteTokenList.emplace_back(oriTokenId);
infoPtr->TransferNativeInfo(nativeTokenValues); // get new native token info
infoPtr->TransferPermissionPolicy(permStateValues); // get new permission state
@@ -1446,25 +1446,6 @@ HWTEST_F(AccessTokenInfoManagerTest, RemoveNativeTokenInfo001, TestSize.Level1)
ASSERT_EQ(RET_SUCCESS, AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(tokenId));
}
/**
* @tc.name: TryUpdateExistNativeToken001
* @tc.desc: AccessTokenInfoManager::TryUpdateExistNativeToken function test
* @tc.type: FUNC
* @tc.require:
*/
HWTEST_F(AccessTokenInfoManagerTest, TryUpdateExistNativeToken001, TestSize.Level1)
{
std::shared_ptr<NativeTokenInfoInner> infoPtr = nullptr;
std::vector<AccessTokenID> deleteTokenList;
std::vector<GenericValues> permStateValues;
std::vector<GenericValues> nativeTokenValues;
AccessTokenInfoManager::GetInstance().TryUpdateExistNativeToken(infoPtr, deleteTokenList,
permStateValues, nativeTokenValues); // infoPtr is null
ASSERT_EQ(0, deleteTokenList.size());
ASSERT_EQ(0, permStateValues.size());
ASSERT_EQ(0, nativeTokenValues.size());
}
/**
* @tc.name: Insert001
* @tc.desc: PermissionDefinitionCache::Insert function test