From fc27c17ee9dcc3f85f33db2bc40749fcd4bcaa79 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Thu, 15 May 2025 21:43:21 +0800 Subject: [PATCH 1/4] grantUserGrantedPermission Callback add Signed-off-by: zhangzezhong --- .../ets/@ohos.abilityAccessCtrl.ets | 22 ++++++++++ .../accesstoken/src/ability_access_ctrl.cpp | 42 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets index 4b7136acc..8ac63ae4b 100644 --- a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets +++ b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets @@ -149,6 +149,12 @@ export default namespace abilityAccessCtrl { requestPermissionOnSetting( context: Context, permissionList: Array): Promise>; + + grantUserGrantedPermission( + tokenID: int, + permissionName: Permissions, + permissionFlags: int, + callback: AsyncCallback): void; } class AtManagerInner implements AtManager { @@ -163,6 +169,22 @@ export default namespace abilityAccessCtrl { return GrantStatus.PERMISSION_DENIED } + native grantUserGrantedPermissionSync(tokenID: int, permissionName: Permissions, permissionFlags: int): int; + + grantUserGrantedPermission(tokenID: int, permissionName: Permissions, permissionFlags: int, + callback: AsyncCallback): void{ + validateTokenAndPermission(tokenID, permissionName); + let p1 = taskpool.execute(():int => { + return new AtManagerInner().grantUserGrantedPermissionSync(tokenID, permissionName, permissionFlags) as int;}); + p1.then(() =>{ + let err = new BusinessError(); + callback(err, undefined); + }, (err: BusinessError): void => { + callback(err, undefined); + }) + } + + checkAccessTokenSync(tokenID: int, permissionName: Permissions): GrantStatus { validateTokenAndPermission(tokenID, permissionName); let result = this.checkAccessTokenANI(tokenID, permissionName); diff --git a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp index 7f9a763f5..187eef1c7 100644 --- a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp @@ -1307,6 +1307,45 @@ static ani_ref RequestPermissionOnSettingExecute([[maybe_unused]] ani_env* env, ani_ref result = RequestPermissionOnSettingComplete(env, asyncContext); asyncContext->loadlock.unlock(); return result; + + static bool IsPermissionFlagValid(uint32_t flag) + { + return (flag == PermissionFlag::PERMISSION_USER_SET) || (flag == PermissionFlag::PERMISSION_USER_FIXED) || + (flag == PermissionFlag::PERMISSION_ALLOW_THIS_TIME); + }; + + static ani_int GrantUserGrantedPermissionSync([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_int tokenID, ani_string permissionName ,ani_int permissionFlags) + { + std::string stdPermissionName = ANIUtils_ANIStringToStdString(env, static_cast(permissionName)); + int32_t result = 0; + PermissionDef permissionDef; + permissionDef.grantMode = 0; + permissionDef.availableLevel = APL_NORMAL; + permissionDef.provisionEnable = false; + permissionDef.distributedSceneEnable = false; + permissionDef.labelId = 0; + permissionDef.descriptionId = 0; + + int32_t resultcode = AccessTokenKit::GetDefPermission(stdPermissionName, permissionDef); + if (resultcode != RET_SUCCESS) { + return resultcode; + } + std::string stdpermissionName = ANIUtils_ANIStringToStdString(env,permissionName); + ACCESSTOKEN_LOG_DEBUG(LABEL,"PermissionName = %{public}s, grantmode = %{public}d.", + stdpermissionName.c_str(), permissionDef.grantMode); + + if (!IsPermissionFlagValid(static_cast (permissionFlags))) { + result = ERR_PARAM_INVALID; + } + if (permissionDef.grantMode == USER_GRANT) { + result = AccessTokenKit::GrantPermission(tokenID, stdPermissionName, + permissionFlags); + } else { + result = ERR_PERMISSION_NOT_EXIST; + } + return static_cast(result); + } } extern "C" { @@ -1353,6 +1392,9 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) ani_native_function { "requestPermissionOnSettingExecute", "Lapplication/Context/Context;Lescompat/Array;:Lescompat/Array;", reinterpret_cast(RequestPermissionOnSettingExecute) }, + ani_native_function { "grantUserGrantedPermissionSync", + "ILstd/core/String;I:V" , + reinterpret_cast(GrantUserGrantedPermissionSync) } }; if (ANI_OK != env->Class_BindNativeMethods(cls, claMethods.data(), claMethods.size())) { ACCESSTOKEN_LOG_ERROR(LABEL, "Cannot bind native methods to %{public}s", className); -- Gitee From a06a5a8f3c1d8e0785bb3958cb829957ece31097 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Fri, 16 May 2025 09:08:43 +0800 Subject: [PATCH 2/4] fix error location of the IsPermissionFlagValid function --- .../ets/@ohos.abilityAccessCtrl.ets | 7 +-- .../accesstoken/src/ability_access_ctrl.cpp | 61 +++++++++---------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets index 8ac63ae4b..2c121cadd 100644 --- a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets +++ b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets @@ -169,13 +169,13 @@ export default namespace abilityAccessCtrl { return GrantStatus.PERMISSION_DENIED } - native grantUserGrantedPermissionSync(tokenID: int, permissionName: Permissions, permissionFlags: int): int; + void grantUserGrantedPermissionANI(tokenID: int, permissionName: Permissions, permissionFlags: int): int; grantUserGrantedPermission(tokenID: int, permissionName: Permissions, permissionFlags: int, - callback: AsyncCallback): void{ + callback: AsyncCallback): void { validateTokenAndPermission(tokenID, permissionName); let p1 = taskpool.execute(():int => { - return new AtManagerInner().grantUserGrantedPermissionSync(tokenID, permissionName, permissionFlags) as int;}); + return new AtManagerInner().grantUserGrantedPermissionANI(tokenID, permissionName, permissionFlags) as int;}); p1.then(() =>{ let err = new BusinessError(); callback(err, undefined); @@ -184,7 +184,6 @@ export default namespace abilityAccessCtrl { }) } - checkAccessTokenSync(tokenID: int, permissionName: Permissions): GrantStatus { validateTokenAndPermission(tokenID, permissionName); let result = this.checkAccessTokenANI(tokenID, permissionName); diff --git a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp index 187eef1c7..b507bbb5f 100644 --- a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp @@ -1307,45 +1307,44 @@ static ani_ref RequestPermissionOnSettingExecute([[maybe_unused]] ani_env* env, ani_ref result = RequestPermissionOnSettingComplete(env, asyncContext); asyncContext->loadlock.unlock(); return result; +} - static bool IsPermissionFlagValid(uint32_t flag) - { +static bool IsPermissionFlagValid(uint32_t flag) +{ return (flag == PermissionFlag::PERMISSION_USER_SET) || (flag == PermissionFlag::PERMISSION_USER_FIXED) || (flag == PermissionFlag::PERMISSION_ALLOW_THIS_TIME); - }; +}; - static ani_int GrantUserGrantedPermissionSync([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, +static ani_int GrantUserGrantedPermissionANI([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, ani_int tokenID, ani_string permissionName ,ani_int permissionFlags) - { +{ std::string stdPermissionName = ANIUtils_ANIStringToStdString(env, static_cast(permissionName)); int32_t result = 0; PermissionDef permissionDef; permissionDef.grantMode = 0; - permissionDef.availableLevel = APL_NORMAL; - permissionDef.provisionEnable = false; - permissionDef.distributedSceneEnable = false; - permissionDef.labelId = 0; - permissionDef.descriptionId = 0; - - int32_t resultcode = AccessTokenKit::GetDefPermission(stdPermissionName, permissionDef); - if (resultcode != RET_SUCCESS) { - return resultcode; - } - std::string stdpermissionName = ANIUtils_ANIStringToStdString(env,permissionName); - ACCESSTOKEN_LOG_DEBUG(LABEL,"PermissionName = %{public}s, grantmode = %{public}d.", - stdpermissionName.c_str(), permissionDef.grantMode); + permissionDef.availableLevel = APL_NORMAL; + permissionDef.provisionEnable = false; + permissionDef.distributedSceneEnable = false; + permissionDef.labelId = 0; + permissionDef.descriptionId = 0; + + int32_t resultcode = AccessTokenKit::GetDefPermission(stdPermissionName, permissionDef); + if (resultcode != RET_SUCCESS) { + return resultcode; + } + std::string stdpermissionName = ANIUtils_ANIStringToStdString(env, permissionName); + ACCESSTOKEN_LOG_DEBUG(LABEL,"PermissionName = %{public}s, grantmode = %{public}d.", + stdpermissionName.c_str(), permissionDef.grantMode); - if (!IsPermissionFlagValid(static_cast (permissionFlags))) { - result = ERR_PARAM_INVALID; - } - if (permissionDef.grantMode == USER_GRANT) { - result = AccessTokenKit::GrantPermission(tokenID, stdPermissionName, - permissionFlags); - } else { - result = ERR_PERMISSION_NOT_EXIST; - } - return static_cast(result); - } + if (!IsPermissionFlagValid(static_cast (permissionFlags))) { + result = ERR_PARAM_INVALID; + } + if (permissionDef.grantMode == USER_GRANT) { + result = AccessTokenKit::GrantPermission(tokenID, stdPermissionName, permissionFlags); + } else { + result = ERR_PERMISSION_NOT_EXIST; + } + return static_cast(result); } extern "C" { @@ -1392,9 +1391,9 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) ani_native_function { "requestPermissionOnSettingExecute", "Lapplication/Context/Context;Lescompat/Array;:Lescompat/Array;", reinterpret_cast(RequestPermissionOnSettingExecute) }, - ani_native_function { "grantUserGrantedPermissionSync", + ani_native_function { "grantUserGrantedPermissionANI", "ILstd/core/String;I:V" , - reinterpret_cast(GrantUserGrantedPermissionSync) } + reinterpret_cast(GrantUserGrantedPermissionANI) } }; if (ANI_OK != env->Class_BindNativeMethods(cls, claMethods.data(), claMethods.size())) { ACCESSTOKEN_LOG_ERROR(LABEL, "Cannot bind native methods to %{public}s", className); -- Gitee From 9f38ecc2202d9453c874e59f82de445467ff2e7a Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Fri, 23 May 2025 09:11:36 +0800 Subject: [PATCH 3/4] Add grantUserGrantedPermission and grantUserGrantedPermission(callback) Signed-off-by: zhangzezhong --- .../ets/@ohos.abilityAccessCtrl.ets | 44 +++++++---- .../accesstoken/src/ability_access_ctrl.cpp | 78 +++++++++++-------- 2 files changed, 75 insertions(+), 47 deletions(-) diff --git a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets index 2c121cadd..904122d7f 100644 --- a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets +++ b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets @@ -168,21 +168,6 @@ export default namespace abilityAccessCtrl { } return GrantStatus.PERMISSION_DENIED } - - void grantUserGrantedPermissionANI(tokenID: int, permissionName: Permissions, permissionFlags: int): int; - - grantUserGrantedPermission(tokenID: int, permissionName: Permissions, permissionFlags: int, - callback: AsyncCallback): void { - validateTokenAndPermission(tokenID, permissionName); - let p1 = taskpool.execute(():int => { - return new AtManagerInner().grantUserGrantedPermissionANI(tokenID, permissionName, permissionFlags) as int;}); - p1.then(() =>{ - let err = new BusinessError(); - callback(err, undefined); - }, (err: BusinessError): void => { - callback(err, undefined); - }) - } checkAccessTokenSync(tokenID: int, permissionName: Permissions): GrantStatus { validateTokenAndPermission(tokenID, permissionName); @@ -279,5 +264,34 @@ export default namespace abilityAccessCtrl { }); return p; } + + native grantUserGrantedPermissionExecute(tokenID: int, permissionName: Permissions, permissionFlags: int): void; + + grantUserGrantedPermission(tokenID: int, permissionName: Permissions, permissionFlags: int, + callback: AsyncCallback): void{ + validateTokenAndPermission(tokenID, permissionName); + let p1 = taskpool.execute(():void => { + new AtManagerInner().grantUserGrantedPermissionExecute(tokenID, permissionName, permissionFlags);}); + p1.then(() =>{ + let err = new BusinessError(); + callback(err,undefined); + }, (err: BusinessError): void => { + callback(err,undefined); + }) + } + + grantUserGrantedPermission(tokenID: int, permissionName: Permissions, permissionFlags: int): Promise { + return new Promise( + (resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p = taskpool.execute((): void => { + new AtManagerInner().grantUserGrantedPermissionExecute(tokenID, permissionName, permissionFlags); + }); + p.then((e: NullishType): void => { + resolve(undefined); + }).catch((err: BusinessError): void => { + reject(err); + }) + }); + } } } \ No newline at end of file diff --git a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp index b507bbb5f..be24d7824 100644 --- a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp @@ -1315,38 +1315,53 @@ static bool IsPermissionFlagValid(uint32_t flag) (flag == PermissionFlag::PERMISSION_ALLOW_THIS_TIME); }; -static ani_int GrantUserGrantedPermissionANI([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, - ani_int tokenID, ani_string permissionName ,ani_int permissionFlags) +static void GrantUserGrantedPermissionExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_int tokenID, ani_string aniPermissionName ,ani_int permissionFlags) { - std::string stdPermissionName = ANIUtils_ANIStringToStdString(env, static_cast(permissionName)); - int32_t result = 0; - PermissionDef permissionDef; - permissionDef.grantMode = 0; - permissionDef.availableLevel = APL_NORMAL; - permissionDef.provisionEnable = false; - permissionDef.distributedSceneEnable = false; - permissionDef.labelId = 0; - permissionDef.descriptionId = 0; - - int32_t resultcode = AccessTokenKit::GetDefPermission(stdPermissionName, permissionDef); - if (resultcode != RET_SUCCESS) { - return resultcode; - } - std::string stdpermissionName = ANIUtils_ANIStringToStdString(env, permissionName); - ACCESSTOKEN_LOG_DEBUG(LABEL,"PermissionName = %{public}s, grantmode = %{public}d.", - stdpermissionName.c_str(), permissionDef.grantMode); + if (env == nullptr || aniPermissionName == nullptr ) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName or env null"); + BusinessErrorAni::ThrowError(env, STSErrorCode::STS_ERROR_PARAM_INVALID, + GetErrorMessage(STSErrorCode::STS_ERROR_PARAM_INVALID)); + return; + } + + std::string permissionName; + if (!AniParseString(env, aniPermissionName, permissionName)) { + BusinessErrorAni::ThrowError(env,STSErrorCode::STS_ERROR_PARAM_ILLEGAL, + GetParamErrorMsg("permissionName", "string")); + return; + } + + PermissionDef def; + def.grantMode = 0; + def.availableLevel = APL_NORMAL; + def.provisionEnable = false; + def.distributedSceneEnable = false; + int32_t res = AccessTokenKit::GetDefPermission(permissionName, def); + if (res != RET_SUCCESS) { + int32_t stsCode = BusinessErrorAni::GetStsErrorCode(res); + BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); + return; + } + + ACCESSTOKEN_LOG_INFO(LABEL,"GrantUserGrantedPermission begin. 444"); + if (!IsPermissionFlagValid(static_cast (permissionFlags))) { + BusinessErrorAni::ThrowError(env, STSErrorCode::STS_ERROR_PARAM_INVALID, + GetErrorMessage(STSErrorCode::STS_ERROR_PARAM_INVALID)); + return; + } + + if (def.grantMode == USER_GRANT) { + res = AccessTokenKit::GrantPermission(tokenID, permissionName, permissionFlags); + } else { + res = ERR_PERMISSION_NOT_EXIST; + } - if (!IsPermissionFlagValid(static_cast (permissionFlags))) { - result = ERR_PARAM_INVALID; - } - if (permissionDef.grantMode == USER_GRANT) { - result = AccessTokenKit::GrantPermission(tokenID, stdPermissionName, permissionFlags); - } else { - result = ERR_PERMISSION_NOT_EXIST; - } - return static_cast(result); + if (res != 0) { + int32_t stsCode = BusinessErrorAni::GetStsErrorCode(res); + BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); + } } - extern "C" { ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) { @@ -1391,9 +1406,8 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) ani_native_function { "requestPermissionOnSettingExecute", "Lapplication/Context/Context;Lescompat/Array;:Lescompat/Array;", reinterpret_cast(RequestPermissionOnSettingExecute) }, - ani_native_function { "grantUserGrantedPermissionANI", - "ILstd/core/String;I:V" , - reinterpret_cast(GrantUserGrantedPermissionANI) } + ani_native_function { "grantUserGrantedPermissionExecute", nullptr, + reinterpret_cast(GrantUserGrantedPermissionExecute) }, }; if (ANI_OK != env->Class_BindNativeMethods(cls, claMethods.data(), claMethods.size())) { ACCESSTOKEN_LOG_ERROR(LABEL, "Cannot bind native methods to %{public}s", className); -- Gitee From e2869172562ef3e0a158ec6cf2c558332580f547 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Sat, 24 May 2025 17:08:07 +0800 Subject: [PATCH 4/4] add getPermissionRequestToggleStatus setPermissionRequestToggleStatus getPermissionFlags Signed-off-by: zhangzezhong --- .../ets/@ohos.abilityAccessCtrl.ets | 75 +++++++++++++++ .../accesstoken/src/ability_access_ctrl.cpp | 94 +++++++++++++++++++ 2 files changed, 169 insertions(+) diff --git a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets index 904122d7f..668a51d01 100644 --- a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets +++ b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets @@ -128,6 +128,14 @@ export default namespace abilityAccessCtrl { verifyAccessTokenSync(tokenID: int, permissionName: Permissions): GrantStatus; + grantUserGrantedPermissionExecute(tokenID: int, permissionName: Permissions, permissionFlags: int): void; + + getPermissionFlagsExecute(tokenID: int, permissionName: Permissions):int; + + setPermissionRequestToggleStatusExecute(permissionName: Permissions, status: PermissionRequestToggleStatus):void; + + getPermissionRequestToggleStatusExecute(permissionName: Permissions): PermissionRequestToggleStatus; + requestPermissionsFromUserExecute( context: Context, permissionList: Array):PermissionRequestResult; @@ -155,6 +163,17 @@ export default namespace abilityAccessCtrl { permissionName: Permissions, permissionFlags: int, callback: AsyncCallback): void; + + getPermissionFlags( + tokenID: int, + permissionName: Permissions): Promise; + + setPermissionRequestToggleStatus( + permissionName: Permissions, + status: PermissionRequestToggleStatus): Promise; + + getPermissionRequestToggleStatus( + permissionName: Permissions): Promise; } class AtManagerInner implements AtManager { @@ -293,5 +312,61 @@ export default namespace abilityAccessCtrl { }) }); } + + native getPermissionFlagsExecute(tokenID: int, permissionName: Permissions):int; + + getPermissionFlags(tokenID: int, permissionName: Permissions): Promise{ + let p = new Promise( + (resolve: (v:int) => void, reject:(err: BusinessError) => void): int => { + let p1 = taskpool.execute((): int => { + return new AtManagerInner().getPermissionFlagsExecute(tokenID,permissionName); + }); + p1.then((e: NullishType): void => { + resolve(e as int); + }).catch((err:BusinessError):void =>{ + reject(err); + }); + }) + return p; + } + + native setPermissionRequestToggleStatusExecute(permissionName: Permissions, status: PermissionRequestToggleStatus):void; + + setPermissionRequestToggleStatus(permissionName: Permissions, status: PermissionRequestToggleStatus): Promise{ + return new Promise( + (resolve: (v:undefined)=> void, reject: (error:BusinessError)=> void):void =>{ + let p = taskpool.execute(():void=>{ + new AtManagerInner().setPermissionRequestToggleStatusExecute(permissionName, status); + }); + p.then((e:NullishType):void => { + resolve(undefined); + }).catch((err:BusinessError):void =>{ + reject(err); + }) + }); + } + + native getPermissionRequestToggleStatusExecute(permissionName: Permissions):PermissionRequestToggleStatus; + + getPermissionRequestToggleStatus(permissionName: Permissions): Promise{ + return new Promise( + (resolve: (v: PermissionRequestToggleStatus) => void, + reject:(err:BusinessError) => void): PermissionRequestToggleStatus => { + let p1 = taskpool.execute(():PermissionRequestToggleStatus => { + new AtManagerInner().getPermissionRequestToggleStatusExecute(permissionName) as int; + }); + p1.then((e:NullishType):void =>{ + let ret_statue: PermissionRequestToggleStatus; + if(e == 1){ + ret_statue = PermissionRequestToggleStatus.OPEN; + }else if(e == 0){ + ret_statue = PermissionRequestToggleStatus.CLOSED; + } + resolve(e as PermissionRequestToggleStatus); + }).catch((err:BusinessError):void =>{ + reject(err); + }) + }); + } } } \ No newline at end of file diff --git a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp index be24d7824..73f6aa443 100644 --- a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp @@ -1362,6 +1362,94 @@ static void GrantUserGrantedPermissionExecute([[maybe_unused]] ani_env* env, [[m BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); } } + +static ani_int GetPermissionFlagsExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_int tokenID, ani_string aniPermissionName){ + ACCESSTOKEN_LOG_INFO(LABEL,"GetPermissionFlagsExecute begin"); + if (env == nullptr || aniPermissionName == nullptr ) { + BusinessErrorAni::ThrowError(env, STSErrorCode::STS_ERROR_PARAM_INVALID, + GetErrorMessage(STSErrorCode::STS_ERROR_PARAM_INVALID)); + ACCESSTOKEN_LOG_INFO(LABEL,"errcode = %{public}d",STSErrorCode::STS_ERROR_PARAM_INVALID); + return -1; + } + std::string permissionName; + if (!AniParseString(env, aniPermissionName, permissionName)) { + BusinessErrorAni::ThrowError(env,STSErrorCode::STS_ERROR_PARAM_ILLEGAL, + GetParamErrorMsg("permissionName", "string")); + ACCESSTOKEN_LOG_INFO(LABEL,"errcode = %{public}d",STSErrorCode::STS_ERROR_PARAM_ILLEGAL); + return -1; + } + int32_t result = RET_FAILED; + uint32_t flag = 0; + result = AccessTokenKit::GetPermissionFlag(tokenID,permissionName,flag); + if(flag == 0){ + BusinessErrorAni::ThrowError(env,result,GetErrorMessage(result)); + ACCESSTOKEN_LOG_INFO(LABEL,"flag = 0"); + return -1; + } + ACCESSTOKEN_LOG_INFO(LABEL,"result = %{public}d flag = %{public}d",result,flag); + return flag; +} + +static void SetPermissionRequestToggleStatusExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_string anipermissionName, PermissionRequestToggleStatus status){ + if (anipermissionName == nullptr ) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is null"); + BusinessErrorAni::ThrowError(env, STSErrorCode::STS_ERROR_PARAM_INVALID, + GetErrorMessage(STSErrorCode::STS_ERROR_PARAM_INVALID)); + ACCESSTOKEN_LOG_INFO(LABEL,"判断ANI和aniPermissionName 错误 代码 %{public}d",STSErrorCode::STS_ERROR_PARAM_INVALID); + return; + } + ACCESSTOKEN_LOG_INFO(LABEL,"GrantUserGrantedPermission begin. 222"); + std::string permissionName; + if (!AniParseString(env, anipermissionName, permissionName)) { + BusinessErrorAni::ThrowError(env,STSErrorCode::STS_ERROR_PARAM_ILLEGAL, + GetParamErrorMsg("permissionName", "string")); + return; + } + + ACCESSTOKEN_LOG_INFO(LABEL,"open = %{public}d",status); + int32_t result = RET_FAILED; + result = AccessTokenKit::SetPermissionRequestToggleStatus(permissionName,status, 0); + if(result != 0){ + BusinessErrorAni::ThrowError(env, result, GetErrorMessage(result)); + ACCESSTOKEN_LOG_INFO(LABEL,"result = %{public}d flag = %{public}d",result,status); + return; + } + return; +} + +static ani_int GetPermissionRequestToggleStatusExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_string anipermissionName){ + ACCESSTOKEN_LOG_ERROR(LABEL, "in GetPermissionRequestToggleStatusExecute"); + + if (anipermissionName == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is null"); + BusinessErrorAni::ThrowError(env, STSErrorCode::STS_ERROR_PARAM_INVALID, + GetErrorMessage(STSErrorCode::STS_ERROR_PARAM_INVALID)); + return -1; + } + + std::string permissionName; + if (!AniParseString(env, anipermissionName, permissionName)) { + BusinessErrorAni::ThrowError(env,STSErrorCode::STS_ERROR_PARAM_ILLEGAL, + GetParamErrorMsg("permissionName", "string")); + return -1; + } + + int32_t flag = RET_FAILED; + uint32_t result = 2; + flag = AccessTokenKit::GetPermissionRequestToggleStatus(permissionName,result,0); + + ACCESSTOKEN_LOG_INFO(LABEL,"result = %{public}d flag = %{public}d", result, flag); + if(flag != 0){ + BusinessErrorAni::ThrowError(env,flag,GetErrorMessage(flag)); + return -1; + } + return result; +} + + extern "C" { ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) { @@ -1408,6 +1496,12 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) reinterpret_cast(RequestPermissionOnSettingExecute) }, ani_native_function { "grantUserGrantedPermissionExecute", nullptr, reinterpret_cast(GrantUserGrantedPermissionExecute) }, + ani_native_function {"getPermissionFlagsExecute" , nullptr, + reinterpret_cast(GetPermissionFlagsExecute)}, + ani_native_function { "setPermissionRequestToggleStatusExecute" ,nullptr, + reinterpret_cast(SetPermissionRequestToggleStatusExecute)}, + ani_native_function { "getPermissionRequestToggleStatusExecute" ,nullptr, + reinterpret_cast(GetPermissionRequestToggleStatusExecute)}, }; if (ANI_OK != env->Class_BindNativeMethods(cls, claMethods.data(), claMethods.size())) { ACCESSTOKEN_LOG_ERROR(LABEL, "Cannot bind native methods to %{public}s", className); -- Gitee