diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java index 962816c6dd922..0fb8475bc3afe 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java @@ -899,7 +899,7 @@ public class DomainVerificationService extends SystemService oldPkgState.getUserStates(); int oldUserStatesSize = oldUserStates.size(); if (oldUserStatesSize > 0) { - ArraySet newWebDomains = mCollector.collectValidAutoVerifyDomains(newPkg); + ArraySet newWebDomains = mCollector.collectAllWebDomains(newPkg); for (int oldUserStatesIndex = 0; oldUserStatesIndex < oldUserStatesSize; oldUserStatesIndex++) { int userId = oldUserStates.keyAt(oldUserStatesIndex); diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt index 3ffce8c426a4c..ad79c65691c35 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt @@ -623,6 +623,60 @@ class DomainVerificationPackageTest { assertThat(service.queryValidVerificationPackageNames()).containsExactly(pkgName) } + @Test + fun migratePackageSelected() { + val pkgName = PKG_ONE + val pkgBefore = mockPkgState(pkgName, UUID_ONE, SIGNATURE_ONE, + listOf(DOMAIN_1), listOf(DOMAIN_2)) + val pkgAfter = mockPkgState(pkgName, UUID_TWO, SIGNATURE_TWO, + listOf(DOMAIN_1), listOf(DOMAIN_2)) + + val map = mutableMapOf() + val service = makeService { map[it] } + service.addPackage(pkgBefore) + + // Only insert the package after addPackage call to ensure the service doesn't access + // a live package inside the addPackage logic. It should only use the provided input. + map[pkgName] = pkgBefore + + assertThat(service.setStatus(UUID_ONE, setOf(DOMAIN_1), STATE_SUCCESS)) + .isEqualTo(DomainVerificationManager.STATUS_OK) + + assertThat(service.setUserSelection(UUID_ONE, setOf(DOMAIN_2), true, USER_ID)) + .isEqualTo(DomainVerificationManager.STATUS_OK) + + service.getInfo(pkgName).run { + assertThat(identifier).isEqualTo(UUID_ONE) + assertThat(hostToStateMap).containsExactlyEntriesIn(mapOf( + DOMAIN_1 to STATE_SUCCESS, + )) + } + assertThat(service.getUserState(pkgName).hostToStateMap).containsExactlyEntriesIn(mapOf( + DOMAIN_1 to DOMAIN_STATE_VERIFIED, + DOMAIN_2 to DOMAIN_STATE_SELECTED, + )) + assertThat(service.queryValidVerificationPackageNames()).containsExactly(pkgName) + + // Now remove the package because migrateState shouldn't use it either + map.remove(pkgName) + + service.migrateState(pkgBefore, pkgAfter) + + map[pkgName] = pkgAfter + + service.getInfo(pkgName).run { + assertThat(identifier).isEqualTo(UUID_TWO) + assertThat(hostToStateMap).containsExactlyEntriesIn(mapOf( + DOMAIN_1 to STATE_SUCCESS, + )) + } + assertThat(service.getUserState(pkgName).hostToStateMap).containsExactlyEntriesIn(mapOf( + DOMAIN_1 to DOMAIN_STATE_VERIFIED, + DOMAIN_2 to DOMAIN_STATE_SELECTED, + )) + assertThat(service.queryValidVerificationPackageNames()).containsExactly(pkgName) + } + @Test fun backupAndRestore() { // This test acts as a proxy for true user restore through PackageManager, @@ -804,7 +858,8 @@ class DomainVerificationPackageTest { pkgName: String, domainSetId: UUID, signature: String, - domains: List = listOf(DOMAIN_1, DOMAIN_2), + autoVerifyDomains: List = listOf(DOMAIN_1, DOMAIN_2), + otherDomains: List = listOf(), isSystemApp: Boolean = false ) = mockThrowOnUnmocked { val pkg = mockThrowOnUnmocked { @@ -812,23 +867,25 @@ class DomainVerificationPackageTest { whenever(targetSdkVersion) { Build.VERSION_CODES.S } whenever(isEnabled) { true } + fun baseIntent(domain: String) = ParsedIntentInfoImpl().apply { + intentFilter.apply { + addAction(Intent.ACTION_VIEW) + addCategory(Intent.CATEGORY_BROWSABLE) + addCategory(Intent.CATEGORY_DEFAULT) + addDataScheme("http") + addDataScheme("https") + addDataPath("/sub", PatternMatcher.PATTERN_LITERAL) + addDataAuthority(domain, null) + } + } + val activityList = listOf( ParsedActivityImpl().apply { - domains.forEach { - addIntent( - ParsedIntentInfoImpl().apply { - intentFilter.apply { - autoVerify = true - addAction(Intent.ACTION_VIEW) - addCategory(Intent.CATEGORY_BROWSABLE) - addCategory(Intent.CATEGORY_DEFAULT) - addDataScheme("http") - addDataScheme("https") - addDataPath("/sub", PatternMatcher.PATTERN_LITERAL) - addDataAuthority(it, null) - } - } - ) + autoVerifyDomains.forEach { + addIntent(baseIntent(it).apply { intentFilter.autoVerify = true }) + } + otherDomains.forEach { + addIntent(baseIntent(it).apply { intentFilter.autoVerify = false }) } }, )