From 6a4c1dd6784b74c9f4b617abe8422500312cc5d9 Mon Sep 17 00:00:00 2001 From: BrainL Date: Wed, 14 May 2025 19:57:37 +0800 Subject: [PATCH 1/3] =?UTF-8?q?afs=20taihe=E8=AF=BE=E9=A2=98=E8=A7=A3?= =?UTF-8?q?=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: BrainL --- interfaces/kits/taihe/fileshare/BUILD.gn | 25 +- .../idl/ohos.fileshare.fileShare.taihe | 50 +++ .../taihe/fileshare/idl/ohos.fileshare.taihe | 25 +- .../{grant_permissons.h => fileshare_taihe.h} | 32 +- .../taihe/fileshare/src/ani_constructor.cpp | 6 +- .../taihe/fileshare/src/fileshare_taihe.cpp | 304 ++++++++++++++++++ .../taihe/fileshare/src/grant_permissons.cpp | 106 ------ .../taihe/fileuri/include/fileuri_taihe.h | 3 +- .../kits/taihe/fileuri/src/fileuri_taihe.cpp | 1 - 9 files changed, 408 insertions(+), 144 deletions(-) create mode 100644 interfaces/kits/taihe/fileshare/idl/ohos.fileshare.fileShare.taihe rename interfaces/kits/taihe/fileshare/include/{grant_permissons.h => fileshare_taihe.h} (52%) create mode 100644 interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp delete mode 100644 interfaces/kits/taihe/fileshare/src/grant_permissons.cpp diff --git a/interfaces/kits/taihe/fileshare/BUILD.gn b/interfaces/kits/taihe/fileshare/BUILD.gn index 1fce46dad..f718dc78b 100644 --- a/interfaces/kits/taihe/fileshare/BUILD.gn +++ b/interfaces/kits/taihe/fileshare/BUILD.gn @@ -21,15 +21,18 @@ subsystem_name = "filemanagement" taihe_generated_file_path = "$taihe_file_path/out/$subsystem_name/$part_name/fileshare" copy_taihe_idl("copy_taihe") { - sources = [ "${app_file_service_path}/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.taihe" ] + sources = [ + "${app_file_service_path}/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.fileShare.taihe", + "${app_file_service_path}/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.taihe", + ] } ohos_taihe("run_taihe") { taihe_generated_file_path = "$taihe_generated_file_path" deps = [ ":copy_taihe" ] outputs = [ - "$taihe_generated_file_path/src/ohos.fileshare.ani.cpp", - "$taihe_generated_file_path/src/ohos.fileshare.abi.c", + "$taihe_generated_file_path/src/ohos.fileshare.fileShare.ani.cpp", + "$taihe_generated_file_path/src/ohos.fileshare.fileShare.abi.c", ] } @@ -57,7 +60,7 @@ taihe_shared_library("file_share_taihe") { sources = get_target_outputs(":run_taihe") sources += [ "src/ani_constructor.cpp", - "src/grant_permissons.cpp" + "src/fileshare_taihe.cpp" ] deps = [ @@ -68,6 +71,19 @@ taihe_shared_library("file_share_taihe") { external_deps = [ "hilog:libhilog", "hitrace:hitrace_meter", + "ability_base:want", + "ability_base:zuri", + "ipc:ipc_core", + "access_token:libaccesstoken_sdk", + "access_token:libtokenid_sdk", + "bundle_framework:appexecfwk_base", + "c_utils:utils", + "ability_runtime:abilitykit_native", + "ability_runtime:extensionkit_native", + "ability_runtime:uri_permission_mgr", + "data_share:datashare_common", + "data_share:datashare_consumer", + "file_api:remote_uri_native", ] } @@ -77,7 +93,6 @@ generate_static_abc("file_share_taihe_abc") { is_boot_abc = "True" device_dst_file = "/system/framework/file_share_taihe_abc.abc" dependencies = [ ":run_taihe" ] - } ohos_prebuilt_etc("file_share_etc") { diff --git a/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.fileShare.taihe b/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.fileShare.taihe new file mode 100644 index 000000000..3d8d7a4b4 --- /dev/null +++ b/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.fileShare.taihe @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2025 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +@!namespace("@ohos.fileshare","fileShare") + +@!sts_inject(""" +static { loadLibrary("file_share_taihe.z"); } +""") + +enum OperationMode: i32 { + READ_MODE = 1, + WRITE_MODE = 2, +} + +struct PolicyInfo { + uri: String; + operationMode: i32; +} + +function MakePolicyInfo(uri: String, operationMode: i32): PolicyInfo; + +@gen_promise("activatePermission") +function ActivatePermissionSync( + policies: Array +): void; + +@gen_promise("deactivatePermission") +function DeactivatePermissionSync( + policies: Array +): void; + +@gen_async("grantUriPermission") +@gen_promise("grantUriPermission") +function GrantUriPermissionSync( + uri:String, + bundleName:String, + flag: @sts_type("wantConstant.Flags") Opaque, +): void; diff --git a/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.taihe b/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.taihe index 79ad429ba..203801bc8 100644 --- a/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.taihe +++ b/interfaces/kits/taihe/fileshare/idl/ohos.fileshare.taihe @@ -13,29 +13,8 @@ * limitations under the License. */ -@!namespace("@ohos.fileshare","fileShare") +@!namespace("@ohos.fileshare") @!sts_inject(""" -static { loadLibrary("file_share_taihe.z"); } +import type wantConstant from '@ohos.app.ability.wantConstant'; """) - -enum OperationMode: i32 { - READ_MODE = 1, - WRITE_MODE = 2, -} - -struct PolicyInfo { - uri: String; - operationMode: i32; -} -function makePolicyInfo(uri: String, operationMode: i32): PolicyInfo; - -@gen_promise("activatePermission") -function activatePermissionSync( - policies: Array -): void; - -@gen_promise("deactivatePermission") -function deactivatePermissionSync( - policies: Array -): void; diff --git a/interfaces/kits/taihe/fileshare/include/grant_permissons.h b/interfaces/kits/taihe/fileshare/include/fileshare_taihe.h similarity index 52% rename from interfaces/kits/taihe/fileshare/include/grant_permissons.h rename to interfaces/kits/taihe/fileshare/include/fileshare_taihe.h index 4472ee5a1..532480067 100644 --- a/interfaces/kits/taihe/fileshare/include/grant_permissons.h +++ b/interfaces/kits/taihe/fileshare/include/fileshare_taihe.h @@ -16,16 +16,18 @@ #ifndef FILEMANAGEMENT_APP_FILE_SERVICE_INTERFACES_FILE_SHARE_TAIHE_GRANT_PERMISSONS_H #define FILEMANAGEMENT_APP_FILE_SERVICE_INTERFACES_FILE_SHARE_TAIHE_GRANT_PERMISSONS_H -#include "ohos.fileshare.proj.hpp" -#include "ohos.fileshare.impl.hpp" +#include "ohos.fileshare.fileShare.proj.hpp" +#include "ohos.fileshare.fileShare.impl.hpp" #include "taihe/runtime.hpp" #include "file_permission.h" +#include "iremote_broker.h" namespace ANI::FileShare { - ohos::fileshare::PolicyInfo makePolicyInfo(taihe::string_view uri, int32_t operationMode); - void activatePermissionSync(taihe::array_view policies); - void deactivatePermissionSync(taihe::array_view policies); + ohos::fileshare::fileShare::PolicyInfo MakePolicyInfo(taihe::string_view uri, int32_t operationMode); + void ActivatePermissionSync(taihe::array_view policies); + void DeactivatePermissionSync(taihe::array_view policies); + void GrantUriPermissionSync(taihe::string_view uri, taihe::string_view bundleName, uintptr_t flag); struct PolicyErrorArgs { std::deque errorResults; @@ -33,6 +35,26 @@ namespace ANI::FileShare { ~PolicyErrorArgs() = default; }; + struct UriPermissionInfo { + unsigned int flag; + std::string mode; + std::string bundleName; + std::string uri; + }; + + enum MediaFileTable { + FILE_TABLE = 0, + PHOTO_TABLE = 1, + AUDIO_TABLE = 2, + }; + +class FileShareGrantToken : public OHOS::IRemoteBroker { +public: + DECLARE_INTERFACE_DESCRIPTOR(u"ohos.fileshare.grantUriPermission"); + + FileShareGrantToken() = default; + virtual ~FileShareGrantToken() noexcept = default; +}; } //namespace ANI::FileShare #endif // FILEMANAGEMENT_APP_FILE_SERVICE_INTERFACES_FILE_SHARE_TAIHE_GRANT_PERMISSONS_H diff --git a/interfaces/kits/taihe/fileshare/src/ani_constructor.cpp b/interfaces/kits/taihe/fileshare/src/ani_constructor.cpp index 605757338..773148598 100644 --- a/interfaces/kits/taihe/fileshare/src/ani_constructor.cpp +++ b/interfaces/kits/taihe/fileshare/src/ani_constructor.cpp @@ -15,6 +15,8 @@ #ifndef FILEMANAGEMENT_APP_FILE_SERVICE_INTERFACES_FILE_SHARE_TAIHE_ANI_CONSTRUCTOR_H #define FILEMANAGEMENT_APP_FILE_SERVICE_INTERFACES_FILE_SHARE_TAIHE_ANI_CONSTRUCTOR_H +#include "taihe/runtime.hpp" +#include "ohos.fileshare.fileShare.ani.hpp" #include "ohos.fileshare.ani.hpp" ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) @@ -23,8 +25,8 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) if (ANI_OK != vm->GetEnv(ANI_VERSION_1, &env)) { return ANI_ERROR; } - if (ANI_OK != ohos::fileshare::ANIRegister(env)) { - std::cerr << "Error from ohos::fileshare::ANIRegister" << std::endl; + if (ANI_OK != ohos::fileshare::fileShare::ANIRegister(env)) { + std::cerr << "Error from ohos::fileshare::fileShare::ANIRegister" << std::endl; return ANI_ERROR; } *result = ANI_VERSION_1; diff --git a/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp b/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp new file mode 100644 index 000000000..34829b188 --- /dev/null +++ b/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp @@ -0,0 +1,304 @@ +/* +* Copyright (c) 2025 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "fileshare_taihe.h" +#include +#include "ability.h" +#include "ani.h" +#include "datashare_helper.h" +#include "datashare_values_bucket.h" +#include "ipc_skeleton.h" +#include "log.h" +#include "oh_file_share.h" +#include "remote_uri.h" +#include "tokenid_kit.h" +#include "uri_permission_manager_client.h" +#include "want.h" + +namespace ANI::FileShare { +constexpr int32_t E_PERMISSION_SYS = 202; +constexpr int32_t E_PERMISSION_DENIED = -1; +const std::string MEDIA_FILE_URI_PHOTO_PREFEX = "file://media/Photo/"; +const std::string MEDIA_FILE_URI_AUDIO_PREFEX = "file://media/Audio/"; +const std::string MEDIA_FILE_URI_VIDEO_PREFEX = "file://media/video/"; +const std::string MEDIA_FILE_URI_IMAGE_PREFEX = "file://media/image/"; +const std::string MEDIA_FILE_URI_FILE_PREFEX = "file://media/file/"; +const std::string MEDIA_FILE_URI_Audio_PREFEX = "file://media/audio/"; +const std::string PERMISSION_BUNDLE_NAME = "bundle_name"; +const std::string PERMISSION_FILE_ID = "file_id"; +const std::string PERMISSION_MODE = "mode"; +const std::string PERMISSION_TABLE_TYPE = "table_type"; +const std::string MEDIALIBRARY_DATA_URI = "datashare:///media"; +const std::string MEDIA_GRANT_URI_PERMISSION = + "datashare:///media/bundle_permission_insert_operation/bundle_permission_insert_operation"; +const std::string MEDIA_API_VERSION_10 = "?api_version=10"; +const std::string MEDIA_AUTHORITY = "media"; +const std::string FILE_SCHEME = "file"; +const std::string FILE_MANAGER_AUTHORITY = "docs"; +const std::string FILE_NOPS = ""; +const std::string FILE_READ = "r"; +const std::string FILE_WRITE = "w"; + +ohos::fileshare::fileShare::PolicyInfo MakePolicyInfo(taihe::string_view uri, int32_t operationMode) +{ + return {uri, operationMode}; +} + +static int32_t GetUriPoliciesArg(taihe::array_view policies, + std::vector &uriPolicies) +{ + uint32_t count = policies.size(); + if (count > OHOS::AppFileService::MAX_ARRAY_SIZE) { + LOGE("The length of the array is extra-long"); + return E_PARAMS; + } + for (uint32_t i = 0; i < count; i++) { + OHOS::AppFileService::UriPolicyInfo uriPolicy; + uriPolicy.uri = policies[i].uri; + uriPolicy.mode = policies[i].operationMode; + if (uriPolicy.uri == FlLE_NOPS) { + LOGE("URI is empty"); + return E_PARAMS; + } + if (uriPolicy.mode != READ_MODE && + uriPolicy.mode != (READ_MODE | WRITE_MODE)) { + LOGE("Invalid operation mode"); + return E_PARAMS; + } + uriPolicies.emplace_back(uriPolicy); + } + return E_NO_ERROR; +} + +void ActivatePermissionSync(taihe::array_view policies) +{ + std::vector uriPolicies; + if (GetUriPoliciesArg(policies, uriPolicies)) { + LOGE("Failed to get URI policies"); + taihe::set_business_error(E_PARAMS, "Failed to get URI policies"); + return; + } + + std::shared_ptr arg = std::make_shared(); + if (arg == nullptr) { + LOGE("PolicyErrorArgs make make_shared failed"); + taihe::set_business_error(E_UNKNOWN_ERROR, "PolicyErrorArgs make make_shared failed"); + return; + } + + arg->errNo = OHOS::AppFileService::FilePermission::ActivatePermission(uriPolicies, arg->errorResults); + if (arg->errNo) { + LOGE("Activation failed"); + taihe::set_business_error(arg->errNo, "Activation failed"); + } +} + +void DeactivatePermissionSync(taihe::array_view policies) +{ + std::vector uriPolicies; + if (GetUriPoliciesArg(policies, uriPolicies)) { + LOGE("Failed to get URI policies"); + taihe::set_business_error(E_PARAMS, "Failed to get URI policies"); + return; + } + + std::shared_ptr arg = std::make_shared(); + if (arg == nullptr) { + LOGE("PolicyErrorArgs make make_shared failed"); + taihe::set_business_error(E_UNKNOWN_ERROR, "PolicyErrorArgs make make_shared failed"); + return; + } + + arg->errNo = OHOS::AppFileService::FilePermission::DeactivatePermission(uriPolicies, arg->errorResults); + if (arg->errNo) { + LOGE("Deactivation failed"); + taihe::set_business_error(arg->errNo, "Deactivation failed"); + return; + } +} + +static bool IsSystemApp() +{ + uint64_t fullTokenId = OHOS::IPCSkeleton::GetCallingFullTokenID(); + return OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(fullTokenId); +} + +static int32_t GetIdFromUri(std::string uri) +{ + std::replace(uri.begin(), uri.end(), '/', ' '); + std::stringstream ss(uri); + std::string tmp; + int32_t fileId = E_PERMISSION_DENIED; + ss >> tmp >> tmp >> tmp >> fileId; + return fileId; +} + +static std::string GetModeFromFlag(uint32_t flag) +{ + std::string mode = FlLE_NOPS; + if (flag & OHOS::AAFwk::Want::FLAG_AUTH_READ_URI_PERMISSION) { + mode += FILE_READ; + } + if (flag & OHOS::AAFwk::Want::FLAG_AUTH_WRITE_URI_PERMISSION) { + mode += FILE_WRITE; + } + return mode; +} + +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 int32_t InitValuesBucket(const UriPermissionInfo &uriPermInfo, Uri &uri, bool &isApi10, + OHOS::DataShare::DataShareValuesBucket &valuesBucket) +{ + int32_t fileId = GetIdFromUri(uriPermInfo.uri); + if (fileId == E_PERMISSION_DENIED) { + LOGE("FileShare::InitValuesBucket get fileId parameter failed!"); + return -EINVAL; + } + + int32_t filesType = GetMediaTypeAndApiFromUri(uri.ToString(), isApi10); + valuesBucket.Put(PERMISSION_FILE_ID, fileId); + valuesBucket.Put(PERMISSION_BUNDLE_NAME, uriPermInfo.bundleName); + valuesBucket.Put(PERMISSION_MODE, uriPermInfo.mode); + valuesBucket.Put(PERMISSION_TABLE_TYPE, filesType); + return E_NO_ERROR; +} + +static int32_t InsertByDatashare(const OHOS::DataShare::DataShareValuesBucket &valuesBucket, bool isApi10) +{ + int32_t ret = E_PERMISSION_DENIED; + std::shared_ptr dataShareHelper = nullptr; + OHOS::sptr remote = new OHOS::IRemoteStub(); + if (remote == nullptr) { + LOGE("FileShare::InsertByDatashare get remoteObject failed!"); + return -ENOMEM; + } + + dataShareHelper = OHOS::DataShare::DataShareHelper::Creator(remote->AsObject(), MEDIALIBRARY_DATA_URI); + if (!dataShareHelper) { + LOGE("FileShare::InsertByDatashare connect to datashare failed!"); + return -E_PERMISSION; + } + std::string uriStr = MEDIA_GRANT_URI_PERMISSION; + if (isApi10) { + uriStr += MEDIA_API_VERSION_10; + } + + OHOS::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; +} + +static int32_t GrantInMediaLibrary(const UriPermissionInfo &uriPermInfo, Uri &uri) +{ + bool isApi10 = false; + OHOS::DataShare::DataShareValuesBucket valuesBucket; + int32_t ret = InitValuesBucket(uriPermInfo, uri, isApi10, valuesBucket); + if (ret < 0) { + return ret; + } + + ret = InsertByDatashare(valuesBucket, isApi10); + if (ret < 0) { + return ret; + } + return E_NO_ERROR; +} + +static int32_t DoGrantUriPermission(const UriPermissionInfo &uriPermInfo) +{ + Uri uri(uriPermInfo.uri); + std::string authority = uri.GetAuthority(); + std::string path = uri.GetPath(); + if (authority == MEDIA_AUTHORITY && path.find(".") == std::string::npos) { + return GrantInMediaLibrary(uriPermInfo, uri); + } else { + auto& uriPermissionClient = OHOS::AAFwk::UriPermissionManagerClient::GetInstance(); + int32_t ret = uriPermissionClient.GrantUriPermission(uri, uriPermInfo.flag, + uriPermInfo.bundleName); + if (ret != 0) { + LOGD("uriPermissionClient.GrantUriPermission by uri permission client failed!"); + return GrantInMediaLibrary(uriPermInfo, uri); + } + } + return E_NO_ERROR; +} + +void GrantUriPermissionSync(taihe::string_view uri, taihe::string_view bundleName, uintptr_t flag) +{ + LOGD("fileShare::GrantUriPermission begin!"); + if(!IsSystemApp()) { + LOGE("fileShare::GrantUriPermission is not System App!"); + taihe::set_business_error(E_PERMISSION_SYS, "fileShare::GrantUriPermission is not System App!"); + } + + std::string uri_ = std::string(uri); + OHOS::Uri inputUri(uri_); + std::string scheme = inputUri.GetScheme(); + if (scheme != FILE_SCHEME) { + return; + } + std::string authority = inputUri.GetAuthority(); + if (authority != MEDIA_AUTHORITY && authority != FILE_MANAGER_AUTHORITY) { + return; + } + + ani_env *env = taihe::get_env(); + ani_enum_item enumItem = reinterpret_cast(flag); + ani_int result; + env->EnumItem_GetValue_Int(enumItem, &result); + + UriPermissionInfo uriPermInfo; + uriPermInfo.uri = uri; + uriPermInfo.bundleName = bundleName; + uriPermInfo.flag = result; + uriPermInfo.mode = GetModeFromFlag((int32_t)result); + + int ret = DoGrantUriPermission(uriPermInfo); + if (ret < 0) { + LOGE("fileShare::GrantUriPermission DoGrantUriPermission failed with %{public}d", ret); + taihe::set_business_error(-ret, "fileShare::GrantUriPermission failed"); + } +} +} // namespace + +// NOLINTBEGIN +TH_EXPORT_CPP_API_MakePolicyInfo(ANI::FileShare::MakePolicyInfo); +TH_EXPORT_CPP_API_ActivatePermissionSync(ANI::FileShare::ActivatePermissionSync); +TH_EXPORT_CPP_API_DeactivatePermissionSync(ANI::FileShare::DeactivatePermissionSync); +TH_EXPORT_CPP_API_GrantUriPermissionSync(ANI::FileShare::GrantUriPermissionSync); + // NOLINTEND diff --git a/interfaces/kits/taihe/fileshare/src/grant_permissons.cpp b/interfaces/kits/taihe/fileshare/src/grant_permissons.cpp deleted file mode 100644 index 47477fb71..000000000 --- a/interfaces/kits/taihe/fileshare/src/grant_permissons.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* -* Copyright (c) 2025 Huawei Device Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -#include "grant_permissons.h" -#include "log.h" -#include "oh_file_share.h" -#include - -namespace ANI::FileShare { - -ohos::fileshare::PolicyInfo makePolicyInfo(taihe::string_view uri, int32_t operationMode) -{ - return {uri, operationMode}; -} - -int32_t getUriPoliciesArg(taihe::array_view policies, - std::vector &uriPolicies) -{ - uint32_t count = policies.size(); - if (count > OHOS::AppFileService::MAX_ARRAY_SIZE) { - LOGE("The length of the array is extra-long"); - return E_PARAMS; - } - for (uint32_t i = 0; i < count; i++) { - OHOS::AppFileService::UriPolicyInfo uriPolicy; - uriPolicy.uri = policies[i].uri; - uriPolicy.mode = policies[i].operationMode; - if (uriPolicy.uri == "") { - LOGE("URI is empty"); - return E_PARAMS; - } - if (uriPolicy.mode != READ_MODE && - uriPolicy.mode != (READ_MODE | WRITE_MODE)) { - LOGE("Invalid operation mode"); - return E_PARAMS; - } - uriPolicies.emplace_back(uriPolicy); - } - return E_NO_ERROR; -} - -void activatePermissionSync(taihe::array_view policies) -{ - std::vector uriPolicies; - if (getUriPoliciesArg(policies, uriPolicies)) { - LOGE("Failed to get URI policies"); - taihe::set_business_error(E_PARAMS, "Failed to get URI policies"); - return ; - } - - std::shared_ptr arg = std::make_shared(); - if (arg == nullptr) { - LOGE("PolicyErrorArgs make make_shared failed"); - taihe::set_business_error(E_UNKNOWN_ERROR, "PolicyErrorArgs make make_shared failed"); - return ; - } - - arg->errNo = OHOS::AppFileService::FilePermission::ActivatePermission(uriPolicies, arg->errorResults); - if (arg->errNo) { - LOGE("Activation failed"); - taihe::set_business_error(arg->errNo, "Activation failed"); - } -} - -void deactivatePermissionSync(taihe::array_view policies) -{ - std::vector uriPolicies; - if (getUriPoliciesArg(policies, uriPolicies)) { - LOGE("Failed to get URI policies"); - taihe::set_business_error(E_PARAMS, "Failed to get URI policies"); - return ; - } - - std::shared_ptr arg = std::make_shared(); - if (arg == nullptr) { - LOGE("PolicyErrorArgs make make_shared failed"); - taihe::set_business_error(E_UNKNOWN_ERROR, "PolicyErrorArgs make make_shared failed"); - return ; - } - - arg->errNo = OHOS::AppFileService::FilePermission::DeactivatePermission(uriPolicies, arg->errorResults); - if (arg->errNo) { - LOGE("Deactivation failed"); - taihe::set_business_error(arg->errNo, "Deactivation failed"); - return ; - } -} -} // namespace ANI::FileShare - -// NOLINTBEGIN -TH_EXPORT_CPP_API_makePolicyInfo(ANI::FileShare::makePolicyInfo); -TH_EXPORT_CPP_API_activatePermissionSync(ANI::FileShare::activatePermissionSync); -TH_EXPORT_CPP_API_deactivatePermissionSync(ANI::FileShare::deactivatePermissionSync); - // NOLINTEND diff --git a/interfaces/kits/taihe/fileuri/include/fileuri_taihe.h b/interfaces/kits/taihe/fileuri/include/fileuri_taihe.h index 07658dc53..559582c6b 100644 --- a/interfaces/kits/taihe/fileuri/include/fileuri_taihe.h +++ b/interfaces/kits/taihe/fileuri/include/fileuri_taihe.h @@ -39,7 +39,6 @@ private: ohos::file::fileuri::FileUri makeFileUri(taihe::string_view name); std::string getUriFromPath(taihe::string_view path); - -} +} // ANI::FileUri #endif // INTERFACES_KITS_TAIHE_INCLUDE_FILEURI_TAIHE_H diff --git a/interfaces/kits/taihe/fileuri/src/fileuri_taihe.cpp b/interfaces/kits/taihe/fileuri/src/fileuri_taihe.cpp index ac9cedf5a..4206dde12 100644 --- a/interfaces/kits/taihe/fileuri/src/fileuri_taihe.cpp +++ b/interfaces/kits/taihe/fileuri/src/fileuri_taihe.cpp @@ -42,7 +42,6 @@ std::string FileUriImpl::getName() return sandboxPath.substr(posLast + 1); } - ohos::file::fileuri::FileUri makeFileUri(taihe::string_view name) { return taihe::make_holder(name); -- Gitee From fd8f8398859406a687fa08393c6ec4f3896cefb4 Mon Sep 17 00:00:00 2001 From: BrainL Date: Wed, 14 May 2025 20:16:47 +0800 Subject: [PATCH 2/3] check code Signed-off-by: BrainL --- interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp b/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp index 34829b188..37ae51813 100644 --- a/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp +++ b/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp @@ -35,7 +35,7 @@ const std::string MEDIA_FILE_URI_AUDIO_PREFEX = "file://media/Audio/"; const std::string MEDIA_FILE_URI_VIDEO_PREFEX = "file://media/video/"; const std::string MEDIA_FILE_URI_IMAGE_PREFEX = "file://media/image/"; const std::string MEDIA_FILE_URI_FILE_PREFEX = "file://media/file/"; -const std::string MEDIA_FILE_URI_Audio_PREFEX = "file://media/audio/"; +const std::string MEDIA_FILE_URI_AUDIO_LOW_PREFEX = "file://media/audio/"; const std::string PERMISSION_BUNDLE_NAME = "bundle_name"; const std::string PERMISSION_FILE_ID = "file_id"; const std::string PERMISSION_MODE = "mode"; @@ -168,7 +168,7 @@ static int32_t GetMediaTypeAndApiFromUri(const std::string &uri, bool &isApi10) } 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) { + } else if (uri.find(MEDIA_FILE_URI_AUDIO_LOW_PREFEX) == 0) { return MediaFileTable::AUDIO_TABLE; } else if (uri.find(MEDIA_FILE_URI_FILE_PREFEX) == 0) { return MediaFileTable::FILE_TABLE; @@ -250,7 +250,7 @@ static int32_t DoGrantUriPermission(const UriPermissionInfo &uriPermInfo) auto& uriPermissionClient = OHOS::AAFwk::UriPermissionManagerClient::GetInstance(); int32_t ret = uriPermissionClient.GrantUriPermission(uri, uriPermInfo.flag, uriPermInfo.bundleName); - if (ret != 0) { + if (ret != E_NO_ERROR) { LOGD("uriPermissionClient.GrantUriPermission by uri permission client failed!"); return GrantInMediaLibrary(uriPermInfo, uri); } @@ -261,7 +261,7 @@ static int32_t DoGrantUriPermission(const UriPermissionInfo &uriPermInfo) void GrantUriPermissionSync(taihe::string_view uri, taihe::string_view bundleName, uintptr_t flag) { LOGD("fileShare::GrantUriPermission begin!"); - if(!IsSystemApp()) { + if (!IsSystemApp()) { LOGE("fileShare::GrantUriPermission is not System App!"); taihe::set_business_error(E_PERMISSION_SYS, "fileShare::GrantUriPermission is not System App!"); } -- Gitee From 7818a7451d668d040d28aa8e0456bc66a29e8e37 Mon Sep 17 00:00:00 2001 From: BrainL Date: Wed, 14 May 2025 21:10:40 +0800 Subject: [PATCH 3/3] fix code check Signed-off-by: BrainL --- interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp b/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp index 37ae51813..9460fc89b 100644 --- a/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp +++ b/interfaces/kits/taihe/fileshare/src/fileshare_taihe.cpp @@ -68,7 +68,7 @@ static int32_t GetUriPoliciesArg(taihe::array_view