From fee31681c8042d2fbc5a65a3e4fc49d4763d6d9f Mon Sep 17 00:00:00 2001 From: Marcos Date: Fri, 17 Nov 2023 17:17:14 +0000 Subject: [PATCH] Use etld+1 to compare exceptions for the user agent (#3886) Task/Issue URL: https://app.asana.com/0/488551667048375/1205957264014376/f ### Description Use etld+1 instead of sameorsubdomain for UA exceptions ### Steps to test this PR - [ ] Test should pass --- .../java/com/duckduckgo/common/utils/UriString.kt | 12 ++++++++++++ .../impl/features/useragent/RealUserAgent.kt | 15 ++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/common/common-utils/src/main/java/com/duckduckgo/common/utils/UriString.kt b/common/common-utils/src/main/java/com/duckduckgo/common/utils/UriString.kt index 2c167e491464..9a224570ec20 100644 --- a/common/common-utils/src/main/java/com/duckduckgo/common/utils/UriString.kt +++ b/common/common-utils/src/main/java/com/duckduckgo/common/utils/UriString.kt @@ -17,9 +17,11 @@ package com.duckduckgo.common.utils import android.net.Uri +import androidx.core.net.toUri import androidx.core.util.PatternsCompat import java.lang.IllegalArgumentException import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import timber.log.Timber class UriString { @@ -35,6 +37,16 @@ class UriString { return Uri.parse(uriString).baseHost } + fun sameEffectiveTldPlusOne(child: String, parent: String): Boolean { + val childDomain = child.toUri().withScheme().toString().toHttpUrlOrNull() ?: return false + val parentDomain = parent.toUri().withScheme().toString().toHttpUrlOrNull() ?: return false + + val childETldPlusOne = childDomain.topPrivateDomain() + val parentETldPlusOne = parentDomain.topPrivateDomain() + + return childETldPlusOne == parentETldPlusOne + } + fun sameOrSubdomain( child: String, parent: String, diff --git a/privacy-config/privacy-config-impl/src/main/java/com/duckduckgo/privacy/config/impl/features/useragent/RealUserAgent.kt b/privacy-config/privacy-config-impl/src/main/java/com/duckduckgo/privacy/config/impl/features/useragent/RealUserAgent.kt index 5be2390c01c9..16ae87632113 100644 --- a/privacy-config/privacy-config-impl/src/main/java/com/duckduckgo/privacy/config/impl/features/useragent/RealUserAgent.kt +++ b/privacy-config/privacy-config-impl/src/main/java/com/duckduckgo/privacy/config/impl/features/useragent/RealUserAgent.kt @@ -35,15 +35,20 @@ class RealUserAgent @Inject constructor( ) : UserAgent { override fun isAnApplicationException(url: String): Boolean { - return userAgentRepository.omitApplicationExceptions.any { UriString.sameOrSubdomain(url, it.domain) } + return userAgentRepository.omitApplicationExceptions.any { UriString.sameEffectiveTldPlusOne(url, it.domain) } } override fun isAVersionException(url: String): Boolean { - return userAgentRepository.omitVersionExceptions.any { UriString.sameOrSubdomain(url, it.domain) } + return userAgentRepository.omitVersionExceptions.any { UriString.sameEffectiveTldPlusOne(url, it.domain) } } override fun isADefaultException(url: String): Boolean { - return unprotectedTemporary.isAnException(url) || userAgentRepository.defaultExceptions.any { UriString.sameOrSubdomain(url, it.domain) } + return unprotectedTemporary.isAnException(url) || userAgentRepository.defaultExceptions.any { + UriString.sameEffectiveTldPlusOne( + url, + it.domain, + ) + } } override fun defaultPolicy(): DefaultPolicy { @@ -56,11 +61,11 @@ class RealUserAgent @Inject constructor( } override fun isADdgDefaultSite(url: String): Boolean { - return userAgentRepository.ddgDefaultSites.any { UriString.sameOrSubdomain(url, it.domain) } + return userAgentRepository.ddgDefaultSites.any { UriString.sameEffectiveTldPlusOne(url, it.domain) } } override fun isADdgFixedSite(url: String): Boolean { - return userAgentRepository.ddgFixedSites.any { UriString.sameOrSubdomain(url, it.domain) } + return userAgentRepository.ddgFixedSites.any { UriString.sameEffectiveTldPlusOne(url, it.domain) } } override fun closestUserAgentEnabled(): Boolean {