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> ©Result, 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> ©Result, 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