Manage custom login process
The password is removed from the login window. The login parameters are filled using asks pop-up until login success. The same login method is used to renew the session. issue5521 review23001003
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
* Manage custom login process
|
||||
* Add erase on Many2One
|
||||
* Re-position icons on Many2One widget
|
||||
|
||||
|
||||
@@ -206,6 +206,9 @@ var Sao = {};
|
||||
Sao.i18n.loadJSON(data);
|
||||
});
|
||||
};
|
||||
Sao.i18n.getlang = function() {
|
||||
return Sao.i18n.getLocale();
|
||||
};
|
||||
Sao.i18n.setlang(
|
||||
(navigator.language ||
|
||||
navigator.browserLanguge ||
|
||||
|
||||
+86
-103
@@ -18,46 +18,23 @@
|
||||
get_auth: function() {
|
||||
return btoa(this.login + ':' + this.user_id + ':' + this.session);
|
||||
},
|
||||
do_login: function(login, password) {
|
||||
do_login: function(login, parameters) {
|
||||
var dfd = jQuery.Deferred();
|
||||
var timeoutID = Sao.common.processing.show();
|
||||
var args = {
|
||||
'method': 'common.db.login',
|
||||
'params': [login, password]
|
||||
var func = function(parameters) {
|
||||
return {
|
||||
'method': 'common.db.login',
|
||||
'params': [login, parameters, Sao.i18n.getlang()]
|
||||
};
|
||||
};
|
||||
var ajax_prm = jQuery.ajax({
|
||||
'contentType': 'application/json',
|
||||
'data': JSON.stringify(args),
|
||||
'dataType': 'json',
|
||||
'url': '/' + this.database + '/',
|
||||
'type': 'post',
|
||||
'complete': [function() {
|
||||
Sao.common.processing.hide(timeoutID);
|
||||
}]
|
||||
new Sao.Login(func).run().then(function(result) {
|
||||
this.user_id = result[0];
|
||||
this.session = result[1];
|
||||
dfd.resolve();
|
||||
}.bind(this), function() {
|
||||
this.user_id = null;
|
||||
this.session = null;
|
||||
dfd.reject();
|
||||
});
|
||||
|
||||
var ajax_success = function(data) {
|
||||
if (data === null) {
|
||||
Sao.common.warning.run('',
|
||||
Sao.i18n.gettext('Unable to reach the server.'));
|
||||
dfd.reject();
|
||||
} else if (data.error) {
|
||||
Sao.common.error.run(data.error[0], data.error[1]);
|
||||
dfd.reject();
|
||||
} else {
|
||||
if (!data.result) {
|
||||
this.user_id = null;
|
||||
this.session = null;
|
||||
dfd.reject();
|
||||
} else {
|
||||
this.user_id = data.result[0];
|
||||
this.session = data.result[1];
|
||||
dfd.resolve();
|
||||
}
|
||||
}
|
||||
};
|
||||
ajax_prm.success(ajax_success.bind(this));
|
||||
ajax_prm.error(dfd.reject);
|
||||
return dfd.promise();
|
||||
},
|
||||
do_logout: function() {
|
||||
@@ -114,12 +91,6 @@
|
||||
'id': 'login-login',
|
||||
'placeholder': Sao.i18n.gettext('Login')
|
||||
});
|
||||
dialog.password_input = jQuery('<input/>', {
|
||||
'class': 'form-control',
|
||||
'type': 'password',
|
||||
'id': 'login-password',
|
||||
'placeholder': Sao.i18n.gettext('Password')
|
||||
});
|
||||
dialog.body.append(jQuery('<div/>', {
|
||||
'class': 'form-group'
|
||||
}).append(jQuery('<label/>', {
|
||||
@@ -135,13 +106,7 @@
|
||||
'for': 'login-login'
|
||||
}).append(Sao.i18n.gettext('Login')))
|
||||
.append(dialog.login_input)
|
||||
).append(jQuery('<div/>', {
|
||||
'class': 'form-group'
|
||||
}).append(jQuery('<label/>', {
|
||||
'class': 'control-label',
|
||||
'for': 'login-password'
|
||||
}).append(Sao.i18n.gettext('Password')))
|
||||
.append(dialog.password_input));
|
||||
);
|
||||
dialog.button = jQuery('<button/>', {
|
||||
'class': 'btn btn-primary',
|
||||
'type': 'submit'
|
||||
@@ -164,24 +129,24 @@
|
||||
|
||||
var ok_func = function() {
|
||||
var login = dialog.login_input.val();
|
||||
var password = dialog.password_input.val();
|
||||
var database = database || dialog.database_select.val() ||
|
||||
dialog.database_input.val();
|
||||
dialog.modal.find('.has-error').removeClass('has-error');
|
||||
if (!(login && password && database)) {
|
||||
if (!(login && database)) {
|
||||
empty_field().closest('.form-group').addClass('has-error');
|
||||
return;
|
||||
}
|
||||
dialog.button.focus();
|
||||
dialog.button.prop('disabled', true);
|
||||
dialog.modal.modal('hide');
|
||||
var session = new Sao.Session(database, login);
|
||||
session.do_login(login, password)
|
||||
session.do_login(login)
|
||||
.then(function() {
|
||||
dfd.resolve(session);
|
||||
dialog.modal.remove();
|
||||
}, function() {
|
||||
dialog.button.prop('disabled', false);
|
||||
dialog.password_input.val('');
|
||||
dialog.modal.modal('show');
|
||||
empty_field().closest('.form-group').addClass('has-error');
|
||||
empty_field().first().focus();
|
||||
});
|
||||
@@ -216,70 +181,88 @@
|
||||
return dfd.promise();
|
||||
};
|
||||
|
||||
Sao.Session.password_dialog = function() {
|
||||
var dialog = new Sao.Dialog(Sao.i18n.gettext('Password'), 'lg');
|
||||
dialog.password_input = jQuery('<input/>', {
|
||||
'class': 'form-control',
|
||||
'type': 'password',
|
||||
'id': 'password-password',
|
||||
'placeholder': Sao.i18n.gettext('Password')
|
||||
});
|
||||
dialog.body.append(jQuery('<div/>', {
|
||||
'class': 'form-group'
|
||||
}).append(jQuery('<label/>', {
|
||||
'for': 'password-password'
|
||||
}).append(Sao.i18n.gettext('Password')))
|
||||
.append(dialog.password_input));
|
||||
dialog.button = jQuery('<button/>', {
|
||||
'class': 'btn btn-primary',
|
||||
'type': 'submit'
|
||||
}).append(Sao.i18n.gettext('OK')).appendTo(dialog.footer);
|
||||
return dialog;
|
||||
};
|
||||
|
||||
Sao.Session.renew = function(session) {
|
||||
if (session.prm.state() == 'pending') {
|
||||
return session.prm;
|
||||
}
|
||||
var dfd = jQuery.Deferred();
|
||||
session.prm = dfd.promise();
|
||||
var dialog = Sao.Session.password_dialog();
|
||||
if (!session.login) {
|
||||
dfd.reject();
|
||||
return session.prm;
|
||||
}
|
||||
|
||||
var ok_func = function() {
|
||||
var password = dialog.password_input.val();
|
||||
dialog.button.focus();
|
||||
dialog.button.prop('disabled', true);
|
||||
session.do_login(session.login, password)
|
||||
.then(function() {
|
||||
dfd.resolve();
|
||||
dialog.modal.remove();
|
||||
}, function() {
|
||||
dialog.button.prop('disabled', false);
|
||||
dialog.password_input.val('').focus();
|
||||
});
|
||||
};
|
||||
|
||||
dialog.modal.modal({
|
||||
backdrop: false,
|
||||
keyboard: false
|
||||
});
|
||||
dialog.modal.on('shown.bs.modal', function() {
|
||||
dialog.password_input.focus();
|
||||
});
|
||||
dialog.modal.find('form').unbind().submit(function(e) {
|
||||
ok_func();
|
||||
e.preventDefault();
|
||||
});
|
||||
dialog.modal.modal('show');
|
||||
session.do_login(session.login).then(dfd.resolve, dfd.reject);
|
||||
return session.prm;
|
||||
};
|
||||
|
||||
Sao.Session.current_session = null;
|
||||
|
||||
Sao.Login = Sao.class_(Object, {
|
||||
init: function(func) {
|
||||
this.func = func;
|
||||
},
|
||||
run: function(parameters) {
|
||||
if (parameters === undefined) {
|
||||
parameters = {};
|
||||
}
|
||||
var dfd = jQuery.Deferred();
|
||||
var timeoutID = Sao.common.processing.show();
|
||||
var session = Sao.Session.current_session;
|
||||
var args = {
|
||||
'contentType': 'application/json',
|
||||
'data': JSON.stringify(this.func(parameters)),
|
||||
'dataType': 'json',
|
||||
'url': '/' + session.database + '/',
|
||||
'type': 'post',
|
||||
'complete': [function() {
|
||||
Sao.common.processing.hide(timeoutID);
|
||||
}]
|
||||
};
|
||||
if (session.user_id && session.session) {
|
||||
args.headers = {
|
||||
'Authorization': 'Session ' + session.get_auth()
|
||||
};
|
||||
}
|
||||
var ajax_prm = jQuery.ajax(args);
|
||||
|
||||
var ajax_success = function(data) {
|
||||
if (data === null) {
|
||||
Sao.common.warning.run('',
|
||||
Sao.i18n.gettext('Unable to reach the server.'));
|
||||
dfd.reject();
|
||||
} else if (data.error) {
|
||||
if (data.error[0].startsWith('403')) {
|
||||
return this.run({}).then(dfd.resolve, dfd.reject);
|
||||
} else if (data.error[0] != 'LoginException') {
|
||||
Sao.common.error.run(data.error[0], data.error[1]);
|
||||
dfd.reject();
|
||||
} else {
|
||||
var args = data.error[1];
|
||||
var name = args[0];
|
||||
var message = args[1];
|
||||
var type = args[2];
|
||||
this['get_' + type](message).then(function(value) {
|
||||
parameters[name] = value;
|
||||
return this.run(parameters).then(
|
||||
dfd.resolve, dfd.reject);
|
||||
}.bind(this), dfd.reject);
|
||||
}
|
||||
} else {
|
||||
dfd.resolve(data.result);
|
||||
}
|
||||
};
|
||||
ajax_prm.success(ajax_success.bind(this));
|
||||
ajax_prm.error(dfd.reject);
|
||||
return dfd.promise();
|
||||
},
|
||||
get_char: function(message) {
|
||||
return Sao.common.ask.run(message);
|
||||
},
|
||||
get_password: function(message) {
|
||||
return Sao.common.ask.run(message, false);
|
||||
},
|
||||
});
|
||||
|
||||
Sao.DB = {};
|
||||
|
||||
Sao.DB.list = function() {
|
||||
|
||||
+9
-13
@@ -629,19 +629,15 @@
|
||||
.then(function(validate) {
|
||||
if (validate) {
|
||||
var values = jQuery.extend({}, this.screen.get());
|
||||
var set_preferences = function(password) {
|
||||
return this.screen.model.execute(
|
||||
'set_preferences', [values, password], {});
|
||||
}.bind(this);
|
||||
if ('password' in values) {
|
||||
return Sao.common.ask.run(
|
||||
'Current Password:', false)
|
||||
.then(function(password) {
|
||||
return set_preferences(password);
|
||||
});
|
||||
} else {
|
||||
return set_preferences(false);
|
||||
}
|
||||
var context = jQuery.extend({},
|
||||
Sao.Session.current_session.context);
|
||||
var func = function(parameters) {
|
||||
return {
|
||||
'method': 'model.res.user.set_preferences',
|
||||
'params': [values, parameters, context]
|
||||
};
|
||||
};
|
||||
return new Sao.Login(func).run();
|
||||
}
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user