From 85c121d72fc1ef5cf1c8002ccbaf74e334753c7f Mon Sep 17 00:00:00 2001 From: GengYinzong Date: Mon, 14 Oct 2024 23:56:00 -0700 Subject: [PATCH] fix Signed-off-by: GengYinzong --- .../unittest/src/sandbox_manager_kit_test.cpp | 52 +++++++++++++++++++ .../cpp/include/service/policy_info_manager.h | 7 +++ .../cpp/src/service/policy_info_manager.cpp | 22 +++++++- 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/interfaces/innerkits/sandbox_manager/test/unittest/src/sandbox_manager_kit_test.cpp b/interfaces/innerkits/sandbox_manager/test/unittest/src/sandbox_manager_kit_test.cpp index 0f883d4..0a74273 100644 --- a/interfaces/innerkits/sandbox_manager/test/unittest/src/sandbox_manager_kit_test.cpp +++ b/interfaces/innerkits/sandbox_manager/test/unittest/src/sandbox_manager_kit_test.cpp @@ -767,6 +767,58 @@ HWTEST_F(SandboxManagerKitTest, PersistPolicy015, TestSize.Level1) EXPECT_EQ(INVALID_PARAMTER, SandboxManagerKit::CheckPolicy(tokenId, policy, flag)); } +#ifdef DEC_ENABLED +/** + * @tc.name: PersistPolicy016 + * @tc.desc: PersistPolicy with permission. + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(SandboxManagerKitTest, PersistPolicy016, TestSize.Level1) +{ + std::vector policy; + std::vector searchPolicy; + uint64_t policyFlag = 1; + uint64_t policySize = 2; // 2 is policy size + std::vector policyResult; + PolicyInfo infoParent1 = { + .path = "/A/B", + .mode = OperateMode::READ_MODE + }; + PolicyInfo infoParent2 = { + .path = "/A/B", + .mode = OperateMode::WRITE_MODE + }; + PolicyInfo searchInfoPolicy = { + .path = "/A/B", + .mode = OperateMode::READ_MODE | OperateMode::WRITE_MODE + }; + policy.emplace_back(infoParent1); + policy.emplace_back(infoParent2); + searchPolicy.emplace_back(searchInfoPolicy); + ASSERT_EQ(SANDBOX_MANAGER_OK, SandboxManagerKit::SetPolicy(g_mockToken, policy, policyFlag, policyResult)); + ASSERT_EQ(policySize, policyResult.size()); + EXPECT_EQ(OPERATE_SUCCESSFULLY, policyResult[0]); + EXPECT_EQ(OPERATE_SUCCESSFULLY, policyResult[1]); + + std::vector result; + ASSERT_EQ(SANDBOX_MANAGER_OK, SandboxManagerKit::CheckPolicy(g_mockToken, policy, result)); + ASSERT_EQ(policySize, result.size()); + EXPECT_TRUE(result[0]); + EXPECT_TRUE(result[1]); + + ASSERT_EQ(SANDBOX_MANAGER_OK, SandboxManagerKit::PersistPolicy(policy, policyResult)); + ASSERT_EQ(policySize, policyResult.size()); + EXPECT_EQ(OPERATE_SUCCESSFULLY, policyResult[0]); + EXPECT_EQ(OPERATE_SUCCESSFULLY, policyResult[1]); + + std::vector checkResult1; + ASSERT_EQ(SANDBOX_MANAGER_OK, SandboxManagerKit::CheckPersistPolicy(g_mockToken, searchPolicy, checkResult1)); + ASSERT_EQ(1, checkResult1.size()); + EXPECT_EQ(true, checkResult1[0]); +} +#endif + #ifdef DEC_ENABLED /** * @tc.name: CheckPolicyTest001 diff --git a/services/sandbox_manager/main/cpp/include/service/policy_info_manager.h b/services/sandbox_manager/main/cpp/include/service/policy_info_manager.h index 673e37e..80d293e 100644 --- a/services/sandbox_manager/main/cpp/include/service/policy_info_manager.h +++ b/services/sandbox_manager/main/cpp/include/service/policy_info_manager.h @@ -56,6 +56,13 @@ public: * @return SANDBOX_MANAGER_DB_ERR / SANDBOX_MANAGER_OK */ int32_t MatchPolicy(const uint32_t tokenId, const std::vector &policy, std::vector &result); + /** + * @brief The mode of the same path policy performs or operations + * @param GenericValues vector + * @param dbResults size + */ + void RepeatsPathPolicyModeCal(std::vector &dbResults, + uint64_t dbResultsSize); /** * @brief Match one policy of a certain tokenId * @param tokenId token id of the object diff --git a/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp b/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp index 5eb55a7..09652c0 100644 --- a/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp +++ b/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp @@ -234,6 +234,25 @@ int32_t PolicyInfoManager::AddToDatabaseIfNotDuplicate(const uint32_t tokenId, c return SANDBOX_MANAGER_OK; } +void PolicyInfoManager::RepeatsPathPolicyModeCal(std::vector &dbResults, uint64_t dbResultsSize) +{ + std::map dbResultsMap; + for (size_t i = 0; i < dbResultsSize; ++i) { + std::string currPath = dbResults[i].GetString(PolicyFiledConst::FIELD_PATH); + int64_t currMode = static_cast(dbResults[i].GetInt(PolicyFiledConst::FIELD_MODE)); + if (dbResultsMap.find(currPath) != dbResultsMap.end()) { + dbResultsMap[currPath] |= currMode; + } else { + dbResultsMap.insert(std::make_pair(currPath, currMode)); + } + } + for (size_t i = 0; i < dbResultsSize; ++i) { + std::string polisyPath = dbResults[i].GetString(PolicyFiledConst::FIELD_PATH); + dbResults[i].Remove(PolicyFiledConst::FIELD_MODE); + dbResults[i].Put(PolicyFiledConst::FIELD_MODE, dbResultsMap[polisyPath]); + } +} + int32_t PolicyInfoManager::MatchSinglePolicy(const uint32_t tokenId, const PolicyInfo &policy, uint32_t &result) { int32_t checkPolicyRet = CheckPolicyValidity(policy); @@ -266,12 +285,13 @@ int32_t PolicyInfoManager::MatchSinglePolicy(const uint32_t tokenId, const Polic result = POLICY_HAS_NOT_BEEN_PERSISTED; return SANDBOX_MANAGER_OK; } + RepeatsPathPolicyModeCal(dbResults, dbResultsSize); for (size_t i = 0; i < dbResultsSize; ++i) { PolicyInfo referPolicy; referPolicy.path = dbResults[i].GetString(PolicyFiledConst::FIELD_PATH); referPolicy.mode = static_cast(dbResults[i].GetInt(PolicyFiledConst::FIELD_MODE)); uint64_t referDepth = static_cast(dbResults[i].GetInt(PolicyFiledConst::FIELD_DEPTH)); - + PolicyInfo searchPolicy; searchPolicy.mode = policy.mode; searchPolicy.path = AdjustPath(policy.path); -- Gitee