39
39
get_session_id_from_saml2 ,
40
40
get_subject_id_from_saml2 ,
41
41
saml2_from_httpredirect_request )
42
- from djangosaml2 .views import finish_logout
42
+ from djangosaml2 .views import (EchoAttributesView , _set_subject_id ,
43
+ finish_logout )
43
44
from saml2 .config import SPConfig
44
45
from saml2 .s_utils import decode_base64_and_inflate , deflate_and_base64_encode
45
46
@@ -95,9 +96,6 @@ def add_outstanding_query(self, session_id, came_from):
95
96
self .saml_session .save ()
96
97
self .client .cookies [settings .SESSION_COOKIE_NAME ] = self .saml_session .session_key
97
98
98
- def render_template (self , text ):
99
- return Template (text ).render (Context ())
100
-
101
99
def b64_for_post (self , xml_text , encoding = 'utf-8' ):
102
100
return base64 .b64encode (xml_text .encode (encoding )).decode ('ascii' )
103
101
@@ -406,6 +404,47 @@ def do_login(self):
406
404
self .assertEqual (response .status_code , 302 )
407
405
return subject_id
408
406
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
+
409
448
def test_logout (self ):
410
449
settings .SAML_CONFIG = conf .create_conf (
411
450
sp_host = 'sp.example.com' ,
@@ -428,8 +467,7 @@ def test_logout(self):
428
467
429
468
saml_request = params ['SAMLRequest' ][0 ]
430
469
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' )
433
471
434
472
def test_logout_service_local (self ):
435
473
settings .SAML_CONFIG = conf .create_conf (
@@ -453,8 +491,8 @@ def test_logout_service_local(self):
453
491
self .assertIn ('SAMLRequest' , params )
454
492
455
493
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' )
458
496
459
497
# now simulate a logout response sent by the idp
460
498
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):
501
539
self .assertIn ('SAMLResponse' , params )
502
540
saml_response = params ['SAMLResponse' ][0 ]
503
541
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' )
506
543
507
544
def test_incomplete_logout (self ):
508
545
settings .SAML_CONFIG = conf .create_conf (sp_host = 'sp.example.com' ,
@@ -620,11 +657,8 @@ def test_custom_conf_loader_from_view(self):
620
657
621
658
class SessionEnabledTestCase (TestCase ):
622
659
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 ()
628
662
return session
629
663
630
664
def set_session_cookies (self , session ):
0 commit comments