diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp index c395dd52fec24f9a5db483931ccd95d6a0d82d97..0856dbf6c7c536fce0dd7a6a1c297a32a50198af 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp @@ -104,15 +104,20 @@ PermUsedTypeEnum AccessTokenManagerClient::GetPermissionUsedType( int AccessTokenManagerClient::VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName) { + if (IsRenderToken(tokenID)) { + LOGI(ATM_DOMAIN, ATM_TAG, "TokenId %{public}d is render, perm denied.", tokenID); + return PERMISSION_DENIED; + } auto proxy = GetProxy(); if (proxy != nullptr) { - int32_t errCode = proxy->VerifyAccessToken(tokenID, permissionName); + int32_t state = PERMISSION_DENIED; + int32_t errCode = proxy->VerifyAccessToken(tokenID, permissionName, state); if (errCode != RET_SUCCESS) { errCode = ConvertResult(errCode); LOGE(ATM_DOMAIN, ATM_TAG, "Request fail, result: %{public}d", errCode); return PERMISSION_DENIED; } - return errCode; + return state; } char value[VALUE_MAX_LEN] = {0}; int32_t ret = GetParameter(ACCESS_TOKEN_SERVICE_INIT_KEY, "", value, VALUE_MAX_LEN - 1); @@ -132,6 +137,12 @@ int AccessTokenManagerClient::VerifyAccessToken(AccessTokenID tokenID, const std int AccessTokenManagerClient::VerifyAccessToken(AccessTokenID tokenID, const std::vector& permissionList, std::vector& permStateList) { + if (IsRenderToken(tokenID)) { + LOGI(ATM_DOMAIN, ATM_TAG, "TokenId %{public}d is render, perm denied.", tokenID); + permStateList.clear(); + permStateList.resize(permissionList.size(), PERMISSION_DENIED); + return RET_SUCCESS; + } auto proxy = GetProxy(); if (proxy == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Proxy is null"); @@ -1284,6 +1295,12 @@ bool AccessTokenManagerClient::IsToastShownNeeded(int32_t pid) return needToShow; } + +bool AccessTokenManagerClient::IsRenderToken(int32_t tokenID) +{ + AccessTokenIDInner *idInner = reinterpret_cast(&tokenID); + return idInner->renderFlag; +} } // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h index 68501905985de265f0253beef0043b375402739a..16208ce53cd553906a1bc441c40882336e1e4ee4 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h @@ -121,6 +121,7 @@ public: int32_t GetSecCompEnhance(int32_t pid, SecCompEnhanceData& enhance); #endif // SECURITY_COMPONENT_ENHANCE_ENABLE bool IsToastShownNeeded(int32_t pid); + bool IsRenderToken(int32_t tokenID); private: AccessTokenManagerClient(); diff --git a/interfaces/innerkits/accesstoken/test/unittest/PermissionsTest/verify_access_token_test.cpp b/interfaces/innerkits/accesstoken/test/unittest/PermissionsTest/verify_access_token_test.cpp index 2bf298ec3cb18a6a83cd24977ddd685500e57a88..cbf46e3caae65c0ba725e1fe55b5e503be60776d 100644 --- a/interfaces/innerkits/accesstoken/test/unittest/PermissionsTest/verify_access_token_test.cpp +++ b/interfaces/innerkits/accesstoken/test/unittest/PermissionsTest/verify_access_token_test.cpp @@ -295,6 +295,47 @@ HWTEST_F(VerifyAccessTokenTest, VerifyAccessTokenWithListAbnormalTest001, TestSi ASSERT_EQ(PERMISSION_DENIED, permStateList[1]); ASSERT_EQ(PERMISSION_DENIED, permStateList[2]); } + +/** + * @tc.name: VerifyAccessTokenWithRender001 + * @tc.desc: Verify permission that tokenID is render. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(VerifyAccessTokenTest, VerifyAccessTokenWithRender001, TestSize.Level0) +{ + AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0); + AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID; + + int ret = TestCommon::GrantPermissionByTest(tokenID, "ohos.permission.MICROPHONE", PERMISSION_USER_FIXED); + ASSERT_EQ(RET_SUCCESS, ret); + ret = AccessTokenKit::VerifyAccessToken(tokenID, "ohos.permission.MICROPHONE", true); + EXPECT_EQ(PERMISSION_GRANTED, ret); + // get render token + uint64_t renderToken = TokenIdKit::GetRenderTokenID(tokenID); + ASSERT_NE(renderToken, INVALID_TOKENID); + ASSERT_NE(renderToken, tokenID); + AccessTokenID renderTokenID = static_cast(renderToken); + // render return DENIED + ret = AccessTokenKit::VerifyAccessToken(renderTokenID, "ohos.permission.MICROPHONE", true); + EXPECT_EQ(ret, PERMISSION_DENIED); + + std::vector permissionList; + permissionList.emplace_back("ohos.permission.MICROPHONE"); + permissionList.emplace_back("ohos.permission.APPROXIMATELY_LOCATION"); + + std::vector permStateList; + ret = AccessTokenKit::VerifyAccessToken(renderTokenID, permissionList, permStateList, true); + EXPECT_EQ(RET_SUCCESS, ret); + ASSERT_EQ(permissionList.size(), permStateList.size()); + EXPECT_EQ(PERMISSION_DENIED, permStateList[0]); + EXPECT_EQ(PERMISSION_DENIED, permStateList[1]); + + ret = TestCommon::RevokePermissionByTest(tokenID, "ohos.permission.MICROPHONE", PERMISSION_USER_FIXED); + ASSERT_EQ(RET_SUCCESS, ret); + ret = AccessTokenKit::VerifyAccessToken(tokenID, "ohos.permission.MICROPHONE", true); + ASSERT_EQ(PERMISSION_DENIED, ret); +} } // namespace AccessToken } // namespace Security } // namespace OHOS \ No newline at end of file diff --git a/services/accesstokenmanager/idl/IAccessTokenManager.idl b/services/accesstokenmanager/idl/IAccessTokenManager.idl index a3fab95195865c6dc6fc8a9045217e4af380ec72..3d8317a4b3f3581db3e266c2027b6326cfab359b 100644 --- a/services/accesstokenmanager/idl/IAccessTokenManager.idl +++ b/services/accesstokenmanager/idl/IAccessTokenManager.idl @@ -34,7 +34,7 @@ import IdlCommon; option_stub_hooks on; interface OHOS.Security.AccessToken.IAccessTokenManager{ - [ipccode 1] void VerifyAccessToken([in] unsigned int tokenID, [in] String permissionName); + [ipccode 1] void VerifyAccessToken([in] unsigned int tokenID, [in] String permissionName, [out] int state); [ipccode 2] void GetDefPermission([in] String permissionName, [out] PermissionDefParcel permissionDefResult); [ipccode 3] void GetReqPermissions([in] unsigned int tokenID, [out] List reqPermList, [in] boolean isSystemGrant); [ipccode 4] void GetPermissionFlag([in] unsigned int tokenID, [in] String permissionName, [out] unsigned int flag); diff --git a/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h b/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h index 4e66789db230d4bf003a503ed8f41b087473e80c..098c269013868f79006dccd020350ffac49764be 100644 --- a/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h +++ b/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h @@ -56,7 +56,7 @@ public: AccessTokenID tokenID, const std::string& permissionName, int32_t& permUsedType) override; int32_t InitHapToken(const HapInfoParcel& info, const HapPolicyParcel& policy, uint64_t& fullTokenId, HapInfoCheckResultIdl& resultInfoIdl) override; - int VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName) override; + int32_t VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName, int32_t& state) override; int VerifyAccessToken(AccessTokenID tokenID, const std::vector& permissionList, std::vector& permStateList) override; int GetDefPermission(const std::string& permissionName, PermissionDefParcel& permissionDefResult) override; @@ -144,6 +144,7 @@ private: bool Initialize(); void AccessTokenServiceParamSet() const; bool isLocationPermSpecialHandle(std::string permissionName, int32_t apiVersion); + int VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName); PermissionOper GetPermissionsState(AccessTokenID tokenID, std::vector& reqPermList); int32_t UpdateHapTokenCore(AccessTokenIDEx& tokenIdEx, const UpdateHapInfoParams& info, const HapPolicyParcel& policyParcel, HapInfoCheckResultIdl& resultInfoIdl); diff --git a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp index 1e9d9d09b7c57a5cb8c47d7fc3bce99453b1c6ad..bdb1f2ddeb9097ecfaef29729950eab5ce482ec8 100644 --- a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp +++ b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp @@ -175,6 +175,13 @@ int32_t AccessTokenManagerService::GetPermissionUsedType( return ERR_OK; } +int32_t AccessTokenManagerService::VerifyAccessToken( + AccessTokenID tokenID, const std::string& permissionName, int32_t& state) +{ + state = VerifyAccessToken(tokenID, permissionName); + return RET_SUCCESS; +} + int AccessTokenManagerService::VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName) { #ifdef HITRACE_NATIVE_ENABLE