77from ckan .plugins import toolkit as tk
88from ckan .views .user import RequestResetView , set_repoze_user
99from flask import Blueprint
10+ import ckan .plugins as plugins
1011
1112import ckanext .sso .helpers as helpers
1213from ckanext .sso .ssoclient import SSOClient
1314from ckanext .sso .ldap_client import LDAPClient
14-
15+ from ckan .common import (
16+ _ , config , g , request , current_user , logout_user , session , login_user
17+ )
1518g = tk .g
1619
1720log = logging .getLogger (__name__ )
@@ -24,7 +27,8 @@ def before_app_request():
2427 bp , action = tk .get_endpoint ()
2528 if bp == "user" and action == "login" and helpers .check_default_login ():
2629 return tk .redirect_to (h .url_for ("sso.sso" ))
27-
30+ if bp == "user" and action == "logout" :
31+ return tk .redirect_to (h .url_for ('sso.sso_logout' ))
2832
2933
3034
@@ -88,6 +92,12 @@ def dashboard():
8892 "fullname" : userinfo ["name" ],
8993 "plugin_extras" : {"idp" : userinfo ["sub" ]},
9094 }
95+ picture_url = (userinfo .get ('picture' ) or
96+ userinfo .get ('avatar' ) or
97+ userinfo .get ('image' ))
98+ if picture_url :
99+ user_dict ['image_url' ] = picture_url
100+
91101 log .debug (f"User Info: { user_dict } " )
92102 #ldap info
93103 ldap_department_num = None
@@ -178,10 +188,33 @@ def reset_password():
178188 return tk .redirect_to (tk .url_for ("user.login" ))
179189 return RequestResetView ().post ()
180190
191+ def sso_logout ():
192+ for item in plugins .PluginImplementations (plugins .IAuthenticator ):
193+ response = item .logout ()
194+ if response :
195+ return response
196+ user = current_user .name
197+ if not user :
198+ return h .redirect_to ('user.login' )
199+
200+ came_from = request .args .get ('came_from' , '' )
201+ logout_user ()
202+
203+ field_name = config .get ("WTF_CSRF_FIELD_NAME" )
204+ if session .get (field_name ):
205+ session .pop (field_name )
206+
207+ if h .url_is_local (came_from ):
208+ return h .redirect_to (str (came_from ))
209+
210+ logout_url = sso_client .get_logout_url ()
211+ return tk .redirect_to (logout_url )
212+
181213
182214blueprint .add_url_rule ("/sso" , view_func = sso )
183215blueprint .add_url_rule ("/dashboard" , view_func = dashboard )
184216blueprint .add_url_rule ("/reset_password" , view_func = reset_password , methods = ["POST" ])
217+ blueprint .add_url_rule ('/sso_logout' , view_func = sso_logout )
185218
186219
187220def get_blueprint ():
0 commit comments