From e4d398c917986cf57d6d31219649a059e1f09145 Mon Sep 17 00:00:00 2001 From: Alex Kershaw Date: Wed, 17 Apr 2019 16:55:42 +0100 Subject: Don't ignore updated policies on PO/DO. For DA, it is important that apps can't update their policies from what the user agreed to. This doesn't apply to DO and PO. Fixes: 123415062 Test: Manually tested with custom TestDPC build. Change-Id: I6d4dd98bdc6bee8fee03451530d98d67ce005b30 --- .../devicepolicy/DevicePolicyManagerService.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 8f1709e4d614..3d83a78f15b2 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1379,7 +1379,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - void readFromXml(XmlPullParser parser) + void readFromXml(XmlPullParser parser, boolean shouldOverridePolicies) throws XmlPullParserException, IOException { int outerDepth = parser.getDepth(); int type; @@ -1390,7 +1390,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } String tag = parser.getName(); if (TAG_POLICIES.equals(tag)) { - info.readPoliciesFromXml(parser); + if (shouldOverridePolicies) { + Log.d(LOG_TAG, "Overriding device admin policies from XML."); + info.readPoliciesFromXml(parser); + } } else if (TAG_PASSWORD_QUALITY.equals(tag)) { minimumPasswordMetrics.quality = Integer.parseInt( parser.getAttributeValue(null, ATTR_VALUE)); @@ -1518,9 +1521,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } else if (TAG_PARENT_ADMIN.equals(tag)) { Preconditions.checkState(!isParent); - parentAdmin = new ActiveAdmin(info, /* parent */ true); - parentAdmin.readFromXml(parser); + parentAdmin.readFromXml(parser, shouldOverridePolicies); } else if (TAG_ORGANIZATION_COLOR.equals(tag)) { organizationColor = Integer.parseInt( parser.getAttributeValue(null, ATTR_VALUE)); @@ -3326,8 +3328,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { + userHandle); } if (dai != null) { + boolean shouldOverwritePolicies = + shouldOverwritePoliciesFromXml(dai.getComponent(), userHandle); ActiveAdmin ap = new ActiveAdmin(dai, /* parent */ false); - ap.readFromXml(parser); + ap.readFromXml(parser, shouldOverwritePolicies); policy.mAdminMap.put(ap.info.getComponent(), ap); } } catch (RuntimeException e) { @@ -3437,6 +3441,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } + private boolean shouldOverwritePoliciesFromXml( + ComponentName deviceAdminComponent, int userHandle) { + // http://b/123415062: If DA, overwrite with the stored policies that were agreed by the + // user to prevent apps from sneaking additional policies into updates. + return !isProfileOwner(deviceAdminComponent, userHandle) + && !isDeviceOwner(deviceAdminComponent, userHandle); + } + private void updateLockTaskPackagesLocked(List packages, int userId) { long ident = mInjector.binderClearCallingIdentity(); try { -- cgit v1.2.3-59-g8ed1b