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

Commit e9a09030 authored by Abbie Farr's avatar Abbie Farr Committed by Android (Google) Code Review
Browse files

Merge "Support featureFlag attribute in <assign-permission> tag" into main

parents 09774eff 4cb971c5
Loading
Loading
Loading
Loading
+42 −29
Original line number Diff line number Diff line
@@ -1115,6 +1115,22 @@ public class SystemConfig {
    private void readAssignPermission(XmlPullParser parser, File permFile, boolean allowPermissions)
            throws IOException, XmlPullParserException {
        if (allowPermissions) {
            readAssignPermission(parser, permFile);
        } else {
            logNotAllowedInPartition("assign-permission", permFile, parser);
            XmlUtils.skipCurrentTag(parser);
        }
    }

    private void readAssignPermission(XmlPullParser parser, File permFile)
            throws IOException, XmlPullParserException {
        // If trunkstable feature flag disabled for this permission, skip this tag.
        if (ParsingPackageUtils.getAconfigFlags()
                .skipCurrentElement(/* pkg= */ null, parser, /* allowNoNamespace= */ true)) {
            XmlUtils.skipCurrentTag(parser);
            return;
        }

        String perm = parser.getAttributeValue(null, "name");
        if (perm == null) {
            Slog.w(TAG, "<assign-permission> without name in " + permFile
@@ -1144,9 +1160,6 @@ public class SystemConfig {
            mSystemPermissions.put(uid, perms);
        }
        perms.add(perm);
        } else {
            logNotAllowedInPartition("assign-permission", permFile, parser);
        }
        XmlUtils.skipCurrentTag(parser);
    }

+105 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static org.testng.Assert.expectThrows;
import android.content.pm.Signature;
import android.content.pm.SignedPackage;
import android.os.Build;
import android.permission.PermissionManager.SplitPermissionInfo;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
@@ -31,11 +32,13 @@ import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
import android.util.Xml;

import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.internal.pm.pkg.parsing.ParsingPackageUtils;
import com.android.server.SystemConfig;

import org.junit.Before;
@@ -51,7 +54,9 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
@@ -68,6 +73,16 @@ import java.util.Set;
public class SystemConfigTest {
    private static final String LOG_TAG = "SystemConfigTest";

    private static final String ALWAYS_ON_FLAG = "always.on.flag";
    private static final String ALWAYS_OFF_FLAG = "always.off.flag";
    private static final Map<String, Boolean> FLAG_VALUES = Map.of(
            ALWAYS_ON_FLAG, true,
            ALWAYS_OFF_FLAG, false
    );

    // From system/core/libcutils/include/private/android_filesystem_config.h
    private static final int MEDIA_UID = 1013;

    private SystemConfig mSysConfig;
    private File mFooJar;

@@ -80,6 +95,7 @@ public class SystemConfigTest {
        mSysConfig = new SystemConfigTestClass();
        mFooJar = createTempFile(
                mTemporaryFolder.getRoot().getCanonicalFile(), "foo.jar", "JAR");
        ParsingPackageUtils.getAconfigFlags().addFlagValuesForTesting(FLAG_VALUES);
    }

    /**
@@ -204,6 +220,95 @@ public class SystemConfigTest {
        assertEquals(packageTwoExpected, packageTwo);
    }

    @Test
    public void testSplitPermission_featureFlagEnabled() throws Exception {
        final String contents =
                "<permissions>"
                        + "<split-permission name=\"android.permission.FOO\""
                        + "featureFlag=\"" + ALWAYS_ON_FLAG + "\""
                        + "targetSdk=\"36\">"
                        + "<new-permission name=\"android.permission.BAR\" />"
                        + "</split-permission>"
                        + "</permissions>";

        final File folder = createTempSubfolder("folder/etc/permissions");
        createTempFile(folder, "platform.xml", contents);

        readPermissions(folder, /* Grant all permission flags */ ~0);

        SplitPermissionInfo expectedPermission =
                new SplitPermissionInfo(
                        "android.permission.FOO", List.of("android.permission.BAR"),
                        36);

        final ArrayList<SplitPermissionInfo> permissions =
                mSysConfig.getSplitPermissions();
        assertThat(permissions.size()).isEqualTo(1);
        assertEquals(expectedPermission, permissions.getFirst());
    }

    @Test
    public void testSplitPermission_featureFlagDisabled() throws Exception {
        final String contents =
                "<permissions>"
                        + "<split-permission name=\"android.permission.FOO\""
                        + "featureFlag=\"" + ALWAYS_OFF_FLAG + "\""
                        + "targetSdk=\"36\">"
                        + "<new-permission name=\"android.permission.BAR\" />"
                        + "</split-permission>"
                        + "</permissions>";

        final File folder = createTempSubfolder("folder/etc/permissions");
        createTempFile(folder, "platform.xml", contents);

        readPermissions(folder, /* Grant all permission flags */ ~0);

        final ArrayList<SplitPermissionInfo> permissions =
                mSysConfig.getSplitPermissions();
        assertThat(permissions).isEmpty();
    }

    @Test
    public void testAssignPermission_featureFlagEnabled() throws Exception {
        final String contents =
                "<permissions>"
                        + "<assign-permission name=\"android.permission.FOO\""
                        + "featureFlag=\"" + ALWAYS_ON_FLAG + "\""
                        + "uid=\"media\">"
                        + "</assign-permission>"
                        + "</permissions>";

        final File folder = createTempSubfolder("folder/etc/permissions");
        createTempFile(folder, "platform.xml", contents);

        readPermissions(folder, /* Grant all permission flags */ ~0);

        final SparseArray<ArraySet<String>> permissions =
                mSysConfig.getSystemPermissions();
        assertThat(permissions.size()).isEqualTo(1);
        assertThat(permissions.get(MEDIA_UID)).containsExactly("android.permission.FOO");
    }

    @Test
    public void testAssignPermission_featureFlagDisabled() throws Exception {
        final String contents =
                "<permissions>"
                        + "<assign-permission name=\"android.permission.FOO\""
                        + "featureFlag=\"" + ALWAYS_OFF_FLAG + "\""
                        + "uid=\"media\">"
                        + "</assign-permission>"
                        + "</permissions>";

        final File folder = createTempSubfolder("folder/etc/permissions");
        createTempFile(folder, "platform.xml", contents);

        readPermissions(folder, /* Grant all permission flags */ ~0);

        final SparseArray<ArraySet<String>> permissions =
                mSysConfig.getSystemPermissions();
        assertThat(permissions.size()).isEqualTo(0);
    }

    /**
     * Tests that readPermissions works correctly with {@link SystemConfig#ALLOW_APP_CONFIGS}
     * permission flag for the tag: allowlisted-staged-installer.