From 2557f4cc7fa4dfc44b719ca94d12963d3f785923 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Wed, 23 Feb 2022 20:03:13 +0800 Subject: [PATCH 1/2] add ipc check Signed-off-by: panqiangbiao --- interfaces/kits/js/BUILD.gn | 2 +- interfaces/kits/js/src/file_manager_napi.cpp | 17 +++++++++++++---- services/src/fileoper/cmd_response.h | 6 +++++- services/src/fileoper/external_storage_oper.cpp | 12 +++++++++--- .../src/fileoper/external_storage_utils.cpp | 1 + services/src/fileoper/media_file_oper.cpp | 12 ++++++++---- services/src/fileoper/media_file_utils.cpp | 11 ++++++++++- services/src/fileoper/media_file_utils.h | 2 ++ 8 files changed, 49 insertions(+), 14 deletions(-) diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index fb477512..ed6253eb 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -43,7 +43,7 @@ ohos_shared_library("filemanager") { deps = [ "$FMS_BASE_DIR:fms_server", "//foundation/ace/napi:ace_napi", - "//foundation/distributeddatamgr/distributedfile/interfaces/kits/js:build_kits_js", + "//foundation/distributeddatamgr/distributedfile/interfaces/kits/js:fileio", "//foundation/multimedia/medialibrary_standard/frameworks/innerkitsimpl/medialibrary_data_ability:medialibrary_data_ability", "//utils/native/base:utils", ] diff --git a/interfaces/kits/js/src/file_manager_napi.cpp b/interfaces/kits/js/src/file_manager_napi.cpp index b3a6765e..f919bfbd 100644 --- a/interfaces/kits/js/src/file_manager_napi.cpp +++ b/interfaces/kits/js/src/file_manager_napi.cpp @@ -178,11 +178,15 @@ napi_value FileManagerNapi::CreateFile(napi_env env, napi_callback_info info) } } -void CreateFileArray(napi_env env, shared_ptr arg) +static bool CreateFileArray(napi_env env, shared_ptr arg) { for (unsigned int i = 0; i < arg->fileRes_.size(); i++) { NVal obj = NVal::CreateObject(env); - shared_ptr &res = arg->fileRes_[i]; + shared_ptr res = arg->fileRes_[i]; + if (res == nullptr) { + ERR_LOG("inner error, lack of memory, file count %{public}d", arg->fileRes_.size()); + return false; + } obj.AddProp("name", NVal::CreateUTF8String(env, res->GetName()).val_); obj.AddProp("path", NVal::CreateUTF8String(env, res->GetPath()).val_); obj.AddProp("type", NVal::CreateUTF8String(env, res->GetType()).val_); @@ -191,6 +195,7 @@ void CreateFileArray(napi_env env, shared_ptr arg) obj.AddProp("modified_time", NVal::CreateInt64(env, res->GetModifiedTime()).val_); napi_set_property(env, arg->ref_.Deref(env).val_, NVal::CreateInt32(env, i).val_, obj.val_); } + return true; } bool GetRootArgs(napi_env env, NFuncArg &funcArg, CmdOptions &option) @@ -246,7 +251,9 @@ napi_value FileManagerNapi::GetRoot(napi_env env, napi_callback_info info) return DealWithErrno(err); }; auto cbComplete = [arg](napi_env env, UniError err) -> NVal { - CreateFileArray(env, arg); + if (!err && !CreateFileArray(env, arg)) { + err = UniError(ENOMEM); + } if (err) { return { env, err.GetNapiErr(env) }; } else { @@ -359,10 +366,12 @@ napi_value FileManagerNapi::ListFile(napi_env env, napi_callback_info info) }; auto cbComplete = [arg](napi_env env, UniError err) -> NVal { + if (!err && !CreateFileArray(env, arg)) { + err = UniError(ENOMEM); + } if (err) { return { env, err.GetNapiErr(env) }; } else { - CreateFileArray(env, arg); return NVal(env, arg->ref_.Deref(env).val_); } }; diff --git a/services/src/fileoper/cmd_response.h b/services/src/fileoper/cmd_response.h index 09d1a1f2..ba561b01 100644 --- a/services/src/fileoper/cmd_response.h +++ b/services/src/fileoper/cmd_response.h @@ -20,6 +20,7 @@ #include #include "file_info.h" +#include "log.h" #include "parcel.h" namespace OHOS { namespace FileManagerService { @@ -68,7 +69,10 @@ public: int fileCount = vecFileInfo_.size(); parcel.WriteInt32(fileCount); for (int i = 0; i < fileCount; i++) { - parcel.WriteParcelable(vecFileInfo_[i].get()); + if (parcel.WriteParcelable(vecFileInfo_[i].get()) != true) { + ERR_LOG("Marshalling fail total:%{public}d i:%{public}d", fileCount, i); + return false; + } } return true; } diff --git a/services/src/fileoper/external_storage_oper.cpp b/services/src/fileoper/external_storage_oper.cpp index fd36754f..d1999735 100644 --- a/services/src/fileoper/external_storage_oper.cpp +++ b/services/src/fileoper/external_storage_oper.cpp @@ -72,7 +72,9 @@ int ExternalStorageOper::GetRoot(const std::string &name, const std::string &pat CmdResponse cmdResponse; cmdResponse.SetErr(ret); cmdResponse.SetFileInfoList(fileList); - reply.WriteParcelable(&cmdResponse); + if (!reply.WriteParcelable(&cmdResponse)) { + ERR_LOG("reply write err parcel capacity%{public}d", reply.GetDataCapacity()); + } return ret; } @@ -83,7 +85,9 @@ int ExternalStorageOper::CreateFile(const std::string &uri, const std::string &n CmdResponse cmdResponse; cmdResponse.SetErr(ret); cmdResponse.SetUri(resultUir); - reply.WriteParcelable(&cmdResponse); + if (!reply.WriteParcelable(&cmdResponse)) { + ERR_LOG("reply write err parcel capacity:%{public}d", reply.GetDataCapacity()); + } return ret; } @@ -95,7 +99,9 @@ int ExternalStorageOper::ListFile(const std::string &type, const std::string &ur CmdResponse cmdResponse; cmdResponse.SetErr(ret); cmdResponse.SetFileInfoList(fileList); - reply.WriteParcelable(&cmdResponse); + if (!reply.WriteParcelable(&cmdResponse)) { + ERR_LOG("reply write err parcel capacity:%{public}d", reply.GetDataCapacity()); + } return ret; } } // namespace FileManagerService diff --git a/services/src/fileoper/external_storage_utils.cpp b/services/src/fileoper/external_storage_utils.cpp index 715bcfc7..5b2c4934 100644 --- a/services/src/fileoper/external_storage_utils.cpp +++ b/services/src/fileoper/external_storage_utils.cpp @@ -113,6 +113,7 @@ int ExternalStorageUtils::DoListFile(const std::string &type, const std::string ERR_LOG("invalid file count or offset."); return E_INVALID_FILE_NUMBER; } + DEBUG_LOG("limit %{public}d, offset %{public}d", count, offset); std::string path; if (!ConvertUriToAbsolutePath(uri, path)) { ERR_LOG("invalid uri[%{public}s].", uri.c_str()); diff --git a/services/src/fileoper/media_file_oper.cpp b/services/src/fileoper/media_file_oper.cpp index 3e9fd3fe..cc2d95e6 100644 --- a/services/src/fileoper/media_file_oper.cpp +++ b/services/src/fileoper/media_file_oper.cpp @@ -50,8 +50,8 @@ int MediaFileOper::OperProcess(uint32_t code, MessageParcel &data, MessageParcel string devPath = data.ReadString(); string type = data.ReadString(); string path = data.ReadString(); - int off = data.ReadInt32(); - int count = data.ReadInt32(); + int off = data.ReadInt64(); + int count = data.ReadInt64(); // put fileInfo into reply errCode = ListFile(type, path, off, count, reply); break; @@ -78,7 +78,9 @@ int MediaFileOper::CreateFile(const std::string &name, const std::string &path, CmdResponse cmdResponse; cmdResponse.SetErr(ret); cmdResponse.SetUri(uri); - reply.WriteParcelable(&cmdResponse); + if (!reply.WriteParcelable(&cmdResponse)) { + ERR_LOG("reply write err parcel capacity:%{public}d", reply.GetDataCapacity()); + } return ret; } @@ -95,7 +97,9 @@ int MediaFileOper::ListFile(const string &type, const string &path, int offset, CmdResponse cmdResponse; cmdResponse.SetErr(res); cmdResponse.SetFileInfoList(fileList); - reply.WriteParcelable(&cmdResponse); + if (!reply.WriteParcelable(&cmdResponse)) { + ERR_LOG("reply write err parcel capacity:%{public}d", reply.GetDataCapacity()); + } return res; } diff --git a/services/src/fileoper/media_file_utils.cpp b/services/src/fileoper/media_file_utils.cpp index 9c4889f5..c45c6be9 100644 --- a/services/src/fileoper/media_file_utils.cpp +++ b/services/src/fileoper/media_file_utils.cpp @@ -287,7 +287,7 @@ int MediaFileUtils::DoListFile(const string &type, const string &path, int offse return err; } } - result = DoQuery(selection, selectionArgs); + result = DoQuery(selection, selectionArgs, offset, count); if (result == nullptr) { ERR_LOG("ListFile folder is empty"); return E_EMPTYFOLDER; @@ -297,11 +297,20 @@ int MediaFileUtils::DoListFile(const string &type, const string &path, int offse shared_ptr MediaFileUtils::DoQuery(const string &selection, const vector &selectionArgs) +{ + return DoQuery(selection, selectionArgs, 0, MAX_NUM); +} + +shared_ptr MediaFileUtils::DoQuery(const string &selection, + const vector &selectionArgs, int offset, int count) { ShowSelecArgs(selection, selectionArgs); NativeRdb::DataAbilityPredicates predicates; predicates.SetWhereClause(selection); predicates.SetWhereArgs(selectionArgs); + predicates.Limit(count); + predicates.Offset(offset); + DEBUG_LOG("limit %{public}d, offset %{public}d", count, offset); Uri uri = Uri(Media::MEDIALIBRARY_DATA_URI); vector columns; return abilityHelper->Query(uri, columns, predicates); diff --git a/services/src/fileoper/media_file_utils.h b/services/src/fileoper/media_file_utils.h index 2bdfdfa1..83e369db 100644 --- a/services/src/fileoper/media_file_utils.h +++ b/services/src/fileoper/media_file_utils.h @@ -39,6 +39,8 @@ public: std::shared_ptr &result); static std::shared_ptr DoQuery(const std::string &selection, const std::vector &selectionArgs); + static std::shared_ptr DoQuery(const std::string &selection, + const std::vector &selectionArgs, int offset, int count); static int DoInsert(const std::string &name, const std::string &path, const std::string &type, std::string &uri); static bool GetFileInfo(std::shared_ptr result, std::shared_ptr &fileInfo); static int GetFileInfoFromResult(std::shared_ptr result, -- Gitee From 762aca1b2ffb1b684d6d700940995f55527c3309 Mon Sep 17 00:00:00 2001 From: panqiangbiao Date: Thu, 24 Feb 2022 11:48:58 +0800 Subject: [PATCH 2/2] move getRoot code into service to check permission Signed-off-by: panqiangbiao --- services/src/client/file_manager_proxy.cpp | 43 ++++++++----------- .../src/fileoper/external_storage_utils.cpp | 4 +- services/src/fileoper/media_file_oper.cpp | 20 +++++++++ services/src/fileoper/media_file_oper.h | 1 + services/src/fileoper/media_file_utils.cpp | 14 ++++++ services/src/fileoper/media_file_utils.h | 2 + 6 files changed, 56 insertions(+), 28 deletions(-) diff --git a/services/src/client/file_manager_proxy.cpp b/services/src/client/file_manager_proxy.cpp index 9a275221..663efaa9 100644 --- a/services/src/client/file_manager_proxy.cpp +++ b/services/src/client/file_manager_proxy.cpp @@ -41,35 +41,26 @@ FileManagerProxy::FileManagerProxy(const sptr &impl) int FileManagerProxy::GetRoot(const CmdOptions &option, vector> &fileRes) { CmdOptions op(option); + int code = Operation::GET_ROOT; if (op.GetDevInfo().GetName() == "external_storage") { - MessageParcel data; - data.WriteString(op.GetDevInfo().GetName()); - MessageParcel reply; - MessageOption messageOption; - int code = (Equipment::EXTERNAL_STORAGE << EQUIPMENT_SHIFT) | Operation::GET_ROOT; - int err = Remote()->SendRequest(code, data, reply, messageOption); - if (err != ERR_NONE) { - ERR_LOG("GetRoot inner error send request fail %{public}d", err); - return FAIL; - } - sptr cmdResponse; - err = GetCmdResponse(reply, cmdResponse); - if (err != ERR_NONE) { - return err; - } - fileRes = cmdResponse->GetFileInfoList(); + code = (Equipment::EXTERNAL_STORAGE << EQUIPMENT_SHIFT) | Operation::GET_ROOT; + } + MessageParcel data; + data.WriteString(op.GetDevInfo().GetName()); + MessageParcel reply; + MessageOption messageOption; + int err = Remote()->SendRequest(code, data, reply, messageOption); + if (err != ERR_NONE) { + ERR_LOG("GetRoot inner error send request fail %{public}d", err); + return FAIL; + } + sptr cmdResponse; + err = GetCmdResponse(reply, cmdResponse); + if (err != ERR_NONE) { return err; - } else { - shared_ptr image = make_shared(IMAGE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(image); - shared_ptr video = make_shared(VIDEO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(video); - shared_ptr audio = make_shared(AUDIO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(audio); - shared_ptr file = make_shared(FILE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); - fileRes.emplace_back(file); - return SUCCESS; } + fileRes = cmdResponse->GetFileInfoList(); + return err; } int FileManagerProxy::CreateFile(const std::string &path, const std::string &fileName, diff --git a/services/src/fileoper/external_storage_utils.cpp b/services/src/fileoper/external_storage_utils.cpp index 5b2c4934..9e267f2d 100644 --- a/services/src/fileoper/external_storage_utils.cpp +++ b/services/src/fileoper/external_storage_utils.cpp @@ -113,7 +113,7 @@ int ExternalStorageUtils::DoListFile(const std::string &type, const std::string ERR_LOG("invalid file count or offset."); return E_INVALID_FILE_NUMBER; } - DEBUG_LOG("limit %{public}d, offset %{public}d", count, offset); + DEBUG_LOG("limit %{public}lld, offset %{public}lld", count, offset); std::string path; if (!ConvertUriToAbsolutePath(uri, path)) { ERR_LOG("invalid uri[%{public}s].", uri.c_str()); @@ -193,7 +193,7 @@ int ExternalStorageUtils::DoGetRoot(const std::string &name, const std::string & { vector vecRootPath; if (!StorageManagerInf::GetMountedVolumes(vecRootPath)) { - ERR_LOG("there is valid extorage storage"); + ERR_LOG("none valid extorage storage"); return FAIL; } for (auto rootPath : vecRootPath) { diff --git a/services/src/fileoper/media_file_oper.cpp b/services/src/fileoper/media_file_oper.cpp index cc2d95e6..4fc45791 100644 --- a/services/src/fileoper/media_file_oper.cpp +++ b/services/src/fileoper/media_file_oper.cpp @@ -45,6 +45,13 @@ int MediaFileOper::OperProcess(uint32_t code, MessageParcel &data, MessageParcel errCode = Mkdir(name, path); break; } + case Operation::GET_ROOT: { + string path = data.ReadString(); + // name for extension + string name = "name"; + errCode = GetRoot(name, path, reply); + break; + } case Operation::LIST_FILE: { string devName = data.ReadString(); string devPath = data.ReadString(); @@ -84,6 +91,19 @@ int MediaFileOper::CreateFile(const std::string &name, const std::string &path, return ret; } +int MediaFileOper::GetRoot(const std::string &name, const std::string &path, MessageParcel &reply) const +{ + std::vector> fileList; + int ret = MediaFileUtils::DoGetRoot(name, path, fileList); + CmdResponse cmdResponse; + cmdResponse.SetErr(ret); + cmdResponse.SetFileInfoList(fileList); + if (!reply.WriteParcelable(&cmdResponse)) { + ERR_LOG("reply write err parcel capacity%{public}d", reply.GetDataCapacity()); + } + return ret; +} + int MediaFileOper::ListFile(const string &type, const string &path, int offset, int count, MessageParcel &reply) const { shared_ptr result; diff --git a/services/src/fileoper/media_file_oper.h b/services/src/fileoper/media_file_oper.h index 0652065d..bc4374b2 100644 --- a/services/src/fileoper/media_file_oper.h +++ b/services/src/fileoper/media_file_oper.h @@ -27,6 +27,7 @@ public: private: int CreateFile(const std::string &name, const std::string &path, MessageParcel &reply) const; int ListFile(const std::string &type, const std::string &path, int offset, int count, MessageParcel &data) const; + int GetRoot(const std::string &name, const std::string &path, MessageParcel &reply) const; int Mkdir(const std::string &name, const std::string &path) const; }; } // namespace FileManagerService diff --git a/services/src/fileoper/media_file_utils.cpp b/services/src/fileoper/media_file_utils.cpp index c45c6be9..4169a748 100644 --- a/services/src/fileoper/media_file_utils.cpp +++ b/services/src/fileoper/media_file_utils.cpp @@ -427,5 +427,19 @@ bool MediaFileUtils::InitHelper(sptr obj) } return true; } + +int MediaFileUtils::DoGetRoot(const std::string &name, const std::string &path, + std::vector> &fileList) +{ + shared_ptr image = make_shared(IMAGE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileList.emplace_back(image); + shared_ptr video = make_shared(VIDEO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileList.emplace_back(video); + shared_ptr audio = make_shared(AUDIO_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileList.emplace_back(audio); + shared_ptr file = make_shared(FILE_ROOT_NAME, FISRT_LEVEL_ALBUM, ALBUM_TYPE); + fileList.emplace_back(file); + return SUCCESS; +} } // namespace FileManagerService } // namespace OHOS \ No newline at end of file diff --git a/services/src/fileoper/media_file_utils.h b/services/src/fileoper/media_file_utils.h index 83e369db..0a3b923f 100644 --- a/services/src/fileoper/media_file_utils.h +++ b/services/src/fileoper/media_file_utils.h @@ -35,6 +35,8 @@ class MediaFileUtils { public: MediaFileUtils(); ~MediaFileUtils(); + static int DoGetRoot(const std::string &name, const std::string &path, + std::vector> &fileList); static int DoListFile(const std::string &type, const std::string &path, int offset, int count, std::shared_ptr &result); static std::shared_ptr DoQuery(const std::string &selection, -- Gitee