From 8cbb2bd3974377fb31ddcca0ec80acc6a392d940 Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Tue, 10 Jan 2023 10:43:10 +0800 Subject: [PATCH] Allow an app to see its update owner Same as installer of record, an app is automatically granted package visibility to its update owner. This CL also adds the corresponding unit test. Fix: 264605593 Test: atest PackageManagerServiceServerTests:AppsFilterImplTest Change-Id: I96aa03e25d8668654681c4c64b0ec56c71874676 --- .../com/android/server/pm/AppsFilterImpl.java | 7 +++- .../android/server/pm/AppsFilterUtils.java | 9 +++++ .../android/server/pm/AppsFilterImplTest.java | 37 +++++++++++++++++-- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java index 5ff1909b54e4f..ac8ff21b7fa66 100644 --- a/services/core/java/com/android/server/pm/AppsFilterImpl.java +++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java @@ -32,6 +32,7 @@ import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_F import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_DELETED; import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_REPLACED; import static com.android.server.pm.AppsFilterUtils.canQueryAsInstaller; +import static com.android.server.pm.AppsFilterUtils.canQueryAsUpdateOwner; import static com.android.server.pm.AppsFilterUtils.canQueryViaComponents; import static com.android.server.pm.AppsFilterUtils.canQueryViaPackage; import static com.android.server.pm.AppsFilterUtils.canQueryViaUsesLibrary; @@ -670,7 +671,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, } } if (canQueryViaPackage(existingPkg, newPkg) - || canQueryAsInstaller(existingSetting, newPkg)) { + || canQueryAsInstaller(existingSetting, newPkg) + || canQueryAsUpdateOwner(existingSetting, newPkg)) { synchronized (mQueriesViaPackageLock) { mQueriesViaPackage.add(existingSetting.getAppId(), newPkgSetting.getAppId()); @@ -697,7 +699,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, } } if (canQueryViaPackage(newPkg, existingPkg) - || canQueryAsInstaller(newPkgSetting, existingPkg)) { + || canQueryAsInstaller(newPkgSetting, existingPkg) + || canQueryAsUpdateOwner(newPkgSetting, existingPkg)) { synchronized (mQueriesViaPackageLock) { mQueriesViaPackage.add(newPkgSetting.getAppId(), existingSetting.getAppId()); diff --git a/services/core/java/com/android/server/pm/AppsFilterUtils.java b/services/core/java/com/android/server/pm/AppsFilterUtils.java index 8da1d217b88a7..d38b83fa67581 100644 --- a/services/core/java/com/android/server/pm/AppsFilterUtils.java +++ b/services/core/java/com/android/server/pm/AppsFilterUtils.java @@ -91,6 +91,15 @@ final class AppsFilterUtils { return false; } + public static boolean canQueryAsUpdateOwner(PackageStateInternal querying, + AndroidPackage potentialTarget) { + final InstallSource installSource = querying.getInstallSource(); + if (potentialTarget.getPackageName().equals(installSource.mUpdateOwnerPackageName)) { + return true; + } + return false; + } + public static boolean canQueryViaUsesLibrary(AndroidPackage querying, AndroidPackage potentialTarget) { if (potentialTarget.getLibraryNames().isEmpty()) { diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java index 56cd7a924acd4..7909ba444d85f 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java @@ -283,7 +283,7 @@ public class AppsFilterImplTest { assertFalse( appsFilter.shouldFilterApplication(mSnapshot, DUMMY_CALLING_APPID, calling, target, SYSTEM_USER)); - watcher.verifyNoChangeReported("shouldFilterAplication"); + watcher.verifyNoChangeReported("shouldFilterApplication"); } @Test @@ -1081,7 +1081,7 @@ public class AppsFilterImplTest { assertTrue( appsFilter.shouldFilterApplication(mSnapshot, DUMMY_CALLING_APPID, calling, target, SYSTEM_USER)); - watcher.verifyNoChangeReported("shouldFilterAplication"); + watcher.verifyNoChangeReported("shouldFilterApplication"); } @Test @@ -1110,7 +1110,36 @@ public class AppsFilterImplTest { assertFalse( appsFilter.shouldFilterApplication(mSnapshot, DUMMY_CALLING_APPID, calling, target, SYSTEM_USER)); - watcher.verifyNoChangeReported("shouldFilterAplication"); + watcher.verifyNoChangeReported("shouldFilterApplication"); + } + + @Test + public void testUpdateOwner_DoesntFilter() throws Exception { + final AppsFilterImpl appsFilter = + new AppsFilterImpl(mFeatureConfigMock, new String[]{}, /* systemAppsQueryable */ + false, /* overlayProvider */ null, mMockHandler); + final WatchableTester watcher = new WatchableTester(appsFilter, "onChange"); + watcher.register(); + simulateAddBasicAndroid(appsFilter); + watcher.verifyChangeReported("addBasicAndroid"); + appsFilter.onSystemReady(mPmInternal); + watcher.verifyChangeReported("systemReady"); + + PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"), + DUMMY_TARGET_APPID); + watcher.verifyChangeReported("add package"); + PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"), + DUMMY_CALLING_APPID, withInstallSource(null /* initiatingPackageName */, + null /* originatingPackageName */, null /* installerPackageName */, + INVALID_UID, target.getPackageName(), + null /* installerAttributionTag */, + false /* isInitiatingPackageUninstalled */)); + watcher.verifyChangeReported("add package"); + + assertFalse( + appsFilter.shouldFilterApplication(mSnapshot, DUMMY_CALLING_APPID, calling, target, + SYSTEM_USER)); + watcher.verifyNoChangeReported("shouldFilterApplication"); } @Test @@ -1139,7 +1168,7 @@ public class AppsFilterImplTest { assertFalse( appsFilter.shouldFilterApplication(mSnapshot, DUMMY_TARGET_APPID, target, instrumentation, SYSTEM_USER)); - watcher.verifyNoChangeReported("shouldFilterAplication"); + watcher.verifyNoChangeReported("shouldFilterApplication"); } @Test