Changeset 5601


Ignore:
Timestamp:
11/08/09 15:16:15 (10 years ago)
Author:
pjkersha
Message:

Adding Assertion parsing functionality - not finished!

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

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/soap/etree.py

    r5589 r5601  
    1919 
    2020# ElementTree helper functions 
    21 from ndg.security.common.utils.etree import QName, getLocalName 
     21from ndg.security.common.utils.etree import QName 
    2222 
    2323from ndg.security.common.soap import SOAPObject, SOAPEnvelopeBase, \ 
     
    197197         
    198198        for elem in self.elem: 
    199             localName = getLocalName(elem) 
     199            localName = QName.getLocalPart(elem.tag) 
    200200            if localName == SOAPHeader.DEFAULT_ELEMENT_LOCAL_NAME: 
    201201                self.header.elem = elem 
  • TI12-security/trunk/python/ndg.security.saml/saml/saml2/core.py

    r5599 r5601  
    571571         
    572572        @return the ProxyRestriction condition for the assertion 
     573        ''' 
     574        raise NotImplementedError() 
     575     
     576     
     577class Advice(SAMLObject): 
     578    '''SAML 2.0 Core Advice. 
     579    ''' 
     580 
     581    # Element local name 
     582    DEFAULT_ELEMENT_LOCAL_NAME = "Advice" 
     583 
     584    # Default element name. 
     585    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS,  
     586                                 DEFAULT_ELEMENT_LOCAL_NAME, 
     587                                 SAMLConstants.SAML20_PREFIX) 
     588 
     589    # Local name of the XSI type 
     590    TYPE_LOCAL_NAME = "AdviceType" 
     591 
     592    # QName of the XSI type 
     593    TYPE_NAME = QName(SAMLConstants.SAML20_NS,  
     594                      TYPE_LOCAL_NAME, 
     595                      SAMLConstants.SAML20_PREFIX) 
     596 
     597    def _getChildren(self, typeOrName=None): 
     598        ''' 
     599        Gets the list of all child elements attached to this advice. 
     600         
     601        @return the list of all child elements attached to this advice 
     602        ''' 
     603        raise NotImplementedError() 
     604 
     605    def _getAssertionIDReferences(self): 
     606        '''Gets the list of AssertionID references used as advice. 
     607         
     608        @return the list of AssertionID references used as advice 
     609        ''' 
     610        raise NotImplementedError() 
     611 
     612    def _getAssertionURIReferences(self): 
     613        '''Gets the list of AssertionURI references used as advice. 
     614         
     615        @return the list of AssertionURI references used as advice 
     616        ''' 
     617        raise NotImplementedError() 
     618     
     619    def _getAssertions(self): 
     620        '''Gets the list of Assertions used as advice. 
     621         
     622        @return the list of Assertions used as advice 
     623        ''' 
     624        raise NotImplementedError() 
     625     
     626    def _getEncryptedAssertions(self): 
     627        '''Gets the list of EncryptedAssertions used as advice. 
     628         
     629        @return the list of EncryptedAssertions used as advice 
    573630        ''' 
    574631        raise NotImplementedError() 
  • TI12-security/trunk/python/ndg.security.saml/saml/test/test_saml.py

    r5599 r5601  
    241241        print("_"*80) 
    242242 
    243     def test02CreateAttributeQuery(self): 
     243    def test02ParseAssertion(self): 
     244        assertion = self._createAssertionHelper() 
     245         
     246        # Add mapping for ESG Group/Role Attribute Value to enable ElementTree 
     247        # Attribute Value factory to render the XML output 
     248        attributeValueElementTreeClassMap = { 
     249            XSGroupRoleAttributeValue: XSGroupRoleAttributeValueElementTree            
     250        } 
     251         
     252        # Create ElementTree Assertion Element 
     253        assertionElem = AssertionElementTree.create(assertion, 
     254                            customClassMap=attributeValueElementTreeClassMap) 
     255         
     256        self.assert_(iselement(assertionElem)) 
     257         
     258        # Serialise to output  
     259        xmlOutput = prettyPrint(assertionElem)        
     260                 
     261        assertionStream = StringIO() 
     262        assertionStream.write(xmlOutput) 
     263        assertionStream.seek(0) 
     264 
     265        tree = ElementTree.parse(assertionStream) 
     266        elem2 = tree.getroot() 
     267         
     268        assertionElem2 = AssertionElementTree.parse(elem2) 
     269         
     270    def test03CreateAttributeQuery(self): 
    244271        samlUtil = SAMLUtil() 
    245272        samlUtil.firstName = '' 
     
    257284        print("_"*80) 
    258285 
    259     def test03ParseAttributeQuery(self): 
     286    def test04ParseAttributeQuery(self): 
    260287        samlUtil = SAMLUtil() 
    261288        samlUtil.firstName = '' 
     
    292319        print("_"*80) 
    293320 
    294     def test04createResponse(self): 
     321    def test05CreateResponse(self): 
    295322        response = Response() 
    296323        response.issueInstant = datetime.utcnow() 
  • TI12-security/trunk/python/ndg.security.saml/saml/utils.py

    r5599 r5601  
    1616    strptime = lambda datetimeStr, format: datetime(*(_strptime(datetimeStr,  
    1717                                                                format)[0:6])) 
    18 from datetime import datetime 
     18from datetime import datetime, timedelta 
    1919         
    2020         
    2121class SAMLDateTime(object): 
    22     """Generic datetime formatting utility for SAML timestamps 
     22    """Generic datetime formatting utility for SAML timestamps - XMLSchema 
     23    Datetime format 
    2324    """ 
    24     DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ" 
     25    DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S" 
    2526     
    2627    @classmethod 
    27     def toString(cls, dtIssueInstant): 
     28    def toString(cls, dtValue): 
    2829        """Convert issue instant datetime to correct string type for output 
    29         @type dtIssueInstant: datetime.datetime 
    30         @param dtIssueInstant: issue instance as a datetime 
     30        @type dtValue: datetime.datetime 
     31        @param dtValue: issue instance as a datetime 
    3132        @rtype: basestring 
    3233        @return: issue instance as a string 
    3334        """ 
    34         if not isinstance(dtIssueInstant, datetime): 
     35        if not isinstance(dtValue, datetime): 
    3536            raise TypeError("Expecting datetime type for string conversion, " 
    36                             "got %r" % dtIssueInstant) 
     37                            "got %r" % dtValue) 
    3738             
    38         return dtIssueInstant.strftime(cls.DATETIME_FORMAT) 
     39        # isoformat provides the correct formatting 
     40#        return dtIssueInstant.strftime(cls.DATETIME_FORMAT) 
     41        return datetime.isoformat(dtValue)+'Z' 
    3942 
    4043    @classmethod 
    41     def fromString(cls, issueInstant): 
     44    def fromString(cls, strDateTime): 
    4245        """Convert issue instant string to datetime type 
    43         @type issueInstant: basestring 
    44         @param issueInstant: issue instance as a string 
     46        @type strDateTime: basestring 
     47        @param strDateTime: issue instance as a string 
    4548        @rtype: datetime.datetime 
    4649        @return: issue instance as a datetime 
    4750        """ 
    48         if not isinstance(issueInstant, basestring): 
     51        if not isinstance(strDateTime, basestring): 
    4952            raise TypeError("Expecting basestring derived type for string " 
    50                             "conversion, got %r" % issueInstant) 
    51              
    52         return datetime.strptime(issueInstant, cls.DATETIME_FORMAT) 
     53                            "conversion, got %r" % strDateTime) 
     54         
     55        # Workaround for seconds fraction as strptime doesn't seem able to deal 
     56        # with this  
     57        strDateTimeFraction, strSecondsFraction = strDateTime.split('.') 
     58        dtValue = datetime.strptime(strDateTimeFraction, cls.DATETIME_FORMAT) 
     59        secondsFraction = float("0." + strSecondsFraction.replace('Z', '')) 
     60        dtValue += timedelta(seconds=secondsFraction) 
     61        return dtValue 
    5362 
    5463 
  • TI12-security/trunk/python/ndg.security.saml/saml/xml/etree.py

    r5599 r5601  
    4040from saml.saml2.core import SAMLObject, Attribute, AttributeStatement, \ 
    4141    Assertion, Conditions, AttributeValue, AttributeQuery, Subject, NameID, \ 
    42     Issuer, SAMLVersion, Response, Status, StatusCode , \ 
     42    Issuer, SAMLVersion, Response, Status, StatusCode , Advice, \ 
    4343    XSStringAttributeValue, XSGroupRoleAttributeValue 
    4444from saml.common.xml import SAMLConstants 
     
    304304         
    305305        return elem 
     306 
     307     
     308    @classmethod 
     309    def parse(cls, elem): 
     310        """Make a tree of a XML elements based on the assertion""" 
     311        if not ElementTree.iselement(elem): 
     312            raise TypeError("Expecting %r input type for parsing; got %r" % 
     313                            (ElementTree.Element, elem)) 
     314 
     315        localName = QName.getLocalPart(elem.tag) 
     316        if localName != cls.DEFAULT_ELEMENT_LOCAL_NAME: 
     317            raise XMLObjectParseError("No \"%s\" element found" % 
     318                                      cls.DEFAULT_ELEMENT_LOCAL_NAME) 
     319         
     320         
     321        # Unpack attributes from top-level element 
     322        attributeValues = [] 
     323        for attributeName in (cls.VERSION_ATTRIB_NAME, 
     324                              cls.ISSUE_INSTANT_ATTRIB_NAME, 
     325                              cls.ID_ATTRIB_NAME): 
     326            attributeValue = elem.attrib.get(attributeName) 
     327            if attributeValue is None: 
     328                raise XMLObjectParseError('No "%s" attribute found in "%s" ' 
     329                                 'element' % 
     330                                 (attributeName, 
     331                                  cls.DEFAULT_ELEMENT_LOCAL_NAME)) 
     332                 
     333            attributeValues.append(attributeValue) 
     334         
     335        attributeQuery = AttributeQuery() 
     336        attributeQuery.version = SAMLVersion(attributeValues[0]) 
     337        if attributeQuery.version != SAMLVersion.VERSION_20: 
     338            raise NotImplementedError("Parsing for %r is implemented for " 
     339                                      "SAML version %s only; version %s is "  
     340                                      "not supported" %  
     341                                      (cls, 
     342                                       SAMLVersion(SAMLVersion.VERSION_20), 
     343                                       SAMLVersion(attributeQuery.version))) 
     344             
     345        attributeQuery.issueInstant = SAMLDateTime.fromString( 
     346                                                            attributeValues[1]) 
     347        attributeQuery.id = attributeValues[2] 
     348         
     349        for childElem in elem: 
     350            localName = QName.getLocalPart(childElem.tag) 
     351            if localName == Issuer.DEFAULT_ELEMENT_LOCAL_NAME: 
     352                # Parse Issuer 
     353                assertion.issuer = IssuerElementTree.parse(childElem) 
     354                 
     355            elif localName == Subject.DEFAULT_ELEMENT_LOCAL_NAME: 
     356                # Parse Issuer 
     357                assertion.subject = SubjectElementTree.parse(childElem) 
     358                 
     359            elif localName == Advice.DEFAULT_ELEMENT_LOCAL_NAME: 
     360                raise NotImplementedError("Assertion Advice creation is not " 
     361                                          "implemented") 
     362            elif localName == "Conditions": 
     363             
     364            statement in assertion.statements: 
     365            raise NotImplementedError("Assertion Statement creation is not " 
     366                                      "implemented") 
     367         
     368        for authnStatement in assertion.authnStatements: 
     369            raise NotImplementedError("Assertion Authentication Statement " 
     370                                      "creation is not implemented") 
     371         
     372        for authzDecisionStatement in assertion.authzDecisionStatements: 
     373            raise NotImplementedError("Assertion Authorisation Decision " 
     374                                      "Statement creation is not implemented") 
     375             
     376        for attributeStatement in assertion.attributeStatements: 
     377            attributeStatementElem = AttributeStatementElementTree.create( 
     378                                        attributeStatement, 
     379                                        **attributeValueElementTreeFactoryKw) 
     380            elem.append(attributeStatementElem) 
     381         
     382        return assertion 
    306383 
    307384   
     
    825902             
    826903        statusCode = StatusCode() 
    827         statusCode.value = elem.text.strip()  
     904        if elem.text is not None: 
     905            statusCode.value = elem.text.strip()  
    828906         
    829907        return statusCode 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/saml/test_samlinterface.py

    r5599 r5601  
    1919import paste.fixture 
    2020from cStringIO import StringIO 
    21  
    22 from ndg.security.common.saml import Assertion, Attribute, AttributeValue, \ 
     21     
     22from ndg.security.common.soap.etree import SOAPEnvelope 
     23from ndg.security.common.utils.etree import QName 
     24 
     25from saml.saml2.core import Assertion, Attribute, AttributeValue, \ 
    2326    AttributeStatement, SAMLVersion, Subject, NameID, Issuer, AttributeQuery, \ 
    2427    XSStringAttributeValue 
    25 from ndg.security.common.saml.xml import XMLConstants 
    26 from ndg.security.common.saml.xml.etree import AssertionElementTree, \ 
    27     AttributeQueryElementTree, ResponseElementTree 
    28      
    29 from ndg.security.common.soap.etree import SOAPEnvelope 
     28from saml.xml import XMLConstants 
     29from saml.xml.etree import AssertionElementTree, AttributeQueryElementTree, \ 
     30    ResponseElementTree 
    3031 
    3132 
     
    157158         
    158159        elem = AttributeQueryElementTree.create(attributeQuery) 
    159         query = AttributeQueryElementTree.serialize(elem) 
    160160        soapRequest = SOAPEnvelope() 
    161161        soapRequest.create() 
     
    263263            self.fail("Expecting single child element is SOAP body") 
    264264             
    265         if getLocalName(response.envelope.body.elem[0]) != 'Response': 
     265        if QName.getLocalPart(response.envelope.body.elem[0].tag)!='Response': 
    266266            self.fail('Expecting "Response" element in SOAP body') 
    267267             
Note: See TracChangeset for help on using the changeset viewer.