Merge "Fix policy engine serialisation" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
599082490c
@@ -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,11 +101,27 @@ 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 = new IntentFilter();
|
IntentFilter filter = readIntentFilterFromXml(parser);
|
||||||
filter.readFromXml(parser);
|
|
||||||
return new IntentFilterPolicyKey(identifier, filter);
|
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
|
* @hide
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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;
|
||||||
if (!mLocalPolicies.contains(userId)) {
|
PolicyState<?> policyState = null;
|
||||||
mLocalPolicies.put(userId, new HashMap<>());
|
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) {
|
if (policyKey != null && policyState != null) {
|
||||||
mLocalPolicies.get(userId).put(policyKey, adminsPolicy);
|
if (!mLocalPolicies.contains(userId)) {
|
||||||
|
mLocalPolicies.put(userId, new HashMap<>());
|
||||||
|
}
|
||||||
|
mLocalPolicies.get(userId).put(policyKey, policyState);
|
||||||
} 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,32 +226,57 @@ 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();
|
||||||
admin = EnforcingAdmin.readFromXml(parser);
|
switch (adminPolicyTag) {
|
||||||
policiesSetByAdmins.put(admin, value);
|
case TAG_ENFORCING_ADMIN_ENTRY:
|
||||||
}
|
admin = EnforcingAdmin.readFromXml(parser);
|
||||||
} else {
|
break;
|
||||||
Log.e(DevicePolicyEngine.TAG, "Unknown tag: " + tag);
|
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<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
|
if (policyDefinition != null) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user