Merge "Fix policy engine serialisation" into udc-dev

This commit is contained in:
Jonathan Scott
2023-04-06 14:20:46 +00:00
committed by Android (Google) Code Review
13 changed files with 209 additions and 120 deletions

View File

@@ -28,7 +28,9 @@ import android.content.IntentFilter;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; 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.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer; import com.android.modules.utils.TypedXmlSerializer;
@@ -45,6 +47,10 @@ import java.util.Objects;
*/ */
@SystemApi @SystemApi
public final class IntentFilterPolicyKey extends PolicyKey { 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; private final IntentFilter mFilter;
/** /**
@@ -83,7 +89,9 @@ public final class IntentFilterPolicyKey extends PolicyKey {
@Override @Override
public void saveToXml(TypedXmlSerializer serializer) throws IOException { public void saveToXml(TypedXmlSerializer serializer) throws IOException {
serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier()); serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier());
serializer.startTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY);
mFilter.writeToXml(serializer); mFilter.writeToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY);
} }
/** /**
@@ -93,9 +101,25 @@ public final class IntentFilterPolicyKey extends PolicyKey {
public IntentFilterPolicyKey readFromXml(TypedXmlPullParser parser) public IntentFilterPolicyKey readFromXml(TypedXmlPullParser parser)
throws XmlPullParserException, IOException { throws XmlPullParserException, IOException {
String identifier = parser.getAttributeValue(/* namespace= */ null, ATTR_POLICY_IDENTIFIER); String identifier = parser.getAttributeValue(/* namespace= */ null, ATTR_POLICY_IDENTIFIER);
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(); IntentFilter filter = new IntentFilter();
filter.readFromXml(parser); filter.readFromXml(parser);
return new IntentFilterPolicyKey(identifier, filter); return filter;
}
Log.e(TAG, "Unknown tag: " + tag);
}
Log.e(TAG, "Error parsing IntentFilterPolicyKey, IntentFilter not found");
return null;
} }
/** /**

View File

@@ -32,22 +32,25 @@ import java.util.Objects;
final class BooleanPolicySerializer extends PolicySerializer<Boolean> { final class BooleanPolicySerializer extends PolicySerializer<Boolean> {
private static final String ATTR_VALUE = "value";
private static final String TAG = "BooleanPolicySerializer";
@Override @Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName, void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Boolean value)
@NonNull Boolean value)
throws IOException { throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
serializer.attributeBoolean(/* namespace= */ null, attributeName, value); serializer.attributeBoolean(/* namespace= */ null, ATTR_VALUE, value);
} }
@Nullable @Nullable
@Override @Override
BooleanPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { BooleanPolicyValue readFromXml(TypedXmlPullParser parser) {
try { try {
return new BooleanPolicyValue( return new BooleanPolicyValue(
parser.getAttributeBoolean(/* namespace= */ null, attributeName)); parser.getAttributeBoolean(/* namespace= */ null, ATTR_VALUE));
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing Boolean policy value", e); Log.e(TAG, "Error parsing Boolean policy value", e);
return null; return null;
} }
} }

View File

@@ -53,6 +53,10 @@ import java.util.Objects;
// rather than in its own files. // rather than in its own files.
final class BundlePolicySerializer extends PolicySerializer<Bundle> { final class BundlePolicySerializer extends PolicySerializer<Bundle> {
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 RESTRICTIONS_FILE_PREFIX = "AppRestrictions_";
private static final String XML_SUFFIX = ".xml"; private static final String XML_SUFFIX = ".xml";
@@ -72,7 +76,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
@Override @Override
void saveToXml(@NonNull PolicyKey policyKey, TypedXmlSerializer serializer, void saveToXml(@NonNull PolicyKey policyKey, TypedXmlSerializer serializer,
String attributeName, @NonNull Bundle value) throws IOException { @NonNull Bundle value) throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
Objects.requireNonNull(policyKey); Objects.requireNonNull(policyKey);
if (!(policyKey instanceof PackagePolicyKey)) { if (!(policyKey instanceof PackagePolicyKey)) {
@@ -82,13 +86,13 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
String packageName = ((PackagePolicyKey) policyKey).getPackageName(); String packageName = ((PackagePolicyKey) policyKey).getPackageName();
String fileName = packageToRestrictionsFileName(packageName, value); String fileName = packageToRestrictionsFileName(packageName, value);
writeApplicationRestrictionsLAr(fileName, value); writeApplicationRestrictionsLAr(fileName, value);
serializer.attribute(/* namespace= */ null, attributeName, fileName); serializer.attribute(/* namespace= */ null, ATTR_FILE_NAME, fileName);
} }
@Nullable @Nullable
@Override @Override
BundlePolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { BundlePolicyValue readFromXml(TypedXmlPullParser parser) {
String fileName = parser.getAttributeValue(/* namespace= */ null, attributeName); String fileName = parser.getAttributeValue(/* namespace= */ null, ATTR_FILE_NAME);
return new BundlePolicyValue(readApplicationRestrictions(fileName)); return new BundlePolicyValue(readApplicationRestrictions(fileName));
} }
@@ -119,7 +123,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
final TypedXmlPullParser parser = Xml.resolvePullParser(fis); final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
XmlUtils.nextElement(parser); XmlUtils.nextElement(parser);
if (parser.getEventType() != XmlPullParser.START_TAG) { 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()); + restrictionsFile.getBaseFile());
return restrictions; return restrictions;
} }
@@ -127,7 +131,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
readEntry(restrictions, values, parser); readEntry(restrictions, values, parser);
} }
} catch (IOException | XmlPullParserException e) { } catch (IOException | XmlPullParserException e) {
Slog.w(DevicePolicyEngine.TAG, "Error parsing " + restrictionsFile.getBaseFile(), e); Slog.w(TAG, "Error parsing " + restrictionsFile.getBaseFile(), e);
} finally { } finally {
IoUtils.closeQuietly(fis); IoUtils.closeQuietly(fis);
} }
@@ -209,7 +213,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
restrictionsFile.finishWrite(fos); restrictionsFile.finishWrite(fos);
} catch (Exception e) { } catch (Exception e) {
restrictionsFile.failWrite(fos); restrictionsFile.failWrite(fos);
Slog.e(DevicePolicyEngine.TAG, "Error writing application restrictions list", e); Slog.e(TAG, "Error writing application restrictions list", e);
} }
} }

View File

@@ -30,30 +30,31 @@ import java.io.IOException;
import java.util.Objects; import java.util.Objects;
final class ComponentNamePolicySerializer extends PolicySerializer<ComponentName> { final class ComponentNamePolicySerializer extends PolicySerializer<ComponentName> {
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 @Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix, void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull ComponentName value) throws IOException { @NonNull ComponentName value) throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
serializer.attribute( serializer.attribute(
/* namespace= */ null, /* namespace= */ null, ATTR_PACKAGE_NAME, value.getPackageName());
attributeNamePrefix + ATTR_PACKAGE_NAME, value.getPackageName());
serializer.attribute( serializer.attribute(
/* namespace= */ null, /* namespace= */ null, ATTR_CLASS_NAME, value.getClassName());
attributeNamePrefix + ATTR_CLASS_NAME, value.getClassName());
} }
@Nullable @Nullable
@Override @Override
ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) { ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser) {
String packageName = parser.getAttributeValue( String packageName = parser.getAttributeValue(
/* namespace= */ null, attributeNamePrefix + ATTR_PACKAGE_NAME); /* namespace= */ null, ATTR_PACKAGE_NAME);
String className = parser.getAttributeValue( String className = parser.getAttributeValue(
/* namespace= */ null, attributeNamePrefix + ATTR_CLASS_NAME); /* namespace= */ null, ATTR_CLASS_NAME);
if (packageName == null || className == null) { if (packageName == null || className == null) {
Log.e(DevicePolicyEngine.TAG, "Error parsing ComponentName policy."); Log.e(TAG, "Error parsing ComponentName policy.");
return null; return null;
} }
return new ComponentNamePolicyValue(new ComponentName(packageName, className)); return new ComponentNamePolicyValue(new ComponentName(packageName, className));

View File

@@ -1181,7 +1181,8 @@ final class DevicePolicyEngine {
private static final String DEVICE_POLICIES_XML = "device_policy_state.xml"; 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_LOCAL_POLICY_ENTRY = "local-policy-entry";
private static final String TAG_GLOBAL_POLICY_ENTRY = "global-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 TAG_ENFORCING_ADMINS_ENTRY = "enforcing-admins-entry";
private static final String ATTR_USER_ID = "user-id"; 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.startTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY);
serializer.attributeInt(/* namespace= */ null, ATTR_USER_ID, userId); 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); 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); serializer.endTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY);
} }
@@ -1253,11 +1257,13 @@ final class DevicePolicyEngine {
for (Map.Entry<PolicyKey, PolicyState<?>> policy : mGlobalPolicies.entrySet()) { for (Map.Entry<PolicyKey, PolicyState<?>> policy : mGlobalPolicies.entrySet()) {
serializer.startTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY); serializer.startTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY);
policy.getKey().saveToXml(serializer); 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); 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); serializer.endTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY);
} }
@@ -1323,28 +1329,56 @@ final class DevicePolicyEngine {
private void readLocalPoliciesInner(TypedXmlPullParser parser) private void readLocalPoliciesInner(TypedXmlPullParser parser)
throws XmlPullParserException, IOException { throws XmlPullParserException, IOException {
int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID); int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser); 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) {
if (!mLocalPolicies.contains(userId)) { if (!mLocalPolicies.contains(userId)) {
mLocalPolicies.put(userId, new HashMap<>()); mLocalPolicies.put(userId, new HashMap<>());
} }
PolicyState<?> adminsPolicy = parseAdminsPolicy(parser); mLocalPolicies.get(userId).put(policyKey, policyState);
if (adminsPolicy != null) {
mLocalPolicies.get(userId).put(policyKey, adminsPolicy);
} else { } else {
Log.e(TAG, Log.e(TAG, "Error parsing local policy");
"Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy.");
} }
} }
private void readGlobalPoliciesInner(TypedXmlPullParser parser) private void readGlobalPoliciesInner(TypedXmlPullParser parser)
throws IOException, XmlPullParserException { throws IOException, XmlPullParserException {
PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser); PolicyKey policyKey = null;
PolicyState<?> adminsPolicy = parseAdminsPolicy(parser); PolicyState<?> policyState = null;
if (adminsPolicy != null) { int outerDepth = parser.getDepth();
mGlobalPolicies.put(policyKey, adminsPolicy); 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 { } else {
Log.e(TAG, Log.e(TAG, "Error parsing global policy");
"Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy.");
} }
} }
@@ -1356,20 +1390,5 @@ final class DevicePolicyEngine {
} }
mEnforcingAdmins.get(admin.getUserId()).add(admin); 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;
}
} }
} }

View File

@@ -11391,7 +11391,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
for (PolicyKey key : keys) { for (PolicyKey key : keys) {
if (!(key instanceof IntentFilterPolicyKey)) { if (!(key instanceof IntentFilterPolicyKey)) {
throw new IllegalStateException("PolicyKey for PERSISTENT_PREFERRED_ACTIVITY is not" throw new IllegalStateException("PolicyKey for PERSISTENT_PREFERRED_ACTIVITY is not"
+ "of type PersistentPreferredActivityPolicyKey"); + "of type IntentFilterPolicyKey");
} }
IntentFilterPolicyKey parsedKey = IntentFilterPolicyKey parsedKey =
(IntentFilterPolicyKey) key; (IntentFilterPolicyKey) key;

View File

@@ -32,21 +32,25 @@ import java.util.Objects;
final class IntegerPolicySerializer extends PolicySerializer<Integer> { final class IntegerPolicySerializer extends PolicySerializer<Integer> {
private static final String TAG = "IntegerPolicySerializer";
private static final String ATTR_VALUE = "value";
@Override @Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName, void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull Integer value) throws IOException { @NonNull Integer value) throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
serializer.attributeInt(/* namespace= */ null, attributeName, value); serializer.attributeInt(/* namespace= */ null, ATTR_VALUE, value);
} }
@Nullable @Nullable
@Override @Override
IntegerPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { IntegerPolicyValue readFromXml(TypedXmlPullParser parser) {
try { try {
return new IntegerPolicyValue( return new IntegerPolicyValue(
parser.getAttributeInt(/* namespace= */ null, attributeName)); parser.getAttributeInt(/* namespace= */ null, ATTR_VALUE));
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing Integer policy value", e); Log.e(TAG, "Error parsing Integer policy value", e);
return null; return null;
} }
} }

View File

@@ -32,12 +32,14 @@ import java.util.Set;
final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> { final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> {
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_PACKAGES_SEPARATOR = ";";
private static final String ATTR_FLAGS = ":flags"; private static final String ATTR_FLAGS = "flags";
@Override @Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix, void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull LockTaskPolicy value) throws IOException { @NonNull LockTaskPolicy value) throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
if (value.getPackages() == null || value.getPackages().isEmpty()) { if (value.getPackages() == null || value.getPackages().isEmpty()) {
@@ -46,31 +48,31 @@ final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> {
} }
serializer.attribute( serializer.attribute(
/* namespace= */ null, /* namespace= */ null,
attributeNamePrefix + ATTR_PACKAGES, ATTR_PACKAGES,
String.join(ATTR_PACKAGES_SEPARATOR, value.getPackages())); String.join(ATTR_PACKAGES_SEPARATOR, value.getPackages()));
serializer.attributeInt( serializer.attributeInt(
/* namespace= */ null, /* namespace= */ null,
attributeNamePrefix + ATTR_FLAGS, ATTR_FLAGS,
value.getFlags()); value.getFlags());
} }
@Override @Override
LockTaskPolicy readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) { LockTaskPolicy readFromXml(TypedXmlPullParser parser) {
String packagesStr = parser.getAttributeValue( String packagesStr = parser.getAttributeValue(
/* namespace= */ null, /* namespace= */ null,
attributeNamePrefix + ATTR_PACKAGES); ATTR_PACKAGES);
if (packagesStr == null) { if (packagesStr == null) {
Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value."); Log.e(TAG, "Error parsing LockTask policy value.");
return null; return null;
} }
Set<String> packages = Set.of(packagesStr.split(ATTR_PACKAGES_SEPARATOR)); Set<String> packages = Set.of(packagesStr.split(ATTR_PACKAGES_SEPARATOR));
try { try {
int flags = parser.getAttributeInt( int flags = parser.getAttributeInt(
/* namespace= */ null, /* namespace= */ null,
attributeNamePrefix + ATTR_FLAGS); ATTR_FLAGS);
return new LockTaskPolicy(packages, flags); return new LockTaskPolicy(packages, flags);
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value", e); Log.e(TAG, "Error parsing LockTask policy value", e);
return null; return null;
} }
} }

View File

@@ -32,21 +32,25 @@ import java.util.Objects;
final class LongPolicySerializer extends PolicySerializer<Long> { final class LongPolicySerializer extends PolicySerializer<Long> {
private static final String TAG = "LongPolicySerializer";
private static final String ATTR_VALUE = "value";
@Override @Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName, void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull Long value) throws IOException { @NonNull Long value) throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
serializer.attributeLong(/* namespace= */ null, attributeName, value); serializer.attributeLong(/* namespace= */ null, ATTR_VALUE, value);
} }
@Nullable @Nullable
@Override @Override
LongPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) { LongPolicyValue readFromXml(TypedXmlPullParser parser) {
try { try {
return new LongPolicyValue( return new LongPolicyValue(
parser.getAttributeLong(/* namespace= */ null, attributeName)); parser.getAttributeLong(/* namespace= */ null, ATTR_VALUE));
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing Long policy value", e); Log.e(TAG, "Error parsing Long policy value", e);
return null; return null;
} }
} }

View File

@@ -531,7 +531,6 @@ final class PolicyDefinition<V> {
} }
void saveToXml(TypedXmlSerializer serializer) throws IOException { void saveToXml(TypedXmlSerializer serializer) throws IOException {
// TODO: here and elsewhere, add tags to ensure attributes aren't overridden by duplication.
mPolicyKey.saveToXml(serializer); mPolicyKey.saveToXml(serializer);
} }
@@ -554,14 +553,14 @@ final class PolicyDefinition<V> {
return genericPolicyDefinition.mPolicyKey.readFromXml(parser); return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
} }
void savePolicyValueToXml(TypedXmlSerializer serializer, String attributeName, V value) void savePolicyValueToXml(TypedXmlSerializer serializer, V value)
throws IOException { throws IOException {
mPolicySerializer.saveToXml(mPolicyKey, serializer, attributeName, value); mPolicySerializer.saveToXml(mPolicyKey, serializer, value);
} }
@Nullable @Nullable
PolicyValue<V> readPolicyValueFromXml(TypedXmlPullParser parser, String attributeName) { PolicyValue<V> readPolicyValueFromXml(TypedXmlPullParser parser) {
return mPolicySerializer.readFromXml(parser, attributeName); return mPolicySerializer.readFromXml(parser);
} }
@Override @Override

View File

@@ -26,8 +26,7 @@ import com.android.modules.utils.TypedXmlSerializer;
import java.io.IOException; import java.io.IOException;
abstract class PolicySerializer<V> { abstract class PolicySerializer<V> {
abstract void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, abstract void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull V value)
String attributeName, @NonNull V value)
throws IOException; throws IOException;
abstract PolicyValue<V> readFromXml(TypedXmlPullParser parser, String attributeName); abstract PolicyValue<V> readFromXml(TypedXmlPullParser parser);
} }

View File

@@ -35,11 +35,14 @@ import java.util.Objects;
* Class containing all values set for a certain policy by different admins. * Class containing all values set for a certain policy by different admins.
*/ */
final class PolicyState<V> { final class PolicyState<V> {
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<V> mPolicyDefinition; private final PolicyDefinition<V> mPolicyDefinition;
private final LinkedHashMap<EnforcingAdmin, PolicyValue<V>> mPoliciesSetByAdmins = private final LinkedHashMap<EnforcingAdmin, PolicyValue<V>> mPoliciesSetByAdmins =
new LinkedHashMap<>(); new LinkedHashMap<>();
@@ -193,18 +196,24 @@ final class PolicyState<V> {
} }
void saveToXml(TypedXmlSerializer serializer) throws IOException { void saveToXml(TypedXmlSerializer serializer) throws IOException {
serializer.startTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
mPolicyDefinition.saveToXml(serializer); mPolicyDefinition.saveToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
if (mCurrentResolvedPolicy != null) { if (mCurrentResolvedPolicy != null) {
serializer.startTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY);
mPolicyDefinition.savePolicyValueToXml( mPolicyDefinition.savePolicyValueToXml(
serializer, ATTR_RESOLVED_POLICY, mCurrentResolvedPolicy.getValue()); serializer, mCurrentResolvedPolicy.getValue());
serializer.endTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY);
} }
for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) { for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) {
serializer.startTag(/* namespace= */ null, TAG_ADMIN_POLICY_ENTRY); serializer.startTag(/* namespace= */ null, TAG_ADMIN_POLICY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY);
mPolicyDefinition.savePolicyValueToXml( 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); serializer.startTag(/* namespace= */ null, TAG_ENFORCING_ADMIN_ENTRY);
admin.saveToXml(serializer); admin.saveToXml(serializer);
@@ -217,31 +226,56 @@ final class PolicyState<V> {
static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser) static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser)
throws IOException, XmlPullParserException { throws IOException, XmlPullParserException {
PolicyDefinition<V> policyDefinition = PolicyDefinition.readFromXml(parser); PolicyDefinition<V> policyDefinition = null;
PolicyValue<V> currentResolvedPolicy = policyDefinition.readPolicyValueFromXml( PolicyValue<V> currentResolvedPolicy = null;
parser, ATTR_RESOLVED_POLICY);
LinkedHashMap<EnforcingAdmin, PolicyValue<V>> policiesSetByAdmins = new LinkedHashMap<>(); LinkedHashMap<EnforcingAdmin, PolicyValue<V>> policiesSetByAdmins = new LinkedHashMap<>();
int outerDepth = parser.getDepth(); int outerDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, outerDepth)) { while (XmlUtils.nextElementWithin(parser, outerDepth)) {
String tag = parser.getName(); String tag = parser.getName();
if (TAG_ADMIN_POLICY_ENTRY.equals(tag)) { switch (tag) {
PolicyValue<V> value = policyDefinition.readPolicyValueFromXml( case TAG_ADMIN_POLICY_ENTRY:
parser, ATTR_POLICY_VALUE); PolicyValue<V> value = null;
EnforcingAdmin admin; EnforcingAdmin admin = null;
int adminPolicyDepth = parser.getDepth(); int adminPolicyDepth = parser.getDepth();
if (XmlUtils.nextElementWithin(parser, adminPolicyDepth) while (XmlUtils.nextElementWithin(parser, adminPolicyDepth)) {
&& parser.getName().equals(TAG_ENFORCING_ADMIN_ENTRY)) { String adminPolicyTag = parser.getName();
switch (adminPolicyTag) {
case TAG_ENFORCING_ADMIN_ENTRY:
admin = EnforcingAdmin.readFromXml(parser); admin = EnforcingAdmin.readFromXml(parser);
break;
case TAG_POLICY_VALUE_ENTRY:
value = policyDefinition.readPolicyValueFromXml(parser);
break;
}
}
if (admin != null && value != null) {
policiesSetByAdmins.put(admin, value); policiesSetByAdmins.put(admin, value);
}
} else { } else {
Log.e(DevicePolicyEngine.TAG, "Unknown tag: " + tag); 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);
} }
} }
if (policyDefinition != null) {
return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy); return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
} else {
Log.e("PolicyState", "Error parsing policyState");
return null;
} }
}
PolicyDefinition<V> getPolicyDefinition() { PolicyDefinition<V> getPolicyDefinition() {
return mPolicyDefinition; return mPolicyDefinition;

View File

@@ -36,21 +36,17 @@ final class StringSetPolicySerializer extends PolicySerializer<Set<String>> {
private static final String ATTR_VALUES_SEPARATOR = ";"; private static final String ATTR_VALUES_SEPARATOR = ";";
@Override @Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix, void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull Set<String> value) throws IOException { @NonNull Set<String> value) throws IOException {
Objects.requireNonNull(value); Objects.requireNonNull(value);
serializer.attribute( serializer.attribute(
/* namespace= */ null, /* namespace= */ null, ATTR_VALUES, String.join(ATTR_VALUES_SEPARATOR, value));
attributeNamePrefix + ATTR_VALUES,
String.join(ATTR_VALUES_SEPARATOR, value));
} }
@Nullable @Nullable
@Override @Override
PolicyValue<Set<String>> readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) { PolicyValue<Set<String>> readFromXml(TypedXmlPullParser parser) {
String valuesStr = parser.getAttributeValue( String valuesStr = parser.getAttributeValue(/* namespace= */ null, ATTR_VALUES);
/* namespace= */ null,
attributeNamePrefix + ATTR_VALUES);
if (valuesStr == null) { if (valuesStr == null) {
Log.e(DevicePolicyEngine.TAG, "Error parsing StringSet policy value."); Log.e(DevicePolicyEngine.TAG, "Error parsing StringSet policy value.");
return null; return null;