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

Commit c55e0930 authored by Khaled Abdelmohsen's avatar Khaled Abdelmohsen Committed by Android (Google) Code Review
Browse files

Merge changes Ic4587c5b,Ib7118228,I3411a0fb

* changes:
  Include isHashedValue in rule structure
  Support optional rule attributes in XML parser
  Add rule component validations
parents 2447db9d 1efff874
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ public abstract class AtomicFormula implements Formula {
    private final @Key int mKey;

    public AtomicFormula(@Key int key) {
        checkArgument(isValidKey(key), String.format("Unknown key: %d", key));
        mKey = key;
    }

@@ -134,6 +135,8 @@ public abstract class AtomicFormula implements Formula {
            checkArgument(
                    key == VERSION_CODE,
                    String.format("Key %s cannot be used with IntAtomicFormula", keyToString(key)));
            checkArgument(isValidOperator(operator),
                    String.format("Unknown operator: %d", operator));
            mOperator = operator;
            mValue = value;
        }
@@ -237,11 +240,21 @@ public abstract class AtomicFormula implements Formula {
                            "Unexpected key in IntAtomicFormula" + getKey());
            }
        }

        private static boolean isValidOperator(int operator) {
            return operator == EQ
                    || operator == LT
                    || operator == LE
                    || operator == GT
                    || operator == GE;
        }
    }

    /** An {@link AtomicFormula} with a key and string value. */
    public static final class StringAtomicFormula extends AtomicFormula implements Parcelable {
        private final String mValue;
        // Indicates whether the value is the actual value or the hashed value.
        private final boolean mIsHashedValue;

        /**
         * Constructs a new {@link StringAtomicFormula}.
@@ -251,8 +264,9 @@ public abstract class AtomicFormula implements Formula {
         *
         * @throws IllegalArgumentException if {@code key} cannot be used with string value
         */
        public StringAtomicFormula(@Key int key, @NonNull String value) {
        public StringAtomicFormula(@Key int key, @NonNull String value, boolean isHashedValue) {
            super(key);
            mIsHashedValue = isHashedValue;
            checkArgument(
                    key == PACKAGE_NAME
                            || key == APP_CERTIFICATE
@@ -266,6 +280,7 @@ public abstract class AtomicFormula implements Formula {
        StringAtomicFormula(Parcel in) {
            super(in.readInt());
            mValue = in.readStringNoHelper();
            mIsHashedValue = in.readByte() != 0;
        }

        @NonNull
@@ -324,6 +339,7 @@ public abstract class AtomicFormula implements Formula {
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            dest.writeInt(getKey());
            dest.writeStringNoHelper(mValue);
            dest.writeByte((byte) (mIsHashedValue ? 1 : 0));
        }

        @NonNull
@@ -331,6 +347,10 @@ public abstract class AtomicFormula implements Formula {
            return mValue;
        }

        public boolean getIsHashedValue() {
            return mIsHashedValue;
        }

        private String getMetadataValueByKey(AppInstallMetadata appInstallMetadata) {
            switch (getKey()) {
                case PACKAGE_NAME:
@@ -486,4 +506,13 @@ public abstract class AtomicFormula implements Formula {
                throw new IllegalArgumentException("Unknown operator " + op);
        }
    }

    private static boolean isValidKey(int key) {
        return key == PACKAGE_NAME
                || key == APP_CERTIFICATE
                || key == VERSION_CODE
                || key == INSTALLER_NAME
                || key == INSTALLER_CERTIFICATE
                || key == PRE_INSTALLED;
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -86,6 +86,8 @@ public final class OpenFormula implements Formula, Parcelable {
     *     for that operator (at least 2 for {@link #AND} and {@link #OR}, 1 for {@link #NOT}).
     */
    public OpenFormula(@Connector int connector, @NonNull List<Formula> formulas) {
        checkArgument(isValidConnector(connector),
                String.format("Unknown connector: %d", connector));
        validateFormulas(connector, formulas);
        this.mConnector = connector;
        this.mFormulas = Collections.unmodifiableList(formulas);
@@ -213,4 +215,10 @@ public final class OpenFormula implements Formula, Parcelable {
                throw new IllegalArgumentException("Unknown connector " + connector);
        }
    }

    private static boolean isValidConnector(int connector) {
        return connector == AND
                || connector == OR
                || connector == NOT;
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.integrity.model;

import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkNotNull;

import android.annotation.IntDef;
@@ -62,6 +63,7 @@ public final class Rule implements Parcelable {
    private final @Effect int mEffect;

    public Rule(@NonNull Formula formula, @Effect int effect) {
        checkArgument(isValidEffect(effect), String.format("Unknown effect: %d", effect));
        this.mFormula = checkNotNull(formula);
        this.mEffect = effect;
    }
@@ -137,4 +139,9 @@ public final class Rule implements Parcelable {
                throw new IllegalArgumentException("Unknown effect " + effect);
        }
    }

    private static boolean isValidEffect(int effect) {
        return effect == DENY
                || effect == FORCE_ALLOW;
    }
}
+17 −16
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * A helper class to parse rules into the {@link Rule} model from Xml representation.
@@ -50,6 +51,7 @@ public final class RuleXmlParser implements RuleParser {
    private static final String OPERATOR_ATTRIBUTE = "O";
    private static final String VALUE_ATTRIBUTE = "V";
    private static final String CONNECTOR_ATTRIBUTE = "C";
    private static final String IS_HASHED_VALUE_ATTRIBUTE = "H";

    @Override
    public List<Rule> parse(String ruleText) throws RuleParseException {
@@ -106,7 +108,7 @@ public final class RuleXmlParser implements RuleParser {

    private static Rule parseRule(XmlPullParser parser) throws IOException, XmlPullParserException {
        Formula formula = null;
        @Rule.Effect int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE));
        int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE).orElse("-1"));

        int eventType;
        while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -139,8 +141,8 @@ public final class RuleXmlParser implements RuleParser {

    private static Formula parseOpenFormula(XmlPullParser parser)
            throws IOException, XmlPullParserException {
        @OpenFormula.Connector int connector = Integer.parseInt(
                extractAttributeValue(parser, CONNECTOR_ATTRIBUTE));
        int connector = Integer.parseInt(
                extractAttributeValue(parser, CONNECTOR_ATTRIBUTE).orElse("-1"));
        List<Formula> formulas = new ArrayList<>();

        int eventType;
@@ -174,10 +176,12 @@ public final class RuleXmlParser implements RuleParser {

    private static Formula parseAtomicFormula(XmlPullParser parser)
            throws IOException, XmlPullParserException {
        @AtomicFormula.Key int key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE));
        @AtomicFormula.Operator int operator = Integer.parseInt(
                extractAttributeValue(parser, OPERATOR_ATTRIBUTE));
        String value = extractAttributeValue(parser, VALUE_ATTRIBUTE);
        int key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE).orElse("-1"));
        int operator = Integer.parseInt(
                extractAttributeValue(parser, OPERATOR_ATTRIBUTE).orElse("-1"));
        String value = extractAttributeValue(parser, VALUE_ATTRIBUTE).orElse(null);
        String isHashedValue = extractAttributeValue(parser, IS_HASHED_VALUE_ATTRIBUTE).orElse(
                null);

        int eventType;
        while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -185,17 +189,18 @@ public final class RuleXmlParser implements RuleParser {
                break;
            }
        }
        return constructAtomicFormulaBasedOnKey(key, operator, value);
        return constructAtomicFormulaBasedOnKey(key, operator, value, isHashedValue);
    }

    private static Formula constructAtomicFormulaBasedOnKey(@AtomicFormula.Key int key,
            @AtomicFormula.Operator int operator, String value) {
            @AtomicFormula.Operator int operator, String value, String isHashedValue) {
        switch (key) {
            case AtomicFormula.PACKAGE_NAME:
            case AtomicFormula.INSTALLER_NAME:
            case AtomicFormula.APP_CERTIFICATE:
            case AtomicFormula.INSTALLER_CERTIFICATE:
                return new AtomicFormula.StringAtomicFormula(key, value);
                return new AtomicFormula.StringAtomicFormula(key, value,
                        Boolean.parseBoolean(isHashedValue));
            case AtomicFormula.PRE_INSTALLED:
                return new AtomicFormula.BooleanAtomicFormula(key, Boolean.parseBoolean(value));
            case AtomicFormula.VERSION_CODE:
@@ -205,11 +210,7 @@ public final class RuleXmlParser implements RuleParser {
        }
    }

    private static String extractAttributeValue(XmlPullParser parser, String attribute) {
        String attributeValue = parser.getAttributeValue(NAMESPACE, attribute);
        if (attributeValue == null) {
            throw new RuntimeException(String.format("Attribute not found: %s", attribute));
        }
        return attributeValue;
    private static Optional<String> extractAttributeValue(XmlPullParser parser, String attribute) {
        return Optional.ofNullable(parser.getAttributeValue(NAMESPACE, attribute));
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ public class RuleXmlSerializer implements RuleSerializer {
    private static final String OPERATOR_ATTRIBUTE = "O";
    private static final String VALUE_ATTRIBUTE = "V";
    private static final String CONNECTOR_ATTRIBUTE = "C";
    private static final String IS_HASHED_VALUE_ATTRIBUTE = "H";

    @Override
    public void serialize(List<Rule> rules, OutputStream outputStream)
@@ -129,6 +130,10 @@ public class RuleXmlSerializer implements RuleSerializer {
        if (atomicFormula instanceof AtomicFormula.StringAtomicFormula) {
            serializeAttributeValue(VALUE_ATTRIBUTE,
                    ((AtomicFormula.StringAtomicFormula) atomicFormula).getValue(), xmlSerializer);
            serializeAttributeValue(IS_HASHED_VALUE_ATTRIBUTE,
                    String.valueOf(
                            ((AtomicFormula.StringAtomicFormula) atomicFormula).getIsHashedValue()),
                    xmlSerializer);
        } else if (atomicFormula instanceof AtomicFormula.IntAtomicFormula) {
            serializeAttributeValue(OPERATOR_ATTRIBUTE,
                    String.valueOf(((AtomicFormula.IntAtomicFormula) atomicFormula).getOperator()),
Loading