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

Unverified Commit ada21aeb authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Add AuthorizationRepository

parent b0cf2e5f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.viewModelScope
import app.k9mail.feature.account.oauth.domain.DomainContract.UseCase.GetOAuthRequestIntent
import app.k9mail.feature.account.oauth.domain.DomainContract.UseCase.GetOAuthRequestIntent.GetOAuthRequestIntentResult
import app.k9mail.feature.account.oauth.domain.entity.AuthorizationIntentResult
import com.fsck.k9.Account
import com.fsck.k9.preferences.AccountManager
import kotlinx.coroutines.Dispatchers
@@ -98,11 +98,11 @@ class AuthViewModel(
        }

        when (authRequestIntentResult) {
            GetOAuthRequestIntentResult.NotSupported -> {
            AuthorizationIntentResult.NotSupported -> {
                _uiState.update { AuthFlowState.NotSupported }
            }

            is GetOAuthRequestIntentResult.Success -> resultObserver.login(authRequestIntentResult.intent)
            is AuthorizationIntentResult.Success -> resultObserver.login(authRequestIntentResult.intent)
        }
    }

+9 −1
Original line number Diff line number Diff line
package app.k9mail.feature.account.oauth

import app.k9mail.core.common.coreCommonModule
import app.k9mail.feature.account.oauth.data.AuthorizationRepository
import app.k9mail.feature.account.oauth.domain.DomainContract
import app.k9mail.feature.account.oauth.domain.DomainContract.UseCase
import app.k9mail.feature.account.oauth.domain.usecase.GetOAuthRequestIntent
import app.k9mail.feature.account.oauth.domain.usecase.SuggestServerName
@@ -18,11 +20,17 @@ val featureAccountOAuthModule: Module = module {
        )
    }

    factory<DomainContract.AuthorizationRepository> {
        AuthorizationRepository(
            service = get(),
        )
    }

    factory<UseCase.SuggestServerName> { SuggestServerName() }

    factory<UseCase.GetOAuthRequestIntent> {
        GetOAuthRequestIntent(
            service = get(),
            repository = get(),
            configurationProvider = get(),
        )
    }
+47 −0
Original line number Diff line number Diff line
package app.k9mail.feature.account.oauth.data

import android.content.Intent
import androidx.core.net.toUri
import app.k9mail.core.common.oauth.OAuthConfiguration
import app.k9mail.feature.account.oauth.domain.DomainContract
import app.k9mail.feature.account.oauth.domain.entity.AuthorizationIntentResult
import net.openid.appauth.AuthorizationRequest
import net.openid.appauth.AuthorizationService
import net.openid.appauth.AuthorizationServiceConfiguration
import net.openid.appauth.ResponseTypeValues

class AuthorizationRepository(
    private val service: AuthorizationService,
) : DomainContract.AuthorizationRepository {

    override fun getAuthorizationRequestIntent(
        configuration: OAuthConfiguration,
        emailAddress: String,
    ): AuthorizationIntentResult {
        return AuthorizationIntentResult.Success(
            createAuthorizationRequestIntent(configuration, emailAddress),
        )
    }

    private fun createAuthorizationRequestIntent(configuration: OAuthConfiguration, emailAddress: String): Intent {
        val serviceConfig = AuthorizationServiceConfiguration(
            configuration.authorizationEndpoint.toUri(),
            configuration.tokenEndpoint.toUri(),
        )

        val authRequestBuilder = AuthorizationRequest.Builder(
            serviceConfig,
            configuration.clientId,
            ResponseTypeValues.CODE,
            configuration.redirectUri.toUri(),
        )

        val authRequest = authRequestBuilder
            .setScope(configuration.scopes.joinToString(" "))
            .setCodeVerifier(null)
            .setLoginHint(emailAddress)
            .build()

        return service.getAuthorizationRequestIntent(authRequest)
    }
}
+10 −10
Original line number Diff line number Diff line
package app.k9mail.feature.account.oauth.domain

import android.content.Intent
import app.k9mail.core.common.oauth.OAuthConfiguration
import app.k9mail.feature.account.oauth.domain.entity.AuthorizationIntentResult

interface DomainContract {

@@ -10,15 +11,14 @@ interface DomainContract {
        }

        fun interface GetOAuthRequestIntent {
            suspend fun execute(hostname: String, emailAddress: String): GetOAuthRequestIntentResult

            sealed interface GetOAuthRequestIntentResult {
                object NotSupported : GetOAuthRequestIntentResult

                data class Success(
                    val intent: Intent,
                ) : GetOAuthRequestIntentResult
            fun execute(hostname: String, emailAddress: String): AuthorizationIntentResult
        }
    }

    interface AuthorizationRepository {
        fun getAuthorizationRequestIntent(
            configuration: OAuthConfiguration,
            emailAddress: String,
        ): AuthorizationIntentResult
    }
}
+11 −0
Original line number Diff line number Diff line
package app.k9mail.feature.account.oauth.domain.entity

import android.content.Intent

sealed interface AuthorizationIntentResult {
    object NotSupported : AuthorizationIntentResult

    data class Success(
        val intent: Intent,
    ) : AuthorizationIntentResult
}
Loading