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

View file

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

View file

@ -35,9 +35,11 @@ class ConnectSettings implements \JsonSerializable
public SSLContext $ssl;
// 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 $shortLogin = false;
public bool $lowerLogin = true;
public string $stripLogin = '';
public array $SASLMechanisms = [
// https://github.com/the-djmaze/snappymail/issues/182
'SCRAM-SHA3-512',
@ -77,11 +79,37 @@ class ConnectSettings implements \JsonSerializable
$this->passphrase = \is_string($value) ? new SensitiveString($value) : $value;
}
if ('username' === $name || 'login' === $name) {
$this->username = \SnappyMail\IDN::emailToAscii($value);
// $this->username = \SnappyMail\IDN::emailToAscii(\MailSo\Base\Utils::Trim($value));
$this->username = $this->fixUsername($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
{
$object = new static;
@ -92,6 +120,12 @@ class ConnectSettings implements \JsonSerializable
$object->timeout = $aSettings['timeout'];
}
$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'] ?? []);
if (!empty($aSettings['sasl']) && \is_array($aSettings['sasl'])) {
$object->SASLMechanisms = $aSettings['sasl'];
@ -110,6 +144,8 @@ class ConnectSettings implements \JsonSerializable
'type' => $this->type,
'timeout' => $this->timeout,
'shortLogin' => $this->shortLogin,
'lowerLogin' => $this->lowerLogin,
'stripLogin' => $this->stripLogin,
'sasl' => $this->SASLMechanisms,
'ssl' => $this->ssl
// 'tls_weak' => $this->tls_weak

View file

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

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_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,
'This option allows webmail to remember the logged in user
once they closed the browser window.

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Semmi",
"LABEL_ALLOW_SIEVE_SCRIPTS": "SIEVE szkriptek engedélyezése",
"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_SET_SENDER": "Use login as sender",
"LABEL_AUTH_PLAIN_LINE": "Force single command AUTH PLAIN login",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -136,6 +136,7 @@
"SECURE_OPTION_NONE": "Không có",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Cho phép script của sieve",
"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_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",

View file

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

View file

@ -60,7 +60,17 @@
value: imapShortLogin
}
}"></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>
<div data-bind="component: {
@ -157,7 +167,16 @@
value: smtpShortLogin
}
}"></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: {
name: 'Checkbox',
params: {