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

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

Merge "Distribute rule components in separate classes"

parents df74b306 e959bae8
Loading
Loading
Loading
Loading
+103 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.integrity.model;

import android.annotation.Nullable;

/**
 * Represents a simple formula consisting of an app install metadata field and a value.
 *
 * <p>Instances of this class are immutable.
 */
public final class AtomicFormula extends Formula {

    enum Key {
        PACKAGE_NAME,
        APP_CERTIFICATE,
        INSTALLER_NAME,
        INSTALLER_CERTIFICATE,
        VERSION_CODE,
        PRE_INSTALLED
    }

    enum Operator {
        EQ,
        LT,
        LE,
        GT,
        GE
    }

    private final Key mKey;
    private final Operator mOperator;

    // The value of a key can take either 1 of 3 forms: String, Integer, or Boolean.
    // It cannot have multiple values.
    @Nullable
    final String mStringValue;
    @Nullable
    final Integer mIntValue;
    @Nullable
    final Boolean mBoolValue;

    public AtomicFormula(Key key, Operator operator, String stringValue) {
        // TODO: Add validators
        this.mKey = key;
        this.mOperator = operator;
        this.mStringValue = stringValue;
        this.mIntValue = null;
        this.mBoolValue = null;
    }

    public AtomicFormula(Key key, Operator operator, Integer intValue) {
        // TODO: Add validators
        this.mKey = key;
        this.mOperator = operator;
        this.mStringValue = null;
        this.mIntValue = intValue;
        this.mBoolValue = null;
    }

    public AtomicFormula(Key key, Operator operator, Boolean boolValue) {
        // TODO: Add validators
        this.mKey = key;
        this.mOperator = operator;
        this.mStringValue = null;
        this.mIntValue = null;
        this.mBoolValue = boolValue;
    }

    public Key getKey() {
        return mKey;
    }

    public Operator getOperator() {
        return mOperator;
    }

    public String getStringValue() {
        return mStringValue;
    }

    public Integer getIntValue() {
        return mIntValue;
    }

    public Boolean getBoolValue() {
        return mBoolValue;
    }
}
+24 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.integrity.model;

/**
 * Represents a rule logic/content.
 */
abstract class Formula {

}
+58 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.integrity.model;

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

import android.annotation.Nullable;

/**
 * Represents a complex formula consisting of other simple and complex formulas.
 *
 * <p>Instances of this class are immutable.
 */
public final class OpenFormula extends Formula {

    enum Connector {
        AND,
        OR,
        NOT
    }

    private final Connector mConnector;
    private final Formula mMainFormula;
    private final Formula mAuxiliaryFormula;

    public OpenFormula(Connector connector, Formula mainFormula,
            @Nullable Formula auxiliaryFormula) {
        this.mConnector = checkNotNull(connector);
        this.mMainFormula = checkNotNull(mainFormula);
        this.mAuxiliaryFormula = auxiliaryFormula;
    }

    public Connector getConnector() {
        return mConnector;
    }

    public Formula getMainFormula() {
        return mMainFormula;
    }

    public Formula getAuxiliaryFormula() {
        return mAuxiliaryFormula;
    }
}
+2 −98
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@ package com.android.server.integrity.model;

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

import android.annotation.Nullable;

/**
 * Represent rules to be used in the rule evaluation engine to match against app installs.
 *
@@ -27,35 +25,12 @@ import android.annotation.Nullable;
 */
public final class Rule {

    // Holds an empty rule instance.
    public static final Rule EMPTY = new Rule();

    enum Key {
        PACKAGE_NAME,
        APP_CERTIFICATE,
        INSTALLER_NAME,
        INSTALLER_CERTIFICATE,
        VERSION_CODE,
        PRE_INSTALLED
    }

    enum Effect {
        DENY
    }

    enum Operator {
        EQ,
        LT,
        LE,
        GT,
        GE
    }

    enum Connector {
        AND,
        OR,
        NOT
    }
    // Holds an empty rule instance.
    public static final Rule EMPTY = new Rule();

    private final Formula mFormula;
    private final Effect mEffect;
@@ -86,75 +61,4 @@ public final class Rule {
    public Effect getEffect() {
        return mEffect;
    }

    // TODO: Consider moving the sub-components to their respective model class.

    /**
     * Represents a rule logic/content.
     */
    abstract static class Formula {

    }

    /**
     * Represents a simple formula consisting of an app install metadata field and a value.
     */
    public static final class AtomicFormula extends Formula {

        final Key mKey;
        final Operator mOperator;

        // The value of a key can take either 1 of 3 forms: String, Integer, or Boolean.
        // It cannot have multiple values.
        @Nullable
        final String mStringValue;
        @Nullable
        final Integer mIntValue;
        @Nullable
        final Boolean mBoolValue;

        public AtomicFormula(Key key, Operator operator, String stringValue) {
            // TODO: Add validators
            this.mKey = key;
            this.mOperator = operator;
            this.mStringValue = stringValue;
            this.mIntValue = null;
            this.mBoolValue = null;
        }

        public AtomicFormula(Key key, Operator operator, Integer intValue) {
            // TODO: Add validators
            this.mKey = key;
            this.mOperator = operator;
            this.mStringValue = null;
            this.mIntValue = intValue;
            this.mBoolValue = null;
        }

        public AtomicFormula(Key key, Operator operator, Boolean boolValue) {
            // TODO: Add validators
            this.mKey = key;
            this.mOperator = operator;
            this.mStringValue = null;
            this.mIntValue = null;
            this.mBoolValue = boolValue;
        }
    }

    /**
     * Represents a complex formula consisting of other simple and complex formulas.
     */
    public static final class OpenFormula extends Formula {

        final Connector mConnector;
        final Formula mMainFormula;
        final Formula mAuxiliaryFormula;

        public OpenFormula(Connector connector, Formula mainFormula,
                @Nullable Formula auxiliaryFormula) {
            this.mConnector = checkNotNull(connector);
            this.mMainFormula = checkNotNull(mainFormula);
            this.mAuxiliaryFormula = auxiliaryFormula;
        }
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -29,8 +29,9 @@ import org.junit.runners.JUnit4;
public class RuleTest {

    private static final Rule.Effect DENY_EFFECT = Rule.Effect.DENY;
    private static final Rule.Formula SIMPLE_FORMULA =
            new Rule.AtomicFormula(Rule.Key.PACKAGE_NAME, Rule.Operator.EQ, "com.test.app");
    private static final Formula SIMPLE_FORMULA =
            new AtomicFormula(AtomicFormula.Key.PACKAGE_NAME, AtomicFormula.Operator.EQ,
                    "com.test.app");

    @Test
    public void testEmptyRule() {