From 34bdbe4a6ba7ea81eb6878ca76f817fab6879924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E?= Date: Thu, 3 Apr 2025 09:56:51 +0800 Subject: [PATCH] 5.0.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子李 --- .../udmf/preprocess/preprocess_utils.cpp | 92 +++++++++++++++++++ .../udmf/preprocess/preprocess_utils.h | 5 + .../service/udmf/udmf_service_impl.cpp | 10 +- .../service/udmf/udmf_service_impl.h | 2 +- 4 files changed, 103 insertions(+), 6 deletions(-) diff --git a/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.cpp b/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.cpp index 4ce5d1755..f25965c64 100644 --- a/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.cpp +++ b/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.cpp @@ -42,6 +42,9 @@ static constexpr int MAXIMUM = 121; constexpr char SPECIAL = '^'; constexpr const char *FILE_SCHEME = "file"; constexpr const char *TAG = "PreProcessUtils::"; +constexpr const char *FILE_SCHEME_PREFIX = "file://"; +constexpr const char *DOCS_LOCAL_TAG = "/docs/"; +static constexpr uint32_t DOCS_LOCAL_PATH_SUBSTR_START_INDEX = 1; static constexpr uint32_t VERIFY_URI_PERMISSION_MAX_SIZE = 500; using namespace OHOS::DistributedDataDfx; using namespace Security::AccessToken; @@ -202,6 +205,7 @@ int32_t PreProcessUtils::SetRemoteUri(uint32_t tokenId, UnifiedData &data) uris.push_back(oriUri); return true; }); + GetHtmlFileUris(tokenId, data, true, uris); if (!uris.empty()) { ZLOGI("Read to check uri authorization"); if (!CheckUriAuthorization(uris, tokenId)) { @@ -248,6 +252,18 @@ int32_t PreProcessUtils::GetDfsUrisFromLocal(const std::vector &uri } return true; }); + for (auto &record : data.GetRecords()) { + if (record == nullptr) { + continue; + } + record->ComputeUris([&dfsUris] (UriInfo &uriInfo) { + auto iter = dfsUris.find(uriInfo.authUri); + if (iter != dfsUris.end()) { + uriInfo.dfsUri = (iter->second).uriStr; + } + return true; + }); + } RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__), BizScene::SET_DATA, SetDataStage::GERERATE_DFS_URI, StageRes::SUCCESS, BizState::DFX_END); return E_OK; @@ -315,5 +331,81 @@ void PreProcessUtils::ProcessFileType(std::vector } } } + +void PreProcessUtils::ProcessRecord(std::shared_ptr record, uint32_t tokenId, + bool isLocal, std::vector &uris) +{ + record->ComputeUris([&uris, &isLocal, &tokenId] (UriInfo &uriInfo) { + std::string newUriStr = ""; + if (isLocal) { + Uri tmpUri(uriInfo.oriUri); + std::string path = tmpUri.GetPath(); + std::string bundleName; + if (!GetHapBundleNameByToken(tokenId, bundleName)) { + return true; + } + if (path.substr(0, strlen(DOCS_LOCAL_TAG)) == DOCS_LOCAL_TAG) { + newUriStr = FILE_SCHEME_PREFIX; + newUriStr += path.substr(DOCS_LOCAL_PATH_SUBSTR_START_INDEX); + } else { + newUriStr = FILE_SCHEME_PREFIX; + newUriStr += bundleName + path; + } + uriInfo.authUri = newUriStr; + } else { + newUriStr = uriInfo.dfsUri; + } + Uri uri(newUriStr); + if (uri.GetAuthority().empty()) { + return true; + } + std::string scheme = uri.GetScheme(); + std::transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower); + if (scheme != FILE_SCHEME) { + return true; + } + auto iter = std::find(uris.begin(), uris.end(), newUriStr); + if (iter == uris.end()) { + uris.push_back(std::move(newUriStr)); + } + return true; + }); +} + +void PreProcessUtils::GetHtmlFileUris(uint32_t tokenId, UnifiedData &data, + bool isLocal, std::vector &uris) +{ + for (auto &record : data.GetRecords()) { + if (record == nullptr) { + continue; + } + PreProcessUtils::ProcessRecord(record, tokenId, isLocal, uris); + } +} + +void PreProcessUtils::ClearHtmlDfsUris(UnifiedData &data) +{ + for (auto &record : data.GetRecords()) { + if (record == nullptr) { + continue; + } + record->ComputeUris([] (UriInfo &uriInfo) { + uriInfo.dfsUri = ""; + return true; + }); + } +} + +void PreProcessUtils::ProcessHtmlFileUris(uint32_t tokenId, UnifiedData &data, bool isLocal, std::vector &uris) +{ + std::vector strUris; + PreProcessUtils::GetHtmlFileUris(tokenId, data, isLocal, strUris); + for (auto &uri : strUris) { + uris.emplace_back(Uri(uri)); + } + if (isLocal) { + PreProcessUtils::ClearHtmlDfsUris(data); + } +} } // namespace UDMF } // namespace OHOS \ No newline at end of file diff --git a/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.h b/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.h index 9d3770b65..d49c0de5c 100644 --- a/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.h +++ b/services/distributeddataservice/service/udmf/preprocess/preprocess_utils.h @@ -40,6 +40,11 @@ public: static bool IsNetworkingEnabled(); static void ProcessFileType(std::vector> records, std::function)> callback); + static void GetHtmlFileUris(uint32_t tokenId, UnifiedData &data, bool isLocal, std::vector &uris); + static void ClearHtmlDfsUris(UnifiedData &data); + static void ProcessHtmlFileUris(uint32_t tokenId, UnifiedData &data, bool isLocal, std::vector &uris); + static void ProcessRecord(std::shared_ptr record, uint32_t tokenId, + bool isLocal, std::vector &uris); private: static bool CheckUriAuthorization(const std::vector& uris, uint32_t tokenId); static int32_t GetDfsUrisFromLocal(const std::vector &uris, int32_t userId, UnifiedData &data); diff --git a/services/distributeddataservice/service/udmf/udmf_service_impl.cpp b/services/distributeddataservice/service/udmf/udmf_service_impl.cpp index 75da80ecc..18cf8ff94 100644 --- a/services/distributeddataservice/service/udmf/udmf_service_impl.cpp +++ b/services/distributeddataservice/service/udmf/udmf_service_impl.cpp @@ -267,7 +267,7 @@ int32_t UdmfServiceImpl::ProcessUri(const QueryOption &query, UnifiedData &unifi { std::string localDeviceId = PreProcessUtils::GetLocalDeviceId(); std::vector allUri; - int32_t verifyRes = ProcessCrossDeviceData(unifiedData, allUri); + int32_t verifyRes = ProcessCrossDeviceData(query.tokenId, unifiedData, allUri); if (verifyRes != E_OK) { ZLOGE("verify unifieddata fail, key=%{public}s, stauts=%{public}d", query.key.c_str(), verifyRes); return verifyRes; @@ -290,14 +290,13 @@ int32_t UdmfServiceImpl::ProcessUri(const QueryOption &query, UnifiedData &unifi return E_OK; } -int32_t UdmfServiceImpl::ProcessCrossDeviceData(UnifiedData &unifiedData, std::vector &uris) +int32_t UdmfServiceImpl::ProcessCrossDeviceData(uint32_t tokenId, UnifiedData &unifiedData, std::vector &uris) { if (unifiedData.GetRuntime() == nullptr) { ZLOGE("Get runtime empty!"); return E_DB_ERROR; } - std::string localDeviceId = PreProcessUtils::GetLocalDeviceId(); - std::string sourceDeviceId = unifiedData.GetRuntime()->deviceId; + bool isLocal = PreProcessUtils::GetLocalDeviceId() == unifiedData.GetRuntime()->deviceId; auto records = unifiedData.GetRecords(); bool hasError = false; PreProcessUtils::ProcessFileType(records, [&] (std::shared_ptr obj) { @@ -313,7 +312,7 @@ int32_t UdmfServiceImpl::ProcessCrossDeviceData(UnifiedData &unifiedData, std::v Uri uri(oriUri); std::string scheme = uri.GetScheme(); std::transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower); - if (localDeviceId != sourceDeviceId) { + if (!isLocal) { std::string remoteUri; obj->GetValue(REMOTE_URI, remoteUri); if (remoteUri.empty() && scheme == FILE_SCHEME) { @@ -335,6 +334,7 @@ int32_t UdmfServiceImpl::ProcessCrossDeviceData(UnifiedData &unifiedData, std::v uris.push_back(uri); return true; }); + PreProcessUtils::ProcessHtmlFileUris(tokenId, unifiedData, isLocal, uris); return hasError ? E_ERROR : E_OK; } diff --git a/services/distributeddataservice/service/udmf/udmf_service_impl.h b/services/distributeddataservice/service/udmf/udmf_service_impl.h index 4b6096f51..e13dc7f65 100644 --- a/services/distributeddataservice/service/udmf/udmf_service_impl.h +++ b/services/distributeddataservice/service/udmf/udmf_service_impl.h @@ -66,7 +66,7 @@ private: bool VerifyPermission(const std::string &permission, uint32_t callerTokenId); bool HasDatahubPriviledge(const std::string &bundleName); void RegisterAsyncProcessInfo(const std::string &businessUdKey); - int32_t ProcessCrossDeviceData(UnifiedData &unifiedData, std::vector &uris); + int32_t ProcessCrossDeviceData(uint32_t tokenId, UnifiedData &unifiedData, std::vector &uris); class Factory { public: -- Gitee