From ce83a23388adc9ed3ad5dedcb4d023a2c1ce0868 Mon Sep 17 00:00:00 2001 From: Kholoud Mohamed Date: Fri, 5 Apr 2024 15:22:01 +0000 Subject: Add test APIs for policy size tracking Also changed flag to a bug-fix flag Bug: 324060156 Test: atest DevicePolicyManagerTest Change-Id: Ie8ffeb5b50d39c211256a253f80f3d170d01f04a --- core/api/test-current.txt | 6 +++ .../android/app/admin/AccountTypePolicyKey.java | 2 +- core/java/android/app/admin/BundlePolicyValue.java | 2 +- .../app/admin/ComponentNamePolicyValue.java | 2 +- .../android/app/admin/DevicePolicyManager.java | 43 ++++++++++++++++++++++ core/java/android/app/admin/EnforcingAdmin.java | 16 ++++++++ .../android/app/admin/IDevicePolicyManager.aidl | 6 ++- core/java/android/app/admin/LockTaskPolicy.java | 2 +- .../app/admin/PackagePermissionPolicyKey.java | 2 +- core/java/android/app/admin/PackagePolicyKey.java | 2 +- core/java/android/app/admin/StringPolicyValue.java | 2 +- .../android/app/admin/StringSetPolicyValue.java | 2 +- .../app/admin/UserRestrictionPolicyKey.java | 2 +- core/java/android/app/admin/flags/flags.aconfig | 11 ++++++ core/res/AndroidManifest.xml | 7 ++++ .../server/devicepolicy/DevicePolicyEngine.java | 30 +++++++++------ .../devicepolicy/DevicePolicyManagerService.java | 42 ++++++++++++++++++--- .../server/devicepolicy/EnforcingAdmin.java | 41 +++++++++++++++++++++ 18 files changed, 192 insertions(+), 28 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index f36aeab2cb17..5138b589b692 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -589,6 +589,7 @@ package android.app.admin { method @RequiresPermission(android.Manifest.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS) public long forceNetworkLogs(); method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void forceRemoveActiveAdmin(@NonNull android.content.ComponentName, int); method @RequiresPermission(android.Manifest.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS) public long forceSecurityLogs(); + method @FlaggedApi("android.app.admin.flags.device_policy_size_tracking_internal_bug_fix_enabled") @RequiresPermission("android.permission.MANAGE_DEVICE_POLICY_STORAGE_LIMIT") public void forceSetMaxPolicyStorageLimit(int); method public void forceUpdateUserSetupComplete(int); method @NonNull public java.util.Set getDefaultCrossProfilePackages(); method @Deprecated public int getDeviceOwnerType(@NonNull android.content.ComponentName); @@ -599,6 +600,7 @@ package android.app.admin { method public long getLastSecurityLogRetrievalTime(); method public java.util.List getOwnerInstalledCaCerts(@NonNull android.os.UserHandle); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_DEVICE_ADMINS) public java.util.Set getPolicyExemptApps(); + method @FlaggedApi("android.app.admin.flags.device_policy_size_tracking_internal_bug_fix_enabled") @RequiresPermission("android.permission.MANAGE_DEVICE_POLICY_STORAGE_LIMIT") public int getPolicySizeForAdmin(@NonNull android.app.admin.EnforcingAdmin); method public boolean isCurrentInputMethodSetByOwner(); method public boolean isFactoryResetProtectionPolicySupported(); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}) public boolean isNewUserDisclaimerAcknowledged(); @@ -667,6 +669,10 @@ package android.app.admin { field @NonNull public static final android.app.admin.DpcAuthority DPC_AUTHORITY; } + public final class EnforcingAdmin implements android.os.Parcelable { + ctor @FlaggedApi("android.app.admin.flags.device_policy_size_tracking_internal_bug_fix_enabled") public EnforcingAdmin(@NonNull String, @NonNull android.app.admin.Authority, @NonNull android.os.UserHandle, @Nullable android.content.ComponentName); + } + public final class FlagUnion extends android.app.admin.ResolutionMechanism { method public int describeContents(); method public void writeToParcel(@NonNull android.os.Parcel, int); diff --git a/core/java/android/app/admin/AccountTypePolicyKey.java b/core/java/android/app/admin/AccountTypePolicyKey.java index 51f313755e59..02e492bb06aa 100644 --- a/core/java/android/app/admin/AccountTypePolicyKey.java +++ b/core/java/android/app/admin/AccountTypePolicyKey.java @@ -54,7 +54,7 @@ public final class AccountTypePolicyKey extends PolicyKey { @TestApi public AccountTypePolicyKey(@NonNull String key, @NonNull String accountType) { super(key); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxStringLength(accountType, "accountType"); } mAccountType = Objects.requireNonNull((accountType)); diff --git a/core/java/android/app/admin/BundlePolicyValue.java b/core/java/android/app/admin/BundlePolicyValue.java index cb5e9861141d..c993671f4fc1 100644 --- a/core/java/android/app/admin/BundlePolicyValue.java +++ b/core/java/android/app/admin/BundlePolicyValue.java @@ -31,7 +31,7 @@ public final class BundlePolicyValue extends PolicyValue { public BundlePolicyValue(Bundle value) { super(value); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxBundleFieldsLength(value); } } diff --git a/core/java/android/app/admin/ComponentNamePolicyValue.java b/core/java/android/app/admin/ComponentNamePolicyValue.java index a957dbf132bb..a7a2f7d27e0d 100644 --- a/core/java/android/app/admin/ComponentNamePolicyValue.java +++ b/core/java/android/app/admin/ComponentNamePolicyValue.java @@ -31,7 +31,7 @@ public final class ComponentNamePolicyValue extends PolicyValue { public ComponentNamePolicyValue(@NonNull ComponentName value) { super(value); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxComponentNameLength(value); } } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index ea6f45e8e201..17b3cf62d961 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -54,6 +54,7 @@ import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY; import static android.Manifest.permission.SET_TIME; import static android.Manifest.permission.SET_TIME_ZONE; import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; +import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_INTERNAL_BUG_FIX_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED; import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED; @@ -17559,6 +17560,48 @@ public class DevicePolicyManager { return -1; } + /** + * Force sets the maximum storage size allowed for policies associated with an admin regardless + * of the default value set in the system, unlike {@link #setMaxPolicyStorageLimit} which can + * only set it to a value higher than the default value set by the system.Setting a limit of -1 + * effectively removes any storage restrictions. + * + * @param storageLimit Maximum storage allowed in bytes. Use -1 to disable limits. + * + * @hide + */ + @TestApi + @RequiresPermission(permission.MANAGE_DEVICE_POLICY_STORAGE_LIMIT) + @FlaggedApi(FLAG_DEVICE_POLICY_SIZE_TRACKING_INTERNAL_BUG_FIX_ENABLED) + public void forceSetMaxPolicyStorageLimit(int storageLimit) { + if (mService != null) { + try { + mService.forceSetMaxPolicyStorageLimit(mContext.getPackageName(), storageLimit); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Retrieves the size of the current policies set by the {@code admin}. + * + * @hide + */ + @TestApi + @RequiresPermission(permission.MANAGE_DEVICE_POLICY_STORAGE_LIMIT) + @FlaggedApi(FLAG_DEVICE_POLICY_SIZE_TRACKING_INTERNAL_BUG_FIX_ENABLED) + public int getPolicySizeForAdmin(@NonNull EnforcingAdmin admin) { + if (mService != null) { + try { + return mService.getPolicySizeForAdmin(mContext.getPackageName(), admin); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + return -1; + } + /** * @return The headless device owner mode for the current set DO, returns * {@link DeviceAdminInfo#HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED} if no DO is set. diff --git a/core/java/android/app/admin/EnforcingAdmin.java b/core/java/android/app/admin/EnforcingAdmin.java index 7c718f6651a2..f70a53f61671 100644 --- a/core/java/android/app/admin/EnforcingAdmin.java +++ b/core/java/android/app/admin/EnforcingAdmin.java @@ -16,9 +16,13 @@ package android.app.admin; +import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_INTERNAL_BUG_FIX_ENABLED; + +import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.ComponentName; import android.os.Parcel; import android.os.Parcelable; @@ -60,6 +64,8 @@ public final class EnforcingAdmin implements Parcelable { * * @hide */ + @FlaggedApi(FLAG_DEVICE_POLICY_SIZE_TRACKING_INTERNAL_BUG_FIX_ENABLED) + @TestApi public EnforcingAdmin( @NonNull String packageName, @NonNull Authority authority, @NonNull UserHandle userHandle, @Nullable ComponentName componentName) { @@ -101,6 +107,16 @@ public final class EnforcingAdmin implements Parcelable { return mUserHandle; } + /** + * Returns the {@link ComponentName} of the admin if applicable. + * + * @hide + */ + @Nullable + public ComponentName getComponentName() { + return mComponentName; + } + @Override public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 2002326d76bd..d1837132e1a4 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -623,8 +623,10 @@ interface IDevicePolicyManager { int[] getSubscriptionIds(String callerPackageName); - void setMaxPolicyStorageLimit(String packageName, int storageLimit); - int getMaxPolicyStorageLimit(String packageName); + void setMaxPolicyStorageLimit(String callerPackageName, int storageLimit); + void forceSetMaxPolicyStorageLimit(String callerPackageName, int storageLimit); + int getMaxPolicyStorageLimit(String callerPackageName); + int getPolicySizeForAdmin(String callerPackageName, in EnforcingAdmin admin); int getHeadlessDeviceOwnerMode(String callerPackageName); } diff --git a/core/java/android/app/admin/LockTaskPolicy.java b/core/java/android/app/admin/LockTaskPolicy.java index a36ea0508a95..68b4ad84d81a 100644 --- a/core/java/android/app/admin/LockTaskPolicy.java +++ b/core/java/android/app/admin/LockTaskPolicy.java @@ -135,7 +135,7 @@ public final class LockTaskPolicy extends PolicyValue { } private void setPackagesInternal(Set packages) { - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { for (String p : packages) { PolicySizeVerifier.enforceMaxPackageNameLength(p); } diff --git a/core/java/android/app/admin/PackagePermissionPolicyKey.java b/core/java/android/app/admin/PackagePermissionPolicyKey.java index 389585f036db..1a04f6c908bc 100644 --- a/core/java/android/app/admin/PackagePermissionPolicyKey.java +++ b/core/java/android/app/admin/PackagePermissionPolicyKey.java @@ -59,7 +59,7 @@ public final class PackagePermissionPolicyKey extends PolicyKey { public PackagePermissionPolicyKey(@NonNull String identifier, @NonNull String packageName, @NonNull String permissionName) { super(identifier); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxPackageNameLength(packageName); PolicySizeVerifier.enforceMaxStringLength(permissionName, "permissionName"); } diff --git a/core/java/android/app/admin/PackagePolicyKey.java b/core/java/android/app/admin/PackagePolicyKey.java index 68dc797f6513..9e31a23aec91 100644 --- a/core/java/android/app/admin/PackagePolicyKey.java +++ b/core/java/android/app/admin/PackagePolicyKey.java @@ -55,7 +55,7 @@ public final class PackagePolicyKey extends PolicyKey { @TestApi public PackagePolicyKey(@NonNull String key, @NonNull String packageName) { super(key); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxPackageNameLength(packageName); } mPackageName = Objects.requireNonNull((packageName)); diff --git a/core/java/android/app/admin/StringPolicyValue.java b/core/java/android/app/admin/StringPolicyValue.java index 8995c0f20de8..6efe9ad0dbed 100644 --- a/core/java/android/app/admin/StringPolicyValue.java +++ b/core/java/android/app/admin/StringPolicyValue.java @@ -30,7 +30,7 @@ public final class StringPolicyValue extends PolicyValue { public StringPolicyValue(@NonNull String value) { super(value); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxStringLength(value, "policyValue"); } } diff --git a/core/java/android/app/admin/StringSetPolicyValue.java b/core/java/android/app/admin/StringSetPolicyValue.java index f37dfee0f9dc..12b11f4ba687 100644 --- a/core/java/android/app/admin/StringSetPolicyValue.java +++ b/core/java/android/app/admin/StringSetPolicyValue.java @@ -32,7 +32,7 @@ public final class StringSetPolicyValue extends PolicyValue> { public StringSetPolicyValue(@NonNull Set value) { super(value); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { for (String str : value) { PolicySizeVerifier.enforceMaxStringLength(str, "policyValue"); } diff --git a/core/java/android/app/admin/UserRestrictionPolicyKey.java b/core/java/android/app/admin/UserRestrictionPolicyKey.java index ee90ccd9417f..9054287cb7a0 100644 --- a/core/java/android/app/admin/UserRestrictionPolicyKey.java +++ b/core/java/android/app/admin/UserRestrictionPolicyKey.java @@ -45,7 +45,7 @@ public final class UserRestrictionPolicyKey extends PolicyKey { @TestApi public UserRestrictionPolicyKey(@NonNull String identifier, @NonNull String restriction) { super(identifier); - if (Flags.devicePolicySizeTrackingInternalEnabled()) { + if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) { PolicySizeVerifier.enforceMaxStringLength(restriction, "restriction"); } mRestriction = Objects.requireNonNull(restriction); diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig index 56fb4aa45fb3..0bc64b0dc309 100644 --- a/core/java/android/app/admin/flags/flags.aconfig +++ b/core/java/android/app/admin/flags/flags.aconfig @@ -27,6 +27,17 @@ flag { bug: "281543351" } +flag { + name: "device_policy_size_tracking_internal_bug_fix_enabled" + namespace: "enterprise" + description: "Bug fix for tracking the total policy size and have a max threshold" + bug: "281543351" + metadata { + purpose: PURPOSE_BUGFIX + } +} + + flag { name: "onboarding_bugreport_v2_enabled" is_exported: true diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f74329903690..913b63e71d68 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3889,6 +3889,13 @@ + + +