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

Commit 6e3c563f authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Internal version of isChangeEnabled.

Do not check permissions when called from within system server. It's up
to PM to make sure it's doing the right thing.

Bug: 157191740
Test: adb reboot; adb logcat | grep "Finished scanning system apps"

Change-Id: Icde2a3d62f7eacfbeb33e102f74d1f2ca06a4439
parent 8cf7a51d
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -102,6 +102,13 @@ public class PlatformCompat extends IPlatformCompat.Stub {
    @Override
    @Override
    public boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) {
    public boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) {
        checkCompatChangeReadAndLogPermission();
        checkCompatChangeReadAndLogPermission();
        return isChangeEnabledInternal(changeId, appInfo);
    }

    /**
     * Internal version of the above method. Does not perform costly permission check.
     */
    public boolean isChangeEnabledInternal(long changeId, ApplicationInfo appInfo) {
        if (mCompatConfig.isChangeEnabled(changeId, appInfo)) {
        if (mCompatConfig.isChangeEnabled(changeId, appInfo)) {
            reportChange(changeId, appInfo.uid,
            reportChange(changeId, appInfo.uid,
                    ChangeReporter.STATE_ENABLED);
                    ChangeReporter.STATE_ENABLED);
+7 −15
Original line number Original line Diff line number Diff line
@@ -32,7 +32,6 @@ import android.content.pm.parsing.component.ParsedInstrumentation;
import android.content.pm.parsing.component.ParsedIntentInfo;
import android.content.pm.parsing.component.ParsedIntentInfo;
import android.content.pm.parsing.component.ParsedMainComponent;
import android.content.pm.parsing.component.ParsedMainComponent;
import android.content.pm.parsing.component.ParsedProvider;
import android.content.pm.parsing.component.ParsedProvider;
import android.os.Binder;
import android.os.Process;
import android.os.Process;
import android.os.Trace;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserHandle;
@@ -239,21 +238,14 @@ public class AppsFilter {
        }
        }


        private void updateEnabledState(AndroidPackage pkg) {
        private void updateEnabledState(AndroidPackage pkg) {
            final long token = Binder.clearCallingIdentity();
            try {
            // TODO(b/135203078): Do not use toAppInfo
            // TODO(b/135203078): Do not use toAppInfo
                final boolean enabled =
            final boolean enabled = mInjector.getCompatibility().isChangeEnabledInternal(
                        mInjector.getCompatibility().isChangeEnabled(
                    PackageManager.FILTER_APPLICATION_QUERY, pkg.toAppInfoWithoutState());
                                PackageManager.FILTER_APPLICATION_QUERY,
                                pkg.toAppInfoWithoutState());
            if (enabled) {
            if (enabled) {
                mDisabledPackages.remove(pkg.getPackageName());
                mDisabledPackages.remove(pkg.getPackageName());
            } else {
            } else {
                mDisabledPackages.add(pkg.getPackageName());
                mDisabledPackages.add(pkg.getPackageName());
            }
            }
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }
        }


        @Override
        @Override
+2 −1
Original line number Original line Diff line number Diff line
@@ -349,7 +349,8 @@ public final class SELinuxMMAC {
        if ((sharedUserSetting != null) && (sharedUserSetting.packages.size() != 0)) {
        if ((sharedUserSetting != null) && (sharedUserSetting.packages.size() != 0)) {
            return sharedUserSetting.seInfoTargetSdkVersion;
            return sharedUserSetting.seInfoTargetSdkVersion;
        }
        }
        if (compatibility.isChangeEnabled(SELINUX_LATEST_CHANGES, pkg.toAppInfoWithoutState())) {
        if (compatibility.isChangeEnabledInternal(SELINUX_LATEST_CHANGES,
                pkg.toAppInfoWithoutState())) {
            return android.os.Build.VERSION_CODES.R;
            return android.os.Build.VERSION_CODES.R;
        }
        }


+3 −3
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@ public class SELinuxMMACTest {
    @Test
    @Test
    public void getSeInfoOptInToLatest() {
    public void getSeInfoOptInToLatest() {
        AndroidPackage pkg = makePackage(Build.VERSION_CODES.P);
        AndroidPackage pkg = makePackage(Build.VERSION_CODES.P);
        when(mMockCompatibility.isChangeEnabled(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
        when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                .thenReturn(true);
                .thenReturn(true);
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
@@ -62,7 +62,7 @@ public class SELinuxMMACTest {
    @Test
    @Test
    public void getSeInfoNoOptIn() {
    public void getSeInfoNoOptIn() {
        AndroidPackage pkg = makePackage(Build.VERSION_CODES.P);
        AndroidPackage pkg = makePackage(Build.VERSION_CODES.P);
        when(mMockCompatibility.isChangeEnabled(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
        when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                .thenReturn(false);
                .thenReturn(false);
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
@@ -72,7 +72,7 @@ public class SELinuxMMACTest {
    @Test
    @Test
    public void getSeInfoNoOptInButAlreadyR() {
    public void getSeInfoNoOptInButAlreadyR() {
        AndroidPackage pkg = makePackage(OPT_IN_VERSION);
        AndroidPackage pkg = makePackage(OPT_IN_VERSION);
        when(mMockCompatibility.isChangeEnabled(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
        when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                .thenReturn(false);
                .thenReturn(false);
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),