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

Commit a547c5c6 authored by Alan Stokes's avatar Alan Stokes
Browse files

Allow an app to see its installing package.

An app is automatically granted visibility to its installing app and
its install initiating app (provided it has not been uninstalled), but
not the originating app.

Add corresponding unit tests.

Make sure we update the apps filter if the installing app
changes. (The others can't without an install or update.)

Fixes: 147795820
Test: atest PackageManagerTests AppsFilterTest
Change-Id: I5e5e03636b97c1d56dbcc6752fe2a2bb70d28925
parent a85b3d56
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -213,6 +213,25 @@ public class AppsFilter {
        return false;
    }

    private static boolean canQueryViaPackage(AndroidPackage querying,
            AndroidPackage potentialTarget) {
        return querying.getQueriesPackages() != null
                && querying.getQueriesPackages().contains(potentialTarget.getPackageName());
    }

    private static boolean canQueryAsInstaller(PackageSetting querying,
            AndroidPackage potentialTarget) {
        final InstallSource installSource = querying.installSource;
        if (potentialTarget.getPackageName().equals(installSource.installerPackageName)) {
            return true;
        }
        if (!installSource.isInitiatingPackageUninstalled
                && potentialTarget.getPackageName().equals(installSource.initiatingPackageName)) {
            return true;
        }
        return false;
    }

    private static boolean matches(Intent intent, AndroidPackage potentialTarget) {
        for (int p = ArrayUtils.size(potentialTarget.getProviders()) - 1; p >= 0; p--) {
            ParsedProvider provider = potentialTarget.getProviders().get(p);
@@ -331,8 +350,8 @@ public class AppsFilter {
                    if (canQueryViaIntent(existingPkg, newPkg)) {
                        mQueriesViaIntent.add(existingSetting.appId, newPkgSetting.appId);
                    }
                    if (existingPkg.getQueriesPackages() != null
                            && existingPkg.getQueriesPackages().contains(newPkg.getPackageName())) {
                    if (canQueryViaPackage(existingPkg, newPkg)
                            || canQueryAsInstaller(existingSetting, newPkg)) {
                        mQueriesViaPackage.add(existingSetting.appId, newPkgSetting.appId);
                    }
                }
@@ -341,8 +360,8 @@ public class AppsFilter {
                    if (canQueryViaIntent(newPkg, existingPkg)) {
                        mQueriesViaIntent.add(newPkgSetting.appId, existingSetting.appId);
                    }
                    if (newPkg.getQueriesPackages() != null
                            && newPkg.getQueriesPackages().contains(existingPkg.getPackageName())) {
                    if (canQueryViaPackage(newPkg, existingPkg)
                            || canQueryAsInstaller(newPkgSetting, existingPkg)) {
                        mQueriesViaPackage.add(newPkgSetting.appId, existingSetting.appId);
                    }
                }
@@ -535,7 +554,6 @@ public class AppsFilter {
            try {
                Trace.beginSection("mQueriesViaPackage");
                if (mQueriesViaPackage.contains(callingAppId, targetAppId)) {
                    // the calling package has explicitly declared the target package; allow
                    if (DEBUG_LOGGING) {
                        log(callingSetting, targetPkgSetting, "queries package");
                    }
+1 −0
Original line number Diff line number Diff line
@@ -13492,6 +13492,7 @@ public class PackageManagerService extends IPackageManager.Stub
            // Okay!
            targetPackageSetting.setInstallerPackageName(installerPackageName);
            mSettings.addInstallerPackageNames(targetPackageSetting.installSource);
            mAppsFilter.addPackage(targetPackageSetting, mSettings.mPackages);
            scheduleWriteSettingsLocked();
        }
    }
+64 −1
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

@@ -511,6 +510,62 @@ public class AppsFilterTest {
                overlaySetting, 0));
    }

    @Test
    public void testInitiatingApp_DoesntFilter() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(target.name, null, null, false));

        assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    @Test
    public void testUninstalledInitiatingApp_Filters() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(target.name, null, null, true));

        assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    @Test
    public void testOriginatingApp_Filters() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(null, target.name, null, false));

        assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    @Test
    public void testInstallingApp_DoesntFilter() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(null, null, target.name, false));

        assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    private interface WithSettingBuilder {
        PackageSettingBuilder withBuilder(PackageSettingBuilder builder);
    }
@@ -538,5 +593,13 @@ public class AppsFilterTest {
        return setting;
    }

    private WithSettingBuilder withInstallSource(String initiatingPackageName,
            String originatingPackageName, String installerPackageName,
            boolean isInitiatingPackageUninstalled) {
        final InstallSource installSource = InstallSource.create(initiatingPackageName,
                originatingPackageName, installerPackageName,
                /* isOrphaned= */ false, isInitiatingPackageUninstalled);
        return setting -> setting.setInstallSource(installSource);
    }
}
+9 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ public class PackageSettingBuilder {
    private SparseArray<PackageUserState> mUserStates = new SparseArray<>();
    private AndroidPackage mPkg;
    private int mAppId;
    private InstallSource mInstallSource;

    public PackageSettingBuilder setPackage(AndroidPackage pkg) {
        this.mPkg = pkg;
@@ -137,6 +138,11 @@ public class PackageSettingBuilder {
        return this;
    }

    public PackageSettingBuilder setInstallSource(InstallSource installSource) {
        mInstallSource = installSource;
        return this;
    }

    public PackageSetting build() {
        final PackageSetting packageSetting = new PackageSetting(mName, mRealName,
                new File(mCodePath), new File(mResourcePath),
@@ -146,6 +152,9 @@ public class PackageSettingBuilder {
        packageSetting.pkg = mPkg;
        packageSetting.appId = mAppId;
        packageSetting.volumeUuid = this.mVolumeUuid;
        if (mInstallSource != null) {
            packageSetting.installSource = mInstallSource;
        }
        for (int i = 0; i < mUserStates.size(); i++) {
            packageSetting.setUserState(mUserStates.keyAt(i), mUserStates.valueAt(i));
        }