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

Commit 2b71b58f authored by Pavel Grafov's avatar Pavel Grafov Committed by Android (Google) Code Review
Browse files

Merge changes Ibf3fe8c7,I152c0b71 into main

* changes:
  Stop reading redundant policy definition.
  Deduplicate policy reading code.
parents de601855 1de4bf95
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ flag {
  }
}


flag {
  name: "onboarding_bugreport_v2_enabled"
  is_exported: true
@@ -403,3 +402,13 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "dont_read_policy_definition"
    namespace: "enterprise"
    description: "Rely on <policy-key-entry> to determine policy definition and ignore <policy-definition-entry>"
    bug: "335663055"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+29 −44
Original line number Diff line number Diff line
@@ -2080,10 +2080,14 @@ final class DevicePolicyEngine {
                String tag = parser.getName();
                switch (tag) {
                    case TAG_LOCAL_POLICY_ENTRY:
                        readLocalPoliciesInner(parser);
                        int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
                        if (!mLocalPolicies.contains(userId)) {
                            mLocalPolicies.put(userId, new HashMap<>());
                        }
                        readPoliciesInner(parser, mLocalPolicies.get(userId));
                        break;
                    case TAG_GLOBAL_POLICY_ENTRY:
                        readGlobalPoliciesInner(parser);
                        readPoliciesInner(parser, mGlobalPolicies);
                        break;
                    case TAG_ENFORCING_ADMINS_ENTRY:
                        readEnforcingAdminsInner(parser);
@@ -2100,64 +2104,45 @@ final class DevicePolicyEngine {
            }
        }

        private void readLocalPoliciesInner(TypedXmlPullParser parser)
                throws XmlPullParserException, IOException {
            int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
        private static void readPoliciesInner(
                TypedXmlPullParser parser, Map<PolicyKey, PolicyState<?>> policyStateMap)
                throws IOException, XmlPullParserException {
            PolicyKey policyKey = null;
            PolicyDefinition<?> policyDefinition = 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:
                        Slogf.wtf(TAG, "Unknown tag for local policy entry" + tag);
                }
            }

            if (policyKey != null && policyState != null) {
                if (!mLocalPolicies.contains(userId)) {
                    mLocalPolicies.put(userId, new HashMap<>());
                        if (Flags.dontReadPolicyDefinition()) {
                            policyDefinition = PolicyDefinition.readFromXml(parser);
                            if (policyDefinition != null) {
                                policyKey = policyDefinition.getPolicyKey();
                            }
                mLocalPolicies.get(userId).put(policyKey, policyState);
                        } else {
                Slogf.wtf(TAG, "Error parsing local policy, policyKey is "
                        + (policyKey == null ? "null" : policyKey) + ", and policyState is "
                        + (policyState == null ? "null" : policyState) + ".");
            }
        }

        private void readGlobalPoliciesInner(TypedXmlPullParser parser)
                throws IOException, XmlPullParserException {
            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);
                        if (Flags.dontReadPolicyDefinition() && policyDefinition == null) {
                            Slogf.w(TAG, "Skipping policy state - unknown policy definition");
                        } else {
                            policyState = PolicyState.readFromXml(policyDefinition, parser);
                        }
                        break;
                    default:
                        Slogf.wtf(TAG, "Unknown tag for local policy entry" + tag);
                        Slogf.wtf(TAG, "Unknown tag for policy entry" + tag);
                }
            }

            if (policyKey != null && policyState != null) {
                mGlobalPolicies.put(policyKey, policyState);
            } else {
                Slogf.wtf(TAG, "Error parsing global policy, policyKey is "
                        + (policyKey == null ? "null" : policyKey) + ", and policyState is "
                        + (policyState == null ? "null" : policyState) + ".");
            if (policyKey == null || policyState == null) {
                Slogf.wtf(TAG, "Error parsing policy, policyKey is %s, and policyState is %s.",
                        policyKey, policyState);
                return;
            }

            policyStateMap.put(policyKey, policyState);
        }

        private void readEnforcingAdminsInner(TypedXmlPullParser parser)
+12 −8
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.devicepolicy;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.admin.PolicyValue;
import android.app.admin.flags.Flags;
import android.util.IndentingPrintWriter;

import com.android.internal.util.XmlUtils;
@@ -254,11 +255,9 @@ final class PolicyState<V> {
    }

    @Nullable
    static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser)
    static <V> PolicyState<V> readFromXml(
            PolicyDefinition<V> policyDefinition, TypedXmlPullParser parser)
            throws IOException, XmlPullParserException {

        PolicyDefinition<V> policyDefinition = null;

        PolicyValue<V> currentResolvedPolicy = null;

        LinkedHashMap<EnforcingAdmin, PolicyValue<V>> policiesSetByAdmins = new LinkedHashMap<>();
@@ -300,11 +299,16 @@ final class PolicyState<V> {
                    }
                    break;
                case TAG_POLICY_DEFINITION_ENTRY:
                    if (Flags.dontReadPolicyDefinition()) {
                        // Should be passed by the caller.
                        Objects.requireNonNull(policyDefinition);
                    } else {
                        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: