diff --git a/services/common/src/permission_verification.cpp b/services/common/src/permission_verification.cpp index 03d30118d9558745c28eee3d97c31ae9cbfa723a..27a5db76c5edc537a630cb60cd61cb5d798ac690 100644 --- a/services/common/src/permission_verification.cpp +++ b/services/common/src/permission_verification.cpp @@ -428,6 +428,11 @@ int PermissionVerification::JudgeInvisibleAndBackground(const VerificationInfo & TAG_LOGD(AAFwkTag::DEFAULT, "Support SA call"); return ERR_OK; } + if (specifyTokenId > 0 && SupportSystemAbilityPermission::IsSupportSaCallPermission() && + IsSACallByTokenId(specifyTokenId) && JudgeCallerIsAllowedToUseSystemAPI()) { + TAG_LOGD(AAFwkTag::DEFAULT, "specifyTokenId form SA, Support SA or system app call"); + return ERR_OK; + } if (!isCallByShortcut && !JudgeStartInvisibleAbility(verificationInfo.accessTokenId, verificationInfo.visible, specifyTokenId)) { diff --git a/test/unittest/permission_verification_test/permission_verification_test.cpp b/test/unittest/permission_verification_test/permission_verification_test.cpp index de8d8b6e45fac61ffe60751c5f55d1033e117be7..8a06079fafe53c44ad67db014b7c3f64e4d1190d 100755 --- a/test/unittest/permission_verification_test/permission_verification_test.cpp +++ b/test/unittest/permission_verification_test/permission_verification_test.cpp @@ -33,6 +33,7 @@ const std::string DLP_PARAMS_INDEX = "ohos.dlp.params.index"; #endif // WITH_DLP const int32_t SHELL_START_EXTENSION_FLOOR = 0; const int32_t SHELL_START_EXTENSION_MAX = 22; // EMBEDDED_UI +const int32_t SA_SPECIFY_TOKEN_ID = 671874584; } class PermissionVerificationTest : public testing::Test { public: @@ -248,6 +249,22 @@ HWTEST_F(PermissionVerificationTest, CheckCallAbilityPermission_0300, TestSize.L EXPECT_EQ(result, ABILITY_VISIBLE_FALSE_DENY_REQUEST); } +/** + * @tc.name: CheckCallAbilityPermission_0400 + * @tc.desc: CheckCallAbilityPermission Test + * @tc.type: FUNC + * @tc.require: issueI5QXCQ + */ +HWTEST_F(PermissionVerificationTest, CheckCallAbilityPermission_0400, TestSize.Level1) +{ + AAFwk::PermissionVerification::VerificationInfo verificationInfo; + verificationInfo.specifyTokenId = SA_SPECIFY_TOKEN_ID; + verificationInfo.visible = true; + verificationInfo.isBackgroundCall = true; + int result = AAFwk::PermissionVerification::GetInstance()->CheckCallAbilityPermission(verificationInfo); + EXPECT_EQ(result, ERR_OK); +} + /** * @tc.name: CheckStartByCallPermission_0100 * @tc.desc: CheckStartByCallPermission Test