From 412ace794acb4ee71039e8c09a8d3d0400aa5d02 Mon Sep 17 00:00:00 2001 From: zhouyan Date: Tue, 9 Sep 2025 15:32:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=B8=E6=9C=BA=E6=BC=8F=E6=B4=9E=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7=E4=BF=AE=E6=94=B96.0=E6=8C=91=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyan Change-Id: I727ecb6c8dcc4da550c8312ce5084abd927cc5ac --- .../privacy/src/privacy_manager_client.cpp | 2 +- .../src/permission/short_grant_manager.cpp | 2 +- .../src/permission/token_modify_notifier.cpp | 2 +- .../database_dlopen_coverage_test.cpp | 1 - .../record/permission_record_manager.h | 5 +-- .../src/record/permission_record_manager.cpp | 21 +++++----- .../privacymanager/test/unittest/BUILD.gn | 4 ++ .../permission_record_manager_test.cpp | 39 +++++++++++++++++-- 8 files changed, 54 insertions(+), 22 deletions(-) diff --git a/interfaces/innerkits/privacy/src/privacy_manager_client.cpp b/interfaces/innerkits/privacy/src/privacy_manager_client.cpp index cc196ab00..3467c65d1 100644 --- a/interfaces/innerkits/privacy/src/privacy_manager_client.cpp +++ b/interfaces/innerkits/privacy/src/privacy_manager_client.cpp @@ -165,7 +165,7 @@ int32_t PrivacyManagerClient::StartUsingPermission(AccessTokenID tokenId, int32_ } sptr callbackWrap = nullptr; - uint64_t id = GetUniqueId(tokenId, -1); + uint64_t id = GetUniqueId(tokenId, pid); int32_t result = CreateStateChangeCbk(id, callback, callbackWrap); if (result != RET_SUCCESS) { return result; 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 a3b23b5ef..6fa6f389e 100644 --- a/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp @@ -251,7 +251,7 @@ void ShortGrantManager::ScheduleRevokeTask(AccessTokenID tokenID, const std::str LOGI(ATM_DOMAIN, ATM_TAG, "Token: %{public}d, permission: %{public}s, delay revoke permission end.", tokenID, permission.c_str()); }); - LOGI(ATM_DOMAIN, ATM_TAG, "cancelTimes %{public}d", cancelTimes); + LOGI(ATM_DOMAIN, ATM_TAG, "CancelTimes %{public}d.", cancelTimes); eventHandler->ProxyPostTask(delayed, taskName, cancelTimes * 1000); // 1000 means to ms return; #else diff --git a/services/accesstokenmanager/main/cpp/src/permission/token_modify_notifier.cpp b/services/accesstokenmanager/main/cpp/src/permission/token_modify_notifier.cpp index e4b74f2e7..d51eceea0 100644 --- a/services/accesstokenmanager/main/cpp/src/permission/token_modify_notifier.cpp +++ b/services/accesstokenmanager/main/cpp/src/permission/token_modify_notifier.cpp @@ -175,7 +175,7 @@ int32_t TokenModifyNotifier::GetRemoteHapTokenInfo(const std::string& deviceID, int32_t TokenModifyNotifier::RegisterTokenSyncCallback(const sptr& callback) { Utils::UniqueWriteGuard infoGuard(this->notifyLock_); - tokenSyncCallbackObject_ = new (std::nothrow) TokenSyncCallbackProxy(callback); + tokenSyncCallbackObject_ = new TokenSyncCallbackProxy(callback); tokenSyncCallbackDeathRecipient_ = sptr::MakeSptr(); if (tokenSyncCallbackDeathRecipient_ == nullptr) { return RET_FAILED; diff --git a/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp b/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp index ea42a0154..9838e8484 100644 --- a/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp +++ b/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp @@ -28,7 +28,6 @@ namespace Security { namespace AccessToken { namespace { constexpr const int32_t WAIT_EVENTHANDLE_TIME = 2; -constexpr const int32_t WAIT_DELAY_DLCLOSE_TIME = 7; } class AccessTokenDatabaseDlopenTest : public testing::Test { public: diff --git a/services/privacymanager/include/record/permission_record_manager.h b/services/privacymanager/include/record/permission_record_manager.h index f2d213e5f..ea0154d63 100644 --- a/services/privacymanager/include/record/permission_record_manager.h +++ b/services/privacymanager/include/record/permission_record_manager.h @@ -160,15 +160,14 @@ private: #endif int32_t RemoveRecordFromStartList(AccessTokenID tokenId, int32_t pid, const std::string& permissionName, int32_t callerPid); - int32_t AddRecordToStartList(const PermissionUsedTypeInfo& info, int32_t status, int32_t callerPid, - bool isCamera = false); + int32_t AddRecordToStartList(const PermissionUsedTypeInfo& info, int32_t status, int32_t callerPid); void PermListToString(const std::vector& permList); bool GetGlobalSwitchStatus(const std::string& permissionName); void ModifyMuteStatus(const std::string& permissionName, int32_t index, bool isMute); bool GetMuteStatus(const std::string& permissionName, int32_t index); - void ExecuteCameraCallbackAsync(AccessTokenID tokenId, int32_t callbackPid); + void ExecuteCameraCallbackAsync(AccessTokenID callbackTokenId, int32_t pid); void TransformEnumToBitValue(const PermissionUsedType type, uint32_t& value); bool AddOrUpdateUsedTypeIfNeeded(const AccessTokenID tokenId, const int32_t opCode, diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index b5f090474..73e8f6eee 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -957,7 +957,7 @@ int32_t PermissionRecordManager::DeletePermissionRecord(int32_t days) } int32_t PermissionRecordManager::AddRecordToStartList( - const PermissionUsedTypeInfo &info, int32_t status, int32_t callerPid, bool isCamera) + const PermissionUsedTypeInfo &info, int32_t status, int32_t callerPid) { int32_t opCode; int ret = Constant::SUCCESS; @@ -971,7 +971,7 @@ int32_t PermissionRecordManager::AddRecordToStartList( .tokenId = info.tokenId, .opCode = opCode, .status = status, - .pid = (isCamera ? -1 : info.pid), + .pid = info.pid, .callerPid = callerPid, }; @@ -997,9 +997,7 @@ void PermissionRecordManager::ExecuteAndUpdateRecord(uint32_t tokenId, int32_t p std::lock_guard lock(startRecordListMutex_); std::set updateList; for (auto it = startRecordList_.begin(); it != startRecordList_.end();) { - if ((it->tokenId == tokenId) && // tokenId - ((it->pid == -1) || (it->pid == pid)) && // pid - ((it->status != PERM_INACTIVE) && (it->status != status))) { // status + if ((it->tokenId == tokenId) && ((it->status) != PERM_INACTIVE) && ((it->status) != status)) { std::string perm; Constant::TransferOpcodeToPermission(it->opCode, perm); if ((GetMuteStatus(perm, EDM)) || (!GetGlobalSwitchStatus(perm))) { @@ -1300,16 +1298,15 @@ void PermissionRecordManager::ExecuteAllCameraExecuteCallback() this->cameraCallbackMap_.Iterate(it); } -void PermissionRecordManager::ExecuteCameraCallbackAsync(AccessTokenID tokenId, int32_t callbackPid) +void PermissionRecordManager::ExecuteCameraCallbackAsync(AccessTokenID callbackTokenId, int32_t pid) { LOGD(PRI_DOMAIN, PRI_TAG, "Entry."); - auto task = [tokenId, callbackPid, this]() { - uint64_t uniqueId = GetUniqueId(tokenId, callbackPid); + auto task = [callbackTokenId, pid, this]() { LOGI(PRI_DOMAIN, PRI_TAG, "ExecuteCameraCallbackAsync task called."); auto it = [&](uint64_t id, sptr cameraCallback) { + AccessTokenID tokenId = static_cast(id & 0x00000000FFFFFFFF); auto callback = iface_cast(cameraCallback); - int32_t pid = static_cast(id >> 32); - if (((pid == 0) || (uniqueId == id)) && (callback != nullptr)) { + if ((callbackTokenId == tokenId) && (callback != nullptr)) { LOGI(PRI_DOMAIN, PRI_TAG, "CameraCallback tokenId(%{public}u) pid( %{public}d) changeType %{public}d", tokenId, pid, PERM_INACTIVE); callback->StateChangeNotify(tokenId, false); @@ -1398,9 +1395,9 @@ int32_t PermissionRecordManager::StartUsingPermission(const PermissionUsedTypeIn status = PERM_INACTIVE; } #endif - uint64_t id = GetUniqueId(tokenId, -1); + uint64_t id = GetUniqueId(tokenId, info.pid); cameraCallbackMap_.EnsureInsert(id, callback); - int32_t ret = AddRecordToStartList(info, status, callerPid, true); + int32_t ret = AddRecordToStartList(info, status, callerPid); if (ret != RET_SUCCESS) { cameraCallbackMap_.Erase(id); } diff --git a/services/privacymanager/test/unittest/BUILD.gn b/services/privacymanager/test/unittest/BUILD.gn index 6e3e865eb..0e7559375 100644 --- a/services/privacymanager/test/unittest/BUILD.gn +++ b/services/privacymanager/test/unittest/BUILD.gn @@ -160,5 +160,9 @@ if (is_standard_system && ability_base_enable == true) { [ "${access_token_path}/services/common/ability_manager/include" ] sources += [ "client_code_compare_test.cpp" ] } + + if (access_token_camera_float_window_enable) { + cflags_cc += [ "-DCAMERA_FLOAT_WINDOW_ENABLE" ] + } } } diff --git a/services/privacymanager/test/unittest/permission_record_manager_test.cpp b/services/privacymanager/test/unittest/permission_record_manager_test.cpp index c4f13f697..249f1733d 100644 --- a/services/privacymanager/test/unittest/permission_record_manager_test.cpp +++ b/services/privacymanager/test/unittest/permission_record_manager_test.cpp @@ -581,6 +581,7 @@ HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest008, TestSize.Leve ASSERT_EQ(PERM_INACTIVE, callback->type_); } +#ifdef CAMERA_FRAMEWORK_ENABLE /* * @tc.name: StartUsingPermissionTest009 * @tc.desc: Test multiple process start using permission @@ -589,6 +590,10 @@ HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest008, TestSize.Leve */ HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest009, TestSize.Level0) { + auto cameraCallbackMap = PermissionRecordManager::GetInstance().cameraCallbackMap_; // backup + PermissionRecordManager::GetInstance().cameraCallbackMap_.EnsureInsert( + PermissionRecordManager::GetInstance().GetUniqueId(RANDOM_TOKENID, -1), nullptr); + auto callbackPtr1 = std::make_shared(); auto callbackWrap1 = new (std::nothrow) StateChangeCallback(callbackPtr1); ASSERT_NE(nullptr, callbackPtr1); @@ -604,13 +609,41 @@ HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest009, TestSize.Leve AccessTokenID tokenId = tokenIdEx.tokenIdExStruct.tokenID; ASSERT_NE(INVALID_TOKENID, tokenId); std::string permissionName = "ohos.permission.CAMERA"; + PermissionRecordManager::GetInstance().cameraCallbackMap_.EnsureInsert( + PermissionRecordManager::GetInstance().GetUniqueId(tokenId, -1), nullptr); ASSERT_EQ(RET_SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission( MakeInfo(tokenId, TEST_PID_1, permissionName), callbackWrap1->AsObject(), CALLER_PID)); - ASSERT_EQ(PrivacyError::ERR_PERMISSION_ALREADY_START_USING, - PermissionRecordManager::GetInstance().StartUsingPermission(MakeInfo(tokenId, TEST_PID_2, permissionName), - callbackWrap2->AsObject(), CALLER_PID)); + ASSERT_EQ(RET_SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission( + MakeInfo(tokenId, TEST_PID_2, permissionName), callbackWrap2->AsObject(), CALLER_PID)); + +#ifdef CAMERA_FLOAT_WINDOW_ENABLE + AppStateData appStateData; + appStateData.accessTokenId = tokenId; + appStateData.state = static_cast(ApplicationState::APP_STATE_FOREGROUND); + appStateData.pid = TEST_PID_1; + appStateObserver_->OnAppStateChanged(appStateData); + appStateData.pid = TEST_PID_2; + appStateObserver_->OnAppStateChanged(appStateData); + + appStateData.state = static_cast(ApplicationState::APP_STATE_BACKGROUND); + appStateData.pid = TEST_PID_1; + appStateObserver_->OnAppStateChanged(appStateData); + usleep(500000); // 500000us = 0.5s + ASSERT_FALSE(callbackPtr1->isShow_); + ASSERT_FALSE(callbackPtr2->isShow_); + + callbackPtr1->isShow_ = true; + callbackPtr2->isShow_ = true; + appStateData.pid = TEST_PID_2; + appStateObserver_->OnAppStateChanged(appStateData); + usleep(500000); // 500000us = 0.5s + ASSERT_FALSE(callbackPtr1->isShow_); + ASSERT_FALSE(callbackPtr2->isShow_); +#endif + PermissionRecordManager::GetInstance().cameraCallbackMap_ = cameraCallbackMap; // recovery } +#endif /* * @tc.name: StartUsingPermissionTest010 -- Gitee