mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-27 19:19:21 +03:00
Merge branch 'master' into plugin-2fa
This commit is contained in:
commit
868f7a4b0a
13 changed files with 48 additions and 58 deletions
|
|
@ -47,7 +47,11 @@ abort = (sAction, bClearOnly) => {
|
|||
fetchJSON = (action, sGetAdd, params, timeout, jsonCallback) => {
|
||||
sGetAdd = pString(sGetAdd);
|
||||
params = params || {};
|
||||
params.Action = action;
|
||||
if (params instanceof FormData) {
|
||||
params.set('Action', action);
|
||||
} else {
|
||||
params.Action = action;
|
||||
}
|
||||
let init = {};
|
||||
if (window.AbortController) {
|
||||
abort(action);
|
||||
|
|
|
|||
|
|
@ -50,20 +50,10 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sEmail
|
||||
* @param {string} sLogin
|
||||
* @param {string} sPassword
|
||||
* @param {boolean} bSignMe
|
||||
* @param {string=} sLanguage
|
||||
* @param {FormData} oData
|
||||
*/
|
||||
login(fCallback, sEmail, sPassword, bSignMe, sLanguage) {
|
||||
this.defaultRequest(fCallback, 'Login', {
|
||||
Email: sEmail,
|
||||
Login: '',
|
||||
Password: sPassword,
|
||||
Language: sLanguage || '',
|
||||
SignMe: bSignMe ? 1 : 0
|
||||
});
|
||||
login(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'Login', oData);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -16,18 +16,9 @@ import { AbstractViewCenter } from 'Knoin/AbstractViews';
|
|||
|
||||
import { LanguagesPopupView } from 'View/Popup/Languages';
|
||||
|
||||
const
|
||||
LoginSignMeType = {
|
||||
DefaultOff: 0,
|
||||
DefaultOn: 1,
|
||||
Unused: 2
|
||||
},
|
||||
|
||||
LoginSignMeTypeAsString = {
|
||||
DefaultOff: 'defaultoff',
|
||||
DefaultOn: 'defaulton',
|
||||
Unused: 'unused'
|
||||
};
|
||||
const SignMeOff = 0,
|
||||
SignMeOn = 1,
|
||||
SignMeUnused = 2;
|
||||
|
||||
|
||||
class LoginUserView extends AbstractViewCenter {
|
||||
|
|
@ -52,7 +43,7 @@ class LoginUserView extends AbstractViewCenter {
|
|||
|
||||
langRequest: false,
|
||||
|
||||
signMeType: LoginSignMeType.Unused
|
||||
signMeType: SignMeUnused
|
||||
});
|
||||
|
||||
this.formError = ko.observable(false).extend({ falseTimeout: 500 });
|
||||
|
|
@ -68,19 +59,17 @@ class LoginUserView extends AbstractViewCenter {
|
|||
|
||||
languageFullName: () => convertLangName(this.language()),
|
||||
|
||||
signMeVisibility: () => LoginSignMeType.Unused !== this.signMeType()
|
||||
signMeVisibility: () => SignMeUnused !== this.signMeType()
|
||||
});
|
||||
|
||||
this.addSubscribables({
|
||||
email: () => {
|
||||
this.emailError(false);
|
||||
},
|
||||
email: () => this.emailError(false),
|
||||
|
||||
password: () => this.passwordError(false),
|
||||
|
||||
submitError: value => value || this.submitErrorAddidional(''),
|
||||
|
||||
signMeType: iValue => this.signMe(LoginSignMeType.DefaultOn === iValue),
|
||||
signMeType: iValue => this.signMe(SignMeOn === iValue),
|
||||
|
||||
language: value => {
|
||||
this.langRequest(true);
|
||||
|
|
@ -104,17 +93,18 @@ class LoginUserView extends AbstractViewCenter {
|
|||
}
|
||||
|
||||
submitCommand(self, event) {
|
||||
let email = this.email().trim(),
|
||||
valid = event.target.form.reportValidity() && email,
|
||||
pass = this.password();
|
||||
let form = event.target.form,
|
||||
data = new FormData(form),
|
||||
valid = form.reportValidity();
|
||||
|
||||
this.emailError(!email);
|
||||
this.passwordError(!pass);
|
||||
this.emailError(!this.email());
|
||||
this.passwordError(!this.password());
|
||||
this.formError(!valid);
|
||||
|
||||
if (valid) {
|
||||
this.submitRequest(true);
|
||||
|
||||
data.set('Language', this.bSendLanguage ? this.language() : '');
|
||||
data.set('SignMe', this.signMe() ? 1 : 0);
|
||||
Remote.login(
|
||||
(iError, oData) => {
|
||||
if (iError) {
|
||||
|
|
@ -129,10 +119,7 @@ class LoginUserView extends AbstractViewCenter {
|
|||
rl.route.reload();
|
||||
}
|
||||
},
|
||||
email,
|
||||
pass,
|
||||
!!this.signMe(),
|
||||
this.bSendLanguage ? this.language() : ''
|
||||
data
|
||||
);
|
||||
|
||||
Local.set(ClientSideKeyName.LastSignMe, this.signMe() ? '-1-' : '-0-');
|
||||
|
|
@ -147,29 +134,28 @@ class LoginUserView extends AbstractViewCenter {
|
|||
|
||||
onBuild() {
|
||||
const signMeLocal = Local.get(ClientSideKeyName.LastSignMe),
|
||||
signMe = (SettingsGet('SignMe') || 'unused').toLowerCase();
|
||||
signMe = (SettingsGet('SignMe') || '').toLowerCase();
|
||||
|
||||
switch (signMe) {
|
||||
case LoginSignMeTypeAsString.DefaultOff:
|
||||
case LoginSignMeTypeAsString.DefaultOn:
|
||||
case 'defaultoff':
|
||||
case 'defaulton':
|
||||
this.signMeType(
|
||||
LoginSignMeTypeAsString.DefaultOn === signMe ? LoginSignMeType.DefaultOn : LoginSignMeType.DefaultOff
|
||||
'defaulton' === signMe ? SignMeOn : SignMeOff
|
||||
);
|
||||
|
||||
switch (signMeLocal) {
|
||||
case '-1-':
|
||||
this.signMeType(LoginSignMeType.DefaultOn);
|
||||
this.signMeType(SignMeOn);
|
||||
break;
|
||||
case '-0-':
|
||||
this.signMeType(LoginSignMeType.DefaultOff);
|
||||
this.signMeType(SignMeOff);
|
||||
break;
|
||||
// no default
|
||||
}
|
||||
|
||||
break;
|
||||
case LoginSignMeTypeAsString.Unused:
|
||||
default:
|
||||
this.signMeType(LoginSignMeType.Unused);
|
||||
this.signMeType(SignMeUnused);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
14
dev/bootstrap.js
vendored
14
dev/bootstrap.js
vendored
|
|
@ -94,10 +94,7 @@ export default App => {
|
|||
if (postData) {
|
||||
init.method = 'POST';
|
||||
init.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
|
||||
postData.XToken = Settings.app('token');
|
||||
// init.body = JSON.stringify(postData);
|
||||
const formData = new FormData(),
|
||||
buildFormData = (formData, data, parentKey) => {
|
||||
const buildFormData = (formData, data, parentKey) => {
|
||||
if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) {
|
||||
Object.keys(data).forEach(key =>
|
||||
buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key)
|
||||
|
|
@ -105,9 +102,14 @@ export default App => {
|
|||
} else {
|
||||
formData.set(parentKey, data == null ? '' : data);
|
||||
}
|
||||
return formData;
|
||||
};
|
||||
buildFormData(formData, postData);
|
||||
init.body = new URLSearchParams(formData);
|
||||
postData = (postData instanceof FormData)
|
||||
? postData
|
||||
: buildFormData(new FormData(), postData);
|
||||
postData.set('XToken', Settings.app('token'));
|
||||
// init.body = JSON.stringify(Object.fromEntries(postData));
|
||||
init.body = new URLSearchParams(postData);
|
||||
}
|
||||
|
||||
return fetch(resource, init).then(response => {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Benutzer",
|
||||
"LABEL_PASSWORD": "Passwort",
|
||||
"LABEL_TOTP": "TOTP-Code",
|
||||
"BUTTON_LOGIN": "Im Adminpanel anmelden"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Login",
|
||||
"LABEL_PASSWORD": "Password",
|
||||
"LABEL_TOTP": "TOTP code",
|
||||
"BUTTON_LOGIN": "Log into the admin panel"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Ingresar",
|
||||
"LABEL_PASSWORD": "Contraseña",
|
||||
"LABEL_TOTP": "Código TOTP",
|
||||
"BUTTON_LOGIN": "Ingresar al panel de control"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Identifiant",
|
||||
"LABEL_PASSWORD": "Mot de passe",
|
||||
"LABEL_TOTP": "Code TOTP",
|
||||
"BUTTON_LOGIN": "Se connecter au panneau d'administration"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Belépés",
|
||||
"LABEL_PASSWORD": "Jelszó",
|
||||
"LABEL_TOTP": "TOTP kód",
|
||||
"BUTTON_LOGIN": "Bejelentkezés az admin felületre"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Inlognaam",
|
||||
"LABEL_PASSWORD": "Wachtwoord",
|
||||
"LABEL_TOTP": "TOTP-code",
|
||||
"BUTTON_LOGIN": "Aanmelden in het beheer paneel"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "Logga in",
|
||||
"LABEL_PASSWORD": "Lösenord",
|
||||
"LABEL_TOTP": "TOTP-kod",
|
||||
"BUTTON_LOGIN": "Logga in till admin-panelen"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"LOGIN": {
|
||||
"LABEL_LOGIN": "登录",
|
||||
"LABEL_PASSWORD": "密码",
|
||||
"LABEL_TOTP": "TOTP代碼",
|
||||
"BUTTON_LOGIN": "登录到控制面板"
|
||||
},
|
||||
"TOP_PANEL": {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
data-bind="submit: submitForm, css: {'errorAnimated': formError, 'submitting': submitRequest()}">
|
||||
<div class="controls" data-bind="css: {'error': emailError}">
|
||||
<div class="input-append">
|
||||
<input required="" type="text" class="input-block-level inputIcon" pattern="[^@\s]+(@[^\s]+)?" inputmode="email"
|
||||
<input name="Email" required="" type="text" class="input-block-level inputIcon" pattern="[^@\s]+(@[^\s]+)?" inputmode="email"
|
||||
autofocus="" autocomplete="email" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: email, disable: submitRequest"
|
||||
data-i18n="[placeholder]GLOBAL/EMAIL" />
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
</div>
|
||||
<div class="controls" data-bind="css: {'error': passwordError}">
|
||||
<div class="input-append">
|
||||
<input required="" type="password" class="input-block-level inputIcon"
|
||||
<input name="Password" required="" type="password" class="input-block-level inputIcon"
|
||||
autocomplete="current-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: password, disable: submitRequest"
|
||||
data-i18n="[placeholder]GLOBAL/PASSWORD" />
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue