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

Commit b712f04d authored by cketti's avatar cketti
Browse files

Add placeholder certificate error screen

parent fe80fa91
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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(),
@@ -76,6 +81,12 @@ val featureAccountSetupModule: Module = module {
        )
    }

    factory<DomainContract.UseCase.AddServerCertificateException> {
        AddServerCertificateException(
            localKeyStore = get(),
        )
    }

    factory<DomainContract.UseCase.CreateAccount> {
        CreateAccount(
            accountCreator = get(),
@@ -112,6 +123,7 @@ val featureAccountSetupModule: Module = module {
            validateServerSettings = get(),
            accountSetupStateRepository = get(),
            authorizationStateRepository = get(),
            certificateErrorRepository = get(),
            oAuthViewModel = get(),
            isIncomingValidation = true,
        )
@@ -127,6 +139,7 @@ val featureAccountSetupModule: Module = module {
            validateServerSettings = get(),
            accountSetupStateRepository = get(),
            authorizationStateRepository = get(),
            certificateErrorRepository = get(),
            oAuthViewModel = get(),
            isIncomingValidation = false,
        )
@@ -137,6 +150,12 @@ val featureAccountSetupModule: Module = module {
            accountSetupStateRepository = get(),
        )
    }
    viewModel {
        CertificateErrorViewModel(
            certificateErrorRepository = get(),
            addServerCertificateException = get(),
        )
    }
}

internal const val NAME_INCOMING_VALIDATION = "incoming_validation"
+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
    }
}
+14 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -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
@@ -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,
+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>,
)
+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