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

Commit 1de4bf95 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Stop reading redundant policy definition.

(non-generic) PolicyKey fully determines PolicyDefinitions. This
information is currently stored and loaded twice, under
`policy-key-entry` and also under `policy-definition-entry`, e.g.:

```
<local-policy-entry user-id="0">
  <policy-key-entry policy-identifier="applicationHidden" package-name="com.google.android.GoogleCamera" />
  <policy-state-entry>
    <policy-definition-entry policy-identifier="applicationHidden" package-name="com.google.android.GoogleCamera" />
    <resolved-value-entry value="true" />
```

This is wasteful and allows (in theory) for inconsistencies. This CL
obsoletes the internal `policy-definition-entry` entry tag and
deserializes PolicyDefinition using `policy-key-entry` in the
surrounding `local/global-policy-entry`.

After the flag is fully rolled out we can stop writing the flag.

Bug: 335663055
Test: TH + manual
Flag: android.app.admin.flags.dont_read_policy_definition
Change-Id: Ibf3fe8c75ef9a241d4689f02f18c3f85a21e6b66
parent c72414a3
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
    }
}
+14 −2
Original line number Diff line number Diff line
@@ -2108,16 +2108,28 @@ final class DevicePolicyEngine {
                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:
                        if (Flags.dontReadPolicyDefinition()) {
                            policyDefinition = PolicyDefinition.readFromXml(parser);
                            if (policyDefinition != null) {
                                policyKey = policyDefinition.getPolicyKey();
                            }
                        } else {
                            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 policy entry" + tag);
+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: