Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fcbd636e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Print invalid domains to pm get-app-links" into sc-dev

parents 9aee9ad8 d21f1fe7
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ public class DomainVerificationCollector {

    @NonNull
    public ArraySet<String> collectAllWebDomains(@NonNull AndroidPackage pkg) {
        return collectDomains(pkg, false);
        return collectDomains(pkg, false /* checkAutoVerify */, true /* valid */);
    }

    /**
@@ -92,20 +92,29 @@ public class DomainVerificationCollector {
     * IntentFilter#getAutoVerify()} == true.
     */
    @NonNull
    public ArraySet<String> collectAutoVerifyDomains(@NonNull AndroidPackage pkg) {
        return collectDomains(pkg, true);
    public ArraySet<String> collectValidAutoVerifyDomains(@NonNull AndroidPackage pkg) {
        return collectDomains(pkg, true /* checkAutoVerify */, true /* valid */);
    }

    /**
     * Returns all the domains that are configured to be auto verified, but aren't actually valid
     * HTTP domains, per {@link #DOMAIN_NAME_WITH_WILDCARD}.
     */
    @NonNull
    public ArraySet<String> collectInvalidAutoVerifyDomains(@NonNull AndroidPackage pkg) {
        return collectDomains(pkg, true /* checkAutoVerify */, false /* valid */);
    }

    @NonNull
    private ArraySet<String> collectDomains(@NonNull AndroidPackage pkg,
            boolean checkAutoVerify) {
            boolean checkAutoVerify, boolean valid) {
        boolean restrictDomains =
                DomainVerificationUtils.isChangeEnabled(mPlatformCompat, pkg, RESTRICT_DOMAINS);

        if (restrictDomains) {
            return collectDomainsInternal(pkg, checkAutoVerify);
            return collectDomainsInternal(pkg, checkAutoVerify, valid);
        } else {
            return collectDomainsLegacy(pkg, checkAutoVerify);
            return collectDomainsLegacy(pkg, checkAutoVerify, valid);
        }
    }

@@ -113,10 +122,10 @@ public class DomainVerificationCollector {
     * @see #RESTRICT_DOMAINS
     */
    private ArraySet<String> collectDomainsLegacy(@NonNull AndroidPackage pkg,
            boolean checkAutoVerify) {
            boolean checkAutoVerify, boolean valid) {
        if (!checkAutoVerify) {
            // Per-domain user selection state doesn't have a V1 equivalent on S, so just use V2
            return collectDomainsInternal(pkg, false);
            return collectDomainsInternal(pkg, false /* checkAutoVerify */, true /* valid */);
        }

        List<ParsedActivity> activities = pkg.getActivities();
@@ -157,7 +166,7 @@ public class DomainVerificationCollector {
                    int authorityCount = intent.countDataAuthorities();
                    for (int index = 0; index < authorityCount; index++) {
                        String host = intent.getDataAuthority(index).getHost();
                        if (isValidHost(host)) {
                        if (isValidHost(host) == valid) {
                            totalSize += byteSizeOf(host);
                            underMaxSize = totalSize < MAX_DOMAINS_BYTE_SIZE;
                            domains.add(host);
@@ -174,7 +183,7 @@ public class DomainVerificationCollector {
     * @see #RESTRICT_DOMAINS
     */
    private ArraySet<String> collectDomainsInternal(@NonNull AndroidPackage pkg,
            boolean checkAutoVerify) {
            boolean checkAutoVerify, boolean valid) {
        ArraySet<String> domains = new ArraySet<>();
        int totalSize = 0;
        boolean underMaxSize = true;
@@ -214,7 +223,7 @@ public class DomainVerificationCollector {
                int authorityCount = intent.countDataAuthorities();
                for (int index = 0; index < authorityCount && underMaxSize; index++) {
                    String host = intent.getDataAuthority(index).getHost();
                    if (isValidHost(host)) {
                    if (isValidHost(host) == valid) {
                        totalSize += byteSizeOf(host);
                        underMaxSize = totalSize < MAX_DOMAINS_BYTE_SIZE;
                        domains.add(host);
+12 −1
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ public class DomainVerificationDebug {
        reusedMap.clear();
        reusedMap.putAll(pkgState.getStateMap());

        ArraySet<String> declaredDomains = mCollector.collectAutoVerifyDomains(pkg);
        ArraySet<String> declaredDomains = mCollector.collectValidAutoVerifyDomains(pkg);
        int declaredSize = declaredDomains.size();
        for (int declaredIndex = 0; declaredIndex < declaredSize; declaredIndex++) {
            String domain = declaredDomains.valueAt(declaredIndex);
@@ -132,6 +132,17 @@ public class DomainVerificationDebug {
            }

            writer.increaseIndent();
            final ArraySet<String> invalidDomains = mCollector.collectInvalidAutoVerifyDomains(pkg);
            if (!invalidDomains.isEmpty()) {
                writer.println("Invalid autoVerify domains:");
                writer.increaseIndent();
                int size = invalidDomains.size();
                for (int index = 0; index < size; index++) {
                    writer.println(invalidDomains.valueAt(index));
                }
                writer.decreaseIndent();
            }

            writer.println("Domain verification state:");
            writer.increaseIndent();
            int stateSize = reusedMap.size();
+12 −10
Original line number Diff line number Diff line
@@ -256,7 +256,7 @@ public class DomainVerificationService extends SystemService
            Map<String, Integer> hostToStateMap = new ArrayMap<>(pkgState.getStateMap());

            // TODO(b/159952358): Should the domain list be cached?
            ArraySet<String> domains = mCollector.collectAutoVerifyDomains(pkg);
            ArraySet<String> domains = mCollector.collectValidAutoVerifyDomains(pkg);
            if (domains.isEmpty()) {
                return null;
            }
@@ -354,7 +354,8 @@ public class DomainVerificationService extends SystemService

                    validDomains.clear();

                    ArraySet<String> autoVerifyDomains = mCollector.collectAutoVerifyDomains(pkg);
                    ArraySet<String> autoVerifyDomains =
                            mCollector.collectValidAutoVerifyDomains(pkg);
                    if (domains == null) {
                        validDomains.addAll(autoVerifyDomains);
                    } else {
@@ -379,9 +380,9 @@ public class DomainVerificationService extends SystemService

                AndroidPackage pkg = pkgSetting.getPkg();
                if (domains == null) {
                    domains = mCollector.collectAutoVerifyDomains(pkg);
                    domains = mCollector.collectValidAutoVerifyDomains(pkg);
                } else {
                    domains.retainAll(mCollector.collectAutoVerifyDomains(pkg));
                    domains.retainAll(mCollector.collectValidAutoVerifyDomains(pkg));
                }

                setDomainVerificationStatusInternal(pkgState, state, domains);
@@ -811,7 +812,8 @@ public class DomainVerificationService extends SystemService
            }

            ArrayMap<String, Integer> oldStateMap = oldPkgState.getStateMap();
            ArraySet<String> newAutoVerifyDomains = mCollector.collectAutoVerifyDomains(newPkg);
            ArraySet<String> newAutoVerifyDomains =
                    mCollector.collectValidAutoVerifyDomains(newPkg);
            int newDomainsSize = newAutoVerifyDomains.size();

            for (int newDomainsIndex = 0; newDomainsIndex < newDomainsSize; newDomainsIndex++) {
@@ -840,7 +842,7 @@ public class DomainVerificationService extends SystemService
                    oldPkgState.getUserSelectionStates();
            int oldUserStatesSize = oldUserStates.size();
            if (oldUserStatesSize > 0) {
                ArraySet<String> newWebDomains = mCollector.collectAutoVerifyDomains(newPkg);
                ArraySet<String> newWebDomains = mCollector.collectValidAutoVerifyDomains(newPkg);
                for (int oldUserStatesIndex = 0; oldUserStatesIndex < oldUserStatesSize;
                        oldUserStatesIndex++) {
                    int userId = oldUserStates.keyAt(oldUserStatesIndex);
@@ -893,7 +895,7 @@ public class DomainVerificationService extends SystemService
        }

        AndroidPackage pkg = newPkgSetting.getPkg();
        ArraySet<String> domains = mCollector.collectAutoVerifyDomains(pkg);
        ArraySet<String> domains = mCollector.collectValidAutoVerifyDomains(pkg);
        boolean hasAutoVerifyDomains = !domains.isEmpty();
        boolean isPendingOrRestored = pkgState != null;
        if (isPendingOrRestored) {
@@ -1157,7 +1159,7 @@ public class DomainVerificationService extends SystemService
        }
        AndroidPackage pkg = pkgSetting.getPkg();
        ArraySet<String> declaredDomains = forAutoVerify
                ? mCollector.collectAutoVerifyDomains(pkg)
                ? mCollector.collectValidAutoVerifyDomains(pkg)
                : mCollector.collectAllWebDomains(pkg);

        if (domains.retainAll(declaredDomains)) {
@@ -1289,7 +1291,7 @@ public class DomainVerificationService extends SystemService
            }
        }

        applyImmutableState(pkgState, mCollector.collectAutoVerifyDomains(pkg));
        applyImmutableState(pkgState, mCollector.collectValidAutoVerifyDomains(pkg));
    }

    @Override
@@ -1559,7 +1561,7 @@ public class DomainVerificationService extends SystemService
                // To allow an instant app to immediately open domains after being installed by the
                // user, auto approve them for any declared autoVerify domains.
                if (pkgSetting.getInstantApp(userId)
                        && mCollector.collectAutoVerifyDomains(pkg).contains(host)) {
                        && mCollector.collectValidAutoVerifyDomains(pkg).contains(host)) {
                    return APPROVAL_LEVEL_INSTANT_APP;
                }
            }
+1 −1
Original line number Diff line number Diff line
@@ -276,7 +276,7 @@ public class DomainVerificationProxyV1 implements DomainVerificationProxy {
    private String buildHostsString(@NonNull AndroidPackage pkg) {
        // The collector itself handles the v1 vs v2 behavior, which is based on targetSdkVersion,
        // not the version of the verification agent on device.
        ArraySet<String> domains = mCollector.collectAutoVerifyDomains(pkg);
        ArraySet<String> domains = mCollector.collectValidAutoVerifyDomains(pkg);

        // v1 doesn't handle wildcard domains, so transform them here to the root
        StringBuilder builder = new StringBuilder();
+32 −8
Original line number Diff line number Diff line
@@ -52,8 +52,10 @@ class DomainVerificationCollectorTest {
        val collector = mockCollector()
        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com")
        assertThat(collector.collectAutoVerifyDomains(pkg))
        assertThat(collector.collectValidAutoVerifyDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com", "example4.com")
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg))
                .containsExactly("invalid1", "invalid2", "invalid3", "invalid4")
    }

    @Test
@@ -62,7 +64,8 @@ class DomainVerificationCollectorTest {
        val collector = mockCollector()
        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com")
        assertThat(collector.collectAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectValidAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg)).isEmpty()
    }

    @Test
@@ -71,8 +74,10 @@ class DomainVerificationCollectorTest {
        val collector = mockCollector(linkedApps = setOf(TEST_PKG_NAME))
        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com")
        assertThat(collector.collectAutoVerifyDomains(pkg))
        assertThat(collector.collectValidAutoVerifyDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com", "example4.com")
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg))
                .containsExactly("invalid1", "invalid2", "invalid3", "invalid4")
    }

    @Test
@@ -92,6 +97,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("https")
                                    addDataPath("/sub", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example1.com", null)
                                    addDataAuthority("invalid1", null)
                                }
                        )
                    },
@@ -111,6 +117,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("nonWebScheme")
                                    addDataPath("/sub", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example2.com", null)
                                    addDataAuthority("invalid2", null)
                                }
                        )
                    },
@@ -122,7 +129,8 @@ class DomainVerificationCollectorTest {
        val collector = mockCollector()
        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com")
        assertThat(collector.collectAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectValidAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg)).isEmpty()
    }

    @Test
@@ -132,8 +140,10 @@ class DomainVerificationCollectorTest {

        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com")
        assertThat(collector.collectAutoVerifyDomains(pkg))
        assertThat(collector.collectValidAutoVerifyDomains(pkg))
                .containsExactly("example1.com", "example3.com")
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg))
                .containsExactly("invalid1", "invalid3")
    }

    @Test
@@ -143,7 +153,8 @@ class DomainVerificationCollectorTest {

        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com")
        assertThat(collector.collectAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectValidAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg)).isEmpty()
    }

    @Test
@@ -153,7 +164,8 @@ class DomainVerificationCollectorTest {

        assertThat(collector.collectAllWebDomains(pkg))
                .containsExactly("example1.com", "example2.com", "example3.com")
        assertThat(collector.collectAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectValidAutoVerifyDomains(pkg)).isEmpty()
        assertThat(collector.collectInvalidAutoVerifyDomains(pkg)).isEmpty()
    }

    private fun mockCollector(linkedApps: Set<String> = emptySet()): DomainVerificationCollector {
@@ -178,6 +190,7 @@ class DomainVerificationCollectorTest {
                    <data android:scheme="https"/>
                    <data android:path="/sub"/>
                    <data android:host="example1.com"/>
                    <data android:host="invalid1"/>
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
@@ -186,6 +199,7 @@ class DomainVerificationCollectorTest {
                    <data android:scheme="http"/>
                    <data android:path="/sub2"/>
                    <data android:host="example2.com"/>
                    <data android:host="invalid2."/>
                </intent-filter>
                <intent-filter android:autoVerify="$autoVerify">
                    <action android:name="android.intent.action.VIEW"/>
@@ -194,6 +208,7 @@ class DomainVerificationCollectorTest {
                    <data android:scheme="https"/>
                    <data android:path="/sub3"/>
                    <data android:host="example3.com"/>
                    <data android:host=".invalid3"/>
                </intent-filter>
                <intent-filter android:autoVerify="$autoVerify">
                    <action android:name="android.intent.action.VIEW"/>
@@ -201,6 +216,7 @@ class DomainVerificationCollectorTest {
                    <data android:scheme="https"/>
                    <data android:path="/sub4"/>
                    <data android:host="example4.com"/>
                    <data android:host="invalid4"/>
                </intent-filter>
                <intent-filter android:autoVerify="$autoVerify">
                    <action android:name="android.intent.action.VIEW"/>
@@ -208,6 +224,7 @@ class DomainVerificationCollectorTest {
                    <data android:scheme="https"/>
                    <data android:path="/sub5"/>
                    <data android:host="example5.com"/>
                    <data android:host="invalid5"/>
                </intent-filter>
                <intent-filter android:autoVerify="$autoVerify">
                    <category android:name="android.intent.category.BROWSABLE"/>
@@ -215,11 +232,12 @@ class DomainVerificationCollectorTest {
                    <data android:scheme="https"/>
                    <data android:path="/sub5"/>
                    <data android:host="example5.com"/>
                    <data android:host="invalid5"/>
                </intent-filter>
            </xml>
        """.trimIndent()

        return mockThrowOnUnmocked<AndroidPackage> {
        return mockThrowOnUnmocked {
            whenever(packageName) { TEST_PKG_NAME }
            whenever(targetSdkVersion) {
                if (useV2) Build.VERSION_CODES.S else Build.VERSION_CODES.R
@@ -238,6 +256,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("https")
                                    addDataPath("/sub", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example1.com", null)
                                    addDataAuthority("invalid1", null)
                                }
                        )
                        addIntent(
@@ -248,6 +267,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("http")
                                    addDataPath("/sub2", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example2.com", null)
                                    addDataAuthority("invalid2", null)
                                }
                        )
                    },
@@ -261,6 +281,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("https")
                                    addDataPath("/sub3", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example3.com", null)
                                    addDataAuthority("invalid3", null)
                                }
                        )
                    },
@@ -273,6 +294,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("https")
                                    addDataPath("/sub4", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example4.com", null)
                                    addDataAuthority("invalid4", null)
                                }
                        )
                        addIntent(
@@ -283,6 +305,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("https")
                                    addDataPath("/sub5", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example5.com", null)
                                    addDataAuthority("invalid5", null)
                                }
                        )
                        addIntent(
@@ -293,6 +316,7 @@ class DomainVerificationCollectorTest {
                                    addDataScheme("https")
                                    addDataPath("/sub6", PatternMatcher.PATTERN_LITERAL)
                                    addDataAuthority("example6.com", null)
                                    addDataAuthority("invalid6", null)
                                }
                        )
                    },
Loading