changeset d10e0a87299d in sao:default details: https://hg.tryton.org/sao?cmd=changeset;node=d10e0a87299d description: Protect trusted devices against brute force attack
issue9386 review321511002 diffstat: CHANGELOG | 1 + src/session.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 0 deletions(-) diffs (68 lines): diff -r 90fb8b703fe7 -r d10e0a87299d CHANGELOG --- a/CHANGELOG Sat Feb 20 00:54:38 2021 +0100 +++ b/CHANGELOG Sun Feb 21 16:23:11 2021 +0100 @@ -1,3 +1,4 @@ +* Handle device cookie * Add breadcrumb as title of window form * Manage help for each selection * Display revision on dialog diff -r 90fb8b703fe7 -r d10e0a87299d src/session.js --- a/src/session.js Sat Feb 20 00:54:38 2021 +0100 +++ b/src/session.js Sun Feb 21 16:23:11 2021 +0100 @@ -29,7 +29,14 @@ do_login: function(parameters) { var dfd = jQuery.Deferred(); var login = this.login; + var device_cookies = JSON.parse( + localStorage.getItem('sao_device_cookies')); + var device_cookie = null; + if (device_cookies) { + device_cookie = device_cookies[this.database][this.login]; + } var func = function(parameters) { + parameters.device_cookie = device_cookie; return { 'method': 'common.db.login', 'params': [login, parameters, Sao.i18n.getlang()] @@ -40,6 +47,7 @@ this.user_id = result[0]; this.session = result[1]; this.store(); + this.renew_device_cookie(); dfd.resolve(); }.bind(this), function() { this.user_id = null; @@ -135,6 +143,33 @@ unstore: function() { localStorage.removeItem('sao_session_' + this.database); }, + renew_device_cookie: function() { + var device_cookie; + var device_cookies = JSON.parse( + localStorage.getItem('sao_device_cookies')); + if (!device_cookies || !(this.database in device_cookies)) { + device_cookie = null; + } else { + device_cookie = device_cookies[this.database][this.login]; + } + var renew_prm = Sao.rpc({ + method: 'model.res.user.device.renew', + params: [device_cookie, {}], + }, this); + renew_prm.done(function(result) { + device_cookies = JSON.parse( + localStorage.getItem('sao_device_cookies')); + if (!device_cookies) { + device_cookies = {}; + } + if (!(this.database in device_cookies)) { + device_cookies[this.database] = {}; + } + device_cookies[this.database][this.login] = result; + localStorage.setItem( + 'sao_device_cookies', JSON.stringify(device_cookies)); + }.bind(this)); + } }); Sao.Session.login_dialog = function() {