Repo created

This commit is contained in:
Fr4nz D13trich 2025-11-22 13:56:56 +01:00
parent 75dc487a7a
commit 39c29d175b
6317 changed files with 388324 additions and 2 deletions

View file

@ -0,0 +1,24 @@
plugins {
id(ThunderbirdPlugins.Library.androidCompose)
}
android {
namespace = "app.k9mail.feature.account.server.validation"
resourcePrefix = "account_server_validation_"
}
dependencies {
implementation(projects.core.ui.compose.designsystem)
implementation(projects.core.common)
implementation(projects.mail.common)
implementation(projects.mail.protocols.imap)
implementation(projects.mail.protocols.pop3)
implementation(projects.mail.protocols.smtp)
implementation(projects.feature.account.common)
implementation(projects.feature.account.oauth)
implementation(projects.feature.account.server.certificate)
testImplementation(projects.core.ui.compose.testing)
}

View file

@ -0,0 +1,35 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
@Composable
@Preview(showBackground = true)
internal fun IncomingServerValidationContentPreview() {
PreviewWithTheme {
ServerValidationContent(
onEvent = { },
state = ServerValidationContract.State(),
isIncomingValidation = true,
oAuthViewModel = FakeAccountOAuthViewModel(),
contentPadding = PaddingValues(),
)
}
}
@Composable
@Preview(showBackground = true)
internal fun OutgoingServerValidationContentPreview() {
PreviewWithTheme {
ServerValidationContent(
onEvent = { },
state = ServerValidationContract.State(),
isIncomingValidation = false,
oAuthViewModel = FakeAccountOAuthViewModel(),
contentPadding = PaddingValues(),
)
}
}

View file

@ -0,0 +1,35 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.server.validation.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.validation.ui.fake.FakeBrandNameProvider
import app.k9mail.feature.account.server.validation.ui.fake.FakeIncomingServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.fake.FakeOutgoingServerValidationViewModel
@Composable
@PreviewDevices
internal fun IncomingServerValidationMainScreenPreview() {
PreviewWithTheme {
ServerValidationMainScreen(
viewModel = FakeIncomingServerValidationViewModel(
oAuthViewModel = FakeAccountOAuthViewModel(),
),
brandNameProvider = FakeBrandNameProvider,
)
}
}
@Composable
@PreviewDevices
internal fun OutgoingServerValidationMainScreenPreview() {
PreviewWithTheme {
ServerValidationMainScreen(
viewModel = FakeOutgoingServerValidationViewModel(
oAuthViewModel = FakeAccountOAuthViewModel(),
),
brandNameProvider = FakeBrandNameProvider,
)
}
}

View file

@ -0,0 +1,48 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.common.ui.fake.FakeAccountStateRepository
import app.k9mail.feature.account.server.certificate.data.InMemoryServerCertificateErrorRepository
import app.k9mail.feature.account.server.validation.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.validation.ui.fake.FakeBrandNameProvider
import com.fsck.k9.mail.server.ServerSettingsValidationResult
@Composable
@PreviewDevices
internal fun IncomingServerValidationScreenPreview() {
PreviewWithTheme {
ServerValidationScreen(
onNext = { },
onBack = { },
viewModel = IncomingServerValidationViewModel(
accountStateRepository = FakeAccountStateRepository(),
validateServerSettings = { ServerSettingsValidationResult.Success },
authorizationStateRepository = { true },
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
),
brandNameProvider = FakeBrandNameProvider,
)
}
}
@Composable
@PreviewDevices
internal fun OutgoingServerValidationScreenPreview() {
PreviewWithTheme {
ServerValidationScreen(
onNext = { },
onBack = { },
viewModel = OutgoingServerValidationViewModel(
accountStateRepository = FakeAccountStateRepository(),
validateServerSettings = { ServerSettingsValidationResult.Success },
authorizationStateRepository = { true },
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
),
brandNameProvider = FakeBrandNameProvider,
)
}
}

View file

@ -0,0 +1,33 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.server.validation.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.validation.ui.fake.FakeIncomingServerValidationViewModel
@Composable
@PreviewDevices
internal fun IncomingServerValidationToolbarScreenPreview() {
PreviewWithTheme {
ServerValidationToolbarScreen(
title = "Incoming server settings",
viewModel = FakeIncomingServerValidationViewModel(
oAuthViewModel = FakeAccountOAuthViewModel(),
),
)
}
}
@Composable
@PreviewDevices
internal fun OutgoingServerValidationToolbarScreenPreview() {
PreviewWithTheme {
ServerValidationToolbarScreen(
title = "Incoming server settings",
viewModel = FakeIncomingServerValidationViewModel(
oAuthViewModel = FakeAccountOAuthViewModel(),
),
)
}
}

View file

@ -0,0 +1,17 @@
package app.k9mail.feature.account.server.validation.ui.fake
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
/**
* Only for previewing the UI.
*/
class FakeAccountOAuthViewModel :
BaseViewModel<AccountOAuthContract.State, AccountOAuthContract.Event, AccountOAuthContract.Effect>(
AccountOAuthContract.State(),
),
AccountOAuthContract.ViewModel {
override fun initState(state: AccountOAuthContract.State) = Unit
override fun event(event: AccountOAuthContract.Event) = Unit
}

View file

@ -0,0 +1,7 @@
package app.k9mail.feature.account.server.validation.ui.fake
import net.thunderbird.core.common.provider.BrandNameProvider
internal object FakeBrandNameProvider : BrandNameProvider {
override val brandName: String = "Fake Brand Name"
}

View file

@ -0,0 +1,27 @@
package app.k9mail.feature.account.server.validation.ui.fake
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel
class FakeIncomingServerValidationViewModel(
override val oAuthViewModel: AccountOAuthContract.ViewModel = FakeAccountOAuthViewModel(),
override val isIncomingValidation: Boolean = true,
initialState: State = State(),
) : BaseViewModel<State, Event, Effect>(initialState), ServerValidationContract.IncomingViewModel {
val events = mutableListOf<Event>()
override fun event(event: Event) {
events.add(event)
}
fun effect(effect: Effect) {
emitEffect(effect)
}
}

View file

@ -0,0 +1,27 @@
package app.k9mail.feature.account.server.validation.ui.fake
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel
class FakeOutgoingServerValidationViewModel(
override val oAuthViewModel: AccountOAuthContract.ViewModel = FakeAccountOAuthViewModel(),
override val isIncomingValidation: Boolean = true,
initialState: State = State(),
) : BaseViewModel<State, Event, Effect>(initialState), ServerValidationContract.OutgoingViewModel {
val events = mutableListOf<Event>()
override fun event(event: Event) {
events.add(event)
}
fun effect(effect: Effect) {
emitEffect(effect)
}
}

View file

@ -0,0 +1,64 @@
package app.k9mail.feature.account.server.validation
import app.k9mail.feature.account.common.featureAccountCommonModule
import app.k9mail.feature.account.oauth.featureAccountOAuthModule
import app.k9mail.feature.account.server.certificate.featureAccountServerCertificateModule
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.domain.usecase.ValidateServerSettings
import app.k9mail.feature.account.server.validation.ui.IncomingServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.OutgoingServerValidationViewModel
import com.fsck.k9.mail.store.imap.ImapServerSettingsValidator
import com.fsck.k9.mail.store.pop3.Pop3ServerSettingsValidator
import com.fsck.k9.mail.transport.smtp.SmtpServerSettingsValidator
import net.thunderbird.core.common.coreCommonModule
import org.koin.core.module.dsl.viewModel
import org.koin.core.qualifier.named
import org.koin.dsl.module
val featureAccountServerValidationModule = module {
includes(
coreCommonModule,
featureAccountCommonModule,
featureAccountServerCertificateModule,
featureAccountOAuthModule,
)
factory<ServerValidationDomainContract.UseCase.ValidateServerSettings> {
ValidateServerSettings(
authStateStorage = get(),
imapValidator = ImapServerSettingsValidator(
trustedSocketFactory = get(),
oAuth2TokenProviderFactory = get(),
clientInfoAppName = get(named("ClientInfoAppName")),
clientInfoAppVersion = get(named("ClientInfoAppVersion")),
),
pop3Validator = Pop3ServerSettingsValidator(
trustedSocketFactory = get(),
),
smtpValidator = SmtpServerSettingsValidator(
trustedSocketFactory = get(),
oAuth2TokenProviderFactory = get(),
),
)
}
viewModel {
IncomingServerValidationViewModel(
validateServerSettings = get(),
accountStateRepository = get(),
authorizationStateRepository = get(),
certificateErrorRepository = get(),
oAuthViewModel = get(),
)
}
viewModel {
OutgoingServerValidationViewModel(
validateServerSettings = get(),
accountStateRepository = get(),
authorizationStateRepository = get(),
certificateErrorRepository = get(),
oAuthViewModel = get(),
)
}
}

View file

@ -0,0 +1,14 @@
package app.k9mail.feature.account.server.validation.domain
import com.fsck.k9.mail.ServerSettings
import com.fsck.k9.mail.server.ServerSettingsValidationResult
interface ServerValidationDomainContract {
interface UseCase {
fun interface ValidateServerSettings {
suspend fun execute(settings: ServerSettings): ServerSettingsValidationResult
}
}
}

View file

@ -0,0 +1,32 @@
package app.k9mail.feature.account.server.validation.domain.usecase
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import com.fsck.k9.mail.ServerSettings
import com.fsck.k9.mail.oauth.AuthStateStorage
import com.fsck.k9.mail.server.ServerSettingsValidationResult
import com.fsck.k9.mail.server.ServerSettingsValidator
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class ValidateServerSettings(
private val authStateStorage: AuthStateStorage,
private val imapValidator: ServerSettingsValidator,
private val pop3Validator: ServerSettingsValidator,
private val smtpValidator: ServerSettingsValidator,
private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO,
) : ServerValidationDomainContract.UseCase.ValidateServerSettings {
override suspend fun execute(settings: ServerSettings): ServerSettingsValidationResult {
return withContext(coroutineDispatcher) {
when (settings.type) {
"imap" -> imapValidator.checkServerSettings(settings, authStateStorage)
"pop3" -> pop3Validator.checkServerSettings(settings, authStateStorage)
"smtp" -> smtpValidator.checkServerSettings(settings, authStateStorage)
"demo" -> ServerSettingsValidationResult.Success
else -> {
throw IllegalArgumentException("Unsupported server type: ${settings.type}")
}
}
}
}
}

View file

@ -0,0 +1,223 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.lifecycle.viewModelScope
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.common.ui.WizardConstants
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.domain.entity.OAuthResult
import app.k9mail.feature.account.oauth.domain.entity.isOAuth
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.certificate.domain.entity.ServerCertificateError
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Error
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import com.fsck.k9.mail.server.ServerSettingsValidationResult
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@Suppress("TooManyFunctions")
abstract class BaseServerValidationViewModel(
private val accountStateRepository: AccountDomainContract.AccountStateRepository,
private val validateServerSettings: ServerValidationDomainContract.UseCase.ValidateServerSettings,
private val authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
private val certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
override val oAuthViewModel: AccountOAuthContract.ViewModel,
override val isIncomingValidation: Boolean = true,
initialState: State? = null,
) : BaseViewModel<State, Event, Effect>(
initialState = initialState ?: accountStateRepository.getState().toServerValidationState(isIncomingValidation),
),
ServerValidationContract.ViewModel {
override fun event(event: Event) {
when (event) {
Event.LoadAccountStateAndValidate -> handleOneTimeEvent(event, ::loadAccountStateAndValidate)
is Event.OnOAuthResult -> onOAuthResult(event.result)
Event.ValidateServerSettings -> onValidateConfig()
Event.OnNextClicked -> navigateNext()
Event.OnBackClicked -> onBack()
Event.OnRetryClicked -> onRetry()
Event.OnCertificateAccepted -> onRetry()
}
}
private fun loadAccountStateAndValidate() {
updateState {
accountStateRepository.getState().toServerValidationState(isIncomingValidation)
}
onValidateConfig()
}
private fun onValidateConfig() {
if (state.value.isSuccess) {
navigateNext()
} else if (state.value.serverSettings.isOAuth()) {
checkOAuthState()
} else {
validateServerSettings()
}
}
private fun checkOAuthState() {
val authorizationState = accountStateRepository.getState().authorizationState
if (authorizationState != null) {
if (authorizationStateRepository.isAuthorized(authorizationState)) {
validateServerSettings()
} else {
startOAuthSignIn()
}
} else {
startOAuthSignIn()
}
}
private fun startOAuthSignIn() {
val hostname = state.value.serverSettings?.host
val emailAddress = state.value.emailAddress
if (hostname == null || emailAddress == null) {
updateError(Error.UnknownError("Hostname or email address not set"))
return
} else {
updateState { state ->
state.copy(
needsAuthorization = true,
)
}
oAuthViewModel.initState(
AccountOAuthContract.State(
hostname = hostname,
emailAddress = emailAddress,
),
)
}
}
private fun onOAuthResult(result: OAuthResult) {
if (result is OAuthResult.Success) {
accountStateRepository.setAuthorizationState(result.authorizationState)
updateState {
it.copy(
needsAuthorization = false,
)
}
validateServerSettings()
}
}
private fun validateServerSettings() {
viewModelScope.launch {
val serverSettings = state.value.serverSettings
if (serverSettings == null) {
updateError(Error.UnknownError("Server settings not set"))
return@launch
}
updateState {
it.copy(isLoading = true)
}
when (val result = validateServerSettings.execute(serverSettings)) {
ServerSettingsValidationResult.Success -> updateSuccess()
is ServerSettingsValidationResult.AuthenticationError -> updateError(
Error.AuthenticationError(result.serverMessage),
)
is ServerSettingsValidationResult.CertificateError -> updateError(
Error.CertificateError(result.certificateChain),
)
ServerSettingsValidationResult.ClientCertificateError.ClientCertificateExpired -> updateError(
Error.ClientCertificateExpired,
)
ServerSettingsValidationResult.ClientCertificateError.ClientCertificateRetrievalFailure -> updateError(
Error.ClientCertificateRetrievalFailure,
)
is ServerSettingsValidationResult.NetworkError -> updateError(
Error.NetworkError(result.exception),
)
is ServerSettingsValidationResult.ServerError -> updateError(
Error.ServerError(result.serverMessage),
)
is ServerSettingsValidationResult.MissingServerCapabilityError -> updateError(
Error.MissingServerCapabilityError(result.capabilityName),
)
is ServerSettingsValidationResult.UnknownError -> updateError(
Error.UnknownError(result.exception.message ?: "Unknown error"),
)
}
}
}
private fun updateSuccess() {
updateState {
it.copy(
isLoading = false,
isSuccess = true,
)
}
viewModelScope.launch {
delay(WizardConstants.CONTINUE_NEXT_DELAY)
navigateNext()
}
}
private fun updateError(error: Error) {
if (error is Error.CertificateError) {
val serverSettings = checkNotNull(state.value.serverSettings)
certificateErrorRepository.setCertificateError(
ServerCertificateError(
hostname = serverSettings.host!!,
port = serverSettings.port,
certificateChain = error.certificateChain,
),
)
}
updateState {
it.copy(
error = error,
isLoading = false,
isSuccess = false,
)
}
}
private fun onBack() {
navigateBack()
}
private fun onRetry() {
updateState {
it.copy(
error = null,
)
}
onValidateConfig()
}
private fun navigateBack() {
viewModelScope.coroutineContext.cancelChildren()
emitEffect(Effect.NavigateBack)
}
private fun navigateNext() {
viewModelScope.coroutineContext.cancelChildren()
emitEffect(Effect.NavigateNext)
}
}

View file

@ -0,0 +1,25 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract.UseCase
class IncomingServerValidationViewModel(
accountStateRepository: AccountDomainContract.AccountStateRepository,
validateServerSettings: UseCase.ValidateServerSettings,
authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
oAuthViewModel: AccountOAuthContract.ViewModel,
initialState: ServerValidationContract.State? = null,
) : BaseServerValidationViewModel(
accountStateRepository = accountStateRepository,
validateServerSettings = validateServerSettings,
authorizationStateRepository = authorizationStateRepository,
certificateErrorRepository = certificateErrorRepository,
oAuthViewModel = oAuthViewModel,
initialState = initialState,
isIncomingValidation = true,
),
ServerValidationContract.IncomingViewModel

View file

@ -0,0 +1,25 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract.UseCase
class OutgoingServerValidationViewModel(
accountStateRepository: AccountDomainContract.AccountStateRepository,
validateServerSettings: UseCase.ValidateServerSettings,
authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
oAuthViewModel: AccountOAuthContract.ViewModel,
initialState: ServerValidationContract.State? = null,
) : BaseServerValidationViewModel(
accountStateRepository = accountStateRepository,
validateServerSettings = validateServerSettings,
authorizationStateRepository = authorizationStateRepository,
certificateErrorRepository = certificateErrorRepository,
oAuthViewModel = oAuthViewModel,
initialState = initialState,
isIncomingValidation = false,
),
ServerValidationContract.OutgoingViewModel

View file

@ -0,0 +1,120 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium
import app.k9mail.core.ui.compose.designsystem.template.ResponsiveWidthContainer
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.feature.account.common.ui.item.ErrorItem
import app.k9mail.feature.account.common.ui.item.ListItem
import app.k9mail.feature.account.common.ui.item.LoadingItem
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthView
import app.k9mail.feature.account.server.validation.R
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import net.thunderbird.core.ui.compose.common.modifier.testTagAsResourceId
@Suppress("LongMethod", "ViewModelForwarding")
@Composable
internal fun ServerValidationContent(
state: State,
isIncomingValidation: Boolean,
oAuthViewModel: AccountOAuthContract.ViewModel,
onEvent: (Event) -> Unit,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
) {
val resources = LocalContext.current.resources
ResponsiveWidthContainer(
modifier = Modifier
.testTagAsResourceId("AccountValidationContent")
.padding(contentPadding)
.fillMaxWidth()
.then(modifier),
) { contentPadding ->
LazyColumn(
modifier = Modifier
.fillMaxSize()
.imePadding(),
contentPadding = contentPadding,
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double, Alignment.CenterVertically),
) {
if (state.error != null) {
item(key = "error") {
// TODO add raw error message
ErrorItem(
title = stringResource(
id = if (isIncomingValidation) {
R.string.account_server_validation_incoming_loading_error
} else {
R.string.account_server_validation_outgoing_loading_error
},
),
message = state.error.toResourceString(resources),
onRetry = { onEvent(Event.OnRetryClicked) },
)
}
} else if (state.isSuccess) {
item(key = "success") {
LoadingItem(
message = stringResource(
id = if (isIncomingValidation) {
R.string.account_server_validation_incoming_success
} else {
R.string.account_server_validation_outgoing_success
},
),
)
}
} else if (state.needsAuthorization) {
item(key = "oauth") {
ListItem {
Column(
modifier = Modifier
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
TextTitleMedium(
text = stringResource(
id = R.string.account_server_validation_sign_in,
),
)
Spacer(modifier = Modifier.padding(MainTheme.spacings.default))
AccountOAuthView(
onOAuthResult = { result -> onEvent(Event.OnOAuthResult(result)) },
viewModel = oAuthViewModel,
)
}
}
}
} else {
item(key = "loading") {
LoadingItem(
message = stringResource(
id = if (isIncomingValidation) {
R.string.account_server_validation_incoming_loading_message
} else {
R.string.account_server_validation_outgoing_loading_message
},
),
)
}
}
}
}
}

View file

@ -0,0 +1,56 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel
import app.k9mail.feature.account.oauth.domain.entity.OAuthResult
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import com.fsck.k9.mail.ServerSettings
import java.io.IOException
import java.security.cert.X509Certificate
interface ServerValidationContract {
interface ViewModel : UnidirectionalViewModel<State, Event, Effect> {
val isIncomingValidation: Boolean
val oAuthViewModel: AccountOAuthContract.ViewModel
}
interface OutgoingViewModel : ViewModel
interface IncomingViewModel : ViewModel
data class State(
val emailAddress: String? = null,
val serverSettings: ServerSettings? = null,
val needsAuthorization: Boolean = false,
val isSuccess: Boolean = false,
val error: Error? = null,
val isLoading: Boolean = false,
)
sealed interface Event {
object LoadAccountStateAndValidate : Event
data class OnOAuthResult(val result: OAuthResult) : Event
object ValidateServerSettings : Event
object OnNextClicked : Event
object OnBackClicked : Event
object OnRetryClicked : Event
object OnCertificateAccepted : Event
}
sealed interface Effect {
object NavigateNext : Effect
object NavigateBack : Effect
}
sealed interface Error {
data class NetworkError(val exception: IOException) : Error
data class CertificateError(val certificateChain: List<X509Certificate>) : Error
data object ClientCertificateRetrievalFailure : Error
data object ClientCertificateExpired : Error
data class AuthenticationError(val serverMessage: String?) : Error
data class ServerError(val serverMessage: String?) : Error
data class MissingServerCapabilityError(val capabilityName: String) : Error
data class UnknownError(val message: String) : Error
}
}

View file

@ -0,0 +1,47 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import app.k9mail.core.ui.compose.common.mvi.observeWithoutEffect
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.AppTitleTopHeader
import app.k9mail.feature.account.common.ui.WizardNavigationBar
import app.k9mail.feature.account.common.ui.WizardNavigationBarState
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel
import net.thunderbird.core.common.provider.BrandNameProvider
@Composable
internal fun ServerValidationMainScreen(
viewModel: ViewModel,
brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observeWithoutEffect()
Scaffold(
topBar = {
AppTitleTopHeader(
title = brandNameProvider.brandName,
)
},
bottomBar = {
WizardNavigationBar(
onNextClick = {},
onBackClick = { dispatch(Event.OnBackClicked) },
state = WizardNavigationBarState(
showNext = false,
),
)
},
modifier = modifier,
) { innerPadding ->
ServerValidationContent(
onEvent = { dispatch(it) },
state = state.value,
isIncomingValidation = viewModel.isIncomingValidation,
oAuthViewModel = viewModel.oAuthViewModel,
contentPadding = innerPadding,
)
}
}

View file

@ -0,0 +1,60 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.feature.account.server.certificate.ui.ServerCertificateErrorScreen
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel
import net.thunderbird.core.common.provider.BrandNameProvider
@Suppress("ViewModelForwarding")
@Composable
fun ServerValidationScreen(
onNext: () -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
title: String? = null,
) {
val (state, dispatch) = viewModel.observe { effect ->
when (effect) {
is Effect.NavigateNext -> onNext()
is Effect.NavigateBack -> onBack()
}
}
LaunchedEffect(key1 = Unit) {
dispatch(Event.LoadAccountStateAndValidate)
}
BackHandler {
dispatch(Event.OnBackClicked)
}
if (state.value.error is ServerValidationContract.Error.CertificateError) {
ServerCertificateErrorScreen(
onCertificateAccepted = { dispatch(Event.OnCertificateAccepted) },
onBack = { dispatch(Event.OnBackClicked) },
modifier = modifier,
)
} else {
if (title != null) {
ServerValidationToolbarScreen(
title = title,
viewModel = viewModel,
modifier = modifier,
)
} else {
ServerValidationMainScreen(
viewModel = viewModel,
brandNameProvider = brandNameProvider,
modifier = modifier,
)
}
}
}

View file

@ -0,0 +1,13 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.feature.account.common.domain.entity.AccountState
internal fun AccountState.toServerValidationState(isIncomingValidation: Boolean): ServerValidationContract.State {
return ServerValidationContract.State(
emailAddress = emailAddress,
serverSettings = if (isIncomingValidation) incomingServerSettings else outgoingServerSettings,
isLoading = false,
isSuccess = false,
error = null,
)
}

View file

@ -0,0 +1,75 @@
package app.k9mail.feature.account.server.validation.ui
import android.content.res.Resources
import androidx.annotation.StringRes
import app.k9mail.feature.account.server.validation.R
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Error
import app.k9mail.feature.account.common.R as CommonR
internal fun Error.toResourceString(resources: Resources): String {
return when (this) {
is Error.CertificateError -> error("Handle CertificateError using ServerCertificateErrorScreen")
is Error.AuthenticationError -> {
resources.buildErrorString(
titleResId = R.string.account_server_validation_error_authentication,
detailsResId = CommonR.string.account_common_error_server_message,
detailsMessage = serverMessage,
)
}
is Error.NetworkError -> {
resources.buildErrorString(
titleResId = R.string.account_server_validation_error_network,
detailsResId = R.string.account_server_validation_error_details,
detailsMessage = exception.message,
)
}
is Error.ServerError -> {
resources.buildErrorString(
titleResId = R.string.account_server_validation_error_server,
detailsResId = CommonR.string.account_common_error_server_message,
detailsMessage = serverMessage,
)
}
is Error.UnknownError -> {
resources.buildErrorString(
titleResId = R.string.account_server_validation_error_unknown,
detailsResId = R.string.account_server_validation_error_details,
detailsMessage = message,
)
}
Error.ClientCertificateExpired -> {
resources.getString(R.string.account_server_validation_error_client_certificate_expired)
}
Error.ClientCertificateRetrievalFailure -> {
resources.getString(R.string.account_server_validation_error_client_certificate_retrieval_failure)
}
is Error.MissingServerCapabilityError -> {
resources.buildErrorString(
titleResId = R.string.account_server_validation_error_missing_server_capability,
detailsResId = R.string.account_server_validation_error_missing_server_capability_details,
detailsMessage = capabilityName,
)
}
}
}
private fun Resources.buildErrorString(
@StringRes titleResId: Int,
@StringRes detailsResId: Int,
detailsMessage: String?,
): String {
val title = getString(titleResId)
return if (detailsMessage != null) {
val details = getString(detailsResId, detailsMessage)
"$title\n\n$details"
} else {
title
}
}

View file

@ -0,0 +1,47 @@
package app.k9mail.feature.account.server.validation.ui
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import app.k9mail.core.ui.compose.common.mvi.observeWithoutEffect
import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithBackButton
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.WizardNavigationBar
import app.k9mail.feature.account.common.ui.WizardNavigationBarState
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel
@Composable
internal fun ServerValidationToolbarScreen(
title: String,
viewModel: ViewModel,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observeWithoutEffect()
Scaffold(
topBar = {
TopAppBarWithBackButton(
title = title,
onBackClick = { dispatch(Event.OnBackClicked) },
)
},
bottomBar = {
WizardNavigationBar(
onNextClick = {},
onBackClick = { dispatch(Event.OnBackClicked) },
state = WizardNavigationBarState(
showNext = false,
),
)
},
modifier = modifier,
) { innerPadding ->
ServerValidationContent(
onEvent = { dispatch(it) },
state = state.value,
isIncomingValidation = viewModel.isIncomingValidation,
oAuthViewModel = viewModel.oAuthViewModel,
contentPadding = innerPadding,
)
}
}

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_retrieval_failure">تعذر الوصول إلى شهادة العميل</string>
<string name="account_server_validation_error_client_certificate_expired">شهادة العميل لم تعد صالحة</string>
<string name="account_server_validation_error_details">التفاصيل:\n%s</string>
<string name="account_server_validation_error_missing_server_capability">هناك إمكانية مفقودة في الخادم</string>
<string name="account_server_validation_error_missing_server_capability_details">يفتقد الخادم هذه الإمكانية:\n%s</string>
<string name="account_server_validation_incoming_loading_message">التحقق من إعدادات خادم البريد الوارد…</string>
<string name="account_server_validation_incoming_success">تم التحقق من إعدادات خادم البريد الوارد</string>
<string name="account_server_validation_outgoing_loading_message">التحقق من إعدادات خادم البريد الصادر…</string>
<string name="account_server_validation_sign_in">يُرجى القيام بتسجيل الدخول</string>
<string name="account_server_validation_incoming_loading_error">فشل التحقق من إعدادات خادم البريد الوارد</string>
<string name="account_server_validation_outgoing_loading_error">فشل التحقق من إعدادات خادم البريد الصادر</string>
<string name="account_server_validation_error_authentication">خطأ في المصادقة</string>
<string name="account_server_validation_error_network">خطأ في الشبكة</string>
<string name="account_server_validation_error_server">خطأ في الخادم</string>
<string name="account_server_validation_error_unknown">خطأ غير معروف</string>
<string name="account_server_validation_outgoing_success">تم التحقق من إعدادات خادم البريد الصادر</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_network">Памылка сеткі</string>
<string name="account_server_validation_error_authentication">Памылка аўтэнтыфікацыі</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Проверява настройките на сървър за входяща поща…</string>
<string name="account_server_validation_error_authentication">Грешка при удостоверяване</string>
<string name="account_server_validation_outgoing_loading_message">Проверява настройките на сървър за изходяща поща…</string>
<string name="account_server_validation_error_network">Мрежова грешка</string>
<string name="account_server_validation_outgoing_success">Настройките на сървър за изходяща поща са потвърдени</string>
<string name="account_server_validation_error_unknown">Непозната грешка</string>
<string name="account_server_validation_sign_in">Моля впишете се</string>
<string name="account_server_validation_outgoing_loading_error">Проверката на настройките на сървър за изходяща поща се провали</string>
<string name="account_server_validation_incoming_success">Настройките на сървър за входяща поща са потвърдени</string>
<string name="account_server_validation_incoming_loading_error">Проверката на настройките на сървъра за входяща поща се провали</string>
<string name="account_server_validation_error_server">Грешка на сървъра</string>
<string name="account_server_validation_error_client_certificate_expired">Клиентският сертификат вече не е валиден</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Клиентският сертификат не може да бъде достъпен</string>
<string name="account_server_validation_error_missing_server_capability">Липсващи възможности на сървъра</string>
<string name="account_server_validation_error_details">Подробности:\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Сървърът не поддържа тази операция:\n%s</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Dilesadur fazi</string>
<string name="account_server_validation_error_network">Fazi rouedad</string>
<string name="account_server_validation_error_server">Fazi dafariat</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Greška pri autentikaciji</string>
<string name="account_server_validation_error_network">Mrežna greška</string>
<string name="account_server_validation_error_server">Greška servera</string>
<string name="account_server_validation_error_unknown">Nepoznata greška</string>
<string name="account_server_validation_error_client_certificate_expired">Sertifikat klijenta više nije važeći</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Ne može se pristupiti sertifikatu klijenta</string>
<string name="account_server_validation_error_details">Detalji:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Server ne posjeduje ovu sposobnost:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability">Server nema ovu sposobnost</string>
<string name="account_server_validation_incoming_loading_message">Proveravanje postavki dolazećeg servera…</string>
<string name="account_server_validation_incoming_loading_error">Proveravanje postavki dolazećeg servera neuspješno</string>
<string name="account_server_validation_incoming_success">Postavke dolazećeg servera verifikovane</string>
<string name="account_server_validation_outgoing_loading_message">Proveravanje postavki odlazećeg servera…</string>
<string name="account_server_validation_outgoing_loading_error">Proveravanje postavki odlazećeg servera neuspješno</string>
<string name="account_server_validation_outgoing_success">Postavke odlazećeg servera verifikovane</string>
<string name="account_server_validation_sign_in">Molimo prijavite se</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">S\'està comprovant la configuració del servidor d\'entrada…</string>
<string name="account_server_validation_error_authentication">Error d\'autenticació</string>
<string name="account_server_validation_outgoing_loading_message">S\'està comprovant la configuració del servidor de sortida…</string>
<string name="account_server_validation_error_network">Error de la xarxa</string>
<string name="account_server_validation_outgoing_success">La configuració del servidor de sortida s\'ha verificat</string>
<string name="account_server_validation_error_unknown">Error desconegut</string>
<string name="account_server_validation_sign_in">Si us plau, inicieu la sessió</string>
<string name="account_server_validation_outgoing_loading_error">Ha fallat la comprovació de la configuració del servidor de sortida</string>
<string name="account_server_validation_incoming_success">La configuració del servidor d\'entrada s\'ha verificat</string>
<string name="account_server_validation_incoming_loading_error">Ha fallat la comprovació de la configuració del servidor d\'entrada</string>
<string name="account_server_validation_error_server">Error del servidor</string>
<string name="account_server_validation_error_missing_server_capability">Falta capacitat al servidor</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">No s\'ha pogut accedir al certificat de client</string>
<string name="account_server_validation_error_missing_server_capability_details">Al servidor li falta aquesta capacitat:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">El certificat de client ja no és vàlid</string>
<string name="account_server_validation_error_details">Detalls:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_server">Sbagliu di u servitore</string>
<string name="account_server_validation_error_missing_server_capability">Funzione assente nantà u servitore</string>
<string name="account_server_validation_incoming_loading_message">Cuntrollu di i parametri di u servitore dentrata…</string>
<string name="account_server_validation_incoming_success">I parametri di u servitore dentrata sò stati verificati</string>
<string name="account_server_validation_outgoing_loading_message">Cuntrollu di i parametri di u servitore desciuta…</string>
<string name="account_server_validation_outgoing_success">I parametri di u servitore desciuta sò stati verificati</string>
<string name="account_server_validation_sign_in">Cunnittitevi</string>
<string name="account_server_validation_error_authentication">Sbagliu dautenticazione</string>
<string name="account_server_validation_error_network">Sbagliu di a reta</string>
<string name="account_server_validation_error_unknown">Sbagliu scunnisciutu</string>
<string name="account_server_validation_error_client_certificate_expired">U certificatu di u cliente ùn hè più accettevule</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">U certificatu di u cliente ùn pò micca esse acciditu</string>
<string name="account_server_validation_error_missing_server_capability_details">U servitore ùn pussede micca sta funzione :
\n%s</string>
<string name="account_server_validation_error_details">Detaglii :
\n%s</string>
<string name="account_server_validation_incoming_loading_error">Fiascu di u cuntrollu di i parametri di u servitore dentrata</string>
<string name="account_server_validation_outgoing_loading_error">Fiascu di u cuntrollu di i parametri di u servitore desciuta</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Kontrola nastavení serveru příchozí pošty…</string>
<string name="account_server_validation_error_authentication">Chyba autentizace</string>
<string name="account_server_validation_outgoing_loading_message">Kontrola nastavení serveru odchozí pošty…</string>
<string name="account_server_validation_error_network">Chyba sítě</string>
<string name="account_server_validation_outgoing_success">Nastavení serveru odchozí pošty je ověřené</string>
<string name="account_server_validation_error_unknown">Neznámá chyba</string>
<string name="account_server_validation_sign_in">Přihlaste se</string>
<string name="account_server_validation_outgoing_loading_error">Kontrola nastavení serveru odchozí pošty se nezdařila</string>
<string name="account_server_validation_incoming_success">Nastavení serveru příchozí pošty je ověřené</string>
<string name="account_server_validation_incoming_loading_error">Kontrola nastavení serveru příchozí pošty se nezdařila</string>
<string name="account_server_validation_error_server">Chyba serveru</string>
<string name="account_server_validation_error_client_certificate_expired">Klientský certifikát je již neplatný</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Klientský certifikát není přístupný</string>
<string name="account_server_validation_error_missing_server_capability">Chybějící funkcionalita</string>
<string name="account_server_validation_error_missing_server_capability_details">Serveru chybí tato funkcionalita:
\n%s</string>
<string name="account_server_validation_error_details">Detaily:
\n%s</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Einstellungen des Posteingangsservers werden überprüft…</string>
<string name="account_server_validation_error_authentication">Authentifizierungsfehler</string>
<string name="account_server_validation_outgoing_loading_message">Einstellungen des Postausgangsservers werden überprüft…</string>
<string name="account_server_validation_error_network">Netzwerkfehler</string>
<string name="account_server_validation_outgoing_success">Einstellungen des Postausgangsservers sind verifiziert</string>
<string name="account_server_validation_error_unknown">Unbekannter Fehler</string>
<string name="account_server_validation_sign_in">Bitte anmelden</string>
<string name="account_server_validation_outgoing_loading_error">Prüfung der Einstellungen des Postausgangsservers fehlgeschlagen</string>
<string name="account_server_validation_incoming_success">Einstellungen des Posteingangsservers sind verifiziert</string>
<string name="account_server_validation_incoming_loading_error">Prüfung der Einstellungen des Posteingangservers fehlgeschlagen</string>
<string name="account_server_validation_error_server">Serverfehler</string>
<string name="account_server_validation_error_missing_server_capability">Fehlende Serverfähigkeit</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Auf das Client-Zertifikat konnte nicht zugegriffen werden</string>
<string name="account_server_validation_error_missing_server_capability_details">Der Server unterstützt diese Fähigkeit nicht:\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Das Client-Zertifikat ist nicht mehr gültig</string>
<string name="account_server_validation_error_details">Details:\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Σφάλμα ελέγχου ταυτότητας</string>
<string name="account_server_validation_error_network">Σφάλμα δικτύου</string>
<string name="account_server_validation_error_unknown">Άγνωστο σφάλμα</string>
<string name="account_server_validation_error_server">Σφάλμα διακομιστή</string>
<string name="account_server_validation_error_client_certificate_expired">Το πιστοποιητικό πελάτη δεν είναι πλέον έγκυρο</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Δεν ήταν δυνατή η πρόσβαση στο πιστοποιητικό πελάτη</string>
<string name="account_server_validation_outgoing_loading_error">Αποτυχία ελέγχου των ρυθμίσεων του διακομιστή εξερχομένων</string>
<string name="account_server_validation_error_details">Λεπτομέρειες:\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Ο διακομιστής στερείται αυτής της δυνατότητας:\n%s</string>
<string name="account_server_validation_incoming_loading_message">Έλεγχος ρυθμίσεων διακομιστή εισερχομένων…</string>
<string name="account_server_validation_incoming_loading_error">Αποτυχία ελέγχου των ρυθμίσεων του διακομιστή εισερχομένων</string>
<string name="account_server_validation_outgoing_loading_message">Έλεγχος ρυθμίσεων διακομιστή εξερχομένων…</string>
<string name="account_server_validation_sign_in">Πραγματοποιήστε σύνδεση</string>
<string name="account_server_validation_incoming_success">Οι ρυθμίσεις του διακομιστή εισερχομένων επαληθεύτηκαν</string>
<string name="account_server_validation_outgoing_success">Οι ρυθμίσεις του διακομιστή εξερχομένων επαληθεύτηκαν</string>
<string name="account_server_validation_error_missing_server_capability">Έλλειψη δυνατότητας διακομιστή</string>
</resources>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Checking incoming server settings…</string>
<string name="account_server_validation_error_authentication">Authentication error</string>
<string name="account_server_validation_outgoing_loading_message">Checking outgoing server settings…</string>
<string name="account_server_validation_error_network">Network error</string>
<string name="account_server_validation_outgoing_success">Outgoing server settings are valid</string>
<string name="account_server_validation_error_unknown">Unknown error</string>
<string name="account_server_validation_sign_in">Please sign in</string>
<string name="account_server_validation_outgoing_loading_error">Checking outgoing server settings failed</string>
<string name="account_server_validation_incoming_success">Incoming server settings are valid</string>
<string name="account_server_validation_incoming_loading_error">Checking incoming server settings failed</string>
<string name="account_server_validation_error_server">Server error</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_details">Detaloj:
\n%s</string>
<string name="account_server_validation_sign_in">Bonvolu saluti</string>
<string name="account_server_validation_error_server">Servila eraro</string>
<string name="account_server_validation_error_network">Reta eraro</string>
<string name="account_server_validation_error_unknown">Nekonata eraro</string>
<string name="account_server_validation_error_authentication">Aŭtentokontrola eraro</string>
<string name="account_server_validation_error_missing_server_capability">Mankata servila kapablo</string>
<string name="account_server_validation_error_client_certificate_expired">La klienta atestilo ne plu estas valida</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">La klienta atestilo ne povis esti atingata</string>
<string name="account_server_validation_error_missing_server_capability_details">La servilo ne havas tiun kapablon:\n%s</string>
<string name="account_server_validation_incoming_loading_error">Kontrolo de la agordoj eniran servilon fiaskis</string>
<string name="account_server_validation_incoming_loading_message">Kontrolas agordojn de la enira servilo…</string>
<string name="account_server_validation_outgoing_loading_message">Kontrolas agordojn de la elira servilo…</string>
<string name="account_server_validation_outgoing_loading_error">Kontrolo de la agordoj eliran servilon fiaskis</string>
<string name="account_server_validation_incoming_success">Eniran servilon agordoj kontrolitaj</string>
<string name="account_server_validation_outgoing_success">Eliran servilon agordoj kontrolitaj</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Comprobando los ajustes del servidor entrante…</string>
<string name="account_server_validation_error_authentication">Error de autenticación</string>
<string name="account_server_validation_outgoing_loading_message">Comprobando los ajustes del servidor saliente…</string>
<string name="account_server_validation_error_network">Error de red</string>
<string name="account_server_validation_outgoing_success">Configuración del servidor saliente verificada</string>
<string name="account_server_validation_error_unknown">Error desconocido</string>
<string name="account_server_validation_sign_in">Seguir con el inicio de sesión</string>
<string name="account_server_validation_outgoing_loading_error">No se han podido comprobar los ajustes del servidor saliente</string>
<string name="account_server_validation_incoming_success">Configuración del servidor entrante verificada</string>
<string name="account_server_validation_incoming_loading_error">No se han podido comprobar los ajustes del servidor entrante</string>
<string name="account_server_validation_error_server">Error del servidor</string>
<string name="account_server_validation_error_missing_server_capability">Falta capacidad en el servidor</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">No se ha podido acceder al certificado del cliente</string>
<string name="account_server_validation_error_missing_server_capability_details">Al servidor le falta esta capacidad:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">El certificado del cliente ya no es válido</string>
<string name="account_server_validation_error_details">Detalles:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Kontrollime saabuva e-posti serveriseadistusi…</string>
<string name="account_server_validation_error_authentication">Viga autentimisel</string>
<string name="account_server_validation_outgoing_loading_message">Kontrollime väljuva e-posti serveriseadistusi…</string>
<string name="account_server_validation_error_network">Võrguühenduse viga</string>
<string name="account_server_validation_outgoing_success">Väljuva e-posti serveriseadistused on üle kontrollitud</string>
<string name="account_server_validation_error_unknown">Teadmata viga</string>
<string name="account_server_validation_sign_in">Palun logi sisse</string>
<string name="account_server_validation_outgoing_loading_error">Väljuva e-posti serveriseadistuste kontrollimine ei õnnestunud</string>
<string name="account_server_validation_incoming_success">Saabuva e-posti serveriseadistused on üle kontrollitud</string>
<string name="account_server_validation_incoming_loading_error">Saabuva e-posti serveriseadistuste kontrollimine ei õnnestunud</string>
<string name="account_server_validation_error_server">Serveri viga</string>
<string name="account_server_validation_error_missing_server_capability">Serveril puudub vajalik võimekus</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Kliendisertifikaati ei õnnestunud laadida</string>
<string name="account_server_validation_error_missing_server_capability_details">Serveril puudub vajalik võimekus:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Kliendisertifikaadi kehtivus on lõppenud</string>
<string name="account_server_validation_error_details">Üksikasjalik teave:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Sarrerako zerbitzariaren ezarpenak egiaztatzen…</string>
<string name="account_server_validation_error_authentication">Autentifikazio errorea</string>
<string name="account_server_validation_outgoing_loading_message">Irteerako zerbitzariaren ezarpenak egiaztatzen…</string>
<string name="account_server_validation_error_network">Sarearen errorea</string>
<string name="account_server_validation_outgoing_success">Irteerako zerbitzariaren ezarpenak egiaztatu dira</string>
<string name="account_server_validation_error_unknown">Errore ezezaguna</string>
<string name="account_server_validation_sign_in">Mesedez hasi saioa</string>
<string name="account_server_validation_outgoing_loading_error">Akatsa irteerako zerbitzariaren ezarpenak egiaztatzerakoan</string>
<string name="account_server_validation_incoming_success">Sarrerako zerbitzariaren ezarpenak egiaztatu dira</string>
<string name="account_server_validation_incoming_loading_error">Akatsa sarrerako zerbitzariaren ezarpenak egiaztatzean</string>
<string name="account_server_validation_error_server">Zerbitzariaren errorea</string>
<string name="account_server_validation_error_missing_server_capability_details">Zerbitzariari gaitasun hau falta zaio:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Bezeroaren ziurtagiriak dagoeneko ez du balio</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Ezin izan da bezeroaren ziurtagiria atzitu</string>
<string name="account_server_validation_error_missing_server_capability">Zerbitzariaren gaitasuna falta da</string>
<string name="account_server_validation_error_details">Xehetasunak:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">بررسی تنظیمات سرور ورودی …</string>
<string name="account_server_validation_error_missing_server_capability">قابلیت‌های سرور پیدا نشد</string>
<string name="account_server_validation_error_authentication">خطای احراز هویت</string>
<string name="account_server_validation_outgoing_loading_message">بررسی تنظیمات سرور خروجی …</string>
<string name="account_server_validation_error_network">خطای شبکه</string>
<string name="account_server_validation_outgoing_success">تنظیمات سرور خروجی اعتبارسنجی شد</string>
<string name="account_server_validation_error_unknown">خطای ناشناخته</string>
<string name="account_server_validation_sign_in">لطفا وارد شوید</string>
<string name="account_server_validation_outgoing_loading_error">بررسی تنظیمات سرور خروجی با خطا مواجه شد</string>
<string name="account_server_validation_incoming_success">تنظیمات سرور ورودی اعتبارسنجی شد</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">گواهینامهٔ کارخواه در دسترس نیست</string>
<string name="account_server_validation_error_missing_server_capability_details">سرور این قابلیت را ندارد:
\n%s</string>
<string name="account_server_validation_incoming_loading_error">بررسی تنظیمات سرور ورودی با خطا مواجه شد</string>
<string name="account_server_validation_error_server">خطای سرور</string>
<string name="account_server_validation_error_client_certificate_expired">گواهینامهٔ کارخواه دیگر معتبر نیست</string>
<string name="account_server_validation_error_details">جزییات:
\n%s</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Tarkistetaan saapuvan postin palvelimen asetuksia…</string>
<string name="account_server_validation_error_authentication">Todennusvirhe</string>
<string name="account_server_validation_outgoing_loading_message">Tarkistetaan lähtevän postin palvelimen asetuksia…</string>
<string name="account_server_validation_error_network">Verkkovirhe</string>
<string name="account_server_validation_outgoing_success">Lähtevän postin palvelimen asetukset on vahvistettu</string>
<string name="account_server_validation_error_unknown">Tuntematon virhe</string>
<string name="account_server_validation_sign_in">Kirjaudu sisään</string>
<string name="account_server_validation_outgoing_loading_error">Lähtevän postin palvelimen asetusten tarkistaminen epäonnistui</string>
<string name="account_server_validation_incoming_success">Saapuvan postin palvelimen asetukset on vahvistettu</string>
<string name="account_server_validation_incoming_loading_error">Saapuvan postin palvelimen asetusten tarkistaminen epäonnistui</string>
<string name="account_server_validation_error_server">Palvelinvirhe</string>
<string name="account_server_validation_error_details">Lisätiedot:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Asiakkaan varmenne ei ole enää kelvollinen</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Ei pääsyä asiakkaan varmenteeseen</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Vérification des paramètres du serveur entrant…</string>
<string name="account_server_validation_error_authentication">Erreur d\'authentification</string>
<string name="account_server_validation_outgoing_loading_message">Vérification des paramètres du serveur sortant…</string>
<string name="account_server_validation_error_network">Erreur réseau</string>
<string name="account_server_validation_outgoing_success">Les paramètres du serveur sortant sont confirmés</string>
<string name="account_server_validation_error_unknown">Erreur inconnue</string>
<string name="account_server_validation_sign_in">Connectez-vous</string>
<string name="account_server_validation_outgoing_loading_error">Échec de vérification des paramètres du serveur sortant</string>
<string name="account_server_validation_incoming_success">Les paramètres du serveur entrant sont confirmés</string>
<string name="account_server_validation_incoming_loading_error">Échec de vérification des paramètres du serveur entrant</string>
<string name="account_server_validation_error_server">Erreur du serveur</string>
<string name="account_server_validation_error_missing_server_capability">Le serveur ne dispose pas dune fonction</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Impossible daccéder au certificat client</string>
<string name="account_server_validation_error_missing_server_capability_details">Le serveur ne dispose pas de cette fonction :\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Le certificat client nest plus valide</string>
<string name="account_server_validation_error_details">Détails :\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Ynstellingen foar ynkommende server kontrolearje…</string>
<string name="account_server_validation_error_authentication">Autentikaasjeflater</string>
<string name="account_server_validation_outgoing_loading_message">Ynstellingen foar útgeande server kontrolearje…</string>
<string name="account_server_validation_error_network">Netwurkflater</string>
<string name="account_server_validation_outgoing_success">Ynstellingen foar útgeande server ferifiearre</string>
<string name="account_server_validation_error_unknown">Unbekende flater</string>
<string name="account_server_validation_sign_in">Meld jo oan</string>
<string name="account_server_validation_outgoing_loading_error">Ynstellingen foar útgeande server kontrolearje mislearre</string>
<string name="account_server_validation_incoming_success">Ynstellingen foar ynkommende server ferifiearre</string>
<string name="account_server_validation_incoming_loading_error">Ynstellingen foar ynkommende server kontrolearje mislearre</string>
<string name="account_server_validation_error_server">Serverflater</string>
<string name="account_server_validation_error_missing_server_capability">Untbrekkende serverfunksjonaliteit</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">It clientsertifikaat koe net rieplachte wurde</string>
<string name="account_server_validation_error_missing_server_capability_details">De server mist dizze funksjonaliteit:\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">It clientsertifikaat is net langer jildich</string>
<string name="account_server_validation_error_details">Details:\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Níl teastas an chliaint bailí a thuilleadh</string>
<string name="account_server_validation_error_missing_server_capability">Cumas freastalaí in easnamh</string>
<string name="account_server_validation_error_details">Sonraí:\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Tá an cumas seo in easnamh ar an bhfreastalaí:\n%s</string>
<string name="account_server_validation_outgoing_loading_message">Socruithe freastalaí amach á seiceáil…</string>
<string name="account_server_validation_error_authentication">Earráid fhíordheimhnithe</string>
<string name="account_server_validation_error_network">Earráid líonra</string>
<string name="account_server_validation_error_server">Earráid freastalaí</string>
<string name="account_server_validation_incoming_loading_error">Theip ar shocruithe an fhreastalaí isteach a sheiceáil</string>
<string name="account_server_validation_error_unknown">Earráid anaithnid</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Níorbh fhéidir teastas an chliaint a rochtain</string>
<string name="account_server_validation_incoming_success">Fíoraíodh socruithe freastalaí isteach</string>
<string name="account_server_validation_incoming_loading_message">Ag seiceáil socruithe freastalaí isteach…</string>
<string name="account_server_validation_outgoing_loading_error">Theip ar shocruithe an fhreastalaí amach a sheiceáil</string>
<string name="account_server_validation_outgoing_success">Fíoraíodh socruithe an fhreastalaí amach</string>
<string name="account_server_validation_sign_in">Sínigh isteach le do thoil</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">A sgrùdadh roghainnean an fhrithealaiche a-steach…</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Cha dfhuair sinn greim air teisteanas a chliant</string>
<string name="account_server_validation_error_missing_server_capability">Tha comas a dhìth air an fhrithealaiche</string>
<string name="account_server_validation_sign_in">Clàraich a-steach</string>
<string name="account_server_validation_outgoing_loading_error">Dhfhàillig sgrùdadh roghainnean an fhrithealaiche a-mach</string>
<string name="account_server_validation_error_missing_server_capability_details">Tha an comas a leanas a dhìth air an fhrithealaiche:\n%s</string>
<string name="account_server_validation_incoming_loading_error">Dhfhàillig sgrùdadh roghainnean an fhrithealaiche a-steach</string>
<string name="account_server_validation_outgoing_success">Chaidh roghainnean an fhrithealaiche a-mach a dhearbhadh</string>
<string name="account_server_validation_outgoing_loading_message">A sgrùdadh roghainnean an fhrithealaiche a-mach…</string>
<string name="account_server_validation_incoming_success">Chaidh roghainnean an fhrithealaiche a-steach a dhearbhadh</string>
<string name="account_server_validation_error_details">Mion-fhiosrachadh:\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Chan eil teisteanas a chliant dligheach tuilleadh</string>
<string name="account_server_validation_error_authentication">Mearachd dearbhaidh</string>
<string name="account_server_validation_error_network">Mearachd lìonraidh</string>
<string name="account_server_validation_error_server">Mearachd frithealaiche</string>
<string name="account_server_validation_error_unknown">Mearachd neo-aithnichte</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">इनकमिंग सर्वर सेटिंग चेक कर रहे…</string>
<string name="account_server_validation_error_authentication">ऑथेंटिकेशन गड़बड़</string>
<string name="account_server_validation_outgoing_loading_message">आउटगोइंग सर्वर सेटिंग चेक कर रहे…</string>
<string name="account_server_validation_error_network">नेटवर्क गड़बड़</string>
<string name="account_server_validation_outgoing_success">आउटगोइंग सर्वर सेटिंग सही है!</string>
<string name="account_server_validation_error_unknown">अनजान गड़बड़</string>
<string name="account_server_validation_sign_in">साइनइन करें</string>
<string name="account_server_validation_outgoing_loading_error">आउटगोइंग सर्वर सेटिंग चेक करने में फेल!</string>
<string name="account_server_validation_incoming_success">इनकमिंग सर्वर सेटिंग सही है!</string>
<string name="account_server_validation_incoming_loading_error">इनकमिंग सर्वर सेटिंग चेक करने में फेल!</string>
<string name="account_server_validation_error_server">सर्वर गड़बड़</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Pogreška provjere autentičnosti</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">A bejövő kiszolgáló beállítások ellenőrzése…</string>
<string name="account_server_validation_error_authentication">Hitelesítési hiba</string>
<string name="account_server_validation_outgoing_loading_message">A kimenő kiszolgáló beállítások ellenőrzése…</string>
<string name="account_server_validation_error_network">Hálózati hiba</string>
<string name="account_server_validation_outgoing_success">A kimenő kiszolgáló beállításai érvényesek</string>
<string name="account_server_validation_error_unknown">Ismeretlen hiba</string>
<string name="account_server_validation_sign_in">Jelentkezzen be</string>
<string name="account_server_validation_outgoing_loading_error">A kimenő kiszolgáló beállítások ellenőrzése sikertelen volt</string>
<string name="account_server_validation_incoming_success">A bejövő kiszolgáló beállításai érvényesek</string>
<string name="account_server_validation_incoming_loading_error">A bejövő kiszolgáló beállítások ellenőrzése sikertelen volt</string>
<string name="account_server_validation_error_server">Kiszolgálóhiba</string>
<string name="account_server_validation_error_client_certificate_expired">A klienstanúsítvány már nem érvényes</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">A klienstanúsítvány nem érhető el</string>
<string name="account_server_validation_error_missing_server_capability">Hiányzó kiszolgálófunkció</string>
<string name="account_server_validation_error_details">Részletek:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">A kiszolgálóból hiányzik ez a funkció:
\n%s</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Galat autentikasi</string>
<string name="account_server_validation_error_network">Galat jaringan</string>
<string name="account_server_validation_outgoing_loading_message">Memeriksa pengaturan peladen yang keluar…</string>
<string name="account_server_validation_error_client_certificate_expired">Sertifikat klien sudah tidak valid</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Sertifikat klien ini tidak dapat diakses</string>
<string name="account_server_validation_incoming_loading_error">Gagal memeriksa pengaturan peladen yang masuk</string>
<string name="account_server_validation_incoming_success">Pengaturan peladen yang masuk diverifikasi</string>
<string name="account_server_validation_error_missing_server_capability">Kehilangan kemampuan peladen</string>
<string name="account_server_validation_error_details">Rincian:
\n%s</string>
<string name="account_server_validation_incoming_loading_message">Memeriksa pengaturan peladen yang masuk…</string>
<string name="account_server_validation_error_missing_server_capability_details">Peladen kehilangan kemampuan berikut ini:\n%s</string>
<string name="account_server_validation_outgoing_success">Pengaturan peladen yang keluar diverifikasi</string>
<string name="account_server_validation_sign_in">Silakan masuk</string>
<string name="account_server_validation_outgoing_loading_error">Gagal memeriksa pengaturan peladen yang keluar</string>
<string name="account_server_validation_error_server">Galat peladen</string>
<string name="account_server_validation_error_unknown">Galat tak diketahui</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Athuga stillingar inn-póstþjónsins…</string>
<string name="account_server_validation_error_authentication">Auðkenningarvilla</string>
<string name="account_server_validation_outgoing_loading_message">Athuga stillingar sendinga-póstþjónsins…</string>
<string name="account_server_validation_error_network">Villa í netkerfi</string>
<string name="account_server_validation_outgoing_success">Stillingar sendinga-póstþjóns sannreyndar</string>
<string name="account_server_validation_error_unknown">Óþekkt villa</string>
<string name="account_server_validation_sign_in">Skráðu þig inn</string>
<string name="account_server_validation_outgoing_loading_error">Athugun á stillingum sendinga-póstþjónsins mistókst</string>
<string name="account_server_validation_incoming_success">Stillingar inn-póstþjóns sannreyndar</string>
<string name="account_server_validation_incoming_loading_error">Athugun á stillingum inn-póstþjónsins mistókst</string>
<string name="account_server_validation_error_server">Villa á þjóni</string>
<string name="account_server_validation_error_missing_server_capability">Vantar upplýsingar um getu póstþjóns</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Skilríki biðlara var ekki aðgengilegt</string>
<string name="account_server_validation_error_missing_server_capability_details">Póstþjóninn vantar þennan eiginleika:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Skilríki biðlara er ekki lengur gilt</string>
<string name="account_server_validation_error_details">Nánar:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Controllo impostazioni server posta in arrivo…</string>
<string name="account_server_validation_error_authentication">Errore di autenticazione</string>
<string name="account_server_validation_outgoing_loading_message">Controllo impostazioni server in uscita…</string>
<string name="account_server_validation_error_network">Errore di rete</string>
<string name="account_server_validation_outgoing_success">Impostazioni server in uscita verificate</string>
<string name="account_server_validation_error_unknown">Errore sconosciuto</string>
<string name="account_server_validation_sign_in">Accedi</string>
<string name="account_server_validation_outgoing_loading_error">Controllo impostazioni server in uscita non riuscito</string>
<string name="account_server_validation_incoming_success">Impostazioni server in arrivo verificate</string>
<string name="account_server_validation_incoming_loading_error">Controllo impostazioni server in arrivo non riuscito</string>
<string name="account_server_validation_error_server">Errore del server</string>
<string name="account_server_validation_error_missing_server_capability">Funzionalità del server mancante</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Impossibile accedere al certificato client</string>
<string name="account_server_validation_error_missing_server_capability_details">Al server manca questa funzionalità:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Il certificato client non è più valido</string>
<string name="account_server_validation_error_details">Dettagli:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">תעודת הלקוח כבר לא בתוקף</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">לא ניתן לגשת לתעודת הלקוח</string>
<string name="account_server_validation_error_missing_server_capability">יכולת שרת חסרה</string>
<string name="account_server_validation_error_details">פרטים:
\n%s</string>
<string name="account_server_validation_incoming_success">הגדרות שרת דואר נכנס אומתו</string>
<string name="account_server_validation_outgoing_loading_error">בדיקת הגדרות שרת דואר יוצא נכשלה</string>
<string name="account_server_validation_incoming_loading_error">בדיקת הגדרות שרת דואר נכנס נכשלה</string>
<string name="account_server_validation_outgoing_loading_message">הגדרות שרת דואר יוצא בבדיקה…</string>
<string name="account_server_validation_incoming_loading_message">הגדרות שרת דואר נכנס בבדיקה…</string>
<string name="account_server_validation_outgoing_success">הגדרות שרת דואר יוצא אומתו</string>
<string name="account_server_validation_sign_in">אנא התחבר</string>
<string name="account_server_validation_error_authentication">שגיאת אימות</string>
<string name="account_server_validation_error_network">שגיאת רשת</string>
<string name="account_server_validation_error_server">שגיאת שרת</string>
<string name="account_server_validation_error_unknown">שגיאה לא ידועה</string>
<string name="account_server_validation_error_missing_server_capability_details">היכולת הבאה חסרה לשרת:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">受信サーバーの設定を確認中…</string>
<string name="account_server_validation_error_authentication">認証エラー</string>
<string name="account_server_validation_outgoing_loading_message">送信サーバーの設定を確認中…</string>
<string name="account_server_validation_error_network">ネットワークエラー</string>
<string name="account_server_validation_outgoing_success">送信サーバーの設定を確認できました</string>
<string name="account_server_validation_error_unknown">不明なエラー</string>
<string name="account_server_validation_sign_in">ログインしてください</string>
<string name="account_server_validation_outgoing_loading_error">送信サーバーの設定の確認に失敗しました</string>
<string name="account_server_validation_incoming_success">受信サーバーの設定を確認できました</string>
<string name="account_server_validation_incoming_loading_error">受信サーバーの設定の確認に失敗しました</string>
<string name="account_server_validation_error_server">サーバーエラー</string>
<string name="account_server_validation_error_missing_server_capability">サーバーの機能が不足しています</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">クライアント証明書にアクセスできませんでした</string>
<string name="account_server_validation_error_missing_server_capability_details">この機能がサーバーにありません:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">このクライアント証明書の有効期限は満了しました</string>
<string name="account_server_validation_error_details">詳細:
\n%s</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Аутентификация қатесі</string>
<string name="account_server_validation_error_network">Желі қатесі</string>
<string name="account_server_validation_error_server">Сервер қатесі</string>
<string name="account_server_validation_error_unknown">Белгісіз қате</string>
<string name="account_server_validation_error_missing_server_capability">Сервер мүмкіндігі жоқ</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">만료된 클라이언트 인증서</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">클라이언트 인증서에 접근할 수 없습니다</string>
<string name="account_server_validation_error_missing_server_capability">서버 용량 부족</string>
<string name="account_server_validation_error_details">자세히:
\n%s</string>
<string name="account_server_validation_error_server">서버 오류</string>
<string name="account_server_validation_error_unknown">알수 없는 오류</string>
<string name="account_server_validation_error_authentication">인증 오류</string>
<string name="account_server_validation_error_network">네트워크 오류</string>
<string name="account_server_validation_sign_in">로그인이 필요합니다</string>
<string name="account_server_validation_outgoing_loading_error">발신 서버 설정을 확인하는데 실패했습니다</string>
<string name="account_server_validation_incoming_loading_error">수신 서버 설정을 확인하는데 실패했습니다</string>
<string name="account_server_validation_error_missing_server_capability_details">서버에 누락된 기능이 있습니다:
\n%s</string>
<string name="account_server_validation_outgoing_success">발신 서버 설정이 확인되었습니다</string>
<string name="account_server_validation_incoming_success">수신 서버 설정이 확인되었습니다</string>
<string name="account_server_validation_incoming_loading_message">수신 서버 설정을 확인하는 중…</string>
<string name="account_server_validation_outgoing_loading_message">발신 서버 설정을 확인하는 중…</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Kliento liudijimas nebegalioja</string>
<string name="account_server_validation_error_missing_server_capability">Serveryje trūksta galimybės</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Kliento liudijimo nepavykto pasiekti</string>
<string name="account_server_validation_error_details">Išsamiau:
\n%s</string>
<string name="account_server_validation_incoming_loading_message">Tikrinami gaunamų laiškų serverio parametrai…</string>
<string name="account_server_validation_sign_in">Prisijunkite</string>
<string name="account_server_validation_outgoing_success">Siunčiamų laiškų serverio parametrai patvirtinti</string>
<string name="account_server_validation_error_missing_server_capability_details">Serveryje trūksta šios galimybės:
\n%s</string>
<string name="account_server_validation_incoming_loading_error">Nepavyko patikrinti gaunamų laiškų serverio parametrų</string>
<string name="account_server_validation_incoming_success">Gaunamų laiškų serverio parametrai patvirtinti</string>
<string name="account_server_validation_outgoing_loading_message">Tikrinami siunčiamų laiškų serverio parametrai…</string>
<string name="account_server_validation_outgoing_loading_error">Nepavyko patikrinti siunčiamų laiškų serverio parametrų</string>
<string name="account_server_validation_error_authentication">Klaida nustatant tapatybę</string>
<string name="account_server_validation_error_network">Tinklo klaida</string>
<string name="account_server_validation_error_server">Serverio klaida</string>
<string name="account_server_validation_error_unknown">Nežinoma klaida</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Sjekker innstillinger for innkommende tjener …</string>
<string name="account_server_validation_error_authentication">Identitetsbekreftelsesfeil</string>
<string name="account_server_validation_outgoing_loading_message">Sjekker innstillinger for utgående tjener …</string>
<string name="account_server_validation_error_network">Nettverksfeil</string>
<string name="account_server_validation_outgoing_success">Innstillinger for utgående tjener er verifisert</string>
<string name="account_server_validation_error_unknown">Ukjent feil</string>
<string name="account_server_validation_sign_in">Logg inn</string>
<string name="account_server_validation_outgoing_loading_error">Kunne ikke sjekke innstillinger for utgående tjener</string>
<string name="account_server_validation_incoming_success">Innstillinger for innkommende tjener er verifisert</string>
<string name="account_server_validation_incoming_loading_error">Kunne ikke sjekke innstillinger for innkommende tjener</string>
<string name="account_server_validation_error_server">Tjenerfeil</string>
<string name="account_server_validation_error_missing_server_capability">Manglende serverkapasitet</string>
<string name="account_server_validation_error_client_certificate_expired">Klientsertifikatet er ikke lenger gyldig</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Fikk ikke tak i klientsertifikatet</string>
<string name="account_server_validation_error_details">Detaljer:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Tjeneren mangler denne egenskapen:
\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Instellingen voor inkomende server controleren…</string>
<string name="account_server_validation_error_authentication">Authenticatiefout</string>
<string name="account_server_validation_outgoing_loading_message">Instellingen voor uitgaande server controleren…</string>
<string name="account_server_validation_error_network">Netwerkfout</string>
<string name="account_server_validation_outgoing_success">Instellingen voor uitgaande server geverifieerd</string>
<string name="account_server_validation_error_unknown">Onbekende fout</string>
<string name="account_server_validation_sign_in">Meld u aan</string>
<string name="account_server_validation_outgoing_loading_error">Instellingen voor uitgaande server controleren mislukt</string>
<string name="account_server_validation_incoming_success">Instellingen voor inkomende server geverifieerd</string>
<string name="account_server_validation_incoming_loading_error">Instellingen voor inkomende server controleren mislukt</string>
<string name="account_server_validation_error_server">Serverfout</string>
<string name="account_server_validation_error_missing_server_capability">Ontbrekende serverfunctionaliteit</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Het clientcertificaat kon niet worden geraadpleegd</string>
<string name="account_server_validation_error_missing_server_capability_details">De server mist deze functionaliteit:\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Het clientcertificaat is niet langer geldig</string>
<string name="account_server_validation_error_details">Details:\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Klientsertifikatet er ikkje lenger gyldig</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Klarte ikkje å få tilgang til klientsertifikatet</string>
<string name="account_server_validation_error_missing_server_capability">Manglande serverkapasitet</string>
<string name="account_server_validation_error_missing_server_capability_details">Serveren manglar denne eigenskapen:\n%s</string>
<string name="account_server_validation_sign_in">Logg inn</string>
<string name="account_server_validation_error_unknown">Ukjend feil</string>
<string name="account_server_validation_error_network">Nettverksfeil</string>
<string name="account_server_validation_error_server">Tenarfeil</string>
<string name="account_server_validation_error_details">Detaljar:\n%s</string>
<string name="account_server_validation_error_authentication">Autentiseringsfeil</string>
<string name="account_server_validation_incoming_loading_message">Sjekker innkommande tenar-innstillingar…</string>
<string name="account_server_validation_incoming_loading_error">Sjekking av innkommande tenar-innstillingar feila</string>
<string name="account_server_validation_outgoing_loading_error">Sjekking av utgåande tenar-innstillingar feila</string>
<string name="account_server_validation_outgoing_success">Utgåande serverinnstillingar stadfesta</string>
<string name="account_server_validation_incoming_success">Innkomande serverinnstillingar stadfesta</string>
<string name="account_server_validation_outgoing_loading_message">Sjekkar utgåande tenar-innstillingar…</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Sprawdzanie ustawień serwera poczty przychodzącej…</string>
<string name="account_server_validation_error_authentication">Błąd autoryzacji</string>
<string name="account_server_validation_outgoing_loading_message">Sprawdzanie ustawień serwera poczty wychodzącej…</string>
<string name="account_server_validation_error_network">Błąd sieci</string>
<string name="account_server_validation_outgoing_success">Zweryfikowano ustawienia serwera poczty wychodzącej</string>
<string name="account_server_validation_error_unknown">Nieznany błąd</string>
<string name="account_server_validation_sign_in">Zaloguj się</string>
<string name="account_server_validation_outgoing_loading_error">Sprawdzanie ustawień serwera poczty wychodzącej nie powiodło się</string>
<string name="account_server_validation_incoming_success">Zweryfikowano ustawienia serwera poczty przychodzącej</string>
<string name="account_server_validation_incoming_loading_error">Sprawdzanie ustawień serwera poczty przychodzącej nie powiodło się</string>
<string name="account_server_validation_error_server">Błąd serwera</string>
<string name="account_server_validation_error_missing_server_capability">Brak możliwości serwera</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Nie można uzyskać dostępu do certyfikatu klienta</string>
<string name="account_server_validation_error_missing_server_capability_details">Serwerowi brakuje tej możliwości:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Certyfikat klienta nie jest już ważny</string>
<string name="account_server_validation_error_details">Szczegóły:
\n%s</string>
</resources>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Verificando configurações do servidor de recebimento…</string>
<string name="account_server_validation_error_authentication">Erro de autenticação</string>
<string name="account_server_validation_outgoing_loading_message">Verificando configurações do servidor de envio…</string>
<string name="account_server_validation_error_network">Erro de rede</string>
<string name="account_server_validation_outgoing_success">Configurações do servidor de envio verificadas</string>
<string name="account_server_validation_error_unknown">Erro desconhecido</string>
<string name="account_server_validation_sign_in">Entre na sua conta</string>
<string name="account_server_validation_outgoing_loading_error">Falha ao verificar configurações do servidor de envio</string>
<string name="account_server_validation_incoming_success">Configurações do servidor de recebimento verificadas</string>
<string name="account_server_validation_incoming_loading_error">Falha ao verificar configurações do servidor de recebimento</string>
<string name="account_server_validation_error_server">Erro do servidor</string>
<string name="account_server_validation_error_client_certificate_expired">O certificado do cliente não é mais válido</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">O certificado do cliente não pode ser acessado</string>
<string name="account_server_validation_error_missing_server_capability">Falta capacidade no servidor</string>
<string name="account_server_validation_error_details">Detalhes:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">O servidor não tem esta capacidade: \n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">A verificar as configurações do servidor de entrada…</string>
<string name="account_server_validation_error_missing_server_capability">Funcionalidade do servidor em falta</string>
<string name="account_server_validation_error_authentication">Erro de autenticação</string>
<string name="account_server_validation_outgoing_loading_message">A verificar as configurações do servidor de saída…</string>
<string name="account_server_validation_error_network">Erro de rede</string>
<string name="account_server_validation_outgoing_success">As configurações do servidor de saída verificadas</string>
<string name="account_server_validation_error_unknown">Erro desconhecido</string>
<string name="account_server_validation_sign_in">Por favor efectue log in</string>
<string name="account_server_validation_outgoing_loading_error">Falhou a verificação das configurações do servidor de saída</string>
<string name="account_server_validation_incoming_success">Configurações do servidor de entrada verificadas</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">O certificado do cliente não pode ser acedido</string>
<string name="account_server_validation_error_missing_server_capability_details">O servidor não tem esta funcionalidade:
\n%s</string>
<string name="account_server_validation_incoming_loading_error">Falhou a verificação das configurações do servidor de entrada</string>
<string name="account_server_validation_error_server">Erro de servidor</string>
<string name="account_server_validation_error_client_certificate_expired">O certificado do cliente já não é válido</string>
<string name="account_server_validation_error_details">Detalhes:
\n%s</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Verificarea setărilor serverului de intrare…</string>
<string name="account_server_validation_error_authentication">Eroare de autentificare</string>
<string name="account_server_validation_outgoing_loading_message">Verificarea setărilor serverului de expediere…</string>
<string name="account_server_validation_error_network">Eroare de rețea</string>
<string name="account_server_validation_outgoing_success">Setările serverului de ieșire sunt verificate</string>
<string name="account_server_validation_error_unknown">Eroare necunoscută</string>
<string name="account_server_validation_sign_in">Conectează-te</string>
<string name="account_server_validation_outgoing_loading_error">Verificarea setărilor serverului de ieșire a eșuat</string>
<string name="account_server_validation_incoming_success">Setările serverului de intrare sunt verificate</string>
<string name="account_server_validation_incoming_loading_error">Verificarea setărilor serverului de intrare a eșuat</string>
<string name="account_server_validation_error_server">Eroare de server</string>
<string name="account_server_validation_error_missing_server_capability">Lipsește capacitatea serverului</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Certificatul clientului nu a putut fi accesat</string>
<string name="account_server_validation_error_missing_server_capability_details">Serverului îi lipsește această capacitate:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Certificatul de client nu mai este valabil</string>
<string name="account_server_validation_error_details">Detalii:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Сертификат клиента больше не действителен</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Не удалось получить доступ к сертификату клиента</string>
<string name="account_server_validation_error_missing_server_capability">Отсутствующие возможности сервера</string>
<string name="account_server_validation_outgoing_loading_message">Проверка настроек исходящего сервера…</string>
<string name="account_server_validation_sign_in">Пожалуйста, войдите</string>
<string name="account_server_validation_error_missing_server_capability_details">На сервере отсутствует эта возможность:
\n%s</string>
<string name="account_server_validation_incoming_success">Настройки сервера входящих сообщений проверены</string>
<string name="account_server_validation_incoming_loading_error">Проверка параметров входящего сервера не удалась</string>
<string name="account_server_validation_outgoing_loading_error">Проверка настроек исходящего сервера не удалась</string>
<string name="account_server_validation_outgoing_success">Настройки исходящего сервера проверены</string>
<string name="account_server_validation_error_authentication">Ошибка аутентификации</string>
<string name="account_server_validation_error_network">Ошибка сети</string>
<string name="account_server_validation_incoming_loading_message">Проверка настроек входящего сервера…</string>
<string name="account_server_validation_error_server">Ошибка сервера</string>
<string name="account_server_validation_error_unknown">Неизвестная ошибка</string>
<string name="account_server_validation_error_details">Подробности:
\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_network">Chyba siete</string>
<string name="account_server_validation_outgoing_loading_message">Kontrolujú sa nastavenia servera odchádzajúcej pošty…</string>
<string name="account_server_validation_outgoing_success">Nastavenia servera odchádzajúcej pošty sú platné</string>
<string name="account_server_validation_outgoing_loading_error">Kontrola nastavení servera odchádzajúcej pošty zlyhala</string>
<string name="account_server_validation_incoming_success">Nastavenia servera prichádzajúcej pošty sú platné</string>
<string name="account_server_validation_incoming_loading_error">Chyba overovania nastavenia servera prichádzajúcej pošty</string>
<string name="account_server_validation_error_server">Chyba servera</string>
<string name="account_server_validation_error_unknown">Neznáma chyba</string>
<string name="account_server_validation_error_client_certificate_expired">Klientský certifikát už nie je platný</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Klientský certifikát nie je prístupný</string>
<string name="account_server_validation_error_missing_server_capability">Chýbajúca funkčnosť servera</string>
<string name="account_server_validation_error_missing_server_capability_details">Chýbajúca funkčnosť servera:\n%s</string>
<string name="account_server_validation_error_details">Podrobnosti:\n%s</string>
<string name="account_server_validation_incoming_loading_message">Overujem nastavenia servera prichádzajúcej pošty…</string>
<string name="account_server_validation_sign_in">Prosím prihláste sa</string>
<string name="account_server_validation_error_authentication">Chyba autentifikácie</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Potrdilo odjemalca ni več veljavno.</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Dostop do potrdila odjemalca ni bil mogoč.</string>
<string name="account_server_validation_error_missing_server_capability">Manjka zmogljivost strežnika.</string>
<string name="account_server_validation_incoming_loading_message">Preverjanje nastavitev dohodnega strežnika …</string>
<string name="account_server_validation_incoming_success">Nastavitve dohodnega strežnika so bile preverjene.</string>
<string name="account_server_validation_outgoing_loading_message">Preverjanje nastavitev odhodnega strežnika …</string>
<string name="account_server_validation_error_details">Podrobnosti:\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Strežniku manjka naslednja zmogljivost:\n%s</string>
<string name="account_server_validation_sign_in">Pred nadaljevanjem se je treba vpisati.</string>
<string name="account_server_validation_outgoing_loading_error">Preverjanje nastavitev odhodnega strežnika je spodletelo.</string>
<string name="account_server_validation_outgoing_success">Nastavitve odhodnega strežnika so bile preverjene.</string>
<string name="account_server_validation_error_authentication">Napaka overitve</string>
<string name="account_server_validation_error_network">Napaka omrežja</string>
<string name="account_server_validation_error_server">Napaka strežnika</string>
<string name="account_server_validation_error_unknown">Neznana napaka</string>
<string name="account_server_validation_incoming_loading_error">Preverjanje nastavitev dohodnega strežnika je spodletelo.</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Po kontrollohen rregullime shërbyesi marrjeje mesazhesh…</string>
<string name="account_server_validation_error_authentication">Gabim mirëfilltësimi</string>
<string name="account_server_validation_outgoing_loading_message">Po kontrollohen rregullime shërbyesi dërgimi mesazhesh…</string>
<string name="account_server_validation_error_network">Gabim rrjeti</string>
<string name="account_server_validation_outgoing_success">Rregullimet për shërbyes dërgimi mesazhesh janë verifikuar</string>
<string name="account_server_validation_error_unknown">Gabim i panjohur</string>
<string name="account_server_validation_sign_in">Ju lutemi, bëni hyrjen</string>
<string name="account_server_validation_outgoing_loading_error">Kontrolli i rregullimeve të shërbyesit të dërgimit të mesazheve dështoi</string>
<string name="account_server_validation_incoming_success">Rregullimet për shërbyes marrjeje mesazhesh janë verifikuar</string>
<string name="account_server_validation_incoming_loading_error">Kontrolli i rregullimeve të shërbyesit të marrjes së mesazheve dështoi</string>
<string name="account_server_validation_error_server">Gabim shërbyesi</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Su përdor dot dëshmia e klientit</string>
<string name="account_server_validation_error_missing_server_capability_details">Shërbyesit i mungon kjo aftësi: \n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Dëshmia e klientit sështë më e vlefshme</string>
<string name="account_server_validation_error_details">Hollësi: \n%s</string>
<string name="account_server_validation_error_missing_server_capability">Aftësi që i mungon shërbyesit</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Сертификат клијента више није важећи</string>
<string name="account_server_validation_error_details">Детаљи:
\n%s</string>
<string name="account_server_validation_incoming_loading_message">Провера подешавања долазног сервера…</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Није могуће приступити сертификату клијента</string>
<string name="account_server_validation_outgoing_loading_message">Провера подешавања одлазног сервера…</string>
<string name="account_server_validation_outgoing_loading_error">Провера подешавања одлазног сервера није успела</string>
<string name="account_server_validation_error_authentication">Грешка при аутентификацији</string>
<string name="account_server_validation_incoming_loading_error">Провера подешавања долазног сервера није успела</string>
<string name="account_server_validation_incoming_success">Подешавања долазног сервера су верификована</string>
<string name="account_server_validation_sign_in">Пријавите се</string>
<string name="account_server_validation_error_missing_server_capability_details">Серверу недостаје ова могућност:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability">Недостаје могућност сервера</string>
<string name="account_server_validation_outgoing_success">Подешавања одлазног сервера су верификована</string>
<string name="account_server_validation_error_network">Мрежна грешка</string>
<string name="account_server_validation_error_server">Грешка сервера</string>
<string name="account_server_validation_error_unknown">Непозната грешка</string>
</resources>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Kontrollerar inkommande serverinställningar…</string>
<string name="account_server_validation_error_unknown">Okänt fel</string>
<string name="account_server_validation_incoming_loading_error">Kontrollera inkommande serverinställningar misslyckades</string>
<string name="account_server_validation_error_server">Serverfel</string>
<string name="account_server_validation_error_authentication">Autentiseringsfel</string>
<string name="account_server_validation_outgoing_loading_message">Kontrollerar utgående serverinställningar…</string>
<string name="account_server_validation_error_network">Nätverksfel</string>
<string name="account_server_validation_outgoing_success">Utgående serverinställningar verifierade</string>
<string name="account_server_validation_sign_in">Var god logga in</string>
<string name="account_server_validation_outgoing_loading_error">Misslyckades att kontrollera inställningarna för utgående server</string>
<string name="account_server_validation_incoming_success">Inkommande serverinställningar verifierade</string>
<string name="account_server_validation_error_missing_server_capability">Serverkapacitet saknas</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Klientcertifikatet kunde inte nås</string>
<string name="account_server_validation_error_missing_server_capability_details">Servern saknar denna kapacitet:\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">Klientcertifikatet är inte längre giltigt</string>
<string name="account_server_validation_error_details">Detaljer:
\n%s</string>
</resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">கிளையன்ட் சான்றிதழ் இனி செல்லுபடியாகாது</string>
<string name="account_server_validation_error_details">விவரங்கள்:\n %s</string>
<string name="account_server_validation_error_missing_server_capability_details">சேவையகம் இந்த திறனைக் காணவில்லை:\n %s</string>
<string name="account_server_validation_incoming_loading_message">உள்வரும் சேவையக அமைப்புகளை சரிபார்க்கிறது…</string>
<string name="account_server_validation_incoming_loading_error">உள்வரும் சேவையக அமைப்புகளை சரிபார்க்கிறது</string>
<string name="account_server_validation_incoming_success">உள்வரும் சேவையக அமைப்புகள் சரிபார்க்கப்பட்டன</string>
<string name="account_server_validation_outgoing_loading_message">வெளிச்செல்லும் சேவையக அமைப்புகளைச் சரிபார்க்கிறது…</string>
<string name="account_server_validation_outgoing_loading_error">வெளிச்செல்லும் சேவையக அமைப்புகளைப் பார்ப்பது தோல்வியடைந்தது</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">கிளையன்ட் சான்றிதழை அணுக முடியவில்லை</string>
<string name="account_server_validation_error_missing_server_capability">சேவையக திறனைக் காணவில்லை</string>
<string name="account_server_validation_outgoing_success">வெளிச்செல்லும் சேவையக அமைப்புகள் சரிபார்க்கப்பட்டன</string>
<string name="account_server_validation_sign_in">தயவுசெய்து உள்நுழைக</string>
<string name="account_server_validation_error_authentication">அங்கீகார பிழை</string>
<string name="account_server_validation_error_network">பிணைய பிழை</string>
<string name="account_server_validation_error_server">சேவையக பிழை</string>
<string name="account_server_validation_error_unknown">தெரியாத பிழை</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">ผิดพลาดในการรับรองความถูกต้อง</string>
<string name="account_server_validation_error_network">เกิดข้อผิดพลาดของเครือข่าย</string>
<string name="account_server_validation_error_server">เกิดข้อผิดพลาดของเซิร์ฟเวอร์</string>
<string name="account_server_validation_error_unknown">เกิดข้อผิดพลาดที่ไม่ทราบ</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">ไม่สามารถเข้าถึงใบรับรองไคลเอนต์ได้</string>
<string name="account_server_validation_error_details">รายละเอียด:\n%s</string>
<string name="account_server_validation_incoming_loading_message">กำลังตรวจสอบตั้งค่าเซิร์ฟเวอร์ขาเข้า…</string>
<string name="account_server_validation_incoming_loading_error">ตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาเข้าล้มเหลว</string>
<string name="account_server_validation_incoming_success">ตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาเข้าแล้ว</string>
<string name="account_server_validation_outgoing_loading_message">กำลังตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาออก…</string>
<string name="account_server_validation_error_client_certificate_expired">ใบรับรองไคลเอนต์ไม่ถูกต้องอีกต่อไป</string>
<string name="account_server_validation_outgoing_loading_error">ตรวจสอบตั้งค่าเซิร์ฟเวอร์ขาออกล้มเหลว</string>
<string name="account_server_validation_outgoing_success">ตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาออกแล้ว</string>
<string name="account_server_validation_sign_in">กรุณาลงชื่อเข้าใช้</string>
<string name="account_server_validation_error_missing_server_capability_details">เซิร์ฟเวอร์ขาดความสามารถนี้:\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Gelen sunucusu ayarları denetleniyor…</string>
<string name="account_server_validation_error_authentication">Kimlik doğrulama hatası</string>
<string name="account_server_validation_outgoing_loading_message">Giden sunucusu ayarları denetleniyor…</string>
<string name="account_server_validation_error_network">Ağ hatası</string>
<string name="account_server_validation_outgoing_success">Giden sunucusu ayarları doğrulandı</string>
<string name="account_server_validation_error_unknown">Bilinmeyen hata</string>
<string name="account_server_validation_sign_in">Lütfen oturum açın</string>
<string name="account_server_validation_outgoing_loading_error">Giden sunucusu ayarlarının denetlenmesi başarısız oldu</string>
<string name="account_server_validation_incoming_success">Gelen sunucusu ayarları doğrulandı</string>
<string name="account_server_validation_incoming_loading_error">Gelen sunucusu ayarlarının denetlenmesi başarısız oldu</string>
<string name="account_server_validation_error_server">Sunucu hatası</string>
<string name="account_server_validation_error_missing_server_capability">Eksik sunucu özelliği</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">İstemci sertifikasına erişilemedi</string>
<string name="account_server_validation_error_missing_server_capability_details">Sunucuda aşağıdaki özellik eksik: \n%s</string>
<string name="account_server_validation_error_client_certificate_expired">İstemci sertifikası artık geçerli değil</string>
<string name="account_server_validation_error_details">Ayrıntılar: \n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_client_certificate_expired">Сертифікат клієнта більше недійсний</string>
<string name="account_server_validation_error_details">Подробиці:\n%s</string>
<string name="account_server_validation_incoming_loading_message">Перевірка налаштувань вхідного сервера…</string>
<string name="account_server_validation_incoming_loading_error">Не вдалося перевірити вхідні налаштування сервера</string>
<string name="account_server_validation_incoming_success">Налаштування вхідного сервера підтверджено</string>
<string name="account_server_validation_outgoing_loading_message">Перевірка налаштувань вихідного сервера…</string>
<string name="account_server_validation_outgoing_success">Налаштування вихідного сервера підтверджено</string>
<string name="account_server_validation_sign_in">Будь ласка, увійдіть</string>
<string name="account_server_validation_outgoing_loading_error">Не вдалося перевірити налаштування вихідного сервера</string>
<string name="account_server_validation_error_authentication">Помилка автентифікації</string>
<string name="account_server_validation_error_network">Помилка мережі</string>
<string name="account_server_validation_error_server">Помилка сервера</string>
<string name="account_server_validation_error_unknown">Невідома помилка</string>
<string name="account_server_validation_error_missing_server_capability">Відсутня можливість сервера</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Не вдалося отримати доступ до сертифіката клієнта</string>
<string name="account_server_validation_error_missing_server_capability_details">На сервері відсутня ця можливість:\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">Đang kiểm tra thiết đặt máy chủ thư đến…</string>
<string name="account_server_validation_error_authentication">Lỗi xác thực</string>
<string name="account_server_validation_outgoing_loading_message">Đang kiểm tra thiết đặt máy chủ thư đi…</string>
<string name="account_server_validation_error_network">Lỗi mạng</string>
<string name="account_server_validation_outgoing_success">Thiết đặt máy chủ gửi đi đã được xác thực</string>
<string name="account_server_validation_error_unknown">Lỗi không rõ</string>
<string name="account_server_validation_sign_in">Xin hãy đăng nhập</string>
<string name="account_server_validation_outgoing_loading_error">Kiểm tra thiết đặt máy chủ thư đi không thành công</string>
<string name="account_server_validation_incoming_success">Thiết đặt máy chủ gửi đến đã được xác thực</string>
<string name="account_server_validation_incoming_loading_error">Kiểm tra thiết đặt máy chủ thư đến không thành công</string>
<string name="account_server_validation_error_server">Lỗi máy chủ</string>
<string name="account_server_validation_error_client_certificate_expired">Chứng chỉ máy khánh không còn hợp lệ</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">Chứng chỉ máy khách không thể truy cập được</string>
<string name="account_server_validation_error_details">Chi tiết:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">Máy chủ không có khả năng này:
\n%s</string>
<string name="account_server_validation_error_missing_server_capability">Máy chủ không có khả năng</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">正在检查收件服务器设置…</string>
<string name="account_server_validation_error_authentication">身份验证错误</string>
<string name="account_server_validation_outgoing_loading_message">正在检查发件服务器设置…</string>
<string name="account_server_validation_error_network">网络错误</string>
<string name="account_server_validation_outgoing_success">发件服务器设置已验证</string>
<string name="account_server_validation_error_unknown">未知错误</string>
<string name="account_server_validation_sign_in">请登录</string>
<string name="account_server_validation_outgoing_loading_error">检查发件服务器设置失败</string>
<string name="account_server_validation_incoming_success">收件服务器设置已验证</string>
<string name="account_server_validation_incoming_loading_error">检查收件服务器设置失败</string>
<string name="account_server_validation_error_server">服务器错误</string>
<string name="account_server_validation_error_missing_server_capability">缺少服务器功能</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">无法访问客户端证书</string>
<string name="account_server_validation_error_missing_server_capability_details">服务器缺少此功能:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">客户端证书不再有效</string>
<string name="account_server_validation_error_details">详情:
\n%s</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_incoming_loading_message">正在檢查收件伺服器設定…</string>
<string name="account_server_validation_error_authentication">身分認證錯誤</string>
<string name="account_server_validation_outgoing_loading_message">正在檢查寄件伺服器設定…</string>
<string name="account_server_validation_error_network">網路錯誤</string>
<string name="account_server_validation_outgoing_success">傳出伺服器設定已驗證</string>
<string name="account_server_validation_error_unknown">未知錯誤</string>
<string name="account_server_validation_sign_in">請登入</string>
<string name="account_server_validation_outgoing_loading_error">檢查寄件伺服器設定失敗</string>
<string name="account_server_validation_incoming_success">傳入伺服器設定已驗證</string>
<string name="account_server_validation_incoming_loading_error">檢查收件伺服器設定失敗</string>
<string name="account_server_validation_error_server">伺服器錯誤</string>
<string name="account_server_validation_error_missing_server_capability">缺少伺服器功能</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">無法存取客戶端證書</string>
<string name="account_server_validation_error_missing_server_capability_details">伺服器缺少此功能:
\n%s</string>
<string name="account_server_validation_error_client_certificate_expired">用戶端憑證不再有效</string>
<string name="account_server_validation_error_details">詳情:
\n%s</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_server_validation_error_authentication">Authentication error</string>
<string name="account_server_validation_error_network">Network error</string>
<string name="account_server_validation_error_server">Server error</string>
<string name="account_server_validation_error_unknown">Unknown error</string>
<string name="account_server_validation_error_client_certificate_expired">The client certificate is no longer valid</string>
<string name="account_server_validation_error_client_certificate_retrieval_failure">"The client certificate couldn't be accessed"</string>
<string name="account_server_validation_error_missing_server_capability">Missing server capability</string>
<string name="account_server_validation_error_details">Details:\n%s</string>
<string name="account_server_validation_error_missing_server_capability_details">The server is missing this capability:\n%s</string>
<string name="account_server_validation_incoming_loading_message">Checking incoming server settings…</string>
<string name="account_server_validation_incoming_loading_error">Checking incoming server settings failed</string>
<string name="account_server_validation_incoming_success">Incoming server settings verified</string>
<string name="account_server_validation_outgoing_loading_message">Checking outgoing server settings…</string>
<string name="account_server_validation_outgoing_loading_error">Checking outgoing server settings failed</string>
<string name="account_server_validation_outgoing_success">Outgoing server settings verified</string>
<string name="account_server_validation_sign_in">Please sign in</string>
</resources>

View file

@ -0,0 +1,32 @@
package app.k9mail.feature.account.server.validation
import android.content.Context
import app.k9mail.feature.account.common.AccountCommonExternalContract
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.common.domain.entity.AccountState
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.certificate.ui.ServerCertificateErrorContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract
import org.junit.Test
import org.koin.test.KoinTest
import org.koin.test.verify.verify
class ServerValidationModuleKtTest : KoinTest {
@Test
fun `should have a valid di module`() {
featureAccountServerValidationModule.verify(
extraTypes = listOf(
ServerValidationContract.State::class,
AccountDomainContract.AccountStateRepository::class,
AccountCommonExternalContract.AccountStateLoader::class,
ServerCertificateDomainContract.ServerCertificateErrorRepository::class,
ServerCertificateErrorContract.State::class,
AccountState::class,
Context::class,
Boolean::class,
Class.forName("net.openid.appauth.AppAuthConfiguration").kotlin,
),
)
}
}

View file

@ -0,0 +1,13 @@
package app.k9mail.feature.account.server.validation.domain.usecase
import com.fsck.k9.mail.oauth.AuthStateStorage
class FakeAuthStateStorage(
private var authorizationState: String? = null,
) : AuthStateStorage {
override fun getAuthorizationState(): String? = authorizationState
override fun updateAuthorizationState(authorizationState: String?) {
this.authorizationState = authorizationState
}
}

View file

@ -0,0 +1,163 @@
package app.k9mail.feature.account.server.validation.domain.usecase
import assertk.assertThat
import assertk.assertions.isEqualTo
import com.fsck.k9.mail.AuthType
import com.fsck.k9.mail.ConnectionSecurity
import com.fsck.k9.mail.ServerSettings
import com.fsck.k9.mail.server.ServerSettingsValidationResult
import java.io.IOException
import kotlinx.coroutines.test.runTest
import org.junit.Test
class ValidateServerSettingsTest {
private val authStateStorage = FakeAuthStateStorage()
@Test
fun `should check with imap validator when protocol is imap`() = runTest {
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> ServerSettingsValidationResult.Success },
pop3Validator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed POP3")) },
smtpValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed SMTP")) },
)
val result = testSubject.execute(IMAP_SERVER_SETTINGS)
assertThat(result).isEqualTo(ServerSettingsValidationResult.Success)
}
@Test
fun `should check with imap validator when protocol is imap and return failure`() = runTest {
val failure = ServerSettingsValidationResult.ServerError("Failed")
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> failure },
pop3Validator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed POP3")) },
smtpValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed SMTP")) },
)
val result = testSubject.execute(IMAP_SERVER_SETTINGS)
assertThat(result).isEqualTo(failure)
}
@Test
fun `should check with pop3 validator when protocol is pop3`() = runTest {
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed IMAP")) },
pop3Validator = { _, _ -> ServerSettingsValidationResult.Success },
smtpValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed SMTP")) },
)
val result = testSubject.execute(POP3_SERVER_SETTINGS)
assertThat(result).isEqualTo(ServerSettingsValidationResult.Success)
}
@Test
fun `should check with pop3 validator when protocol is pop3 and return failure`() = runTest {
val failure = ServerSettingsValidationResult.ServerError("Failed POP3")
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed IMAP")) },
pop3Validator = { _, _ -> failure },
smtpValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed SMTP")) },
)
val result = testSubject.execute(POP3_SERVER_SETTINGS)
assertThat(result).isEqualTo(failure)
}
@Test
fun `should check with smtp validator when protocol is smtp`() = runTest {
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed IMAP")) },
pop3Validator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed POP3")) },
smtpValidator = { _, _ -> ServerSettingsValidationResult.Success },
)
val result = testSubject.execute(SMTP_SERVER_SETTINGS)
assertThat(result).isEqualTo(ServerSettingsValidationResult.Success)
}
@Test
fun `should check with smtp validator when protocol is smtp and return failure`() = runTest {
val failure = ServerSettingsValidationResult.ServerError("Failed SMTP")
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed IMAP")) },
pop3Validator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed POP3")) },
smtpValidator = { _, _ -> failure },
)
val result = testSubject.execute(SMTP_SERVER_SETTINGS)
assertThat(result).isEqualTo(failure)
}
@Test
fun `should validate successfully for demo settings`() = runTest {
val testSubject = ValidateServerSettings(
authStateStorage = authStateStorage,
imapValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed IMAP")) },
pop3Validator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed POP3")) },
smtpValidator = { _, _ -> ServerSettingsValidationResult.NetworkError(IOException("Failed SMTP")) },
)
val result = testSubject.execute(
ServerSettings(
type = "demo",
host = "demo.example.com",
port = 993,
connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED,
authenticationType = AuthType.PLAIN,
username = "user",
password = "password",
clientCertificateAlias = null,
),
)
assertThat(result).isEqualTo(ServerSettingsValidationResult.Success)
}
private companion object {
val IMAP_SERVER_SETTINGS = ServerSettings(
type = "imap",
host = "imap.example.com",
port = 993,
connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED,
authenticationType = AuthType.PLAIN,
username = "user",
password = "password",
clientCertificateAlias = null,
)
val POP3_SERVER_SETTINGS = ServerSettings(
type = "pop3",
host = "pop3.example.com",
port = 993,
connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED,
authenticationType = AuthType.PLAIN,
username = "user",
password = "password",
clientCertificateAlias = null,
)
val SMTP_SERVER_SETTINGS = ServerSettings(
type = "smtp",
host = "smtp.example.com",
port = 993,
connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED,
authenticationType = AuthType.PLAIN,
username = "user",
password = "password",
clientCertificateAlias = null,
)
}
}

View file

@ -0,0 +1,269 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.core.ui.compose.testing.mvi.assertThatAndMviTurbinesConsumed
import app.k9mail.core.ui.compose.testing.mvi.runMviTest
import app.k9mail.core.ui.compose.testing.mvi.turbinesWithInitialStateCheck
import app.k9mail.feature.account.common.data.InMemoryAccountStateRepository
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.common.domain.entity.AccountState
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.certificate.data.InMemoryServerCertificateErrorRepository
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Error
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import assertk.assertThat
import assertk.assertions.isEqualTo
import assertk.assertions.isTrue
import com.fsck.k9.mail.AuthType
import com.fsck.k9.mail.ConnectionSecurity
import com.fsck.k9.mail.ServerSettings
import com.fsck.k9.mail.server.ServerSettingsValidationResult
import kotlinx.coroutines.delay
import net.thunderbird.core.testing.coroutines.MainDispatcherRule
import org.junit.Rule
import org.junit.Test
abstract class BaseServerValidationViewModelTest<T : BaseServerValidationViewModel> {
@get:Rule
val mainDispatcherRule = MainDispatcherRule()
@Test
fun `should update state when LoadAccountStateAndValidate event received and validate`() = runMviTest {
val accountState = if (isIncomingValidation) {
AccountState(
incomingServerSettings = SERVER_SETTINGS,
)
} else {
AccountState(
outgoingServerSettings = SERVER_SETTINGS,
)
}
val initialState = State(
serverSettings = null,
isLoading = true,
error = Error.ServerError("server error"),
isSuccess = true,
)
val testSubject = createTestSubject(
accountState = accountState,
initialState = initialState,
)
val turbines = turbinesWithInitialStateCheck(testSubject, initialState)
val expectedState = State(
serverSettings = SERVER_SETTINGS,
isLoading = false,
error = null,
isSuccess = false,
)
testSubject.event(Event.LoadAccountStateAndValidate)
assertThat(turbines.awaitStateItem()).isEqualTo(expectedState)
val loadingState = expectedState.copy(isLoading = true)
assertThat(turbines.awaitStateItem()).isEqualTo(loadingState)
val successState = loadingState.copy(isLoading = false, isSuccess = true)
assertThatAndMviTurbinesConsumed(
actual = turbines.stateTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(successState)
}
}
@Test
fun `should fail when ValidateServerSettings event received and server settings null`() = runMviTest {
val initialState = State()
val testSubject = createTestSubject()
val turbines = turbinesWithInitialStateCheck(testSubject, initialState)
testSubject.event(Event.ValidateServerSettings)
val errorState = initialState.copy(
error = Error.UnknownError("Server settings not set"),
)
assertThatAndMviTurbinesConsumed(
actual = turbines.stateTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(errorState)
}
}
@Test
fun `should validate server settings when ValidateServerSettings event received`() = runMviTest {
val initialState = State(
serverSettings = SERVER_SETTINGS,
)
val testSubject = createTestSubject(
serverSettingsValidationResult = ServerSettingsValidationResult.Success,
initialState = initialState,
)
val turbines = turbinesWithInitialStateCheck(testSubject, initialState)
testSubject.event(Event.ValidateServerSettings)
val loadingState = initialState.copy(isLoading = true)
assertThat(turbines.stateTurbine.awaitItem()).isEqualTo(loadingState)
val successState = loadingState.copy(
isLoading = false,
isSuccess = true,
)
assertThat(turbines.stateTurbine.awaitItem()).isEqualTo(successState)
assertThatAndMviTurbinesConsumed(
actual = turbines.effectTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(Effect.NavigateNext)
}
}
@Test
fun `should set error state when ValidateServerSettings received and check settings failed`() = runMviTest {
val initialState = State(
serverSettings = SERVER_SETTINGS,
)
val testSubject = createTestSubject(
serverSettingsValidationResult = ServerSettingsValidationResult.ServerError("server error"),
initialState = initialState,
)
val turbines = turbinesWithInitialStateCheck(testSubject, initialState)
testSubject.event(Event.ValidateServerSettings)
val loadingState = initialState.copy(isLoading = true)
assertThat(turbines.stateTurbine.awaitItem()).isEqualTo(loadingState)
val failureState = loadingState.copy(
isLoading = false,
error = Error.ServerError("server error"),
)
assertThatAndMviTurbinesConsumed(
actual = turbines.stateTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(failureState)
}
}
@Test
fun `should emit effect NavigateNext when ValidateConfig is successful`() = runMviTest {
val initialState = State(
serverSettings = SERVER_SETTINGS,
isSuccess = true,
)
val testSubject = createTestSubject(
initialState = initialState,
)
val turbines = turbinesWithInitialStateCheck(testSubject, initialState)
testSubject.event(Event.ValidateServerSettings)
assertThatAndMviTurbinesConsumed(
actual = turbines.effectTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(Effect.NavigateNext)
}
}
@Test
fun `should emit NavigateBack effect when OnBackClicked event received`() = runMviTest {
val testSubject = createTestSubject()
val turbines = turbinesWithInitialStateCheck(testSubject, State())
testSubject.event(Event.OnBackClicked)
assertThatAndMviTurbinesConsumed(
actual = turbines.effectTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(Effect.NavigateBack)
}
}
@Test
fun `should clear error and trigger check settings when OnRetryClicked event received`() = runMviTest {
val initialState = State(
serverSettings = SERVER_SETTINGS,
error = Error.ServerError("server error"),
)
var checkSettingsCalled = false
val testSubject = createTestSubject(
validateServerSettings = {
delay(50)
checkSettingsCalled = true
ServerSettingsValidationResult.Success
},
accountStateRepository = InMemoryAccountStateRepository(),
authorizationStateRepository = { true },
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
initialState = initialState,
)
val turbines = turbinesWithInitialStateCheck(testSubject, initialState)
testSubject.event(Event.OnRetryClicked)
val stateWithoutError = initialState.copy(error = null)
assertThat(turbines.stateTurbine.awaitItem()).isEqualTo(stateWithoutError)
val loadingState = stateWithoutError.copy(isLoading = true)
assertThat(turbines.stateTurbine.awaitItem()).isEqualTo(loadingState)
val successState = loadingState.copy(isLoading = false, isSuccess = true)
assertThat(turbines.stateTurbine.awaitItem()).isEqualTo(successState)
assertThat(checkSettingsCalled).isTrue()
assertThatAndMviTurbinesConsumed(
actual = turbines.effectTurbine.awaitItem(),
turbines = turbines,
) {
isEqualTo(Effect.NavigateNext)
}
}
abstract fun createTestSubject(
serverSettingsValidationResult: ServerSettingsValidationResult = ServerSettingsValidationResult.Success,
accountState: AccountState = AccountState(),
initialState: State = State(),
): T
abstract fun createTestSubject(
accountStateRepository: AccountDomainContract.AccountStateRepository,
validateServerSettings: ServerValidationDomainContract.UseCase.ValidateServerSettings,
authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
oAuthViewModel: AccountOAuthContract.ViewModel,
initialState: State,
): T
abstract val isIncomingValidation: Boolean
protected companion object {
val SERVER_SETTINGS = ServerSettings(
type = "imap",
host = "imap.example.com",
port = 465,
connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED,
authenticationType = AuthType.PLAIN,
username = "username",
password = "password",
clientCertificateAlias = null,
)
}
}

View file

@ -0,0 +1,26 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel
class FakeServerValidationViewModel(
override val oAuthViewModel: AccountOAuthContract.ViewModel = FakeAccountOAuthViewModel(),
override val isIncomingValidation: Boolean = true,
initialState: State = State(),
) : BaseViewModel<State, Event, Effect>(initialState), ViewModel {
val events = mutableListOf<Event>()
override fun event(event: Event) {
events.add(event)
}
fun effect(effect: Effect) {
emitEffect(effect)
}
}

View file

@ -0,0 +1,77 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.feature.account.common.data.InMemoryAccountStateRepository
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.common.domain.entity.AccountState
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.certificate.data.InMemoryServerCertificateErrorRepository
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Error
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import assertk.assertThat
import assertk.assertions.isTrue
import com.fsck.k9.mail.server.ServerSettingsValidationResult
import kotlinx.coroutines.delay
import org.junit.Test
class IncomingServerValidationViewModelTest : BaseServerValidationViewModelTest<IncomingServerValidationViewModel>() {
@Test
fun `should set isIncoming to true`() {
val testSubject = createTestSubject(
serverSettingsValidationResult = ServerSettingsValidationResult.Success,
accountState = AccountState(
incomingServerSettings = SERVER_SETTINGS,
),
initialState = State(
serverSettings = null,
isLoading = true,
error = Error.ServerError("server error"),
isSuccess = true,
),
)
assertThat(testSubject.isIncomingValidation).isTrue()
}
override fun createTestSubject(
serverSettingsValidationResult: ServerSettingsValidationResult,
accountState: AccountState,
initialState: State,
): IncomingServerValidationViewModel {
return IncomingServerValidationViewModel(
validateServerSettings = {
delay(50)
serverSettingsValidationResult
},
accountStateRepository = InMemoryAccountStateRepository(
state = accountState,
),
authorizationStateRepository = { true },
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
initialState = initialState,
)
}
override fun createTestSubject(
accountStateRepository: AccountDomainContract.AccountStateRepository,
validateServerSettings: ServerValidationDomainContract.UseCase.ValidateServerSettings,
authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
oAuthViewModel: AccountOAuthContract.ViewModel,
initialState: State,
) = IncomingServerValidationViewModel(
accountStateRepository = accountStateRepository,
validateServerSettings = validateServerSettings,
authorizationStateRepository = authorizationStateRepository,
certificateErrorRepository = certificateErrorRepository,
oAuthViewModel = oAuthViewModel,
initialState = initialState,
)
override val isIncomingValidation: Boolean = true
}

View file

@ -0,0 +1,77 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.feature.account.common.data.InMemoryAccountStateRepository
import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.common.domain.entity.AccountState
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.fake.FakeAccountOAuthViewModel
import app.k9mail.feature.account.server.certificate.data.InMemoryServerCertificateErrorRepository
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Error
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import assertk.assertThat
import assertk.assertions.isFalse
import com.fsck.k9.mail.server.ServerSettingsValidationResult
import kotlinx.coroutines.delay
import org.junit.Test
class OutgoingServerValidationViewModelTest : BaseServerValidationViewModelTest<OutgoingServerValidationViewModel>() {
@Test
fun `should set isIncoming to false`() {
val testSubject = createTestSubject(
serverSettingsValidationResult = ServerSettingsValidationResult.Success,
accountState = AccountState(
outgoingServerSettings = SERVER_SETTINGS,
),
initialState = State(
serverSettings = null,
isLoading = true,
error = Error.ServerError("server error"),
isSuccess = true,
),
)
assertThat(testSubject.isIncomingValidation).isFalse()
}
override fun createTestSubject(
serverSettingsValidationResult: ServerSettingsValidationResult,
accountState: AccountState,
initialState: State,
): OutgoingServerValidationViewModel {
return OutgoingServerValidationViewModel(
validateServerSettings = {
delay(50)
serverSettingsValidationResult
},
accountStateRepository = InMemoryAccountStateRepository(
state = accountState,
),
authorizationStateRepository = { true },
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
initialState = initialState,
)
}
override fun createTestSubject(
accountStateRepository: AccountDomainContract.AccountStateRepository,
validateServerSettings: ServerValidationDomainContract.UseCase.ValidateServerSettings,
authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
oAuthViewModel: AccountOAuthContract.ViewModel,
initialState: State,
) = OutgoingServerValidationViewModel(
accountStateRepository = accountStateRepository,
validateServerSettings = validateServerSettings,
authorizationStateRepository = authorizationStateRepository,
certificateErrorRepository = certificateErrorRepository,
oAuthViewModel = oAuthViewModel,
initialState = initialState,
)
override val isIncomingValidation: Boolean = false
}

View file

@ -0,0 +1,48 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import assertk.assertThat
import assertk.assertions.isEqualTo
import kotlinx.coroutines.test.runTest
import net.thunderbird.core.common.provider.BrandNameProvider
import org.junit.Test
class ServerValidationScreenKtTest : ComposeTest() {
@Test
fun `should delegate navigation effects`() = runTest {
val initialState = State()
val viewModel = FakeServerValidationViewModel(initialState = initialState)
var onNextCounter = 0
var onBackCounter = 0
setContentWithTheme {
ServerValidationScreen(
onNext = { onNextCounter++ },
onBack = { onBackCounter++ },
viewModel = viewModel,
brandNameProvider = FakeBrandNameProvider,
)
}
assertThat(onNextCounter).isEqualTo(0)
assertThat(onBackCounter).isEqualTo(0)
viewModel.effect(Effect.NavigateNext)
assertThat(onNextCounter).isEqualTo(1)
assertThat(onBackCounter).isEqualTo(0)
viewModel.effect(Effect.NavigateBack)
assertThat(onNextCounter).isEqualTo(1)
assertThat(onBackCounter).isEqualTo(1)
}
private object FakeBrandNameProvider : BrandNameProvider {
override val brandName: String = "K-9 Mail"
}
}

View file

@ -0,0 +1,23 @@
package app.k9mail.feature.account.server.validation.ui
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.State
import assertk.assertThat
import assertk.assertions.isEqualTo
import org.junit.Test
class ServerValidationStateTest {
@Test
fun `should set default values`() {
val state = State()
assertThat(state).isEqualTo(
State(
serverSettings = null,
isSuccess = false,
error = null,
isLoading = false,
),
)
}
}