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
6-
7- def do_auth (backend , redirect_name = 'next' ):
12+ def do_auth (backend , redirect_name = "next" ):
813 # Save any defined next value into session
914 data = backend .strategy .request_data (merge = False )
1015
1116 # Save extra data into session.
12- for field_name in backend .setting (' FIELDS_STORED_IN_SESSION' , []):
17+ for field_name in backend .setting (" FIELDS_STORED_IN_SESSION" , []):
1318 if field_name in data :
1419 backend .strategy .session_set (field_name , data [field_name ])
1520 else :
1621 backend .strategy .session_set (field_name , None )
17- # uri = None
22+
1823 if redirect_name in data :
1924 # Check and sanitize a user-defined GET/POST next field value
2025 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 ()]
26+ if backend .setting ("SANITIZE_REDIRECTS" , True ):
27+ allowed_hosts = backend .setting ("ALLOWED_REDIRECT_HOSTS" , []) + [
28+ backend .strategy .request_host ()
29+ ]
2430 redirect_uri = sanitize_redirect (allowed_hosts , redirect_uri )
2531 backend .strategy .session_set (
26- redirect_name ,
27- redirect_uri or backend .setting ('LOGIN_REDIRECT_URL' )
32+ redirect_name , redirect_uri or backend .setting ("LOGIN_REDIRECT_URL" )
2833 )
2934 response = backend .start ()
30- url = response .url .split ('?' )[1 ]
35+ url = response .url .split ("?" )[1 ]
3136
3237 def form2json (form_data ):
3338 from urllib .parse import parse_qs , urlparse
34- query = urlparse ('?' + form_data ).query
39+ query = urlparse ("?" + form_data ).query
3540 params = parse_qs (query )
3641 return {key : params [key ][0 ] for key in params }
3742 from django .core .cache import cache
38- cache .set ("oidc_key_" + data .get (' key' , '' ), form2json (url ).get (' state' ), 60 * 10 )
43+ cache .set ("oidc_key_" + data .get (" key" , "" ), form2json (url ).get (" state" ), 60 * 10 )
3944 return response
4045
41-
42- def do_complete (backend , login , user = None , redirect_name = 'next' ,
43- * args , ** kwargs ):
46+ def do_complete (backend , login , user = None , redirect_name = "next" , * args , ** kwargs ):
4447 data = backend .strategy .request_data ()
4548
4649 is_authenticated = user_is_authenticated (user )
@@ -56,8 +59,9 @@ def do_complete(backend, login, user=None, redirect_name='next',
5659
5760 # pop redirect value before the session is trashed on login(), but after
5861 # 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 , '' )
62+ redirect_value = backend .strategy .session_get (redirect_name , "" ) or data .get (
63+ redirect_name , ""
64+ )
6165
6266 # check if the output value is something else than a user and just
6367 # return it to the client
@@ -67,54 +71,98 @@ def do_complete(backend, login, user=None, redirect_name='next',
6771
6872 if is_authenticated :
6973 if not user :
70- url = setting_url (backend , redirect_value , ' LOGIN_REDIRECT_URL' )
74+ url = setting_url (backend , redirect_value , " LOGIN_REDIRECT_URL" )
7175 else :
72- url = setting_url (backend , redirect_value ,
73- 'NEW_ASSOCIATION_REDIRECT_URL' ,
74- 'LOGIN_REDIRECT_URL' )
76+ url = setting_url (
77+ backend ,
78+ redirect_value ,
79+ "NEW_ASSOCIATION_REDIRECT_URL" ,
80+ "LOGIN_REDIRECT_URL" ,
81+ )
7582 elif user :
7683 if user_is_active (user ):
7784 # catch is_new/social_user in case login() resets the instance
78- is_new = getattr (user , ' is_new' , False )
85+ is_new = getattr (user , " is_new" , False )
7986 social_user = user .social_user
8087 login (backend , user , social_user )
8188 # store last login backend name in session
82- backend .strategy .session_set ('social_auth_last_login_backend' ,
83- social_user .provider )
89+ backend .strategy .session_set (
90+ "social_auth_last_login_backend" , social_user .provider
91+ )
8492
8593 if is_new :
86- url = setting_url (backend ,
87- 'NEW_USER_REDIRECT_URL' ,
88- redirect_value ,
89- 'LOGIN_REDIRECT_URL' )
94+ url = setting_url (
95+ backend ,
96+ "NEW_USER_REDIRECT_URL" ,
97+ redirect_value ,
98+ "LOGIN_REDIRECT_URL" ,
99+ )
90100 else :
91- url = setting_url (backend , redirect_value ,
92- 'LOGIN_REDIRECT_URL' )
101+ url = setting_url (backend , redirect_value , "LOGIN_REDIRECT_URL" )
93102 else :
94- if backend .setting (' INACTIVE_USER_LOGIN' , False ):
103+ if backend .setting (" INACTIVE_USER_LOGIN" , False ):
95104 social_user = user .social_user
96105 login (backend , user , social_user )
97- url = setting_url (backend , 'INACTIVE_USER_URL' , 'LOGIN_ERROR_URL' ,
98- 'LOGIN_URL' )
106+ url = setting_url (
107+ backend , "INACTIVE_USER_URL" , "LOGIN_ERROR_URL" , "LOGIN_URL"
108+ )
99109 else :
100- url = setting_url (backend , ' LOGIN_ERROR_URL' , ' LOGIN_URL' )
110+ url = setting_url (backend , " LOGIN_ERROR_URL" , " LOGIN_URL" )
101111
102112 if redirect_value and redirect_value != url :
103113 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' )
114+ url += ("&" if "?" in url else "?" ) + f"{ redirect_name } ={ redirect_value } "
115+
116+ if backend .setting ("SANITIZE_REDIRECTS" , True ):
117+ allowed_hosts = backend .setting ("ALLOWED_REDIRECT_HOSTS" , []) + [
118+ backend .strategy .request_host ()
119+ ]
120+ url = sanitize_redirect (allowed_hosts , url ) or backend .setting (
121+ "LOGIN_REDIRECT_URL"
122+ )
123+
112124 response = backend .strategy .redirect (url )
113- social_auth = user .social_auth .filter (provider = 'drycc' ).\
114- order_by ('-modified' ).last ()
125+ social_auth = user .social_auth .filter (provider = "drycc" ).\
126+ order_by ("-modified" ).last ()
127+ if social_auth and social_auth .extra_data :
128+ extra_data = json .loads (social_auth .extra_data ) if \
129+ isinstance (social_auth .extra_data , str ) else social_auth .extra_data
115130 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 },
131+ cache .set ("oidc_state_" + data .get (" state" ),
132+ {" token" : extra_data .get (" id_token" , " fail" ),
133+ " username" : user .username },
119134 60 * 10 )
120135 return response
136+
137+ def do_disconnect (
138+ backend , user , association_id = None , redirect_name = "next" , * args , ** kwargs
139+ ):
140+ partial = partial_pipeline_data (backend , user , * args , ** kwargs )
141+ if partial :
142+ if association_id and not partial .kwargs .get ("association_id" ):
143+ partial .extend_kwargs ({"association_id" : association_id })
144+ response = backend .disconnect (* partial .args , ** partial .kwargs )
145+ # clean partial data after usage
146+ backend .strategy .clean_partial_pipeline (partial .token )
147+ else :
148+ response = backend .disconnect (
149+ user = user , association_id = association_id , * args , ** kwargs
150+ )
151+
152+ if isinstance (response , dict ):
153+ url = backend .strategy .absolute_uri (
154+ backend .strategy .request_data ().get (redirect_name , "" )
155+ or backend .setting ("DISCONNECT_REDIRECT_URL" )
156+ or backend .setting ("LOGIN_REDIRECT_URL" )
157+ )
158+ if backend .setting ("SANITIZE_REDIRECTS" , True ):
159+ allowed_hosts = backend .setting ("ALLOWED_REDIRECT_HOSTS" , []) + [
160+ backend .strategy .request_host ()
161+ ]
162+ url = (
163+ sanitize_redirect (allowed_hosts , url )
164+ or backend .setting ("DISCONNECT_REDIRECT_URL" )
165+ or backend .setting ("LOGIN_REDIRECT_URL" )
166+ )
167+ response = backend .strategy .redirect (url )
168+ return response
0 commit comments