1010from odoo import http , fields
1111from odoo .addons .web .controllers .main import ensure_db
1212
13+ from ..http import route
14+ from .oauth2_mixin import OauthMixin
15+
1316_logger = logging .getLogger (__name__ )
1417
1518try :
1922 _logger .debug ('Cannot `import oauthlib`.' )
2023
2124
22- class OAuth2ProviderController (http .Controller ):
23- def __init__ (self ):
24- super (OAuth2ProviderController , self ).__init__ ()
25-
26- def _get_request_information (self ):
27- """ Retrieve needed arguments for oauthlib methods """
28- uri = http .request .httprequest .base_url
29- http_method = http .request .httprequest .method
30- body = oauthlib .common .urlencode (
31- http .request .httprequest .values .items ())
32- headers = http .request .httprequest .headers
33-
34- return uri , http_method , body , headers
35-
36- def _check_access_token (self , access_token ):
37- """ Check if the provided access token is valid """
38- token = http .request .env ['oauth.provider.token' ].search ([
39- ('token' , '=' , access_token ),
40- ])
41- if not token :
42- return False
43-
44- oauth2_server = token .client_id .get_oauth2_server ()
45- # Retrieve needed arguments for oauthlib methods
46- uri , http_method , body , headers = self ._get_request_information ()
47-
48- # Validate request information
49- valid , oauthlib_request = oauth2_server .verify_request (
50- uri , http_method = http_method , body = body , headers = headers )
51-
52- if valid :
53- return token
54-
55- return False
56-
57- def _json_response (self , data = None , status = 200 , headers = None ):
58- """ Returns a json response to the client """
59- if headers is None :
60- headers = {'Content-Type' : 'application/json' }
61-
62- return werkzeug .wrappers .BaseResponse (
63- json .dumps (data ), status = status , headers = headers )
25+ class OAuth2ProviderController (OauthMixin ):
6426
65- @http .route ('/oauth2/authorize' , type = 'http' , auth = 'user' , methods = ['GET' ])
27+ @route ('/oauth2/authorize' ,
28+ type = 'http' ,
29+ auth = 'user' ,
30+ methods = ['GET' ],
31+ )
6632 def authorize (self , client_id = None , response_type = None , redirect_uri = None ,
6733 scope = None , state = None , * args , ** kwargs ):
6834 """ Check client's request, and display an authorization page to the user,
@@ -122,8 +88,11 @@ def authorize(self, client_id=None, response_type=None, redirect_uri=None,
12288 'oauth_scopes' : oauth_scopes ,
12389 })
12490
125- @http .route (
126- '/oauth2/authorize' , type = 'http' , auth = 'user' , methods = ['POST' ])
91+ @http .route ('/oauth2/authorize' ,
92+ type = 'http' ,
93+ auth = 'user' ,
94+ methods = ['POST' ],
95+ )
12796 def authorize_post (self , * args , ** kwargs ):
12897 """ Redirect to the requested URI during the authorization """
12998 client = http .request .env ['oauth.provider.client' ].search ([
@@ -147,8 +116,12 @@ def authorize_post(self, *args, **kwargs):
147116
148117 return werkzeug .utils .redirect (headers ['Location' ], code = status )
149118
150- @http .route ('/oauth2/token' , type = 'http' , auth = 'none' , methods = ['POST' ],
151- csrf = False )
119+ @http .route ('/oauth2/token' ,
120+ type = 'http' ,
121+ auth = 'none' ,
122+ methods = ['POST' ],
123+ csrf = False ,
124+ )
152125 def token (self , client_id = None , client_secret = None , redirect_uri = None ,
153126 scope = None , code = None , grant_type = None , username = None ,
154127 password = None , refresh_token = None , * args , ** kwargs ):
@@ -199,14 +172,18 @@ def token(self, client_id=None, client_secret=None, redirect_uri=None,
199172 return werkzeug .wrappers .BaseResponse (
200173 body , status = status , headers = headers )
201174
202- @http .route ('/oauth2/tokeninfo' , type = 'http' , auth = 'none' , methods = ['GET' ])
175+ @http .route ('/oauth2/tokeninfo' ,
176+ type = 'http' ,
177+ auth = 'none' ,
178+ methods = ['GET' ],
179+ )
203180 def tokeninfo (self , access_token = None , * args , ** kwargs ):
204181 """ Return some information about the supplied token
205182
206183 Similar to Google's "tokeninfo" request
207184 """
208185 ensure_db ()
209- token = self ._check_access_token (access_token )
186+ token = self ._get_access_token (access_token )
210187 if not token :
211188 return self ._json_response (
212189 data = {'error' : 'invalid_or_expired_token' }, status = 401 )
@@ -228,26 +205,34 @@ def tokeninfo(self, access_token=None, *args, **kwargs):
228205 data .update (user_id = token .generate_user_id ())
229206 return self ._json_response (data = data )
230207
231- @http .route ('/oauth2/userinfo' , type = 'http' , auth = 'none' , methods = ['GET' ])
208+ @http .route ('/oauth2/userinfo' ,
209+ type = 'http' ,
210+ auth = 'none' ,
211+ methods = ['GET' ],
212+ )
232213 def userinfo (self , access_token = None , * args , ** kwargs ):
233214 """ Return some information about the user linked to the supplied token
234215
235216 Similar to Google's "userinfo" request
236217 """
237218 ensure_db ()
238- token = self ._check_access_token (access_token )
219+ token = self ._get_access_token (access_token )
239220 if not token :
240221 return self ._json_response (
241222 data = {'error' : 'invalid_or_expired_token' }, status = 401 )
242223
243224 data = token .get_data_for_model ('res.users' , res_id = token .user_id .id )
244225 return self ._json_response (data = data )
245226
246- @http .route ('/oauth2/otherinfo' , type = 'http' , auth = 'none' , methods = ['GET' ])
227+ @http .route ('/oauth2/otherinfo' ,
228+ type = 'http' ,
229+ auth = 'none' ,
230+ methods = ['GET' ],
231+ )
247232 def otherinfo (self , access_token = None , model = None , * args , ** kwargs ):
248233 """ Return allowed information about the requested model """
249234 ensure_db ()
250- token = self ._check_access_token (access_token )
235+ token = self ._get_access_token (access_token )
251236 if not token :
252237 return self ._json_response (
253238 data = {'error' : 'invalid_or_expired_token' }, status = 401 )
@@ -262,8 +247,11 @@ def otherinfo(self, access_token=None, model=None, *args, **kwargs):
262247 data = token .get_data_for_model (model )
263248 return self ._json_response (data = data )
264249
265- @http .route (
266- '/oauth2/revoke_token' , type = 'http' , auth = 'none' , methods = ['POST' ])
250+ @http .route ('/oauth2/revoke_token' ,
251+ type = 'http' ,
252+ auth = 'none' ,
253+ methods = ['POST' ],
254+ )
267255 def revoke_token (self , token = None , * args , ** kwargs ):
268256 """ Revoke the supplied token """
269257 ensure_db ()
0 commit comments