diff --git a/services/uripermmgr/src/file_permission_manager.cpp b/services/uripermmgr/src/file_permission_manager.cpp index 2dc2d4dbcb42d89882d44927c202d631146a0fd0..3405f1ca2746fcacf3d266d851b721e5840916d3 100644 --- a/services/uripermmgr/src/file_permission_manager.cpp +++ b/services/uripermmgr/src/file_permission_manager.cpp @@ -27,6 +27,8 @@ namespace OHOS { namespace AAFwk { constexpr const uint32_t SANDBOX_MANAGER_OK = 0; const std::string FILE_MANAGER_AUTHORITY = "docs"; +const std::string CURRENTUSER_URI = "file://docs/storage"; +const std::string APPDATA_URI = "file://docs/storage/Users/currentUser/appdata"; const std::string DOWNLOAD_PATH = "/storage/Users/currentUser/Download"; const std::string DESKTOP_PATH = "/storage/Users/currentUser/Desktop"; const std::string DOCUMENTS_PATH = "/storage/Users/currentUser/Documents"; @@ -38,6 +40,19 @@ static bool CheckPermission(uint64_t tokenCaller, const std::string &permission) return PermissionVerification::GetInstance()->VerifyPermissionByTokenId(tokenCaller, permission); } +static bool CheckDocsUriPermission(bool hasFileManagerPermission, bool hsaSandboxManagerPermission, const std::string &uri) +{ + if (hasFileManagerPermission) { + if (uri.find(CURRENTUSER_URI) == 0 && uri.find(APPDATA_URI) != 0) { + return true; + } + } + if (uri.find(APPDATA_URI) == 0 && hsaSandboxManagerPermission) { + return true; + } + return false; +} + static bool CheckFileManagerUriPermission(uint64_t providerTokenId, const std::string &filePath, const std::string &bundleName) @@ -86,21 +101,17 @@ std::vector FilePermissionManager::CheckUriPersistentPermission(std::vecto "CheckUriPersistentPermission call, size of uri is %{public}zu", uriVec.size()); std::vector resultCodes(uriVec.size(), false); pathPolicies.clear(); - if (CheckPermission(callerTokenId, PermissionConstants::PERMISSION_FILE_ACCESS_MANAGER)) { - for (size_t i = 0; i < uriVec.size(); i++) { - resultCodes[i] = true; - PolicyInfo policyInfo = GetPathPolicyInfoFromUri(uriVec[i], flag); - pathPolicies.emplace_back(policyInfo); - } - return resultCodes; - } std::vector resultIndex; std::vector persistPolicys; + bool hasFileManagerPermission = CheckPermission(callerTokenId, PermissionConstants::PERMISSION_FILE_ACCESS_MANAGER); + bool hsaSandboxManagerPermission = CheckPermission(callerTokenId, PermissionConstants::PERMISSION_SANDBOX_ACCESS_MANAGER); for (size_t i = 0; i < uriVec.size(); i++) { PolicyInfo policyInfo = GetPathPolicyInfoFromUri(uriVec[i], flag); pathPolicies.emplace_back(policyInfo); - if (uriVec[i].GetAuthority() == FILE_MANAGER_AUTHORITY && - CheckFileManagerUriPermission(callerTokenId, policyInfo.path, bundleName)) { + if ((uriVec[i].GetAuthority() == FILE_MANAGER_AUTHORITY) && + (CheckFileManagerUriPermission(callerTokenId, policyInfo.path, + bundleName) || + CheckDocsUriPermission(hasFileManagerPermission ,hsaSandboxManagerPermission, uriVec[i].ToString()))) { resultCodes[i] = true; continue; } diff --git a/test/unittest/file_permission_manager_test/file_permission_manager_test.cpp b/test/unittest/file_permission_manager_test/file_permission_manager_test.cpp index 844fbd6510a6adc0a7e33a21b2eed9abe304e264..c54f59da6c19227af9d15863cace2f54c946fd94 100644 --- a/test/unittest/file_permission_manager_test/file_permission_manager_test.cpp +++ b/test/unittest/file_permission_manager_test/file_permission_manager_test.cpp @@ -57,6 +57,37 @@ HWTEST_F(FilePermissionManagerTest, CheckUriPersistentPermission_001, TestSize.L EXPECT_EQ(res, true); } +/* + * Feature: CheckUriPersistentPermission + * Function: CheckUriPersistentPermission + * SubFunction: NA + * FunctionPoints: UPMSUtils CheckUriPersistentPermission + */ +HWTEST_F(FilePermissionManagerTest, CheckUriPersistentPermission_002, TestSize.Level1) +{ + std::vector uriVec; + Uri uri = Uri("file://docs/storage/Users/currentUser/appdata/el2/base/demo"); + Uri uri1 = Uri("file://docs/storage/Users/currentUser/Download"); + Uri uri2 = Uri("file://docs/storage/Users/currentUser"); + Uri uri3 = Uri("file://docs/storage/Users"); + Uri uri4 = Uri("file://docs/storage"); + uriVec.emplace_back(uri); + uriVec.emplace_back(uri1); + uriVec.emplace_back(uri2); + uriVec.emplace_back(uri3); + uriVec.emplace_back(uri4); + uint32_t callerTokenId = 0; + uint32_t flag = 0; + std::vector pathPolicies; + auto ret = FilePermissionManager::CheckUriPersistentPermission(uriVec, callerTokenId, flag, pathPolicies, ""); + bool res = false; + if (!ret.empty()) { + res = true; + } + EXPECT_EQ(res, true); +} + + /* * Feature: GetPathPolicyInfoFromUri * Function: GetPathPolicyInfoFromUri