3939 get_session_id_from_saml2 ,
4040 get_subject_id_from_saml2 ,
4141 saml2_from_httpredirect_request )
42- from djangosaml2 .views import finish_logout
42+ from djangosaml2 .views import (EchoAttributesView , _set_subject_id ,
43+ finish_logout )
4344from saml2 .config import SPConfig
4445from saml2 .s_utils import decode_base64_and_inflate , deflate_and_base64_encode
4546
@@ -95,9 +96,6 @@ def add_outstanding_query(self, session_id, came_from):
9596 self .saml_session .save ()
9697 self .client .cookies [settings .SESSION_COOKIE_NAME ] = self .saml_session .session_key
9798
98- def render_template (self , text ):
99- return Template (text ).render (Context ())
100-
10199 def b64_for_post (self , xml_text , encoding = 'utf-8' ):
102100 return base64 .b64encode (xml_text .encode (encoding )).decode ('ascii' )
103101
@@ -406,6 +404,47 @@ def do_login(self):
406404 self .assertEqual (response .status_code , 302 )
407405 return subject_id
408406
407+ def test_echo_view_no_saml_session (self ):
408+ settings .SAML_CONFIG = conf .create_conf (
409+ sp_host = 'sp.example.com' ,
410+ idp_hosts = ['idp.example.com' ],
411+ metadata_file = 'remote_metadata_one_idp.xml' ,
412+ )
413+ self .do_login ()
414+
415+ request = RequestFactory ().get ('/bar/foo' )
416+ request .COOKIES = self .client .cookies
417+ request .user = User .objects .last ()
418+
419+ middleware = SamlSessionMiddleware ()
420+ middleware .process_request (request )
421+
422+ response = EchoAttributesView .as_view ()(request )
423+ self .assertEqual (response .status_code , 200 )
424+ self .assertEqual (response .content .decode (), 'No active SAML identity found. Are you sure you have logged in via SAML?' )
425+
426+ def test_echo_view_success (self ):
427+ settings .SAML_CONFIG = conf .create_conf (
428+ sp_host = 'sp.example.com' ,
429+ idp_hosts = ['idp.example.com' ],
430+ metadata_file = 'remote_metadata_one_idp.xml' ,
431+ )
432+ self .do_login ()
433+
434+ request = RequestFactory ().get ('/' )
435+ request .user = User .objects .last ()
436+
437+ middleware = SamlSessionMiddleware ()
438+ middleware .process_request (request )
439+
440+ saml_session_name = getattr (settings , 'SAML_SESSION_COOKIE_NAME' , 'saml_session' )
441+ getattr (request , saml_session_name )['_saml2_subject_id' ] = '1f87035b4c1325b296a53d92097e6b3fa36d7e30ee82e3fcb0680d60243c1f03'
442+ getattr (request , saml_session_name ).save ()
443+
444+ response = EchoAttributesView .as_view ()(request )
445+ self .assertEqual (response .status_code , 200 )
446+ self .assertIn ('<h1>SAML attributes</h1>' , response .content .decode (), 'Echo page not rendered' )
447+
409448 def test_logout (self ):
410449 settings .SAML_CONFIG = conf .create_conf (
411450 sp_host = 'sp.example.com' ,
@@ -428,8 +467,7 @@ def test_logout(self):
428467
429468 saml_request = params ['SAMLRequest' ][0 ]
430469
431- if 'LogoutRequest xmlns' not in decode_base64_and_inflate (saml_request ).decode ('utf-8' ):
432- raise Exception ('Not a valid LogoutRequest' )
470+ self .assertIn ('LogoutRequest xmlns' , decode_base64_and_inflate (saml_request ).decode ('utf-8' ), 'Not a valid LogoutRequest' )
433471
434472 def test_logout_service_local (self ):
435473 settings .SAML_CONFIG = conf .create_conf (
@@ -453,8 +491,8 @@ def test_logout_service_local(self):
453491 self .assertIn ('SAMLRequest' , params )
454492
455493 saml_request = params ['SAMLRequest' ][0 ]
456- if 'LogoutRequest xmlns' not in decode_base64_and_inflate ( saml_request ). decode ( 'utf-8' ):
457- raise Exception ( 'Not a valid LogoutRequest' )
494+
495+ self . assertIn ( 'LogoutRequest xmlns' , decode_base64_and_inflate ( saml_request ). decode ( 'utf-8' ), 'Not a valid LogoutRequest' )
458496
459497 # now simulate a logout response sent by the idp
460498 expected_request = """<samlp:LogoutRequest xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="XXXXXXXXXXXXXXXXXXXXXX" Version="2.0" Destination="https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php" Reason=""><saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">http://sp.example.com/saml2/metadata/</saml:Issuer><saml:NameID SPNameQualifier="http://sp.example.com/saml2/metadata/" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">1f87035b4c1325b296a53d92097e6b3fa36d7e30ee82e3fcb0680d60243c1f03</saml:NameID><samlp:SessionIndex>a0123456789abcdef0123456789abcdef</samlp:SessionIndex></samlp:LogoutRequest>"""
@@ -501,8 +539,7 @@ def test_logout_service_global(self):
501539 self .assertIn ('SAMLResponse' , params )
502540 saml_response = params ['SAMLResponse' ][0 ]
503541
504- if 'Response xmlns' not in decode_base64_and_inflate (saml_response ).decode ('utf-8' ):
505- raise Exception ('Not a valid Response' )
542+ self .assertIn ('Response xmlns' , decode_base64_and_inflate (saml_response ).decode ('utf-8' ), 'Not a valid Response' )
506543
507544 def test_incomplete_logout (self ):
508545 settings .SAML_CONFIG = conf .create_conf (sp_host = 'sp.example.com' ,
@@ -620,11 +657,8 @@ def test_custom_conf_loader_from_view(self):
620657
621658class SessionEnabledTestCase (TestCase ):
622659 def get_session (self ):
623- if self .client .session :
624- session = self .client .session
625- else :
626- engine = import_module (settings .SESSION_ENGINE )
627- session = engine .SessionStore ()
660+ engine = import_module (settings .SESSION_ENGINE )
661+ session = self .client .session or engine .SessionStore ()
628662 return session
629663
630664 def set_session_cookies (self , session ):
0 commit comments