Changeset 5703


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

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

Location:
TI12-security/trunk/python
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/attributeauthority.py

    r5681 r5703  
    11091109        try: 
    11101110            # Return a dictionary of name, value pairs 
    1111             self.attributeInterface.getAttributes(attributeQuery,  
    1112                                                   samlResponse, 
    1113                                                   self.attCertLifetime) 
     1111            self.attributeInterface.getAttributes(attributeQuery, samlResponse) 
    11141112             
    11151113        except InvalidUserId, e: 
     
    15961594        raise NotImplementedError(self.getRoles.__doc__) 
    15971595  
    1598     def getAttributes(self, attributeQuery, response, assertionLifetime): 
     1596    def getAttributes(self, attributeQuery, response): 
    15991597        """Virtual method should be implemented in a derived class to enable 
    16001598        AttributeAuthority.samlAttributeQuery - The derived method should  
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/saml/__init__.py

    r5681 r5703  
    1313from cStringIO import StringIO 
    1414from uuid import uuid4 
     15from datetime import datetime 
    1516from xml.etree import ElementTree 
    1617 
     
    2122     
    2223from saml.common.xml import SAMLConstants 
     24from saml.xml import UnknownAttrProfile 
    2325from saml.xml.etree import AssertionElementTree, AttributeQueryElementTree, \ 
    2426    ResponseElementTree, XSGroupRoleAttributeValueElementTree, QName 
  • 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.