|
8 | 8 |
|
9 | 9 | from odoo import api, models
|
10 | 10 | from odoo.exceptions import AccessDenied
|
| 11 | +from odoo.fields import Command |
11 | 12 | from odoo.http import request
|
12 | 13 |
|
13 | 14 | _logger = logging.getLogger(__name__)
|
@@ -44,6 +45,41 @@ def _auth_oauth_get_tokens_auth_code_flow(self, oauth_provider, params):
|
44 | 45 | # https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse
|
45 | 46 | return response_json.get("access_token"), response_json.get("id_token")
|
46 | 47 |
|
| 48 | + @api.model |
| 49 | + def _auth_oauth_signin(self, provider, validation, params): |
| 50 | + """ |
| 51 | + retrieve and sign in the user corresponding to provider and validated |
| 52 | + access token |
| 53 | +
|
| 54 | + :param provider: oauth provider id (int) |
| 55 | + :param validation: result of validation of access token (dict) |
| 56 | + :param params: oauth parameters (dict) |
| 57 | + :return: user login (str) |
| 58 | + :raise: AccessDenied if signin failed |
| 59 | + """ |
| 60 | + login = super()._auth_oauth_signin(provider, validation, params) |
| 61 | + user = self.search([("login", "=", login)]) |
| 62 | + oauth_provider = self.env["auth.oauth.provider"].browse(provider) |
| 63 | + # Assume the groups are exclusively managed via OAuth 'groups' |
| 64 | + if user and oauth_provider.groups_field in validation: |
| 65 | + group_updates = [] |
| 66 | + for group_line in oauth_provider.group_line_ids: |
| 67 | + if group_line.oauth_group_name in validation.get( |
| 68 | + oauth_provider.groups_field |
| 69 | + ): |
| 70 | + _logger.debug( |
| 71 | + f"Add user {user.id} to the group {group_line.group_id.id}" |
| 72 | + ) |
| 73 | + group_updates.append((Command.LINK, group_line.group_id.id)) |
| 74 | + else: |
| 75 | + _logger.debug( |
| 76 | + f"Remove user {user.id} from the group {group_line.group_id.id}" |
| 77 | + ) |
| 78 | + group_updates.append((Command.UNLINK, group_line.group_id.id)) |
| 79 | + if group_updates: |
| 80 | + user.write({"groups_id": group_updates}) |
| 81 | + return login |
| 82 | + |
47 | 83 | @api.model
|
48 | 84 | def auth_oauth(self, provider, params):
|
49 | 85 | oauth_provider = self.env["auth.oauth.provider"].browse(provider)
|
|
0 commit comments