1  /*
2   * Copyright (c) 2022-2024 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_ext_stub.h"
17  
18  #include <cstdint>
19  #include <map>
20  #include <memory>
21  #include <string>
22  #include <utility>
23  #include <vector>
24  #include "user_access_tracer.h"
25  #include "access_token.h"
26  #include "accesstoken_kit.h"
27  #include "file_access_extension_info.h"
28  #include "file_access_framework_errno.h"
29  #include "hilog_wrapper.h"
30  #include "hitrace_meter.h"
31  #include "ipc_object_stub.h"
32  #include "ipc_skeleton.h"
33  #include "ipc_types.h"
34  #include "unique_fd.h"
35  #include "uri.h"
36  
37  namespace OHOS {
38  namespace FileAccessFwk {
39  namespace {
40      const std::string FILE_ACCESS_PERMISSION = "ohos.permission.FILE_ACCESS_MANAGER";
41  }
FileAccessExtStub()42  FileAccessExtStub::FileAccessExtStub()
43  {
44      stubFuncMap_[CMD_OPEN_FILE] = &FileAccessExtStub::CmdOpenFile;
45      stubFuncMap_[CMD_CREATE_FILE] = &FileAccessExtStub::CmdCreateFile;
46      stubFuncMap_[CMD_START_WATCHER] = &FileAccessExtStub::CmdStartWatcher;
47      stubFuncMap_[CMD_STOP_WATCHER] = &FileAccessExtStub::CmdStopWatcher;
48      stubFuncMap_[CMD_MKDIR] = &FileAccessExtStub::CmdMkdir;
49      stubFuncMap_[CMD_DELETE] = &FileAccessExtStub::CmdDelete;
50      stubFuncMap_[CMD_MOVE] = &FileAccessExtStub::CmdMove;
51      stubFuncMap_[CMD_COPY] = &FileAccessExtStub::CmdCopy;
52      stubFuncMap_[CMD_RENAME] = &FileAccessExtStub::CmdRename;
53      stubFuncMap_[CMD_LIST_FILE] = &FileAccessExtStub::CmdListFile;
54      stubFuncMap_[CMD_SCAN_FILE] = &FileAccessExtStub::CmdScanFile;
55      stubFuncMap_[CMD_QUERY] = &FileAccessExtStub::CmdQuery;
56      stubFuncMap_[CMD_GET_ROOTS] = &FileAccessExtStub::CmdGetRoots;
57      stubFuncMap_[CMD_ACCESS] = &FileAccessExtStub::CmdAccess;
58      stubFuncMap_[CMD_GET_FILEINFO_FROM_URI] = &FileAccessExtStub::CmdGetFileInfoFromUri;
59      stubFuncMap_[CMD_GET_FILEINFO_FROM_RELATIVE_PATH] = &FileAccessExtStub::CmdGetFileInfoFromRelativePath;
60      stubFuncMap_[CMD_COPY_FILE] = &FileAccessExtStub::CmdCopyFile;
61      stubFuncMap_[CMD_MOVE_ITEM] = &FileAccessExtStub::CmdMoveItem;
62      stubFuncMap_[CMD_MOVE_FILE] = &FileAccessExtStub::CmdMoveFile;
63  }
64  
~FileAccessExtStub()65  FileAccessExtStub::~FileAccessExtStub()
66  {
67      stubFuncMap_.clear();
68  }
69  
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)70  int FileAccessExtStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
71      MessageOption& option)
72  {
73      UserAccessTracer trace;
74      trace.Start("OnRemoteRequest");
75      std::u16string descriptor = FileAccessExtStub::GetDescriptor();
76      std::u16string remoteDescriptor = data.ReadInterfaceToken();
77      if (descriptor != remoteDescriptor) {
78          return ERR_INVALID_STATE;
79      }
80  
81      if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) {
82          HILOG_ERROR("permission error");
83          return E_PERMISSION;
84      }
85  
86      const auto &itFunc = stubFuncMap_.find(code);
87      if (itFunc != stubFuncMap_.end()) {
88          return (this->*(itFunc->second))(data, reply);
89      }
90      return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
91  }
92  
CmdOpenFile(MessageParcel & data,MessageParcel & reply)93  ErrCode FileAccessExtStub::CmdOpenFile(MessageParcel &data, MessageParcel &reply)
94  {
95      UserAccessTracer trace;
96      trace.Start("CmdOpenFile");
97      std::shared_ptr<Uri> uri(data.ReadParcelable<Uri>());
98      if (uri == nullptr) {
99          HILOG_ERROR("Parameter OpenFile fail to ReadParcelable uri");
100          return E_IPCS;
101      }
102  
103      int flags = E_IPCS;
104      if (!data.ReadInt32(flags)) {
105          HILOG_ERROR("Parameter OpenFile fail to ReadInt32 flags");
106          return E_IPCS;
107      }
108  
109      if (flags < 0) {
110          HILOG_ERROR("Parameter OpenFile flags is invalid");
111          return EINVAL;
112      }
113  
114      int fd = -1;
115      int ret = OpenFile(*uri, flags, fd);
116      UniqueFd uniqueFd(fd);
117      if (!reply.WriteInt32(ret)) {
118          HILOG_ERROR("Parameter OpenFile fail to WriteInt32 ret");
119          return E_IPCS;
120      }
121  
122      if (!reply.WriteFileDescriptor(fd)) {
123          HILOG_ERROR("Parameter OpenFile fail to WriteFileDescriptor fd");
124          return E_IPCS;
125      }
126  
127      return ERR_OK;
128  }
129  
CmdCreateFile(MessageParcel & data,MessageParcel & reply)130  ErrCode FileAccessExtStub::CmdCreateFile(MessageParcel &data, MessageParcel &reply)
131  {
132      UserAccessTracer trace;
133      trace.Start("CmdCreateFile");
134      std::shared_ptr<Uri> parent(data.ReadParcelable<Uri>());
135      if (parent == nullptr) {
136          HILOG_ERROR("Parameter CreateFile fail to ReadParcelable parent");
137          return E_IPCS;
138      }
139  
140      std::string displayName = "";
141      if (!data.ReadString(displayName)) {
142          HILOG_ERROR("Parameter CreateFile fail to ReadString displayName");
143          return E_IPCS;
144      }
145  
146      if (displayName.empty()) {
147          HILOG_ERROR("Parameter CreateFile displayName is empty");
148          return EINVAL;
149      }
150  
151      std::string newFile = "";
152      OHOS::Uri newFileUri(newFile);
153      int ret = CreateFile(*parent, displayName, newFileUri);
154      if (!reply.WriteInt32(ret)) {
155          HILOG_ERROR("Parameter CreateFile fail to WriteInt32 ret");
156          return E_IPCS;
157      }
158  
159      if (!reply.WriteParcelable(&newFileUri)) {
160          HILOG_ERROR("Parameter CreateFile fail to WriteParcelable newFileUri");
161          return E_IPCS;
162      }
163  
164      return ERR_OK;
165  }
166  
CmdMkdir(MessageParcel & data,MessageParcel & reply)167  ErrCode FileAccessExtStub::CmdMkdir(MessageParcel &data, MessageParcel &reply)
168  {
169      UserAccessTracer trace;
170      trace.Start("CmdMkdir");
171      std::shared_ptr<Uri> parent(data.ReadParcelable<Uri>());
172      if (parent == nullptr) {
173          HILOG_ERROR("Parameter Mkdir fail to ReadParcelable parent");
174          return E_IPCS;
175      }
176  
177      std::string displayName = "";
178      if (!data.ReadString(displayName)) {
179          HILOG_ERROR("Parameter Mkdir fail to ReadString displayName");
180          return E_IPCS;
181      }
182  
183      if (displayName.empty()) {
184          HILOG_ERROR("Parameter Mkdir displayName is empty");
185          return EINVAL;
186      }
187  
188      std::string newFile = "";
189      OHOS::Uri newFileUri(newFile);
190      int ret = Mkdir(*parent, displayName, newFileUri);
191      if (!reply.WriteInt32(ret)) {
192          HILOG_ERROR("Parameter Mkdir fail to WriteInt32 ret");
193          return E_IPCS;
194      }
195  
196      if (!reply.WriteParcelable(&newFileUri)) {
197          HILOG_ERROR("Parameter Mkdir fail to WriteParcelable newFileUri");
198          return E_IPCS;
199      }
200  
201      return ERR_OK;
202  }
203  
CmdDelete(MessageParcel & data,MessageParcel & reply)204  ErrCode FileAccessExtStub::CmdDelete(MessageParcel &data, MessageParcel &reply)
205  {
206      UserAccessTracer trace;
207      trace.Start("CmdDelete");
208      std::shared_ptr<Uri> uri(data.ReadParcelable<Uri>());
209      if (uri == nullptr) {
210          HILOG_ERROR("Parameter Delete fail to ReadParcelable uri");
211          return E_IPCS;
212      }
213  
214      int ret = Delete(*uri);
215      if (!reply.WriteInt32(ret)) {
216          HILOG_ERROR("Parameter Delete fail to WriteInt32 ret");
217          return E_IPCS;
218      }
219  
220      return ERR_OK;
221  }
222  
CmdMove(MessageParcel & data,MessageParcel & reply)223  ErrCode FileAccessExtStub::CmdMove(MessageParcel &data, MessageParcel &reply)
224  {
225      UserAccessTracer trace;
226      trace.Start("CmdMove");
227      std::shared_ptr<Uri> sourceFile(data.ReadParcelable<Uri>());
228      if (sourceFile == nullptr) {
229          HILOG_ERROR("Parameter Move fail to ReadParcelable sourceFile");
230          return E_IPCS;
231      }
232  
233      std::shared_ptr<Uri> targetParent(data.ReadParcelable<Uri>());
234      if (targetParent == nullptr) {
235          HILOG_ERROR("Parameter Move fail to ReadParcelable targetParent");
236          return E_IPCS;
237      }
238  
239      std::string newFile = "";
240      OHOS::Uri newFileUri(newFile);
241      int ret = Move(*sourceFile, *targetParent, newFileUri);
242      if (!reply.WriteInt32(ret)) {
243          HILOG_ERROR("Parameter Move fail to WriteInt32 ret");
244          return E_IPCS;
245      }
246  
247      if (!reply.WriteParcelable(&newFileUri)) {
248          HILOG_ERROR("Parameter Move fail to WriteParcelable newFileUri");
249          return E_IPCS;
250      }
251  
252      return ERR_OK;
253  }
254  
CmdCopy(MessageParcel & data,MessageParcel & reply)255  ErrCode FileAccessExtStub::CmdCopy(MessageParcel &data, MessageParcel &reply)
256  {
257      UserAccessTracer trace;
258      trace.Start("CmdCopy");
259      std::shared_ptr<Uri> sourceUri(data.ReadParcelable<Uri>());
260      if (sourceUri == nullptr) {
261          HILOG_ERROR("Parameter Copy fail to ReadParcelable sourceUri");
262          return E_IPCS;
263      }
264  
265      std::shared_ptr<Uri> destUri(data.ReadParcelable<Uri>());
266      if (destUri == nullptr) {
267          HILOG_ERROR("Parameter Copy fail to ReadParcelable destUri");
268          return E_IPCS;
269      }
270  
271      bool force = false;
272      if (!data.ReadBool(force)) {
273          HILOG_ERROR("Parameter Copy fail to ReadBool force");
274          return E_IPCS;
275      }
276  
277      std::vector<Result> copyResult;
278      int ret = Copy(*sourceUri, *destUri, copyResult, force);
279      if (!reply.WriteInt32(ret)) {
280          HILOG_ERROR("Parameter Copy fail to WriteInt32 ret");
281          return E_IPCS;
282      }
283  
284      if (!reply.WriteUint32(copyResult.size())) {
285          HILOG_ERROR("Parameter Copy fail to WriteInt32 size of copyResult");
286          return E_IPCS;
287      }
288  
289      for (auto &result : copyResult) {
290          if (!reply.WriteParcelable(&result)) {
291              HILOG_ERROR("Parameter Copy fail to WriteParcelable copyResult");
292              return E_IPCS;
293          }
294      }
295  
296      return ERR_OK;
297  }
298  
CmdCopyFile(MessageParcel & data,MessageParcel & reply)299  ErrCode FileAccessExtStub::CmdCopyFile(MessageParcel &data, MessageParcel &reply)
300  {
301      UserAccessTracer trace;
302      trace.Start("CmdCopyFile");
303      std::string sourceUri = "";
304      if (!data.ReadString(sourceUri)) {
305          HILOG_ERROR("Parameter Copy file fail to ReadParcelable sourceUri");
306          return E_IPCS;
307      }
308  
309      std::string destUri = "";
310      if (!data.ReadString(destUri)) {
311          HILOG_ERROR("Parameter Copy file fail to ReadParcelable destUri");
312          return E_IPCS;
313      }
314  
315      std::string fileName = "";
316      if (!data.ReadString(fileName)) {
317          HILOG_ERROR("Parameter Copy file fail to ReadString fileName");
318          return E_IPCS;
319      }
320  
321      OHOS::Uri newFileUri("");
322      Uri source(sourceUri);
323      Uri dest(destUri);
324      int ret = CopyFile(source, dest, fileName, newFileUri);
325      if (!reply.WriteInt32(ret)) {
326          HILOG_ERROR("Parameter Copy file fail to WriteInt32 ret");
327          return E_IPCS;
328      }
329      if (!reply.WriteString(newFileUri.ToString())) {
330          HILOG_ERROR("Parameter Copy file fail to WriteString newFileUri");
331          return E_IPCS;
332      }
333  
334      return ERR_OK;
335  }
336  
CmdRename(MessageParcel & data,MessageParcel & reply)337  ErrCode FileAccessExtStub::CmdRename(MessageParcel &data, MessageParcel &reply)
338  {
339      UserAccessTracer trace;
340      trace.Start("CmdRename");
341      std::shared_ptr<Uri> sourceFile(data.ReadParcelable<Uri>());
342      if (sourceFile == nullptr) {
343          HILOG_ERROR("Parameter Rename fail to ReadParcelable sourceFile");
344          return E_IPCS;
345      }
346  
347      std::string displayName = "";
348      if (!data.ReadString(displayName)) {
349          HILOG_ERROR("Parameter Rename fail to ReadString displayName");
350          return E_IPCS;
351      }
352  
353      if (displayName.empty()) {
354          HILOG_ERROR("Parameter Rename displayName is empty");
355          return EINVAL;
356      }
357  
358      std::string newFile = "";
359      OHOS::Uri newFileUri(newFile);
360      int ret = Rename(*sourceFile, displayName, newFileUri);
361      if (!reply.WriteInt32(ret)) {
362          HILOG_ERROR("Parameter Rename fail to WriteInt32 ret");
363          return E_IPCS;
364      }
365  
366      if (!reply.WriteParcelable(&newFileUri)) {
367          HILOG_ERROR("Parameter Rename fail to WriteParcelable newFileUri");
368          return E_IPCS;
369      }
370  
371      return ERR_OK;
372  }
373  
374  std::tuple<int, std::shared_ptr<FileInfo>, int64_t, std::shared_ptr<FileFilter>, std::shared_ptr<SharedMemoryInfo>>
ReadFileFilterFuncArguments(MessageParcel & data)375      ReadFileFilterFuncArguments(MessageParcel &data)
376  {
377      std::shared_ptr<FileInfo> fileInfo(data.ReadParcelable<FileInfo>());
378      if (fileInfo == nullptr) {
379          HILOG_ERROR("Parameter ListFile fail to ReadParcelable fileInfo");
380          return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr);
381      }
382  
383      int64_t offset = 0;
384      if (!data.ReadInt64(offset)) {
385          HILOG_ERROR("parameter ListFile offset is invalid");
386          return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr);
387      }
388  
389      std::shared_ptr<FileFilter> filter(data.ReadParcelable<FileFilter>());
390      if (filter == nullptr) {
391          HILOG_ERROR("parameter ListFile FileFilter is invalid");
392          return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr);
393      }
394  
395      std::shared_ptr<SharedMemoryInfo> memInfo(data.ReadParcelable<SharedMemoryInfo>());
396      if (memInfo == nullptr) {
397          HILOG_ERROR("parameter ListFile SharedMemoryInfo is invalid");
398          return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr);
399      }
400  
401      return std::make_tuple(ERR_OK, fileInfo, offset, filter, memInfo);
402  }
403  
WriteFileFilterResults(MessageParcel & reply,SharedMemoryInfo & memInfo)404  int WriteFileFilterResults(MessageParcel &reply, SharedMemoryInfo &memInfo)
405  {
406      if (!reply.WriteUint32(memInfo.dataCounts)) {
407          HILOG_ERROR("fail to WriteUint32 dataCounts");
408          return E_IPCS;
409      }
410  
411      if (!reply.WriteUint64(memInfo.dataSize)) {
412          HILOG_ERROR("fail to WriteUint32 dataSize");
413          return E_IPCS;
414      }
415  
416      if (!reply.WriteUint32(memInfo.leftDataCounts)) {
417          HILOG_ERROR("fail to WriteUint32 leftDataCounts");
418          return E_IPCS;
419      }
420  
421      if (!reply.WriteBool(memInfo.isOver)) {
422          HILOG_ERROR("fail to WriteBool isOver");
423          return E_IPCS;
424      }
425  
426      return ERR_OK;
427  }
428  
CmdListFile(MessageParcel & data,MessageParcel & reply)429  ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply)
430  {
431      UserAccessTracer trace;
432      trace.Start("CmdListFile");
433      int ret = E_IPCS;
434      std::shared_ptr<FileInfo> fileInfo = nullptr;
435      int64_t offset = 0;
436      std::shared_ptr<FileFilter> filter = nullptr;
437      std::shared_ptr<SharedMemoryInfo> memInfo = nullptr;
438  
439      std::tie(ret, fileInfo, offset, filter, memInfo) = ReadFileFilterFuncArguments(data);
440      if (ret != ERR_OK) {
441          return ret;
442      }
443      ret = SharedMemoryOperation::MapSharedMemory(*memInfo);
444      if (ret != ERR_OK) {
445          return ret;
446      }
447  
448      ret = ListFile(*fileInfo, offset, *filter, *memInfo);
449      if (!reply.WriteInt32(ret)) {
450          HILOG_ERROR("ListFile fail to WriteInt32 ret");
451          SharedMemoryOperation::DestroySharedMemory(*memInfo);
452          return E_IPCS;
453      }
454  
455      ret = WriteFileFilterResults(reply, *memInfo);
456      SharedMemoryOperation::DestroySharedMemory(*memInfo);
457      return ret;
458  }
459  
CmdScanFile(MessageParcel & data,MessageParcel & reply)460  ErrCode FileAccessExtStub::CmdScanFile(MessageParcel &data, MessageParcel &reply)
461  {
462      UserAccessTracer trace;
463      trace.Start("CmdScanFile");
464      std::shared_ptr<FileInfo> fileInfo(data.ReadParcelable<FileInfo>());
465      if (fileInfo == nullptr) {
466          HILOG_ERROR("Parameter ScanFile fail to ReadParcelable fileInfo");
467          return E_IPCS;
468      }
469  
470      int64_t offset = 0;
471      if (!data.ReadInt64(offset)) {
472          HILOG_ERROR("parameter ScanFile offset is invalid");
473          return E_IPCS;
474      }
475  
476      int64_t maxCount = 0;
477      if (!data.ReadInt64(maxCount)) {
478          HILOG_ERROR("parameter ScanFile maxCount is invalid");
479          return E_IPCS;
480      }
481  
482      std::shared_ptr<FileFilter> filter(data.ReadParcelable<FileFilter>());
483      if (filter == nullptr) {
484          HILOG_ERROR("parameter ScanFile FileFilter is invalid");
485          return E_IPCS;
486      }
487  
488      std::vector<FileInfo> fileInfoVec;
489      int ret = ScanFile(*fileInfo, offset, maxCount, *filter, fileInfoVec);
490      if (!reply.WriteInt32(ret)) {
491          HILOG_ERROR("Parameter ScanFile fail to WriteInt32 ret");
492          return E_IPCS;
493      }
494  
495      int64_t count {fileInfoVec.size()};
496      if (!reply.WriteInt64(count)) {
497          HILOG_ERROR("Parameter ScanFile fail to WriteInt64 count");
498          return E_IPCS;
499      }
500  
501      for (const auto &fileInfo : fileInfoVec) {
502          if (!reply.WriteParcelable(&fileInfo)) {
503              HILOG_ERROR("parameter ScanFile fail to WriteParcelable fileInfoVec");
504              return E_IPCS;
505          }
506      }
507  
508      return ERR_OK;
509  }
510  
CmdGetRoots(MessageParcel & data,MessageParcel & reply)511  ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply)
512  {
513      UserAccessTracer trace;
514      trace.Start("CmdGetRoots");
515  
516      std::vector<RootInfo> rootInfoVec;
517      int ret = GetRoots(rootInfoVec);
518      if (!reply.WriteInt32(ret)) {
519          HILOG_ERROR("Parameter GetRoots fail to WriteInt32 ret");
520          return E_IPCS;
521      }
522  
523      int64_t count {rootInfoVec.size()};
524      if (!reply.WriteInt64(count)) {
525          HILOG_ERROR("Parameter GetRoots fail to WriteInt64 count");
526          return E_IPCS;
527      }
528  
529      for (const auto &rootInfo : rootInfoVec) {
530          if (!reply.WriteParcelable(&rootInfo)) {
531              HILOG_ERROR("parameter ListFile fail to WriteParcelable rootInfo");
532              return E_IPCS;
533          }
534      }
535  
536      return ERR_OK;
537  }
538  
CmdQuery(MessageParcel & data,MessageParcel & reply)539  ErrCode FileAccessExtStub::CmdQuery(MessageParcel &data, MessageParcel &reply)
540  {
541      UserAccessTracer trace;
542      trace.Start("CmdQuery");
543      std::shared_ptr<Uri> uri(data.ReadParcelable<Uri>());
544      if (uri == nullptr) {
545          HILOG_ERROR("Parameter Query fail to ReadParcelable uri");
546          return E_IPCS;
547      }
548  
549      int64_t count = 0;
550      if (!data.ReadInt64(count)) {
551          HILOG_ERROR("Query operation failed to Read count");
552          return E_IPCS;
553      }
554      if (count > static_cast<int64_t>(FILE_RESULT_TYPE.size())) {
555          HILOG_ERROR(" The number of query operations exceeds %{public}zu ", FILE_RESULT_TYPE.size());
556          return EINVAL;
557      }
558      std::vector<std::string> columns;
559      for (int64_t i = 0; i < count; i++) {
560          columns.push_back(data.ReadString());
561      }
562      std::vector<std::string> results;
563      int ret = Query(*uri, columns, results);
564      if (!reply.WriteInt32(ret)) {
565          HILOG_ERROR("Parameter Query fail to WriteInt32 ret");
566          return E_IPCS;
567      }
568  
569      int64_t resCount {results.size()};
570      if (!reply.WriteInt64(resCount)) {
571          HILOG_ERROR("Parameter Query fail to WriteInt64 count");
572          return E_IPCS;
573      }
574  
575      for (const auto &result : results) {
576          if (!reply.WriteString(result)) {
577              HILOG_ERROR("parameter Query fail to WriteParcelable column");
578              return E_IPCS;
579          }
580      }
581  
582      return ERR_OK;
583  }
584  
CmdGetFileInfoFromUri(MessageParcel & data,MessageParcel & reply)585  ErrCode FileAccessExtStub::CmdGetFileInfoFromUri(MessageParcel &data, MessageParcel &reply)
586  {
587      UserAccessTracer trace;
588      trace.Start("CmdGetFileInfoFromUri");
589      std::shared_ptr<Uri> uri(data.ReadParcelable<Uri>());
590      if (uri == nullptr) {
591          HILOG_ERROR("SelectFile uri is nullptr");
592          return E_URIS;
593      }
594  
595      FileInfo fileInfoTemp;
596      int ret = GetFileInfoFromUri(*uri, fileInfoTemp);
597      if (!reply.WriteInt32(ret)) {
598          HILOG_ERROR("Parameter GetFileInfoFromUri fail to WriteInt32 ret");
599          return E_IPCS;
600      }
601  
602      if (!reply.WriteParcelable(&fileInfoTemp)) {
603          HILOG_ERROR("Parameter GetFileInfoFromUri fail to WriteParcelable fileInfoTemp");
604          return E_IPCS;
605      }
606  
607      return ERR_OK;
608  }
609  
CmdGetFileInfoFromRelativePath(MessageParcel & data,MessageParcel & reply)610  ErrCode FileAccessExtStub::CmdGetFileInfoFromRelativePath(MessageParcel &data, MessageParcel &reply)
611  {
612      UserAccessTracer trace;
613      trace.Start("CmdGetFileInfoFromRelativePath");
614      std::string relativePath(data.ReadString());
615  
616      FileInfo fileInfoTemp;
617      int ret = GetFileInfoFromRelativePath(relativePath, fileInfoTemp);
618      if (!reply.WriteInt32(ret)) {
619          HILOG_ERROR("Parameter CmdGetFileInfoFromRelativePath fail to WriteInt32 ret");
620          return E_IPCS;
621      }
622  
623      if (!reply.WriteParcelable(&fileInfoTemp)) {
624          HILOG_ERROR("Parameter CmdGetFileInfoFromRelativePath fail to WriteParcelable fileInfoTemp");
625          return E_IPCS;
626      }
627  
628      return ERR_OK;
629  }
630  
CmdAccess(MessageParcel & data,MessageParcel & reply)631  ErrCode FileAccessExtStub::CmdAccess(MessageParcel &data, MessageParcel &reply)
632  {
633      UserAccessTracer trace;
634      trace.Start("CmdAccess");
635      std::shared_ptr<Uri> uri(data.ReadParcelable<Uri>());
636      if (uri == nullptr) {
637          HILOG_ERROR("Access uri is nullptr");
638          return E_URIS;
639      }
640  
641      bool isExist = false;
642      int ret = Access(*uri, isExist);
643      if (!reply.WriteInt32(ret)) {
644          HILOG_ERROR("Parameter Access fail to WriteInt32 ret");
645          return E_IPCS;
646      }
647  
648      if (!reply.WriteBool(isExist)) {
649          HILOG_ERROR("Parameter Access fail to WriteBool isExist");
650          return E_IPCS;
651      }
652  
653      return ERR_OK;
654  }
655  
CmdStartWatcher(MessageParcel & data,MessageParcel & reply)656  ErrCode FileAccessExtStub::CmdStartWatcher(MessageParcel &data, MessageParcel &reply)
657  {
658      UserAccessTracer trace;
659      trace.Start("CmdStartWatcher");
660      std::string uriString;
661      if (!data.ReadString(uriString)) {
662          HILOG_ERROR("Parameter StartWatcher fail to ReadParcelable uri");
663          return E_IPCS;
664      }
665  
666      if (uriString.empty()) {
667          HILOG_ERROR("Parameter StartWatcher insideInputUri is empty");
668          return EINVAL;
669      }
670  
671      Uri uri(uriString);
672      int ret = StartWatcher(uri);
673      if (!reply.WriteInt32(ret)) {
674          HILOG_ERROR("Parameter StartWatcher fail to WriteInt32 ret");
675          return E_IPCS;
676      }
677  
678      return ERR_OK;
679  }
680  
CmdStopWatcher(MessageParcel & data,MessageParcel & reply)681  ErrCode FileAccessExtStub::CmdStopWatcher(MessageParcel &data, MessageParcel &reply)
682  {
683      UserAccessTracer trace;
684      trace.Start("CmdStopWatcher");
685      std::string uriString;
686      if (!data.ReadString(uriString)) {
687          HILOG_ERROR("Parameter StopWatcher fail to ReadParcelable uri");
688          return E_IPCS;
689      }
690  
691      if (uriString.empty()) {
692          HILOG_ERROR("Parameter StopWatcher insideInputUri is empty");
693          return EINVAL;
694      }
695  
696      Uri uri(uriString);
697      int ret = StopWatcher(uri);
698      if (!reply.WriteInt32(ret)) {
699          HILOG_ERROR("Parameter StopWatcher fail to WriteInt32 ret");
700          return E_IPCS;
701      }
702  
703      return ERR_OK;
704  }
CheckCallingPermission(const std::string & permission)705  bool FileAccessExtStub::CheckCallingPermission(const std::string &permission)
706  {
707      UserAccessTracer trace;
708      trace.Start("CheckCallingPermission");
709      Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
710      int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permission);
711      if (res != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
712          HILOG_ERROR("FileAccessExtStub::CheckCallingPermission have no fileAccess permission");
713          return false;
714      }
715  
716      return true;
717  }
718  
CmdMoveItem(MessageParcel & data,MessageParcel & reply)719  ErrCode FileAccessExtStub::CmdMoveItem(MessageParcel &data, MessageParcel &reply)
720  {
721      UserAccessTracer trace;
722      trace.Start("CmdMoveItem");
723      std::string sourceFile;
724      if (!data.ReadString(sourceFile)) {
725          HILOG_ERROR("Parameter Move fail to ReadParcelable uri");
726          return E_IPCS;
727      }
728  
729      std::string targetParent;
730      if (!data.ReadString(targetParent)) {
731          HILOG_ERROR("Parameter Move fail to ReadParcelable uri");
732          return E_IPCS;
733      }
734  
735      bool force = false;
736      if (!data.ReadBool(force)) {
737          HILOG_ERROR("Parameter Copy fail to ReadBool force");
738          return E_IPCS;
739      }
740  
741      std::vector<Result> moveResult;
742      Uri source(sourceFile);
743      Uri dest(targetParent);
744      int ret = MoveItem(source, dest, moveResult, force);
745      if (!reply.WriteInt32(ret)) {
746          HILOG_ERROR("Parameter Copy fail to WriteInt32 ret");
747          return E_IPCS;
748      }
749  
750      if (!reply.WriteUint32(moveResult.size())) {
751          HILOG_ERROR("Parameter Copy fail to WriteInt32 size of copyResult");
752          return E_IPCS;
753      }
754  
755      for (auto &result : moveResult) {
756          if (!reply.WriteParcelable(&result)) {
757              HILOG_ERROR("Parameter Copy fail to WriteParcelable copyResult");
758              return E_IPCS;
759          }
760      }
761  
762      return ERR_OK;
763  }
764  
CmdMoveFile(MessageParcel & data,MessageParcel & reply)765  ErrCode FileAccessExtStub::CmdMoveFile(MessageParcel &data, MessageParcel &reply)
766  {
767      UserAccessTracer trace;
768      trace.Start("CmdMoveFile");
769      std::string sourceFile;
770      if (!data.ReadString(sourceFile)) {
771          HILOG_ERROR("Parameter Move fail to ReadParcelable sourceUri");
772          return E_IPCS;
773      }
774  
775      std::string targetParent;
776      if (!data.ReadString(targetParent)) {
777          HILOG_ERROR("Parameter Move fail to ReadParcelable targetParentUri");
778          return E_IPCS;
779      }
780  
781      std::string fileName;
782      if (!data.ReadString(fileName)) {
783          HILOG_ERROR("Parameter Move fail to ReadParcelable fileName");
784          return E_IPCS;
785      }
786      std::string newFile;
787      OHOS::Uri newFileUri(newFile);
788      Uri source(sourceFile);
789      Uri target(targetParent);
790      int ret = MoveFile(source, target, fileName, newFileUri);
791      if (!reply.WriteInt32(ret)) {
792          HILOG_ERROR("Parameter Move fail to WriteInt32 ret");
793          return E_IPCS;
794      }
795  
796      std::string insideOutputUri = newFileUri.ToString();
797      if (!reply.WriteString(insideOutputUri)) {
798          HILOG_ERROR("Parameter Move fail to WriteParcelable newFileUri");
799          return E_IPCS;
800      }
801  
802      return ERR_OK;
803  }
804  } // namespace FileAccessFwk
805  } // namespace OHOS
806