Merge "Handle errors during policy loading from file" into udc-dev

This commit is contained in:
Treehugger Robot
2023-05-11 13:25:53 +00:00
committed by Android (Google) Code Review
6 changed files with 91 additions and 10 deletions

View File

@@ -25,6 +25,7 @@ import android.os.Parcelable;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import android.util.Log;
import org.xmlpull.v1.XmlPullParserException;
@@ -41,6 +42,9 @@ import java.util.Objects;
@SuppressLint({"ParcelNotFinal", "ParcelCreator"})
@SystemApi
public abstract class PolicyKey implements Parcelable {
static final String TAG = "PolicyKey";
/**
* @hide
*/
@@ -76,9 +80,14 @@ public abstract class PolicyKey implements Parcelable {
/**
* @hide
*/
@Nullable
public static PolicyKey readGenericPolicyKeyFromXml(TypedXmlPullParser parser) {
String identifier = parser.getAttributeValue(
/* 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);
}

View File

@@ -56,6 +56,7 @@ import android.util.Xml;
import com.android.internal.util.XmlUtils;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.utils.Slogf;
import libcore.io.IoUtils;
@@ -1511,7 +1512,7 @@ final class DevicePolicyEngine {
readInner(parser);
} catch (XmlPullParserException | IOException | ClassNotFoundException e) {
Log.e(TAG, "Error parsing resources file", e);
Slogf.wtf(TAG, "Error parsing resources file", e);
} finally {
IoUtils.closeQuietly(input);
}
@@ -1533,7 +1534,7 @@ final class DevicePolicyEngine {
readEnforcingAdminsInner(parser);
break;
default:
Log.e(TAG, "Unknown tag " + tag);
Slogf.wtf(TAG, "Unknown tag " + tag);
}
}
}
@@ -1554,7 +1555,7 @@ final class DevicePolicyEngine {
policyState = PolicyState.readFromXml(parser);
break;
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);
} 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);
break;
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) {
mGlobalPolicies.put(policyKey, policyState);
} 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)
throws XmlPullParserException {
EnforcingAdmin admin = EnforcingAdmin.readFromXml(parser);
if (admin == null) {
Slogf.wtf(TAG, "Error parsing enforcingAdmins, EnforcingAdmin is null.");
return;
}
if (!mEnforcingAdmins.contains(admin.getUserId())) {
mEnforcingAdmins.put(admin.getUserId(), new HashSet<>());
}

View File

@@ -30,6 +30,7 @@ import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.role.RoleManagerLocal;
import com.android.server.LocalManagerRegistry;
import com.android.server.utils.Slogf;
import org.xmlpull.v1.XmlPullParserException;
@@ -51,6 +52,9 @@ import java.util.Set;
*
*/
final class EnforcingAdmin {
static final String TAG = "EnforcingAdmin";
static final String ROLE_AUTHORITY_PREFIX = "role:";
static final String DPC_AUTHORITY = "enterprise";
static final String DEVICE_ADMIN_AUTHORITY = "device_admin";
@@ -286,6 +290,7 @@ final class EnforcingAdmin {
}
}
@Nullable
static EnforcingAdmin readFromXml(TypedXmlPullParser parser)
throws XmlPullParserException {
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);
if (isRoleAuthority) {
if (packageName == null) {
Slogf.wtf(TAG, "Error parsing EnforcingAdmin with RoleAuthority, packageName is "
+ "null.");
return null;
}
// TODO(b/281697976): load active admin
return new EnforcingAdmin(packageName, userId, null);
} 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);
ComponentName componentName = className == null
? null : new ComponentName(packageName, className);
Set<String> authorities = Set.of(authoritiesStr.split(ATTR_AUTHORITIES_SEPARATOR));
// TODO(b/281697976): load active admin
return new EnforcingAdmin(packageName, componentName, authorities, userId, null);
}
}

View File

@@ -457,6 +457,7 @@ class OwnersData {
case TAG_POLICY_ENGINE_MIGRATION:
mMigratedToPolicyEngine = parser.getAttributeBoolean(
null, ATTR_MIGRATED_TO_POLICY_ENGINE, false);
break;
default:
Slog.e(TAG, "Unexpected tag: " + tag);
return false;

View File

@@ -42,6 +42,7 @@ import android.os.UserManager;
import com.android.internal.util.function.QuadFunction;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.utils.Slogf;
import org.xmlpull.v1.XmlPullParserException;
@@ -53,6 +54,9 @@ import java.util.Map;
import java.util.Set;
final class PolicyDefinition<V> {
static final String TAG = "PolicyDefinition";
private static final int POLICY_FLAG_NONE = 0;
// Only use this flag if a policy can not be applied locally.
@@ -596,22 +600,40 @@ final class PolicyDefinition<V> {
mPolicyKey.saveToXml(serializer);
}
@Nullable
static <V> PolicyDefinition<V> readFromXml(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
// TODO: can we avoid casting?
PolicyKey policyKey = readPolicyKeyFromXml(parser);
if (policyKey == null) {
Slogf.wtf(TAG, "Error parsing PolicyDefinition, PolicyKey is null.");
return null;
}
PolicyDefinition<V> genericPolicyDefinition =
(PolicyDefinition<V>) POLICY_DEFINITIONS.get(policyKey.getIdentifier());
if (genericPolicyDefinition == null) {
Slogf.wtf(TAG, "Unknown generic policy key: " + policyKey);
return null;
}
return genericPolicyDefinition.createPolicyDefinition(policyKey);
}
@Nullable
static <V> PolicyKey readPolicyKeyFromXml(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
// TODO: can we avoid casting?
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>>) POLICY_DEFINITIONS.get(
policyKey.getIdentifier());
if (genericPolicyDefinition == null) {
Slogf.wtf(TAG, "Error parsing PolicyKey, Unknown generic policy key: " + policyKey);
return null;
}
return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
}

View File

@@ -19,11 +19,11 @@ package com.android.server.devicepolicy;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.admin.PolicyValue;
import android.util.Log;
import com.android.internal.util.XmlUtils;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.utils.Slogf;
import org.xmlpull.v1.XmlPullParserException;
@@ -224,6 +224,7 @@ final class PolicyState<V> {
}
}
@Nullable
static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser)
throws IOException, XmlPullParserException {
@@ -245,33 +246,55 @@ final class PolicyState<V> {
switch (adminPolicyTag) {
case TAG_ENFORCING_ADMIN_ENTRY:
admin = EnforcingAdmin.readFromXml(parser);
if (admin == null) {
Slogf.wtf(TAG, "Error Parsing TAG_ENFORCING_ADMIN_ENTRY, "
+ "EnforcingAdmin is null");
}
break;
case TAG_POLICY_VALUE_ENTRY:
value = policyDefinition.readPolicyValueFromXml(parser);
if (value == null) {
Slogf.wtf(TAG, "Error Parsing TAG_POLICY_VALUE_ENTRY, "
+ "PolicyValue is null");
}
break;
}
}
if (admin != null) {
policiesSetByAdmins.put(admin, value);
} else {
Log.e(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY");
Slogf.wtf(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY, EnforcingAdmin "
+ "is null");
}
break;
case TAG_POLICY_DEFINITION_ENTRY:
policyDefinition = PolicyDefinition.readFromXml(parser);
if (policyDefinition == null) {
Slogf.wtf(TAG, "Error Parsing TAG_POLICY_DEFINITION_ENTRY, "
+ "PolicyDefinition is null");
}
break;
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);
if (currentResolvedPolicy == null) {
Slogf.wtf(TAG, "Error Parsing TAG_RESOLVED_VALUE_ENTRY, "
+ "currentResolvedPolicy is null");
}
break;
default:
Log.e(TAG, "Unknown tag: " + tag);
Slogf.wtf(TAG, "Unknown tag: " + tag);
}
}
if (policyDefinition != null) {
return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
} else {
Log.e("PolicyState", "Error parsing policyState");
Slogf.wtf(TAG, "Error parsing policyState, policyDefinition is null");
return null;
}
}