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:
Cédric Krier
2016-05-31 12:53:26 +02:00
parent b9ccf47709
commit aceedacb36
4 changed files with 99 additions and 116 deletions
+1
View File
@@ -1,3 +1,4 @@
* Manage custom login process
* Add erase on Many2One
* Re-position icons on Many2One widget
+3
View File
@@ -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
View File
@@ -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
View File
@@ -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));
}