From 003bcd4948483bdaf3c64d380a6e1956810ef450 Mon Sep 17 00:00:00 2001 From: Kholoud Mohamed Date: Wed, 5 Apr 2023 16:31:40 +0000 Subject: [PATCH] Fix policy engine serialisation Bug: 273494642 Test: btest a.d.c.DeviceManagementCoexistenceTest Change-Id: I75805b12117d106f75e0252c460f65f0cdab3c8a --- .../app/admin/IntentFilterPolicyKey.java | 28 +++++- .../devicepolicy/BooleanPolicySerializer.java | 15 ++-- .../devicepolicy/BundlePolicySerializer.java | 18 ++-- .../ComponentNamePolicySerializer.java | 23 ++--- .../devicepolicy/DevicePolicyEngine.java | 89 +++++++++++-------- .../DevicePolicyManagerService.java | 2 +- .../devicepolicy/IntegerPolicySerializer.java | 14 +-- .../LockTaskPolicySerializer.java | 22 ++--- .../devicepolicy/LongPolicySerializer.java | 14 +-- .../server/devicepolicy/PolicyDefinition.java | 9 +- .../server/devicepolicy/PolicySerializer.java | 5 +- .../server/devicepolicy/PolicyState.java | 78 +++++++++++----- .../StringSetPolicySerializer.java | 12 +-- 13 files changed, 209 insertions(+), 120 deletions(-) diff --git a/core/java/android/app/admin/IntentFilterPolicyKey.java b/core/java/android/app/admin/IntentFilterPolicyKey.java index 30aad965c0089..7526a7b2c9342 100644 --- a/core/java/android/app/admin/IntentFilterPolicyKey.java +++ b/core/java/android/app/admin/IntentFilterPolicyKey.java @@ -28,7 +28,9 @@ import android.content.IntentFilter; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; +import com.android.internal.util.XmlUtils; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; @@ -45,6 +47,10 @@ import java.util.Objects; */ @SystemApi public final class IntentFilterPolicyKey extends PolicyKey { + + private static final String TAG = "IntentFilterPolicyKey"; + + private static final String TAG_INTENT_FILTER_ENTRY = "filter"; private final IntentFilter mFilter; /** @@ -83,7 +89,9 @@ public final class IntentFilterPolicyKey extends PolicyKey { @Override public void saveToXml(TypedXmlSerializer serializer) throws IOException { serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier()); + serializer.startTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY); mFilter.writeToXml(serializer); + serializer.endTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY); } /** @@ -93,11 +101,27 @@ public final class IntentFilterPolicyKey extends PolicyKey { public IntentFilterPolicyKey readFromXml(TypedXmlPullParser parser) throws XmlPullParserException, IOException { String identifier = parser.getAttributeValue(/* namespace= */ null, ATTR_POLICY_IDENTIFIER); - IntentFilter filter = new IntentFilter(); - filter.readFromXml(parser); + IntentFilter filter = readIntentFilterFromXml(parser); return new IntentFilterPolicyKey(identifier, filter); } + @Nullable + private IntentFilter readIntentFilterFromXml(TypedXmlPullParser parser) + throws XmlPullParserException, IOException { + int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + String tag = parser.getName(); + if (tag.equals(TAG_INTENT_FILTER_ENTRY)) { + IntentFilter filter = new IntentFilter(); + filter.readFromXml(parser); + return filter; + } + Log.e(TAG, "Unknown tag: " + tag); + } + Log.e(TAG, "Error parsing IntentFilterPolicyKey, IntentFilter not found"); + return null; + } + /** * @hide */ diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BooleanPolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/BooleanPolicySerializer.java index 474df98cb1e67..950ec77f5ba83 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BooleanPolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BooleanPolicySerializer.java @@ -32,22 +32,25 @@ import java.util.Objects; final class BooleanPolicySerializer extends PolicySerializer { + private static final String ATTR_VALUE = "value"; + + private static final String TAG = "BooleanPolicySerializer"; + @Override - void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName, - @NonNull Boolean value) + void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Boolean value) throws IOException { Objects.requireNonNull(value); - serializer.attributeBoolean(/* namespace= */ null, attributeName, value); + serializer.attributeBoolean(/* namespace= */ null, ATTR_VALUE, value); } @Nullable @Override - BooleanPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { + BooleanPolicyValue readFromXml(TypedXmlPullParser parser) { try { return new BooleanPolicyValue( - parser.getAttributeBoolean(/* namespace= */ null, attributeName)); + parser.getAttributeBoolean(/* namespace= */ null, ATTR_VALUE)); } catch (XmlPullParserException e) { - Log.e(DevicePolicyEngine.TAG, "Error parsing Boolean policy value", e); + Log.e(TAG, "Error parsing Boolean policy value", e); return null; } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java index c79aac722bd7c..ee73f8afabd2e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java @@ -53,6 +53,10 @@ import java.util.Objects; // rather than in its own files. final class BundlePolicySerializer extends PolicySerializer { + private static final String TAG = "BundlePolicySerializer"; + + private static final String ATTR_FILE_NAME = "file-name"; + private static final String RESTRICTIONS_FILE_PREFIX = "AppRestrictions_"; private static final String XML_SUFFIX = ".xml"; @@ -72,7 +76,7 @@ final class BundlePolicySerializer extends PolicySerializer { @Override void saveToXml(@NonNull PolicyKey policyKey, TypedXmlSerializer serializer, - String attributeName, @NonNull Bundle value) throws IOException { + @NonNull Bundle value) throws IOException { Objects.requireNonNull(value); Objects.requireNonNull(policyKey); if (!(policyKey instanceof PackagePolicyKey)) { @@ -82,13 +86,13 @@ final class BundlePolicySerializer extends PolicySerializer { String packageName = ((PackagePolicyKey) policyKey).getPackageName(); String fileName = packageToRestrictionsFileName(packageName, value); writeApplicationRestrictionsLAr(fileName, value); - serializer.attribute(/* namespace= */ null, attributeName, fileName); + serializer.attribute(/* namespace= */ null, ATTR_FILE_NAME, fileName); } @Nullable @Override - BundlePolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { - String fileName = parser.getAttributeValue(/* namespace= */ null, attributeName); + BundlePolicyValue readFromXml(TypedXmlPullParser parser) { + String fileName = parser.getAttributeValue(/* namespace= */ null, ATTR_FILE_NAME); return new BundlePolicyValue(readApplicationRestrictions(fileName)); } @@ -119,7 +123,7 @@ final class BundlePolicySerializer extends PolicySerializer { final TypedXmlPullParser parser = Xml.resolvePullParser(fis); XmlUtils.nextElement(parser); if (parser.getEventType() != XmlPullParser.START_TAG) { - Slog.e(DevicePolicyEngine.TAG, "Unable to read restrictions file " + Slog.e(TAG, "Unable to read restrictions file " + restrictionsFile.getBaseFile()); return restrictions; } @@ -127,7 +131,7 @@ final class BundlePolicySerializer extends PolicySerializer { readEntry(restrictions, values, parser); } } catch (IOException | XmlPullParserException e) { - Slog.w(DevicePolicyEngine.TAG, "Error parsing " + restrictionsFile.getBaseFile(), e); + Slog.w(TAG, "Error parsing " + restrictionsFile.getBaseFile(), e); } finally { IoUtils.closeQuietly(fis); } @@ -209,7 +213,7 @@ final class BundlePolicySerializer extends PolicySerializer { restrictionsFile.finishWrite(fos); } catch (Exception e) { restrictionsFile.failWrite(fos); - Slog.e(DevicePolicyEngine.TAG, "Error writing application restrictions list", e); + Slog.e(TAG, "Error writing application restrictions list", e); } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/ComponentNamePolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/ComponentNamePolicySerializer.java index d1c6bcb8b48c2..6303a1a8b8603 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/ComponentNamePolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/ComponentNamePolicySerializer.java @@ -30,30 +30,31 @@ import java.io.IOException; import java.util.Objects; final class ComponentNamePolicySerializer extends PolicySerializer { - private static final String ATTR_PACKAGE_NAME = ":package-name"; - private static final String ATTR_CLASS_NAME = ":class-name"; + + private static final String TAG = "ComponentNamePolicySerializer"; + + private static final String ATTR_PACKAGE_NAME = "package-name"; + private static final String ATTR_CLASS_NAME = "class-name"; @Override - void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix, + void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull ComponentName value) throws IOException { Objects.requireNonNull(value); serializer.attribute( - /* namespace= */ null, - attributeNamePrefix + ATTR_PACKAGE_NAME, value.getPackageName()); + /* namespace= */ null, ATTR_PACKAGE_NAME, value.getPackageName()); serializer.attribute( - /* namespace= */ null, - attributeNamePrefix + ATTR_CLASS_NAME, value.getClassName()); + /* namespace= */ null, ATTR_CLASS_NAME, value.getClassName()); } @Nullable @Override - ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) { + ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser) { String packageName = parser.getAttributeValue( - /* namespace= */ null, attributeNamePrefix + ATTR_PACKAGE_NAME); + /* namespace= */ null, ATTR_PACKAGE_NAME); String className = parser.getAttributeValue( - /* namespace= */ null, attributeNamePrefix + ATTR_CLASS_NAME); + /* namespace= */ null, ATTR_CLASS_NAME); if (packageName == null || className == null) { - Log.e(DevicePolicyEngine.TAG, "Error parsing ComponentName policy."); + Log.e(TAG, "Error parsing ComponentName policy."); return null; } return new ComponentNamePolicyValue(new ComponentName(packageName, className)); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java index d4f4b72fbb2bd..f111a95413032 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java @@ -1181,7 +1181,8 @@ final class DevicePolicyEngine { private static final String DEVICE_POLICIES_XML = "device_policy_state.xml"; private static final String TAG_LOCAL_POLICY_ENTRY = "local-policy-entry"; private static final String TAG_GLOBAL_POLICY_ENTRY = "global-policy-entry"; - private static final String TAG_ADMINS_POLICY_ENTRY = "admins-policy-entry"; + private static final String TAG_POLICY_STATE_ENTRY = "policy-state-entry"; + private static final String TAG_POLICY_KEY_ENTRY = "policy-key-entry"; private static final String TAG_ENFORCING_ADMINS_ENTRY = "enforcing-admins-entry"; private static final String ATTR_USER_ID = "user-id"; @@ -1236,11 +1237,14 @@ final class DevicePolicyEngine { serializer.startTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY); serializer.attributeInt(/* namespace= */ null, ATTR_USER_ID, userId); - policy.getKey().saveToXml(serializer); - serializer.startTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY); + serializer.startTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY); + policy.getKey().saveToXml(serializer); + serializer.endTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY); + + serializer.startTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY); policy.getValue().saveToXml(serializer); - serializer.endTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY); + serializer.endTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY); serializer.endTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY); } @@ -1253,11 +1257,13 @@ final class DevicePolicyEngine { for (Map.Entry> policy : mGlobalPolicies.entrySet()) { serializer.startTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY); + serializer.startTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY); policy.getKey().saveToXml(serializer); + serializer.endTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY); - serializer.startTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY); + serializer.startTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY); policy.getValue().saveToXml(serializer); - serializer.endTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY); + serializer.endTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY); serializer.endTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY); } @@ -1323,28 +1329,56 @@ final class DevicePolicyEngine { private void readLocalPoliciesInner(TypedXmlPullParser parser) throws XmlPullParserException, IOException { int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID); - PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser); - if (!mLocalPolicies.contains(userId)) { - mLocalPolicies.put(userId, new HashMap<>()); + PolicyKey policyKey = null; + PolicyState policyState = null; + int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + String tag = parser.getName(); + switch (tag) { + case TAG_POLICY_KEY_ENTRY: + policyKey = PolicyDefinition.readPolicyKeyFromXml(parser); + break; + case TAG_POLICY_STATE_ENTRY: + policyState = PolicyState.readFromXml(parser); + break; + default: + Log.e(TAG, "Unknown tag for local policy entry" + tag); + } } - PolicyState adminsPolicy = parseAdminsPolicy(parser); - if (adminsPolicy != null) { - mLocalPolicies.get(userId).put(policyKey, adminsPolicy); + + if (policyKey != null && policyState != null) { + if (!mLocalPolicies.contains(userId)) { + mLocalPolicies.put(userId, new HashMap<>()); + } + mLocalPolicies.get(userId).put(policyKey, policyState); } else { - Log.e(TAG, - "Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy."); + Log.e(TAG, "Error parsing local policy"); } } private void readGlobalPoliciesInner(TypedXmlPullParser parser) throws IOException, XmlPullParserException { - PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser); - PolicyState adminsPolicy = parseAdminsPolicy(parser); - if (adminsPolicy != null) { - mGlobalPolicies.put(policyKey, adminsPolicy); + PolicyKey policyKey = null; + PolicyState policyState = null; + int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + String tag = parser.getName(); + switch (tag) { + case TAG_POLICY_KEY_ENTRY: + policyKey = PolicyDefinition.readPolicyKeyFromXml(parser); + break; + case TAG_POLICY_STATE_ENTRY: + policyState = PolicyState.readFromXml(parser); + break; + default: + Log.e(TAG, "Unknown tag for local policy entry" + tag); + } + } + + if (policyKey != null && policyState != null) { + mGlobalPolicies.put(policyKey, policyState); } else { - Log.e(TAG, - "Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy."); + Log.e(TAG, "Error parsing global policy"); } } @@ -1356,20 +1390,5 @@ final class DevicePolicyEngine { } mEnforcingAdmins.get(admin.getUserId()).add(admin); } - - @Nullable - private PolicyState parseAdminsPolicy(TypedXmlPullParser parser) - throws XmlPullParserException, IOException { - int outerDepth = parser.getDepth(); - while (XmlUtils.nextElementWithin(parser, outerDepth)) { - String tag = parser.getName(); - if (tag.equals(TAG_ADMINS_POLICY_ENTRY)) { - return PolicyState.readFromXml(parser); - } - Log.e(TAG, "Unknown tag " + tag); - } - Log.e(TAG, "Error parsing file, AdminsPolicy not found"); - return null; - } } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 4a824e4c331c1..51f92766a3879 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -11337,7 +11337,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { for (PolicyKey key : keys) { if (!(key instanceof IntentFilterPolicyKey)) { throw new IllegalStateException("PolicyKey for PERSISTENT_PREFERRED_ACTIVITY is not" - + "of type PersistentPreferredActivityPolicyKey"); + + "of type IntentFilterPolicyKey"); } IntentFilterPolicyKey parsedKey = (IntentFilterPolicyKey) key; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/IntegerPolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/IntegerPolicySerializer.java index bff6d3288dca1..45a2d2a7bda16 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/IntegerPolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/IntegerPolicySerializer.java @@ -32,21 +32,25 @@ import java.util.Objects; final class IntegerPolicySerializer extends PolicySerializer { + private static final String TAG = "IntegerPolicySerializer"; + + private static final String ATTR_VALUE = "value"; + @Override - void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName, + void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Integer value) throws IOException { Objects.requireNonNull(value); - serializer.attributeInt(/* namespace= */ null, attributeName, value); + serializer.attributeInt(/* namespace= */ null, ATTR_VALUE, value); } @Nullable @Override - IntegerPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { + IntegerPolicyValue readFromXml(TypedXmlPullParser parser) { try { return new IntegerPolicyValue( - parser.getAttributeInt(/* namespace= */ null, attributeName)); + parser.getAttributeInt(/* namespace= */ null, ATTR_VALUE)); } catch (XmlPullParserException e) { - Log.e(DevicePolicyEngine.TAG, "Error parsing Integer policy value", e); + Log.e(TAG, "Error parsing Integer policy value", e); return null; } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java index 3265b61a3543a..0f6f3c5a59211 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java @@ -32,12 +32,14 @@ import java.util.Set; final class LockTaskPolicySerializer extends PolicySerializer { - private static final String ATTR_PACKAGES = ":packages"; + private static final String TAG = "LockTaskPolicySerializer"; + + private static final String ATTR_PACKAGES = "packages"; private static final String ATTR_PACKAGES_SEPARATOR = ";"; - private static final String ATTR_FLAGS = ":flags"; + private static final String ATTR_FLAGS = "flags"; @Override - void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix, + void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull LockTaskPolicy value) throws IOException { Objects.requireNonNull(value); if (value.getPackages() == null || value.getPackages().isEmpty()) { @@ -46,31 +48,31 @@ final class LockTaskPolicySerializer extends PolicySerializer { } serializer.attribute( /* namespace= */ null, - attributeNamePrefix + ATTR_PACKAGES, + ATTR_PACKAGES, String.join(ATTR_PACKAGES_SEPARATOR, value.getPackages())); serializer.attributeInt( /* namespace= */ null, - attributeNamePrefix + ATTR_FLAGS, + ATTR_FLAGS, value.getFlags()); } @Override - LockTaskPolicy readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) { + LockTaskPolicy readFromXml(TypedXmlPullParser parser) { String packagesStr = parser.getAttributeValue( /* namespace= */ null, - attributeNamePrefix + ATTR_PACKAGES); + ATTR_PACKAGES); if (packagesStr == null) { - Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value."); + Log.e(TAG, "Error parsing LockTask policy value."); return null; } Set packages = Set.of(packagesStr.split(ATTR_PACKAGES_SEPARATOR)); try { int flags = parser.getAttributeInt( /* namespace= */ null, - attributeNamePrefix + ATTR_FLAGS); + ATTR_FLAGS); return new LockTaskPolicy(packages, flags); } catch (XmlPullParserException e) { - Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value", e); + Log.e(TAG, "Error parsing LockTask policy value", e); return null; } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/LongPolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/LongPolicySerializer.java index f77d051cab86d..522c4b5e84be8 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/LongPolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/LongPolicySerializer.java @@ -32,21 +32,25 @@ import java.util.Objects; final class LongPolicySerializer extends PolicySerializer { + private static final String TAG = "LongPolicySerializer"; + + private static final String ATTR_VALUE = "value"; + @Override - void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName, + void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Long value) throws IOException { Objects.requireNonNull(value); - serializer.attributeLong(/* namespace= */ null, attributeName, value); + serializer.attributeLong(/* namespace= */ null, ATTR_VALUE, value); } @Nullable @Override - LongPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { + LongPolicyValue readFromXml(TypedXmlPullParser parser) { try { return new LongPolicyValue( - parser.getAttributeLong(/* namespace= */ null, attributeName)); + parser.getAttributeLong(/* namespace= */ null, ATTR_VALUE)); } catch (XmlPullParserException e) { - Log.e(DevicePolicyEngine.TAG, "Error parsing Long policy value", e); + Log.e(TAG, "Error parsing Long policy value", e); return null; } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java index a15aa53be96ca..509a66b4f8f7d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java @@ -531,7 +531,6 @@ final class PolicyDefinition { } void saveToXml(TypedXmlSerializer serializer) throws IOException { - // TODO: here and elsewhere, add tags to ensure attributes aren't overridden by duplication. mPolicyKey.saveToXml(serializer); } @@ -554,14 +553,14 @@ final class PolicyDefinition { return genericPolicyDefinition.mPolicyKey.readFromXml(parser); } - void savePolicyValueToXml(TypedXmlSerializer serializer, String attributeName, V value) + void savePolicyValueToXml(TypedXmlSerializer serializer, V value) throws IOException { - mPolicySerializer.saveToXml(mPolicyKey, serializer, attributeName, value); + mPolicySerializer.saveToXml(mPolicyKey, serializer, value); } @Nullable - PolicyValue readPolicyValueFromXml(TypedXmlPullParser parser, String attributeName) { - return mPolicySerializer.readFromXml(parser, attributeName); + PolicyValue readPolicyValueFromXml(TypedXmlPullParser parser) { + return mPolicySerializer.readFromXml(parser); } @Override diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicySerializer.java index 0ef431f6ff907..5af2fa285483c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicySerializer.java @@ -26,8 +26,7 @@ import com.android.modules.utils.TypedXmlSerializer; import java.io.IOException; abstract class PolicySerializer { - abstract void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, - String attributeName, @NonNull V value) + abstract void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull V value) throws IOException; - abstract PolicyValue readFromXml(TypedXmlPullParser parser, String attributeName); + abstract PolicyValue readFromXml(TypedXmlPullParser parser); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java index 3a792d82d2ba0..741f209a90c39 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java @@ -35,11 +35,14 @@ import java.util.Objects; * Class containing all values set for a certain policy by different admins. */ final class PolicyState { - private static final String TAG_ADMIN_POLICY_ENTRY = "admin-policy-entry"; - private static final String TAG_ENFORCING_ADMIN_ENTRY = "enforcing-admin-entry"; - private static final String ATTR_POLICY_VALUE = "policy-value"; - private static final String ATTR_RESOLVED_POLICY = "resolved-policy"; + private static final String TAG = "PolicyState"; + private static final String TAG_ADMIN_POLICY_ENTRY = "admin-policy-entry"; + + private static final String TAG_POLICY_DEFINITION_ENTRY = "policy-definition-entry"; + private static final String TAG_RESOLVED_VALUE_ENTRY = "resolved-value-entry"; + private static final String TAG_ENFORCING_ADMIN_ENTRY = "enforcing-admin-entry"; + private static final String TAG_POLICY_VALUE_ENTRY = "policy-value-entry"; private final PolicyDefinition mPolicyDefinition; private final LinkedHashMap> mPoliciesSetByAdmins = new LinkedHashMap<>(); @@ -193,18 +196,24 @@ final class PolicyState { } void saveToXml(TypedXmlSerializer serializer) throws IOException { + serializer.startTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY); mPolicyDefinition.saveToXml(serializer); + serializer.endTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY); if (mCurrentResolvedPolicy != null) { + serializer.startTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY); mPolicyDefinition.savePolicyValueToXml( - serializer, ATTR_RESOLVED_POLICY, mCurrentResolvedPolicy.getValue()); + serializer, mCurrentResolvedPolicy.getValue()); + serializer.endTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY); } for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) { serializer.startTag(/* namespace= */ null, TAG_ADMIN_POLICY_ENTRY); + serializer.startTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY); mPolicyDefinition.savePolicyValueToXml( - serializer, ATTR_POLICY_VALUE, mPoliciesSetByAdmins.get(admin).getValue()); + serializer, mPoliciesSetByAdmins.get(admin).getValue()); + serializer.endTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY); serializer.startTag(/* namespace= */ null, TAG_ENFORCING_ADMIN_ENTRY); admin.saveToXml(serializer); @@ -217,32 +226,57 @@ final class PolicyState { static PolicyState readFromXml(TypedXmlPullParser parser) throws IOException, XmlPullParserException { - PolicyDefinition policyDefinition = PolicyDefinition.readFromXml(parser); + PolicyDefinition policyDefinition = null; - PolicyValue currentResolvedPolicy = policyDefinition.readPolicyValueFromXml( - parser, ATTR_RESOLVED_POLICY); + PolicyValue currentResolvedPolicy = null; LinkedHashMap> policiesSetByAdmins = new LinkedHashMap<>(); int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { String tag = parser.getName(); - if (TAG_ADMIN_POLICY_ENTRY.equals(tag)) { - PolicyValue value = policyDefinition.readPolicyValueFromXml( - parser, ATTR_POLICY_VALUE); - EnforcingAdmin admin; - int adminPolicyDepth = parser.getDepth(); - if (XmlUtils.nextElementWithin(parser, adminPolicyDepth) - && parser.getName().equals(TAG_ENFORCING_ADMIN_ENTRY)) { - admin = EnforcingAdmin.readFromXml(parser); - policiesSetByAdmins.put(admin, value); - } - } else { - Log.e(DevicePolicyEngine.TAG, "Unknown tag: " + tag); + switch (tag) { + case TAG_ADMIN_POLICY_ENTRY: + PolicyValue value = null; + EnforcingAdmin admin = null; + int adminPolicyDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, adminPolicyDepth)) { + String adminPolicyTag = parser.getName(); + switch (adminPolicyTag) { + case TAG_ENFORCING_ADMIN_ENTRY: + admin = EnforcingAdmin.readFromXml(parser); + break; + case TAG_POLICY_VALUE_ENTRY: + value = policyDefinition.readPolicyValueFromXml(parser); + break; + } + } + if (admin != null && value != null) { + policiesSetByAdmins.put(admin, value); + } else { + Log.e(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY"); + } + break; + case TAG_POLICY_DEFINITION_ENTRY: + policyDefinition = PolicyDefinition.readFromXml(parser); + break; + + case TAG_RESOLVED_VALUE_ENTRY: + currentResolvedPolicy = policyDefinition.readPolicyValueFromXml(parser); + break; + default: + Log.e(TAG, "Unknown tag: " + tag); } } - return new PolicyState(policyDefinition, policiesSetByAdmins, currentResolvedPolicy); + if (policyDefinition != null) { + return new PolicyState(policyDefinition, policiesSetByAdmins, currentResolvedPolicy); + } else { + Log.e("PolicyState", "Error parsing policyState"); + return null; + } } + + PolicyDefinition getPolicyDefinition() { return mPolicyDefinition; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/StringSetPolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/StringSetPolicySerializer.java index dc6592d731161..24d0521471f77 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/StringSetPolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/StringSetPolicySerializer.java @@ -36,21 +36,17 @@ final class StringSetPolicySerializer extends PolicySerializer> { private static final String ATTR_VALUES_SEPARATOR = ";"; @Override - void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix, + void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Set value) throws IOException { Objects.requireNonNull(value); serializer.attribute( - /* namespace= */ null, - attributeNamePrefix + ATTR_VALUES, - String.join(ATTR_VALUES_SEPARATOR, value)); + /* namespace= */ null, ATTR_VALUES, String.join(ATTR_VALUES_SEPARATOR, value)); } @Nullable @Override - PolicyValue> readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) { - String valuesStr = parser.getAttributeValue( - /* namespace= */ null, - attributeNamePrefix + ATTR_VALUES); + PolicyValue> readFromXml(TypedXmlPullParser parser) { + String valuesStr = parser.getAttributeValue(/* namespace= */ null, ATTR_VALUES); if (valuesStr == null) { Log.e(DevicePolicyEngine.TAG, "Error parsing StringSet policy value."); return null;