Changeset 7150 for TI12-security


Ignore:
Timestamp:
01/07/10 13:08:57 (9 years ago)
Author:
pjkersha
Message:

Incomplete - task 2: XACML-Security Integration

  • integrating test_samlinterface from ndg.security version
Location:
TI12-security/trunk/ndg_saml/ndg/saml
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/ndg_saml/ndg/saml/saml2/binding/soap/client/__init__.py

    r7143 r7150  
    1313 
    1414from os import path 
    15 from ConfigParser import ConfigParser 
     15from ConfigParser import ConfigParser, SafeConfigParser 
    1616 
    1717from ndg.saml.common import SAMLObject 
    1818 
    19 from ndg.security.common.utils.factory import importModuleObject 
    20 from ndg.security.common.utils.configfileparsers import ( 
    21                                                     CaseSensitiveConfigParser) 
     19from ndg.saml.utils.factory import importModuleObject 
    2220from ndg.soap import SOAPEnvelopeBase 
    2321from ndg.soap.etree import SOAPEnvelope 
     
    223221        if isinstance(cfg, basestring): 
    224222            cfgFilePath = path.expandvars(cfg) 
    225             _cfg = CaseSensitiveConfigParser() 
     223            _cfg = SafeConfigParser() 
     224            _cfg.optionxform = str 
     225 
    226226            _cfg.read(cfgFilePath) 
    227227             
  • TI12-security/trunk/ndg_saml/ndg/saml/test/binding/soap/test_samlinterface.py

    r7147 r7150  
    1 """Attribute Authority SAML Interface unit test package 
     1"""SAML Generic SOAP Binding Query/Response Interface unit test package 
    22 
    33NERC DataGrid Project 
     
    1111import logging 
    1212logging.basicConfig(level=logging.DEBUG) 
     13log = logging.getLogger(__name__) 
    1314import unittest 
    1415 
     
    2728from ndg.saml.xml import XMLConstants 
    2829from ndg.saml.xml.etree import AttributeQueryElementTree, ResponseElementTree 
    29 from ndg.saml.saml2.binding.soap.subjectquery import ( 
     30from ndg.saml.saml2.binding.soap.client.subjectquery import ( 
    3031    SubjectQuerySOAPBinding, ResponseIssueInstantInvalid,  
    3132    AssertionIssueInstantInvalid, AssertionConditionNotBeforeInvalid,  
     
    3839 
    3940class SamlSoapBindingApp(object): 
     41    """Simple WSGI application to handle SAML Attribute Query/Response 
     42    """ 
     43    FIRSTNAME_ATTRNAME = "urn:ndg:saml:firstname" 
     44    LASTNAME_ATTRNAME = "urn:ndg:saml:lastname" 
     45    EMAILADDRESS_ATTRNAME = "urn:ndg:saml:emailaddress" 
     46    NAMEID_FORMAT = "urn:ndg:saml:openid" 
     47     
    4048    def __init__(self): 
    4149        self.firstName = "Philip" 
     
    8593         
    8694        for attribute in attributeQuery.attributes: 
    87             if attribute.name == EsgSamlNamespaces.FIRSTNAME_ATTRNAME: 
     95            if attribute.name == SamlSoapBindingApp.FIRSTNAME_ATTRNAME: 
    8896                # special case handling for 'FirstName' attribute 
    8997                fnAttribute = Attribute() 
     
    98106                assertion.attributeStatements[0].attributes.append(fnAttribute) 
    99107             
    100             elif attribute.name == EsgSamlNamespaces.LASTNAME_ATTRNAME: 
     108            elif attribute.name == SamlSoapBindingApp.LASTNAME_ATTRNAME: 
    101109                lnAttribute = Attribute() 
    102110                lnAttribute.name = attribute.name 
     
    110118                assertion.attributeStatements[0].attributes.append(lnAttribute) 
    111119                
    112             elif attribute.name == EsgSamlNamespaces.EMAILADDRESS_ATTRNAME: 
     120            elif attribute.name == SamlSoapBindingApp.EMAILADDRESS_ATTRNAME: 
    113121                emailAddressAttribute = Attribute() 
    114122                emailAddressAttribute.name = attribute.name 
     
    124132         
    125133        samlResponse.assertions.append(assertion) 
    126          
    127         # Add mapping for ESG Group/Role Attribute Value to enable ElementTree 
    128         # Attribute Value factory to render the XML output 
    129         toXMLTypeMap = { 
    130             XSGroupRoleAttributeValue: XSGroupRoleAttributeValueElementTree 
    131         } 
    132  
    133134         
    134135        samlResponse.status = Status() 
     
    142143                                            customToXMLTypeMap=toXMLTypeMap) 
    143144        xml = ElementTree.tostring(samlResponseElem) 
     145        log.debug('Sending response to query:\n%s', xml) 
    144146         
    145147        # Create SOAP response and attach the SAML Response payload 
     
    156158 
    157159         
    158 class SamlAttributeAuthorityInterfaceTestCase(BaseTestCase): 
    159     """TODO: test SAML Attribute Authority interface""" 
     160class SamlAttributeQueryTestCase(unittest.TestCase): 
     161    """Test the SAML SOAP binding using an Attribute Query as an example""" 
    160162    thisDir = os.path.dirname(os.path.abspath(__file__)) 
    161163    RESPONSE = '''\ 
     
    205207        self.app = paste.fixture.TestApp(wsgiApp) 
    206208          
    207         BaseTestCase.__init__(self, *args, **kwargs) 
     209        unittest.TestCase.__init__(self, *args, **kwargs) 
    208210         
    209211    def test01AttributeQuery(self): 
     
    221223        attributeQuery.subject = Subject()   
    222224        attributeQuery.subject.nameID = NameID() 
    223         attributeQuery.subject.nameID.format = EsgSamlNamespaces.NAMEID_FORMAT 
     225        attributeQuery.subject.nameID.format = SamlSoapBindingApp.NAMEID_FORMAT 
    224226        attributeQuery.subject.nameID.value = \ 
    225227                                    "https://openid.localhost/philip.kershaw" 
     
    227229        # special case handling for 'FirstName' attribute 
    228230        fnAttribute = Attribute() 
    229         fnAttribute.name = EsgSamlNamespaces.FIRSTNAME_ATTRNAME 
     231        fnAttribute.name = SamlSoapBindingApp.FIRSTNAME_ATTRNAME 
    230232        fnAttribute.nameFormat = "http://www.w3.org/2001/XMLSchema#string" 
    231233        fnAttribute.friendlyName = "FirstName" 
     
    235237        # special case handling for 'LastName' attribute 
    236238        lnAttribute = Attribute() 
    237         lnAttribute.name = EsgSamlNamespaces.LASTNAME_ATTRNAME 
     239        lnAttribute.name = SamlSoapBindingApp.LASTNAME_ATTRNAME 
    238240        lnAttribute.nameFormat = "http://www.w3.org/2001/XMLSchema#string" 
    239241        lnAttribute.friendlyName = "LastName" 
     
    243245        # special case handling for 'LastName' attribute 
    244246        emailAddressAttribute = Attribute() 
    245         emailAddressAttribute.name = EsgSamlNamespaces.EMAILADDRESS_ATTRNAME 
     247        emailAddressAttribute.name = SamlSoapBindingApp.EMAILADDRESS_ATTRNAME 
    246248        emailAddressAttribute.nameFormat = XMLConstants.XSD_NS+"#"+\ 
    247249                                    XSStringAttributeValue.TYPE_LOCAL_NAME 
     
    314316        attributeQuery.subject = Subject()   
    315317        attributeQuery.subject.nameID = NameID() 
    316         attributeQuery.subject.nameID.format = EsgSamlNamespaces.NAMEID_FORMAT 
     318        attributeQuery.subject.nameID.format = SamlSoapBindingApp.NAMEID_FORMAT 
    317319        attributeQuery.subject.nameID.value = \ 
    318320                            "https://esg.prototype.ucar.edu/myopenid/testUser" 
     
    320322        # special case handling for 'FirstName' attribute 
    321323        fnAttribute = Attribute() 
    322         fnAttribute.name = EsgSamlNamespaces.FIRSTNAME_ATTRNAME 
     324        fnAttribute.name = SamlSoapBindingApp.FIRSTNAME_ATTRNAME 
    323325        fnAttribute.nameFormat = "http://www.w3.org/2001/XMLSchema#string" 
    324326        fnAttribute.friendlyName = "FirstName" 
     
    328330        # special case handling for 'LastName' attribute 
    329331        lnAttribute = Attribute() 
    330         lnAttribute.name = EsgSamlNamespaces.LASTNAME_ATTRNAME 
     332        lnAttribute.name = SamlSoapBindingApp.LASTNAME_ATTRNAME 
    331333        lnAttribute.nameFormat = "http://www.w3.org/2001/XMLSchema#string" 
    332334        lnAttribute.friendlyName = "LastName" 
     
    336338        # special case handling for 'LastName' attribute 
    337339        emailAddressAttribute = Attribute() 
    338         emailAddressAttribute.name = EsgSamlNamespaces.EMAILADDRESS_ATTRNAME 
     340        emailAddressAttribute.name = SamlSoapBindingApp.EMAILADDRESS_ATTRNAME 
    339341        emailAddressAttribute.nameFormat = XMLConstants.XSD_NS+"#"+\ 
    340342                                    XSStringAttributeValue.TYPE_LOCAL_NAME 
     
    365367            self.fail('Expecting "Response" element in SOAP body') 
    366368             
    367         toSAMLTypeMap = [XSGroupRoleAttributeValueElementTree.factoryMatchFunc] 
    368         response = ResponseElementTree.fromXML(response.envelope.body.elem[0], 
    369                                             customToSAMLTypeMap=toSAMLTypeMap) 
    370         self.assert_(response) 
    371          
    372     def test03ParseResponse(self): 
    373         response = \ 
    374 '''<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    375    <SOAP-ENV:Body> 
    376       <samlp:Response ID="05680cb2-4973-443d-9d31-7bc99bea87c1" InResponseTo="e3183380-ae82-4285-8827-8c40613842de" IssueInstant="2009-08-17T12:28:37.325Z" Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"> 
    377          <saml:Issuer Format="urn:esg:issuer" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">ESG-NCAR</saml:Issuer> 
    378          <samlp:Status> 
    379             <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /> 
    380          </samlp:Status> 
    381          <saml:Assertion ID="192c67d9-f9cd-457a-9242-999e7b943166" IssueInstant="2009-08-17T12:28:37.347Z" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> 
    382             <saml:Issuer Format="urn:esg:issuer">ESG-NCAR</saml:Issuer> 
    383             <saml:Subject> 
    384                <saml:NameID Format="urn:esg:openid">https://esg.prototype.ucar.edu/myopenid/testUser</saml:NameID> 
    385             </saml:Subject> 
    386             <saml:Conditions NotBefore="2009-08-17T12:28:37.347Z" NotOnOrAfter="2009-08-18T12:28:37.347Z" /> 
    387             <saml:AttributeStatement> 
    388                <saml:Attribute FriendlyName="FirstName" Name="urn:esg:first:name" NameFormat="http://www.w3.org/2001/XMLSchema#string"> 
    389                   <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Test</saml:AttributeValue> 
    390                </saml:Attribute> 
    391                <saml:Attribute FriendlyName="LastName" Name="urn:esg:last:name" NameFormat="http://www.w3.org/2001/XMLSchema#string"> 
    392                   <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">User</saml:AttributeValue> 
    393                </saml:Attribute> 
    394                <saml:Attribute FriendlyName="EmailAddress" Name="urn:esg:first:email:address" NameFormat="http://www.w3.org/2001/XMLSchema#string"> 
    395                   <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ejn@ucar.edu</saml:AttributeValue> 
    396                </saml:Attribute> 
    397                <saml:Attribute FriendlyName="GroupRole" Name="urn:esg:group:role" NameFormat="groupRole"> 
    398                   <saml:AttributeValue> 
    399                      <esg:groupRole group="CCSM" role="default" xmlns:esg="http://www.esg.org" /> 
    400                   </saml:AttributeValue> 
    401                   <saml:AttributeValue> 
    402                      <esg:groupRole group="Dynamical Core" role="default" xmlns:esg="http://www.esg.org" /> 
    403                   </saml:AttributeValue> 
    404                   <saml:AttributeValue> 
    405                      <esg:groupRole group="NARCCAP" role="default" xmlns:esg="http://www.esg.org" /> 
    406                   </saml:AttributeValue> 
    407                </saml:Attribute> 
    408             </saml:AttributeStatement> 
    409          </saml:Assertion> 
    410       </samlp:Response> 
    411    </SOAP-ENV:Body> 
    412 </SOAP-ENV:Envelope>''' 
    413          
    414         soapResponse = SOAPEnvelope() 
    415          
    416         responseStream = StringIO() 
    417         responseStream.write(response) 
    418         responseStream.seek(0) 
    419          
    420         soapResponse.parse(responseStream) 
    421          
    422         print("Parsed response ...") 
    423         print(soapResponse.serialize()) 
    424          
    425         toSAMLTypeMap = [XSGroupRoleAttributeValueElementTree.factoryMatchFunc] 
    426         response = ResponseElementTree.fromXML(soapResponse.body.elem[0], 
    427                                             customToSAMLTypeMap=toSAMLTypeMap) 
     369        response = ResponseElementTree.fromXML(response.envelope.body.elem[0]) 
    428370        self.assert_(response) 
    429371 
     
    441383        print(soapResponse.serialize()) 
    442384         
    443         toSAMLTypeMap = [XSGroupRoleAttributeValueElementTree.factoryMatchFunc] 
    444         response = ResponseElementTree.fromXML(soapResponse.body.elem[0], 
    445                                             customToSAMLTypeMap=toSAMLTypeMap) 
     385        response = ResponseElementTree.fromXML(soapResponse.body.elem[0]) 
    446386        return response 
    447387         
     
    455395                                                            seconds=60*60*8)) 
    456396        } 
    457         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
     397        responseStr = self.__class__.RESPONSE % \ 
    458398                                                                        respDict 
    459399        response = self._parseResponse(responseStr) 
     
    471411                                                            seconds=60*60*8)) 
    472412        } 
    473         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
     413        responseStr = self.__class__.RESPONSE % \ 
    474414                                                                    respDict 
    475415        response = self._parseResponse(responseStr) 
     
    491431                                                            seconds=60*60*8)) 
    492432        } 
    493         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
     433        responseStr = self.__class__.RESPONSE % \ 
    494434                                                                    respDict 
    495435        response = self._parseResponse(responseStr) 
     
    510450                                                            seconds=60*60*8)) 
    511451        } 
    512         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
     452        responseStr = self.__class__.RESPONSE % \ 
    513453                                                                    respDict 
    514454        response = self._parseResponse(responseStr) 
     
    530470                                                            seconds=60*60*8)) 
    531471        } 
    532         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
     472        responseStr = self.__class__.RESPONSE % \ 
    533473                                                                    respDict 
    534474        response = self._parseResponse(responseStr) 
     
    550490                                                            seconds=60*60*8)) 
    551491        } 
    552         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
     492        responseStr = self.__class__.RESPONSE % \ 
    553493                                                                    respDict 
    554494        response = self._parseResponse(responseStr) 
     
    574514                                                            seconds=60*60*8)) 
    575515        } 
    576         responseStr = SamlAttributeAuthorityInterfaceTestCase.RESPONSE % \ 
    577                                                                     respDict 
     516        responseStr = self.__class__.RESPONSE % respDict 
    578517        response = self._parseResponse(responseStr) 
    579518        binding = SubjectQuerySOAPBinding() 
Note: See TracChangeset for help on using the changeset viewer.