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