0
0
mirror of https://github.com/thunderbird/thunderbird-android.git synced 2024-09-19 19:52:14 +02:00

Add AutoDiscoveryRegistry to easily change the available discovery mechanisms

This commit is contained in:
Wolf-Martell Montwé 2024-02-09 12:57:42 +01:00
parent 3a121f335b
commit e19dae0021
No known key found for this signature in database
GPG Key ID: 6D45B21512ACBF72
5 changed files with 89 additions and 24 deletions

View File

@ -1,6 +1,8 @@
package app.k9mail.feature.account.setup
import app.k9mail.autodiscovery.api.AutoDiscoveryRegistry
import app.k9mail.autodiscovery.api.AutoDiscoveryService
import app.k9mail.autodiscovery.service.RealAutoDiscoveryRegistry
import app.k9mail.autodiscovery.service.RealAutoDiscoveryService
import app.k9mail.feature.account.common.featureAccountCommonModule
import app.k9mail.feature.account.oauth.featureAccountOAuthModule
@ -42,9 +44,15 @@ val featureAccountSetupModule: Module = module {
OkHttpClient()
}
single<AutoDiscoveryRegistry> {
RealAutoDiscoveryRegistry.createDefault(
okHttpClient = get(),
)
}
single<AutoDiscoveryService> {
RealAutoDiscoveryService(
okHttpClient = get(),
autoDiscoveryRegistry = get(),
)
}

View File

@ -0,0 +1,5 @@
package app.k9mail.autodiscovery.api
interface AutoDiscoveryRegistry {
fun getAutoDiscoveries(): List<AutoDiscovery>
}

View File

@ -0,0 +1,41 @@
package app.k9mail.autodiscovery.service
import app.k9mail.autodiscovery.api.AutoDiscovery
import app.k9mail.autodiscovery.api.AutoDiscoveryRegistry
import app.k9mail.autodiscovery.autoconfig.AutoconfigUrlConfig
import app.k9mail.autodiscovery.autoconfig.createIspDbAutoconfigDiscovery
import app.k9mail.autodiscovery.autoconfig.createMxLookupAutoconfigDiscovery
import app.k9mail.autodiscovery.autoconfig.createProviderAutoconfigDiscovery
import okhttp3.OkHttpClient
class RealAutoDiscoveryRegistry(
private val autoDiscoveries: List<AutoDiscovery> = emptyList(),
) : AutoDiscoveryRegistry {
override fun getAutoDiscoveries(): List<AutoDiscovery> = autoDiscoveries
companion object {
val defaultAutoconfigUrlConfig = AutoconfigUrlConfig(
httpsOnly = false,
includeEmailAddress = false,
)
fun createDefault(
okHttpClient: OkHttpClient,
autoconfigUrlConfig: AutoconfigUrlConfig = defaultAutoconfigUrlConfig,
): RealAutoDiscoveryRegistry = RealAutoDiscoveryRegistry(
autoDiscoveries = listOf(
createProviderAutoconfigDiscovery(
okHttpClient = okHttpClient,
config = autoconfigUrlConfig,
),
createMxLookupAutoconfigDiscovery(
okHttpClient = okHttpClient,
),
createIspDbAutoconfigDiscovery(
okHttpClient = okHttpClient,
),
),
)
}
}

View File

@ -1,40 +1,21 @@
package app.k9mail.autodiscovery.service
import app.k9mail.autodiscovery.api.AutoDiscoveryRegistry
import app.k9mail.autodiscovery.api.AutoDiscoveryResult
import app.k9mail.autodiscovery.api.AutoDiscoveryService
import app.k9mail.autodiscovery.autoconfig.AutoconfigUrlConfig
import app.k9mail.autodiscovery.autoconfig.createIspDbAutoconfigDiscovery
import app.k9mail.autodiscovery.autoconfig.createMxLookupAutoconfigDiscovery
import app.k9mail.autodiscovery.autoconfig.createProviderAutoconfigDiscovery
import app.k9mail.core.common.mail.EmailAddress
import okhttp3.OkHttpClient
/**
* Uses Thunderbird's Autoconfig mechanism to find mail server settings for a given email address.
*/
class RealAutoDiscoveryService(
private val okHttpClient: OkHttpClient,
private val autoDiscoveryRegistry: AutoDiscoveryRegistry,
) : AutoDiscoveryService {
override suspend fun discover(email: EmailAddress): AutoDiscoveryResult {
val config = AutoconfigUrlConfig(
httpsOnly = false,
includeEmailAddress = false,
val runner = PriorityParallelRunner(
runnables = autoDiscoveryRegistry.getAutoDiscoveries().flatMap { it.initDiscovery(email) },
)
val providerDiscovery = createProviderAutoconfigDiscovery(okHttpClient, config)
val ispDbDiscovery = createIspDbAutoconfigDiscovery(okHttpClient)
val mxDiscovery = createMxLookupAutoconfigDiscovery(okHttpClient)
val runnables = listOf(
providerDiscovery,
ispDbDiscovery,
mxDiscovery,
).flatMap { discovery ->
discovery.initDiscovery(email)
}
val runner = PriorityParallelRunner(runnables)
return runner.run()
}
}

View File

@ -0,0 +1,30 @@
package app.k9mail.autodiscovery.service
import app.k9mail.autodiscovery.api.AutoDiscovery
import app.k9mail.autodiscovery.api.AutoDiscoveryRunnable
import app.k9mail.core.common.mail.EmailAddress
import assertk.assertThat
import assertk.assertions.isEqualTo
import kotlin.test.Test
class RealAutoDiscoveryRegistryTest {
@Test
fun `getAutoDiscoveries should return given discoveries`() {
val autoDiscoveries = listOf(
TestAutoDiscovery(),
TestAutoDiscovery(),
)
val testSubject = RealAutoDiscoveryRegistry(autoDiscoveries)
val result = testSubject.getAutoDiscoveries()
assertThat(result).isEqualTo(autoDiscoveries)
}
private class TestAutoDiscovery : AutoDiscovery {
override fun initDiscovery(email: EmailAddress): List<AutoDiscoveryRunnable> {
return emptyList()
}
}
}