From 47020d16c324bb3b5cfcecd01c38ab28ed9ad353 Mon Sep 17 00:00:00 2001 From: kholoud mohamed Date: Thu, 3 Mar 2022 22:26:49 +0000 Subject: [PATCH] Add API to check if device policy role qualification is bypassable Bug: 220692690 Test: atest android.devicepolicy.cts.DevicePolicyManagerTest Change-Id: I81b2f7848682d3d23dbd57ca100590d73d6dfd3e --- core/api/system-current.txt | 1 + .../app/admin/DevicePolicyManager.java | 19 +++++++++++++++++++ .../app/admin/IDevicePolicyManager.aidl | 2 ++ .../BaseIDevicePolicyManager.java | 5 +++++ .../DevicePolicyManagerService.java | 14 ++++++++++++++ 5 files changed, 41 insertions(+) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 09d111418e067..045ce47b904ff 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -1114,6 +1114,7 @@ package android.app.admin { method public void setSecondaryLockscreenEnabled(@NonNull android.content.ComponentName, boolean); method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void setStrings(@NonNull java.util.Set); method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setUserProvisioningState(int, @NonNull android.os.UserHandle); + method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public boolean shouldAllowBypassingDevicePolicyManagementRoleQualification(); field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; field public static final String ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE = "android.app.action.BIND_SECONDARY_LOCKSCREEN_SERVICE"; diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 4c7b91056ca13..749d1a3db53bd 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -15760,4 +15760,23 @@ public class DevicePolicyManager { } return deviceManagerConfig; } + + /** + * @return {@code true} if bypassing the device policy management role qualification is allowed + * with the current state of the device. + * + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) + public boolean shouldAllowBypassingDevicePolicyManagementRoleQualification() { + if (mService != null) { + try { + return mService.shouldAllowBypassingDevicePolicyManagementRoleQualification(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + return false; + } } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 77db146545926..fb1ca41ccc569 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -558,4 +558,6 @@ interface IDevicePolicyManager { void setStrings(in List strings); void resetStrings(in String[] stringIds); ParcelableResource getString(String stringId); + + boolean shouldAllowBypassingDevicePolicyManagementRoleQualification(); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java index 200b120843ccc..ba00beea47cce 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -189,4 +189,9 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { public ParcelableResource getString(String stringId) { return null; } + + @Override + public boolean shouldAllowBypassingDevicePolicyManagementRoleQualification() { + return false; + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 3d40f48f244d8..3a98e4e0babf6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -18790,4 +18790,18 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mInjector.binderWithCleanCallingIdentity(() -> Settings.Secure.putInt( mContext.getContentResolver(), MANAGED_PROVISIONING_DPC_DOWNLOADED, setTo)); } + + @Override + public boolean shouldAllowBypassingDevicePolicyManagementRoleQualification() { + Preconditions.checkCallAuthorization(hasCallingOrSelfPermission( + android.Manifest.permission.MANAGE_ROLE_HOLDERS)); + return mInjector.binderWithCleanCallingIdentity(() -> { + if (mUserManager.getUserCount() > 1) { + return false; + } + AccountManager am = AccountManager.get(mContext); + Account[] accounts = am.getAccounts(); + return accounts.length == 0; + }); + } }