Skip to content

Commit b7d4535

Browse files
authored
Update domain canonicalization to remove www. prefix (#6123)
Task/Issue URL: https://app.asana.com/1/137249556945/project/1163321984198618/task/1210330600670664?focus=true ### Description * Update domain canonicalization to remove www. prefix * Update reference tests - Need to merge duckduckgo/privacy-reference-tests#148 before merging this PR to properly update tests ### Steps to test this PR _Feature 1_ - [ ] Visit https://petrolio-italiano-recensioni.blogspot.in - ⚠️ actual malicious site flagged in our dataset ⚠️ - [ ] Check the site is blocked - [ ] Open a new tab - [ ] Visit https://www.petrolio-italiano-recensioni.blogspot.in - ⚠️ actual malicious site flagged in our dataset ⚠️ - [ ] Check the site is also blocked ### UI changes No UI sites Also contains #6124 Task/Issue URL: https://app.asana.com/1/137249556945/project/1163321984198618/task/1210355752448338?focus=true ### Description * Add cache for isMalicious results * Evaluate HTTPS upgrade before checking for malicious sites to avoid duplicate checks ### Steps to test this PR _Feature 1_ - [ ] Type wikipedia.org on the omnibar - [ ] Filter logcat by "isMalicious | Cached result for" - [ ] Check only the following logs are produced: - [ ] isMalicious https://wikipedia.org/ - No isMalicious check for HTTP version - [ ] isMalicious https://www.wikipedia.org/ - [ ] Cached result for https://wikipedia.org/ - isMalicious https://www.wikipedia.org/ returns result that was cached for https://wikipedia.org/ _Feature 2_ - [ ] Disable maliciousSiteProtecion -> stripWWWPrefix and enableCaching - [ ] Type wikipedia.org on the omnibar - [ ] Filter logcat - [ ] Check the following logs are produced - [ ] isMalicious http://wikipedia.org/ - [ ] isMalicious https://wikipedia.org/ - [ ] isMalicious https://www.wikipedia.org/
1 parent 74be8ee commit b7d4535

File tree

18 files changed

+289
-108
lines changed

18 files changed

+289
-108
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/WebViewRequestInterceptorTest.kt

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.duckduckgo.app.fakes.FakeMaliciousSiteBlockerWebViewIntegration
3434
import com.duckduckgo.app.fakes.FeatureToggleFake
3535
import com.duckduckgo.app.fakes.UserAgentFake
3636
import com.duckduckgo.app.fakes.UserAllowListRepositoryFake
37+
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
3738
import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao
3839
import com.duckduckgo.app.statistics.model.Atb
3940
import com.duckduckgo.app.statistics.store.StatisticsDataStore
@@ -46,7 +47,9 @@ import com.duckduckgo.app.trackerdetection.model.TrackerType
4647
import com.duckduckgo.app.trackerdetection.model.TrackingEvent
4748
import com.duckduckgo.common.test.CoroutineTestRule
4849
import com.duckduckgo.duckplayer.api.DuckPlayer
50+
import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
4951
import com.duckduckgo.feature.toggles.api.FeatureToggle
52+
import com.duckduckgo.feature.toggles.api.Toggle.State
5053
import com.duckduckgo.httpsupgrade.api.HttpsUpgrader
5154
import com.duckduckgo.privacy.config.api.Gpc
5255
import com.duckduckgo.privacy.config.impl.features.gpc.RealGpc.Companion.GPC_HEADER
@@ -99,7 +102,8 @@ class WebViewRequestInterceptorTest {
99102
fakeToggle,
100103
fakeUserAllowListRepository,
101104
)
102-
private val mockMaliciousSiteBlockerWebViewIntegration: MaliciousSiteBlockerWebViewIntegration = FakeMaliciousSiteBlockerWebViewIntegration()
105+
private var fakeMaliciousSiteBlockerWebViewIntegration: MaliciousSiteBlockerWebViewIntegration = FakeMaliciousSiteBlockerWebViewIntegration(true)
106+
private val fakeAndroidBrowserConfigFeature = FakeFeatureToggleFactory.create(AndroidBrowserConfigFeature::class.java)
103107

104108
private var webView: WebView = mock()
105109

@@ -120,7 +124,11 @@ class WebViewRequestInterceptorTest {
120124
cloakedCnameDetector = mockCloakedCnameDetector,
121125
requestFilterer = mockRequestFilterer,
122126
duckPlayer = mockDuckPlayer,
123-
maliciousSiteBlockerWebViewIntegration = mockMaliciousSiteBlockerWebViewIntegration,
127+
maliciousSiteBlockerWebViewIntegration = fakeMaliciousSiteBlockerWebViewIntegration,
128+
dispatchers = coroutinesTestRule.testDispatcherProvider,
129+
appCoroutineScope = coroutinesTestRule.testScope,
130+
androidBrowserConfigFeature = fakeAndroidBrowserConfigFeature,
131+
isMainProcess = true,
124132
)
125133
}
126134

@@ -151,6 +159,53 @@ class WebViewRequestInterceptorTest {
151159
verify(mockHttpsUpgrader).upgrade(any())
152160
}
153161

162+
@Test
163+
fun whenUrlShouldBeUpgradedSiteIsMaliciousAndUpgradeBeforeMaliciousEnabledThenUpgrade() = runTest {
164+
configureShouldUpgrade()
165+
fakeMaliciousSiteBlockerWebViewIntegration = FakeMaliciousSiteBlockerWebViewIntegration(false)
166+
fakeAndroidBrowserConfigFeature.checkMaliciousAfterHttpsUpgrade().setRawStoredState(State(true))
167+
testee.shouldIntercept(
168+
request = mockRequest,
169+
documentUri = null,
170+
webView = webView,
171+
webViewClientListener = null,
172+
)
173+
174+
verify(mockHttpsUpgrader).upgrade(any())
175+
}
176+
177+
@Test
178+
fun whenUrlShouldBeUpgradedSiteIsMaliciousAndUpgradeBeforeMaliciousDisabledThenDontUpgrade() = runTest {
179+
configureShouldUpgrade()
180+
fakeMaliciousSiteBlockerWebViewIntegration = FakeMaliciousSiteBlockerWebViewIntegration(false)
181+
fakeAndroidBrowserConfigFeature.checkMaliciousAfterHttpsUpgrade().setRawStoredState(State(false))
182+
testee = WebViewRequestInterceptor(
183+
trackerDetector = mockTrackerDetector,
184+
httpsUpgrader = mockHttpsUpgrader,
185+
resourceSurrogates = mockResourceSurrogates,
186+
privacyProtectionCountDao = mockPrivacyProtectionCountDao,
187+
gpc = mockGpc,
188+
userAgentProvider = userAgentProvider,
189+
adClickManager = mockAdClickManager,
190+
cloakedCnameDetector = mockCloakedCnameDetector,
191+
requestFilterer = mockRequestFilterer,
192+
duckPlayer = mockDuckPlayer,
193+
maliciousSiteBlockerWebViewIntegration = fakeMaliciousSiteBlockerWebViewIntegration,
194+
dispatchers = coroutinesTestRule.testDispatcherProvider,
195+
appCoroutineScope = coroutinesTestRule.testScope,
196+
androidBrowserConfigFeature = fakeAndroidBrowserConfigFeature,
197+
isMainProcess = true,
198+
)
199+
testee.shouldIntercept(
200+
request = mockRequest,
201+
documentUri = null,
202+
webView = webView,
203+
webViewClientListener = null,
204+
)
205+
206+
verify(mockHttpsUpgrader, never()).upgrade(any())
207+
}
208+
154209
@Test
155210
fun whenUrlShouldBeUpgradedThenCancelledResponseReturned() = runTest {
156211
configureShouldUpgrade()

app/src/androidTest/java/com/duckduckgo/app/fakes/FakeMaliciousSiteBlockerWebViewIntegration.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,31 @@ package com.duckduckgo.app.fakes
1818

1919
import android.net.Uri
2020
import android.webkit.WebResourceRequest
21+
import androidx.core.net.toUri
2122
import com.duckduckgo.app.browser.webview.MaliciousSiteBlockerWebViewIntegration
2223
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData
24+
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData.MaliciousSite
2325
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData.Safe
2426
import com.duckduckgo.malicioussiteprotection.api.MaliciousSiteProtection.Feed
2527
import com.duckduckgo.malicioussiteprotection.api.MaliciousSiteProtection.MaliciousStatus
2628

27-
class FakeMaliciousSiteBlockerWebViewIntegration : MaliciousSiteBlockerWebViewIntegration {
29+
class FakeMaliciousSiteBlockerWebViewIntegration(
30+
private val isSafe: Boolean = true,
31+
) : MaliciousSiteBlockerWebViewIntegration {
2832
override suspend fun shouldIntercept(
2933
request: WebResourceRequest,
3034
documentUri: Uri?,
3135
confirmationCallback: (maliciousStatus: MaliciousStatus) -> Unit,
3236
): IsMaliciousViewData {
33-
return Safe(request.isForMainFrame)
37+
return if (isSafe) Safe(request.isForMainFrame) else MaliciousSite("foo.com".toUri(), Feed.MALWARE, false, true)
3438
}
3539

3640
override fun shouldOverrideUrlLoading(
3741
url: Uri,
3842
isForMainFrame: Boolean,
3943
confirmationCallback: (maliciousStatus: MaliciousStatus) -> Unit,
4044
): IsMaliciousViewData {
41-
return Safe(isForMainFrame)
45+
return if (isSafe) Safe(isForMainFrame) else MaliciousSite("foo.com".toUri(), Feed.MALWARE, false, true)
4246
}
4347

4448
override fun onPageLoadStarted(url: String) {

app/src/androidTest/java/com/duckduckgo/app/referencetests/DomainsReferenceTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.duckduckgo.app.fakes.FeatureToggleFake
3434
import com.duckduckgo.app.fakes.UserAgentFake
3535
import com.duckduckgo.app.fakes.UserAllowListRepositoryFake
3636
import com.duckduckgo.app.global.db.AppDatabase
37+
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
3738
import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao
3839
import com.duckduckgo.app.privacy.db.UserAllowListDao
3940
import com.duckduckgo.app.privacy.db.UserAllowListRepository
@@ -57,6 +58,7 @@ import com.duckduckgo.app.trackerdetection.db.WebTrackersBlockedDao
5758
import com.duckduckgo.common.test.CoroutineTestRule
5859
import com.duckduckgo.common.test.FileUtilities
5960
import com.duckduckgo.duckplayer.api.DuckPlayer
61+
import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
6062
import com.duckduckgo.feature.toggles.api.FeatureToggle
6163
import com.duckduckgo.httpsupgrade.api.HttpsUpgrader
6264
import com.duckduckgo.privacy.config.api.ContentBlocking
@@ -122,6 +124,7 @@ class DomainsReferenceTest(private val testCase: TestCase) {
122124
private val mockGpc: Gpc = mock()
123125
private val mockAdClickManager: AdClickManager = mock()
124126
private val mockMaliciousSiteProtection: MaliciousSiteBlockerWebViewIntegration = FakeMaliciousSiteBlockerWebViewIntegration()
127+
private val fakeAndroidBrowserConfigFeature = FakeFeatureToggleFactory.create(AndroidBrowserConfigFeature::class.java)
125128

126129
companion object {
127130
private val moshi = Moshi.Builder().add(ActionJsonAdapter()).build()
@@ -179,6 +182,10 @@ class DomainsReferenceTest(private val testCase: TestCase) {
179182
requestFilterer = mockRequestFilterer,
180183
maliciousSiteBlockerWebViewIntegration = mockMaliciousSiteProtection,
181184
duckPlayer = mockDuckPlayer,
185+
dispatchers = coroutinesTestRule.testDispatcherProvider,
186+
appCoroutineScope = coroutinesTestRule.testScope,
187+
androidBrowserConfigFeature = fakeAndroidBrowserConfigFeature,
188+
isMainProcess = true,
182189
)
183190
}
184191

app/src/androidTest/java/com/duckduckgo/app/referencetests/SurrogatesReferenceTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.duckduckgo.app.fakes.FeatureToggleFake
3333
import com.duckduckgo.app.fakes.UserAgentFake
3434
import com.duckduckgo.app.fakes.UserAllowListRepositoryFake
3535
import com.duckduckgo.app.global.db.AppDatabase
36+
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
3637
import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao
3738
import com.duckduckgo.app.privacy.db.UserAllowListDao
3839
import com.duckduckgo.app.surrogates.ResourceSurrogateLoader
@@ -55,6 +56,7 @@ import com.duckduckgo.app.trackerdetection.db.WebTrackersBlockedDao
5556
import com.duckduckgo.common.test.CoroutineTestRule
5657
import com.duckduckgo.common.test.FileUtilities
5758
import com.duckduckgo.duckplayer.api.DuckPlayer
59+
import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
5860
import com.duckduckgo.feature.toggles.api.FeatureToggle
5961
import com.duckduckgo.httpsupgrade.api.HttpsUpgrader
6062
import com.duckduckgo.privacy.config.api.ContentBlocking
@@ -118,6 +120,7 @@ class SurrogatesReferenceTest(private val testCase: TestCase) {
118120
private val mockAdClickManager: AdClickManager = mock()
119121
private val mockCloakedCnameDetector: CloakedCnameDetector = mock()
120122
private val mockMaliciousSiteProtection: MaliciousSiteBlockerWebViewIntegration = FakeMaliciousSiteBlockerWebViewIntegration()
123+
private val fakeAndroidBrowserConfigFeature = FakeFeatureToggleFactory.create(AndroidBrowserConfigFeature::class.java)
121124

122125
companion object {
123126
private val moshi = Moshi.Builder().add(ActionJsonAdapter()).build()
@@ -175,6 +178,10 @@ class SurrogatesReferenceTest(private val testCase: TestCase) {
175178
requestFilterer = mockRequestFilterer,
176179
maliciousSiteBlockerWebViewIntegration = mockMaliciousSiteProtection,
177180
duckPlayer = mockDuckPlayer,
181+
dispatchers = coroutinesTestRule.testDispatcherProvider,
182+
appCoroutineScope = coroutinesTestRule.testScope,
183+
androidBrowserConfigFeature = fakeAndroidBrowserConfigFeature,
184+
isMainProcess = true,
178185
)
179186
}
180187

app/src/main/java/com/duckduckgo/app/browser/WebViewRequestInterceptor.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegra
2828
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData.MaliciousSite
2929
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData.Safe
3030
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData.WaitForConfirmation
31+
import com.duckduckgo.app.di.AppCoroutineScope
32+
import com.duckduckgo.app.di.IsMainProcess
33+
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
3134
import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao
3235
import com.duckduckgo.app.privacy.model.TrustedSites
3336
import com.duckduckgo.app.surrogates.ResourceSurrogates
@@ -47,6 +50,8 @@ import com.duckduckgo.malicioussiteprotection.api.MaliciousSiteProtection.Malici
4750
import com.duckduckgo.privacy.config.api.Gpc
4851
import com.duckduckgo.request.filterer.api.RequestFilterer
4952
import com.duckduckgo.user.agent.api.UserAgentProvider
53+
import kotlinx.coroutines.CoroutineScope
54+
import kotlinx.coroutines.launch
5055
import kotlinx.coroutines.withContext
5156
import timber.log.Timber
5257

@@ -92,8 +97,25 @@ class WebViewRequestInterceptor(
9297
private val duckPlayer: DuckPlayer,
9398
private val maliciousSiteBlockerWebViewIntegration: MaliciousSiteBlockerWebViewIntegration,
9499
private val dispatchers: DispatcherProvider = DefaultDispatcherProvider(),
100+
private val androidBrowserConfigFeature: AndroidBrowserConfigFeature,
101+
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
102+
@IsMainProcess private val isMainProcess: Boolean,
95103
) : RequestInterceptor {
96104

105+
private var checkMaliciousAfterHttpsUpgrade = false
106+
107+
init {
108+
if (isMainProcess) {
109+
loadToMemory()
110+
}
111+
}
112+
113+
private fun loadToMemory() {
114+
appCoroutineScope.launch(dispatchers.io()) {
115+
checkMaliciousAfterHttpsUpgrade = androidBrowserConfigFeature.checkMaliciousAfterHttpsUpgrade().isEnabled()
116+
}
117+
}
118+
97119
override fun onPageStarted(url: String) {
98120
requestFilterer.registerOnPageCreated(url)
99121
maliciousSiteBlockerWebViewIntegration.onPageLoadStarted(url)
@@ -117,10 +139,12 @@ class WebViewRequestInterceptor(
117139
): WebResourceResponse? {
118140
val url: Uri = request.url
119141

120-
maliciousSiteBlockerWebViewIntegration.shouldIntercept(request, documentUri) { isMalicious ->
121-
handleConfirmationCallback(isMalicious, webViewClientListener, url, documentUri, request.isForMainFrame)
122-
}.let {
123-
if (shouldBlock(it, webViewClientListener, url, documentUri, request.isForMainFrame)) return WebResourceResponse(null, null, null)
142+
if (!checkMaliciousAfterHttpsUpgrade) {
143+
maliciousSiteBlockerWebViewIntegration.shouldIntercept(request, documentUri) { isMalicious ->
144+
handleConfirmationCallback(isMalicious, webViewClientListener, url, documentUri, request.isForMainFrame)
145+
}.let {
146+
if (shouldBlock(it, webViewClientListener, url, documentUri, request.isForMainFrame)) return WebResourceResponse(null, null, null)
147+
}
124148
}
125149

126150
if (requestFilterer.shouldFilterOutRequest(request, documentUri.toString())) return WebResourceResponse(null, null, null)
@@ -149,6 +173,14 @@ class WebViewRequestInterceptor(
149173
return WebResourceResponse(null, null, null)
150174
}
151175

176+
if (checkMaliciousAfterHttpsUpgrade) {
177+
maliciousSiteBlockerWebViewIntegration.shouldIntercept(request, documentUri) { isMalicious ->
178+
handleConfirmationCallback(isMalicious, webViewClientListener, url, documentUri, request.isForMainFrame)
179+
}.let {
180+
if (shouldBlock(it, webViewClientListener, url, documentUri, request.isForMainFrame)) return WebResourceResponse(null, null, null)
181+
}
182+
}
183+
152184
if (url != null) {
153185
duckPlayer.intercept(request, url, webView)?.let { return it }
154186
}

app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import com.duckduckgo.app.browser.urlextraction.JsUrlExtractor
5757
import com.duckduckgo.app.browser.urlextraction.UrlExtractingWebViewClient
5858
import com.duckduckgo.app.browser.webview.MaliciousSiteBlockerWebViewIntegration
5959
import com.duckduckgo.app.di.AppCoroutineScope
60+
import com.duckduckgo.app.di.IsMainProcess
6061
import com.duckduckgo.app.fire.*
6162
import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteRepository
6263
import com.duckduckgo.app.global.db.AppDatabase
@@ -205,6 +206,10 @@ class BrowserModule {
205206
requestFilterer: RequestFilterer,
206207
duckPlayer: DuckPlayer,
207208
maliciousSiteBlockerWebViewIntegration: MaliciousSiteBlockerWebViewIntegration,
209+
androidBrowserConfigFeature: AndroidBrowserConfigFeature,
210+
dispatchers: DispatcherProvider,
211+
@AppCoroutineScope appCoroutineScope: CoroutineScope,
212+
@IsMainProcess isMainProcess: Boolean,
208213
): RequestInterceptor =
209214
WebViewRequestInterceptor(
210215
resourceSurrogates,
@@ -218,6 +223,10 @@ class BrowserModule {
218223
requestFilterer,
219224
duckPlayer,
220225
maliciousSiteBlockerWebViewIntegration,
226+
dispatchers,
227+
androidBrowserConfigFeature,
228+
appCoroutineScope,
229+
isMainProcess,
221230
)
222231

223232
@Provides

app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,12 @@ interface AndroidBrowserConfigFeature {
138138

139139
@Toggle.DefaultValue(DefaultFeatureValue.TRUE)
140140
fun storeFaviconSuspend(): Toggle
141+
142+
/**
143+
* @return `true` when the remote config has the global "checkMaliciousAfterHttpsUpgrade" androidBrowserConfig
144+
* sub-feature flag enabled
145+
* If the remote feature is not present defaults to `true`
146+
*/
147+
@Toggle.DefaultValue(DefaultFeatureValue.TRUE)
148+
fun checkMaliciousAfterHttpsUpgrade(): Toggle
141149
}

malicious-site-protection/malicious-site-protection-impl/src/main/kotlin/com/duckduckgo/malicioussiteprotection/impl/MaliciousSiteProtectionFeature.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,11 @@ interface MaliciousSiteProtectionFeature {
4747
@Toggle.InternalAlwaysEnabled
4848
@Toggle.DefaultValue(DefaultFeatureValue.FALSE)
4949
fun scamProtection(): Toggle
50+
51+
@Toggle.DefaultValue(DefaultFeatureValue.TRUE)
52+
fun stripWWWPrefix(): Toggle
53+
54+
@Toggle.InternalAlwaysEnabled
55+
@Toggle.DefaultValue(DefaultFeatureValue.TRUE)
56+
fun enableCaching(): Toggle
5057
}

malicious-site-protection/malicious-site-protection-impl/src/main/kotlin/com/duckduckgo/malicioussiteprotection/impl/MaliciousSiteProtectionRCFeature.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ interface MaliciousSiteProtectionRCFeature {
3737
fun scamProtectionEnabled(): Boolean
3838
fun getHashPrefixUpdateFrequency(): Long
3939
fun getFilterSetUpdateFrequency(): Long
40+
fun stripWWWPrefix(): Boolean
41+
fun isCachingEnabled(): Boolean
4042
}
4143

4244
@SingleInstanceIn(AppScope::class)
@@ -52,6 +54,8 @@ class RealMaliciousSiteProtectionRCFeature @Inject constructor(
5254
private var isFeatureEnabled = false
5355
private var canUpdateDatasets = false
5456
private var scamProtection = false
57+
private var shouldStripWWWPrefix = false
58+
private var enableCaching = false
5559

5660
private var hashPrefixUpdateFrequency = 20L
5761
private var filterSetUpdateFrequency = 720L
@@ -86,13 +90,23 @@ class RealMaliciousSiteProtectionRCFeature @Inject constructor(
8690
return scamProtection
8791
}
8892

93+
override fun stripWWWPrefix(): Boolean {
94+
return shouldStripWWWPrefix
95+
}
96+
97+
override fun isCachingEnabled(): Boolean {
98+
return enableCaching
99+
}
100+
89101
private fun loadToMemory() {
90102
appCoroutineScope.launch(dispatchers.io()) {
91103
// MSP is disabled in F-Droid builds, as we can't download datasets
92104
isFeatureEnabled = maliciousSiteProtectionFeature.self().isEnabled() &&
93105
maliciousSiteProtectionFeature.visibleAndOnByDefault().isEnabled() && appBuildConfig.flavor != FDROID
94106
scamProtection = isFeatureEnabled && maliciousSiteProtectionFeature.scamProtection().isEnabled()
95107
canUpdateDatasets = maliciousSiteProtectionFeature.canUpdateDatasets().isEnabled()
108+
shouldStripWWWPrefix = maliciousSiteProtectionFeature.stripWWWPrefix().isEnabled()
109+
enableCaching = maliciousSiteProtectionFeature.enableCaching().isEnabled()
96110
maliciousSiteProtectionFeature.self().getSettings()?.let {
97111
JSONObject(it).let { settings ->
98112
hashPrefixUpdateFrequency = settings.getLong("hashPrefixUpdateFrequency")

0 commit comments

Comments
 (0)