diff --git a/interfaces/common/include/common_func.h b/interfaces/common/include/common_func.h index da1facccfc215ea480c878402d20a33946ba86e3..fc74301a254f32e9cd7b2e313829439f488699a0 100644 --- a/interfaces/common/include/common_func.h +++ b/interfaces/common/include/common_func.h @@ -19,8 +19,21 @@ #include #include +#include "datashare_helper.h" +#include "datashare_values_bucket.h" +#include "filemgmt_libn.h" +#include "iremote_broker.h" + namespace OHOS { namespace AppFileService { +class FileShareGrantToken : public IRemoteBroker { +public: + DECLARE_INTERFACE_DESCRIPTOR(u"ohos.fileshare.grantUriPermission"); + + FileShareGrantToken() = default; + virtual ~FileShareGrantToken() noexcept = default; +}; + class CommonFunc { static std::unordered_map sandboxPathMap_; public: @@ -30,6 +43,11 @@ public: static std::string GetSelfBundleName(); static std::string GetUriFromPath(const std::string &path); static bool CheckPublicDirPath(const std::string &sandboxPath); + static int InsertByDatashare(napi_env env, const DataShare::DataShareValuesBucket &valuesBucket, + bool isApi10); + static int GetDataShareInfo(const std::string &uri, const std::string &bundleName, + DataShare::DataShareValuesBucket &valuesBucket, bool &isApi10, const std::string &mode); + static std::string GetModeFromFlag(unsigned int flag); }; } // namespace AppFileService } // namespace OHOS diff --git a/interfaces/common/src/common_func.cpp b/interfaces/common/src/common_func.cpp index 53bf7968eab23f02c74bb5b24fec028a1d1afba9..30e569718c99b96af4ca33405ecd555b6c0b23ba 100644 --- a/interfaces/common/src/common_func.cpp +++ b/interfaces/common/src/common_func.cpp @@ -20,6 +20,7 @@ #include "bundle_info.h" #include "bundle_mgr_proxy.h" #include "ipc_skeleton.h" +#include "iremote_stub.h" #include "iservice_registry.h" #include "uri.h" #include "system_ability_definition.h" @@ -28,10 +29,10 @@ #include "json_utils.h" using namespace std; - namespace OHOS { namespace AppFileService { using namespace OHOS::AppExecFwk; +using namespace OHOS::DataShare; namespace { const string PACKAGE_NAME_FLAG = ""; const string CURRENT_USER_ID_FLAG = ""; @@ -44,7 +45,26 @@ namespace { const std::vector PUBLIC_DIR_PATHS = { "/Documents" }; + const std::string MEDIALIBRARY_DATA_URI = "datashare:///media"; + const string MEDIA_GRANT_URI_PERMISSION = + "datashare:///media/bundle_permission_insert_operation/bundle_permission_insert_operation"; + const string MEDIA_API_VERSION_10 = "?api_version=10"; + const string PERMISSION_BUNDLE_NAME = "bundle_name"; + const string PERMISSION_FILE_ID = "file_id"; + const string PERMISSION_MODE = "mode"; + const string PERMISSION_TABLE_TYPE = "table_type"; + const string MEDIA_FILE_URI_PHOTO_PREFEX = "file://media/Photo/"; + const string MEDIA_FILE_URI_AUDIO_PREFEX = "file://media/Audio/"; + const string MEDIA_FILE_URI_VIDEO_PREFEX = "file://media/video/"; + const string MEDIA_FILE_URI_IMAGE_PREFEX = "file://media/image/"; + const string MEDIA_FILE_URI_FILE_PREFEX = "file://media/file/"; + const string MEDIA_FILE_URI_Audio_PREFEX = "file://media/audio/"; } +enum MediaFileTable { + FILE_TABLE = 0, + PHOTO_TABLE = 1, + AUDIO_TABLE = 2, +}; std::unordered_map CommonFunc::sandboxPathMap_; static string GetLowerPath(string &lowerPathHead, const string &lowerPathTail, @@ -204,6 +224,109 @@ string CommonFunc::GetUriFromPath(const string &path) realPath = FILE_SCHEME_PREFIX + packageName + realPath; return realPath; } + +static int32_t GetMediaTypeAndApiFromUri(const std::string &uri, bool &isApi10) +{ + if (uri.find(MEDIA_FILE_URI_PHOTO_PREFEX) == 0) { + isApi10 = true; + return MediaFileTable::PHOTO_TABLE; + } else if (uri.find(MEDIA_FILE_URI_VIDEO_PREFEX) == 0 || + uri.find(MEDIA_FILE_URI_IMAGE_PREFEX) == 0) { + return MediaFileTable::PHOTO_TABLE; + } else if (uri.find(MEDIA_FILE_URI_AUDIO_PREFEX) == 0) { + isApi10 = true; + return MediaFileTable::AUDIO_TABLE; + } else if (uri.find(MEDIA_FILE_URI_Audio_PREFEX) == 0) { + return MediaFileTable::AUDIO_TABLE; + } else if (uri.find(MEDIA_FILE_URI_FILE_PREFEX) == 0) { + return MediaFileTable::FILE_TABLE; + } + + return MediaFileTable::FILE_TABLE; +} + +static bool IsAllDigits(string idStr) +{ + for (size_t i = 0; i < idStr.size(); i++) { + if (!isdigit(idStr[i])) { + return false; + } + } + return true; +} + +static string GetIdFromUri(string uri) +{ + string rowNum = ""; + size_t pos = uri.rfind('/'); + if (pos != string::npos) { + rowNum = uri.substr(pos + 1); + if (!IsAllDigits(rowNum)) { + rowNum = ""; + } + } + return rowNum; +} + +string CommonFunc::GetModeFromFlag(unsigned int flag) +{ + string mode = ""; + if (flag & OHOS::AAFwk::Want::FLAG_AUTH_READ_URI_PERMISSION) { + mode += "r"; + } + if (flag & OHOS::AAFwk::Want::FLAG_AUTH_WRITE_URI_PERMISSION) { + mode += "w"; + } + return mode; +} + +int CommonFunc::GetDataShareInfo(const string &uri, const string &bundleName, + DataShareValuesBucket &valuesBucket, bool &isApi10, const string &mode) +{ + string idStr = GetIdFromUri(uri); + if (idStr == "") { + LOGE("FileShare::GetJSArgs get fileId parameter failed!"); + return EINVAL; + } + + int32_t fileId = stoi(idStr); + int32_t filesType = GetMediaTypeAndApiFromUri(uri, isApi10); + valuesBucket.Put(PERMISSION_FILE_ID, fileId); + valuesBucket.Put(PERMISSION_BUNDLE_NAME, bundleName); + valuesBucket.Put(PERMISSION_MODE, mode); + valuesBucket.Put(PERMISSION_TABLE_TYPE, filesType); + + return 0; +} + +int CommonFunc::InsertByDatashare(napi_env env, const DataShareValuesBucket &valuesBucket, bool isApi10) +{ + int ret = -1; + std::shared_ptr dataShareHelper = nullptr; + sptr remote = new IRemoteStub(); + if (remote == nullptr) { + LOGE("FileShare::InsertByDatashare get remoteObject failed!"); + return -ENOMEM; + } + + dataShareHelper = DataShareHelper::Creator(remote->AsObject(), MEDIALIBRARY_DATA_URI); + if (!dataShareHelper) { + LOGE("FileShare::InsertByDatashare connect to datashare failed!"); + return -FileManagement::LibN::E_PERMISSION; + } + string uriStr = MEDIA_GRANT_URI_PERMISSION; + if (isApi10) { + uriStr += MEDIA_API_VERSION_10; + } + + Uri uri(uriStr); + ret = dataShareHelper->Insert(uri, valuesBucket); + if (ret < 0) { + LOGE("FileShare::InsertByDatashare insert failed with error code %{public}d!", ret); + return ret; + } + return ret; +} } // namespace AppFileService } // namespace OHOS diff --git a/interfaces/innerkits/native/BUILD.gn b/interfaces/innerkits/native/BUILD.gn index 6e53db4b53d807eff6de983362539122298852fd..e74e11701dd1323b625ecc2e29f3df15f431b1cf 100644 --- a/interfaces/innerkits/native/BUILD.gn +++ b/interfaces/innerkits/native/BUILD.gn @@ -50,6 +50,9 @@ ohos_shared_library("fileshare_native") { "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core", "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_consumer", + "file_api:filemgmt_libn", "hilog:libhilog", "ipc:ipc_core", "samgr:samgr_proxy", @@ -77,6 +80,9 @@ ohos_shared_library("fileuri_native") { "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core", "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_consumer", + "file_api:filemgmt_libn", "hilog:libhilog", "ipc:ipc_core", "samgr:samgr_proxy", @@ -123,6 +129,9 @@ ohos_shared_library("remote_file_share_native") { "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core", "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_consumer", + "file_api:filemgmt_libn", "hilog:libhilog", "ipc:ipc_core", "samgr:samgr_proxy", diff --git a/interfaces/innerkits/native/file_share/src/file_share.cpp b/interfaces/innerkits/native/file_share/src/file_share.cpp index 5cfea0e65d9ac21e6dcccc07951696d241162de2..d9bd534f4709211ef7dd25b9a231e198aa8f881f 100644 --- a/interfaces/innerkits/native/file_share/src/file_share.cpp +++ b/interfaces/innerkits/native/file_share/src/file_share.cpp @@ -24,6 +24,7 @@ #include "accesstoken_kit.h" #include "common_func.h" +#include "datashare_values_bucket.h" #include "hap_token_info.h" #include "log.h" #include "uri.h" @@ -46,6 +47,7 @@ const string DATA_APP_EL2_PATH = "/data/service/el2/"; const string SHARE_R_PATH = "/r/"; const string SHARE_RW_PATH = "/rw/"; const string SHARE_PATH = "/share/"; +const string MEDIA = "media"; } struct FileShareInfo { @@ -128,6 +130,26 @@ static int32_t GetShareFileType(FileShareInfo &info) return -ENOENT; } +static int32_t GetShareMediaInfo(const string &uri, const string &bundleName, uint32_t flag) +{ + DataShare::DataShareValuesBucket valuesBucket; + bool isApi10; + string mode = CommonFunc::GetModeFromFlag(flag); + int32_t ret = CommonFunc::GetDataShareInfo(uri, bundleName, valuesBucket, isApi10, mode); + if (ret != 0) { + LOGE("Failed to GetDataShareInfo %{public}d", ret); + return ret; + } + + ret = CommonFunc::InsertByDatashare(nullptr, valuesBucket, isApi10); + if (ret != 0) { + LOGE("Failed to InsertByDatashare %{public}d", ret); + return ret; + } + + return 0; +} + static int32_t GetFileShareInfo(const string &uri, uint32_t tokenId, uint32_t flag, FileShareInfo &info) { int32_t ret = 0; @@ -139,6 +161,16 @@ static int32_t GetFileShareInfo(const string &uri, uint32_t tokenId, uint32_t fl GetProviderInfo(uri, info); + if (info.providerBundleName_ == MEDIA) { + ret = GetShareMediaInfo(uri, info.targetBundleName_, flag); + if (ret != 0) { + LOGE("Failed to get lower path %{public}d", ret); + return ret; + } + + return 0; + } + ret = CommonFunc::GetPhysicalPath(uri, info.currentUid_, info.providerLowerPath_); if (ret != 0) { LOGE("Failed to get lower path %{public}d", ret); @@ -220,6 +252,11 @@ int32_t CreateShareFile(const string &uri, uint32_t tokenId, uint32_t flag) return ret; } + if (info.providerBundleName_ == MEDIA) { + LOGI("Create Media Share File Successfully!"); + return 0; + } + if ((ret = PreparePreShareDir(info)) != 0) { LOGE("PreparePreShareDir failed"); return ret; diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index bc8a7129dd510a50fdb575133336b7e132bdf310..8a777b60bc6e5654d52def0fbc71039c3f4b1f64 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -48,6 +48,7 @@ ohos_shared_library("fileshare") { ] sources = [ + "../../common/src/common_func.cpp", "file_share/fileshare_n_exporter.cpp", "file_share/grant_uri_permission.cpp", ] @@ -57,6 +58,8 @@ ohos_shared_library("fileshare") { "ability_base:zuri", "ability_runtime:abilitykit_native", "access_token:libtokenid_sdk", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", "data_share:datashare_common", @@ -67,6 +70,7 @@ ohos_shared_library("fileshare") { "hilog:libhilog", "ipc:ipc_core", "napi:ace_napi", + "samgr:samgr_proxy", ] relative_install_dir = "module" @@ -92,6 +96,8 @@ ohos_shared_library("fileuri") { "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core", "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_consumer", "file_api:filemgmt_libhilog", "file_api:filemgmt_libn", "hilog:libhilog", diff --git a/interfaces/kits/js/file_share/grant_uri_permission.cpp b/interfaces/kits/js/file_share/grant_uri_permission.cpp index bae9c7c2ba4df206b5c5a103de269e65c1c27f40..3271037e53df6fad7bd37008d992862fd5995a74 100644 --- a/interfaces/kits/js/file_share/grant_uri_permission.cpp +++ b/interfaces/kits/js/file_share/grant_uri_permission.cpp @@ -15,7 +15,6 @@ #include "grant_uri_permission.h" #include "ability.h" -#include "datashare_helper.h" #include "datashare_values_bucket.h" #include "ipc_skeleton.h" #include "log.h" @@ -23,6 +22,8 @@ #include "tokenid_kit.h" #include "want.h" +#include "common_func.h" + using namespace OHOS::DataShare; using namespace OHOS::FileManagement::LibN; using namespace OHOS::DistributedFS::ModuleRemoteUri; @@ -30,7 +31,7 @@ using namespace OHOS::DistributedFS::ModuleRemoteUri; namespace OHOS { namespace AppFileService { namespace ModuleFileShare { - enum MediaFileTable { + /*enum MediaFileTable { FILE_TABLE = 0, PHOTO_TABLE = 1, AUDIO_TABLE = 2, @@ -44,7 +45,7 @@ namespace ModuleFileShare { } } return true; - } + }*/ static bool IsSystemApp() { @@ -52,28 +53,8 @@ namespace ModuleFileShare { return Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(fullTokenId); } - static string DealWithUriWithName(string str) + /*static string GetIdFromUri(string uri) { - static uint32_t MEET_COUNT = 6; - uint32_t count = 0; - uint32_t index; - for (index = 0; index < str.length(); index++) { - if (str[index] == '/') { - count++; - } - if (count == MEET_COUNT) { - break; - } - } - if (count == MEET_COUNT) { - str = str.substr(0, index); - } - return str; - } - - static string GetIdFromUri(string uri) - { - uri = DealWithUriWithName(uri); string rowNum = ""; size_t pos = uri.rfind('/'); if (pos != string::npos) { @@ -115,7 +96,7 @@ namespace ModuleFileShare { } return MediaFileTable::FILE_TABLE; - } + }*/ static napi_value GetJSArgs(napi_env env, const NFuncArg &funcArg, DataShareValuesBucket &valuesBucket, bool &isApi10) @@ -144,7 +125,7 @@ namespace ModuleFileShare { string mode; if (NVal(env, funcArg[NARG_POS::THIRD]).TypeIs(napi_number)) { auto [succFlag, flag] = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32(); - mode = GetModeFromFlag(flag); + mode = CommonFunc::GetModeFromFlag(flag); } else if (NVal(env, funcArg[NARG_POS::THIRD]).TypeIs(napi_string)) { auto [succFlag, flag, lenFlag] = NVal(env, funcArg[NARG_POS::THIRD]).ToUTF8String(); mode = string(flag.get()); @@ -154,24 +135,32 @@ namespace ModuleFileShare { return nullptr; } - string idStr = GetIdFromUri(string(path.get())); + /*string idStr = GetIdFromUri(string(path.get())); if (idStr == "") { LOGE("FileShare::GetJSArgs get fileId parameter failed!"); NError(EINVAL).ThrowErr(env); return nullptr; + }*/ + + int ret = CommonFunc::GetDataShareInfo(string(path.get()), string(bundleName.get()), + valuesBucket, isApi10, mode); + if (ret != 0) { + LOGE("FileShare::GetJSArgs GetDataShareInfo failed!"); + NError(ret).ThrowErr(env); + return nullptr; } - int32_t fileId = stoi(idStr); + /*int32_t fileId = stoi(idStr); int32_t filesType = GetMediaTypeAndApiFromUri(string(path.get()), isApi10); valuesBucket.Put(PERMISSION_FILE_ID, fileId); valuesBucket.Put(PERMISSION_BUNDLE_NAME, string(bundleName.get())); valuesBucket.Put(PERMISSION_MODE, mode); - valuesBucket.Put(PERMISSION_TABLE_TYPE, filesType); + valuesBucket.Put(PERMISSION_TABLE_TYPE, filesType);*/ napi_get_boolean(env, true, &result); return result; } - static int InsertByDatashare(napi_env env, const DataShareValuesBucket &valuesBucket, bool isApi10) + /*static int InsertByDatashare(napi_env env, const DataShareValuesBucket &valuesBucket, bool isApi10) { int ret = -1; std::shared_ptr dataShareHelper = nullptr; @@ -198,7 +187,7 @@ namespace ModuleFileShare { return ret; } return ret; - } + }*/ napi_value GrantUriPermission::Async(napi_env env, napi_callback_info info) { @@ -224,7 +213,7 @@ namespace ModuleFileShare { } auto cbExec = [valuesBucket, isApi10, env]() -> NError { - int ret = InsertByDatashare(env, valuesBucket, isApi10); + int ret = CommonFunc::InsertByDatashare(env, valuesBucket, isApi10); if (ret < 0) { LOGE("FileShare::GrantUriPermission InsertByDatashare failed!"); return NError(-ret); diff --git a/interfaces/kits/js/file_share/grant_uri_permission.h b/interfaces/kits/js/file_share/grant_uri_permission.h index d7c654b2723a32db8f2b8888146559ff3b850c13..2c02114bc162fc6001683938d14afa68b894633e 100644 --- a/interfaces/kits/js/file_share/grant_uri_permission.h +++ b/interfaces/kits/js/file_share/grant_uri_permission.h @@ -24,8 +24,8 @@ namespace AppFileService { namespace ModuleFileShare { using namespace std; - -const string MEDIA_GRANT_URI_PERMISSION = +const string GRANT_URI_NAME = "file_share_grant_uri_permission"; +/*const string MEDIA_GRANT_URI_PERMISSION = "datashare:///media/bundle_permission_insert_operation/bundle_permission_insert_operation"; const string MEDIALIBRARY_DATA_URI = "datashare:///media"; const string MEDIA_FILEMODE_READONLY = "r"; @@ -48,7 +48,7 @@ public: FileShareGrantToken() = default; virtual ~FileShareGrantToken() noexcept = default; -}; +};*/ class GrantUriPermission final { public: