Merge "Handle errors during policy loading from file" into udc-dev am: c9fd986778 am: ed6f41aa90
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23127279 Change-Id: Iebde0c612f90d0e8c0810b43acb5ae014bf166bf Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -25,6 +25,7 @@ import android.os.Parcelable;
|
|||||||
|
|
||||||
import com.android.modules.utils.TypedXmlPullParser;
|
import com.android.modules.utils.TypedXmlPullParser;
|
||||||
import com.android.modules.utils.TypedXmlSerializer;
|
import com.android.modules.utils.TypedXmlSerializer;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
@@ -41,6 +42,9 @@ import java.util.Objects;
|
|||||||
@SuppressLint({"ParcelNotFinal", "ParcelCreator"})
|
@SuppressLint({"ParcelNotFinal", "ParcelCreator"})
|
||||||
@SystemApi
|
@SystemApi
|
||||||
public abstract class PolicyKey implements Parcelable {
|
public abstract class PolicyKey implements Parcelable {
|
||||||
|
|
||||||
|
static final String TAG = "PolicyKey";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@@ -76,9 +80,14 @@ public abstract class PolicyKey implements Parcelable {
|
|||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
public static PolicyKey readGenericPolicyKeyFromXml(TypedXmlPullParser parser) {
|
public static PolicyKey readGenericPolicyKeyFromXml(TypedXmlPullParser parser) {
|
||||||
String identifier = parser.getAttributeValue(
|
String identifier = parser.getAttributeValue(
|
||||||
/* namespace= */ null, ATTR_POLICY_IDENTIFIER);
|
/* namespace= */ null, ATTR_POLICY_IDENTIFIER);
|
||||||
|
if (identifier == null) {
|
||||||
|
Log.wtf(TAG, "Error parsing generic policy key, identifier is null.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return new NoArgsPolicyKey(identifier);
|
return new NoArgsPolicyKey(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ import android.util.Xml;
|
|||||||
import com.android.internal.util.XmlUtils;
|
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;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import libcore.io.IoUtils;
|
import libcore.io.IoUtils;
|
||||||
|
|
||||||
@@ -1511,7 +1512,7 @@ final class DevicePolicyEngine {
|
|||||||
readInner(parser);
|
readInner(parser);
|
||||||
|
|
||||||
} catch (XmlPullParserException | IOException | ClassNotFoundException e) {
|
} catch (XmlPullParserException | IOException | ClassNotFoundException e) {
|
||||||
Log.e(TAG, "Error parsing resources file", e);
|
Slogf.wtf(TAG, "Error parsing resources file", e);
|
||||||
} finally {
|
} finally {
|
||||||
IoUtils.closeQuietly(input);
|
IoUtils.closeQuietly(input);
|
||||||
}
|
}
|
||||||
@@ -1533,7 +1534,7 @@ final class DevicePolicyEngine {
|
|||||||
readEnforcingAdminsInner(parser);
|
readEnforcingAdminsInner(parser);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.e(TAG, "Unknown tag " + tag);
|
Slogf.wtf(TAG, "Unknown tag " + tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1554,7 +1555,7 @@ final class DevicePolicyEngine {
|
|||||||
policyState = PolicyState.readFromXml(parser);
|
policyState = PolicyState.readFromXml(parser);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.e(TAG, "Unknown tag for local policy entry" + tag);
|
Slogf.wtf(TAG, "Unknown tag for local policy entry" + tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1564,7 +1565,9 @@ final class DevicePolicyEngine {
|
|||||||
}
|
}
|
||||||
mLocalPolicies.get(userId).put(policyKey, policyState);
|
mLocalPolicies.get(userId).put(policyKey, policyState);
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "Error parsing local policy");
|
Slogf.wtf(TAG, "Error parsing local policy, policyKey is "
|
||||||
|
+ (policyKey == null ? "null" : policyKey) + ", and policyState is "
|
||||||
|
+ (policyState == null ? "null" : policyState) + ".");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1583,20 +1586,26 @@ final class DevicePolicyEngine {
|
|||||||
policyState = PolicyState.readFromXml(parser);
|
policyState = PolicyState.readFromXml(parser);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.e(TAG, "Unknown tag for local policy entry" + tag);
|
Slogf.wtf(TAG, "Unknown tag for local policy entry" + tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (policyKey != null && policyState != null) {
|
if (policyKey != null && policyState != null) {
|
||||||
mGlobalPolicies.put(policyKey, policyState);
|
mGlobalPolicies.put(policyKey, policyState);
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "Error parsing global policy");
|
Slogf.wtf(TAG, "Error parsing global policy, policyKey is "
|
||||||
|
+ (policyKey == null ? "null" : policyKey) + ", and policyState is "
|
||||||
|
+ (policyState == null ? "null" : policyState) + ".");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void readEnforcingAdminsInner(TypedXmlPullParser parser)
|
private void readEnforcingAdminsInner(TypedXmlPullParser parser)
|
||||||
throws XmlPullParserException {
|
throws XmlPullParserException {
|
||||||
EnforcingAdmin admin = EnforcingAdmin.readFromXml(parser);
|
EnforcingAdmin admin = EnforcingAdmin.readFromXml(parser);
|
||||||
|
if (admin == null) {
|
||||||
|
Slogf.wtf(TAG, "Error parsing enforcingAdmins, EnforcingAdmin is null.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!mEnforcingAdmins.contains(admin.getUserId())) {
|
if (!mEnforcingAdmins.contains(admin.getUserId())) {
|
||||||
mEnforcingAdmins.put(admin.getUserId(), new HashSet<>());
|
mEnforcingAdmins.put(admin.getUserId(), new HashSet<>());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import com.android.modules.utils.TypedXmlPullParser;
|
|||||||
import com.android.modules.utils.TypedXmlSerializer;
|
import com.android.modules.utils.TypedXmlSerializer;
|
||||||
import com.android.role.RoleManagerLocal;
|
import com.android.role.RoleManagerLocal;
|
||||||
import com.android.server.LocalManagerRegistry;
|
import com.android.server.LocalManagerRegistry;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
@@ -51,6 +52,9 @@ import java.util.Set;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
final class EnforcingAdmin {
|
final class EnforcingAdmin {
|
||||||
|
|
||||||
|
static final String TAG = "EnforcingAdmin";
|
||||||
|
|
||||||
static final String ROLE_AUTHORITY_PREFIX = "role:";
|
static final String ROLE_AUTHORITY_PREFIX = "role:";
|
||||||
static final String DPC_AUTHORITY = "enterprise";
|
static final String DPC_AUTHORITY = "enterprise";
|
||||||
static final String DEVICE_ADMIN_AUTHORITY = "device_admin";
|
static final String DEVICE_ADMIN_AUTHORITY = "device_admin";
|
||||||
@@ -286,6 +290,7 @@ final class EnforcingAdmin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
static EnforcingAdmin readFromXml(TypedXmlPullParser parser)
|
static EnforcingAdmin readFromXml(TypedXmlPullParser parser)
|
||||||
throws XmlPullParserException {
|
throws XmlPullParserException {
|
||||||
String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
|
String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
|
||||||
@@ -294,13 +299,25 @@ final class EnforcingAdmin {
|
|||||||
int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
|
int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
|
||||||
|
|
||||||
if (isRoleAuthority) {
|
if (isRoleAuthority) {
|
||||||
|
if (packageName == null) {
|
||||||
|
Slogf.wtf(TAG, "Error parsing EnforcingAdmin with RoleAuthority, packageName is "
|
||||||
|
+ "null.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
// TODO(b/281697976): load active admin
|
// TODO(b/281697976): load active admin
|
||||||
return new EnforcingAdmin(packageName, userId, null);
|
return new EnforcingAdmin(packageName, userId, null);
|
||||||
} else {
|
} else {
|
||||||
|
if (packageName == null || authoritiesStr == null) {
|
||||||
|
Slogf.wtf(TAG, "Error parsing EnforcingAdmin, packageName is "
|
||||||
|
+ (packageName == null ? "null" : packageName) + ", and authorities is "
|
||||||
|
+ (authoritiesStr == null ? "null" : authoritiesStr) + ".");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
String className = parser.getAttributeValue(/* namespace= */ null, ATTR_CLASS_NAME);
|
String className = parser.getAttributeValue(/* namespace= */ null, ATTR_CLASS_NAME);
|
||||||
ComponentName componentName = className == null
|
ComponentName componentName = className == null
|
||||||
? null : new ComponentName(packageName, className);
|
? null : new ComponentName(packageName, className);
|
||||||
Set<String> authorities = Set.of(authoritiesStr.split(ATTR_AUTHORITIES_SEPARATOR));
|
Set<String> authorities = Set.of(authoritiesStr.split(ATTR_AUTHORITIES_SEPARATOR));
|
||||||
|
// TODO(b/281697976): load active admin
|
||||||
return new EnforcingAdmin(packageName, componentName, authorities, userId, null);
|
return new EnforcingAdmin(packageName, componentName, authorities, userId, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -457,6 +457,7 @@ class OwnersData {
|
|||||||
case TAG_POLICY_ENGINE_MIGRATION:
|
case TAG_POLICY_ENGINE_MIGRATION:
|
||||||
mMigratedToPolicyEngine = parser.getAttributeBoolean(
|
mMigratedToPolicyEngine = parser.getAttributeBoolean(
|
||||||
null, ATTR_MIGRATED_TO_POLICY_ENGINE, false);
|
null, ATTR_MIGRATED_TO_POLICY_ENGINE, false);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Slog.e(TAG, "Unexpected tag: " + tag);
|
Slog.e(TAG, "Unexpected tag: " + tag);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import android.os.UserManager;
|
|||||||
import com.android.internal.util.function.QuadFunction;
|
import com.android.internal.util.function.QuadFunction;
|
||||||
import com.android.modules.utils.TypedXmlPullParser;
|
import com.android.modules.utils.TypedXmlPullParser;
|
||||||
import com.android.modules.utils.TypedXmlSerializer;
|
import com.android.modules.utils.TypedXmlSerializer;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
@@ -53,6 +54,9 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
final class PolicyDefinition<V> {
|
final class PolicyDefinition<V> {
|
||||||
|
|
||||||
|
static final String TAG = "PolicyDefinition";
|
||||||
|
|
||||||
private static final int POLICY_FLAG_NONE = 0;
|
private static final int POLICY_FLAG_NONE = 0;
|
||||||
|
|
||||||
// Only use this flag if a policy can not be applied locally.
|
// Only use this flag if a policy can not be applied locally.
|
||||||
@@ -596,22 +600,40 @@ final class PolicyDefinition<V> {
|
|||||||
mPolicyKey.saveToXml(serializer);
|
mPolicyKey.saveToXml(serializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
static <V> PolicyDefinition<V> readFromXml(TypedXmlPullParser parser)
|
static <V> PolicyDefinition<V> readFromXml(TypedXmlPullParser parser)
|
||||||
throws XmlPullParserException, IOException {
|
throws XmlPullParserException, IOException {
|
||||||
// TODO: can we avoid casting?
|
// TODO: can we avoid casting?
|
||||||
PolicyKey policyKey = readPolicyKeyFromXml(parser);
|
PolicyKey policyKey = readPolicyKeyFromXml(parser);
|
||||||
|
if (policyKey == null) {
|
||||||
|
Slogf.wtf(TAG, "Error parsing PolicyDefinition, PolicyKey is null.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
PolicyDefinition<V> genericPolicyDefinition =
|
PolicyDefinition<V> genericPolicyDefinition =
|
||||||
(PolicyDefinition<V>) POLICY_DEFINITIONS.get(policyKey.getIdentifier());
|
(PolicyDefinition<V>) POLICY_DEFINITIONS.get(policyKey.getIdentifier());
|
||||||
|
if (genericPolicyDefinition == null) {
|
||||||
|
Slogf.wtf(TAG, "Unknown generic policy key: " + policyKey);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return genericPolicyDefinition.createPolicyDefinition(policyKey);
|
return genericPolicyDefinition.createPolicyDefinition(policyKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
static <V> PolicyKey readPolicyKeyFromXml(TypedXmlPullParser parser)
|
static <V> PolicyKey readPolicyKeyFromXml(TypedXmlPullParser parser)
|
||||||
throws XmlPullParserException, IOException {
|
throws XmlPullParserException, IOException {
|
||||||
// TODO: can we avoid casting?
|
// TODO: can we avoid casting?
|
||||||
PolicyKey policyKey = PolicyKey.readGenericPolicyKeyFromXml(parser);
|
PolicyKey policyKey = PolicyKey.readGenericPolicyKeyFromXml(parser);
|
||||||
|
if (policyKey == null) {
|
||||||
|
Slogf.wtf(TAG, "Error parsing PolicyKey, GenericPolicyKey is null");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
PolicyDefinition<PolicyValue<V>> genericPolicyDefinition =
|
PolicyDefinition<PolicyValue<V>> genericPolicyDefinition =
|
||||||
(PolicyDefinition<PolicyValue<V>>) POLICY_DEFINITIONS.get(
|
(PolicyDefinition<PolicyValue<V>>) POLICY_DEFINITIONS.get(
|
||||||
policyKey.getIdentifier());
|
policyKey.getIdentifier());
|
||||||
|
if (genericPolicyDefinition == null) {
|
||||||
|
Slogf.wtf(TAG, "Error parsing PolicyKey, Unknown generic policy key: " + policyKey);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
|
return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,11 +19,11 @@ package com.android.server.devicepolicy;
|
|||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.app.admin.PolicyValue;
|
import android.app.admin.PolicyValue;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import com.android.internal.util.XmlUtils;
|
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;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
@@ -224,6 +224,7 @@ final class PolicyState<V> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser)
|
static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser)
|
||||||
throws IOException, XmlPullParserException {
|
throws IOException, XmlPullParserException {
|
||||||
|
|
||||||
@@ -245,33 +246,55 @@ final class PolicyState<V> {
|
|||||||
switch (adminPolicyTag) {
|
switch (adminPolicyTag) {
|
||||||
case TAG_ENFORCING_ADMIN_ENTRY:
|
case TAG_ENFORCING_ADMIN_ENTRY:
|
||||||
admin = EnforcingAdmin.readFromXml(parser);
|
admin = EnforcingAdmin.readFromXml(parser);
|
||||||
|
if (admin == null) {
|
||||||
|
Slogf.wtf(TAG, "Error Parsing TAG_ENFORCING_ADMIN_ENTRY, "
|
||||||
|
+ "EnforcingAdmin is null");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TAG_POLICY_VALUE_ENTRY:
|
case TAG_POLICY_VALUE_ENTRY:
|
||||||
value = policyDefinition.readPolicyValueFromXml(parser);
|
value = policyDefinition.readPolicyValueFromXml(parser);
|
||||||
|
if (value == null) {
|
||||||
|
Slogf.wtf(TAG, "Error Parsing TAG_POLICY_VALUE_ENTRY, "
|
||||||
|
+ "PolicyValue is null");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (admin != null) {
|
if (admin != null) {
|
||||||
policiesSetByAdmins.put(admin, value);
|
policiesSetByAdmins.put(admin, value);
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY");
|
Slogf.wtf(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY, EnforcingAdmin "
|
||||||
|
+ "is null");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TAG_POLICY_DEFINITION_ENTRY:
|
case TAG_POLICY_DEFINITION_ENTRY:
|
||||||
policyDefinition = PolicyDefinition.readFromXml(parser);
|
policyDefinition = PolicyDefinition.readFromXml(parser);
|
||||||
|
if (policyDefinition == null) {
|
||||||
|
Slogf.wtf(TAG, "Error Parsing TAG_POLICY_DEFINITION_ENTRY, "
|
||||||
|
+ "PolicyDefinition is null");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TAG_RESOLVED_VALUE_ENTRY:
|
case TAG_RESOLVED_VALUE_ENTRY:
|
||||||
|
if (policyDefinition == null) {
|
||||||
|
Slogf.wtf(TAG, "Error Parsing TAG_RESOLVED_VALUE_ENTRY, "
|
||||||
|
+ "policyDefinition is null");
|
||||||
|
break;
|
||||||
|
}
|
||||||
currentResolvedPolicy = policyDefinition.readPolicyValueFromXml(parser);
|
currentResolvedPolicy = policyDefinition.readPolicyValueFromXml(parser);
|
||||||
|
if (currentResolvedPolicy == null) {
|
||||||
|
Slogf.wtf(TAG, "Error Parsing TAG_RESOLVED_VALUE_ENTRY, "
|
||||||
|
+ "currentResolvedPolicy is null");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.e(TAG, "Unknown tag: " + tag);
|
Slogf.wtf(TAG, "Unknown tag: " + tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (policyDefinition != null) {
|
if (policyDefinition != null) {
|
||||||
return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
|
return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
|
||||||
} else {
|
} else {
|
||||||
Log.e("PolicyState", "Error parsing policyState");
|
Slogf.wtf(TAG, "Error parsing policyState, policyDefinition is null");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user