application.ini login_lowercase should be configurable per domain

This commit is contained in:
the-djmaze 2024-03-12 22:11:32 +01:00
parent 4ebb3e7082
commit e04cc1080a
34 changed files with 106 additions and 24 deletions

View file

@ -26,6 +26,7 @@ const
imapType: 0, imapType: 0,
imapTimeout: 300, imapTimeout: 300,
imapShortLogin: false, imapShortLogin: false,
imapLowerLogin: false,
// SSL // SSL
imapSslVerify_peer: false, imapSslVerify_peer: false,
imapSslAllow_self_signed: false, imapSslAllow_self_signed: false,
@ -50,6 +51,7 @@ const
smtpType: 0, smtpType: 0,
smtpTimeout: 60, smtpTimeout: 60,
smtpShortLogin: false, smtpShortLogin: false,
smtpLowerLogin: false,
smtpUseAuth: true, smtpUseAuth: true,
smtpSetSender: false, smtpSetSender: false,
smtpAuthPlainLine: false, smtpAuthPlainLine: false,
@ -69,6 +71,7 @@ const
secure: pInt(oDomain.imapType()), secure: pInt(oDomain.imapType()),
timeout: oDomain.imapTimeout, timeout: oDomain.imapTimeout,
shortLogin: !!oDomain.imapShortLogin(), shortLogin: !!oDomain.imapShortLogin(),
lowerLogin: !!oDomain.imapLowerLogin(),
ssl: { ssl: {
verify_peer: !!oDomain.imapSslVerify_peer(), verify_peer: !!oDomain.imapSslVerify_peer(),
verify_peer_name: !!oDomain.imapSslVerify_peer(), verify_peer_name: !!oDomain.imapSslVerify_peer(),
@ -92,6 +95,7 @@ const
secure: pInt(oDomain.smtpType()), secure: pInt(oDomain.smtpType()),
timeout: oDomain.smtpTimeout, timeout: oDomain.smtpTimeout,
shortLogin: !!oDomain.smtpShortLogin(), shortLogin: !!oDomain.smtpShortLogin(),
lowerLogin: !!oDomain.smtpLowerLogin(),
ssl: { ssl: {
verify_peer: !!oDomain.smtpSslVerify_peer(), verify_peer: !!oDomain.smtpSslVerify_peer(),
verify_peer_name: !!oDomain.smtpSslVerify_peer(), verify_peer_name: !!oDomain.smtpSslVerify_peer(),
@ -109,6 +113,7 @@ const
secure: pInt(oDomain.sieveType()), secure: pInt(oDomain.sieveType()),
timeout: oDomain.sieveTimeout, timeout: oDomain.sieveTimeout,
shortLogin: !!oDomain.imapShortLogin(), shortLogin: !!oDomain.imapShortLogin(),
lowerLogin: !!oDomain.imapLowerLogin(),
ssl: { ssl: {
verify_peer: !!oDomain.imapSslVerify_peer(), verify_peer: !!oDomain.imapSslVerify_peer(),
verify_peer_name: !!oDomain.imapSslVerify_peer(), verify_peer_name: !!oDomain.imapSslVerify_peer(),

View file

@ -5,6 +5,7 @@
"type": 0, "type": 0,
"timeout": 300, "timeout": 300,
"shortLogin": false, "shortLogin": false,
"lowerLogin": true,
"sasl": [ "sasl": [
"SCRAM-SHA3-512", "SCRAM-SHA3-512",
"SCRAM-SHA-512", "SCRAM-SHA-512",
@ -39,6 +40,7 @@
"type": 0, "type": 0,
"timeout": 60, "timeout": 60,
"shortLogin": false, "shortLogin": false,
"lowerLogin": true,
"sasl": [ "sasl": [
"SCRAM-SHA3-512", "SCRAM-SHA3-512",
"SCRAM-SHA-512", "SCRAM-SHA-512",
@ -65,6 +67,7 @@
"type": 0, "type": 0,
"timeout": 10, "timeout": 10,
"shortLogin": false, "shortLogin": false,
"lowerLogin": true,
"sasl": [ "sasl": [
"SCRAM-SHA3-512", "SCRAM-SHA3-512",
"SCRAM-SHA-512", "SCRAM-SHA-512",

View file

@ -35,9 +35,11 @@ class ConnectSettings implements \JsonSerializable
public SSLContext $ssl; public SSLContext $ssl;
// public bool $tls_weak = false; // public bool $tls_weak = false;
// Authentication settings use by all child classes // Authentication settings used by all child classes
public bool $useAuth = true; public bool $useAuth = true;
public bool $shortLogin = false; public bool $shortLogin = false;
public bool $lowerLogin = true;
public string $stripLogin = '';
public array $SASLMechanisms = [ public array $SASLMechanisms = [
// https://github.com/the-djmaze/snappymail/issues/182 // https://github.com/the-djmaze/snappymail/issues/182
'SCRAM-SHA3-512', 'SCRAM-SHA3-512',
@ -77,11 +79,37 @@ class ConnectSettings implements \JsonSerializable
$this->passphrase = \is_string($value) ? new SensitiveString($value) : $value; $this->passphrase = \is_string($value) ? new SensitiveString($value) : $value;
} }
if ('username' === $name || 'login' === $name) { if ('username' === $name || 'login' === $name) {
$this->username = \SnappyMail\IDN::emailToAscii($value); $this->username = $this->fixUsername($value);
// $this->username = \SnappyMail\IDN::emailToAscii(\MailSo\Base\Utils::Trim($value));
} }
} }
public function fixUsername(string $value, bool $allowShorten = true) : string
{
$value = \SnappyMail\IDN::emailToAscii($value);
// $value = \SnappyMail\IDN::emailToAscii(\MailSo\Base\Utils::Trim($value));
// Strip the domain part
if ($this->shortLogin && $allowShorten) {
$value = \MailSo\Base\Utils::getEmailAddressLocalPart($value);
}
// Convert to lowercase
if ($this->lowerLogin) {
$value = \mb_strtolower($value);
}
// Strip certain characters
if ($this->stripLogin) {
$value = \explode('@', $value);
if (isset($value[1])) {
$domain = \array_pop($value);
}
$value = \str_replace(\str_split($this->stripLogin), '', $value);
if (isset($value[1])) {
$value[] = $domain;
}
$value = \implode('@', $value);
}
return $value;
}
public static function fromArray(array $aSettings) : self public static function fromArray(array $aSettings) : self
{ {
$object = new static; $object = new static;
@ -92,6 +120,12 @@ class ConnectSettings implements \JsonSerializable
$object->timeout = $aSettings['timeout']; $object->timeout = $aSettings['timeout'];
} }
$object->shortLogin = !empty($aSettings['shortLogin']); $object->shortLogin = !empty($aSettings['shortLogin']);
if (isset($aSettings['lowerLogin'])) {
$object->lowerLogin = !empty($aSettings['lowerLogin']);
}
if (isset($aSettings['stripLogin'])) {
$object->stripLogin = $aSettings['stripLogin'];
}
$object->ssl = SSLContext::fromArray($aSettings['ssl'] ?? []); $object->ssl = SSLContext::fromArray($aSettings['ssl'] ?? []);
if (!empty($aSettings['sasl']) && \is_array($aSettings['sasl'])) { if (!empty($aSettings['sasl']) && \is_array($aSettings['sasl'])) {
$object->SASLMechanisms = $aSettings['sasl']; $object->SASLMechanisms = $aSettings['sasl'];
@ -110,6 +144,8 @@ class ConnectSettings implements \JsonSerializable
'type' => $this->type, 'type' => $this->type,
'timeout' => $this->timeout, 'timeout' => $this->timeout,
'shortLogin' => $this->shortLogin, 'shortLogin' => $this->shortLogin,
'lowerLogin' => $this->lowerLogin,
'stripLogin' => $this->stripLogin,
'sasl' => $this->SASLMechanisms, 'sasl' => $this->SASLMechanisms,
'ssl' => $this->ssl 'ssl' => $this->ssl
// 'tls_weak' => $this->tls_weak // 'tls_weak' => $this->tls_weak

View file

@ -26,15 +26,13 @@ trait UserAuth
public function resolveLoginCredentials(string &$sEmail, \SnappyMail\SensitiveString $oPassword, string &$sLogin): void public function resolveLoginCredentials(string &$sEmail, \SnappyMail\SensitiveString $oPassword, string &$sLogin): void
{ {
$sEmail = \SnappyMail\IDN::emailToAscii(\MailSo\Base\Utils::Trim($sEmail)); $sEmail = \SnappyMail\IDN::emailToAscii(\MailSo\Base\Utils::Trim($sEmail));
if ($this->Config()->Get('login', 'login_lowercase', true)) {
$sEmail = \mb_strtolower($sEmail);
}
$this->Plugins()->RunHook('login.credentials.step-1', array(&$sEmail)); $this->Plugins()->RunHook('login.credentials.step-1', array(&$sEmail));
$oDomain = null;
$oDomainProvider = $this->DomainProvider();
if (!\str_contains($sEmail, '@')) { if (!\str_contains($sEmail, '@')) {
$this->logWrite("The email address '{$sEmail}' is incomplete", \LOG_INFO, 'LOGIN'); $this->logWrite("The email address '{$sEmail}' is incomplete", \LOG_INFO, 'LOGIN');
$oDomain = null;
if ($this->Config()->Get('login', 'determine_user_domain', false)) { if ($this->Config()->Get('login', 'determine_user_domain', false)) {
// $sUserHost = \SnappyMail\IDN::toAscii($this->Http()->GetHost(false, true)); // $sUserHost = \SnappyMail\IDN::toAscii($this->Http()->GetHost(false, true));
$sUserHost = \strtolower(\idn_to_ascii($this->Http()->GetHost(false, true))); $sUserHost = \strtolower(\idn_to_ascii($this->Http()->GetHost(false, true)));
@ -42,7 +40,6 @@ trait UserAuth
$aDomainParts = \explode('.', $sUserHost); $aDomainParts = \explode('.', $sUserHost);
$iLimit = \min(\count($aDomainParts), 14); $iLimit = \min(\count($aDomainParts), 14);
$oDomainProvider = $this->DomainProvider();
while (0 < $iLimit--) { while (0 < $iLimit--) {
$sLine = \implode('.', $aDomainParts); $sLine = \implode('.', $aDomainParts);
$oDomain = $oDomainProvider->Load($sLine, false); $oDomain = $oDomainProvider->Load($sLine, false);
@ -92,8 +89,11 @@ trait UserAuth
$this->logMask($sPassword); $this->logMask($sPassword);
$sLogin = $sEmail; $sLogin = $sEmail;
if ($this->Config()->Get('login', 'login_lowercase', true)) { if (\str_contains($sEmail, '@')
$sLogin = \mb_strtolower($sLogin); && ($oDomain || ($oDomain = $oDomainProvider->Load(\MailSo\Base\Utils::getEmailAddressDomain($sEmail))))
) {
$sEmail = $oDomain->ImapSettings()->fixUsername($sEmail, false);
$sLogin = $oDomain->ImapSettings()->fixUsername($sLogin);
} }
$this->Plugins()->RunHook('login.credentials', array(&$sEmail, &$sLogin, &$sPassword)); $this->Plugins()->RunHook('login.credentials', array(&$sEmail, &$sLogin, &$sPassword));

View file

@ -282,8 +282,6 @@ When this value is gethostname, the gethostname() value is used.
'determine_user_language' => array(true, 'Detect language from browser header `Accept-Language`'), 'determine_user_language' => array(true, 'Detect language from browser header `Accept-Language`'),
'determine_user_domain' => array(false, 'Like default_domain but then HTTP_HOST/SERVER_NAME without www.'), 'determine_user_domain' => array(false, 'Like default_domain but then HTTP_HOST/SERVER_NAME without www.'),
'login_lowercase' => array(true),
'sign_me_auto' => array(\RainLoop\Enumerations\SignMeType::DefaultOff, 'sign_me_auto' => array(\RainLoop\Enumerations\SignMeType::DefaultOff,
'This option allows webmail to remember the logged in user 'This option allows webmail to remember the logged in user
once they closed the browser window. once they closed the browser window.

View file

@ -35,9 +35,7 @@ abstract class Account implements \JsonSerializable
public function IncLogin() : string public function IncLogin() : string
{ {
return $this->oDomain->ImapSettings()->shortLogin return $this->sLogin;
? \MailSo\Base\Utils::getEmailAddressLocalPart($this->sLogin)
: $this->sLogin;
} }
public function IncPassword() : string public function IncPassword() : string
@ -47,10 +45,7 @@ abstract class Account implements \JsonSerializable
public function OutLogin() : string public function OutLogin() : string
{ {
$sSmtpLogin = $this->sSmtpLogin ?: $this->sLogin; return $this->sSmtpLogin ?: $this->sLogin;
return $this->oDomain->SmtpSettings()->shortLogin
? \MailSo\Base\Utils::getEmailAddressLocalPart($sSmtpLogin)
: $sSmtpLogin;
} }
public function Domain() : Domain public function Domain() : Domain

View file

@ -108,12 +108,12 @@ class Domain implements \JsonSerializable
{ {
$sW = \trim($this->whiteList); $sW = \trim($this->whiteList);
if ($sW) { if ($sW) {
$sEmail = \mb_strtolower($sEmail); $sEmail = $this->IMAP->fixUsername($sEmail);
$sLogin = \mb_strtolower($sLogin); $sLogin = $this->IMAP->fixUsername($sLogin);
$sUserPart = \MailSo\Base\Utils::getEmailAddressLocalPart($sLogin ?: $sEmail); $sUserPart = \MailSo\Base\Utils::getEmailAddressLocalPart($sLogin ?: $sEmail);
$sItem = \strtok($sW, " ;,\n"); $sItem = \strtok($sW, " ;,\n");
while (false !== $sItem) { while (false !== $sItem) {
$sItem = \mb_strtolower(\idn_to_ascii(\trim($sItem))); $sItem = $this->IMAP->fixUsername(\trim($sItem));
if ($sItem && ( if ($sItem && (
$sLogin === $sItem || $sEmail === $sItem $sLogin === $sItem || $sEmail === $sItem
|| $sUserPart === $sItem || \str_starts_with($sItem, "{$sUserPart}@") || $sUserPart === $sItem || \str_starts_with($sItem, "{$sUserPart}@")

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Žádné", "SECURE_OPTION_NONE": "Žádné",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Povolit SIEVE skripty", "LABEL_ALLOW_SIEVE_SCRIPTS": "Povolit SIEVE skripty",
"LABEL_USE_SHORT_LOGIN": "Používat krátký login", "LABEL_USE_SHORT_LOGIN": "Používat krátký login",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Používat autorizaci", "LABEL_USE_AUTH": "Používat autorizaci",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Ingen", "SECURE_OPTION_NONE": "Ingen",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Tillad sieve skripts", "LABEL_ALLOW_SIEVE_SCRIPTS": "Tillad sieve skripts",
"LABEL_USE_SHORT_LOGIN": "Brug kort log ind", "LABEL_USE_SHORT_LOGIN": "Brug kort log ind",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Brug godkendelse", "LABEL_USE_AUTH": "Brug godkendelse",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Ohne", "SECURE_OPTION_NONE": "Ohne",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Sieve-Skripte erlauben", "LABEL_ALLOW_SIEVE_SCRIPTS": "Sieve-Skripte erlauben",
"LABEL_USE_SHORT_LOGIN": "Kurze Benutzernamen verwenden", "LABEL_USE_SHORT_LOGIN": "Kurze Benutzernamen verwenden",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Authentifizierung verwenden", "LABEL_USE_AUTH": "Authentifizierung verwenden",
"LABEL_SET_SENDER": "Verwenden Sie die Anmeldung als Absender", "LABEL_SET_SENDER": "Verwenden Sie die Anmeldung als Absender",
"LABEL_AUTH_PLAIN_LINE": "Erzwinge einzelnen AUTH PLAIN Befehl bei der Anmeldung", "LABEL_AUTH_PLAIN_LINE": "Erzwinge einzelnen AUTH PLAIN Befehl bei der Anmeldung",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "None", "SECURE_OPTION_NONE": "None",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Allow sieve scripts", "LABEL_ALLOW_SIEVE_SCRIPTS": "Allow sieve scripts",
"LABEL_USE_SHORT_LOGIN": "Use short login", "LABEL_USE_SHORT_LOGIN": "Use short login",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Use authentication", "LABEL_USE_AUTH": "Use authentication",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Ninguno", "SECURE_OPTION_NONE": "Ninguno",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts de filtro", "LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts de filtro",
"LABEL_USE_SHORT_LOGIN": "Inicio de Sesión corto", "LABEL_USE_SHORT_LOGIN": "Inicio de Sesión corto",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Usar autenticación", "LABEL_USE_AUTH": "Usar autenticación",
"LABEL_SET_SENDER": "Usar inicio de sesión como remitente", "LABEL_SET_SENDER": "Usar inicio de sesión como remitente",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Bat ere ez", "SECURE_OPTION_NONE": "Bat ere ez",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Onartu sieve scriptak", "LABEL_ALLOW_SIEVE_SCRIPTS": "Onartu sieve scriptak",
"LABEL_USE_SHORT_LOGIN": "Erabili login motza", "LABEL_USE_SHORT_LOGIN": "Erabili login motza",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Erabili autentikazioa", "LABEL_USE_AUTH": "Erabili autentikazioa",
"LABEL_SET_SENDER": "Erabili logina bidaltzaile bezala", "LABEL_SET_SENDER": "Erabili logina bidaltzaile bezala",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "هیچ‌کدام", "SECURE_OPTION_NONE": "هیچ‌کدام",
"LABEL_ALLOW_SIEVE_SCRIPTS": "اجازه به اجرا‌شونده‌های sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "اجازه به اجرا‌شونده‌های sieve",
"LABEL_USE_SHORT_LOGIN": "استفاده از ورود کوتاه بدون دامنه", "LABEL_USE_SHORT_LOGIN": "استفاده از ورود کوتاه بدون دامنه",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "استفاده از احراز هویت", "LABEL_USE_AUTH": "استفاده از احراز هویت",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Ei mitään", "SECURE_OPTION_NONE": "Ei mitään",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Salli sieve skriptit", "LABEL_ALLOW_SIEVE_SCRIPTS": "Salli sieve skriptit",
"LABEL_USE_SHORT_LOGIN": "Käytä lyhyttä kirjautumista", "LABEL_USE_SHORT_LOGIN": "Käytä lyhyttä kirjautumista",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Käytä tunnistautumista", "LABEL_USE_AUTH": "Käytä tunnistautumista",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Aucun", "SECURE_OPTION_NONE": "Aucun",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Autoriser les scripts sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Autoriser les scripts sieve",
"LABEL_USE_SHORT_LOGIN": "Utiliser l'identifiant court", "LABEL_USE_SHORT_LOGIN": "Utiliser l'identifiant court",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Utiliser l'authentification", "LABEL_USE_AUTH": "Utiliser l'authentification",
"LABEL_SET_SENDER": "Utiliser la connexion en tant qu'expéditeur", "LABEL_SET_SENDER": "Utiliser la connexion en tant qu'expéditeur",
"LABEL_AUTH_PLAIN_LINE": "Forcer l'authentification AUTH PLAIN", "LABEL_AUTH_PLAIN_LINE": "Forcer l'authentification AUTH PLAIN",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Semmi", "SECURE_OPTION_NONE": "Semmi",
"LABEL_ALLOW_SIEVE_SCRIPTS": "SIEVE szkriptek engedélyezése", "LABEL_ALLOW_SIEVE_SCRIPTS": "SIEVE szkriptek engedélyezése",
"LABEL_USE_SHORT_LOGIN": "Rövid felhasználónév használata", "LABEL_USE_SHORT_LOGIN": "Rövid felhasználónév használata",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Hitelesítés használata", "LABEL_USE_AUTH": "Hitelesítés használata",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Tidak satupun", "SECURE_OPTION_NONE": "Tidak satupun",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Izinkan script sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Izinkan script sieve",
"LABEL_USE_SHORT_LOGIN": "Gunakan login singkat", "LABEL_USE_SHORT_LOGIN": "Gunakan login singkat",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Gunakan otentikasi", "LABEL_USE_AUTH": "Gunakan otentikasi",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "None", "SECURE_OPTION_NONE": "None",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permetti scripts sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Permetti scripts sieve",
"LABEL_USE_SHORT_LOGIN": "Usa login breve", "LABEL_USE_SHORT_LOGIN": "Usa login breve",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Usa autenticazione", "LABEL_USE_AUTH": "Usa autenticazione",
"LABEL_SET_SENDER": "Usa login come mittente", "LABEL_SET_SENDER": "Usa login come mittente",
"LABEL_AUTH_PLAIN_LINE": "Force login a comando singolo AUTH PLAIN", "LABEL_AUTH_PLAIN_LINE": "Force login a comando singolo AUTH PLAIN",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "なし", "SECURE_OPTION_NONE": "なし",
"LABEL_ALLOW_SIEVE_SCRIPTS": "SIEVEスクリプトを使用する", "LABEL_ALLOW_SIEVE_SCRIPTS": "SIEVEスクリプトを使用する",
"LABEL_USE_SHORT_LOGIN": "短いログイン名を使う", "LABEL_USE_SHORT_LOGIN": "短いログイン名を使う",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "認証を使用する", "LABEL_USE_AUTH": "認証を使用する",
"LABEL_SET_SENDER": "ログイン名を送信者として使う", "LABEL_SET_SENDER": "ログイン名を送信者として使う",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Nėra", "SECURE_OPTION_NONE": "Nėra",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Leisti sieve programavimą", "LABEL_ALLOW_SIEVE_SCRIPTS": "Leisti sieve programavimą",
"LABEL_USE_SHORT_LOGIN": "Naudoti trumpą prisijungimo vardą", "LABEL_USE_SHORT_LOGIN": "Naudoti trumpą prisijungimo vardą",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Naudoti autentifikavimą ", "LABEL_USE_AUTH": "Naudoti autentifikavimą ",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Ingen", "SECURE_OPTION_NONE": "Ingen",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Tillat sieve-skript", "LABEL_ALLOW_SIEVE_SCRIPTS": "Tillat sieve-skript",
"LABEL_USE_SHORT_LOGIN": "Bruk forkortet brukernavn", "LABEL_USE_SHORT_LOGIN": "Bruk forkortet brukernavn",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Bruk autentisering", "LABEL_USE_AUTH": "Bruk autentisering",
"LABEL_SET_SENDER": "Bruk pålogging som avsender", "LABEL_SET_SENDER": "Bruk pålogging som avsender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Geen", "SECURE_OPTION_NONE": "Geen",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Sta Sieve scripts toe", "LABEL_ALLOW_SIEVE_SCRIPTS": "Sta Sieve scripts toe",
"LABEL_USE_SHORT_LOGIN": "Gebruik verkorte login", "LABEL_USE_SHORT_LOGIN": "Gebruik verkorte login",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Gebruik authenticatie", "LABEL_USE_AUTH": "Gebruik authenticatie",
"LABEL_SET_SENDER": "Gebruik login als verzender", "LABEL_SET_SENDER": "Gebruik login als verzender",
"LABEL_AUTH_PLAIN_LINE": "Forceer een enkele opdracht AUTH PLAIN-aanmelding", "LABEL_AUTH_PLAIN_LINE": "Forceer een enkele opdracht AUTH PLAIN-aanmelding",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Bez zabezpieczeń", "SECURE_OPTION_NONE": "Bez zabezpieczeń",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Zezwól na skrypty sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Zezwól na skrypty sieve",
"LABEL_USE_SHORT_LOGIN": "Użyj krótkiego loginu", "LABEL_USE_SHORT_LOGIN": "Użyj krótkiego loginu",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Użyj uwierzytelnienia", "LABEL_USE_AUTH": "Użyj uwierzytelnienia",
"LABEL_SET_SENDER": "Użyj loginu jako nadawcy", "LABEL_SET_SENDER": "Użyj loginu jako nadawcy",
"LABEL_AUTH_PLAIN_LINE": "Wymuś logowanie pojedynczą komendą AUTH PLAIN", "LABEL_AUTH_PLAIN_LINE": "Wymuś logowanie pojedynczą komendą AUTH PLAIN",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Nenhuma", "SECURE_OPTION_NONE": "Nenhuma",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve",
"LABEL_USE_SHORT_LOGIN": "Usar login curto", "LABEL_USE_SHORT_LOGIN": "Usar login curto",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Usar autenticação", "LABEL_USE_AUTH": "Usar autenticação",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Nenhuma", "SECURE_OPTION_NONE": "Nenhuma",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve",
"LABEL_USE_SHORT_LOGIN": "Usar nome de utilizador curto", "LABEL_USE_SHORT_LOGIN": "Usar nome de utilizador curto",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Usar autenticação", "LABEL_USE_AUTH": "Usar autenticação",
"LABEL_SET_SENDER": "Usar nome de utilizador como remetente", "LABEL_SET_SENDER": "Usar nome de utilizador como remetente",
"LABEL_AUTH_PLAIN_LINE": "Forçar comando AUTH PLAIN único para autenticar", "LABEL_AUTH_PLAIN_LINE": "Forçar comando AUTH PLAIN único para autenticar",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Nenhuma", "SECURE_OPTION_NONE": "Nenhuma",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve",
"LABEL_USE_SHORT_LOGIN": "Usar nome de utilizador curto", "LABEL_USE_SHORT_LOGIN": "Usar nome de utilizador curto",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Usar autenticação", "LABEL_USE_AUTH": "Usar autenticação",
"LABEL_SET_SENDER": "Usar nome de utilizador como remetente", "LABEL_SET_SENDER": "Usar nome de utilizador como remetente",
"LABEL_AUTH_PLAIN_LINE": "Forçar comando AUTH PLAIN único para autenticar", "LABEL_AUTH_PLAIN_LINE": "Forçar comando AUTH PLAIN único para autenticar",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Нет", "SECURE_OPTION_NONE": "Нет",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Разрешить Sieve сценарии", "LABEL_ALLOW_SIEVE_SCRIPTS": "Разрешить Sieve сценарии",
"LABEL_USE_SHORT_LOGIN": "Использовать короткий логин", "LABEL_USE_SHORT_LOGIN": "Использовать короткий логин",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Использовать аутентификацию", "LABEL_USE_AUTH": "Использовать аутентификацию",
"LABEL_SET_SENDER": "Использовать логин в качестве отправителя", "LABEL_SET_SENDER": "Использовать логин в качестве отправителя",
"LABEL_AUTH_PLAIN_LINE": "Принудительный вход командой AUTH PLAIN", "LABEL_AUTH_PLAIN_LINE": "Принудительный вход командой AUTH PLAIN",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Žiadne", "SECURE_OPTION_NONE": "Žiadne",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Povoliť Sieve skripty", "LABEL_ALLOW_SIEVE_SCRIPTS": "Povoliť Sieve skripty",
"LABEL_USE_SHORT_LOGIN": "Použiť skrátené prihlásenie", "LABEL_USE_SHORT_LOGIN": "Použiť skrátené prihlásenie",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Použiť overenie", "LABEL_USE_AUTH": "Použiť overenie",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Nobeno", "SECURE_OPTION_NONE": "Nobeno",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Dovoljene sieve skripte", "LABEL_ALLOW_SIEVE_SCRIPTS": "Dovoljene sieve skripte",
"LABEL_USE_SHORT_LOGIN": "Uporaba uporabniškega imena brez domene", "LABEL_USE_SHORT_LOGIN": "Uporaba uporabniškega imena brez domene",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Uporaba overjanja", "LABEL_USE_AUTH": "Uporaba overjanja",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Ingen", "SECURE_OPTION_NONE": "Ingen",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Tillåta sikt skript", "LABEL_ALLOW_SIEVE_SCRIPTS": "Tillåta sikt skript",
"LABEL_USE_SHORT_LOGIN": "Använda korta inloggning", "LABEL_USE_SHORT_LOGIN": "Använda korta inloggning",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Använd autentisering", "LABEL_USE_AUTH": "Använd autentisering",
"LABEL_SET_SENDER": "Use login as sender", "LABEL_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Không có", "SECURE_OPTION_NONE": "Không có",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Cho phép script của sieve", "LABEL_ALLOW_SIEVE_SCRIPTS": "Cho phép script của sieve",
"LABEL_USE_SHORT_LOGIN": "Dùng đăng nhập ngắn", "LABEL_USE_SHORT_LOGIN": "Dùng đăng nhập ngắn",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "Dùng xác minh", "LABEL_USE_AUTH": "Dùng xác minh",
"LABEL_SET_SENDER": "Dùng tên đăng nhập là email người dùng", "LABEL_SET_SENDER": "Dùng tên đăng nhập là email người dùng",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login", "LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "无", "SECURE_OPTION_NONE": "无",
"LABEL_ALLOW_SIEVE_SCRIPTS": "可使用筛选脚本", "LABEL_ALLOW_SIEVE_SCRIPTS": "可使用筛选脚本",
"LABEL_USE_SHORT_LOGIN": "使用短用户名登录", "LABEL_USE_SHORT_LOGIN": "使用短用户名登录",
"LABEL_LOWERCASE_LOGIN": "Lowercase login (case-insensitive)",
"LABEL_USE_AUTH": "使用认证", "LABEL_USE_AUTH": "使用认证",
"LABEL_SET_SENDER": "使用登录名作为发件人", "LABEL_SET_SENDER": "使用登录名作为发件人",
"LABEL_AUTH_PLAIN_LINE": "强制单一 AUTH PLAIN 命令登录", "LABEL_AUTH_PLAIN_LINE": "强制单一 AUTH PLAIN 命令登录",

View file

@ -60,7 +60,17 @@
value: imapShortLogin value: imapShortLogin
} }
}"></div> }"></div>
<span style="opacity:0.7"> (user@domain.com → user)</span> <span style="opacity:0.7"> (user@example.com → user)</span>
<span style="opacity:0.7"> (user@example.com → user)</span>
<br>
<div style="display: inline-block;" data-bind="component: {
name: 'Checkbox',
params: {
label: 'POPUPS_DOMAIN/LABEL_LOWERCASE_LOGIN',
value: imapLowerLogin
}
}"></div>
<span style="opacity:0.7"> (USER@example.com → user@example.com)</span>
<h4>SSL/TLS</h4> <h4>SSL/TLS</h4>
<div data-bind="component: { <div data-bind="component: {
@ -157,7 +167,16 @@
value: smtpShortLogin value: smtpShortLogin
} }
}"></div> }"></div>
<span style="opacity:0.7"> (user@domain.com → user)</span> <span style="opacity:0.7"> (user@example.com → user)</span>
<br>
<div style="display: inline-block;" data-bind="component: {
name: 'Checkbox',
params: {
label: 'POPUPS_DOMAIN/LABEL_LOWERCASE_LOGIN',
value: smtpLowerLogin
}
}"></div>
<span style="opacity:0.7"> (USER@example.com → user@example.com)</span>
<div data-bind="component: { <div data-bind="component: {
name: 'Checkbox', name: 'Checkbox',
params: { params: {