diff --git a/interfaces/innerkits/privacy/src/privacy_manager_client.cpp b/interfaces/innerkits/privacy/src/privacy_manager_client.cpp index cc196ab00768c73b8e15189e5fd0b5530c5be4f5..3467c65d155d8257b20e7aaa910a610e1c1da20a 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 a3b23b5efc2729a509b275da261f148d7a460e5b..6fa6f389e00986bf3270f9778ce211621e13397f 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 e4b74f2e79fb8267c7af4bbd891990b0d205a0b8..d51eceea01a2806dd31e70b8a088dcabfda71d08 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 ea42a01544c91ce3f390be114b2a34180410719c..9838e84848d8941ba4dfaacfc04d3980683d8fcf 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 f2d213e5f1ba9eabf4d15d35542a76d0f2275813..ea0154d63d35680b390121a27bfbc8174ec1b724 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 b5f0904747c4a597dbfcce370f598365a03a85be..73e8f6eeedc9bd900737972afacad4ceb0a0964e 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 6e3e865eb62b4bb90581f504fda6f8e73962847c..0e75593751bd6caa65768645184d739da1504175 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 c4f13f697f8d6d6c081916cf9664de4612b7ae02..249f1733dc2db07b272537787eab10d65c2846c1 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