11# Copyright 2024 Akretion (http://www.akretion.com).
22# @author Florian Mounier <florian.mounier@akretion.com>
33# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+ import re
45from datetime import datetime , timedelta , timezone
56from secrets import token_urlsafe
67
@@ -34,6 +35,14 @@ class CrossConnectClient(models.Model):
3435 related = "endpoint_id.cross_connect_allowed_group_ids" ,
3536 )
3637
38+ bypass_user_mail_re = fields .Char (
39+ string = "Bypass Users Email Regexes" ,
40+ help = (
41+ "If set, users with an email matching one of these regex will bypass "
42+ "the token user/login creation. The regexes are comma separated."
43+ ),
44+ )
45+
3746 group_ids = fields .Many2many (
3847 "res.groups" ,
3948 string = "Groups" ,
@@ -64,6 +73,12 @@ def _compute_user_count(self):
6473 record .user_count = len (record .user_ids )
6574
6675 def _request_access (self , access_request ):
76+ if self .bypass_user_mail_re and any (
77+ re .search (mail_re .strip (), access_request .email )
78+ for mail_re in self .bypass_user_mail_re .split ("," )
79+ ):
80+ return "bypass"
81+
6782 # check groups
6883 groups = self .env ["res.groups" ].browse (access_request .groups )
6984 if groups - self .group_ids or not groups .exists ():
@@ -72,6 +87,13 @@ def _request_access(self, access_request):
7287 user = self .user_ids .filtered (
7388 lambda u : u .cross_connect_client_user_id == access_request .id
7489 )
90+
91+ # Fallback to default lang if not installed
92+ if access_request .lang not in [
93+ code for code , _name in self .env ["res.lang" ].get_installed ()
94+ ]:
95+ access_request .lang = "en_US"
96+
7597 vals = {
7698 "login" : f"{ self .id } _{ access_request .id } _{ access_request .login } " ,
7799 "email" : access_request .email ,
@@ -94,7 +116,6 @@ def _request_access(self, access_request):
94116 "exp" : datetime .now (tz = timezone .utc ) + timedelta (minutes = 2 ),
95117 "aud" : str (self .id ),
96118 "id" : user .id ,
97- "redirect_url" : access_request .redirect_url or "/web" ,
98119 },
99120 self .endpoint_id .cross_connect_secret_key ,
100121 algorithm = "HS256" ,
@@ -117,4 +138,10 @@ def _log_from_token(self, token):
117138 if not user :
118139 raise AccessDenied (_ ("Invalid Token" ))
119140
120- return user , obj ["redirect_url" ]
141+ return user
142+
143+ def _get_final_redirect_url (self , ** params ):
144+ """Get the final redirect url after login.
145+ Override this method to customize the local landing action.
146+ """
147+ return "/web"
0 commit comments