12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- # -*- coding: utf-8 -*-
- # Part of Odoo. See LICENSE file for full copyright and licensing details.
- import json
- import logging
- from werkzeug.exceptions import Forbidden
- from werkzeug.urls import url_encode
- from odoo import _, http
- from odoo.exceptions import UserError
- from odoo.http import request
- from odoo.tools import consteq
- _logger = logging.getLogger(__name__)
- class GoogleGmailController(http.Controller):
- @http.route('/google_gmail/confirm', type='http', auth='user')
- def google_gmail_callback(self, code=None, state=None, error=None, **kwargs):
- """Callback URL during the OAuth process.
- Gmail redirects the user browser to this endpoint with the authorization code.
- We will fetch the refresh token and the access token thanks to this authorization
- code and save those values on the given mail server.
- """
- if not request.env.user.has_group('base.group_system'):
- _logger.error('Google Gmail: non-system user trying to link an Gmail account.')
- raise Forbidden()
- if error:
- return _('An error occur during the authentication process.')
- try:
- state = json.loads(state)
- model_name = state['model']
- rec_id = state['id']
- csrf_token = state['csrf_token']
- except Exception:
- _logger.error('Google Gmail: Wrong state value %r.', state)
- raise Forbidden()
- model = request.env[model_name]
- if not issubclass(type(model), request.env.registry['google.gmail.mixin']):
- # The model must inherits from the "google.gmail.mixin" mixin
- raise Forbidden()
- record = model.browse(rec_id).exists()
- if not record:
- raise Forbidden()
- if not csrf_token or not consteq(csrf_token, record._get_gmail_csrf_token()):
- _logger.error('Google Gmail: Wrong CSRF token during Gmail authentication.')
- raise Forbidden()
- try:
- refresh_token, access_token, expiration = record._fetch_gmail_refresh_token(code)
- except UserError:
- return _('An error occur during the authentication process.')
- record.write({
- 'google_gmail_access_token': access_token,
- 'google_gmail_access_token_expiration': expiration,
- 'google_gmail_authorization_code': code,
- 'google_gmail_refresh_token': refresh_token,
- })
- url_params = {
- 'id': rec_id,
- 'model': model_name,
- 'view_type': 'form'
- }
- url = '/web?#' + url_encode(url_params)
- return request.redirect(url)
|