Ignore:
Timestamp:
09/09/09 15:06:36 (11 years ago)
Author:
pjkersha
Message:

Attribute Authority Client unit tests: added tests for invalid conditions for SAML Attribute Queries.

Location:
TI12-security/trunk/python/ndg_security_test/ndg/security/test
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg_security_test/ndg/security/test/config/attributeauthority/sitea/siteAUserRoles.py

    r5681 r5703  
    2727class TestUserRoles(AttributeInterface): 
    2828    """Test User Roles class dynamic import for Attribute Authority""" 
     29    ATTRIBUTE_NAMES = ( 
     30        "urn:siteA:security:authz:1.0:attr", 
     31    ) 
    2932     
    30     SAML_ATTRIBUTE_NAMES = ( 
     33    ATTRIBUTE_VALUES = ( 
     34        'urn:siteA:security:authz:1.0:attr:postdoc', 
     35        'urn:siteA:security:authz:1.0:attr:staff',  
     36        'urn:siteA:security:authz:1.0:attr:undergrad',  
     37        'urn:siteA:security:authz:1.0:attr:coapec', 
     38        'urn:siteA:security:authz:1.0:attr:rapid' 
     39    ) 
     40 
     41    SAML_ATTRIBUTE_NAMES = ATTRIBUTE_NAMES + ( 
    3142        'urn:esg:email:address', 
    3243        'urn:esg:first:name',  
    3344        'urn:esg:last:name' 
    3445    ) 
     46     
    3547    SAML_ATTRIBUTE_VALUES = ( 
    36         'p.kershaw@somewhere.ac.uk', 
    37         'Philip', 
    38         'Kershaw' 
     48        ATTRIBUTE_VALUES, 
     49        ('p.kershaw@somewhere.ac.uk',), 
     50        ('Philip',), 
     51        ('Kershaw',) 
    3952    ) 
    40     SAML_ATTRIBUTE_FRIENDLY_NAMES = ( 
     53     
     54    SAML_ATTRIBUTE_FRIENDLY_NAMES = ('',)*len(ATTRIBUTE_NAMES) + ( 
    4155        "emailAddress", 
    4256        "FirstName", 
     
    4458    ) 
    4559    SAML_ATTRIBUTE_FORMATS = (SAMLConstants.XSD_NS+"#"+\ 
    46                             XSStringAttributeValue.TYPE_LOCAL_NAME,) * 3 
     60                            XSStringAttributeValue.TYPE_LOCAL_NAME,) * \ 
     61                            len(SAML_ATTRIBUTE_NAMES) 
    4762    SAML_ATTRIBUTES = [] 
    4863     
    49     for name, val, format, friendlyName in zip(SAML_ATTRIBUTE_NAMES, 
     64    for name, vals, format, friendlyName in zip(SAML_ATTRIBUTE_NAMES, 
    5065                                               SAML_ATTRIBUTE_VALUES, 
    5166                                               SAML_ATTRIBUTE_FORMATS, 
     
    5570        SAML_ATTRIBUTES[-1].nameFormat = format 
    5671        SAML_ATTRIBUTES[-1].friendlyName = friendlyName 
    57         SAML_ATTRIBUTES[-1].attributeValues.append(XSStringAttributeValue()) 
    58         SAML_ATTRIBUTES[-1].attributeValues[-1].value = val 
     72        for val in vals: 
     73            SAML_ATTRIBUTES[-1].attributeValues.append(XSStringAttributeValue()) 
     74            SAML_ATTRIBUTES[-1].attributeValues[-1].value = val 
    5975 
    60     del name, val, format, friendlyName 
     76    del name, val, vals, format, friendlyName 
     77     
     78    # 8 hours validity for issued assertions 
     79    SAML_ASSERTION_LIFETIME = 8*60*60 
    6180     
    6281    VALID_USER_IDS = ("https://openid.localhost/philip.kershaw",) 
     
    6887 
    6988    def getRoles(self, userId): 
    70         return [ 
    71             'urn:siteA:security:authz:1.0:attr:postdoc', 
    72             'urn:siteA:security:authz:1.0:attr:staff',  
    73             'urn:siteA:security:authz:1.0:attr:undergrad',  
    74             'urn:siteA:security:authz:1.0:attr:coapec' 
    75         ]  
     89        return TestUserRoles.ATTRIBUTE_VALUES 
    7690 
    77     def getAttributes(self, attributeQuery, response, assertionLifetime): 
     91    def getAttributes(self, attributeQuery, response): 
    7892        '''Test Attribute Authority SAML Attribute Query interface''' 
    7993         
     
    113127        assertion.conditions.notBefore = assertion.issueInstant 
    114128        assertion.conditions.notOnOrAfter = assertion.conditions.notBefore + \ 
    115             timedelta(seconds=assertionLifetime) 
     129            timedelta(seconds=TestUserRoles.SAML_ASSERTION_LIFETIME) 
    116130         
    117131        assertion.subject = Subject()   
     
    123137         
    124138        # Add test set of attributes 
    125         for attribute in TestUserRoles.SAML_ATTRIBUTES: 
    126             attributeStatement.attributes.append(attribute) 
     139        for name in requestedAttributeNames: 
     140            attributeFound = False 
     141            for attribute in TestUserRoles.SAML_ATTRIBUTES: 
     142                if attribute.name == name: 
     143                    attributeFound = True 
     144                    break 
     145             
     146            if attributeFound: 
     147                attributeStatement.attributes.append(attribute) 
     148            else: 
     149                raise AttributeNotKnownError("Unknown attribute requested: %s"% 
     150                                             name) 
    127151  
    128152        assertion.attributeStatements.append(attributeStatement)        
  • TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/attributeauthorityclient/attAuthorityClientTest.cfg

    r5681 r5703  
    5151uri = http://localhost:5000/attributeauthority/saml 
    5252 
     53[test11SAMLAttributeQueryInvalidIssuer] 
     54uri = http://localhost:5000/attributeauthority/saml 
     55 
     56[test12SAMLAttributeQueryUnknownSubject] 
     57uri = http://localhost:5000/attributeauthority/saml 
     58 
     59[test13SAMLAttributeQueryInvalidAttrName] 
     60uri = http://localhost:5000/attributeauthority/saml 
     61 
    5362[wsse] 
    5463# WS-Security settings for unit test AA clients 
  • TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/attributeauthorityclient/test_attributeauthorityclient.py

    r5681 r5703  
    2222from datetime import datetime 
    2323from uuid import uuid4 
     24from xml.etree import ElementTree 
    2425 
    2526from ndg.security.test.unit import BaseTestCase 
     27 
     28from ndg.security.common.utils.etree import prettyPrint 
    2629 
    2730from ndg.security.common.attributeauthority import AttributeAuthorityClient, \ 
     
    3740    XSStringAttributeValue, XSGroupRoleAttributeValue, Conditions, Status, \ 
    3841    StatusCode 
    39      
     42from saml.xml.etree import ResponseElementTree 
     43    
    4044from ndg.security.common.saml.bindings import SOAPBinding as SamlSoapBinding 
    4145 
     
    310314        attributeQuery.subject.nameID.value = \ 
    311315                                    "https://openid.localhost/philip.kershaw" 
    312          
     316        xsStringNs = SAMLConstants.XSD_NS+"#"+\ 
     317                                        XSStringAttributeValue.TYPE_LOCAL_NAME 
    313318        fnAttribute = Attribute() 
    314319        fnAttribute.name = "urn:esg:first:name" 
    315         fnAttribute.nameFormat = "http://www.w3.org/2001/XMLSchema#string" 
     320        fnAttribute.nameFormat = xsStringNs 
    316321        fnAttribute.friendlyName = "FirstName" 
    317322 
     
    320325        lnAttribute = Attribute() 
    321326        lnAttribute.name = "urn:esg:last:name" 
    322         lnAttribute.nameFormat = "http://www.w3.org/2001/XMLSchema#string" 
     327        lnAttribute.nameFormat = xsStringNs 
    323328        lnAttribute.friendlyName = "LastName" 
    324329 
     
    327332        emailAddressAttribute = Attribute() 
    328333        emailAddressAttribute.name = "urn:esg:email:address" 
    329         emailAddressAttribute.nameFormat = SAMLConstants.XSD_NS+"#"+\ 
    330                                     XSStringAttributeValue.TYPE_LOCAL_NAME 
     334        emailAddressAttribute.nameFormat = xsStringNs 
    331335        emailAddressAttribute.friendlyName = "emailAddress" 
    332  
    333         attributeQuery.attributes.append(emailAddressAttribute)                                    
     336         
     337        attributeQuery.attributes.append(emailAddressAttribute)  
     338 
     339        siteAAttribute = Attribute() 
     340        siteAAttribute.name = "urn:siteA:security:authz:1.0:attr" 
     341        siteAAttribute.nameFormat = xsStringNs 
     342         
     343        attributeQuery.attributes.append(siteAAttribute)  
    334344 
    335345        binding = SamlSoapBinding() 
     
    337347         
    338348        self.assert_(response.status.statusCode.value==StatusCode.SUCCESS_URI) 
    339         print response 
    340          
    341                                          
     349         
     350        # Check Query ID matches the query ID the service received 
     351        self.assert_(response.inResponseTo == attributeQuery.id) 
     352         
     353        now = datetime.utcnow() 
     354        self.assert_(response.issueInstant < now) 
     355        self.assert_(response.assertions[-1].issueInstant < now)         
     356        self.assert_(response.assertions[-1].conditions.notBefore < now)  
     357        self.assert_(response.assertions[-1].conditions.notOnOrAfter > now) 
     358          
     359        samlResponseElem = ResponseElementTree.toXML(response) 
     360         
     361        print("SAML Response ...") 
     362        print(ElementTree.tostring(samlResponseElem)) 
     363        print("Pretty print SAML Response ...") 
     364        print(prettyPrint(samlResponseElem)) 
     365 
     366              
     367    def test11SAMLAttributeQueryInvalidIssuer(self): 
     368        _cfg = self.cfg['test11SAMLAttributeQueryInvalidIssuer'] 
     369         
     370        attributeQuery = AttributeQuery() 
     371        attributeQuery.version = SAMLVersion(SAMLVersion.VERSION_20) 
     372        attributeQuery.id = str(uuid4()) 
     373        attributeQuery.issueInstant = datetime.utcnow() 
     374         
     375        attributeQuery.issuer = Issuer() 
     376        attributeQuery.issuer.format = "urn:esg:issuer" 
     377        attributeQuery.issuer.value = "Invalid Site"     
     378                         
     379        attributeQuery.subject = Subject()   
     380        attributeQuery.subject.nameID = NameID() 
     381        attributeQuery.subject.nameID.format = "urn:esg:openid" 
     382        attributeQuery.subject.nameID.value = \ 
     383                                    "https://openid.localhost/philip.kershaw" 
     384        xsStringNs = SAMLConstants.XSD_NS+"#"+\ 
     385                                        XSStringAttributeValue.TYPE_LOCAL_NAME 
     386 
     387        siteAAttribute = Attribute() 
     388        siteAAttribute.name = "urn:siteA:security:authz:1.0:attr" 
     389        siteAAttribute.nameFormat = xsStringNs 
     390         
     391        attributeQuery.attributes.append(siteAAttribute)  
     392 
     393        binding = SamlSoapBinding() 
     394        response = binding.attributeQuery(attributeQuery, _cfg['uri']) 
     395         
     396        self.assert_( 
     397            response.status.statusCode.value==StatusCode.REQUEST_DENIED_URI) 
     398        samlResponseElem = ResponseElementTree.toXML(response) 
     399         
     400        print("SAML Response ...") 
     401        print(ElementTree.tostring(samlResponseElem)) 
     402        print("Pretty print SAML Response ...") 
     403        print(prettyPrint(samlResponseElem)) 
     404                     
     405    def test12SAMLAttributeQueryUnknownSubject(self): 
     406        _cfg = self.cfg['test12SAMLAttributeQueryUnknownSubject'] 
     407         
     408        attributeQuery = AttributeQuery() 
     409        attributeQuery.version = SAMLVersion(SAMLVersion.VERSION_20) 
     410        attributeQuery.id = str(uuid4()) 
     411        attributeQuery.issueInstant = datetime.utcnow() 
     412         
     413        attributeQuery.issuer = Issuer() 
     414        attributeQuery.issuer.format = "urn:esg:issuer" 
     415        attributeQuery.issuer.value = "Site A"     
     416                         
     417        attributeQuery.subject = Subject()   
     418        attributeQuery.subject.nameID = NameID() 
     419        attributeQuery.subject.nameID.format = "urn:esg:openid" 
     420        attributeQuery.subject.nameID.value = \ 
     421                                    "https://openid.localhost/unknown" 
     422        xsStringNs = SAMLConstants.XSD_NS+"#"+\ 
     423                                        XSStringAttributeValue.TYPE_LOCAL_NAME 
     424 
     425        siteAAttribute = Attribute() 
     426        siteAAttribute.name = "urn:siteA:security:authz:1.0:attr" 
     427        siteAAttribute.nameFormat = xsStringNs 
     428         
     429        attributeQuery.attributes.append(siteAAttribute)  
     430 
     431        binding = SamlSoapBinding() 
     432        response = binding.attributeQuery(attributeQuery, _cfg['uri']) 
     433         
     434        self.assert_( 
     435            response.status.statusCode.value==StatusCode.UNKNOWN_PRINCIPAL_URI) 
     436        samlResponseElem = ResponseElementTree.toXML(response) 
     437         
     438        print("SAML Response ...") 
     439        print(ElementTree.tostring(samlResponseElem)) 
     440        print("Pretty print SAML Response ...") 
     441        print(prettyPrint(samlResponseElem)) 
     442              
     443    def test13SAMLAttributeQueryInvalidAttrName(self): 
     444        _cfg = self.cfg['test13SAMLAttributeQueryInvalidAttrName'] 
     445         
     446        attributeQuery = AttributeQuery() 
     447        attributeQuery.version = SAMLVersion(SAMLVersion.VERSION_20) 
     448        attributeQuery.id = str(uuid4()) 
     449        attributeQuery.issueInstant = datetime.utcnow() 
     450         
     451        attributeQuery.issuer = Issuer() 
     452        attributeQuery.issuer.format = "urn:esg:issuer" 
     453        attributeQuery.issuer.value = "Site A"     
     454                         
     455        attributeQuery.subject = Subject()   
     456        attributeQuery.subject.nameID = NameID() 
     457        attributeQuery.subject.nameID.format = "urn:esg:openid" 
     458        attributeQuery.subject.nameID.value = \ 
     459                                    "https://openid.localhost/philip.kershaw" 
     460        xsStringNs = SAMLConstants.XSD_NS+"#"+\ 
     461                                        XSStringAttributeValue.TYPE_LOCAL_NAME 
     462 
     463        invalidAttribute = Attribute() 
     464        invalidAttribute.name = "myInvalidAttributeName" 
     465        invalidAttribute.nameFormat = xsStringNs 
     466         
     467        attributeQuery.attributes.append(invalidAttribute)  
     468 
     469        binding = SamlSoapBinding() 
     470        response = binding.attributeQuery(attributeQuery, _cfg['uri']) 
     471         
     472        self.assert_(response.status.statusCode.value==\ 
     473                     StatusCode.INVALID_ATTR_NAME_VALUE_URI) 
     474        samlResponseElem = ResponseElementTree.toXML(response) 
     475         
     476        print("SAML Response ...") 
     477        print(ElementTree.tostring(samlResponseElem)) 
     478        print("Pretty print SAML Response ...") 
     479        print(prettyPrint(samlResponseElem)) 
     480         
     481                                                         
    342482if __name__ == "__main__": 
    343483    unittest.main() 
Note: See TracChangeset for help on using the changeset viewer.