1+ import json
12from urllib .parse import quote
23
3- from social_core .utils import sanitize_redirect , user_is_authenticated , \
4- user_is_active , partial_pipeline_data , setting_url
4+ from social_core .utils import (
5+ partial_pipeline_data ,
6+ sanitize_redirect ,
7+ setting_url ,
8+ user_is_active ,
9+ user_is_authenticated ,
10+ )
511
612
7- def do_auth (backend , redirect_name = ' next' ):
13+ def do_auth (backend , redirect_name = " next" ):
814 # Save any defined next value into session
915 data = backend .strategy .request_data (merge = False )
1016
1117 # Save extra data into session.
12- for field_name in backend .setting (' FIELDS_STORED_IN_SESSION' , []):
18+ for field_name in backend .setting (" FIELDS_STORED_IN_SESSION" , []):
1319 if field_name in data :
1420 backend .strategy .session_set (field_name , data [field_name ])
1521 else :
1622 backend .strategy .session_set (field_name , None )
17- # uri = None
23+
1824 if redirect_name in data :
1925 # Check and sanitize a user-defined GET/POST next field value
2026 redirect_uri = data [redirect_name ]
21- if backend .setting ('SANITIZE_REDIRECTS' , True ):
22- allowed_hosts = backend .setting ('ALLOWED_REDIRECT_HOSTS' , []) + \
23- [backend .strategy .request_host ()]
27+ if backend .setting ("SANITIZE_REDIRECTS" , True ):
28+ allowed_hosts = backend .setting ("ALLOWED_REDIRECT_HOSTS" , []) + [
29+ backend .strategy .request_host ()
30+ ]
2431 redirect_uri = sanitize_redirect (allowed_hosts , redirect_uri )
2532 backend .strategy .session_set (
26- redirect_name ,
27- redirect_uri or backend .setting ('LOGIN_REDIRECT_URL' )
33+ redirect_name , redirect_uri or backend .setting ("LOGIN_REDIRECT_URL" )
2834 )
2935 response = backend .start ()
30- url = response .url .split ('?' )[1 ]
36+ url = response .url .split ("?" )[1 ]
3137
3238 def form2json (form_data ):
3339 from urllib .parse import parse_qs , urlparse
34- query = urlparse ('?' + form_data ).query
40+ query = urlparse ("?" + form_data ).query
3541 params = parse_qs (query )
3642 return {key : params [key ][0 ] for key in params }
3743 from django .core .cache import cache
38- cache .set ("oidc_key_" + data .get (' key' , '' ), form2json (url ).get (' state' ), 60 * 10 )
44+ cache .set ("oidc_key_" + data .get (" key" , "" ), form2json (url ).get (" state" ), 60 * 10 )
3945 return response
4046
4147
42- def do_complete (backend , login , user = None , redirect_name = 'next' ,
43- * args , ** kwargs ):
48+ def do_complete (backend , login , user = None , redirect_name = "next" , * args , ** kwargs ):
4449 data = backend .strategy .request_data ()
4550
4651 is_authenticated = user_is_authenticated (user )
@@ -56,8 +61,9 @@ def do_complete(backend, login, user=None, redirect_name='next',
5661
5762 # pop redirect value before the session is trashed on login(), but after
5863 # the pipeline so that the pipeline can change the redirect if needed
59- redirect_value = backend .strategy .session_get (redirect_name , '' ) or \
60- data .get (redirect_name , '' )
64+ redirect_value = backend .strategy .session_get (redirect_name , "" ) or data .get (
65+ redirect_name , ""
66+ )
6167
6268 # check if the output value is something else than a user and just
6369 # return it to the client
@@ -67,54 +73,99 @@ def do_complete(backend, login, user=None, redirect_name='next',
6773
6874 if is_authenticated :
6975 if not user :
70- url = setting_url (backend , redirect_value , ' LOGIN_REDIRECT_URL' )
76+ url = setting_url (backend , redirect_value , " LOGIN_REDIRECT_URL" )
7177 else :
72- url = setting_url (backend , redirect_value ,
73- 'NEW_ASSOCIATION_REDIRECT_URL' ,
74- 'LOGIN_REDIRECT_URL' )
78+ url = setting_url (
79+ backend ,
80+ redirect_value ,
81+ "NEW_ASSOCIATION_REDIRECT_URL" ,
82+ "LOGIN_REDIRECT_URL" ,
83+ )
7584 elif user :
7685 if user_is_active (user ):
7786 # catch is_new/social_user in case login() resets the instance
78- is_new = getattr (user , ' is_new' , False )
87+ is_new = getattr (user , " is_new" , False )
7988 social_user = user .social_user
8089 login (backend , user , social_user )
8190 # store last login backend name in session
82- backend .strategy .session_set ('social_auth_last_login_backend' ,
83- social_user .provider )
91+ backend .strategy .session_set (
92+ "social_auth_last_login_backend" , social_user .provider
93+ )
8494
8595 if is_new :
86- url = setting_url (backend ,
87- 'NEW_USER_REDIRECT_URL' ,
88- redirect_value ,
89- 'LOGIN_REDIRECT_URL' )
96+ url = setting_url (
97+ backend ,
98+ "NEW_USER_REDIRECT_URL" ,
99+ redirect_value ,
100+ "LOGIN_REDIRECT_URL" ,
101+ )
90102 else :
91- url = setting_url (backend , redirect_value ,
92- 'LOGIN_REDIRECT_URL' )
103+ url = setting_url (backend , redirect_value , "LOGIN_REDIRECT_URL" )
93104 else :
94- if backend .setting (' INACTIVE_USER_LOGIN' , False ):
105+ if backend .setting (" INACTIVE_USER_LOGIN" , False ):
95106 social_user = user .social_user
96107 login (backend , user , social_user )
97- url = setting_url (backend , 'INACTIVE_USER_URL' , 'LOGIN_ERROR_URL' ,
98- 'LOGIN_URL' )
108+ url = setting_url (
109+ backend , "INACTIVE_USER_URL" , "LOGIN_ERROR_URL" , "LOGIN_URL"
110+ )
99111 else :
100- url = setting_url (backend , ' LOGIN_ERROR_URL' , ' LOGIN_URL' )
112+ url = setting_url (backend , " LOGIN_ERROR_URL" , " LOGIN_URL" )
101113
102114 if redirect_value and redirect_value != url :
103115 redirect_value = quote (redirect_value )
104- url += ('&' if '?' in url else '?' ) + \
105- '{0}={1}' .format (redirect_name , redirect_value )
106-
107- if backend .setting ('SANITIZE_REDIRECTS' , True ):
108- allowed_hosts = backend .setting ('ALLOWED_REDIRECT_HOSTS' , []) + \
109- [backend .strategy .request_host ()]
110- url = sanitize_redirect (allowed_hosts , url ) or \
111- backend .setting ('LOGIN_REDIRECT_URL' )
116+ url += ("&" if "?" in url else "?" ) + f"{ redirect_name } ={ redirect_value } "
117+
118+ if backend .setting ("SANITIZE_REDIRECTS" , True ):
119+ allowed_hosts = backend .setting ("ALLOWED_REDIRECT_HOSTS" , []) + [
120+ backend .strategy .request_host ()
121+ ]
122+ url = sanitize_redirect (allowed_hosts , url ) or backend .setting (
123+ "LOGIN_REDIRECT_URL"
124+ )
125+
112126 response = backend .strategy .redirect (url )
113- social_auth = user .social_auth .filter (provider = 'drycc' ).\
114- order_by ('-modified' ).last ()
127+ social_auth = user .social_auth .filter (provider = "drycc" ).\
128+ order_by ("-modified" ).last ()
129+ if social_auth and social_auth .extra_data :
130+ extra_data = json .loads (social_auth .extra_data ) if \
131+ isinstance (social_auth .extra_data , str ) else social_auth .extra_data
115132 from django .core .cache import cache
116- cache .set ("oidc_state_" + data .get (' state' ),
117- {' token' : social_auth . extra_data .get (' id_token' , ' fail' ),
118- ' username' : user .username },
133+ cache .set ("oidc_state_" + data .get (" state" ),
134+ {" token" : extra_data .get (" id_token" , " fail" ),
135+ " username" : user .username },
119136 60 * 10 )
120137 return response
138+
139+
140+ def do_disconnect (
141+ backend , user , association_id = None , redirect_name = "next" , * args , ** kwargs
142+ ):
143+ partial = partial_pipeline_data (backend , user , * args , ** kwargs )
144+ if partial :
145+ if association_id and not partial .kwargs .get ("association_id" ):
146+ partial .extend_kwargs ({"association_id" : association_id })
147+ response = backend .disconnect (* partial .args , ** partial .kwargs )
148+ # clean partial data after usage
149+ backend .strategy .clean_partial_pipeline (partial .token )
150+ else :
151+ response = backend .disconnect (
152+ user = user , association_id = association_id , * args , ** kwargs
153+ )
154+
155+ if isinstance (response , dict ):
156+ url = backend .strategy .absolute_uri (
157+ backend .strategy .request_data ().get (redirect_name , "" )
158+ or backend .setting ("DISCONNECT_REDIRECT_URL" )
159+ or backend .setting ("LOGIN_REDIRECT_URL" )
160+ )
161+ if backend .setting ("SANITIZE_REDIRECTS" , True ):
162+ allowed_hosts = backend .setting ("ALLOWED_REDIRECT_HOSTS" , []) + [
163+ backend .strategy .request_host ()
164+ ]
165+ url = (
166+ sanitize_redirect (allowed_hosts , url )
167+ or backend .setting ("DISCONNECT_REDIRECT_URL" )
168+ or backend .setting ("LOGIN_REDIRECT_URL" )
169+ )
170+ response = backend .strategy .redirect (url )
171+ return response
0 commit comments