Loading services/core/java/com/android/server/pm/AppsFilter.java +23 −5 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } } Loading @@ -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); } } Loading Loading @@ -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"); } Loading services/core/java/com/android/server/pm/PackageManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -13494,6 +13494,7 @@ public class PackageManagerService extends IPackageManager.Stub // Okay! targetPackageSetting.setInstallerPackageName(installerPackageName); mSettings.addInstallerPackageNames(targetPackageSetting.installSource); mAppsFilter.addPackage(targetPackageSetting, mSettings.mPackages); scheduleWriteSettingsLocked(); } } services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +64 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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); } } services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java +9 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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), Loading @@ -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)); } Loading Loading
services/core/java/com/android/server/pm/AppsFilter.java +23 −5 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } } Loading @@ -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); } } Loading Loading @@ -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"); } Loading
services/core/java/com/android/server/pm/PackageManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -13494,6 +13494,7 @@ public class PackageManagerService extends IPackageManager.Stub // Okay! targetPackageSetting.setInstallerPackageName(installerPackageName); mSettings.addInstallerPackageNames(targetPackageSetting.installSource); mAppsFilter.addPackage(targetPackageSetting, mSettings.mPackages); scheduleWriteSettingsLocked(); } }
services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +64 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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); } }
services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java +9 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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), Loading @@ -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)); } Loading