• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "file_access_helper.h"
17 
18 
19 #include <nlohmann/json.hpp>
20 #include "bundle_constants.h"
21 #include "bundle_mgr_proxy.h"
22 #include "file_access_framework_errno.h"
23 #include "file_access_extension_info.h"
24 #include "file_access_service_client.h"
25 #include "hilog_wrapper.h"
26 #include "hitrace_meter.h"
27 #include "user_access_tracer.h"
28 #include "if_system_ability_manager.h"
29 #include "ifile_access_ext_base.h"
30 #include "ipc_skeleton.h"
31 #include "iservice_registry.h"
32 #include "system_ability_definition.h"
33 #include "tokenid_kit.h"
34 #include "n_error.h"
35 #include "uri_ext.h"
36 
37 namespace OHOS {
38 namespace FileAccessFwk {
39 using json = nlohmann::json;
40 namespace {
41     constexpr int COPY_EXCEPTION = -1;
42     constexpr int COPY_NOEXCEPTION = -2;
43     constexpr uint32_t MAX_COPY_ERROR_COUNT = 1000;
44 }
45 
46 sptr<IFileAccessExtBase> g_sourceExtProxy;
47 sptr<IFileAccessExtBase> g_destExtProxy;
48 
49 std::vector<Uri> deviceUris(DEVICE_ROOTS.begin(), DEVICE_ROOTS.end());
50 
GetUserId()51 static int GetUserId()
52 {
53     int uid = IPCSkeleton::GetCallingUid();
54     int userId = uid / AppExecFwk::Constants::BASE_USER_RANGE;
55     return userId;
56 }
57 
GetBundleNameFromPath(const std::string & path,std::string & bundleName)58 static bool GetBundleNameFromPath(const std::string &path, std::string &bundleName)
59 {
60     if (path.size() == 0) {
61         HILOG_ERROR("Uri path error.");
62         return false;
63     }
64 
65     if (path.front() != '/') {
66         HILOG_ERROR("Uri path format error.");
67         return false;
68     }
69 
70     auto tmpPath = path.substr(1);
71     auto index = tmpPath.find_first_of("/");
72     bundleName = tmpPath.substr(0, index);
73     if (bundleName.compare(MEDIA_BNUDLE_NAME_ALIAS) == 0) {
74         bundleName = MEDIA_BNUDLE_NAME;
75         return true;
76     }
77     if (bundleName.compare(EXTERNAL_BNUDLE_NAME_ALIAS) == 0) {
78         bundleName = EXTERNAL_BNUDLE_NAME;
79         return true;
80     }
81     HILOG_INFO("Uri-authority true.");
82     return true;
83 }
84 
CheckUri(Uri & uri)85 static bool CheckUri(Uri &uri)
86 {
87     HILOG_DEBUG("Uri : %{private}s.", uri.ToString().c_str());
88     std::string schemeStr = std::string(uri.GetScheme());
89     if (schemeStr.compare(FILE_SCHEME_NAME) != 0) {
90         HILOG_ERROR("Uri scheme error.");
91         return false;
92     }
93     return true;
94 }
95 
GetBundleMgrProxy()96 sptr<AppExecFwk::IBundleMgr> FileAccessHelper::GetBundleMgrProxy()
97 {
98     sptr<ISystemAbilityManager> systemAbilityManager =
99         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
100     if (!systemAbilityManager) {
101         return nullptr;
102     }
103 
104     sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
105     if (!remoteObject) {
106         return nullptr;
107     }
108 
109     return iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
110 }
111 
FileAccessHelper(const std::shared_ptr<OHOS::AbilityRuntime::Context> & context,const std::unordered_map<std::string,std::shared_ptr<ConnectInfo>> & cMap)112 FileAccessHelper::FileAccessHelper(const std::shared_ptr<OHOS::AbilityRuntime::Context> &context,
113     const std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> &cMap)
114 {
115     if (context != nullptr) {
116         HILOG_INFO("Create FileAccessHelper by context");
117         token_ = context->GetToken();
118         cMap_ = cMap;
119     } else {
120         HILOG_ERROR("Context is null");
121     }
122 }
123 
FileAccessHelper(const sptr<IRemoteObject> & token,const std::unordered_map<std::string,std::shared_ptr<ConnectInfo>> & cMap)124 FileAccessHelper::FileAccessHelper(const sptr<IRemoteObject> &token,
125     const std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> &cMap)
126 {
127     HILOG_INFO("Create FileAccessHelper by token");
128     token_ = token;
129     cMap_ = cMap;
130 }
131 
~FileAccessHelper()132 FileAccessHelper::~FileAccessHelper()
133 {
134     Release();
135 }
136 
GetConnectInfo(const std::string & bundleName)137 std::shared_ptr<ConnectInfo> FileAccessHelper::GetConnectInfo(const std::string &bundleName)
138 {
139     auto iterator = cMap_.find(bundleName);
140     if (iterator != cMap_.end()) {
141         return iterator->second;
142     }
143     HILOG_ERROR("GetConnectInfo called with bundleName return nullptr");
144     return nullptr;
145 }
146 
GetConnectExtensionInfo(Uri & uri)147 std::shared_ptr<ConnectExtensionInfo> FileAccessHelper::GetConnectExtensionInfo(Uri &uri)
148 {
149     std::string scheme = uri.GetScheme();
150     std::string bundleName;
151     if (scheme == FILE_SCHEME_NAME) {
152         std::string path = "/" + uri.GetAuthority() + uri.GetPath();
153         if (!GetBundleNameFromPath(path, bundleName)) {
154             HILOG_ERROR("Get BundleName failed.");
155         }
156     }
157     auto connectInfo = GetConnectInfo(bundleName);
158     if (connectInfo == nullptr) {
159         HILOG_ERROR("Get connectInfo failed.");
160         return nullptr;
161     }
162     std::shared_ptr<ConnectExtensionInfo> connectExtensionInfo =
163         std::make_shared<ConnectExtensionInfo>(connectInfo->want, token_);
164     return connectExtensionInfo;
165 }
166 
IsSystemApp()167 static bool IsSystemApp()
168 {
169     uint64_t accessTokenIDEx = OHOS::IPCSkeleton::GetCallingFullTokenID();
170     return OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIDEx);
171 }
172 
CompareWant(const AAFwk::Want & lhs,const AAFwk::Want & rhs)173 bool FileAccessHelper::CompareWant(const AAFwk::Want& lhs, const AAFwk::Want& rhs)
174 {
175     auto lhsElement = lhs.GetElement();
176     auto rhsElement = rhs.GetElement();
177     return lhsElement.GetBundleName() < rhsElement.GetBundleName()
178         && lhsElement.GetAbilityName() < rhsElement.GetAbilityName();
179 }
180 
IsEffectiveWants(const std::vector<AAFwk::Want> & wants)181 bool FileAccessHelper::IsEffectiveWants(const std::vector<AAFwk::Want> &wants)
182 {
183     std::vector<AAFwk::Want> allWants;
184     if (GetRegisteredFileAccessExtAbilityInfo(allWants) != ERR_OK) {
185         HILOG_ERROR("GetRegisteredFileAccessExtAbilityInfo failed");
186         return false;
187     }
188     std::set<AAFwk::Want, bool(*)(const AAFwk::Want&, const AAFwk::Want&)> allWantSet(FileAccessHelper::CompareWant);
189     allWantSet.insert(allWants.begin(), allWants.end());
190     for (auto iter = wants.begin(); iter != wants.end(); ++iter) {
191         if (allWantSet.count(*iter) == 0) {
192             return false;
193         }
194     }
195     return true;
196 }
197 
DoCreatorHelper(const sptr<IRemoteObject> & token,const std::vector<AAFwk::Want> & wants)198 std::pair<std::shared_ptr<FileAccessHelper>, int> FileAccessHelper::DoCreatorHelper(
199     const sptr<IRemoteObject> &token, const std::vector<AAFwk::Want> &wants)
200 {
201     std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> cMap;
202     for (size_t i = 0; i < wants.size(); i++) {
203         sptr<AppFileAccessExtConnection> fileAccessExtConnection(new(std::nothrow) AppFileAccessExtConnection());
204         if (fileAccessExtConnection == nullptr) {
205             HILOG_ERROR("new fileAccessExtConnection fail");
206             return {nullptr, E_GETRESULT};
207         }
208         if (!fileAccessExtConnection->IsExtAbilityConnected()) {
209             fileAccessExtConnection->ConnectFileExtAbility(wants[i]);
210         }
211         sptr<IFileAccessExtBase> fileExtProxy = fileAccessExtConnection->GetFileExtProxy();
212         if (fileExtProxy == nullptr) {
213             HILOG_ERROR("Creator get invalid fileExtProxy");
214             return {nullptr, E_CONNECT};
215         }
216         std::shared_ptr<ConnectInfo> connectInfo = std::make_shared<ConnectInfo>();
217         if (!connectInfo) {
218             HILOG_ERROR("Creator, connectInfo == nullptr");
219             return {nullptr, E_GETRESULT};
220         }
221         connectInfo->want = wants[i];
222         connectInfo->fileAccessExtConnection = fileAccessExtConnection;
223         std::string bundleName = wants[i].GetElement().GetBundleName();
224         HILOG_INFO("DoCreatorHelper bundleName is %{public}s", bundleName.c_str());
225         cMap.insert(std::pair<std::string, std::shared_ptr<ConnectInfo>>(bundleName, connectInfo));
226     }
227 
228     FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(token, cMap);
229     if (ptrFileAccessHelper == nullptr) {
230         HILOG_ERROR("Creator failed, create FileAccessHelper failed");
231         return {nullptr, E_GETRESULT};
232     }
233 
234     return {std::shared_ptr<FileAccessHelper>(ptrFileAccessHelper), ERR_OK};
235 }
236 
Creator(const std::shared_ptr<OHOS::AbilityRuntime::Context> & context)237 std::pair<std::shared_ptr<FileAccessHelper>, int> FileAccessHelper::Creator(
238     const std::shared_ptr<OHOS::AbilityRuntime::Context> &context)
239 {
240     UserAccessTracer trace;
241     trace.Start("Creator");
242     std::vector<AAFwk::Want> allWants;
243     if (context == nullptr) {
244         HILOG_ERROR("FileAccessHelper::Creator failed, context == nullptr");
245         return {nullptr, EINVAL};
246     }
247     if (!IsSystemApp()) {
248         HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed");
249         return {nullptr, E_PERMISSION_SYS};
250     }
251     if (GetRegisteredFileAccessExtAbilityInfo(allWants) != ERR_OK) {
252         HILOG_ERROR("GetRegisteredFileAccessExtAbilityInfo failed");
253         return {nullptr, E_GETINFO};
254     }
255 
256     return DoCreatorHelper(context->GetToken(), allWants);
257 }
258 
Creator(const std::shared_ptr<OHOS::AbilityRuntime::Context> & context,const std::vector<AAFwk::Want> & wants)259 std::pair<std::shared_ptr<FileAccessHelper>, int> FileAccessHelper::Creator(
260     const std::shared_ptr<OHOS::AbilityRuntime::Context> &context, const std::vector<AAFwk::Want> &wants)
261 {
262     UserAccessTracer trace;
263     trace.Start("Creator");
264     if (context == nullptr) {
265         HILOG_ERROR("FileAccessHelper::Creator failed, context == nullptr");
266         return {nullptr, EINVAL};
267     }
268     if (wants.size() == 0) {
269         HILOG_ERROR("FileAccessHelper::Creator failed, wants is empty");
270         return {nullptr, EINVAL};
271     }
272     if (!IsSystemApp()) {
273         HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed");
274         return {nullptr, E_PERMISSION_SYS};
275     }
276     // 传入的wants信息是否有效
277     if (!IsEffectiveWants(wants)) {
278         HILOG_ERROR("FileAccessHelper::Creator effectiveWants is empty");
279         return {nullptr, EINVAL};
280     }
281 
282     return DoCreatorHelper(context->GetToken(), wants);
283 }
284 
Creator(const sptr<IRemoteObject> & token,const std::vector<AAFwk::Want> & wants)285 std::shared_ptr<FileAccessHelper> FileAccessHelper::Creator(const sptr<IRemoteObject> &token,
286     const std::vector<AAFwk::Want> &wants)
287 {
288     UserAccessTracer trace;
289     trace.Start("Creator");
290     if (token == nullptr) {
291         HILOG_ERROR("FileAccessHelper::Creator failed, token == nullptr");
292         return nullptr;
293     }
294     if (wants.size() == 0) {
295         HILOG_ERROR("FileAccessHelper::Creator failed, wants is empty");
296         return nullptr;
297     }
298     if (!IsSystemApp()) {
299         HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed");
300         return nullptr;
301     }
302     // 传入的wants信息是否有效
303     if (!IsEffectiveWants(wants)) {
304         HILOG_ERROR("FileAccessHelper::Creator wants is not effective");
305         return nullptr;
306     }
307 
308     std::pair<std::shared_ptr<FileAccessHelper>, int> ptrFileAccessHelper = DoCreatorHelper(token, wants);
309     if (ptrFileAccessHelper.second != ERR_OK) {
310         return nullptr;
311     }
312 
313     return ptrFileAccessHelper.first;
314 }
315 
Release()316 bool FileAccessHelper::Release()
317 {
318     for (auto iter = cMap_.begin(); iter != cMap_.end(); iter++) {
319         if (iter->second->fileAccessExtConnection->IsExtAbilityConnected()) {
320             iter->second->fileAccessExtConnection->DisconnectFileExtAbility();
321         }
322     }
323     cMap_.clear();
324     token_ = nullptr;
325     return true;
326 }
327 
GetProxyByUri(Uri & uri)328 sptr<IFileAccessExtBase> FileAccessHelper::GetProxyByUri(Uri &uri)
329 {
330     std::string scheme = uri.GetScheme();
331     std::string bundleName;
332     if (scheme == FILE_SCHEME_NAME) {
333         std::string path = "/" + uri.GetAuthority() + uri.GetPath();
334         if (!GetBundleNameFromPath(path, bundleName)) {
335             HILOG_ERROR("Get BundleName failed.");
336             return nullptr;
337         }
338     }
339 
340     auto fileAccessExtBaseProxy = GetProxyByBundleName(bundleName);
341     return fileAccessExtBaseProxy;
342 }
343 
GetProxyByBundleName(const std::string & bundleName)344 sptr<IFileAccessExtBase> FileAccessHelper::GetProxyByBundleName(const std::string &bundleName)
345 {
346     auto connectInfo = GetConnectInfo(bundleName);
347     HILOG_INFO("GetProxyByBundleName start %{public}s", bundleName.c_str());
348     if (connectInfo == nullptr) {
349         HILOG_ERROR("GetProxyByUri failed with invalid connectInfo");
350         return nullptr;
351     }
352     if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) {
353         connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want);
354     }
355     auto fileAccessExtBaseProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy();
356     if (fileAccessExtBaseProxy == nullptr) {
357         HILOG_ERROR("GetProxyByUri failed with invalid FileAccessExtBaseProxy");
358         return nullptr;
359     }
360     return fileAccessExtBaseProxy;
361 }
362 
GetProxy()363 bool FileAccessHelper::GetProxy()
364 {
365     for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) {
366         auto connectInfo = iter->second;
367         if (connectInfo == nullptr || connectInfo->fileAccessExtConnection == nullptr) {
368             HILOG_ERROR("connectInfo is nullptr");
369             return false;
370         }
371         if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) {
372             connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want);
373         }
374         auto fileAccessExtBaseProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy();
375         if (fileAccessExtBaseProxy == nullptr) {
376             HILOG_ERROR("GetProxy failed with invalid FileAccessExtBaseProxy");
377             return false;
378         }
379     }
380     return true;
381 }
382 
OpenFile(Uri & uri,int flags,int & fd)383 int FileAccessHelper::OpenFile(Uri &uri, int flags, int &fd)
384 {
385     UserAccessTracer trace;
386     trace.Start("OpenFile");
387     if (!IsSystemApp()) {
388         HILOG_ERROR("FileAccessHelper::OpenFile check IsSystemAppByFullTokenID failed");
389         return E_PERMISSION_SYS;
390     }
391 
392     if (!CheckUri(uri)) {
393         HILOG_ERROR("Uri format check error.");
394         return E_URIS;
395     }
396 
397     if (flags != READ && flags != WRITE && flags != WRITE_READ) {
398         HILOG_ERROR("flags type error.");
399         return EINVAL;
400     }
401 
402     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
403     if (fileExtProxy == nullptr) {
404         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
405         return E_IPCS;
406     }
407 
408     Urie uriConvert(uri.ToString());
409     int ret = fileExtProxy->OpenFile(uriConvert, flags, fd);
410     if (ret != ERR_OK) {
411         HILOG_ERROR("OpenFile get result error, code:%{public}d", ret);
412         return ret;
413     }
414 
415     return ERR_OK;
416 }
417 
CreateFile(Uri & parent,const std::string & displayName,Uri & newFile)418 int FileAccessHelper::CreateFile(Uri &parent, const std::string &displayName, Uri &newFile)
419 {
420     UserAccessTracer trace;
421     trace.Start("CreateFile");
422     if (!IsSystemApp()) {
423         HILOG_ERROR("FileAccessHelper::CreateFile check IsSystemAppByFullTokenID failed");
424         return E_PERMISSION_SYS;
425     }
426 
427     if (!CheckUri(parent)) {
428         HILOG_ERROR("Uri format check error.");
429         return E_URIS;
430     }
431 
432     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(parent);
433     if (fileExtProxy == nullptr) {
434         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
435         return E_IPCS;
436     }
437 
438     Urie parentConvert(parent.ToString());
439     Urie newFileConvert("");
440     int ret = fileExtProxy->CreateFile(parentConvert, displayName, newFileConvert);
441     if (ret != ERR_OK) {
442         HILOG_ERROR("CreateFile get result error, code:%{public}d", ret);
443         return ret;
444     }
445     newFile = Uri(newFileConvert.ToString());
446 
447     return ERR_OK;
448 }
449 
Mkdir(Uri & parent,const std::string & displayName,Uri & newDir)450 int FileAccessHelper::Mkdir(Uri &parent, const std::string &displayName, Uri &newDir)
451 {
452     UserAccessTracer trace;
453     trace.Start("Mkdir");
454     if (!IsSystemApp()) {
455         HILOG_ERROR("FileAccessHelper::Mkdir check IsSystemAppByFullTokenID failed");
456         return E_PERMISSION_SYS;
457     }
458 
459     if (!CheckUri(parent)) {
460         HILOG_ERROR("Uri format check error.");
461         return E_URIS;
462     }
463 
464     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(parent);
465     if (fileExtProxy == nullptr) {
466         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
467         return E_IPCS;
468     }
469 
470     Urie parentConvert(parent.ToString());
471     Urie newDirConvert("");
472     int ret = fileExtProxy->Mkdir(parentConvert, displayName, newDirConvert);
473     if (ret != ERR_OK) {
474         HILOG_ERROR("Mkdir get result error, code:%{public}d", ret);
475         return ret;
476     }
477     newDir = Uri(newDirConvert.ToString());
478 
479     return ERR_OK;
480 }
481 
Delete(Uri & selectFile)482 int FileAccessHelper::Delete(Uri &selectFile)
483 {
484     UserAccessTracer trace;
485     trace.Start("Delete");
486     if (!IsSystemApp()) {
487         HILOG_ERROR("FileAccessHelper::Delete check IsSystemAppByFullTokenID failed");
488         return E_PERMISSION_SYS;
489     }
490 
491     if (!CheckUri(selectFile)) {
492         HILOG_ERROR("Uri format check error.");
493         return E_URIS;
494     }
495 
496     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(selectFile);
497     if (fileExtProxy == nullptr) {
498         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
499         return E_IPCS;
500     }
501 
502     Urie selectFileConvert(selectFile.ToString());
503     int ret = fileExtProxy->Delete(selectFileConvert);
504     if (ret != ERR_OK) {
505         HILOG_ERROR("Delete get result error, code:%{public}d", ret);
506         return ret;
507     }
508 
509     return ERR_OK;
510 }
511 
Move(Uri & sourceFile,Uri & targetParent,Uri & newFile)512 int FileAccessHelper::Move(Uri &sourceFile, Uri &targetParent, Uri &newFile)
513 {
514     UserAccessTracer trace;
515     trace.Start("Move");
516     if (!IsSystemApp()) {
517         HILOG_ERROR("FileAccessHelper::Move check IsSystemAppByFullTokenID failed");
518         return E_PERMISSION_SYS;
519     }
520 
521     Uri sourceFileUri(sourceFile.ToString());
522     Uri targetParentUri(targetParent.ToString());
523     if (!CheckUri(sourceFile) || !CheckUri(targetParent)) {
524         HILOG_ERROR("uri format check error.");
525         return E_URIS;
526     }
527 
528     if (sourceFileUri.GetAuthority() != targetParentUri.GetAuthority()) {
529         HILOG_WARN("Operation failed, move not supported");
530         return EPERM;
531     }
532 
533     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
534     if (fileExtProxy == nullptr) {
535         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
536         return E_IPCS;
537     }
538 
539     Urie sourceFileConvert(sourceFile.ToString());
540     Urie targetParentConvert(targetParent.ToString());
541     Urie newFileConvert("");
542     int ret = fileExtProxy->Move(sourceFileConvert, targetParentConvert, newFileConvert);
543     if (ret != ERR_OK) {
544         HILOG_ERROR("Move get result error, code:%{public}d", ret);
545         return ret;
546     }
547     newFile = Uri(newFileConvert.ToString());
548 
549     return ERR_OK;
550 }
551 
IsDirectory(Uri & uri,bool & isDir)552 int FileAccessHelper::IsDirectory(Uri &uri, bool &isDir)
553 {
554     sptr<IFileAccessExtBase> proxy = FileAccessHelper::GetProxyByUri(uri);
555     if (proxy == nullptr) {
556         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
557         return E_IPCS;
558     }
559 
560     FileInfo fileInfo;
561     Urie uriConvert(uri.ToString());
562     int ret = proxy->GetFileInfoFromUri(uriConvert, fileInfo);
563     if (ret != ERR_OK) {
564         HILOG_ERROR("get FileInfo from uri error, code:%{public}d", ret);
565         return ret;
566     }
567 
568     isDir = fileInfo.mode >= 0 && (static_cast<uint32_t>(fileInfo.mode) & DOCUMENT_FLAG_REPRESENTS_DIR) != 0;
569 
570     return ret;
571 }
572 
TranslateResult(int errCode,Result & result)573 static int TranslateResult(int errCode, Result &result)
574 {
575     if (errCode == COPY_EXCEPTION || errCode == ERR_OK) {
576         return errCode;
577     }
578 
579     int ret = ERR_OK;
580     switch (errCode) {
581         case E_IPCS:
582         case E_URIS:
583         case ERR_NOMEM:
584         case E_PERMISSION_SYS:
585         case ERR_PERM: {
586             HILOG_ERROR("Operate exception, terminate");
587             ret = COPY_EXCEPTION;
588             break;
589         }
590         default: {
591             HILOG_ERROR("Operate exception, continue");
592             ret = COPY_NOEXCEPTION;
593             break;
594         }
595     }
596     if (OHOS::FileManagement::LibN::errCodeTable.find(errCode) !=
597         OHOS::FileManagement::LibN::errCodeTable.end()) {
598         result.errCode = OHOS::FileManagement::LibN::errCodeTable.at(errCode).first;
599         result.errMsg = OHOS::FileManagement::LibN::errCodeTable.at(errCode).second;
600     }
601     return ret;
602 }
603 
GetResult(const std::string & sourceUri,const std::string & destUri,int errCode,const std::string & errMsg,std::vector<Result> & result)604 static int GetResult(const std::string &sourceUri, const std::string &destUri, int errCode,
605     const std::string &errMsg, std::vector<Result> &result)
606 {
607     Result tmpResult { sourceUri, destUri, errCode, errMsg };
608     int ret = TranslateResult(errCode, tmpResult);
609     result.clear();
610     result.push_back(tmpResult);
611     return ret;
612 }
613 
CopyOperation(Uri & sourceUri,Uri & destUri,std::vector<Result> & copyResult,bool force)614 int FileAccessHelper::CopyOperation(Uri &sourceUri, Uri &destUri, std::vector<Result> &copyResult, bool force)
615 {
616     UserAccessTracer trace;
617     trace.Start("CopyOperation");
618     int ret = COPY_EXCEPTION;
619     sptr<IFileAccessExtBase> proxy = GetProxyByUri(sourceUri);
620     if (proxy == nullptr) {
621         HILOG_ERROR("Failed with invalid FileAccessExtBaseProxy");
622         Result result;
623         ret = TranslateResult(E_IPCS, result);
624         copyResult.push_back(result);
625         return ret;
626     }
627 
628     Urie sourceUriConvert(sourceUri.ToString());
629     Urie destUriConvert(destUri.ToString());
630     copyResult.clear();
631     int retCode;
632     ret = proxy->Copy(sourceUriConvert, destUriConvert, copyResult, retCode, force);
633     if (ret == ERR_OK) {
634         ret = retCode;
635     }
636     if (copyResult.size() > MAX_COPY_ERROR_COUNT) {
637         HILOG_ERROR("Copy operation failed, count value greater than max count");
638         Result result { "", "", E_COUNT, "Count value greater than max count"};
639         copyResult.clear();
640         copyResult.push_back(result);
641         ret = COPY_EXCEPTION;
642     }
643     if (ret != ERR_OK) {
644         if ((ret == COPY_EXCEPTION) || (ret == COPY_NOEXCEPTION)) {
645             HILOG_ERROR("Copy exception, code:%{public}d", ret);
646             return ret;
647         }
648         HILOG_ERROR("Copy error, code:%{public}d", ret);
649         Result result { "", "", ret, "" };
650         ret = TranslateResult(ret, result);
651         copyResult.push_back(result);
652         return ret;
653     }
654     return ret;
655 }
656 
CopyFileOperation(Uri & sourceUri,Uri & destUri,const std::string & fileName,Uri & newFileUri)657 int FileAccessHelper::CopyFileOperation(Uri &sourceUri, Uri &destUri, const std::string &fileName, Uri &newFileUri)
658 {
659     UserAccessTracer trace;
660     trace.Start("CopyFileOperation");
661     sptr<IFileAccessExtBase> proxy = GetProxyByUri(sourceUri);
662     if (proxy == nullptr) {
663         HILOG_ERROR("Failed with invalid FileAccessExtBaseProxy");
664         return E_IPCS;
665     }
666 
667     Urie sourceUriConvert(sourceUri.ToString());
668     Urie destUriConvert(destUri.ToString());
669     Urie newFileUriConvert("");
670     int ret = proxy->CopyFile(sourceUriConvert, destUriConvert, fileName, newFileUriConvert);
671     if (ret != ERR_OK) {
672         HILOG_ERROR("Copy file error, code:%{public}d", ret);
673         return ret;
674     }
675     newFileUri = Uri(newFileUriConvert.ToString());
676     return ret;
677 }
678 
Copy(Uri & sourceUri,Uri & destUri,std::vector<Result> & copyResult,bool force)679 int FileAccessHelper::Copy(Uri &sourceUri, Uri &destUri, std::vector<Result> &copyResult, bool force)
680 {
681     UserAccessTracer trace;
682     trace.Start("Copy");
683     if (!IsSystemApp()) {
684         HILOG_ERROR("Copy check IsSystemAppByFullTokenID failed");
685         return GetResult("", "", E_PERMISSION_SYS, "", copyResult);
686     }
687 
688     if (!CheckUri(sourceUri) || !CheckUri(destUri)) {
689         HILOG_ERROR("Uri format check error");
690         return GetResult("", "", E_URIS, "", copyResult);
691     }
692 
693     bool isDir = false;
694     int ret = IsDirectory(destUri, isDir);
695     if (ret != ERR_OK) {
696         HILOG_ERROR("Get uri type error");
697         GetResult("", "", ret, "", copyResult);
698         return COPY_EXCEPTION;
699     }
700     if (!isDir) {
701         HILOG_ERROR("Destination uri is not directory");
702         return GetResult("", "", E_URIS, "", copyResult);
703     }
704 
705     ret = CopyOperation(sourceUri, destUri, copyResult, force);
706     return ret;
707 }
708 
CopyFile(Uri & sourceUri,Uri & destUri,const std::string & fileName,Uri & newFileUri)709 int FileAccessHelper::CopyFile(Uri &sourceUri, Uri &destUri, const std::string &fileName, Uri &newFileUri)
710 {
711     UserAccessTracer trace;
712     trace.Start("CopyFile");
713     if (!IsSystemApp()) {
714         HILOG_ERROR("Copy check IsSystemAppByFullTokenID failed");
715         return E_PERMISSION_SYS;
716     }
717 
718     if (!CheckUri(sourceUri) || !CheckUri(destUri)) {
719         HILOG_ERROR("Uri format check error");
720         return E_URIS;
721     }
722 
723     bool isDir = false;
724     int ret = IsDirectory(destUri, isDir);
725     if (ret != ERR_OK) {
726         HILOG_ERROR("Get uri type error");
727         return E_GETRESULT;
728     }
729     if (!isDir) {
730         HILOG_ERROR("Destination uri is not directory");
731         return E_URIS;
732     }
733     ret = CopyFileOperation(sourceUri, destUri, fileName, newFileUri);
734     return ret;
735 }
736 
Rename(Uri & sourceFile,const std::string & displayName,Uri & newFile)737 int FileAccessHelper::Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile)
738 {
739     UserAccessTracer trace;
740     trace.Start("Rename");
741     if (!IsSystemApp()) {
742         HILOG_ERROR("FileAccessHelper::Rename check IsSystemAppByFullTokenID failed");
743         return E_PERMISSION_SYS;
744     }
745 
746     if (!CheckUri(sourceFile)) {
747         HILOG_ERROR("sourceFile format check error.");
748         return E_URIS;
749     }
750 
751     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
752     if (fileExtProxy == nullptr) {
753         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
754         return E_IPCS;
755     }
756 
757     Urie sourceFileConvert(sourceFile.ToString());
758     Urie newFileConvert("");
759     int ret = fileExtProxy->Rename(sourceFileConvert, displayName, newFileConvert);
760     if (ret != ERR_OK) {
761         HILOG_ERROR("Rename get result error, code:%{public}d", ret);
762         return ret;
763     }
764     newFile = Uri(newFileConvert.ToString());
765 
766     return ERR_OK;
767 }
768 
ListFile(const FileInfo & fileInfo,const int64_t offset,const FileFilter & filter,SharedMemoryInfo & memInfo)769 int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter,
770     SharedMemoryInfo &memInfo)
771 {
772     UserAccessTracer trace;
773     trace.Start("ListFile");
774     if (!IsSystemApp()) {
775         HILOG_ERROR("FileAccessHelper::ListFile check IsSystemAppByFullTokenID failed");
776         return E_PERMISSION_SYS;
777     }
778 
779     Uri sourceFile(fileInfo.uri);
780     if (!CheckUri(sourceFile)) {
781         HILOG_ERROR("sourceFile format check error.");
782         return E_URIS;
783     }
784 
785     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
786     if (fileExtProxy == nullptr) {
787         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
788         return E_IPCS;
789     }
790 
791     memInfo.Clear();
792     SharedMemoryInfo memInfoTemp = memInfo;
793     int ret = fileExtProxy->ListFile(fileInfo, offset, filter, memInfo);
794     if (ret != ERR_OK) {
795         HILOG_ERROR("ListFile get result error, code:%{public}d", ret);
796         return ret;
797     }
798     memInfo.totalDataCounts = memInfo.dataCounts;
799     memInfo.memName = memInfoTemp.memName;
800     memInfo.memHead = memInfoTemp.memHead;
801     memInfo.memTail = memInfoTemp.memTail;
802     memInfo.dataPtr = memInfoTemp.dataPtr;
803     return ERR_OK;
804 }
805 
ScanFile(const FileInfo & fileInfo,const int64_t offset,const int64_t maxCount,const FileFilter & filter,std::vector<FileInfo> & fileInfoVec)806 int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
807     const FileFilter &filter, std::vector<FileInfo> &fileInfoVec)
808 {
809     UserAccessTracer trace;
810     trace.Start("ScanFile");
811     if (!IsSystemApp()) {
812         HILOG_ERROR("FileAccessHelper::ScanFile check IsSystemAppByFullTokenID failed");
813         return E_PERMISSION_SYS;
814     }
815 
816     Uri sourceFile(fileInfo.uri);
817     if (!CheckUri(sourceFile)) {
818         HILOG_ERROR("sourceFile format check error.");
819         return E_URIS;
820     }
821 
822     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
823     if (fileExtProxy == nullptr) {
824         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
825         return E_IPCS;
826     }
827     fileInfoVec.clear();
828 
829     int ret = fileExtProxy->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec);
830     if (ret != ERR_OK) {
831         HILOG_ERROR("ScanFile get result error, code:%{public}d", ret);
832         return ret;
833     }
834 
835     return ERR_OK;
836 }
837 
GetQueryColumns(std::string & uri,std::string & metaJson,std::vector<std::string> & columns)838 static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector<std::string> &columns)
839 {
840     if (!json::accept(metaJson)) {
841         HILOG_ERROR("metaJson format check error.");
842         return EINVAL;
843     }
844 
845     auto jsonObject = json::parse(metaJson);
846     for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) {
847         auto iterator = FILE_RESULT_TYPE.find(it.key());
848         if (iterator == FILE_RESULT_TYPE.end()) {
849             HILOG_ERROR("columns format check error.");
850             return EINVAL;
851         }
852         columns.push_back(it.key());
853     }
854 
855     if (columns.empty()) {
856         HILOG_ERROR("columns is empty.");
857         return EINVAL;
858     }
859     return ERR_OK;
860 }
861 
GetQueryResult(std::string & uri,std::vector<std::string> & columns,std::vector<std::string> & results,std::string & metaJson)862 static int GetQueryResult(std::string &uri, std::vector<std::string> &columns, std::vector<std::string> &results,
863     std::string &metaJson)
864 {
865     json jsonObject;
866     for (size_t i = 0; i < columns.size(); i++) {
867         auto memberType = FILE_RESULT_TYPE.at(columns.at(i));
868         // Assign a default value based on the type, When fileIo obtains an invalid value.
869         switch (memberType) {
870             case STRING_TYPE:
871                 if (results[i].empty()) {
872                     results[i] = " ";
873                 }
874                 jsonObject[columns[i]] = results[i];
875                 break;
876             case INT32_TYPE:
877                 if (results[i].empty()) {
878                     results[i] = "0";
879                 }
880                 jsonObject[columns[i]] = std::atoi(results[i].c_str());
881                 break;
882             case INT64_TYPE:
883                 if (results[i].empty()) {
884                     results[i] = "0";
885                 }
886                 jsonObject[columns[i]] = std::stol(results[i]);
887                 break;
888             default:
889                 jsonObject[columns[i]] = " ";
890                 HILOG_ERROR("not match  memberType %{public}d", memberType);
891                 break;
892         }
893     }
894     metaJson = jsonObject.dump();
895     return ERR_OK;
896 }
897 
Query(Uri & uri,std::string & metaJson)898 int FileAccessHelper::Query(Uri &uri, std::string &metaJson)
899 {
900     UserAccessTracer trace;
901     trace.Start("Query");
902     if (!IsSystemApp()) {
903         HILOG_ERROR("FileAccessHelper::Query check IsSystemAppByFullTokenID failed");
904         return E_PERMISSION_SYS;
905     }
906 
907     if (!CheckUri(uri)) {
908         HILOG_ERROR("Uri format check error.");
909         return E_URIS;
910     }
911 
912     std::string uriString(uri.ToString());
913     std::vector<std::string> columns;
914     std::vector<std::string> results;
915     int ret = GetQueryColumns(uriString, metaJson, columns);
916     if (ret != ERR_OK) {
917         HILOG_ERROR("Query get columns error, code:%{public}d", ret);
918         return ret;
919     }
920 
921     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
922     if (fileExtProxy == nullptr) {
923         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
924         return E_IPCS;
925     }
926 
927     Urie uriConvert(uri.ToString());
928     results.clear();
929     ret = fileExtProxy->Query(uriConvert, columns, results);
930     if (ret != ERR_OK) {
931         HILOG_ERROR("Query get result error, code:%{public}d", ret);
932         return ret;
933     }
934 
935     ret = GetQueryResult(uriString, columns, results, metaJson);
936     if (ret != ERR_OK) {
937         HILOG_ERROR("Query get result error, code:%{public}d", ret);
938         return ret;
939     }
940 
941     return ERR_OK;
942 }
943 
GetRoots(std::vector<RootInfo> & rootInfoVec)944 int FileAccessHelper::GetRoots(std::vector<RootInfo> &rootInfoVec)
945 {
946     UserAccessTracer trace;
947     trace.Start("GetRoots");
948     if (!IsSystemApp()) {
949         HILOG_ERROR("FileAccessHelper::GetRoots check IsSystemAppByFullTokenID failed");
950         return E_PERMISSION_SYS;
951     }
952 
953     if (!GetProxy()) {
954         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
955         return E_IPCS;
956     }
957 
958     int ret = ERR_OK;
959     for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) {
960         auto connectInfo = iter->second;
961         if (connectInfo == nullptr || connectInfo->fileAccessExtConnection == nullptr) {
962             HILOG_ERROR("connectInfo is nullptr");
963             return E_IPCS;
964         }
965         auto fileAccessExtBaseProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy();
966         std::vector<RootInfo> results;
967         if (!fileAccessExtBaseProxy) {
968             HILOG_ERROR("GetFileExtProxy return nullptr, bundle name is %{public}s", iter->first.c_str());
969             continue;
970         }
971 
972         ret = fileAccessExtBaseProxy->GetRoots(results);
973         if (ret != ERR_OK) {
974             HILOG_ERROR("getRoots get fail ret:%{public}d", ret);
975             return ret;
976         }
977 
978         rootInfoVec.insert(rootInfoVec.end(), results.begin(), results.end());
979     }
980 
981     return ERR_OK;
982 }
983 
GetRegisteredFileAccessExtAbilityInfo(std::vector<AAFwk::Want> & wantVec)984 int FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(std::vector<AAFwk::Want> &wantVec)
985 {
986     UserAccessTracer trace;
987     trace.Start("GetRegisteredFileAccessExtAbilityInfo");
988     HILOG_INFO("GetRegisteredFileAccessExtAbilityInfo start.");
989     if (!IsSystemApp()) {
990         HILOG_ERROR("FileAccessHelper::GetRoots check IsSystemAppByFullTokenID failed");
991         return E_PERMISSION_SYS;
992     }
993 
994     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
995     sptr<AppExecFwk::IBundleMgr> bm = FileAccessHelper::GetBundleMgrProxy();
996     if (bm == nullptr) {
997         HILOG_ERROR("GetBundleMgrProxy nullptr.");
998         return E_GETINFO;
999     }
1000     bool ret = bm->QueryExtensionAbilityInfos(
1001         AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, GetUserId(), extensionInfos);
1002     HILOG_INFO("QueryExtensionAbilityInfos end.");
1003     if (!ret) {
1004         HILOG_ERROR("FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo QueryExtensionAbilityInfos error");
1005         return E_GETINFO;
1006     }
1007 
1008     wantVec.clear();
1009     for (size_t i = 0; i < extensionInfos.size(); i++) {
1010         if (extensionInfos[i].bundleName.empty()) {
1011             HILOG_ERROR("GetRegisteredFileAccessExtAbilityInfo extensionInfos.bundleName empty");
1012             return E_GETINFO;
1013         }
1014         AAFwk::Want want;
1015         want.SetElementName(extensionInfos[i].bundleName, extensionInfos[i].name);
1016         wantVec.push_back(want);
1017     }
1018 
1019     return ERR_OK;
1020 }
1021 
Access(Uri & uri,bool & isExist)1022 int FileAccessHelper::Access(Uri &uri, bool &isExist)
1023 {
1024     UserAccessTracer trace;
1025     trace.Start("Access");
1026     if (!IsSystemApp()) {
1027         HILOG_ERROR("FileAccessHelper::Access check IsSystemAppByFullTokenID failed");
1028         return E_PERMISSION_SYS;
1029     }
1030 
1031     if (!CheckUri(uri)) {
1032         HILOG_ERROR("uri format check error.");
1033         return E_URIS;
1034     }
1035 
1036     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
1037     if (fileExtProxy == nullptr) {
1038         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
1039         return E_IPCS;
1040     }
1041 
1042     Urie uriConvert(uri.ToString());
1043     int ret = fileExtProxy->Access(uriConvert, isExist);
1044     if (ret != ERR_OK) {
1045         HILOG_ERROR("Access get result error, code:%{public}d", ret);
1046         return ret;
1047     }
1048 
1049     return ERR_OK;
1050 }
1051 
GetFileInfoFromUri(Uri & selectFile,FileInfo & fileInfo)1052 int FileAccessHelper::GetFileInfoFromUri(Uri &selectFile, FileInfo &fileInfo)
1053 {
1054     UserAccessTracer trace;
1055     trace.Start("GetFileInfoFromUri");
1056     if (!IsSystemApp()) {
1057         HILOG_ERROR("FileAccessHelper::GetFileInfoFromUri check IsSystemAppByFullTokenID failed");
1058         return E_PERMISSION_SYS;
1059     }
1060 
1061     if (!CheckUri(selectFile)) {
1062         HILOG_ERROR("selectFile uri format check error.");
1063         return E_URIS;
1064     }
1065 
1066     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(selectFile);
1067     if (fileExtProxy == nullptr) {
1068         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
1069         return E_IPCS;
1070     }
1071 
1072     Urie selectFileConvert(selectFile.ToString());
1073     int ret = fileExtProxy->GetFileInfoFromUri(selectFileConvert, fileInfo);
1074     if (ret != ERR_OK) {
1075         HILOG_ERROR("GetFileInfoFromUri get result error, code:%{public}d", ret);
1076         return ret;
1077     }
1078 
1079     return ERR_OK;
1080 }
1081 
GetFileInfoFromRelativePath(std::string & selectFile,FileInfo & fileInfo)1082 int FileAccessHelper::GetFileInfoFromRelativePath(std::string &selectFile, FileInfo &fileInfo)
1083 {
1084     UserAccessTracer trace;
1085     trace.Start("GetFileInfoFromRelativePath");
1086     if (!IsSystemApp()) {
1087         HILOG_ERROR("FileAccessHelper::GetFileInfoFromRelativePath check IsSystemAppByFullTokenID failed");
1088         return E_PERMISSION_SYS;
1089     }
1090 
1091     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByBundleName(EXTERNAL_BNUDLE_NAME);
1092     if (fileExtProxy == nullptr) {
1093         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
1094         return E_IPCS;
1095     }
1096 
1097     int ret = fileExtProxy->GetFileInfoFromRelativePath(selectFile, fileInfo);
1098     if (ret != ERR_OK) {
1099         HILOG_ERROR("GetFileInfoFromRelativePath get result error, code:%{public}d", ret);
1100         return ret;
1101     }
1102 
1103     return ERR_OK;
1104 }
1105 
RegisterNotify(Uri uri,bool notifyForDescendants,sptr<IFileAccessObserver> & observer)1106 int FileAccessHelper::RegisterNotify(Uri uri, bool notifyForDescendants, sptr<IFileAccessObserver> &observer)
1107 {
1108     UserAccessTracer trace;
1109     trace.Start("RegisterNotify");
1110     if (!IsSystemApp()) {
1111         HILOG_ERROR("FileAccessHelper::RegisterNotify check IsSystemAppByFullTokenID failed");
1112         return E_PERMISSION_SYS;
1113     }
1114 
1115     if (!CheckUri(uri) || observer == nullptr) {
1116         HILOG_ERROR("parameter check error.");
1117         return EINVAL;
1118     }
1119 
1120     auto proxy = FileAccessServiceClient::GetInstance();
1121     if (proxy == nullptr) {
1122         HILOG_ERROR("RegisterNotify get SA failed");
1123         return E_LOAD_SA;
1124     }
1125 
1126     std::shared_ptr<ConnectExtensionInfo> info = GetConnectExtensionInfo(uri);
1127     if (!info) {
1128         HILOG_ERROR("FileAccessHelper::RegisterNotify check ConnectExtensionInfo failed");
1129         return EINVAL;
1130     }
1131 
1132     int ret = proxy->RegisterNotify(uri, notifyForDescendants, observer, *info);
1133     return ret;
1134 }
1135 
UnregisterNotify(Uri uri,sptr<IFileAccessObserver> & observer)1136 int FileAccessHelper::UnregisterNotify(Uri uri, sptr<IFileAccessObserver> &observer)
1137 {
1138     UserAccessTracer trace;
1139     trace.Start("UnregisterNotify");
1140     if (!IsSystemApp()) {
1141         HILOG_ERROR("FileAccessHelper::UnregisterNotify check IsSystemAppByFullTokenID failed");
1142         return E_PERMISSION_SYS;
1143     }
1144 
1145     if (!CheckUri(uri) || observer == nullptr) {
1146         HILOG_ERROR("parameter check error.");
1147         return EINVAL;
1148     }
1149 
1150     auto proxy = FileAccessServiceClient::GetInstance();
1151     if (proxy == nullptr) {
1152         HILOG_ERROR("UnregisterNotify get SA failed");
1153         return E_LOAD_SA;
1154     }
1155 
1156     std::shared_ptr<ConnectExtensionInfo> info = GetConnectExtensionInfo(uri);
1157     if (!info) {
1158         HILOG_ERROR("FileAccessHelper::UnregisterNotify check ConnectExtensionInfo failed");
1159         return EINVAL;
1160     }
1161 
1162     int ret = proxy->UnregisterNotify(uri, observer, *info);
1163     return ret;
1164 }
1165 
UnregisterNotify(Uri uri)1166 int FileAccessHelper::UnregisterNotify(Uri uri)
1167 {
1168     UserAccessTracer trace;
1169     trace.Start("UnregisterNotify");
1170     if (!IsSystemApp()) {
1171         HILOG_ERROR("FileAccessHelper::UnregisterNotify check IsSystemAppByFullTokenID failed");
1172         return E_PERMISSION_SYS;
1173     }
1174 
1175     if (!CheckUri(uri)) {
1176         HILOG_ERROR("parameter check error.");
1177         return EINVAL;
1178     }
1179     auto proxy = FileAccessServiceClient::GetInstance();
1180     if (proxy == nullptr) {
1181         HILOG_ERROR("UnregisterNotify get SA failed");
1182         return E_LOAD_SA;
1183     }
1184 
1185     std::shared_ptr<ConnectExtensionInfo> info = GetConnectExtensionInfo(uri);
1186     if (!info) {
1187         HILOG_ERROR("FileAccessHelper::UnregisterNotify check ConnectExtensionInfo failed");
1188         return EINVAL;
1189     }
1190 
1191     int ret = proxy->UnregisterNotifyNoObserver(uri, *info);
1192     return ret;
1193 }
1194 
MoveItem(Uri & sourceFile,Uri & targetParent,std::vector<Result> & moveResult,bool force)1195 int FileAccessHelper::MoveItem(Uri &sourceFile, Uri &targetParent, std::vector<Result> &moveResult, bool force)
1196 {
1197     UserAccessTracer trace;
1198     trace.Start("MoveItem");
1199     if (!IsSystemApp()) {
1200         HILOG_ERROR("MoveItem check IsSystemAppByFullTokenID failed");
1201         return GetResult("", "", E_PERMISSION_SYS, "", moveResult);
1202     }
1203 
1204     Uri sourceFileUri(sourceFile.ToString());
1205     Uri targetParentUri(targetParent.ToString());
1206     if (!CheckUri(sourceFile) || !CheckUri(targetParent)) {
1207         HILOG_ERROR("uri format check error.");
1208         return GetResult("", "", E_URIS, "", moveResult);
1209     }
1210 
1211     if (sourceFileUri.GetAuthority() != targetParentUri.GetAuthority()) {
1212         HILOG_WARN("Operation failed, move not supported");
1213         return GetResult("", "", EPERM, "", moveResult);
1214     }
1215 
1216     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
1217     if (fileExtProxy == nullptr) {
1218         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
1219         return GetResult("", "", E_IPCS, "", moveResult);
1220     }
1221 
1222     Urie sourceFileConvert(sourceFile.ToString());
1223     Urie targetParentConvert(targetParent.ToString());
1224     moveResult.clear();
1225     int retCode;
1226     int ret = fileExtProxy->MoveItem(sourceFileConvert, targetParentConvert, moveResult, retCode, force);
1227     if (ret == ERR_OK) {
1228         ret = retCode;
1229     }
1230     if (moveResult.size() > MAX_COPY_ERROR_COUNT) {
1231         HILOG_ERROR("Move operation failed, count value greater than max count");
1232         Result result { "", "", E_COUNT, "Count value greater than max count"};
1233         moveResult.clear();
1234         moveResult.push_back(result);
1235         ret = COPY_EXCEPTION;
1236     }
1237     if (ret != ERR_OK) {
1238         HILOG_ERROR("Move get result error, code:%{public}d", ret);
1239         return ret;
1240     }
1241 
1242     return ERR_OK;
1243 }
1244 
MoveFile(Uri & sourceFile,Uri & targetParent,std::string & fileName,Uri & newFile)1245 int FileAccessHelper::MoveFile(Uri &sourceFile, Uri &targetParent, std::string &fileName, Uri &newFile)
1246 {
1247     UserAccessTracer trace;
1248     trace.Start("MoveFile");
1249     if (!IsSystemApp()) {
1250         HILOG_ERROR("FileAccessHelper::MoveFile check IsSystemAppByFullTokenID failed");
1251         return E_PERMISSION_SYS;
1252     }
1253 
1254     Uri sourceFileUri(sourceFile.ToString());
1255     Uri targetParentUri(targetParent.ToString());
1256     if (!CheckUri(sourceFile) || !CheckUri(targetParent)) {
1257         HILOG_ERROR("uri format check error.");
1258         return E_URIS;
1259     }
1260 
1261     if (sourceFileUri.GetAuthority() != targetParentUri.GetAuthority()) {
1262         HILOG_WARN("Operation failed, move not supported");
1263         return EPERM;
1264     }
1265 
1266     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
1267     if (fileExtProxy == nullptr) {
1268         HILOG_ERROR("failed with invalid FileAccessExtBaseProxy");
1269         return E_IPCS;
1270     }
1271 
1272     Urie sourceFileConvert(sourceFile.ToString());
1273     Urie targetParentConvert(targetParent.ToString());
1274     Urie newFileConvert("");
1275     int ret = fileExtProxy->MoveFile(sourceFileConvert, targetParentConvert, fileName, newFileConvert);
1276     if (ret != ERR_OK) {
1277         HILOG_ERROR("Move get result error, code:%{public}d", ret);
1278         return ret;
1279     }
1280     newFile = Uri(newFileConvert.ToString());
1281 
1282     return ERR_OK;
1283 }
1284 } // namespace FileAccessFwk
1285 } // namespace OHOS
1286