Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a2989db authored by Kholoud Mohamed's avatar Kholoud Mohamed
Browse files

Handle errors during policy loading from file

Bug: 280605194
Test: manual
Change-Id: Id47f482e9fced82b42090eabed6297f2ebba223e
Merged-In: Id47f482e9fced82b42090eabed6297f2ebba223e
parent 3da2cf7d
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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);
    }

+15 −6
Original line number Diff line number Diff line
@@ -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<>());
            }
+17 −0
Original line number Diff line number Diff line
@@ -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);
        }
    }
+1 −0
Original line number Diff line number Diff line
@@ -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;
+22 −0
Original line number Diff line number Diff line
@@ -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);
    }

Loading