[IMP] Simplified db detection by removing 'db' http parameter handling in http.py to put it in main.py
bzr revid: nicolas.vanhoren@openerp.com-20130724130036-owht2qy2aayynpoi
This commit is contained in:
@@ -88,9 +88,6 @@ def rjsmin(script):
|
||||
|
||||
db_list = http.db_list
|
||||
|
||||
def db_monodb_redirect():
|
||||
return http.db_redirect(not config['list_db'])
|
||||
|
||||
db_monodb = http.db_monodb
|
||||
|
||||
def redirect_with_hash(url, code=303):
|
||||
@@ -535,12 +532,21 @@ html_template = """<!DOCTYPE html>
|
||||
class Home(http.Controller):
|
||||
|
||||
@http.route('/', type='http', auth="none")
|
||||
def index(self, s_action=None, db=None, **kw):
|
||||
db, redir = db_monodb_redirect()
|
||||
if redir:
|
||||
return redirect_with_hash(redir)
|
||||
def index(self, s_action=None, db=None, debug=False, **kw):
|
||||
debug = debug != False
|
||||
if db is not None:
|
||||
lst = http.db_list(True)
|
||||
if db in lst and db != request.session.db:
|
||||
request.session.logout()
|
||||
request.session.db = db
|
||||
|
||||
debug = "debug" in kw
|
||||
if db != request.session.db:
|
||||
query = dict(urlparse.parse_qsl(request.httprequest.query_string, keep_blank_values=True))
|
||||
query.update({'db': request.session.db})
|
||||
redirect = request.httprequest.path + '?' + urllib.urlencode(query)
|
||||
return redirect_with_hash(redirect)
|
||||
|
||||
db = request.session.db
|
||||
|
||||
js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in manifest_list('js', db=db, debug=debug))
|
||||
css = "\n ".join('<link rel="stylesheet" href="%s">' % i for i in manifest_list('css', db=db, debug=debug))
|
||||
@@ -821,7 +827,7 @@ class Session(http.Controller):
|
||||
@http.route('/web/session/get_session_info', type='json', auth="none")
|
||||
def get_session_info(self):
|
||||
request.uid = request.session.uid
|
||||
request.db = request.session.db
|
||||
request.disable_db = False
|
||||
return self.session_info()
|
||||
|
||||
@http.route('/web/session/authenticate', type='json', auth="none")
|
||||
|
||||
+46
-43
@@ -101,15 +101,13 @@ class WebRequest(object):
|
||||
self.httpsession = httprequest.session
|
||||
self.session = httprequest.session
|
||||
self.session_id = httprequest.session.sid
|
||||
self.db = None
|
||||
self.disable_db = False
|
||||
self.uid = None
|
||||
self.func = None
|
||||
self.auth_method = None
|
||||
self._cr_cm = None
|
||||
self._cr = None
|
||||
self.func_request_type = None
|
||||
with set_request(self):
|
||||
self.db = self.session.db or db_monodb()
|
||||
# set db/uid trackers - they're cleaned up at the WSGI
|
||||
# dispatching phase in openerp.service.wsgi_server.application
|
||||
if self.db:
|
||||
@@ -127,17 +125,16 @@ class WebRequest(object):
|
||||
self.session.logout()
|
||||
raise SessionExpiredException("Session expired for request %s" % self.httprequest)
|
||||
if self.auth_method == "none":
|
||||
self.db = None
|
||||
self.disable_db = True
|
||||
self.uid = None
|
||||
elif self.auth_method == "admin":
|
||||
self.db = self.session.db or db_monodb()
|
||||
self.disable_db = False
|
||||
if not self.db:
|
||||
raise SessionExpiredException("No valid database for request %s" % self.httprequest)
|
||||
self.uid = openerp.SUPERUSER_ID
|
||||
else: # auth
|
||||
self.db = self.session.db
|
||||
self.disable_db = False
|
||||
self.uid = self.session.uid
|
||||
|
||||
@property
|
||||
def registry(self):
|
||||
"""
|
||||
@@ -146,6 +143,14 @@ class WebRequest(object):
|
||||
"""
|
||||
return openerp.modules.registry.RegistryManager.get(self.db) if self.db else None
|
||||
|
||||
@property
|
||||
def db(self):
|
||||
"""
|
||||
The registry to the database linked to this request. Can be ``None`` if the current request uses the
|
||||
``none'' authentication.
|
||||
"""
|
||||
return self.session.db if not self.disable_db else None
|
||||
|
||||
@property
|
||||
def cr(self):
|
||||
"""
|
||||
@@ -179,7 +184,7 @@ class WebRequest(object):
|
||||
return self.func(*args, **kwargs)
|
||||
finally:
|
||||
# just to be sure no one tries to re-use the request
|
||||
self.db = None
|
||||
self.disable_db = True
|
||||
self.uid = None
|
||||
|
||||
def route(route, type="http", auth="user"):
|
||||
@@ -611,8 +616,8 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
|
||||
self.uid = uid
|
||||
self.login = login
|
||||
self.password = password
|
||||
request.db = db
|
||||
request.uid = uid
|
||||
request.disable_db = False
|
||||
|
||||
if uid: self.get_context()
|
||||
return uid
|
||||
@@ -885,6 +890,8 @@ class Root(object):
|
||||
else:
|
||||
httprequest.session = self.session_store.get(sid)
|
||||
|
||||
self._find_db(httprequest)
|
||||
|
||||
if not "lang" in httprequest.session.context:
|
||||
lang = httprequest.accept_languages.best or "en_US"
|
||||
lang = babel.core.LOCALE_ALIASES.get(lang, lang).replace('-', '_')
|
||||
@@ -921,6 +928,12 @@ class Root(object):
|
||||
except werkzeug.exceptions.HTTPException, e:
|
||||
return e(environ, start_response)
|
||||
|
||||
def _find_db(self, httprequest):
|
||||
db = db_monodb(httprequest)
|
||||
if db != httprequest.session.db:
|
||||
httprequest.session.logout()
|
||||
httprequest.session.db = db
|
||||
|
||||
def _build_request(self, httprequest):
|
||||
if httprequest.args.get('jsonp'):
|
||||
return JsonRequest(httprequest)
|
||||
@@ -1035,43 +1048,16 @@ class Root(object):
|
||||
|
||||
root = None
|
||||
|
||||
def db_list(force=False):
|
||||
proxy = request.session.proxy("db")
|
||||
dbs = proxy.list(force)
|
||||
h = request.httprequest.environ['HTTP_HOST'].split(':')[0]
|
||||
def db_list(force=False, httprequest=None):
|
||||
httprequest = httprequest or request.httprequest
|
||||
dbs = openerp.netsvc.dispatch_rpc("db", "list", [force])
|
||||
h = httprequest.environ['HTTP_HOST'].split(':')[0]
|
||||
d = h.split('.')[0]
|
||||
r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d)
|
||||
dbs = [i for i in dbs if re.match(r, i)]
|
||||
return dbs
|
||||
|
||||
def db_redirect(match_first_only_if_unique):
|
||||
db = None
|
||||
redirect = None
|
||||
|
||||
dbs = db_list(True)
|
||||
|
||||
# 1 try the db in the url
|
||||
db_url = request.httprequest.args.get('db')
|
||||
if db_url in dbs:
|
||||
return (db_url, None)
|
||||
|
||||
# 2 use the database from the cookie if it's listable and still listed
|
||||
cookie_db = request.httprequest.cookies.get('last_used_database')
|
||||
if cookie_db in dbs:
|
||||
db = cookie_db
|
||||
|
||||
# 3 use the first db if user can list databases
|
||||
if dbs and not db and (not match_first_only_if_unique or len(dbs) == 1):
|
||||
db = dbs[0]
|
||||
|
||||
# redirect to the chosen db if multiple are available
|
||||
if db and len(dbs) > 1:
|
||||
query = dict(urlparse.parse_qsl(request.httprequest.query_string, keep_blank_values=True))
|
||||
query.update({'db': db})
|
||||
redirect = request.httprequest.path + '?' + urllib.urlencode(query)
|
||||
return (db, redirect)
|
||||
|
||||
def db_monodb():
|
||||
def db_monodb(httprequest=None):
|
||||
"""
|
||||
Magic function to find the current database.
|
||||
|
||||
@@ -1080,10 +1066,27 @@ def db_monodb():
|
||||
* Magic
|
||||
* More magic
|
||||
|
||||
Return ``None`` if the magic is not magic enough.
|
||||
Returns ``None`` if the magic is not magic enough.
|
||||
"""
|
||||
return db_redirect(True)[0]
|
||||
httprequest = httprequest or request.httprequest
|
||||
db = None
|
||||
redirect = None
|
||||
|
||||
dbs = db_list(True, httprequest)
|
||||
|
||||
# 1 try the db already in the session
|
||||
db_session = httprequest.session.db
|
||||
if db_session in dbs:
|
||||
return db_session
|
||||
|
||||
# 2 if there is only one db in the db filters, take it
|
||||
if len(dbs) == 1:
|
||||
return dbs[0]
|
||||
|
||||
# 3 if there are multiple dbs, take the first one only if we can list them
|
||||
if len(dbs) > 1 and config['list_db']:
|
||||
return dbs[0]
|
||||
return None
|
||||
|
||||
class CommonController(Controller):
|
||||
|
||||
|
||||
@@ -705,20 +705,9 @@ instance.web.Login = instance.web.Widget.extend({
|
||||
}
|
||||
return d;
|
||||
},
|
||||
remember_last_used_database: function(db) {
|
||||
// This cookie will be used server side in order to avoid db reloading on first visit
|
||||
var ttl = 24 * 60 * 60 * 365;
|
||||
document.cookie = [
|
||||
'last_used_database=' + db,
|
||||
'path=/',
|
||||
'max-age=' + ttl,
|
||||
'expires=' + new Date(new Date().getTime() + ttl * 1000).toGMTString()
|
||||
].join(';');
|
||||
},
|
||||
database_selected: function(db) {
|
||||
var params = $.deparam.querystring();
|
||||
params.db = db;
|
||||
this.remember_last_used_database(db);
|
||||
this.$('.oe_login_dbpane').empty().text(_t('Loading...'));
|
||||
this.$('[name=login], [name=password]').prop('readonly', true);
|
||||
instance.web.redirect('/?' + $.param(params));
|
||||
@@ -769,7 +758,6 @@ instance.web.Login = instance.web.Widget.extend({
|
||||
self.hide_error();
|
||||
self.$(".oe_login_pane").fadeOut("slow");
|
||||
return this.session.session_authenticate(db, login, password).then(function() {
|
||||
self.remember_last_used_database(db);
|
||||
if (self.has_local_storage && self.remember_credentials) {
|
||||
localStorage.setItem(db + '|last_login', login);
|
||||
if (self.session.debug) {
|
||||
|
||||
Reference in New Issue
Block a user