Loading feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/AccountSetupModule.kt +19 −0 Original line number Diff line number Diff line Loading @@ -5,7 +5,9 @@ import app.k9mail.autodiscovery.service.RealAutoDiscoveryService import app.k9mail.core.common.coreCommonModule import app.k9mail.feature.account.oauth.featureAccountOAuthModule import app.k9mail.feature.account.setup.data.InMemoryAccountSetupStateRepository import app.k9mail.feature.account.setup.data.InMemoryCertificateErrorRepository import app.k9mail.feature.account.setup.domain.DomainContract import app.k9mail.feature.account.setup.domain.usecase.AddServerCertificateException import app.k9mail.feature.account.setup.domain.usecase.CreateAccount import app.k9mail.feature.account.setup.domain.usecase.GetAutoDiscovery import app.k9mail.feature.account.setup.domain.usecase.ValidateServerSettings Loading @@ -22,6 +24,7 @@ import app.k9mail.feature.account.setup.ui.options.AccountOptionsViewModel import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigContract import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigValidator import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigViewModel import app.k9mail.feature.account.setup.ui.servercertificate.CertificateErrorViewModel import app.k9mail.feature.account.setup.ui.validation.AccountValidationViewModel import com.fsck.k9.mail.oauth.AuthStateStorage import com.fsck.k9.mail.store.imap.ImapServerSettingsValidator Loading Loading @@ -58,6 +61,8 @@ val featureAccountSetupModule: Module = module { InMemoryAccountSetupStateRepository() }.binds(arrayOf(DomainContract.AccountSetupStateRepository::class, AuthStateStorage::class)) single<DomainContract.CertificateErrorRepository> { InMemoryCertificateErrorRepository() } factory<DomainContract.UseCase.ValidateServerSettings> { ValidateServerSettings( authStateStorage = get(), Loading @@ -76,6 +81,12 @@ val featureAccountSetupModule: Module = module { ) } factory<DomainContract.UseCase.AddServerCertificateException> { AddServerCertificateException( localKeyStore = get(), ) } factory<DomainContract.UseCase.CreateAccount> { CreateAccount( accountCreator = get(), Loading Loading @@ -112,6 +123,7 @@ val featureAccountSetupModule: Module = module { validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), certificateErrorRepository = get(), oAuthViewModel = get(), isIncomingValidation = true, ) Loading @@ -127,6 +139,7 @@ val featureAccountSetupModule: Module = module { validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), certificateErrorRepository = get(), oAuthViewModel = get(), isIncomingValidation = false, ) Loading @@ -137,6 +150,12 @@ val featureAccountSetupModule: Module = module { accountSetupStateRepository = get(), ) } viewModel { CertificateErrorViewModel( certificateErrorRepository = get(), addServerCertificateException = get(), ) } } internal const val NAME_INCOMING_VALIDATION = "incoming_validation" Loading feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/data/InMemoryCertificateErrorRepository.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package app.k9mail.feature.account.setup.data import app.k9mail.feature.account.setup.domain.DomainContract import app.k9mail.feature.account.setup.domain.entity.CertificateError class InMemoryCertificateErrorRepository( private var certificateError: CertificateError? = null, ) : DomainContract.CertificateErrorRepository { override fun getCertificateError(): CertificateError? { return certificateError } override fun setCertificateError(certificateError: CertificateError) { this.certificateError = certificateError } override fun clearCertificateError() { certificateError = null } } feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/domain/DomainContract.kt +14 −0 Original line number Diff line number Diff line Loading @@ -5,8 +5,10 @@ import app.k9mail.core.common.domain.usecase.validation.ValidationResult import app.k9mail.feature.account.oauth.domain.entity.AuthorizationState import app.k9mail.feature.account.setup.domain.entity.AccountOptions import app.k9mail.feature.account.setup.domain.entity.AccountSetupState import app.k9mail.feature.account.setup.domain.entity.CertificateError import com.fsck.k9.mail.ServerSettings import com.fsck.k9.mail.server.ServerSettingsValidationResult import java.security.cert.X509Certificate interface DomainContract { Loading @@ -28,6 +30,14 @@ interface DomainContract { fun clear() } interface CertificateErrorRepository { fun getCertificateError(): CertificateError? fun setCertificateError(certificateError: CertificateError) fun clearCertificateError() } interface UseCase { fun interface GetAutoDiscovery { suspend fun execute(emailAddress: String): AutoDiscoveryResult Loading @@ -37,6 +47,10 @@ interface DomainContract { suspend fun execute(settings: ServerSettings): ServerSettingsValidationResult } fun interface AddServerCertificateException { suspend fun addCertificate(hostname: String, port: Int, certificate: X509Certificate?) } fun interface CreateAccount { suspend fun execute( emailAddress: String, Loading feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/domain/entity/CertificateError.kt 0 → 100644 +9 −0 Original line number Diff line number Diff line package app.k9mail.feature.account.setup.domain.entity import java.security.cert.X509Certificate data class CertificateError( val hostname: String, val port: Int, val certificateChain: List<X509Certificate>, ) feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/domain/usecase/AddServerCertificateException.kt 0 → 100644 +19 −0 Original line number Diff line number Diff line package app.k9mail.feature.account.setup.domain.usecase import app.k9mail.feature.account.setup.domain.DomainContract import com.fsck.k9.mail.ssl.LocalKeyStore import java.security.cert.X509Certificate import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext internal class AddServerCertificateException( private val localKeyStore: LocalKeyStore, private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, ) : DomainContract.UseCase.AddServerCertificateException { override suspend fun addCertificate(hostname: String, port: Int, certificate: X509Certificate?) { withContext(coroutineDispatcher) { localKeyStore.addCertificate(hostname, port, certificate) } } } Loading
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/AccountSetupModule.kt +19 −0 Original line number Diff line number Diff line Loading @@ -5,7 +5,9 @@ import app.k9mail.autodiscovery.service.RealAutoDiscoveryService import app.k9mail.core.common.coreCommonModule import app.k9mail.feature.account.oauth.featureAccountOAuthModule import app.k9mail.feature.account.setup.data.InMemoryAccountSetupStateRepository import app.k9mail.feature.account.setup.data.InMemoryCertificateErrorRepository import app.k9mail.feature.account.setup.domain.DomainContract import app.k9mail.feature.account.setup.domain.usecase.AddServerCertificateException import app.k9mail.feature.account.setup.domain.usecase.CreateAccount import app.k9mail.feature.account.setup.domain.usecase.GetAutoDiscovery import app.k9mail.feature.account.setup.domain.usecase.ValidateServerSettings Loading @@ -22,6 +24,7 @@ import app.k9mail.feature.account.setup.ui.options.AccountOptionsViewModel import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigContract import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigValidator import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigViewModel import app.k9mail.feature.account.setup.ui.servercertificate.CertificateErrorViewModel import app.k9mail.feature.account.setup.ui.validation.AccountValidationViewModel import com.fsck.k9.mail.oauth.AuthStateStorage import com.fsck.k9.mail.store.imap.ImapServerSettingsValidator Loading Loading @@ -58,6 +61,8 @@ val featureAccountSetupModule: Module = module { InMemoryAccountSetupStateRepository() }.binds(arrayOf(DomainContract.AccountSetupStateRepository::class, AuthStateStorage::class)) single<DomainContract.CertificateErrorRepository> { InMemoryCertificateErrorRepository() } factory<DomainContract.UseCase.ValidateServerSettings> { ValidateServerSettings( authStateStorage = get(), Loading @@ -76,6 +81,12 @@ val featureAccountSetupModule: Module = module { ) } factory<DomainContract.UseCase.AddServerCertificateException> { AddServerCertificateException( localKeyStore = get(), ) } factory<DomainContract.UseCase.CreateAccount> { CreateAccount( accountCreator = get(), Loading Loading @@ -112,6 +123,7 @@ val featureAccountSetupModule: Module = module { validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), certificateErrorRepository = get(), oAuthViewModel = get(), isIncomingValidation = true, ) Loading @@ -127,6 +139,7 @@ val featureAccountSetupModule: Module = module { validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), certificateErrorRepository = get(), oAuthViewModel = get(), isIncomingValidation = false, ) Loading @@ -137,6 +150,12 @@ val featureAccountSetupModule: Module = module { accountSetupStateRepository = get(), ) } viewModel { CertificateErrorViewModel( certificateErrorRepository = get(), addServerCertificateException = get(), ) } } internal const val NAME_INCOMING_VALIDATION = "incoming_validation" Loading
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/data/InMemoryCertificateErrorRepository.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package app.k9mail.feature.account.setup.data import app.k9mail.feature.account.setup.domain.DomainContract import app.k9mail.feature.account.setup.domain.entity.CertificateError class InMemoryCertificateErrorRepository( private var certificateError: CertificateError? = null, ) : DomainContract.CertificateErrorRepository { override fun getCertificateError(): CertificateError? { return certificateError } override fun setCertificateError(certificateError: CertificateError) { this.certificateError = certificateError } override fun clearCertificateError() { certificateError = null } }
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/domain/DomainContract.kt +14 −0 Original line number Diff line number Diff line Loading @@ -5,8 +5,10 @@ import app.k9mail.core.common.domain.usecase.validation.ValidationResult import app.k9mail.feature.account.oauth.domain.entity.AuthorizationState import app.k9mail.feature.account.setup.domain.entity.AccountOptions import app.k9mail.feature.account.setup.domain.entity.AccountSetupState import app.k9mail.feature.account.setup.domain.entity.CertificateError import com.fsck.k9.mail.ServerSettings import com.fsck.k9.mail.server.ServerSettingsValidationResult import java.security.cert.X509Certificate interface DomainContract { Loading @@ -28,6 +30,14 @@ interface DomainContract { fun clear() } interface CertificateErrorRepository { fun getCertificateError(): CertificateError? fun setCertificateError(certificateError: CertificateError) fun clearCertificateError() } interface UseCase { fun interface GetAutoDiscovery { suspend fun execute(emailAddress: String): AutoDiscoveryResult Loading @@ -37,6 +47,10 @@ interface DomainContract { suspend fun execute(settings: ServerSettings): ServerSettingsValidationResult } fun interface AddServerCertificateException { suspend fun addCertificate(hostname: String, port: Int, certificate: X509Certificate?) } fun interface CreateAccount { suspend fun execute( emailAddress: String, Loading
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/domain/entity/CertificateError.kt 0 → 100644 +9 −0 Original line number Diff line number Diff line package app.k9mail.feature.account.setup.domain.entity import java.security.cert.X509Certificate data class CertificateError( val hostname: String, val port: Int, val certificateChain: List<X509Certificate>, )
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/domain/usecase/AddServerCertificateException.kt 0 → 100644 +19 −0 Original line number Diff line number Diff line package app.k9mail.feature.account.setup.domain.usecase import app.k9mail.feature.account.setup.domain.DomainContract import com.fsck.k9.mail.ssl.LocalKeyStore import java.security.cert.X509Certificate import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext internal class AddServerCertificateException( private val localKeyStore: LocalKeyStore, private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, ) : DomainContract.UseCase.AddServerCertificateException { override suspend fun addCertificate(hostname: String, port: Int, certificate: X509Certificate?) { withContext(coroutineDispatcher) { localKeyStore.addCertificate(hostname, port, certificate) } } }