diff --git a/interfaces/innerkits/native/file_uri/src/file_uri.cpp b/interfaces/innerkits/native/file_uri/src/file_uri.cpp index 4fc002fadae0b552e5a9a7626811cd856abf09b5..7ca75af4fcc3365af5e44428cff825fe32b2f182 100644 --- a/interfaces/innerkits/native/file_uri/src/file_uri.cpp +++ b/interfaces/innerkits/native/file_uri/src/file_uri.cpp @@ -41,6 +41,8 @@ const std::string MEDIA_AUTHORITY = "media"; const std::string NETWORK_PARA = "?networkid="; const std::string BACKFLASH = "/"; const std::string FULL_MOUNT_ENABLE_PARAMETER = "const.filemanager.full_mount.enable"; +const int DECODE_FORMAT_NUM = 16; +const int DECODE_LEN = 2; std::string BUNDLE_NAME = ""; std::mutex g_globalMutex; static bool CheckFileManagerFullMountEnable() @@ -70,6 +72,28 @@ string FileUri::GetName() return sandboxPath.substr(posLast + 1); } +static string DecodeBySA(const string &uri) +{ + std::string outPutStr; + size_t index = 0; + while (index < uri.length()) { + if (uri[index] == '%') { + std::string inputStr(uri.substr(index + 1, DECODE_LEN)); + auto ret = strtol(inputStr.c_str(), nullptr, DECODE_FORMAT_NUM); + if (ret == 0 || errno != 0) { + LOGE("strtol Failed! ret: %{public}lu, %{public}d", ret, errno); + return ""; + } + outPutStr += static_cast(ret); + index += DECODE_LEN + 1; + } else { + outPutStr += uri[index]; + index++; + } + } + return outPutStr; +} + string FileUri::GetPath() { string sandboxPath = SandboxHelper::Decode(uri_.GetPath()); @@ -117,7 +141,10 @@ string FileUri::GetRealPath() string FileUri::GetRealPathBySA(const std::string &targetBundleName) { - string sandboxPath = SandboxHelper::Decode(uri_.GetPath()); + string sandboxPath = DecodeBySA(uri_.GetPath()); + if (sandboxPath.empty()) { + return ""; + } string realPath = sandboxPath; string bundleName = uri_.GetAuthority(); if (bundleName == FILE_MANAGER_AUTHORITY && diff --git a/test/unittest/file_uri_native/file_uri_test.cpp b/test/unittest/file_uri_native/file_uri_test.cpp index d52248fd4da307c7a765a2a9420b8317f0e90df6..bb5fce798f4e058cb0bb06d68f8663a562c9e32d 100644 --- a/test/unittest/file_uri_native/file_uri_test.cpp +++ b/test/unittest/file_uri_native/file_uri_test.cpp @@ -272,6 +272,79 @@ namespace OHOS::AppFileService::ModuleFileUri { EXPECT_EQ(fileUri.GetRealPath(), fileStr); GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPath_0005"; } + + /** + * @tc.name: File_uri_GetPathBySA_0001 + * @tc.desc: Test function of GetPath() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7LW57 + */ + HWTEST_F(FileUriTest, File_uri_GetPathBySA_0001, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0001"; + string fileStr = ""; + string uri = "file://com.example.demoa/data/storage/el2/base%()test.jpg"; + FileUri fileUri(uri); + EXPECT_EQ(fileUri.GetRealPathBySA(), fileStr); + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0001"; + } + + /** + * @tc.name: File_uri_GetPathBySA_0002 + * @tc.desc: Test function of GetPath() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7LW57 + */ + HWTEST_F(FileUriTest, File_uri_GetPathBySA_0002, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0002"; + string fileStr = ""; + string uri = "file://com.example.demoa/data/storage/el2/base/files/%你好test.jpg"; + FileUri fileUri(uri); + EXPECT_EQ(fileUri.GetRealPathBySA(), fileStr); + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0002"; + } + + /** + * @tc.name: File_uri_GetPathBySA_0003 + * @tc.desc: Test function of GetPath() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7LW57 + */ + HWTEST_F(FileUriTest, File_uri_GetPathBySA_0003, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0003"; + string fileStr = ""; + string uri = "file://com.example.demoa/data/storage/el2%/base/files/test.jpg"; + FileUri fileUri(uri); + EXPECT_EQ(fileUri.GetRealPathBySA(), fileStr); + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0003"; + } + + /** + * @tc.name: File_uri_GetPathBySA_0004 + * @tc.desc: Test function of GetPath() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7LW57 + */ + HWTEST_F(FileUriTest, File_uri_GetPathBySA_0004, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0004"; + string fileStr = ""; + string uri = "file://com.example.demoa/data/storage/el2/base%#files/test.jpg"; + FileUri fileUri(uri); + EXPECT_EQ(fileUri.GetRealPathBySA(), fileStr); + GTEST_LOG_(INFO) << "FileUriTest-begin File_uri_GetPathBySA_0004"; + } + /** * @tc.name: file_uri_test_0007 * @tc.desc: Test function of GetFullDirectoryUri() interface for SUCCESS.