You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

99 lines
3.7 KiB

# -*- coding: utf-8 -*-
# Copyright 2016 SYLEAM
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import models, api, fields, exceptions, _
class OAuthProviderToken(models.Model):
_name = 'oauth.provider.token'
_description = 'OAuth Provider Token'
_rec_name = 'token'
token = fields.Char(required=True, help='The token itself.')
token_type = fields.Selection(
selection=[('Bearer', 'Bearer')], required=True, default='Bearer',
help='Type of token stored. Currently, only the bearer token type is '
'available.')
refresh_token = fields.Char(
help='The refresh token, if applicable.')
client_id = fields.Many2one(
comodel_name='oauth.provider.client', string='Client', required=True,
help='Client associated to this token.')
user_id = fields.Many2one(
comodel_name='res.users', string='User', required=True,
help='User associated to this token.')
scope_ids = fields.Many2many(
comodel_name='oauth.provider.scope', string='Scopes',
help='Scopes allowed by this token.')
expires_at = fields.Datetime(
required=True, help='Expiration time of the token.')
active = fields.Boolean(
compute='_compute_active', search='_search_active',
help='A token is active only if it has not yet expired.')
_sql_constraints = [
('token_unique', 'UNIQUE (token, client_id)',
'The token must be unique per client !'),
('refresh_token_unique', 'UNIQUE (refresh_token, client_id)',
'The refresh token must be unique per client !'),
]
@api.multi
def _compute_active(self):
for token in self:
token.active = fields.Datetime.now() < token.expires_at
@api.model
def _search_active(self, operator, operand):
domain = []
if operator == 'in':
if True in operand:
domain += self._search_active('=', True)
if False in operand:
domain += self._search_active('=', False)
if len(domain) > 1:
domain = [(1, '=', 1)]
elif operator == 'not in':
if True in operand:
domain += self._search_active('!=', True)
if False in operand:
domain += self._search_active('!=', False)
if len(domain) > 1:
domain = [(0, '=', 1)]
elif operator in ('=', '!='):
operators = {
('=', True): '>',
('=', False): '<=',
('!=', False): '>',
('!=', True): '<=',
}
domain = [('expires_at', operators[operator, operand],
fields.Datetime.now())]
else:
raise exceptions.UserError(
_('Invalid operator {operator} for field active!').format(
operator=operator))
return domain
@api.multi
def generate_user_id(self):
""" Generates a unique user identifier for this token """
self.ensure_one()
return self.client_id.generate_user_id(self.user_id)
@api.multi
def get_data_for_model(self, model, res_id=None, all_scopes_match=False):
""" Returns the data of the accessible records of the requested model,
Data are returned depending on the allowed scopes for the token
If the all_scopes_match argument is set to True, return only records
allowed by all token's scopes
"""
self.ensure_one()
# Retrieve records allowed from all scopes
return self.sudo(user=self.user_id).scope_ids.get_data_for_model(
model, res_id=res_id, all_scopes_match=all_scopes_match)