42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
import json
|
|
import logging
|
|
from werkzeug.urls import url_encode
|
|
|
|
from odoo import fields, models
|
|
|
|
from ..controllers.databases import ACCOUNTS_URL
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ResUsers(models.Model):
|
|
_inherit = 'res.users'
|
|
|
|
databases_sso_uid = fields.Char(string='Databases OAuth User ID', help="OAuth user_id", copy=False)
|
|
|
|
def _get_action_retrieve_oauth(self, db_id):
|
|
# When the user clicks on this action, it simulates a reset password and a sign up through oauth.
|
|
# The password doesn't get reset but the oauth gets set.
|
|
# The user can now connect with both methods.
|
|
|
|
# Note: this shouldn't ever happen from the standard flow but we may never know 🤷♂️
|
|
assert self == self.env.user, "A user shouldn't be able to trigger the oauth flow for another user"
|
|
|
|
partner = self.partner_id
|
|
_logger.info('Retrieve databases_sso_uid for %s', self)
|
|
params = dict(
|
|
response_type='token',
|
|
client_id=self.env['ir.config_parameter'].sudo().get_param('database.uuid'),
|
|
redirect_uri=f'{partner.get_base_url()}/databases/auth',
|
|
scope='userinfo',
|
|
state=json.dumps({
|
|
'r': int(db_id), # ensure no one pass anything else than an int
|
|
't': partner.sudo()._generate_signup_token(),
|
|
}),
|
|
)
|
|
return {
|
|
'type': 'ir.actions.act_url',
|
|
'url': f"{ACCOUNTS_URL}/oauth2/auth?{url_encode(params)}",
|
|
'target': 'new',
|
|
}
|