diff --git a/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets b/frameworks/ets/ani/accesstoken/ets/@ohos.abilityAccessCtrl.ets index 4b7136accd1b221611c881cee2092d25be949dc3..668a51d010e20a5174961f8b48a1c05eb0b3fe80 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; @@ -149,6 +157,23 @@ export default namespace abilityAccessCtrl { requestPermissionOnSetting( context: Context, permissionList: Array): Promise>; + + grantUserGrantedPermission( + tokenID: int, + 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 { @@ -162,7 +187,7 @@ export default namespace abilityAccessCtrl { } return GrantStatus.PERMISSION_DENIED } - + checkAccessTokenSync(tokenID: int, permissionName: Permissions): GrantStatus { validateTokenAndPermission(tokenID, permissionName); let result = this.checkAccessTokenANI(tokenID, permissionName); @@ -258,5 +283,90 @@ 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); + }) + }); + } + + 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 7f9a763f5a38ded59f13bd9ed74ae8fdd3edd5bf..73f6aa443a1295c61e156374debaec20f2afd1ed 100644 --- a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp @@ -1309,6 +1309,147 @@ static ani_ref RequestPermissionOnSettingExecute([[maybe_unused]] ani_env* env, 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 void GrantUserGrantedPermissionExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_int tokenID, ani_string aniPermissionName ,ani_int permissionFlags) +{ + 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 (res != 0) { + int32_t stsCode = BusinessErrorAni::GetStsErrorCode(res); + 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) { @@ -1353,6 +1494,14 @@ 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 { "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);