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

Unverified Commit 402259a8 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #6097 from k9mail/oauth_config_provider

Add proper way to retrieve OAuth credentials
parents 3581a023 d08aa558
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4,5 +4,5 @@ import org.koin.dsl.module

val autodiscoveryProvidersXmlModule = module {
    factory { ProvidersXmlProvider(context = get()) }
    factory { ProvidersXmlDiscovery(xmlProvider = get()) }
    factory { ProvidersXmlDiscovery(xmlProvider = get(), oAuthConfigurationProvider = get()) }
}
+5 −5
Original line number Diff line number Diff line
@@ -9,12 +9,14 @@ import com.fsck.k9.autodiscovery.api.DiscoveryTarget
import com.fsck.k9.helper.EmailHelper
import com.fsck.k9.mail.AuthType
import com.fsck.k9.mail.ConnectionSecurity
import com.fsck.k9.oauth.OAuthConfigurationProvider
import com.fsck.k9.preferences.Protocols
import org.xmlpull.v1.XmlPullParser
import timber.log.Timber

class ProvidersXmlDiscovery(
    private val xmlProvider: ProvidersXmlProvider
    private val xmlProvider: ProvidersXmlProvider,
    private val oAuthConfigurationProvider: OAuthConfigurationProvider
) : ConnectionSettingsDiscovery {

    override fun discover(email: String, target: DiscoveryTarget): DiscoveryResults? {
@@ -104,8 +106,7 @@ class ProvidersXmlDiscovery(
            uri.port
        }

        // TODO: Remove this hack
        val authType = if (host == "imap.gmail.com" || host == "imap.googlemail.com") {
        val authType = if (oAuthConfigurationProvider.getConfiguration(host) != null) {
            AuthType.XOAUTH2
        } else {
            AuthType.PLAIN
@@ -134,8 +135,7 @@ class ProvidersXmlDiscovery(
            uri.port
        }

        // TODO: Remove this hack
        val authType = if (host == "smtp.gmail.com" || host == "smtp.googlemail.com") {
        val authType = if (oAuthConfigurationProvider.getConfiguration(host) != null) {
            AuthType.XOAUTH2
        } else {
            AuthType.PLAIN
+20 −1
Original line number Diff line number Diff line
@@ -5,12 +5,15 @@ import com.fsck.k9.RobolectricTest
import com.fsck.k9.autodiscovery.api.DiscoveryTarget
import com.fsck.k9.mail.AuthType
import com.fsck.k9.mail.ConnectionSecurity
import com.fsck.k9.oauth.OAuthConfiguration
import com.fsck.k9.oauth.OAuthConfigurationProvider
import com.google.common.truth.Truth.assertThat
import org.junit.Test

class ProvidersXmlDiscoveryTest : RobolectricTest() {
    private val xmlProvider = ProvidersXmlProvider(ApplicationProvider.getApplicationContext())
    private val providersXmlDiscovery = ProvidersXmlDiscovery(xmlProvider)
    private val oAuthConfigurationProvider = createOAuthConfigurationProvider()
    private val providersXmlDiscovery = ProvidersXmlDiscovery(xmlProvider, oAuthConfigurationProvider)

    @Test
    fun discover_withGmailDomain_shouldReturnCorrectSettings() {
@@ -39,4 +42,20 @@ class ProvidersXmlDiscoveryTest : RobolectricTest() {

        assertThat(connectionSettings).isNull()
    }

    private fun createOAuthConfigurationProvider(): OAuthConfigurationProvider {
        val googleConfig = OAuthConfiguration(
            clientId = "irrelevant",
            scopes = listOf("irrelevant"),
            authorizationEndpoint = "irrelevant",
            tokenEndpoint = "irrelevant"
        )

        return OAuthConfigurationProvider(
            configurations = mapOf(
                listOf("imap.gmail.com", "smtp.gmail.com") to googleConfig,
            ),
            googleConfiguration = googleConfig
        )
    }
}
+1 −1
Original line number Diff line number Diff line
package com.fsck.k9.activity.setup
package com.fsck.k9.oauth

data class OAuthConfiguration(
    val clientId: String,
+22 −0
Original line number Diff line number Diff line
package com.fsck.k9.oauth

class OAuthConfigurationProvider(
    private val configurations: Map<List<String>, OAuthConfiguration>,
    private val googleConfiguration: OAuthConfiguration
) {
    private val hostnameMapping: Map<String, OAuthConfiguration> = buildMap {
        for ((hostnames, configuration) in configurations) {
            for (hostname in hostnames) {
                put(hostname.lowercase(), configuration)
            }
        }
    }

    fun getConfiguration(hostname: String): OAuthConfiguration? {
        return hostnameMapping[hostname.lowercase()]
    }

    fun isGoogle(hostname: String): Boolean {
        return getConfiguration(hostname) == googleConfiguration
    }
}
Loading