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

Commit 597f6511 authored by Jonathan Scott's avatar Jonathan Scott Committed by Automerger Merge Worker
Browse files

Merge "Fix policy engine serialisation" into udc-dev am: 59908249

parents b21fbdcc 59908249
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -28,7 +28,9 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Parcel;
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.TypedXmlSerializer;

@@ -45,6 +47,10 @@ import java.util.Objects;
 */
@SystemApi
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;

    /**
@@ -83,7 +89,9 @@ public final class IntentFilterPolicyKey extends PolicyKey {
    @Override
    public void saveToXml(TypedXmlSerializer serializer) throws IOException {
        serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier());
        serializer.startTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY);
        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)
            throws XmlPullParserException, IOException {
        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();
                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;
    }

    /**
+9 −6
Original line number Diff line number Diff line
@@ -32,22 +32,25 @@ import java.util.Objects;

final class BooleanPolicySerializer extends PolicySerializer<Boolean> {

    private static final String ATTR_VALUE = "value";

    private static final String TAG = "BooleanPolicySerializer";

    @Override
    void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName,
            @NonNull Boolean value)
    void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Boolean value)
            throws IOException {
        Objects.requireNonNull(value);
        serializer.attributeBoolean(/* namespace= */ null, attributeName, value);
        serializer.attributeBoolean(/* namespace= */ null, ATTR_VALUE, value);
    }

    @Nullable
    @Override
    BooleanPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) {
    BooleanPolicyValue readFromXml(TypedXmlPullParser parser) {
        try {
            return new BooleanPolicyValue(
                    parser.getAttributeBoolean(/* namespace= */ null, attributeName));
                    parser.getAttributeBoolean(/* namespace= */ null, ATTR_VALUE));
        } catch (XmlPullParserException e) {
            Log.e(DevicePolicyEngine.TAG, "Error parsing Boolean policy value", e);
            Log.e(TAG, "Error parsing Boolean policy value", e);
            return null;
        }
    }
+11 −7
Original line number Diff line number Diff line
@@ -53,6 +53,10 @@ import java.util.Objects;
//  rather than in its own files.
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 XML_SUFFIX = ".xml";

@@ -72,7 +76,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {

    @Override
    void saveToXml(@NonNull PolicyKey policyKey, TypedXmlSerializer serializer,
            String attributeName, @NonNull Bundle value) throws IOException {
            @NonNull Bundle value) throws IOException {
        Objects.requireNonNull(value);
        Objects.requireNonNull(policyKey);
        if (!(policyKey instanceof PackagePolicyKey)) {
@@ -82,13 +86,13 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
        String packageName = ((PackagePolicyKey) policyKey).getPackageName();
        String fileName = packageToRestrictionsFileName(packageName, value);
        writeApplicationRestrictionsLAr(fileName, value);
        serializer.attribute(/* namespace= */ null, attributeName, fileName);
        serializer.attribute(/* namespace= */ null, ATTR_FILE_NAME, fileName);
    }

    @Nullable
    @Override
    BundlePolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) {
        String fileName = parser.getAttributeValue(/* namespace= */ null, attributeName);
    BundlePolicyValue readFromXml(TypedXmlPullParser parser) {
        String fileName = parser.getAttributeValue(/* namespace= */ null, ATTR_FILE_NAME);

        return new BundlePolicyValue(readApplicationRestrictions(fileName));
    }
@@ -119,7 +123,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
            XmlUtils.nextElement(parser);
            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());
                return restrictions;
            }
@@ -127,7 +131,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
                readEntry(restrictions, values, parser);
            }
        } catch (IOException | XmlPullParserException e) {
            Slog.w(DevicePolicyEngine.TAG, "Error parsing " + restrictionsFile.getBaseFile(), e);
            Slog.w(TAG, "Error parsing " + restrictionsFile.getBaseFile(), e);
        } finally {
            IoUtils.closeQuietly(fis);
        }
@@ -209,7 +213,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
            restrictionsFile.finishWrite(fos);
        } catch (Exception e) {
            restrictionsFile.failWrite(fos);
            Slog.e(DevicePolicyEngine.TAG, "Error writing application restrictions list", e);
            Slog.e(TAG, "Error writing application restrictions list", e);
        }
    }

+12 −11
Original line number Diff line number Diff line
@@ -30,30 +30,31 @@ import java.io.IOException;
import java.util.Objects;

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
    void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix,
    void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
            @NonNull ComponentName value) throws IOException {
        Objects.requireNonNull(value);
        serializer.attribute(
                /* namespace= */ null,
                attributeNamePrefix + ATTR_PACKAGE_NAME, value.getPackageName());
                /* namespace= */ null, ATTR_PACKAGE_NAME, value.getPackageName());
        serializer.attribute(
                /* namespace= */ null,
                attributeNamePrefix + ATTR_CLASS_NAME, value.getClassName());
                /* namespace= */ null, ATTR_CLASS_NAME, value.getClassName());
    }

    @Nullable
    @Override
    ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) {
    ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser) {
        String packageName = parser.getAttributeValue(
                /* namespace= */ null, attributeNamePrefix + ATTR_PACKAGE_NAME);
                /* namespace= */ null, ATTR_PACKAGE_NAME);
        String className = parser.getAttributeValue(
                /* namespace= */ null, attributeNamePrefix + ATTR_CLASS_NAME);
                /* namespace= */ null, ATTR_CLASS_NAME);
        if (packageName == null || className == null) {
            Log.e(DevicePolicyEngine.TAG, "Error parsing ComponentName policy.");
            Log.e(TAG, "Error parsing ComponentName policy.");
            return null;
        }
        return new ComponentNamePolicyValue(new ComponentName(packageName, className));
+53 −34
Original line number Diff line number Diff line
@@ -1181,7 +1181,8 @@ final class DevicePolicyEngine {
        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_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 ATTR_USER_ID = "user-id";

@@ -1236,11 +1237,14 @@ final class DevicePolicyEngine {
                        serializer.startTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY);

                        serializer.attributeInt(/* namespace= */ null, ATTR_USER_ID, userId);

                        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_ADMINS_POLICY_ENTRY);
                        serializer.startTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY);
                        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);
                    }
@@ -1253,11 +1257,13 @@ final class DevicePolicyEngine {
                for (Map.Entry<PolicyKey, PolicyState<?>> policy : mGlobalPolicies.entrySet()) {
                    serializer.startTag(/* namespace= */ null, TAG_GLOBAL_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_ADMINS_POLICY_ENTRY);
                    serializer.startTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY);
                    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);
                }
@@ -1323,28 +1329,56 @@ final class DevicePolicyEngine {
        private void readLocalPoliciesInner(TypedXmlPullParser parser)
                throws XmlPullParserException, IOException {
            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)) {
                    mLocalPolicies.put(userId, new HashMap<>());
                }
            PolicyState<?> adminsPolicy = parseAdminsPolicy(parser);
            if (adminsPolicy != null) {
                mLocalPolicies.get(userId).put(policyKey, adminsPolicy);
                mLocalPolicies.get(userId).put(policyKey, policyState);
            } else {
                Log.e(TAG,
                        "Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy.");
                Log.e(TAG, "Error parsing local policy");
            }
        }

        private void readGlobalPoliciesInner(TypedXmlPullParser parser)
                throws IOException, XmlPullParserException {
            PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser);
            PolicyState<?> adminsPolicy = parseAdminsPolicy(parser);
            if (adminsPolicy != null) {
                mGlobalPolicies.put(policyKey, adminsPolicy);
            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) {
                mGlobalPolicies.put(policyKey, policyState);
            } else {
                Log.e(TAG,
                        "Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy.");
                Log.e(TAG, "Error parsing global policy");
            }
        }

@@ -1356,20 +1390,5 @@ final class DevicePolicyEngine {
            }
            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;
        }
    }
}
Loading