summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2020-01-28 18:04:13 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-01-28 18:04:13 +0000
commitb32b15d146486a92da211f10706a86f9a951dc06 (patch)
treebc5c8e55218b07eca71dcd2505b678a08dfd7e1e
parent617b3b71da67b82244f5ba98ce4b27628213fc19 (diff)
parent051d75cdf344897c72da9de99c6495f6781dbdcf (diff)
Merge "Make system-signed apps implicitly force-queryable"
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java24
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java31
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java11
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;