Loading core/java/android/app/admin/DevicePolicyManager.java +2 −1 Original line number Diff line number Diff line Loading @@ -9901,7 +9901,8 @@ public class DevicePolicyManager { /** * Called by a device admin to set the long support message. This will be displayed to the user * in the device administators settings screen. * in the device administrators settings screen. If the message is longer than 20000 characters * it may be truncated. * <p> * If the long support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast Loading services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +89 −3 Original line number Diff line number Diff line Loading @@ -320,6 +320,7 @@ import java.lang.reflect.Constructor; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.time.LocalDate; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; Loading @@ -331,6 +332,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -404,6 +406,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private static final int REQUEST_PROFILE_OFF_DEADLINE = 5572; // Binary XML serializer doesn't support longer strings private static final int MAX_POLICY_STRING_LENGTH = 65535; // FrameworkParsingPackageUtils#MAX_FILE_NAME_SIZE, Android packages are used in dir names. private static final int MAX_PACKAGE_NAME_LENGTH = 223; private static final int MAX_LONG_SUPPORT_MESSAGE_LENGTH = 20000; private static final int MAX_SHORT_SUPPORT_MESSAGE_LENGTH = 200; private static final int MAX_ORG_NAME_LENGTH = 200; private static final long MS_PER_DAY = TimeUnit.DAYS.toMillis(1); private static final long EXPIRATION_GRACE_PERIOD_MS = 5 * MS_PER_DAY; // 5 days, in ms Loading Loading @@ -10080,6 +10091,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } Objects.requireNonNull(admin, "admin is null"); Objects.requireNonNull(agent, "agent is null"); enforceMaxPackageNameLength(agent.getPackageName()); final String agentAsString = agent.flattenToString(); enforceMaxStringLength(agentAsString, "agent name"); if (args != null) { enforceMaxStringLength(args, "args"); } final int userHandle = UserHandle.getCallingUserId(); synchronized (getLockObject()) { ActiveAdmin ap = getActiveAdminForCallerLocked(admin, Loading Loading @@ -10298,6 +10315,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(who, "ComponentName is null"); if (packageList != null) { for (String pkg : (List<String>) packageList) { enforceMaxPackageNameLength(pkg); } int userId = UserHandle.getCallingUserId(); List<AccessibilityServiceInfo> enabledServices = null; long id = mInjector.binderClearCallingIdentity(); Loading Loading @@ -10449,6 +10470,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(who, "ComponentName is null"); final int callingUserId = mInjector.userHandleGetCallingUserId(); if (packageList != null) { for (String pkg : (List<String>) packageList) { enforceMaxPackageNameLength(pkg); } List<InputMethodInfo> enabledImes = InputMethodManagerInternal.get() .getEnabledInputMethodListAsUser(callingUserId); if (enabledImes != null) { Loading Loading @@ -11451,6 +11476,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } Objects.requireNonNull(who, "ComponentName is null"); enforceMaxStringLength(accountType, "account type"); synchronized (getLockObject()) { /* * When called on the parent DPM instance (parent == true), affects active admin Loading Loading @@ -11797,6 +11824,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { throws SecurityException { Objects.requireNonNull(who, "ComponentName is null"); Objects.requireNonNull(packages, "packages is null"); for (String pkg : packages) { enforceMaxPackageNameLength(pkg); } synchronized (getLockObject()) { enforceCanCallLockTaskLocked(who); Loading Loading @@ -13600,6 +13630,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } Objects.requireNonNull(who, "ComponentName is null"); message = truncateIfLonger(message, MAX_SHORT_SUPPORT_MESSAGE_LENGTH); final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (getLockObject()) { ActiveAdmin admin = getActiveAdminForUidLocked(who, mInjector.binderGetCallingUid()); Loading Loading @@ -13631,6 +13663,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (!mHasFeature) { return; } message = truncateIfLonger(message, MAX_LONG_SUPPORT_MESSAGE_LENGTH); Objects.requireNonNull(who, "ComponentName is null"); final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (getLockObject()) { Loading Loading @@ -13764,6 +13799,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(who, "ComponentName is null"); final int userHandle = mInjector.userHandleGetCallingUserId(); text = truncateIfLonger(text, MAX_ORG_NAME_LENGTH); synchronized (getLockObject()) { ActiveAdmin admin = getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); Loading Loading @@ -14002,9 +14039,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { throw new IllegalArgumentException("ids must not be null"); } for (String id : ids) { if (TextUtils.isEmpty(id)) { throw new IllegalArgumentException("ids must not contain empty string"); } Preconditions.checkArgument(!TextUtils.isEmpty(id), "ids must not have empty string"); enforceMaxStringLength(id, "affiliation id"); } final Set<String> affiliationIds = new ArraySet<>(ids); Loading Loading @@ -15129,6 +15165,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(admin, "Admin cannot be null."); Objects.requireNonNull(target, "Target cannot be null."); if (bundle != null) { enforceMaxStringLength(bundle, "bundle"); } enforceProfileOrDeviceOwner(admin); Loading Loading @@ -16415,4 +16454,51 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return true; } } /** * Truncates char sequence to maximum length, nulls are ignored. */ private static CharSequence truncateIfLonger(CharSequence input, int maxLength) { return input == null || input.length() <= maxLength ? input : input.subSequence(0, maxLength); } /** * Throw if string argument is too long to be serialized. */ private static void enforceMaxStringLength(String str, String argName) { Preconditions.checkArgument( str.length() <= MAX_POLICY_STRING_LENGTH, argName + " loo long"); } private static void enforceMaxPackageNameLength(String pkg) { Preconditions.checkArgument( pkg.length() <= MAX_PACKAGE_NAME_LENGTH, "Package name too long"); } /** * Throw if persistable bundle contains any string that we can't serialize. */ private static void enforceMaxStringLength(PersistableBundle bundle, String argName) { // Persistable bundles can have other persistable bundles as values, traverse with a queue. Queue<PersistableBundle> queue = new ArrayDeque<>(); queue.add(bundle); while (!queue.isEmpty()) { PersistableBundle current = queue.remove(); for (String key : current.keySet()) { enforceMaxStringLength(key, "key in " + argName); Object value = current.get(key); if (value instanceof String) { enforceMaxStringLength((String) value, "string value in " + argName); } else if (value instanceof String[]) { for (String str : (String[]) value) { enforceMaxStringLength(str, "string value in " + argName); } } else if (value instanceof PersistableBundle) { queue.add((PersistableBundle) value); } } } } } Loading
core/java/android/app/admin/DevicePolicyManager.java +2 −1 Original line number Diff line number Diff line Loading @@ -9901,7 +9901,8 @@ public class DevicePolicyManager { /** * Called by a device admin to set the long support message. This will be displayed to the user * in the device administators settings screen. * in the device administrators settings screen. If the message is longer than 20000 characters * it may be truncated. * <p> * If the long support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast Loading
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +89 −3 Original line number Diff line number Diff line Loading @@ -320,6 +320,7 @@ import java.lang.reflect.Constructor; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.time.LocalDate; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; Loading @@ -331,6 +332,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -404,6 +406,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private static final int REQUEST_PROFILE_OFF_DEADLINE = 5572; // Binary XML serializer doesn't support longer strings private static final int MAX_POLICY_STRING_LENGTH = 65535; // FrameworkParsingPackageUtils#MAX_FILE_NAME_SIZE, Android packages are used in dir names. private static final int MAX_PACKAGE_NAME_LENGTH = 223; private static final int MAX_LONG_SUPPORT_MESSAGE_LENGTH = 20000; private static final int MAX_SHORT_SUPPORT_MESSAGE_LENGTH = 200; private static final int MAX_ORG_NAME_LENGTH = 200; private static final long MS_PER_DAY = TimeUnit.DAYS.toMillis(1); private static final long EXPIRATION_GRACE_PERIOD_MS = 5 * MS_PER_DAY; // 5 days, in ms Loading Loading @@ -10080,6 +10091,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } Objects.requireNonNull(admin, "admin is null"); Objects.requireNonNull(agent, "agent is null"); enforceMaxPackageNameLength(agent.getPackageName()); final String agentAsString = agent.flattenToString(); enforceMaxStringLength(agentAsString, "agent name"); if (args != null) { enforceMaxStringLength(args, "args"); } final int userHandle = UserHandle.getCallingUserId(); synchronized (getLockObject()) { ActiveAdmin ap = getActiveAdminForCallerLocked(admin, Loading Loading @@ -10298,6 +10315,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(who, "ComponentName is null"); if (packageList != null) { for (String pkg : (List<String>) packageList) { enforceMaxPackageNameLength(pkg); } int userId = UserHandle.getCallingUserId(); List<AccessibilityServiceInfo> enabledServices = null; long id = mInjector.binderClearCallingIdentity(); Loading Loading @@ -10449,6 +10470,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(who, "ComponentName is null"); final int callingUserId = mInjector.userHandleGetCallingUserId(); if (packageList != null) { for (String pkg : (List<String>) packageList) { enforceMaxPackageNameLength(pkg); } List<InputMethodInfo> enabledImes = InputMethodManagerInternal.get() .getEnabledInputMethodListAsUser(callingUserId); if (enabledImes != null) { Loading Loading @@ -11451,6 +11476,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } Objects.requireNonNull(who, "ComponentName is null"); enforceMaxStringLength(accountType, "account type"); synchronized (getLockObject()) { /* * When called on the parent DPM instance (parent == true), affects active admin Loading Loading @@ -11797,6 +11824,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { throws SecurityException { Objects.requireNonNull(who, "ComponentName is null"); Objects.requireNonNull(packages, "packages is null"); for (String pkg : packages) { enforceMaxPackageNameLength(pkg); } synchronized (getLockObject()) { enforceCanCallLockTaskLocked(who); Loading Loading @@ -13600,6 +13630,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } Objects.requireNonNull(who, "ComponentName is null"); message = truncateIfLonger(message, MAX_SHORT_SUPPORT_MESSAGE_LENGTH); final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (getLockObject()) { ActiveAdmin admin = getActiveAdminForUidLocked(who, mInjector.binderGetCallingUid()); Loading Loading @@ -13631,6 +13663,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (!mHasFeature) { return; } message = truncateIfLonger(message, MAX_LONG_SUPPORT_MESSAGE_LENGTH); Objects.requireNonNull(who, "ComponentName is null"); final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (getLockObject()) { Loading Loading @@ -13764,6 +13799,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(who, "ComponentName is null"); final int userHandle = mInjector.userHandleGetCallingUserId(); text = truncateIfLonger(text, MAX_ORG_NAME_LENGTH); synchronized (getLockObject()) { ActiveAdmin admin = getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); Loading Loading @@ -14002,9 +14039,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { throw new IllegalArgumentException("ids must not be null"); } for (String id : ids) { if (TextUtils.isEmpty(id)) { throw new IllegalArgumentException("ids must not contain empty string"); } Preconditions.checkArgument(!TextUtils.isEmpty(id), "ids must not have empty string"); enforceMaxStringLength(id, "affiliation id"); } final Set<String> affiliationIds = new ArraySet<>(ids); Loading Loading @@ -15129,6 +15165,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Objects.requireNonNull(admin, "Admin cannot be null."); Objects.requireNonNull(target, "Target cannot be null."); if (bundle != null) { enforceMaxStringLength(bundle, "bundle"); } enforceProfileOrDeviceOwner(admin); Loading Loading @@ -16415,4 +16454,51 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return true; } } /** * Truncates char sequence to maximum length, nulls are ignored. */ private static CharSequence truncateIfLonger(CharSequence input, int maxLength) { return input == null || input.length() <= maxLength ? input : input.subSequence(0, maxLength); } /** * Throw if string argument is too long to be serialized. */ private static void enforceMaxStringLength(String str, String argName) { Preconditions.checkArgument( str.length() <= MAX_POLICY_STRING_LENGTH, argName + " loo long"); } private static void enforceMaxPackageNameLength(String pkg) { Preconditions.checkArgument( pkg.length() <= MAX_PACKAGE_NAME_LENGTH, "Package name too long"); } /** * Throw if persistable bundle contains any string that we can't serialize. */ private static void enforceMaxStringLength(PersistableBundle bundle, String argName) { // Persistable bundles can have other persistable bundles as values, traverse with a queue. Queue<PersistableBundle> queue = new ArrayDeque<>(); queue.add(bundle); while (!queue.isEmpty()) { PersistableBundle current = queue.remove(); for (String key : current.keySet()) { enforceMaxStringLength(key, "key in " + argName); Object value = current.get(key); if (value instanceof String) { enforceMaxStringLength((String) value, "string value in " + argName); } else if (value instanceof String[]) { for (String str : (String[]) value) { enforceMaxStringLength(str, "string value in " + argName); } } else if (value instanceof PersistableBundle) { queue.add((PersistableBundle) value); } } } } }