diff --git a/interfaces/innerkits/native/file_share/include/file_permission.h b/interfaces/innerkits/native/file_share/include/file_permission.h index b4073028d1d0a6db5076174f232be5a34c7f0d17..db7391cfd55abc049bcc38cefe26aa15837c181d 100644 --- a/interfaces/innerkits/native/file_share/include/file_permission.h +++ b/interfaces/innerkits/native/file_share/include/file_permission.h @@ -102,6 +102,8 @@ private: deque &errorResults, bool checkAccess = true); static vector GetPathPolicyInfoFromUriPolicyInfo(const vector &uriPolicies, vector &errorResults); + static vector GetPathPolicyInfoFromUriPolicyInfo(const vector &uriPolicies, + const std::string &targetBundleName, deque &errorResults); static vector GetSandboxPolicyInfo(const vector &pathPolicies); #endif }; diff --git a/interfaces/innerkits/native/file_share/src/file_permission.cpp b/interfaces/innerkits/native/file_share/src/file_permission.cpp index 790e6d5ef9ce6eb1817087cf471b92c30d1979e8..cfc4945a2ce45f3ceebf664e813dface0eed69ab 100644 --- a/interfaces/innerkits/native/file_share/src/file_permission.cpp +++ b/interfaces/innerkits/native/file_share/src/file_permission.cpp @@ -218,6 +218,25 @@ vector FilePermission::GetPathPolicyInfoFromUriPolicyInfo(const vect return pathPolicies; } +vector FilePermission::GetPathPolicyInfoFromUriPolicyInfo(const vector &uriPolicies, + const std::string &targetBundleName, deque &errorResults) +{ + vector pathPolicies; + for (const auto &uriPolicy : uriPolicies) { + AppFileService::ModuleFileUri::FileUri fileuri(uriPolicy.uri); + string path = fileuri.GetRealPathBySA(targetBundleName); + if (!CheckValidUri(uriPolicy.uri, path, false, "")) { + LOGE("Not correct uri!"); + PolicyErrorResult result = {uriPolicy.uri, PolicyErrorCode::INVALID_PATH, INVALID_PATH_MESSAGE}; + errorResults.emplace_back(result); + } else { + PolicyInfo policyInfo = {path, uriPolicy.mode}; + pathPolicies.emplace_back(policyInfo); + } + } + return pathPolicies; +} + vector FilePermission::GetSandboxPolicyInfo(const vector &pathPolicies) { vector policies; @@ -342,7 +361,7 @@ int32_t FilePermission::GrantPermission(const vector &uriPolicies LOGE("The number of result codes exceeds the maximum"); return EPERM; } - vector pathPolicies = GetPathPolicyInfoFromUriPolicyInfo(uriPolicies, errorResults, false); + vector pathPolicies = GetPathPolicyInfoFromUriPolicyInfo(uriPolicies, bundleName, errorResults); if (pathPolicies.size() == 0) { return EPERM; } diff --git a/test/unittest/file_permission_native/src/file_permission_test.cpp b/test/unittest/file_permission_native/src/file_permission_test.cpp index f9f7de2189804cc467b0b7f5e2e4b4f02e82f75c..3be41f5a9fdcbe57026e98711963538377c6fcfe 100644 --- a/test/unittest/file_permission_native/src/file_permission_test.cpp +++ b/test/unittest/file_permission_native/src/file_permission_test.cpp @@ -560,6 +560,58 @@ HWTEST_F(FilePermissionTest, GetPathPolicyInfoFromUriPolicyInfo_test_0001, testi GTEST_LOG_(INFO) << "FileShareTest-end GetPathPolicyInfoFromUriPolicyInfo_test_0001"; } +/** + * @tc.name: GetPathPolicyInfoFromUriPolicyInfo_test_0002 + * @tc.desc: Test function of GetPathPolicyInfoFromUriPolicyInfo() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(FilePermissionTest, GetPathPolicyInfoFromUriPolicyInfo_test_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileShareTest-begin GetPathPolicyInfoFromUriPolicyInfo_test_0002"; + + std::string targetBundleName1 = "com.example.myapplicationtest"; + std::string targetBundleName2 = "com.grantpermission.myapplication"; + UriPolicyInfo infoA = {.uri = "file://com.grantpermission.myapplication/data/storage/el2/cloud/457475.txt"}; + UriPolicyInfo infoB = {.uri = "file://docs/storage/Users/currentUser/Documents/1.txt"}; + UriPolicyInfo infoC = {.uri = "file://docs/storage/Users/currentUser/appdata/el2/base/" + "com.example.myapplicationtest/files/grs_files/version.txt"}; + UriPolicyInfo infoD = {.uri = "file://com.grantpermission.myapplication/data/storage/el2/cloud/457475.txt"}; + UriPolicyInfo infoE = {.uri = "/"}; + + std::vector uriPolicies; + uriPolicies.emplace_back(infoA); + uriPolicies.emplace_back(infoB); + uriPolicies.emplace_back(infoC); + + deque errorResults; + EXPECT_CALL(*funcMock, access(_, _)).WillRepeatedly(Return(0)); + auto pathPolicies = FilePermission::GetPathPolicyInfoFromUriPolicyInfo(uriPolicies, + targetBundleName1, errorResults); + ASSERT_TRUE(pathPolicies.size() == 3); + EXPECT_EQ(pathPolicies[0].path, "/storage/Users/currentUser/appdata/el2/cloud/" + "com.grantpermission.myapplication/457475.txt"); + EXPECT_EQ(pathPolicies[1].path, "/storage/Users/currentUser/Documents/1.txt"); + EXPECT_EQ(pathPolicies[2].path, "/storage/Users/currentUser/appdata/el2/base/" + "com.example.myapplicationtest/files/grs_files/version.txt"); + + std::vector uriPolicies2; + uriPolicies2.emplace_back(infoD); + pathPolicies = FilePermission::GetPathPolicyInfoFromUriPolicyInfo(uriPolicies2, targetBundleName2, errorResults); + ASSERT_TRUE(pathPolicies.size() == 1); + EXPECT_EQ(pathPolicies[0].path, "/data/storage/el2/cloud/457475.txt"); + + std::vector uriPolicies3; + uriPolicies3.emplace_back(infoE); + pathPolicies = FilePermission::GetPathPolicyInfoFromUriPolicyInfo(uriPolicies3, targetBundleName2, errorResults); + ASSERT_TRUE(errorResults.size() == 1); + EXPECT_EQ(errorResults[0].code, PolicyErrorCode::INVALID_PATH); + + GTEST_LOG_(INFO) << "FileShareTest-end GetPathPolicyInfoFromUriPolicyInfo_test_0002"; +} + /** * @tc.name: ParseErrorResults_test_0001 * @tc.desc: Test function of ParseErrorResults() interface for SUCCESS.