221 lines
5.9 KiB
JavaScript
221 lines
5.9 KiB
JavaScript
/* This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
this repository contains the full copyright notices and license terms. */
|
|
'use strict';
|
|
|
|
Sao.Session = Class(Object, {
|
|
init: function(database, login) {
|
|
this.database = database;
|
|
this.login = login;
|
|
this.user_id = null;
|
|
this.session = null;
|
|
if (!Sao.Session.current_session) {
|
|
Sao.Session.current_session = this;
|
|
}
|
|
},
|
|
do_login: function(login, password) {
|
|
var dfd = jQuery.Deferred();
|
|
var args = {
|
|
'method': 'common.db.login',
|
|
'params': [login, password]
|
|
};
|
|
var ajax_prm = jQuery.ajax({
|
|
'contentType': 'application/json',
|
|
'data': JSON.stringify(args),
|
|
'dataType': 'json',
|
|
'url': '/' + this.database,
|
|
'type': 'post'
|
|
});
|
|
|
|
var ajax_success = function(data) {
|
|
if (data === null) {
|
|
Sao.warning('Unable to reach the server');
|
|
dfd.reject();
|
|
} else if (data.error) {
|
|
console.log('ERROR');
|
|
Sao.error(data.error[0], data.error[1]);
|
|
dfd.reject();
|
|
} else {
|
|
if (!data.result) {
|
|
this.user_id = null;
|
|
this.session = null;
|
|
} 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() {
|
|
if (!(this.user_id && this.session)) {
|
|
return;
|
|
}
|
|
var args = {
|
|
'method': 'common.db.logout',
|
|
'params': []
|
|
};
|
|
var prm = Sao.rpc(this, args);
|
|
this.database = null;
|
|
this.login = null;
|
|
this.user_id = null;
|
|
this.session = null;
|
|
return prm;
|
|
}
|
|
});
|
|
|
|
Sao.Session.get_credentials = function(parent_dfd) {
|
|
var login; // TODO use cookie
|
|
var database = window.location.hash.replace(
|
|
/^(#(!|))/, '') || null;
|
|
var database_div, database_select;
|
|
var login_div, login_input, password_input;
|
|
|
|
var ok_func = function() {
|
|
var login_val = login_input.val();
|
|
var password_val = password_input.val();
|
|
var database_val = (database ||
|
|
database_select.val());
|
|
if (!(login_val && password_val)) {
|
|
return;
|
|
}
|
|
var session = new Sao.Session(database_val,
|
|
login_val);
|
|
var prm = session.do_login(login_val, password_val);
|
|
prm.done(function() {
|
|
parent_dfd.resolve(session);
|
|
});
|
|
login_div.dialog('close');
|
|
};
|
|
|
|
var keydown = function(ev) {
|
|
if (ev.which === 13)
|
|
ok_func();
|
|
};
|
|
|
|
var fill_database = function() {
|
|
$.when(Sao.DB.list()).then(function(databases) {
|
|
databases.forEach(function(database) {
|
|
database_select.append($('<option/>', {
|
|
'value': database,
|
|
'text': database
|
|
}));
|
|
});
|
|
});
|
|
};
|
|
|
|
login_div = $('<div/>', {
|
|
'class': 'login'
|
|
});
|
|
if (!database) {
|
|
login_div.append($('<label/>', {
|
|
'text': 'Database:' // TODO translation
|
|
}));
|
|
database_select = $('<select/>');
|
|
login_div.append(database_select);
|
|
fill_database();
|
|
login_div.append($('<br/>'));
|
|
}
|
|
|
|
login_div.append($('<label/>', {
|
|
'text': 'Login:' // TODO translation
|
|
}));
|
|
login_input = $('<input/>', {
|
|
'type': 'input',
|
|
'id': 'login',
|
|
'val': login
|
|
});
|
|
login_input.keydown(keydown);
|
|
login_div.append(login_input);
|
|
login_div.append($('<br/>'));
|
|
|
|
login_div.append($('<label/>', {
|
|
'text': 'Password:'
|
|
}));
|
|
password_input = $('<input/>', {
|
|
'type': 'password',
|
|
'id': 'password'
|
|
});
|
|
password_input.keydown(keydown);
|
|
login_div.append(password_input);
|
|
login_div.append($('<br/>'));
|
|
|
|
login_div.dialog({
|
|
'title': 'Login', // TODO translation
|
|
'modal': true,
|
|
'buttons': {
|
|
'Cancel': function() {
|
|
$(this).dialog('close');
|
|
},
|
|
'OK': ok_func
|
|
},
|
|
'open': function() {
|
|
if (login) {
|
|
password_input.focus();
|
|
} else {
|
|
login_input.focus();
|
|
}
|
|
}
|
|
});
|
|
|
|
};
|
|
|
|
Sao.Session.renew_credentials = function(session, parent_dfd) {
|
|
var login_div, password_input;
|
|
|
|
var ok_func = function() {
|
|
var password_val = password_input.val();
|
|
var prm = session.do_login(session.login, password_val);
|
|
prm.done(function() {
|
|
parent_dfd.resolve();
|
|
});
|
|
login_div.dialog('close');
|
|
};
|
|
var keydown = function(ev) {
|
|
if (ev.which === 13)
|
|
ok_func();
|
|
};
|
|
|
|
login_div = $('<div/>', {
|
|
'class': 'login'
|
|
});
|
|
login_div.append($('<label/>', {
|
|
'text': 'Password:'
|
|
}));
|
|
password_input = $('<input/>', {
|
|
'type': 'password',
|
|
'id': 'password'
|
|
});
|
|
password_input.keydown(keydown);
|
|
login_div.append(password_input);
|
|
login_div.append($('<br/>'));
|
|
|
|
login_div.dialog({
|
|
'title': 'Login', // TODO translation
|
|
'modal': true,
|
|
'buttons': {
|
|
'Cancel': function() {
|
|
$(this).dialog('close');
|
|
},
|
|
'OK': ok_func
|
|
},
|
|
'open': function() {
|
|
password_input.focus();
|
|
}
|
|
});
|
|
};
|
|
|
|
Sao.Session.current_session = null;
|
|
|
|
Sao.DB = {};
|
|
|
|
Sao.DB.list = function() {
|
|
var args = {
|
|
'method': 'common.db.list',
|
|
'params': []
|
|
};
|
|
return Sao.rpc(args);
|
|
};
|