diff --git a/interfaces/innerkits/privacy/src/privacy_manager_client.cpp b/interfaces/innerkits/privacy/src/privacy_manager_client.cpp index 3467c65d155d8257b20e7aaa910a610e1c1da20a..cc196ab00768c73b8e15189e5fd0b5530c5be4f5 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, pid); + uint64_t id = GetUniqueId(tokenId, -1); int32_t result = CreateStateChangeCbk(id, callback, callbackWrap); if (result != RET_SUCCESS) { return result; diff --git a/interfaces/innerkits/privacy/test/unittest/src/privacy_kit_test.cpp b/interfaces/innerkits/privacy/test/unittest/src/privacy_kit_test.cpp index e863945cd1f93e57771c331bbc033ccaac9b1c09..cacd0b9a6f5c0670366273986920dce3778c6849 100644 --- a/interfaces/innerkits/privacy/test/unittest/src/privacy_kit_test.cpp +++ b/interfaces/innerkits/privacy/test/unittest/src/privacy_kit_test.cpp @@ -54,6 +54,7 @@ static MockHapToken* g_mock = nullptr; static bool g_isMicMute = false; #endif static constexpr uint32_t RANDOM_TOKENID = 123; +static constexpr uint32_t RANDOM_PID = 123; static constexpr int32_t INVALID_PERMISSIONAME_LENGTH = 257; static constexpr int32_t FIRST_INDEX = 0; static constexpr int32_t SECOND_INDEX = 1; @@ -2026,6 +2027,31 @@ HWTEST_F(PrivacyKitTest, StopUsingPermission008, TestSize.Level0) EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PrivacyKit::StopUsingPermission(g_shellToken, permissionName)); } +/** + * @tc.name: StopUsingPermission009 + * @tc.desc: StopUsingPermission test with different pid. + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(PrivacyKitTest, StopUsingPermission009, TestSize.Level0) +{ + auto callbackPtr = std::make_shared(); + ASSERT_EQ(0, PrivacyKit::StartUsingPermission(g_tokenIdE, "ohos.permission.CAMERA", callbackPtr)); + ASSERT_EQ(0, PrivacyKit::StopUsingPermission(g_tokenIdE, "ohos.permission.CAMERA")); + ASSERT_EQ(0, PrivacyKit::StartUsingPermission(g_tokenIdE, "ohos.permission.CAMERA", callbackPtr, RANDOM_PID)); + ASSERT_EQ(0, PrivacyKit::StopUsingPermission(g_tokenIdE, "ohos.permission.CAMERA")); + + ASSERT_EQ(0, PrivacyKit::StartUsingPermission(g_tokenIdE, "ohos.permission.MICROPHONE")); + ASSERT_EQ(0, PrivacyKit::StopUsingPermission(g_tokenIdE, "ohos.permission.MICROPHONE")); + ASSERT_EQ(0, PrivacyKit::StartUsingPermission(g_tokenIdE, "ohos.permission.MICROPHONE", RANDOM_PID)); + ASSERT_EQ(0, PrivacyKit::StopUsingPermission(g_tokenIdE, "ohos.permission.MICROPHONE", RANDOM_PID)); + + ASSERT_EQ(0, PrivacyKit::StartUsingPermission(g_tokenIdE, "ohos.permission.CAMERA")); + ASSERT_EQ(0, PrivacyKit::StopUsingPermission(g_tokenIdE, "ohos.permission.CAMERA")); + ASSERT_EQ(0, PrivacyKit::StartUsingPermission(g_tokenIdE, "ohos.permission.CAMERA", RANDOM_PID)); + ASSERT_EQ(0, PrivacyKit::StopUsingPermission(g_tokenIdE, "ohos.permission.CAMERA", RANDOM_PID)); +} + class TestCallBack1 : public StateChangeCallbackStub { public: TestCallBack1() = default; diff --git a/services/privacymanager/include/record/permission_record_manager.h b/services/privacymanager/include/record/permission_record_manager.h index 2398c1e488c086e2a70ab39251e920cc5310cab2..f2d213e5f1ba9eabf4d15d35542a76d0f2275813 100644 --- a/services/privacymanager/include/record/permission_record_manager.h +++ b/services/privacymanager/include/record/permission_record_manager.h @@ -160,7 +160,8 @@ 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); + int32_t AddRecordToStartList(const PermissionUsedTypeInfo& info, int32_t status, int32_t callerPid, + bool isCamera = false); void PermListToString(const std::vector& permList); bool GetGlobalSwitchStatus(const std::string& permissionName); diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index 7b164fd8698259290668b1bd632cab8eecdab979..c1e0f3ef241ef00b4285511c95b2b69c61cb2045 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -950,7 +950,7 @@ int32_t PermissionRecordManager::DeletePermissionRecord(int32_t days) } int32_t PermissionRecordManager::AddRecordToStartList( - const PermissionUsedTypeInfo &info, int32_t status, int32_t callerPid) + const PermissionUsedTypeInfo &info, int32_t status, int32_t callerPid, bool isCamera) { int32_t opCode; int ret = Constant::SUCCESS; @@ -964,7 +964,7 @@ int32_t PermissionRecordManager::AddRecordToStartList( .tokenId = info.tokenId, .opCode = opCode, .status = status, - .pid = info.pid, + .pid = (isCamera ? -1 : info.pid), .callerPid = callerPid, }; @@ -977,9 +977,9 @@ int32_t PermissionRecordManager::AddRecordToStartList( } if (ret != PrivacyError::ERR_PERMISSION_ALREADY_START_USING) { startRecordList_.emplace(newRecord); + newRecord.pid = info.pid; + CallbackExecute(newRecord, permissionName, info.type); } - - CallbackExecute(newRecord, permissionName, info.type); return ret; } @@ -1391,9 +1391,9 @@ int32_t PermissionRecordManager::StartUsingPermission(const PermissionUsedTypeIn status = PERM_INACTIVE; } #endif - uint64_t id = GetUniqueId(tokenId, info.pid); + uint64_t id = GetUniqueId(tokenId, -1); cameraCallbackMap_.EnsureInsert(id, callback); - int32_t ret = AddRecordToStartList(info, status, callerPid); + int32_t ret = AddRecordToStartList(info, status, callerPid, true); if (ret != RET_SUCCESS) { cameraCallbackMap_.Erase(id); } diff --git a/services/privacymanager/test/unittest/permission_record_manager_test.cpp b/services/privacymanager/test/unittest/permission_record_manager_test.cpp index 8850dd1159d9e946e571852ab493afed3410715e..0044434d087bd44c8347053447b17d75ad2df926 100644 --- a/services/privacymanager/test/unittest/permission_record_manager_test.cpp +++ b/services/privacymanager/test/unittest/permission_record_manager_test.cpp @@ -606,8 +606,9 @@ HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest009, TestSize.Leve ASSERT_EQ(RET_SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission( MakeInfo(tokenId, TEST_PID_1, permissionName), callbackWrap1->AsObject(), CALLER_PID)); - ASSERT_EQ(RET_SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission( - MakeInfo(tokenId, TEST_PID_2, permissionName), callbackWrap2->AsObject(), CALLER_PID)); + ASSERT_EQ(PrivacyError::ERR_PERMISSION_ALREADY_START_USING, + PermissionRecordManager::GetInstance().StartUsingPermission(MakeInfo(tokenId, TEST_PID_2, permissionName), + callbackWrap2->AsObject(), CALLER_PID)); } /*