Merge "Revoke 'always' web handler status when not autoverifying" into oc-dev

This commit is contained in:
Chris Tate
2020-02-01 01:01:34 +00:00
committed by Android (Google) Code Review
2 changed files with 34 additions and 11 deletions

View File

@@ -18437,35 +18437,47 @@ public class PackageManagerService extends IPackageManager.Stub
int count = 0; int count = 0;
final String packageName = pkg.packageName; final String packageName = pkg.packageName;
boolean handlesWebUris = false;
final boolean alreadyVerified;
synchronized (mPackages) { synchronized (mPackages) {
// If this is a new install and we see that we've already run verification for this // If this is a new install and we see that we've already run verification for this
// package, we have nothing to do: it means the state was restored from backup. // package, we have nothing to do: it means the state was restored from backup.
if (!replacing) { final IntentFilterVerificationInfo ivi =
IntentFilterVerificationInfo ivi =
mSettings.getIntentFilterVerificationLPr(packageName); mSettings.getIntentFilterVerificationLPr(packageName);
if (ivi != null) { alreadyVerified = (ivi != null);
if (!replacing && alreadyVerified) {
if (DEBUG_DOMAIN_VERIFICATION) { if (DEBUG_DOMAIN_VERIFICATION) {
Slog.i(TAG, "Package " + packageName + " already verified: status=" Slog.i(TAG, "Package " + packageName + " already verified: status="
+ ivi.getStatusString()); + ivi.getStatusString());
} }
return; return;
} }
}
// If any filters need to be verified, then all need to be. // If any filters need to be verified, then all need to be. In addition, we need to
// know whether an updating app has any web navigation intent filters, to re-
// examine handling policy even if not re-verifying.
boolean needToVerify = false; boolean needToVerify = false;
for (PackageParser.Activity a : pkg.activities) { for (PackageParser.Activity a : pkg.activities) {
for (ActivityIntentInfo filter : a.intents) { for (ActivityIntentInfo filter : a.intents) {
if (filter.handlesWebUris(true)) {
handlesWebUris = true;
}
if (filter.needsVerification() && needsNetworkVerificationLPr(filter)) { if (filter.needsVerification() && needsNetworkVerificationLPr(filter)) {
if (DEBUG_DOMAIN_VERIFICATION) { if (DEBUG_DOMAIN_VERIFICATION) {
Slog.d(TAG, "Intent filter needs verification, so processing all filters"); Slog.d(TAG, "Intent filter needs verification, so processing all filters");
} }
needToVerify = true; needToVerify = true;
// It's safe to break out here because filter.needsVerification()
// can only be true if filter.handlesWebUris(true) returns true, so
// we've already noted that.
break; break;
} }
} }
} }
// Note whether this app publishes any web navigation handling support at all,
// and whether there are any web-nav filters that fit the profile for running
// a verification pass now.
if (needToVerify) { if (needToVerify) {
final int verificationId = mIntentFilterVerificationToken++; final int verificationId = mIntentFilterVerificationToken++;
for (PackageParser.Activity a : pkg.activities) { for (PackageParser.Activity a : pkg.activities) {
@@ -18483,13 +18495,23 @@ public class PackageManagerService extends IPackageManager.Stub
} }
if (count > 0) { if (count > 0) {
// count > 0 means that we're running a full verification pass
if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Starting " + count if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Starting " + count
+ " IntentFilter verification" + (count > 1 ? "s" : "") + " IntentFilter verification" + (count > 1 ? "s" : "")
+ " for userId:" + userId); + " for userId:" + userId);
mIntentFilterVerifier.startVerifications(userId); mIntentFilterVerifier.startVerifications(userId);
} else if (alreadyVerified && handlesWebUris) {
// App used autoVerify in the past, no longer does, but still handles web
// navigation starts.
if (DEBUG_DOMAIN_VERIFICATION) {
Slog.d(TAG, "App changed web filters but no longer verifying - resetting policy");
}
synchronized (mPackages) {
clearIntentFilterVerificationsLPw(packageName, userId);
}
} else { } else {
if (DEBUG_DOMAIN_VERIFICATION) { if (DEBUG_DOMAIN_VERIFICATION) {
Slog.d(TAG, "No filters or not all autoVerify for " + packageName); Slog.d(TAG, "No web filters or no prior verify policy for " + packageName);
} }
} }
} }

View File

@@ -1377,6 +1377,7 @@ final class Settings {
return false; return false;
} }
ps.clearDomainVerificationStatusForUser(userId); ps.clearDomainVerificationStatusForUser(userId);
ps.setIntentFilterVerificationInfo(null);
return true; return true;
} }