[ADD] core, web: support for partial sessions & MFA
This commit is contained in:
committed by
Olivier Dony
parent
909b64a50b
commit
096972de0b
@@ -869,7 +869,18 @@ class Home(http.Controller):
|
||||
return response
|
||||
|
||||
def _login_redirect(self, uid, redirect=None):
|
||||
return redirect if redirect else '/web'
|
||||
if request.session.uid: # fully logged
|
||||
return redirect or '/web'
|
||||
|
||||
# partial session (MFA)
|
||||
url = request.env(user=uid)['res.users'].browse(uid)._mfa_url()
|
||||
if not redirect:
|
||||
return url
|
||||
|
||||
parsed = werkzeug.urls.url_parse(url)
|
||||
qs = parsed.decode_query()
|
||||
qs['redirect'] = redirect
|
||||
return parsed.replace(query=werkzeug.urls.url_encode(qs)).to_url()
|
||||
|
||||
@http.route('/web/login', type='http', auth="none")
|
||||
def web_login(self, redirect=None, **kw):
|
||||
|
||||
@@ -998,6 +998,9 @@ class Users(models.Model):
|
||||
return 'base/static/img/user-slash.png'
|
||||
return super()._get_placeholder_filename(field=field)
|
||||
|
||||
def _mfa_url(self):
|
||||
""" If an MFA method is enabled, returns the URL for its second step. """
|
||||
return
|
||||
#
|
||||
# Implied groups
|
||||
#
|
||||
|
||||
+15
-5
@@ -48,7 +48,6 @@ except ImportError:
|
||||
psutil = None
|
||||
|
||||
import odoo
|
||||
from odoo import fields
|
||||
from .service.server import memory_info
|
||||
from .service import security, model as service_model
|
||||
from .sql_db import flush_env
|
||||
@@ -992,18 +991,29 @@ class OpenERPSession(sessions.Session):
|
||||
REMOTE_ADDR=wsgienv['REMOTE_ADDR'],
|
||||
)
|
||||
uid = odoo.registry(db)['res.users'].authenticate(db, login, password, env)
|
||||
self.pre_uid = uid
|
||||
|
||||
user = request.env(user=uid)['res.users'].browse(uid)
|
||||
if not user._mfa_url():
|
||||
self.finalize()
|
||||
|
||||
self.rotate = True
|
||||
self.db = db
|
||||
self.uid = uid
|
||||
self.login = login
|
||||
self.session_token = security.compute_session_token(self, request.env)
|
||||
request.uid = uid
|
||||
request.disable_db = False
|
||||
|
||||
self.get_context()
|
||||
return uid
|
||||
|
||||
def finalize(self):
|
||||
""" Finalizes a partial session, should be called on MFA validation to
|
||||
convert a partial / pre-session into a full-fledged "logged-in" one
|
||||
"""
|
||||
self.rotate = True
|
||||
request.uid = self.uid = self.pop('pre_uid')
|
||||
user = request.env(user=self.uid)['res.users'].browse(self.uid)
|
||||
self.session_token = user._compute_session_token(self.sid)
|
||||
self.get_context()
|
||||
|
||||
def check_security(self):
|
||||
"""
|
||||
Check the current authentication parameters to know if those are still
|
||||
|
||||
Reference in New Issue
Block a user