diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-01-28 18:04:13 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-01-28 18:04:13 +0000 |
commit | b32b15d146486a92da211f10706a86f9a951dc06 (patch) | |
tree | bc5c8e55218b07eca71dcd2505b678a08dfd7e1e | |
parent | 617b3b71da67b82244f5ba98ce4b27628213fc19 (diff) | |
parent | 051d75cdf344897c72da9de99c6495f6781dbdcf (diff) |
Merge "Make system-signed apps implicitly force-queryable"
3 files changed, 65 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 6e7e5d884a4a..5c17bec0db47 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -20,10 +20,12 @@ import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE; import android.Manifest; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.content.pm.PackageParser; import android.content.pm.parsing.AndroidPackage; import android.content.pm.parsing.ComponentParseUtils; import android.content.pm.parsing.ComponentParseUtils.ParsedActivity; @@ -108,6 +110,7 @@ public class AppsFilter { private final FeatureConfig mFeatureConfig; private final OverlayReferenceMapper mOverlayReferenceMapper; + private PackageParser.SigningDetails mSystemSigningDetails; AppsFilter(FeatureConfig featureConfig, String[] forceQueryableWhitelist, boolean systemAppsQueryable, @@ -321,6 +324,17 @@ public class AppsFilter { */ public void addPackage(PackageSetting newPkgSetting, ArrayMap<String, PackageSetting> existingSettings) { + if (Objects.equals("android", newPkgSetting.name)) { + // let's set aside the framework signatures + mSystemSigningDetails = newPkgSetting.signatures.mSigningDetails; + // and since we add overlays before we add the framework, let's revisit already added + // packages for signature matches + for (PackageSetting setting : existingSettings.values()) { + if (isSystemSigned(mSystemSigningDetails, setting)) { + mForceQueryable.add(setting.appId); + } + } + } Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "filter.addPackage"); try { final AndroidPackage newPkg = newPkgSetting.pkg; @@ -336,7 +350,9 @@ public class AppsFilter { || (newPkgSetting.isSystem() && (mSystemAppsQueryable || ArrayUtils.contains(mForceQueryableByDevicePackageNames, newPkg.getPackageName()))); - if (newIsForceQueryable) { + if (newIsForceQueryable + || (mSystemSigningDetails != null + && isSystemSigned(mSystemSigningDetails, newPkgSetting))) { mForceQueryable.add(newPkgSetting.appId); } @@ -382,6 +398,12 @@ public class AppsFilter { } } + private static boolean isSystemSigned(@NonNull PackageParser.SigningDetails sysSigningDetails, + PackageSetting pkgSetting) { + return pkgSetting.isSystem() + && pkgSetting.signatures.mSigningDetails.signaturesMatchExactly(sysSigningDetails); + } + /** * Removes a package for consideration when filtering visibility between apps. * diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java index 7f66f3c49185..3e3f40d31d0e 100644 --- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java @@ -27,6 +27,8 @@ import android.annotation.Nullable; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageParser; +import android.content.pm.Signature; import android.content.pm.parsing.AndroidPackage; import android.content.pm.parsing.ComponentParseUtils; import android.content.pm.parsing.ComponentParseUtils.ParsedActivity; @@ -48,8 +50,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.security.cert.CertificateException; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -284,6 +288,33 @@ public class AppsFilterTest { assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } + + @Test + public void testSystemSignedTarget_DoesntFilter() throws CertificateException { + final AppsFilter appsFilter = + new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); + appsFilter.onSystemReady(); + + final Signature frameworkSignature = Mockito.mock(Signature.class); + final PackageParser.SigningDetails frameworkSigningDetails = + new PackageParser.SigningDetails(new Signature[]{frameworkSignature}, 1); + + final Signature otherSignature = Mockito.mock(Signature.class); + final PackageParser.SigningDetails otherSigningDetails = + new PackageParser.SigningDetails(new Signature[]{otherSignature}, 1); + + simulateAddPackage(appsFilter, pkg("android"), 1000, + b -> b.setSigningDetails(frameworkSigningDetails)); + PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"), + DUMMY_TARGET_UID, + b -> b.setSigningDetails(frameworkSigningDetails)); + PackageSetting calling = simulateAddPackage(appsFilter, + pkg("com.some.other.package"), DUMMY_CALLING_UID, + b -> b.setSigningDetails(otherSigningDetails)); + + assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); + } + @Test public void testForceQueryableByDevice_NonSystemCaller_Filters() { final AppsFilter appsFilter = diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java b/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java index 84414947056f..338d5fa347a6 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import android.content.pm.PackageParser; import android.content.pm.PackageUserState; import android.content.pm.parsing.AndroidPackage; import android.util.SparseArray; @@ -42,6 +43,7 @@ public class PackageSettingBuilder { private AndroidPackage mPkg; private int mAppId; private InstallSource mInstallSource; + private PackageParser.SigningDetails mSigningDetails; public PackageSettingBuilder setPackage(AndroidPackage pkg) { this.mPkg = pkg; @@ -143,12 +145,21 @@ public class PackageSettingBuilder { return this; } + public PackageSettingBuilder setSigningDetails( + PackageParser.SigningDetails signingDetails) { + mSigningDetails = signingDetails; + return this; + } + public PackageSetting build() { final PackageSetting packageSetting = new PackageSetting(mName, mRealName, new File(mCodePath), new File(mResourcePath), mLegacyNativeLibraryPathString, mPrimaryCpuAbiString, mSecondaryCpuAbiString, mCpuAbiOverrideString, mPVersionCode, mPkgFlags, mPrivateFlags, mSharedUserId, mUsesStaticLibraries, mUsesStaticLibrariesVersions); + packageSetting.signatures = mSigningDetails != null + ? new PackageSignatures(mSigningDetails) + : new PackageSignatures(); packageSetting.pkg = mPkg; packageSetting.appId = mAppId; packageSetting.volumeUuid = this.mVolumeUuid; |