diff --git a/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp b/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp index ccb878ac6e04331fee9a7f2da4861c312c4f9720..ec098cbf54034212122ac7fbac69afa53a883ccd 100644 --- a/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp +++ b/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp @@ -161,9 +161,10 @@ void PermissionBackgroundTaskObserver::OnContinuousTaskStart( const std::shared_ptr &continuousTaskCallbackInfo) { AccessTokenID tokenID = static_cast(continuousTaskCallbackInfo->GetFullTokenId()); - uint32_t typeId = continuousTaskCallbackInfo->GetTypeId(); - if (static_cast(typeId) != BackgroundMode::LOCATION) { - LOGD(ATM_DOMAIN, ATM_TAG, "TypeId:%{public}d can not use temp permission", typeId); + std::vector typeIds = continuousTaskCallbackInfo->GetTypeIds(); + auto it = std::find(typeIds.begin(), typeIds.end(), static_cast(BackgroundMode::LOCATION)); + if (it == typeIds.end()) { + LOGI(ATM_DOMAIN, ATM_TAG, "TypeId can not use temp permission"); return; } std::vector list; @@ -182,9 +183,10 @@ void PermissionBackgroundTaskObserver::OnContinuousTaskStop( const std::shared_ptr &continuousTaskCallbackInfo) { AccessTokenID tokenID = static_cast(continuousTaskCallbackInfo->GetFullTokenId()); - uint32_t typeId = continuousTaskCallbackInfo->GetTypeId(); - if (static_cast(typeId) != BackgroundMode::LOCATION) { - LOGD(ATM_DOMAIN, ATM_TAG, "TypeId:%{public}d can not use temp permission", typeId); + std::vector typeIds = continuousTaskCallbackInfo->GetTypeIds(); + auto it = std::find(typeIds.begin(), typeIds.end(), static_cast(BackgroundMode::LOCATION)); + if (it == typeIds.end()) { + LOGI(ATM_DOMAIN, ATM_TAG, "TypeId can not use temp permission"); return; } std::vector list; diff --git a/services/accesstokenmanager/test/unittest/permission_manager_test.cpp b/services/accesstokenmanager/test/unittest/permission_manager_test.cpp index 8e63c6dfa739f6545408592f85134f8db5368101..3a212f7c375dab935d90e4e644f0910f6fe930cc 100644 --- a/services/accesstokenmanager/test/unittest/permission_manager_test.cpp +++ b/services/accesstokenmanager/test/unittest/permission_manager_test.cpp @@ -29,6 +29,7 @@ #include "accesstoken_callback_stubs.h" #include "callback_death_recipients.h" #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE +#include "background_task_manager_access_client.h" #include "continuous_task_callback_info.h" #endif @@ -1061,6 +1062,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission006, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); // change to background @@ -1103,6 +1105,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission007, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); EXPECT_EQ(PERMISSION_GRANTED, @@ -1135,6 +1138,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission008, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); // change to background @@ -1174,6 +1178,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission009, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); // create a form @@ -1220,6 +1225,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission010, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); // create a form @@ -1271,6 +1277,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission011, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); // create a form @@ -1319,6 +1326,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission012, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); // create a form @@ -1375,6 +1383,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission013, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::DATA_TRANSFER); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::DATA_TRANSFER)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); @@ -1382,6 +1391,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission013, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo1 = std::make_shared(); continuousTaskCallbackInfo1->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo1->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo1->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo1); @@ -1432,6 +1442,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission014, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); @@ -1457,6 +1468,61 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission014, TestSize.Level1) ASSERT_EQ(RET_SUCCESS, ret); GTEST_LOG_(INFO) << "remove the token info"; } + +/** + * @tc.name: GrantTempPermission021 + * @tc.desc: Test grant temp permission switching to background and have a background task with 2 typeId + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(PermissionManagerTest, GrantTempPermission021, TestSize.Level0) +{ + accessTokenService_->state_ = ServiceRunningState::STATE_RUNNING; + accessTokenService_->Initialize(); + AccessTokenID tokenID = CreateTempHapTokenInfo(); + EXPECT_EQ(RET_SUCCESS, PermissionManager::GetInstance().GrantPermission(tokenID, + "ohos.permission.APPROXIMATELY_LOCATION", PERMISSION_ALLOW_THIS_TIME)); + EXPECT_EQ(PERMISSION_GRANTED, + AccessTokenInfoManager::GetInstance().VerifyAccessToken(tokenID, "ohos.permission.APPROXIMATELY_LOCATION")); + // create background task + std::shared_ptr continuousTaskCallbackInfo + = std::make_shared(); + continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::DATA_TRANSFER); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::DATA_TRANSFER)); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); + continuousTaskCallbackInfo->tokenId_ = tokenID; + backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); + // change to background + AppStateData appStateData; + appStateData.state = static_cast(ApplicationState::APP_STATE_BACKGROUND); + appStateData.accessTokenId = tokenID; + appStateObserver_->OnAppStateChanged(appStateData); + EXPECT_EQ(PERMISSION_GRANTED, + AccessTokenInfoManager::GetInstance().VerifyAccessToken(tokenID, "ohos.permission.APPROXIMATELY_LOCATION")); + sleep(11); + EXPECT_EQ(PERMISSION_GRANTED, + AccessTokenInfoManager::GetInstance().VerifyAccessToken(tokenID, "ohos.permission.APPROXIMATELY_LOCATION")); + + // change to foreground + appStateData.state = static_cast(ApplicationState::APP_STATE_FOREGROUND); + appStateObserver_->OnAppStateChanged(appStateData); + sleep(1); + // stop background task + backgroundTaskObserver_->OnContinuousTaskStop(continuousTaskCallbackInfo); + // change to background + appStateData.state = static_cast(ApplicationState::APP_STATE_BACKGROUND); + appStateObserver_->OnAppStateChanged(appStateData); + EXPECT_EQ(PERMISSION_GRANTED, + AccessTokenInfoManager::GetInstance().VerifyAccessToken(tokenID, "ohos.permission.APPROXIMATELY_LOCATION")); + sleep(11); + EXPECT_EQ(PERMISSION_DENIED, + AccessTokenInfoManager::GetInstance().VerifyAccessToken(tokenID, "ohos.permission.APPROXIMATELY_LOCATION")); + + // remove hap + int32_t ret = AccessTokenInfoManager::GetInstance().RemoveHapTokenInfo(tokenID); + ASSERT_EQ(RET_SUCCESS, ret); + GTEST_LOG_(INFO) << "remove the token info"; +} #endif /** * @tc.name: GrantTempPermission015 @@ -1593,6 +1659,7 @@ HWTEST_F(PermissionManagerTest, GrantTempPermission019, TestSize.Level1) std::shared_ptr continuousTaskCallbackInfo = std::make_shared(); continuousTaskCallbackInfo->typeId_ = static_cast(BackgroundMode::LOCATION); + continuousTaskCallbackInfo->typeIds_.emplace_back(static_cast(BackgroundMode::LOCATION)); continuousTaskCallbackInfo->tokenId_ = tokenID; backgroundTaskObserver_->OnContinuousTaskStart(continuousTaskCallbackInfo); EXPECT_EQ(PERMISSION_GRANTED, @@ -1669,6 +1736,24 @@ HWTEST_F(PermissionManagerTest, ContinuousTaskCallbackInfoParcel001, TestSize.Le EXPECT_EQ(info.abilityId_, p->abilityId_); EXPECT_EQ(info.tokenId_, p->tokenId_); } + +/* + * @tc.name: ContinuousTaskCallbackCall001 + * @tc.desc: test call interface code success + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(PermissionManagerTest, ContinuousTaskCallbackCall001, TestSize.Level1) +{ + sptr backgroundTaskObserver = + new (std::nothrow) PermissionBackgroundTaskObserver(); + ASSERT_EQ(RET_SUCCESS, + BackgourndTaskManagerAccessClient::GetInstance().SubscribeBackgroundTask(backgroundTaskObserver)); + ASSERT_EQ(RET_SUCCESS, + BackgourndTaskManagerAccessClient::GetInstance().UnsubscribeBackgroundTask(backgroundTaskObserver)); + std::vector> list; + ASSERT_EQ(RET_SUCCESS, BackgourndTaskManagerAccessClient::GetInstance().GetContinuousTaskApps(list)); +} #endif } // namespace AccessToken } // namespace Security