summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Songchun Fan <schfan@google.com> 2022-08-23 14:07:06 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-08-23 14:07:06 +0000
commit22e2a5c67572ca734a199c87d238c103ef00c59e (patch)
tree699aae0587240c3be605a6fa075dab71bd7d13a6
parentbd43b1050cbf83f2028d93b56b6df86382ec7c3a (diff)
parent283347aa0f787e596f537b67d3dfe9515f6c7ada (diff)
Merge "[pm] skip required verifier if it's disabled"
-rw-r--r--services/core/java/com/android/server/pm/Computer.java7
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java20
-rw-r--r--services/core/java/com/android/server/pm/VerifyingSession.java23
3 files changed, 44 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java
index a878bfd46a54..b3c7cc07493b 100644
--- a/services/core/java/com/android/server/pm/Computer.java
+++ b/services/core/java/com/android/server/pm/Computer.java
@@ -500,6 +500,13 @@ public interface Computer extends PackageDataSnapshot {
boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
@UserIdInt int userId);
+ /**
+ * @return true if the runtime app user enabled state and the install-time app manifest enabled
+ * state are both effectively enabled for the given app. Or if the app cannot be found,
+ * returns false.
+ */
+ boolean isApplicationEffectivelyEnabled(@NonNull String packageName, @UserIdInt int userId);
+
@Nullable
KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias);
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 8ec3d2bc74ca..7dc648c281f5 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -5412,6 +5412,26 @@ public class ComputerEngine implements Computer {
}
}
+ @Override
+ public boolean isApplicationEffectivelyEnabled(@NonNull String packageName,
+ @UserIdInt int userId) {
+ try {
+ int appEnabledSetting = mSettings.getApplicationEnabledSetting(packageName, userId);
+ if (appEnabledSetting == COMPONENT_ENABLED_STATE_DEFAULT) {
+ final AndroidPackage pkg = getPackage(packageName);
+ if (pkg == null) {
+ // Should not happen because getApplicationEnabledSetting would have thrown
+ return false;
+ }
+ return pkg.isEnabled();
+ } else {
+ return appEnabledSetting == COMPONENT_ENABLED_STATE_ENABLED;
+ }
+ } catch (PackageManager.NameNotFoundException ignored) {
+ return false;
+ }
+ }
+
@Nullable
@Override
public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
diff --git a/services/core/java/com/android/server/pm/VerifyingSession.java b/services/core/java/com/android/server/pm/VerifyingSession.java
index 0a39e64ffcf2..47a3705388b6 100644
--- a/services/core/java/com/android/server/pm/VerifyingSession.java
+++ b/services/core/java/com/android/server/pm/VerifyingSession.java
@@ -25,6 +25,7 @@ import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
import static android.os.PowerWhitelistManager.REASON_PACKAGE_VERIFIER;
import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
+import static android.os.Process.SYSTEM_UID;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static com.android.server.pm.PackageManagerService.CHECK_PENDING_INTEGRITY_VERIFICATION;
@@ -77,6 +78,7 @@ import com.android.server.sdksandbox.SdkSandboxManagerLocal;
import java.io.File;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
final class VerifyingSession {
@@ -353,7 +355,7 @@ final class VerifyingSession {
}
final int verifierUserId = verifierUser.getIdentifier();
- String[] requiredVerifierPackages = mPm.mRequiredVerifierPackages;
+ List<String> requiredVerifierPackages = Arrays.asList(mPm.mRequiredVerifierPackages);
boolean requiredVerifierPackagesOverridden = false;
// Allow verifier override for ADB installations which could already be unverified using
@@ -377,8 +379,7 @@ final class VerifyingSession {
// are not adding a new way to disable verifications.
if (!isAdbVerificationEnabled(pkgLite, verifierUserId,
requestedDisableVerification)) {
- requiredVerifierPackages = adbVerifierOverridePackages.toArray(
- new String[adbVerifierOverridePackages.size()]);
+ requiredVerifierPackages = adbVerifierOverridePackages;
requiredVerifierPackagesOverridden = true;
}
}
@@ -397,6 +398,16 @@ final class VerifyingSession {
*/
final Computer snapshot = mPm.snapshotComputer();
+ final int numRequiredVerifierPackages = requiredVerifierPackages.size();
+ for (int i = numRequiredVerifierPackages - 1; i >= 0; i--) {
+ if (!snapshot.isApplicationEffectivelyEnabled(requiredVerifierPackages.get(i),
+ SYSTEM_UID)) {
+ Slog.w(TAG,
+ "Required verifier: " + requiredVerifierPackages.get(i) + " is disabled");
+ requiredVerifierPackages.remove(i);
+ }
+ }
+
for (String requiredVerifierPackage : requiredVerifierPackages) {
final int requiredUid = snapshot.getPackageUid(requiredVerifierPackage,
MATCH_DEBUG_TRIAGED_MISSING, verifierUserId);
@@ -514,7 +525,7 @@ final class VerifyingSession {
}
}
- if (requiredVerifierPackages.length == 0) {
+ if (requiredVerifierPackages.size() == 0) {
Slog.e(TAG, "No required verifiers");
return;
}
@@ -532,7 +543,7 @@ final class VerifyingSession {
final Intent requiredIntent;
final String receiverPermission;
- if (!requiredVerifierPackagesOverridden || requiredVerifierPackages.length == 1) {
+ if (!requiredVerifierPackagesOverridden || requiredVerifierPackages.size() == 1) {
// Prod code OR test code+single verifier.
requiredIntent = new Intent(verification);
if (!requiredVerifierPackagesOverridden) {
@@ -657,7 +668,7 @@ final class VerifyingSession {
* @return true if verification should be performed
*/
private boolean isVerificationEnabled(PackageInfoLite pkgInfoLite, int userId,
- String[] requiredVerifierPackages) {
+ List<String> requiredVerifierPackages) {
if (!DEFAULT_VERIFY_ENABLE) {
return false;
}