Loading app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AuthViewModel.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } Loading feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/AccountOAuthModule.kt +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 Loading @@ -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(), ) } Loading feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/data/AuthorizationRepository.kt 0 → 100644 +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) } } feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/domain/DomainContract.kt +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 { Loading @@ -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 } } feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/domain/entity/AuthorizationIntentResult.kt 0 → 100644 +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
app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AuthViewModel.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } Loading
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/AccountOAuthModule.kt +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 Loading @@ -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(), ) } Loading
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/data/AuthorizationRepository.kt 0 → 100644 +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) } }
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/domain/DomainContract.kt +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 { Loading @@ -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 } }
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/domain/entity/AuthorizationIntentResult.kt 0 → 100644 +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 }