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() {

Reply via email to