From 5298cde9533c26558e01602754b4a40a66241dbf Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 16:59:14 +0100 Subject: [PATCH 01/10] [FIX] content-type of JSON-RPC2 responses bzr revid: xmo@openerp.com-20110317155914-rh3w4puch88o2h77 --- openerpweb/openerpweb.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 3d0db1cea14..41a50dfa306 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -148,7 +148,11 @@ class JsonRequest(object): print "<--", response print - return simplejson.dumps(response) + + content = simplejson.dumps(response) + cherrypy.response.headers['Content-Type'] = 'application/json' + cherrypy.response.headers['Content-Length'] = len(content) + return content def jsonrequest(f): @cherrypy.expose From 20b55e10c10142636ecb6232b3faec2622cd4e8e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 17:01:24 +0100 Subject: [PATCH 02/10] [IMP] redirect to root page instead of providing a link bzr revid: xmo@openerp.com-20110317160124-9a9fde1cqimct59a --- openerpweb/openerpweb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 41a50dfa306..19d082f0f60 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -249,7 +249,7 @@ class Root(object): return m(**kw) else: - return '/base/static/openerp/base.html' + raise cherrypy.HTTPRedirect('/base/static/openerp/base.html', 301) default.exposed = True def main(argv): From 9943d2e9c2037c39183a813536c3b7cbc338b727 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 18:11:51 +0100 Subject: [PATCH 03/10] [FIX] forgotten rename bzr revid: xmo@openerp.com-20110317171151-fn44gv41scophjlw --- addons/base/static/openerp/js/base_chrome.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/base/static/openerp/js/base_chrome.js b/addons/base/static/openerp/js/base_chrome.js index dedab94eeab..2b09b31454f 100644 --- a/addons/base/static/openerp/js/base_chrome.js +++ b/addons/base/static/openerp/js/base_chrome.js @@ -171,7 +171,7 @@ openerp.base.Session = openerp.base.BasicController.extend({ if (response.error.data.type == "session_invalid") { self.uid = false; self.on_session_invalid(function() { - self.rpc(url, params, success_callback, error_callback); + self.rpc(url, payload, success_callback, error_callback); }); } else { error_callback(response.error); @@ -319,7 +319,6 @@ openerp.base.Login = openerp.base.Controller.extend({ }, start: function() { this.$element.html(QWeb.render("Login", {})); - //this.on_login_invalid(); this.$element.find("form").submit(this.on_submit); }, on_login_invalid: function() { @@ -335,6 +334,7 @@ openerp.base.Login = openerp.base.Controller.extend({ $e.hide(); }, on_submit: function(ev) { + ev.preventDefault(); var self = this; var $e = this.$element; var db = $e.find("form input[name=db]").val(); @@ -349,7 +349,6 @@ openerp.base.Login = openerp.base.Controller.extend({ self.on_login_invalid(); } }); - return false; }, do_ask_login: function(continuation) { this.on_login_invalid(); From 38f62edbdca3805c5a9cf786f789c80fa777a0f4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 18:14:01 +0100 Subject: [PATCH 04/10] [FIX] correctly generate independent sessions bzr revid: xmo@openerp.com-20110317171401-3qekzs59ue5tlywx --- openerpweb/openerpweb.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 19d082f0f60..2ec37af093c 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -2,6 +2,7 @@ import functools import optparse, os, re, sys, traceback, xmlrpclib +import uuid import cherrypy import cherrypy.lib.static @@ -84,7 +85,7 @@ class JsonRequest(object): def parse(self, request): self.params = request.get("params",{}) - self.session_id = self.params.pop("session_id", None) or "random.random" + self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex self.session = session_store.setdefault(self.session_id, OpenERPSession()) self.context = self.params.pop('context', None) return self.params From 6cab13279a3823c076dc8babdf4c712bca331cc5 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 18:14:03 +0100 Subject: [PATCH 05/10] [FIX] inline temporary variable bzr revid: xmo@openerp.com-20110317171403-s1p00g5omgix01uu --- addons/base/controllers/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 88ca61026df..0f44c9b860d 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -95,11 +95,10 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def login(self, req, db, login, password): req.session.login(db, login, password) - res = { + return { "session_id" : req.session_id, "uid": req.session._uid, } - return res @openerpweb.jsonrequest def modules(self, req): From cd09d946d2df2c0d025ec0e193c90e87fafea1eb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 18:16:22 +0100 Subject: [PATCH 06/10] [FIX] loading modules should not nuke the login that has just been performed bzr revid: xmo@openerp.com-20110317171622-ioebt4sbpmxkkpoc --- addons/base/static/openerp/js/base_chrome.js | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/base/static/openerp/js/base_chrome.js b/addons/base/static/openerp/js/base_chrome.js index 2b09b31454f..3a7f590c55b 100644 --- a/addons/base/static/openerp/js/base_chrome.js +++ b/addons/base/static/openerp/js/base_chrome.js @@ -229,7 +229,6 @@ openerp.base.Session = openerp.base.BasicController.extend({ self.rpc('/base/session/jslist', {"mods": self.module_list.join(',')}, self.debug ? self.do_session_load_modules_debug : self.do_session_load_modules_prod); openerp._modules_loaded = true; }); - this.uid = false; }, do_session_load_modules_debug: function(result) { var self = this; From 8699e1c85cf478debf4d5af4ee8bf345e18d2c0d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 17 Mar 2011 18:18:55 +0100 Subject: [PATCH 07/10] [FIX] class on login form when not logged in is login_invalid bzr revid: xmo@openerp.com-20110317171855-4ovpe64wnp7qzeqv --- addons/base/static/openerp/js/base_chrome.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/base/static/openerp/js/base_chrome.js b/addons/base/static/openerp/js/base_chrome.js index 3a7f590c55b..2392ec3250e 100644 --- a/addons/base/static/openerp/js/base_chrome.js +++ b/addons/base/static/openerp/js/base_chrome.js @@ -321,16 +321,16 @@ openerp.base.Login = openerp.base.Controller.extend({ this.$element.find("form").submit(this.on_submit); }, on_login_invalid: function() { - var $e = this.$element; - $e.removeClass("login_valid"); - $e.addClass("login_invalid"); - $e.show(); + this.$element + .removeClass("login_valid") + .addClass("login_invalid") + .show(); }, on_login_valid: function() { - var $e = this.$element; - $e.removeClass("oe_login_invalid"); - $e.addClass("login_valid"); - $e.hide(); + this.$element + .addClass("login_valid") + .removeClass("login_invalid") + .hide(); }, on_submit: function(ev) { ev.preventDefault(); From 502d0eb58f88ed76ec090dfbef77f79e0ea7882b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 18 Mar 2011 13:19:44 +0100 Subject: [PATCH 08/10] [FIX] continuation of session_invalid should be added to on_login_valid (once we *do* have a valid session), not on Login.on_submit (where we don't yet have it) bzr revid: xmo@openerp.com-20110318121944-xrgpha19glgmtc7o --- addons/base/static/openerp/js/base_chrome.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/base/static/openerp/js/base_chrome.js b/addons/base/static/openerp/js/base_chrome.js index 2392ec3250e..0870f92a38c 100644 --- a/addons/base/static/openerp/js/base_chrome.js +++ b/addons/base/static/openerp/js/base_chrome.js @@ -171,7 +171,7 @@ openerp.base.Session = openerp.base.BasicController.extend({ if (response.error.data.type == "session_invalid") { self.uid = false; self.on_session_invalid(function() { - self.rpc(url, payload, success_callback, error_callback); + self.rpc(url, payload.params, success_callback, error_callback); }); } else { error_callback(response.error); @@ -351,13 +351,11 @@ openerp.base.Login = openerp.base.Controller.extend({ }, do_ask_login: function(continuation) { this.on_login_invalid(); - this.on_submit.add({ + this.on_login_valid.add({ position: "last", unique: true, - callback: function() { - if(continuation) continuation(); - return false; - }}); + callback: continuation + }); } }); From 8172fdb25f075c017bb6bd32a121d8b76b274c9b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 18 Mar 2011 14:47:51 +0100 Subject: [PATCH 09/10] [IMP] implement local storage of session id and uid bzr revid: xmo@openerp.com-20110318134751-41mhkir4u5qb0ez1 --- addons/base/static/openerp/js/base_chrome.js | 76 ++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/addons/base/static/openerp/js/base_chrome.js b/addons/base/static/openerp/js/base_chrome.js index 0870f92a38c..52c3bfeea4a 100644 --- a/addons/base/static/openerp/js/base_chrome.js +++ b/addons/base/static/openerp/js/base_chrome.js @@ -135,10 +135,85 @@ openerp.base.Session = openerp.base.BasicController.extend({ this.password = ""; this.uid = false; this.session_id = false; + this.load_local(); this.module_list = []; this.module_loaded = {"base": true}; this.context = {}; }, + /** + * Reloads uid and session_id from local storage, if they exist + */ + load_local: function () { + this.uid = this.get_cookie('uid'); + this.session_id = this.get_cookie('session_id'); + }, + /** + * Saves the session id and uid locally + */ + save_local: function () { + this.set_local('uid', this.uid); + this.set_local('session_id', this.session_id); + }, + // TODO: clear_local + + /** + * Retrieves and return the value indexed by the key name from local + * storage, if it finds it. + * @param name the name of the value to get + */ + get_local: function (name) { + if(window.localStorage) { + return localStorage.getItem(name); + } + return this.get_cookie(name); + }, + /** + * Sets the value at the key name in local storage. + * + * The value has to be a String. + * + * @param name key to set the value at + * @param value value to store + */ + set_local: function (name, value) { + if(window.localStorage) { + localStorage.setItem(name, String(value)); + } + return this.set_cookie(name, value); + }, + + /** + * Fetches a cookie stored by an openerp session + * + * @param name the cookie's name + */ + get_cookie: function (name) { + var nameEQ = this.element_id + '|' + name + '='; + var cookies = document.cookie.split(';'); + for(var i=0; i Date: Fri, 18 Mar 2011 15:18:36 +0100 Subject: [PATCH 10/10] [IMP] use CherryPy session storage, file-based, to store the openerp sessions bzr revid: xmo@openerp.com-20110318141836-1p2dv6ohz4guknx4 --- openerpweb/openerpweb.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 2ec37af093c..f34662cdc5f 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -65,7 +65,6 @@ class OpenERPSession(object): #---------------------------------------------------------- # OpenERP Web RequestHandler #---------------------------------------------------------- -session_store = {} class JsonRequest(object): """ JSON-RPC2 over HTTP POST using non standard POST encoding. @@ -86,7 +85,7 @@ class JsonRequest(object): def parse(self, request): self.params = request.get("params",{}) self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex - self.session = session_store.setdefault(self.session_id, OpenERPSession()) + self.session = cherrypy.session.setdefault(self.session_id, OpenERPSession()) self.context = self.params.pop('context', None) return self.params @@ -256,11 +255,18 @@ class Root(object): def main(argv): # optparse + SESSIONS_STORAGE_DIRECTORY = '/tmp/cpsessions' + if not os.path.exists(SESSIONS_STORAGE_DIRECTORY): + # 10#448 == 8#700 + os.mkdir(SESSIONS_STORAGE_DIRECTORY, 448) config = { 'server.socket_port': 8002, #'server.socket_host': '64.72.221.48', #'server.thread_pool' = 10, 'tools.sessions.on': True, + 'tools.sessions.storage_type': 'file', + 'tools.sessions.storage_path': SESSIONS_STORAGE_DIRECTORY, + 'tools.sessions.timeout': 60 } cherrypy.tree.mount(Root())