Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pass SLO request/response to callback #384

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/onelogin/saml2/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ def process_slo(self, keep_local_session=False, request_id=None, delete_session_
else:
self._last_message_id = logout_response.id
if not keep_local_session:
OneLogin_Saml2_Utils.delete_local_session(delete_session_cb)
OneLogin_Saml2_Utils.delete_local_session(delete_session_cb, logout_response=logout_response)

elif get_data and 'SAMLRequest' in get_data:
logout_request = self.logout_request_class(self._settings, get_data['SAMLRequest'])
Expand All @@ -182,7 +182,7 @@ def process_slo(self, keep_local_session=False, request_id=None, delete_session_
self._errors.append('invalid_logout_request')
else:
if not keep_local_session:
OneLogin_Saml2_Utils.delete_local_session(delete_session_cb)
OneLogin_Saml2_Utils.delete_local_session(delete_session_cb, logout_request=logout_request)

in_response_to = logout_request.id
self._last_message_id = logout_request.id
Expand Down
8 changes: 6 additions & 2 deletions src/onelogin/saml2/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -484,13 +484,17 @@ def get_expire_time(cache_duration=None, valid_until=None):
return None

@staticmethod
def delete_local_session(callback=None):
def delete_local_session(callback=None, logout_request=None, logout_response=None):
"""
Deletes the local session.
"""

if callback is not None:
callback()
if callback.__code__.co_argcount == 0:
# Legacy callback with no parameters
callback()
else:
callback(logout_request=logout_request, logout_response=logout_response)

@staticmethod
def calculate_x509_fingerprint(x509_cert, alg='sha1'):
Expand Down
23 changes: 20 additions & 3 deletions tests/src/OneLogin/saml2_tests/auth_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from onelogin.saml2 import compat
from onelogin.saml2.auth import OneLogin_Saml2_Auth
from onelogin.saml2.constants import OneLogin_Saml2_Constants
from onelogin.saml2.logout_response import OneLogin_Saml2_Logout_Response
from onelogin.saml2.settings import OneLogin_Saml2_Settings
from onelogin.saml2.utils import OneLogin_Saml2_Utils, OneLogin_Saml2_Error
from onelogin.saml2.logout_request import OneLogin_Saml2_Logout_Request
Expand Down Expand Up @@ -403,7 +404,15 @@ def testProcessSLOResponseValidDeletingSession(self):
auth = OneLogin_Saml2_Auth(request_data, old_settings=self.loadSettingsJSON())

auth.set_strict(True)
auth.process_slo(False)

callback_called = False
def delete_session_cb(logout_request, logout_response):
nonlocal callback_called
callback_called = True
self.assertIsNone(logout_request)
self.assertIsInstance(logout_response, OneLogin_Saml2_Logout_Response)
auth.process_slo(False, delete_session_cb=delete_session_cb)
self.assertTrue(callback_called)

self.assertEqual(len(auth.get_errors()), 0)

Expand Down Expand Up @@ -484,7 +493,16 @@ def testProcessSLORequestDeletingSession(self):
auth = OneLogin_Saml2_Auth(request_data, old_settings=settings_info)

auth.set_strict(True)
target_url = auth.process_slo(True)

callback_called = False
def delete_session_cb(logout_request, logout_response):
nonlocal callback_called
callback_called = True
self.assertIsNone(logout_response)
self.assertIsInstance(logout_request, OneLogin_Saml2_Logout_Request)
target_url = auth.process_slo(False, delete_session_cb=delete_session_cb)
self.assertTrue(callback_called)

parsed_query = parse_qs(urlparse(target_url)[4])
slo_url = settings_info['idp']['singleLogoutService']['url']
self.assertIn(slo_url, target_url)
Expand All @@ -498,7 +516,6 @@ def testProcessSLORequestDeletingSession(self):

auth.set_strict(True)
target_url_2 = auth.process_slo(True)
target_url_2 = auth.process_slo(True)
parsed_query_2 = parse_qs(urlparse(target_url_2)[4])
slo_url = settings_info['idp']['singleLogoutService']['url']
self.assertIn(slo_url, target_url_2)
Expand Down