port auth_from_http_remote_user to 8.0
parent
7dd5bc685e
commit
c893a706b8
|
@ -119,7 +119,6 @@ for a login and password outside OpenErp and are automatically logged in the sys
|
|||
'website': 'http://www.acsone.eu',
|
||||
'depends': ['web'],
|
||||
"license": "AGPL-3",
|
||||
"js": ['static/src/js/auth_from_http_remote_user.js'],
|
||||
'data': [
|
||||
'res_config_view.xml',
|
||||
'res_config_data.xml'],
|
||||
|
|
|
@ -19,4 +19,4 @@
|
|||
#
|
||||
##############################################################################
|
||||
|
||||
from . import session
|
||||
from . import main
|
||||
|
|
|
@ -21,9 +21,10 @@
|
|||
|
||||
from openerp import SUPERUSER_ID
|
||||
|
||||
from openerp.addons.web import http
|
||||
import openerp
|
||||
from openerp import http
|
||||
from openerp.http import request
|
||||
from openerp.addons.web.controllers import main
|
||||
from openerp.modules.registry import RegistryManager
|
||||
from .. import utils
|
||||
|
||||
import random
|
||||
|
@ -33,20 +34,17 @@ import openerp.tools.config as config
|
|||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Session(main.Session):
|
||||
_cp_path = "/web/session"
|
||||
class Home(main.Home):
|
||||
|
||||
_REQUIRED_ATTRIBUTES = ['HTTP_REMOTE_USER']
|
||||
_OPTIONAL_ATTRIBUTES = []
|
||||
|
||||
def _get_db(self, db):
|
||||
if db is not None and len(db) > 0:
|
||||
return db
|
||||
db = config['db_name']
|
||||
if db is None or len(db) == 0:
|
||||
_logger.error("No db found for SSO. Specify one in the URL using parameter "
|
||||
"db=? or provide a default one in the configuration")
|
||||
raise http.AuthenticationError()
|
||||
@http.route('/web', type='http', auth="none")
|
||||
def web_client(self, s_action=None, **kw):
|
||||
main.ensure_db()
|
||||
if not request.session.uid:
|
||||
self._bind_http_remote_user(http.request.session.db)
|
||||
return super(Home, self).web_client(s_action, **kw)
|
||||
|
||||
def _get_user_id_from_attributes(self, res_users, cr, attrs):
|
||||
login = attrs.get('HTTP_REMOTE_USER', None)
|
||||
|
@ -56,12 +54,12 @@ class Session(main.Session):
|
|||
return user_ids[0]
|
||||
return None
|
||||
|
||||
def _get_attributes_form_header(self, req):
|
||||
def _get_attributes_form_header(self):
|
||||
attrs = {}
|
||||
|
||||
all_attrs = self._REQUIRED_ATTRIBUTES + self._OPTIONAL_ATTRIBUTES
|
||||
|
||||
headers = req.httprequest.headers.environ
|
||||
headers = http.request.httprequest.headers.environ
|
||||
|
||||
for attr in all_attrs:
|
||||
value = headers.get(attr, None)
|
||||
|
@ -78,10 +76,9 @@ class Session(main.Session):
|
|||
_logger.error("Required fields '%s' not found in http headers\n %s", missings, headers)
|
||||
return attrs
|
||||
|
||||
def _bind_http_remote_user(self, req, db_name):
|
||||
db_name = self._get_db(db_name)
|
||||
def _bind_http_remote_user(self, db_name):
|
||||
try:
|
||||
registry = RegistryManager.get(db_name)
|
||||
registry = openerp.registry(db_name)
|
||||
with registry.cursor() as cr:
|
||||
modules = registry.get('ir.module.module')
|
||||
installed = modules.search_count(cr, SUPERUSER_ID, ['&',
|
||||
|
@ -95,7 +92,7 @@ class Session(main.Session):
|
|||
|
||||
# get the user
|
||||
res_users = registry.get('res.users')
|
||||
attrs = self._get_attributes_form_header(req)
|
||||
attrs = self._get_attributes_form_header()
|
||||
user_id = self._get_user_id_from_attributes(res_users, cr, attrs)
|
||||
|
||||
if user_id is None:
|
||||
|
@ -107,19 +104,13 @@ class Session(main.Session):
|
|||
key = randomString(utils.KEY_LENGTH, '0123456789abcdef')
|
||||
res_users.write(cr, SUPERUSER_ID, [user_id], {'sso_key': key})
|
||||
login = res_users.browse(cr, SUPERUSER_ID, user_id).login
|
||||
req.session.bind(db_name, user_id, login, key)
|
||||
request.session.authenticate(db_name, login=login, password=key, uid=user_id)
|
||||
except http.AuthenticationError, e:
|
||||
raise e
|
||||
except Exception, e:
|
||||
_logger.error("Error binding Http Remote User session", exc_info=True)
|
||||
raise e
|
||||
|
||||
@http.jsonrequest
|
||||
def get_http_remote_user_session_info(self, req, db):
|
||||
if not req.session._login:
|
||||
self._bind_http_remote_user(req, db)
|
||||
return self.session_info(req)
|
||||
|
||||
randrange = random.SystemRandom().randrange
|
||||
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
openerp.auth_from_http_remote_user = function(instance) {
|
||||
|
||||
instance.web.Session.include({
|
||||
session_load_response : function(response) {
|
||||
//unregister the event since it must be called only if the rpc call
|
||||
//is made by session_reload
|
||||
this.off('response', this.session_load_response);
|
||||
if (response.error && response.error.data.type === "session_invalid") {
|
||||
$("body").html("<h1>Access Denied</h1>");
|
||||
}
|
||||
|
||||
console.log("session_load_response called");
|
||||
},
|
||||
|
||||
session_reload : function() {
|
||||
var self = this;
|
||||
// we need to register an handler for 'response' since
|
||||
// by default, the rpc doesn't call callback function
|
||||
// if the response is of error type 'session_invalid'
|
||||
this.on('response', this, this.session_load_response);
|
||||
return this.rpc("/web/session/get_http_remote_user_session_info", {
|
||||
db : $.deparam.querystring().db
|
||||
}).done(function(result) {
|
||||
// If immediately follows a login (triggered by trying to
|
||||
// restore
|
||||
// an invalid session or no session at all), refresh session
|
||||
// data
|
||||
// (should not change, but just in case...)
|
||||
_.extend(self, result);
|
||||
}).fail(function(result){
|
||||
$("body").html("<h1>Server error</h1>");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
};
|
|
@ -45,10 +45,11 @@ class test_res_users(common.TransactionCase):
|
|||
|
||||
def test_login(self):
|
||||
res_users_obj = self.registry('res.users')
|
||||
uid = res = res_users_obj.login(common.DB, 'admin', 'admin')
|
||||
res = res_users_obj.authenticate(common.DB, 'admin', 'admin', None)
|
||||
uid = res
|
||||
self.assertTrue(res, "Basic login must works as expected")
|
||||
token = "123456"
|
||||
res = res_users_obj.login(common.DB, 'admin', token)
|
||||
res = res_users_obj.authenticate(common.DB, 'admin', token, None)
|
||||
self.assertFalse(res)
|
||||
# mimic what the new controller do when it find a value in
|
||||
# the http header (HTTP_REMODE_USER)
|
||||
|
@ -61,7 +62,7 @@ class test_res_users(common.TransactionCase):
|
|||
res_users_obj.check(common.DB, uid, token)
|
||||
|
||||
# we are able to login with the new token
|
||||
res = res_users_obj.login(common.DB, 'admin', token)
|
||||
res = res_users_obj.authenticate(common.DB, 'admin', token, None)
|
||||
self.assertTrue(res)
|
||||
|
||||
@unittest.skipIf(os.environ.get('TRAVIS'),
|
||||
|
|
Loading…
Reference in New Issue