Merge branch 'master' into plugin-2fa

This commit is contained in:
djmaze 2021-07-23 11:58:18 +02:00
commit 868f7a4b0a
13 changed files with 48 additions and 58 deletions

View file

@ -47,7 +47,11 @@ abort = (sAction, bClearOnly) => {
fetchJSON = (action, sGetAdd, params, timeout, jsonCallback) => { fetchJSON = (action, sGetAdd, params, timeout, jsonCallback) => {
sGetAdd = pString(sGetAdd); sGetAdd = pString(sGetAdd);
params = params || {}; params = params || {};
params.Action = action; if (params instanceof FormData) {
params.set('Action', action);
} else {
params.Action = action;
}
let init = {}; let init = {};
if (window.AbortController) { if (window.AbortController) {
abort(action); abort(action);

View file

@ -50,20 +50,10 @@ class RemoteUserFetch extends AbstractFetchRemote {
/** /**
* @param {?Function} fCallback * @param {?Function} fCallback
* @param {string} sEmail * @param {FormData} oData
* @param {string} sLogin
* @param {string} sPassword
* @param {boolean} bSignMe
* @param {string=} sLanguage
*/ */
login(fCallback, sEmail, sPassword, bSignMe, sLanguage) { login(fCallback, oData) {
this.defaultRequest(fCallback, 'Login', { this.defaultRequest(fCallback, 'Login', oData);
Email: sEmail,
Login: '',
Password: sPassword,
Language: sLanguage || '',
SignMe: bSignMe ? 1 : 0
});
} }
/** /**

View file

@ -16,18 +16,9 @@ import { AbstractViewCenter } from 'Knoin/AbstractViews';
import { LanguagesPopupView } from 'View/Popup/Languages'; import { LanguagesPopupView } from 'View/Popup/Languages';
const const SignMeOff = 0,
LoginSignMeType = { SignMeOn = 1,
DefaultOff: 0, SignMeUnused = 2;
DefaultOn: 1,
Unused: 2
},
LoginSignMeTypeAsString = {
DefaultOff: 'defaultoff',
DefaultOn: 'defaulton',
Unused: 'unused'
};
class LoginUserView extends AbstractViewCenter { class LoginUserView extends AbstractViewCenter {
@ -52,7 +43,7 @@ class LoginUserView extends AbstractViewCenter {
langRequest: false, langRequest: false,
signMeType: LoginSignMeType.Unused signMeType: SignMeUnused
}); });
this.formError = ko.observable(false).extend({ falseTimeout: 500 }); this.formError = ko.observable(false).extend({ falseTimeout: 500 });
@ -68,19 +59,17 @@ class LoginUserView extends AbstractViewCenter {
languageFullName: () => convertLangName(this.language()), languageFullName: () => convertLangName(this.language()),
signMeVisibility: () => LoginSignMeType.Unused !== this.signMeType() signMeVisibility: () => SignMeUnused !== this.signMeType()
}); });
this.addSubscribables({ this.addSubscribables({
email: () => { email: () => this.emailError(false),
this.emailError(false);
},
password: () => this.passwordError(false), password: () => this.passwordError(false),
submitError: value => value || this.submitErrorAddidional(''), submitError: value => value || this.submitErrorAddidional(''),
signMeType: iValue => this.signMe(LoginSignMeType.DefaultOn === iValue), signMeType: iValue => this.signMe(SignMeOn === iValue),
language: value => { language: value => {
this.langRequest(true); this.langRequest(true);
@ -104,17 +93,18 @@ class LoginUserView extends AbstractViewCenter {
} }
submitCommand(self, event) { submitCommand(self, event) {
let email = this.email().trim(), let form = event.target.form,
valid = event.target.form.reportValidity() && email, data = new FormData(form),
pass = this.password(); valid = form.reportValidity();
this.emailError(!email); this.emailError(!this.email());
this.passwordError(!pass); this.passwordError(!this.password());
this.formError(!valid); this.formError(!valid);
if (valid) { if (valid) {
this.submitRequest(true); this.submitRequest(true);
data.set('Language', this.bSendLanguage ? this.language() : '');
data.set('SignMe', this.signMe() ? 1 : 0);
Remote.login( Remote.login(
(iError, oData) => { (iError, oData) => {
if (iError) { if (iError) {
@ -129,10 +119,7 @@ class LoginUserView extends AbstractViewCenter {
rl.route.reload(); rl.route.reload();
} }
}, },
email, data
pass,
!!this.signMe(),
this.bSendLanguage ? this.language() : ''
); );
Local.set(ClientSideKeyName.LastSignMe, this.signMe() ? '-1-' : '-0-'); Local.set(ClientSideKeyName.LastSignMe, this.signMe() ? '-1-' : '-0-');
@ -147,29 +134,28 @@ class LoginUserView extends AbstractViewCenter {
onBuild() { onBuild() {
const signMeLocal = Local.get(ClientSideKeyName.LastSignMe), const signMeLocal = Local.get(ClientSideKeyName.LastSignMe),
signMe = (SettingsGet('SignMe') || 'unused').toLowerCase(); signMe = (SettingsGet('SignMe') || '').toLowerCase();
switch (signMe) { switch (signMe) {
case LoginSignMeTypeAsString.DefaultOff: case 'defaultoff':
case LoginSignMeTypeAsString.DefaultOn: case 'defaulton':
this.signMeType( this.signMeType(
LoginSignMeTypeAsString.DefaultOn === signMe ? LoginSignMeType.DefaultOn : LoginSignMeType.DefaultOff 'defaulton' === signMe ? SignMeOn : SignMeOff
); );
switch (signMeLocal) { switch (signMeLocal) {
case '-1-': case '-1-':
this.signMeType(LoginSignMeType.DefaultOn); this.signMeType(SignMeOn);
break; break;
case '-0-': case '-0-':
this.signMeType(LoginSignMeType.DefaultOff); this.signMeType(SignMeOff);
break; break;
// no default // no default
} }
break; break;
case LoginSignMeTypeAsString.Unused:
default: default:
this.signMeType(LoginSignMeType.Unused); this.signMeType(SignMeUnused);
break; break;
} }
} }

14
dev/bootstrap.js vendored
View file

@ -94,10 +94,7 @@ export default App => {
if (postData) { if (postData) {
init.method = 'POST'; init.method = 'POST';
init.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; init.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
postData.XToken = Settings.app('token'); const buildFormData = (formData, data, parentKey) => {
// init.body = JSON.stringify(postData);
const formData = new FormData(),
buildFormData = (formData, data, parentKey) => {
if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) { if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) {
Object.keys(data).forEach(key => Object.keys(data).forEach(key =>
buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key) buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key)
@ -105,9 +102,14 @@ export default App => {
} else { } else {
formData.set(parentKey, data == null ? '' : data); formData.set(parentKey, data == null ? '' : data);
} }
return formData;
}; };
buildFormData(formData, postData); postData = (postData instanceof FormData)
init.body = new URLSearchParams(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 => { return fetch(resource, init).then(response => {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Benutzer", "LABEL_LOGIN": "Benutzer",
"LABEL_PASSWORD": "Passwort", "LABEL_PASSWORD": "Passwort",
"LABEL_TOTP": "TOTP-Code",
"BUTTON_LOGIN": "Im Adminpanel anmelden" "BUTTON_LOGIN": "Im Adminpanel anmelden"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",
"LABEL_PASSWORD": "Password", "LABEL_PASSWORD": "Password",
"LABEL_TOTP": "TOTP code",
"BUTTON_LOGIN": "Log into the admin panel" "BUTTON_LOGIN": "Log into the admin panel"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Ingresar", "LABEL_LOGIN": "Ingresar",
"LABEL_PASSWORD": "Contraseña", "LABEL_PASSWORD": "Contraseña",
"LABEL_TOTP": "Código TOTP",
"BUTTON_LOGIN": "Ingresar al panel de control" "BUTTON_LOGIN": "Ingresar al panel de control"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Identifiant", "LABEL_LOGIN": "Identifiant",
"LABEL_PASSWORD": "Mot de passe", "LABEL_PASSWORD": "Mot de passe",
"LABEL_TOTP": "Code TOTP",
"BUTTON_LOGIN": "Se connecter au panneau d'administration" "BUTTON_LOGIN": "Se connecter au panneau d'administration"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Belépés", "LABEL_LOGIN": "Belépés",
"LABEL_PASSWORD": "Jelszó", "LABEL_PASSWORD": "Jelszó",
"LABEL_TOTP": "TOTP kód",
"BUTTON_LOGIN": "Bejelentkezés az admin felületre" "BUTTON_LOGIN": "Bejelentkezés az admin felületre"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Inlognaam", "LABEL_LOGIN": "Inlognaam",
"LABEL_PASSWORD": "Wachtwoord", "LABEL_PASSWORD": "Wachtwoord",
"LABEL_TOTP": "TOTP-code",
"BUTTON_LOGIN": "Aanmelden in het beheer paneel" "BUTTON_LOGIN": "Aanmelden in het beheer paneel"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Logga in", "LABEL_LOGIN": "Logga in",
"LABEL_PASSWORD": "Lösenord", "LABEL_PASSWORD": "Lösenord",
"LABEL_TOTP": "TOTP-kod",
"BUTTON_LOGIN": "Logga in till admin-panelen" "BUTTON_LOGIN": "Logga in till admin-panelen"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -2,6 +2,7 @@
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "登录", "LABEL_LOGIN": "登录",
"LABEL_PASSWORD": "密码", "LABEL_PASSWORD": "密码",
"LABEL_TOTP": "TOTP代碼",
"BUTTON_LOGIN": "登录到控制面板" "BUTTON_LOGIN": "登录到控制面板"
}, },
"TOP_PANEL": { "TOP_PANEL": {

View file

@ -9,7 +9,7 @@
data-bind="submit: submitForm, css: {'errorAnimated': formError, 'submitting': submitRequest()}"> data-bind="submit: submitForm, css: {'errorAnimated': formError, 'submitting': submitRequest()}">
<div class="controls" data-bind="css: {'error': emailError}"> <div class="controls" data-bind="css: {'error': emailError}">
<div class="input-append"> <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" autofocus="" autocomplete="email" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: email, disable: submitRequest" data-bind="textInput: email, disable: submitRequest"
data-i18n="[placeholder]GLOBAL/EMAIL" /> data-i18n="[placeholder]GLOBAL/EMAIL" />
@ -18,7 +18,7 @@
</div> </div>
<div class="controls" data-bind="css: {'error': passwordError}"> <div class="controls" data-bind="css: {'error': passwordError}">
<div class="input-append"> <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" autocomplete="current-password" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: password, disable: submitRequest" data-bind="textInput: password, disable: submitRequest"
data-i18n="[placeholder]GLOBAL/PASSWORD" /> data-i18n="[placeholder]GLOBAL/PASSWORD" />