56 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Test AuthN Request generator and parser"""
 | 
						|
from django.test import RequestFactory, TestCase
 | 
						|
 | 
						|
from passbook.crypto.models import CertificateKeyPair
 | 
						|
from passbook.flows.models import Flow
 | 
						|
from passbook.providers.saml.models import SAMLProvider
 | 
						|
from passbook.providers.saml.processors.request_parser import AuthNRequestParser
 | 
						|
from passbook.providers.saml.utils.encoding import deflate_and_base64_encode
 | 
						|
from passbook.sources.saml.models import SAMLSource
 | 
						|
from passbook.sources.saml.processors.request import RequestProcessor
 | 
						|
 | 
						|
 | 
						|
class TestAuthNRequest(TestCase):
 | 
						|
    """Test AuthN Request generator and parser"""
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        self.provider = SAMLProvider.objects.create(
 | 
						|
            authorization_flow=Flow.objects.get(
 | 
						|
                slug="default-provider-authorization-implicit-consent"
 | 
						|
            ),
 | 
						|
            acs_url="http://testserver/source/saml/provider/acs/",
 | 
						|
            signing_kp=CertificateKeyPair.objects.first(),
 | 
						|
        )
 | 
						|
        self.source = SAMLSource.objects.create(
 | 
						|
            slug="provider",
 | 
						|
            issuer="passbook",
 | 
						|
            signing_kp=CertificateKeyPair.objects.first(),
 | 
						|
        )
 | 
						|
        self.factory = RequestFactory()
 | 
						|
 | 
						|
    def test_signed_valid(self):
 | 
						|
        """Test generated AuthNRequest with valid signature"""
 | 
						|
        http_request = self.factory.get("/")
 | 
						|
        # First create an AuthNRequest
 | 
						|
        request_proc = RequestProcessor(self.source, http_request, "test_state")
 | 
						|
        request = request_proc.build_auth_n()
 | 
						|
        # Now we check the ID and signature
 | 
						|
        parsed_request = AuthNRequestParser(self.provider).parse(
 | 
						|
            deflate_and_base64_encode(request), "test_state"
 | 
						|
        )
 | 
						|
        self.assertEqual(parsed_request.id, request_proc.request_id)
 | 
						|
        self.assertEqual(parsed_request.relay_state, "test_state")
 | 
						|
 | 
						|
    def test_signed_valid_detached(self):
 | 
						|
        """Test generated AuthNRequest with valid signature (detached)"""
 | 
						|
        http_request = self.factory.get("/")
 | 
						|
        # First create an AuthNRequest
 | 
						|
        request_proc = RequestProcessor(self.source, http_request, "test_state")
 | 
						|
        params = request_proc.build_auth_n_detached()
 | 
						|
        # Now we check the ID and signature
 | 
						|
        parsed_request = AuthNRequestParser(self.provider).parse_detached(
 | 
						|
            params["SAMLRequest"], "test_state", params["Signature"], params["SigAlg"]
 | 
						|
        )
 | 
						|
        self.assertEqual(parsed_request.id, request_proc.request_id)
 | 
						|
        self.assertEqual(parsed_request.relay_state, "test_state")
 |