diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp index 6b3e593e99aa1e61301a5d0b3b8ede715813360e..ca7cac971724be55c897b3652b8659302555e263 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp @@ -110,20 +110,21 @@ static ani_object WrapResult(ani_env* env, std::shared_ptr& return nullptr; } auto state = asyncContext->needDynamicRequest ? asyncContext->grantResults : asyncContext->permissionsState; - ani_ref aniPermissions = CreateAniArrayString(env, asyncContext->permissionList); - ani_ref aniAuthResults = CreateAniArrayInt(env, state); - ani_ref aniDialogShownResults = CreateAniArrayBool(env, asyncContext->dialogShownResults); - ani_ref aniPermissionQueryResults = CreateAniArrayInt(env, asyncContext->permissionQueryResults); - if (aniPermissions == nullptr || aniAuthResults == nullptr || aniDialogShownResults == nullptr || - aniPermissionQueryResults == nullptr) { - return nullptr; - } - if (!CallSetter(env, cls, aObject, SETTER_METHOD_NAME(permissions), aniPermissions) || - !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(authResults), aniAuthResults) || - !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(dialogShownResults), aniDialogShownResults) || - !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(errorReasons), aniPermissionQueryResults)) { - return nullptr; - } + ani_ref aniPerms = CreateAniArrayString(env, asyncContext->permissionList); + ani_ref aniAuthRes = CreateAniArrayInt(env, state); + ani_ref aniDiasShownRes = CreateAniArrayBool(env, asyncContext->dialogShownResults); + ani_ref aniPermRes = CreateAniArrayInt(env, asyncContext->permissionQueryResults); + if (aniPerms == nullptr || aniAuthRes == nullptr || aniDiasShownRes == nullptr || aniPermRes == nullptr || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(permissions), aniPerms) || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(authResults), aniAuthRes) || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(dialogShownResults), aniDiasShownRes) || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(errorReasons), aniPermRes)) { + aObject = nullptr; + } + DeleteReference(env, aniPerms); + DeleteReference(env, aniAuthRes); + DeleteReference(env, aniDiasShownRes); + DeleteReference(env, aniPermRes); return aObject; } diff --git a/frameworks/ets/ani/common/include/ani_utils.h b/frameworks/ets/ani/common/include/ani_utils.h index 6a188d547b753cabd5b0b327928e19b11b321aef..0df6d144d79e92de401307652fffc92614f64850 100644 --- a/frameworks/ets/ani/common/include/ani_utils.h +++ b/frameworks/ets/ani/common/include/ani_utils.h @@ -50,7 +50,7 @@ bool SetRefProperty(ani_env* env, ani_object& object, const std::string& propert bool SetStringProperty(ani_env* env, ani_object& aniObject, const std::string& property, const std::string& in); bool SetEnumProperty( ani_env* env, ani_object& aniObject, const std::string& enumDescription, - const std::string& property, ani_size value); + const std::string& property, uint32_t value); bool SetOptionalIntProperty(ani_env* env, ani_object& aniObject, const std::string& property, int32_t in); bool IsCurrentThread(std::thread::id threadId); @@ -72,6 +72,9 @@ ani_object CreateArrayObject(ani_env* env, uint32_t length); ani_ref CreateAniArrayBool(ani_env* env, const std::vector& cArray); ani_ref CreateAniArrayInt(ani_env* env, const std::vector& cArray); ani_ref CreateAniArrayString(ani_env* env, const std::vector& cArray); + +// delete ref of GlobalReference_Create +void DeleteReference(ani_env* env, ani_ref& ref); } // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/frameworks/ets/ani/common/src/ani_utils.cpp b/frameworks/ets/ani/common/src/ani_utils.cpp index 4f9b222f588b2c79b0c009ae2f4d469948de8965..7e73acfb785566764b663633d2bb3ce9acfabb9f 100644 --- a/frameworks/ets/ani/common/src/ani_utils.cpp +++ b/frameworks/ets/ani/common/src/ani_utils.cpp @@ -79,7 +79,9 @@ std::vector ParseAniStringVector(ani_env* env, const ani_array_ref& } std::string stdStr = ParseAniString(env, static_cast(aniRef)); - out.emplace_back(stdStr); + if (!stdStr.empty()) { + out.emplace_back(stdStr); + } } return out; } @@ -236,6 +238,14 @@ ani_ref CreateAniArrayBool(ani_env* env, const std::vector& cArray) return aRef; } +void DeleteReference(ani_env* env, ani_ref& ref) +{ + if (ref != nullptr) { + env->GlobalReference_Delete(ref); + ref = nullptr; + } +} + ani_object CreateBooleanObject(ani_env *env, bool value) { ani_class persionCls; @@ -539,7 +549,7 @@ bool SetStringProperty(ani_env* env, ani_object& aniObject, const std::string& p } bool SetEnumProperty(ani_env* env, ani_object& aniObject, - const std::string& enumDescription, const std::string& property, ani_size value) + const std::string& enumDescription, const std::string& property, uint32_t value) { if ((env == nullptr) || (aniObject == nullptr)) { ACCESSTOKEN_LOG_ERROR(LABEL, "Input param is nullptr, property(%{public}s).", property.c_str()); @@ -551,7 +561,7 @@ bool SetEnumProperty(ani_env* env, ani_object& aniObject, return false; } ani_enum_item aniEnumItem; - if (env->Enum_GetEnumItemByIndex(aniEnum, value, &aniEnumItem) != ANI_OK) { + if (env->Enum_GetEnumItemByIndex(aniEnum, static_cast(value), &aniEnumItem) != ANI_OK) { ACCESSTOKEN_LOG_ERROR(LABEL, "Enum_GetEnumItemByIndex failed!"); return false; } diff --git a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets index 0f2fb079bebd9c07a5c9617220c1dc67bdbd09e9..8870648dc506c389d430019a32ea2b7c0b5f1e1c 100644 --- a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets +++ b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets @@ -106,7 +106,8 @@ export default namespace privacyManager { return p; } - export function stopUsingPermission(tokenID: int, permissionName: Permissions, callback: AsyncCallback): void { + export function stopUsingPermission( + tokenID: int, permissionName: Permissions, callback: AsyncCallback): void { if (typeof permissionName !== "string") { let err = new BusinessError(); err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; @@ -163,7 +164,8 @@ export default namespace privacyManager { return p; } - export function startUsingPermission(tokenID: int, permissionName: Permissions, callback: AsyncCallback): void { + export function startUsingPermission( + tokenID: int, permissionName: Permissions, callback: AsyncCallback): void { if (typeof permissionName !== "string") { let err = new BusinessError(); err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; @@ -219,11 +221,13 @@ export default namespace privacyManager { }); } - export function getPermissionUsedTypeInfos(tokenId?: int, permissionName?: Permissions): Promise>{ - let tokenIdIn = tokenId ? tokenId : 0; + export function getPermissionUsedTypeInfos( + tokenId?: int, permissionName?: Permissions): Promise> { + let tokenIdIn = tokenId ?? 0; let permissionNameIn = permissionName ?? ""; - return new Promise>( - (resolve: (v: Array) => void, reject: (err:BusinessError) => void): Array => { + return new Promise> (( + resolve: (v: Array) => void, + reject: (err: BusinessError) => void): Array => { let p1 = taskpool.execute((): Array => { return getPermissionUsedTypeInfosExecute(tokenIdIn, permissionNameIn); }); @@ -235,8 +239,8 @@ export default namespace privacyManager { }); } - export function setPermissionUsedRecordToggleStatus(status: boolean): Promise{ - return new Promise( + export function setPermissionUsedRecordToggleStatus(status: boolean): Promise { + return new Promise ( (resolve: (v: undefined) => void, reject: (err: BusinessError) => void): void => { let p1 = taskpool.execute((): void => { setPermissionUsedRecordToggleStatusExecute(status); @@ -250,8 +254,8 @@ export default namespace privacyManager { } export function getPermissionUsedRecordToggleStatus(): Promise{ - return new Promise( - (resolve: (v: boolean) => void, reject: (err:BusinessError) => void): void => { + return new Promise ( + (resolve: (v: boolean) => void, reject: (err: BusinessError) => void): void => { let p1 = taskpool.execute((): boolean => { return getPermissionUsedRecordToggleStatusExecute(); }); diff --git a/frameworks/ets/ani/privacy/src/privacy_manager.cpp b/frameworks/ets/ani/privacy/src/privacy_manager.cpp index 221c7e291c07b247e9d5170bc0c5ce274e2709a2..2aa9f3c80caf7d68f20eb46d7ee6c1b5d913bee8 100644 --- a/frameworks/ets/ani/privacy/src/privacy_manager.cpp +++ b/frameworks/ets/ani/privacy/src/privacy_manager.cpp @@ -182,7 +182,7 @@ static ani_object ConvertActiveChangeResponse(ani_env* env, const ActiveChangeRe } // set callingTokenID?: int optional parameter callingTokenID need box as a object - SetIntProperty(env, aniObject, ACTIVE_CHANGE_FIELD_CALLING_TOKEN_ID, static_cast(result.callingTokenID)); + SetIntProperty(env, aniObject, ACTIVE_CHANGE_FIELD_CALLING_TOKEN_ID, static_cast(result.callingTokenID)); // set tokenID: int SetIntProperty(env, aniObject, ACTIVE_CHANGE_FIELD_TOKEN_ID, static_cast(result.tokenID)); @@ -196,12 +196,12 @@ static ani_object ConvertActiveChangeResponse(ani_env* env, const ActiveChangeRe // set activeStatus: PermissionActiveStatus const char* activeStatusDes = "L@ohos/privacyManager/privacyManager/PermissionActiveStatus;"; SetEnumProperty( - env, aniObject, activeStatusDes, ACTIVE_CHANGE_FIELD_ACTIVE_STATUS, static_cast(result.type)); + env, aniObject, activeStatusDes, ACTIVE_CHANGE_FIELD_ACTIVE_STATUS, static_cast(result.type)); // set usedType?: PermissionUsedType const char* permUsedTypeDes = "L@ohos/privacyManager/privacyManager/PermissionUsedType;"; SetEnumProperty( - env, aniObject, permUsedTypeDes, ACTIVE_CHANGE_FIELD_USED_TYPE, static_cast(result.usedType)); + env, aniObject, permUsedTypeDes, ACTIVE_CHANGE_FIELD_USED_TYPE, static_cast(result.usedType)); return aniObject; } @@ -227,6 +227,10 @@ void PermActiveStatusPtr::ActiveStatusChangeCallback(ActiveChangeResponse& activ } ani_object aniObject = ConvertActiveChangeResponse(env, activeChangeResponse); + if (aniObject == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Convert object is null."); + return; + } std::vector args; args.emplace_back(aniObject); ani_ref result; @@ -525,7 +529,7 @@ static void StartUsingPermissionExecute([[maybe_unused]] ani_env* env, } } -static ani_object ConvertSingelUsedRecordDetail(ani_env* env, const UsedRecordDetail& record) +static ani_object ConvertSingleUsedRecordDetail(ani_env* env, const UsedRecordDetail& record) { ani_object arrayObj = CreateClassObject(env, "L@ohos/privacyManager/privacyManager/UsedRecordDetailInner;"); if (arrayObj == nullptr) { @@ -547,7 +551,7 @@ static ani_object ConvertSingelUsedRecordDetail(ani_env* env, const UsedRecordDe return nullptr; } if (!SetEnumProperty(env, arrayObj, "L@ohos/privacyManager/privacyManager/PermissionUsedType;", "usedType", - static_cast(record.type))) { + static_cast(record.type))) { return nullptr; } return arrayObj; @@ -561,7 +565,7 @@ static ani_object ConvertUsedRecordDetails(ani_env* env, const std::vector(info.type))) { + ACCESSTOKEN_LOG_ERROR(LABEL, "UsedType set fail."); + return nullptr; + } + return aObject; +} + +static ani_ref ConvertPermissionUsedTypeInfos(ani_env* env, const std::vector& infos) +{ + ani_object arrayObj = CreateArrayObject(env, infos.size()); + if (arrayObj == nullptr) { + return nullptr; + } + ani_size index = 0; + for (const auto& type : infos) { + ani_ref aniType = ConvertPermissionUsedTypeInfo(env, type); + if (aniType == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "aniType is null."); + continue; + } + ani_status status = env->Object_CallMethodByName_Void( + arrayObj, "$_set", "ILstd/core/Object;:V", index, aniType); + if (status != ANI_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Set type fail, status: %{public}d.", static_cast(status)); + continue; + } + ++index; + } + return arrayObj; +} + static ani_ref GetPermissionUsedTypeInfosExecute([[maybe_unused]] ani_env* env, ani_int aniTokenID, ani_string aniPermission) { if (env == nullptr) { - ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null"); + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null."); } - return nullptr; + AccessTokenID tokenID = static_cast(aniTokenID); + std::string permission = ParseAniString(env, static_cast(aniPermission)); + std::vector typeInfos; + int32_t retCode = PrivacyKit::GetPermissionUsedTypeInfos(tokenID, permission, typeInfos); + if (retCode != RET_SUCCESS) { + BusinessErrorAni::ThrowError(env, GetStsErrorCode(retCode), + GetErrorMessage(GetStsErrorCode(retCode))); + return nullptr; + } + return ConvertPermissionUsedTypeInfos(env, typeInfos); } static void SetPermissionUsedRecordToggleStatusExecute([[maybe_unused]] ani_env* env, ani_boolean status) { - ACCESSTOKEN_LOG_INFO(LABEL, "SetPermissionUsedRecordToggleStatusExecute Call"); if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null."); return; } + int32_t userID = 0; + int32_t retCode = PrivacyKit::SetPermissionUsedRecordToggleStatus(userID, status); + if (retCode != RET_SUCCESS) { + int32_t stsCode = BusinessErrorAni::GetStsErrorCode(retCode); + BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); + } } static ani_boolean GetPermissionUsedRecordToggleStatusExecute([[maybe_unused]] ani_env* env) { - ACCESSTOKEN_LOG_INFO(LABEL, "GetPermissionUsedRecordToggleStatusExecute Call"); if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null."); + return false; + } + int32_t userID = 0; + bool isToggleStatus = false; + int32_t retCode = PrivacyKit::GetPermissionUsedRecordToggleStatus(userID, isToggleStatus); + if (retCode != RET_SUCCESS) { + BusinessErrorAni::ThrowError(env, GetStsErrorCode(retCode), GetErrorMessage(GetStsErrorCode(retCode))); return false; } - bool isToggleStaus = false; - return isToggleStaus; + return isToggleStatus; } void InitPrivacyFunction(ani_env *env)