88from django .contrib .auth .decorators import login_required
99from django .http import HttpResponse
1010from django .shortcuts import redirect
11+ from django .contrib import messages
1112from django .utils import timezone
12- from django .utils .crypto import get_random_string
1313from .models import Credentials
1414from . import settings
1515from datetime import timedelta
1616import requests
17+ import urllib
18+ import logging
19+ logging .basicConfig (level = logging .INFO )
20+ logger = logging .getLogger (__name__ )
1721
1822
1923def index (request = None ):
20- return HttpResponse (" Replyify-OAuth2 index." )
24+ return HttpResponse (' Replyify-OAuth2 index.' )
2125
2226
2327@login_required
2428def authorize (request = None ):
25- uid = getattr (request .user , settings .REPLYIFY_USER_ID_FIELD )
26- client_id = settings .REPLYIFY_CLIENT_ID
27- redirect_uri = settings .REPLYIFY_REDIRECT_URI
28- response_type = 'code'
29-
30- state = get_random_string (20 , "abcdefghijklmnopqrstuvwxyz0123456789" )
31- request .session ['state' ] = {state : uid }
32-
33- args = [
34- "client_id={0}" .format (client_id ),
35- "redirect_uri={0}" .format (redirect_uri ),
36- "response_type={0}" .format (response_type ),
37- "state={0}" .format (state )
38- ]
39- url = "{0}?{1}" .format (settings .REPLYIFY_AUTH_URL , "&" .join (args ))
40-
29+ # uid = getattr(request.user, settings.REPLYIFY_USER_ID_FIELD)
30+ next_url = request .GET .get ('next' , request .GET .get ('state' , '/' ))
31+ logger .info ('** REPLYIFY: /authorize - Next URL: {}' .format (next_url ))
32+ # state = get_random_string(20, 'abcdefghijklmnopqrstuvwxyz0123456789')
33+ request .session ['state' ] = next_url
34+ params = {
35+ 'client_id' : settings .REPLYIFY_CLIENT_ID ,
36+ 'redirect_uri' : settings .REPLYIFY_REDIRECT_URI ,
37+ 'response_type' : 'code' ,
38+ 'state' : next_url ,
39+ }
40+ url = '{0}?{1}' .format (settings .REPLYIFY_AUTH_URL , urllib .urlencode (params ))
41+ logger .info ('** REPLYIFY: /authorize - Redirecting to: {}' .format (url ))
4142 return redirect (url )
4243
4344
4445@login_required
4546def callback (request = None ):
4647 if 'error' in request .GET :
4748 raise Exception (request .GET ['error' ])
48-
49- uid = _check_state (request )
50- code = request .GET ['code' ]
49+ logger .info ('** REPLYIFY: /callback' )
5150 data = {
5251 'grant_type' : 'authorization_code' ,
53- 'code' : code ,
52+ 'code' : request . GET [ ' code' ] ,
5453 'client_id' : settings .REPLYIFY_CLIENT_ID ,
54+ 'client_secret' : settings .REPLYIFY_CLIENT_SECRET ,
5555 'redirect_uri' : settings .REPLYIFY_REDIRECT_URI
5656 }
5757 url = settings .REPLYIFY_TOKEN_URL
58- r = requests .post (url = url , data = data )
59- data = r .json ()
60- creds = _store_credentials (uid , data )
61-
62- return HttpResponse (creds )
58+ logger .info ('** REPLYIFY: Token URL - {}' .format (url ))
59+ logger .info ('** REPLYIFY: Token data - {}' .format (data ))
60+ response = requests .post (url = url , data = data )
61+ response_data = response .json ()
62+ logger .info ('** REPLYIFY: Response data - {}' .format (response_data ))
63+ if response_data .get ('error' ):
64+ logger .error ('** REPLYIFY ERROR: {}' .format (response_data ['error' ]))
65+ messages .error (request , 'REPLYIFY ERROR: {}' .format (response_data ['error' ]))
66+ else :
67+ _store_credentials (request .user , response_data )
68+ return redirect (request .GET .get ('state' , '/' ))
6369
6470
6571@login_required
6672def refresh (request = None ):
6773 if 'error' in request .GET :
6874 raise Exception (request .GET ['error' ])
69-
75+ logger . info ( '** REPLYIFY: /refresh' )
7076 try :
77+ next_url = request .GET .get ('next' , request .GET .get ('state' , '/' ))
7178 creds = Credentials .objects .get (user = request .user )
7279
7380 data = {
@@ -78,38 +85,23 @@ def refresh(request=None):
7885 }
7986
8087 url = settings .REPLYIFY_TOKEN_URL
81- r = requests . post (url = url , data = data )
82- data = r . json ( )
83-
84- creds = _store_credentials (user = request .user , data = data )
85- return HttpResponse ( creds )
88+ logger . info ( '** REPLYIFY: Refresh Token URL - {}' . format (url ) )
89+ logger . info ( '** REPLYIFY: Token data - {}' . format ( data ) )
90+ response = requests . post ( url = url , data = data )
91+ _store_credentials (request .user , response . json () )
92+ return redirect ( next_url )
8693
8794 except Credentials .DoesNotExist :
8895 authorize (request )
8996
9097
91- def _check_state (request = None ):
92- uid = getattr (request .user , settings .REPLYIFY_USER_ID_FIELD )
93- msg = "Something fishy is happening. Abort ..."
94-
95- if 'state' not in request .session :
96- raise Exception (msg )
97- state = request .GET ['state' ]
98- from_session = request .session ['state' ][state ]
99- if from_session != uid :
100- raise Exception (msg )
101-
102- request .session .pop ('state' )
103- return uid
104-
105-
106- def _store_credentials (user , data = None ):
98+ def _store_credentials (user , replyify_json = None ):
10799 assert user is not None
108100 creds , _ = Credentials .objects .get_or_create (user = user )
109- creds .access_token = data ['access_token' ]
110- creds .refresh_token = data ['refresh_token' ]
111- creds .expires = timezone .now () + timedelta (seconds = data ['expires_in' ])
112- creds .scope = data ['scope' ]
113- creds .token_type = data ['token_type' ]
101+ creds .access_token = replyify_json ['access_token' ]
102+ creds .refresh_token = replyify_json ['refresh_token' ]
103+ creds .expires = timezone .now () + timedelta (seconds = replyify_json ['expires_in' ])
104+ creds .scope = replyify_json ['scope' ]
105+ creds .token_type = replyify_json ['token_type' ]
114106 creds .save ()
115107 return creds
0 commit comments