From 7c11bd965064c3b62a203ce17c16990a3374abb3 Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Tue, 10 Jun 2025 12:02:42 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8C=91=E5=8D=95=E4=B8=BB=E5=B9=B2uriPerm?= =?UTF-8?q?ission?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhang_hao_zheng Change-Id: I6a0199be130dc2b35cae8e2bb49a0ccfdd933c66 --- frameworks/ets/ani/BUILD.gn | 2 + .../ets/ani/uri_permission_manager/BUILD.gn | 105 ++++++ ...@ohos.application.uriPermissionManager.ets | 119 +++++++ .../include/sts_uri_perm_mgr.h | 36 +++ .../src/sts_uri_perm_mgr.cpp | 298 ++++++++++++++++++ 5 files changed, 560 insertions(+) create mode 100644 frameworks/ets/ani/uri_permission_manager/BUILD.gn create mode 100644 frameworks/ets/ani/uri_permission_manager/ets/@ohos.application.uriPermissionManager.ets create mode 100644 frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h create mode 100644 frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp diff --git a/frameworks/ets/ani/BUILD.gn b/frameworks/ets/ani/BUILD.gn index c1c6b1870d8..748942f5611 100644 --- a/frameworks/ets/ani/BUILD.gn +++ b/frameworks/ets/ani/BUILD.gn @@ -17,5 +17,7 @@ import("//foundation/ability/ability_runtime/ability_runtime.gni") group("ani_packages") { deps = [ "${ability_runtime_path}/frameworks/ets/ani/ani_common:ani_common", + "${ability_runtime_path}/frameworks/ets/ani/uri_permission_manager:uri_permission_manager_abc_etc", + "${ability_runtime_path}/frameworks/ets/ani/uri_permission_manager:uri_permission_manager_ani_kit", ] } diff --git a/frameworks/ets/ani/uri_permission_manager/BUILD.gn b/frameworks/ets/ani/uri_permission_manager/BUILD.gn new file mode 100644 index 00000000000..45039ec05ed --- /dev/null +++ b/frameworks/ets/ani/uri_permission_manager/BUILD.gn @@ -0,0 +1,105 @@ +# 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. + +import("//build/config/components/ets_frontend/ets2abc_config.gni") +import("//build/ohos.gni") +import("//foundation/ability/ability_runtime/ability_runtime.gni") + +ohos_shared_library("uri_permission_manager_ani_kit") { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + + include_dirs = [ + "./include", + "${ability_runtime_path}/frameworks/ets/ani/enum_convert", + "${ability_runtime_path}/frameworks/js/napi/uri_permission", + "${ability_runtime_path}/interfaces/kits/native/ability/native", + "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/app", + "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", + "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/ability_delegator/include", + "${ability_runtime_services_path}/common/include", + ] + configs = [] + + public_configs = [] + + sources = [ "./src/sts_uri_perm_mgr.cpp" ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + deps = [ + "${ability_runtime_innerkits_path}/ability_manager:ability_manager", + "${ability_runtime_innerkits_path}/ability_manager:ability_start_options", + "${ability_runtime_innerkits_path}/error_utils:ability_runtime_error_util", + "${ability_runtime_innerkits_path}/runtime:runtime", + "${ability_runtime_innerkits_path}/uri_permission:uri_permission_mgr", + "${ability_runtime_path}/frameworks/ets/ani/ani_common:ani_common", + "${ability_runtime_napi_path}/inner/napi_common:napi_common", + "${ability_runtime_native_path}/ability/native:abilitykit_native", + "${ability_runtime_native_path}/ability/native:ability_business_error", + "${ability_runtime_native_path}/appkit:app_context", + "${ability_runtime_native_path}/appkit:appkit_delegator", + "${ability_runtime_native_path}/appkit:delegator_mgmt", + ] + + external_deps = [ + "ability_base:want", + "ability_base:zuri", + "access_token:libtokenid_sdk", + "bundle_framework:appexecfwk_base", + "c_utils:utils", + "common_event_service:cesfwk_innerkits", + "eventhandler:libeventhandler", + "hilog:libhilog", + "init:libbegetutil", + "ipc:ipc_core", + "ipc:ipc_napi", + "json:nlohmann_json_static", + "napi:ace_napi", + "runtime_core:ani", + ] + + public_external_deps = [ "ability_base:configuration" ] + + innerapi_tags = [ "platformsdk" ] + subsystem_name = "ability" + part_name = "ability_runtime" +} + +generate_static_abc("uri_permission_manager_abc") { + base_url = "./ets" + + files = [ "./ets/@ohos.application.uriPermissionManager.ets" ] + + dst_file = "$target_out_dir/uri_permission_manager.abc" + out_puts = [ "$target_out_dir/uri_permission_manager.abc" ] + + is_boot_abc = "True" + device_dst_file = "/system/framework/uri_permission_manager.abc" +} + +ohos_prebuilt_etc("uri_permission_manager_abc_etc") { + source = "$target_out_dir/uri_permission_manager.abc" + module_install_dir = "framework" + subsystem_name = "ability" + part_name = "ability_runtime" + deps = [ ":uri_permission_manager_abc" ] +} \ No newline at end of file diff --git a/frameworks/ets/ani/uri_permission_manager/ets/@ohos.application.uriPermissionManager.ets b/frameworks/ets/ani/uri_permission_manager/ets/@ohos.application.uriPermissionManager.ets new file mode 100644 index 00000000000..c586a2cca39 --- /dev/null +++ b/frameworks/ets/ani/uri_permission_manager/ets/@ohos.application.uriPermissionManager.ets @@ -0,0 +1,119 @@ +/* + * 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. + */ + +import wantConstant from '@ohos.app.ability.wantConstant'; +import { BusinessError, AsyncCallback } from '@ohos.base'; + +export class AsyncCallbackWrapper { + myFun_:AsyncCallback = (err: BusinessError, data: T) => {} + + constructor(myFun:AsyncCallback){ + this.myFun_ = myFun; + } + + invoke(err: BusinessError, data: T) : void { + this.myFun_(err, data); + } +} + +export default namespace uriPermissionManager { + loadLibrary("uri_permission_manager_ani_kit.z"); + + export native function grantUriPermissionCallbackSync(uri: string, flag: wantConstant.Flags, targetBundleName: string, + appCloneIndex: number, callback: AsyncCallbackWrapper): void; + export native function revokeUriPermissionCallbackSync(uri: string, targetBundleName: string, appCloneIndex: number, + callback: AsyncCallbackWrapper): void; + + export function grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string): Promise { + let p:Promise = new Promise((resolve: (data: number)=>void, reject:(err: BusinessError)=>void):void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError, data: number)=>{ + if (err.code == 0) { + resolve(data); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + uriPermissionManager.grantUriPermissionCallbackSync(uri, flag, targetBundleName, 0, myCall); + }); + }); + return p; + } + + export function grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string, + appCloneIndex: number): Promise { + let p:Promise = new Promise((resolve: (data:undefined)=>void, reject:(err: BusinessError)=>void):void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError, data: number)=>{ + if (err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + uriPermissionManager.grantUriPermissionCallbackSync(uri, + flag, targetBundleName, appCloneIndex, myCall); + }); + }); + return p; + } + + export function grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string, + callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + uriPermissionManager.grantUriPermissionCallbackSync(uri, flag, targetBundleName, 0, myCall); + }) + } + + export function revokeUriPermission(uri: string, targetBundleName: string): Promise { + let p:Promise = new Promise((resolve: (data: number)=>void, reject:(err: BusinessError)=>void):void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError, data: number)=>{ + if (err.code == 0) { + resolve(data); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + uriPermissionManager.revokeUriPermissionCallbackSync(uri, targetBundleName, 0, myCall); + }); + }); + return p; + } + + export function revokeUriPermission(uri: string, targetBundleName: string, appCloneIndex: number): Promise { + let p:Promise = new Promise((resolve: (data:undefined)=>void, reject:(err: BusinessError)=>void):void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError, data: number)=>{ + if (err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + uriPermissionManager.revokeUriPermissionCallbackSync(uri, targetBundleName, appCloneIndex, myCall); + }); + }); + return p; + } + + export function revokeUriPermission(uri: string, targetBundleName: string, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + uriPermissionManager.revokeUriPermissionCallbackSync(uri, targetBundleName, 0, myCall); + }) + } +} \ No newline at end of file diff --git a/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h b/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h new file mode 100644 index 00000000000..0972a72bb5a --- /dev/null +++ b/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h @@ -0,0 +1,36 @@ +/* + * 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. + */ + +#ifndef OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H +#define OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H + +#include "sts_runtime.h" + +namespace OHOS { +namespace AbilityRuntime { +static void grantUriPermissionCallbackSync([[maybe_unused]]ani_env *env, + ani_string uri, ani_enum_item flagEnum, ani_string targetName, ani_double appCloneIndex, ani_object callback); +static void revokeUriPermissionCallbackSync([[maybe_unused]]ani_env *env, + ani_string uri, ani_string targetName, ani_double appCloneIndex, ani_object callback); +void CreateJsUriPermMgr(ani_env *env); +bool AsyncCallback(ani_env *env, ani_object call, ani_object error, ani_object result); +ani_object WrapBusinessError(ani_env *env, ani_int code); +ani_object WrapError(ani_env *env, const std::string &msg); +ani_string GetAniString(ani_env *env, const std::string &str); +ani_object createDouble(ani_env *env, int32_t res); +std::string GetErrMsg(int32_t err, const std::string &permission = ""); +} // namespace AbilityRuntime +} // namespace OHOS +#endif // OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H \ No newline at end of file diff --git a/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp b/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp new file mode 100644 index 00000000000..638650677fb --- /dev/null +++ b/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp @@ -0,0 +1,298 @@ +/* + * 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 "sts_uri_perm_mgr.h" + +#include "ability_business_error.h" +#include "ability_manager_errors.h" +#include "ability_runtime_error_util.h" +#include "ani_enum_convert.h" +#include "hilog_tag_wrapper.h" +#include "ipc_skeleton.h" +#include "js_error_utils.h" +#include "js_runtime_utils.h" +#include "napi_common_util.h" +#include "parameters.h" +#include "tokenid_kit.h" +#include "uri.h" +#include "uri_permission_manager_client.h" +#include "sts_runtime.h" +#include "sts_error_utils.h" + +namespace OHOS { +namespace AbilityRuntime { +namespace { +constexpr const char* WRAPPER_CLASS_NAME = "Lutils/AbilityUtils/AsyncCallbackWrapper;"; +constexpr const char* ERROR_CLASS_NAME = "Lescompat/Error;"; +constexpr const char* BUSINESS_ERROR_CLASS_NAME = "L@ohos/base/BusinessError;"; +} +const char *INVOKE_METHOD_NAME = "invoke"; +const int32_t ERR_OK = 0; +const int32_t ERR_FAILURE = -1; +constexpr const char* NOT_SYSTEM_APP = "The application is not system-app, can not use system-api."; + +static std::string GetStdString(ani_env* env, ani_string str) +{ + std::string result; + ani_size sz {}; + env->String_GetUTF8Size(str, &sz); + result.resize(sz + 1); + env->String_GetUTF8SubString(str, 0, sz, result.data(), result.size(), &sz); + result.resize(sz); + return result; +} + +static void grantUriPermissionCallbackSync([[maybe_unused]]ani_env *env, + ani_string uri, ani_enum_item flagEnum, ani_string targetName, ani_double appCloneIndex, ani_object callback) +{ + TAG_LOGI(AAFwkTag::URIPERMMGR, "grantUriPermissionCallbackSync run"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "env null"); + return; + } + auto selfToken = IPCSkeleton::GetSelfTokenID(); + ani_object stsErrCode = CreateStsError(env, AbilityErrorCode::ERROR_OK); + if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "app not system-app"); + stsErrCode = CreateStsError(env, static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), + NOT_SYSTEM_APP); + AsyncCallback(env, callback, stsErrCode, createDouble(env, ERR_FAILURE)); + return; + } + std::string uriStr = GetStdString(env, uri); + Uri uriVec(uriStr); + ani_int flag = 0; + AAFwk::AniEnumConvertUtil::EnumConvertStsToNative(env, flagEnum, flag); + int32_t flagId = static_cast(flag); + std::string targetBundleName = GetStdString(env, targetName); + int32_t appCloneIndexId = static_cast(appCloneIndex); + int32_t errCode = ERR_OK; + int32_t result = ERR_OK; + errCode = AAFwk::UriPermissionManagerClient::GetInstance().GrantUriPermission(uriVec, flagId, + targetBundleName, appCloneIndexId); + if (errCode != ERR_OK) { + result = ERR_FAILURE; + stsErrCode = CreateStsErrorByNativeErr(env, errCode); + } + + AsyncCallback(env, callback, stsErrCode, createDouble(env, result)); +} + +static void revokeUriPermissionCallbackSync([[maybe_unused]]ani_env *env, + ani_string uri, ani_string targetName, ani_double appCloneIndex, ani_object callback) +{ + TAG_LOGI(AAFwkTag::URIPERMMGR, "revokeUriPermissionCallbackSync run"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "env null"); + return; + } + auto selfToken = IPCSkeleton::GetSelfTokenID(); + ani_object stsErrCode = CreateStsError(env, AbilityErrorCode::ERROR_OK); + if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "app not system-app"); + stsErrCode = CreateStsError(env, static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), + NOT_SYSTEM_APP); + AsyncCallback(env, callback, stsErrCode, createDouble(env, ERR_FAILURE)); + return; + } + std::string uriStr = GetStdString(env, uri); + Uri uriVec(uriStr); + std::string targetBundleName = GetStdString(env, targetName); + int32_t errCode = ERR_OK; + int32_t result = ERR_OK; + errCode = AAFwk::UriPermissionManagerClient::GetInstance().RevokeUriPermissionManually(uriVec, + targetBundleName, appCloneIndex); + if (errCode != ERR_OK) { + result = ERR_FAILURE; + stsErrCode = CreateStsErrorByNativeErr(env, errCode); + } + AsyncCallback(env, callback, stsErrCode, createDouble(env, result)); +} + +ani_object createDouble(ani_env *env, int32_t res) +{ +static const char *className = "Lstd/core/Double;"; +ani_class persion_cls; +if (ANI_OK != env->FindClass(className, &persion_cls)) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "create double error"); + return nullptr; +} +ani_method persionInfoCtor; +env->Class_FindMethod(persion_cls, "", "D:V", &persionInfoCtor); +ani_object persionInfoObj; +env->Object_New(persion_cls, persionInfoCtor, &persionInfoObj, ani_double(res)); +return persionInfoObj; +} + +void StsUriPermissionManagerInit(ani_env *env) +{ + TAG_LOGI(AAFwkTag::URIPERMMGR, "StsUriPermissionManagerInit call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "Invalid param"); + } + ani_namespace ns; + const char* targetNamespace = "L@ohos/application/uriPermissionManager/uriPermissionManager;"; + if (env->FindNamespace(targetNamespace, &ns) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "FindNamespace failed"); + } + std::array functions = { + ani_native_function { + "grantUriPermissionCallbackSync", + "Lstd/core/String;L@ohos/app/ability/wantConstant/wantConstant/Flags;Lstd/core/String;D" + "L@ohos/application/uriPermissionManager/AsyncCallbackWrapper;:V", + reinterpret_cast(grantUriPermissionCallbackSync) + }, + ani_native_function { + "revokeUriPermissionCallbackSync", + "Lstd/core/String;Lstd/core/String;D" + "L@ohos/application/uriPermissionManager/AsyncCallbackWrapper;:V", + reinterpret_cast(revokeUriPermissionCallbackSync) + }, + }; + TAG_LOGI(AAFwkTag::URIPERMMGR, "StsUriPermissionManagerInit bind functions"); + if (env->Namespace_BindNativeFunctions(ns, functions.data(), functions.size()) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "Namespace_BindNativeFunctions failed"); + }; + TAG_LOGI(AAFwkTag::URIPERMMGR, "StsUriPermissionManagerInit success"); +} + +extern "C"{ +ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) +{ + TAG_LOGI(AAFwkTag::URIPERMMGR, "ANI_Constructor"); + ani_env *env = nullptr; + ani_status status = ANI_ERROR; + status = vm->GetEnv(ANI_VERSION_1, &env); + if (status != ANI_OK) { + TAG_LOGI(AAFwkTag::URIPERMMGR, "GetEnv failed status: %{public}d", status); + return ANI_NOT_FOUND; + } + + StsUriPermissionManagerInit(env); + *result = ANI_VERSION_1; + TAG_LOGI(AAFwkTag::URIPERMMGR, "ANI_Constructor finish"); + return ANI_OK; +} +} + +bool AsyncCallback(ani_env *env, ani_object call, ani_object error, ani_object result) +{ + ani_status status = ANI_ERROR; + ani_class clsCall {}; + + if ((status = env->FindClass(WRAPPER_CLASS_NAME, &clsCall)) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "status: %{public}d", status); + return false; + } + ani_method method = {}; + if ((status = env->Class_FindMethod( + clsCall, INVOKE_METHOD_NAME, "L@ohos/base/BusinessError;Lstd/core/Object;:V", &method)) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "status: %{public}d", status); + return false; + } + if (result == nullptr) { + ani_ref nullRef = nullptr; + env->GetNull(&nullRef); + result = reinterpret_cast(nullRef); + } + if ((status = env->Object_CallMethod_Void(call, method, error, result)) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "status: %{public}d", status); + return false; + } + return true; +} + +ani_object WrapError(ani_env *env, const std::string &msg) +{ + ani_class cls {}; + ani_method method {}; + ani_object obj = nullptr; + ani_status status = ANI_ERROR; + if (env == nullptr) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "null env"); + return nullptr; + } + ani_string aniMsg = GetAniString(env, msg); + ani_ref undefRef; + env->GetUndefined(&undefRef); + if ((status = env->FindClass(ERROR_CLASS_NAME, &cls)) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "statys: %{public}d", status); + return nullptr; + } + if ((status = env->Class_FindMethod(cls, "", "Lstd/core/String;Lescompat/ErrorOptions;:V", &method)) != + ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "status: %{public}d", status); + return nullptr; + } + if ((status = env->Object_New(cls, method, &obj, aniMsg, undefRef)) != ANI_OK) { + TAG_LOGE(AAFwkTag::URIPERMMGR, "status: %{public}d", status); + return nullptr; + } + return obj; +} + +ani_string GetAniString(ani_env *env, const std::string &str) +{ + ani_string aniStr = nullptr; + ani_status status = env->String_NewUTF8(str.c_str(), str.size(), &aniStr); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::JSNAPI, "status : %{public}d", status); + return nullptr; + } + return aniStr; +} + +ani_object WrapBusinessError(ani_env *env, int32_t code) +{ + ani_class cls {}; + ani_method method {}; + ani_object obj = nullptr; + ani_status status = ANI_ERROR; + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + return nullptr; + } + if ((status = env->FindClass(BUSINESS_ERROR_CLASS_NAME, &cls)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UIABILITY, "status : %{public}d", status); + return nullptr; + } + if ((status = env->Class_FindMethod(cls, "", "DLescompat/Error;:V", &method)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UIABILITY, "status : %{public}d", status); + return nullptr; + } + ani_object error = WrapError(env, GetErrMsg(code)); + if (error == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "error nulll"); + return nullptr; + } + ani_double dCode(code); + if ((status = env->Object_New(cls, method, &obj, dCode, error)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UIABILITY, "status : %{public}d", status); + return nullptr; + } + return obj; +} + +std::string GetErrMsg(int32_t err, const std::string &permission) +{ + auto errCode = GetJsErrorCodeByNativeError(err); + auto errMsg = (errCode == AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED && !permission.empty()) + ? GetNoPermissionErrorMsg(permission) + : GetErrorMsg(errCode); + return errMsg; +} + +} // namespace AbilityRuntime +} // namespace OHOS \ No newline at end of file -- Gitee From 11b67c897defd0462221a5ffc15266a5eddebb1c Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Tue, 10 Jun 2025 14:39:06 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=BC=95=E7=94=A8sts=5Fr?= =?UTF-8?q?untime=E4=B8=BAets=5Fruntime=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhang_hao_zheng Change-Id: I532c97fab2d430237c2afb9aafd49b8753194f98 --- .../ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h | 2 +- .../ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h b/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h index 0972a72bb5a..7b58de388e4 100644 --- a/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h +++ b/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h @@ -16,7 +16,7 @@ #ifndef OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H #define OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H -#include "sts_runtime.h" +#include "ets_runtime.h" namespace OHOS { namespace AbilityRuntime { diff --git a/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp b/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp index 638650677fb..31299c3c0c1 100644 --- a/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp +++ b/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp @@ -28,7 +28,6 @@ #include "tokenid_kit.h" #include "uri.h" #include "uri_permission_manager_client.h" -#include "sts_runtime.h" #include "sts_error_utils.h" namespace OHOS { -- Gitee From bd0c2635d794654920077f133e8f451a03b64ce7 Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Tue, 10 Jun 2025 14:57:26 +0800 Subject: [PATCH 3/3] =?UTF-8?q?error=E4=B8=8E=E8=87=AA=E8=BA=AB=E6=9B=B4?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhang_hao_zheng Change-Id: I400102b7c8a2bc3fd1f84585fc1d23894851a2d9 --- .../ets/ani/uri_permission_manager/BUILD.gn | 2 +- ...{sts_uri_perm_mgr.h => ets_uri_perm_mgr.h} | 6 ++-- ..._uri_perm_mgr.cpp => ets_uri_perm_mgr.cpp} | 36 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) rename frameworks/ets/ani/uri_permission_manager/include/{sts_uri_perm_mgr.h => ets_uri_perm_mgr.h} (91%) rename frameworks/ets/ani/uri_permission_manager/src/{sts_uri_perm_mgr.cpp => ets_uri_perm_mgr.cpp} (90%) diff --git a/frameworks/ets/ani/uri_permission_manager/BUILD.gn b/frameworks/ets/ani/uri_permission_manager/BUILD.gn index 45039ec05ed..80b2d356168 100644 --- a/frameworks/ets/ani/uri_permission_manager/BUILD.gn +++ b/frameworks/ets/ani/uri_permission_manager/BUILD.gn @@ -38,7 +38,7 @@ ohos_shared_library("uri_permission_manager_ani_kit") { public_configs = [] - sources = [ "./src/sts_uri_perm_mgr.cpp" ] + sources = [ "./src/ets_uri_perm_mgr.cpp" ] cflags = [] if (target_cpu == "arm") { diff --git a/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h b/frameworks/ets/ani/uri_permission_manager/include/ets_uri_perm_mgr.h similarity index 91% rename from frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h rename to frameworks/ets/ani/uri_permission_manager/include/ets_uri_perm_mgr.h index 7b58de388e4..536908b02e9 100644 --- a/frameworks/ets/ani/uri_permission_manager/include/sts_uri_perm_mgr.h +++ b/frameworks/ets/ani/uri_permission_manager/include/ets_uri_perm_mgr.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H -#define OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H +#ifndef OHOS_ABILITY_RUNTIME_ETS_URI_PERM_MGR_H +#define OHOS_ABILITY_RUNTIME_ETS_URI_PERM_MGR_H #include "ets_runtime.h" @@ -33,4 +33,4 @@ ani_object createDouble(ani_env *env, int32_t res); std::string GetErrMsg(int32_t err, const std::string &permission = ""); } // namespace AbilityRuntime } // namespace OHOS -#endif // OHOS_ABILITY_RUNTIME_STS_URI_PERM_MGR_H \ No newline at end of file +#endif // OHOS_ABILITY_RUNTIME_ETS_URI_PERM_MGR_H \ No newline at end of file diff --git a/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp b/frameworks/ets/ani/uri_permission_manager/src/ets_uri_perm_mgr.cpp similarity index 90% rename from frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp rename to frameworks/ets/ani/uri_permission_manager/src/ets_uri_perm_mgr.cpp index 31299c3c0c1..728cb0432ee 100644 --- a/frameworks/ets/ani/uri_permission_manager/src/sts_uri_perm_mgr.cpp +++ b/frameworks/ets/ani/uri_permission_manager/src/ets_uri_perm_mgr.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "sts_uri_perm_mgr.h" +#include "ets_uri_perm_mgr.h" #include "ability_business_error.h" #include "ability_manager_errors.h" @@ -28,7 +28,7 @@ #include "tokenid_kit.h" #include "uri.h" #include "uri_permission_manager_client.h" -#include "sts_error_utils.h" +#include "ets_error_utils.h" namespace OHOS { namespace AbilityRuntime { @@ -62,18 +62,18 @@ static void grantUriPermissionCallbackSync([[maybe_unused]]ani_env *env, return; } auto selfToken = IPCSkeleton::GetSelfTokenID(); - ani_object stsErrCode = CreateStsError(env, AbilityErrorCode::ERROR_OK); + ani_object EtsErrCode = CreateEtsError(env, AbilityErrorCode::ERROR_OK); if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) { TAG_LOGE(AAFwkTag::URIPERMMGR, "app not system-app"); - stsErrCode = CreateStsError(env, static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), + EtsErrCode = CreateEtsError(env, static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), NOT_SYSTEM_APP); - AsyncCallback(env, callback, stsErrCode, createDouble(env, ERR_FAILURE)); + AsyncCallback(env, callback, EtsErrCode, createDouble(env, ERR_FAILURE)); return; } std::string uriStr = GetStdString(env, uri); Uri uriVec(uriStr); ani_int flag = 0; - AAFwk::AniEnumConvertUtil::EnumConvertStsToNative(env, flagEnum, flag); + AAFwk::AniEnumConvertUtil::EnumConvert_EtsToNative(env, flagEnum, flag); int32_t flagId = static_cast(flag); std::string targetBundleName = GetStdString(env, targetName); int32_t appCloneIndexId = static_cast(appCloneIndex); @@ -83,10 +83,10 @@ static void grantUriPermissionCallbackSync([[maybe_unused]]ani_env *env, targetBundleName, appCloneIndexId); if (errCode != ERR_OK) { result = ERR_FAILURE; - stsErrCode = CreateStsErrorByNativeErr(env, errCode); + EtsErrCode = CreateEtsErrorByNativeErr(env, errCode); } - AsyncCallback(env, callback, stsErrCode, createDouble(env, result)); + AsyncCallback(env, callback, EtsErrCode, createDouble(env, result)); } static void revokeUriPermissionCallbackSync([[maybe_unused]]ani_env *env, @@ -98,12 +98,12 @@ static void revokeUriPermissionCallbackSync([[maybe_unused]]ani_env *env, return; } auto selfToken = IPCSkeleton::GetSelfTokenID(); - ani_object stsErrCode = CreateStsError(env, AbilityErrorCode::ERROR_OK); + ani_object EtsErrCode = CreateEtsError(env, AbilityErrorCode::ERROR_OK); if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) { TAG_LOGE(AAFwkTag::URIPERMMGR, "app not system-app"); - stsErrCode = CreateStsError(env, static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), + EtsErrCode = CreateEtsError(env, static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), NOT_SYSTEM_APP); - AsyncCallback(env, callback, stsErrCode, createDouble(env, ERR_FAILURE)); + AsyncCallback(env, callback, EtsErrCode, createDouble(env, ERR_FAILURE)); return; } std::string uriStr = GetStdString(env, uri); @@ -115,9 +115,9 @@ static void revokeUriPermissionCallbackSync([[maybe_unused]]ani_env *env, targetBundleName, appCloneIndex); if (errCode != ERR_OK) { result = ERR_FAILURE; - stsErrCode = CreateStsErrorByNativeErr(env, errCode); + EtsErrCode = CreateEtsErrorByNativeErr(env, errCode); } - AsyncCallback(env, callback, stsErrCode, createDouble(env, result)); + AsyncCallback(env, callback, EtsErrCode, createDouble(env, result)); } ani_object createDouble(ani_env *env, int32_t res) @@ -135,9 +135,9 @@ env->Object_New(persion_cls, persionInfoCtor, &persionInfoObj, ani_double(res)); return persionInfoObj; } -void StsUriPermissionManagerInit(ani_env *env) +void EtsUriPermissionManagerInit(ani_env *env) { - TAG_LOGI(AAFwkTag::URIPERMMGR, "StsUriPermissionManagerInit call"); + TAG_LOGI(AAFwkTag::URIPERMMGR, "EtsUriPermissionManagerInit call"); if (env == nullptr) { TAG_LOGE(AAFwkTag::URIPERMMGR, "Invalid param"); } @@ -160,11 +160,11 @@ void StsUriPermissionManagerInit(ani_env *env) reinterpret_cast(revokeUriPermissionCallbackSync) }, }; - TAG_LOGI(AAFwkTag::URIPERMMGR, "StsUriPermissionManagerInit bind functions"); + TAG_LOGI(AAFwkTag::URIPERMMGR, "EtsUriPermissionManagerInit bind functions"); if (env->Namespace_BindNativeFunctions(ns, functions.data(), functions.size()) != ANI_OK) { TAG_LOGE(AAFwkTag::URIPERMMGR, "Namespace_BindNativeFunctions failed"); }; - TAG_LOGI(AAFwkTag::URIPERMMGR, "StsUriPermissionManagerInit success"); + TAG_LOGI(AAFwkTag::URIPERMMGR, "EtsUriPermissionManagerInit success"); } extern "C"{ @@ -179,7 +179,7 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) return ANI_NOT_FOUND; } - StsUriPermissionManagerInit(env); + EtsUriPermissionManagerInit(env); *result = ANI_VERSION_1; TAG_LOGI(AAFwkTag::URIPERMMGR, "ANI_Constructor finish"); return ANI_OK; -- Gitee