Changeset 5558


Ignore:
Timestamp:
04/08/09 16:40:37 (10 years ago)
Author:
pjkersha
Message:

More work on SAML ElementTree based parsers

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

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/saml/xml/__init__.py

    r5554 r5558  
    307307    pass 
    308308 
    309 class XMLObjectParsingError(Exception): 
     309class XMLObjectParseError(Exception): 
    310310    pass 
    311311 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/saml/xml/etree.py

    r5554 r5558  
    4343     
    4444from ndg.security.common.saml.xml import XMLObject, IssueInstantXMLObject, \ 
    45     XMLObjectParsingError, SAMLConstants 
     45    XMLObjectParseError, SAMLConstants 
    4646 
    4747from ndg.security.common.utils import getLocalName, prettyPrint 
     
    187187  
    188188    @classmethod 
    189     def parse(cls, elem): 
     189    def parse(cls, elem, **attributeValueElementTreeFactoryKw): 
    190190        """Parse ElementTree element into a SAML Attribute object 
    191191         
     
    200200 
    201201        if getLocalName(elem) != Attribute.DEFAULT_ELEMENT_LOCAL_NAME: 
    202             raise XMLObjectParsingError("No \"%s\" element found" % 
     202            raise XMLObjectParseError("No \"%s\" element found" % 
    203203                                        Attribute.DEFAULT_ELEMENT_LOCAL_NAME) 
    204204             
     
    220220            localName = getLocalName(childElem) 
    221221            if localName != AttributeValue.DEFAULT_ELEMENT_LOCAL_NAME: 
    222                 raise XMLObjectParsingError('Expecting "%s" element; found ' 
     222                raise XMLObjectParseError('Expecting "%s" element; found ' 
    223223                                    '"%s"' % 
    224224                                    (AttributeValue.DEFAULT_ELEMENT_LOCAL_NAME, 
    225225                                     localName)) 
    226226             
    227             attributeValue =  
     227            factory = AttributeValueElementTreeFactory( 
     228                                        **attributeValueElementTreeFactoryKw) 
     229     
     230            attributeValue = factory() 
    228231            attribute.attributeValues.append(attributeValue) 
    229232         
     
    271274        elem.set("%s:%s" % (SAMLConstants.XMLNS_PREFIX,  
    272275                            SAMLConstants.XSI_PREFIX), 
    273                 SAMLConstants.XSI_NS) 
     276                 SAMLConstants.XSI_NS) 
    274277         
    275278        elem.set("%s:%s" % (SAMLConstants.XSI_PREFIX, 'type'),  
     
    281284        return elem 
    282285 
     286    @classmethod 
     287    def parse(cls, elem): 
     288        """Parse ElementTree xs:string element into a SAML  
     289        XSStringAttributeValue object 
     290         
     291        @type elem: ElementTree.Element 
     292        @param elem: Attribute value as ElementTree XML element 
     293        @rtype: ndg.security.common.saml.AttributeValue 
     294        @return: SAML Attribute value 
     295        """ 
     296        if not ElementTree.iselement(elem): 
     297            raise TypeError("Expecting %r input type for parsing; got %r" % 
     298                            (ElementTree.Element, elem)) 
     299 
     300        localName = getLocalName(elem) 
     301        if localName != XSStringAttributeValue.DEFAULT_ELEMENT_LOCAL_NAME: 
     302            raise XMLObjectParseError("No \"%s\" element found" % 
     303                            XSStringAttributeValue.DEFAULT_ELEMENT_LOCAL_NAME) 
     304             
     305        typeAttributeName = "%s:%s" % (SAMLConstants.XSI_PREFIX, 'type') 
     306        type = elem.attrib.get(typeAttributeName) 
     307        if type != XSStringAttributeValue.TYPE_LOCAL_NAME: 
     308            raise XMLObjectParseError('Expecting "%s" type; got "%s"' % 
     309                                    (XSStringAttributeValue.TYPE_LOCAL_NAME, 
     310                                     type)) 
     311             
     312        attributeValue = XSStringAttributeValue() 
     313        attributeValue.value = elem.text.strip() 
     314 
     315        return attributeValue 
     316 
    283317 
    284318class XSGroupRoleAttributeValueElementTree(AttributeValueElementTreeBase): 
     
    286320    Attribute Value"""  
    287321 
    288     def create(self, attributeValue): 
     322    @classmethod 
     323    def create(cls, attributeValue): 
    289324        """Create an XML representation of the input SAML Attribute Value""" 
    290         super(XSGroupRoleAttributeValueElementTree,self).create(attributeValue) 
     325        elem = AttributeValueElementTreeBase.create(attributeValue) 
    291326         
    292327        if not isinstance(attributeValue, XSGroupRoleAttributeValue): 
     
    297332                                   ] = attributeValue.namespacePrefix 
    298333         
    299         self.__elem.set(XSGroupRoleAttributeValue.GROUP_ATTRIB_NAME,  
    300                        attributeValue.group) 
    301          
    302         self.__elem.set(XSGroupRoleAttributeValue.ROLE_ATTRIB_NAME,  
    303                        attributeValue.role) 
    304  
    305         return self.__elem 
     334        elem.set(XSGroupRoleAttributeValue.GROUP_ATTRIB_NAME,  
     335                 attributeValue.group) 
     336         
     337        elem.set(XSGroupRoleAttributeValue.ROLE_ATTRIB_NAME,  
     338                 attributeValue.role) 
     339 
     340        return elem 
    306341 
    307342 
     
    346381                            "SAML class %r" % samlObject.__class__) 
    347382             
    348         return return xmlObjectClass 
     383        return xmlObjectClass 
    349384 
    350385         
     
    377412 
    378413        if getLocalName(elem) != Issuer.DEFAULT_ELEMENT_LOCAL_NAME: 
    379             raise XMLObjectParsingError("No \"%s\" element found" % 
     414            raise XMLObjectParseError("No \"%s\" element found" % 
    380415                                        Issuer.DEFAULT_ELEMENT_LOCAL_NAME) 
    381416             
    382417        issuerFormat = elem.attrib.get(Issuer.FORMAT_ATTRIB_NAME) 
    383418        if issuerFormat is None: 
    384             raise XMLObjectParsingError('No "%s" attribute found in "%s" ' 
     419            raise XMLObjectParseError('No "%s" attribute found in "%s" ' 
    385420                                        'element' % 
    386421                                        (issuerFormat, 
     
    434469 
    435470        if getLocalName(elem) != NameID.DEFAULT_ELEMENT_LOCAL_NAME: 
    436             raise XMLObjectParsingError("No \"%s\" element found" % 
     471            raise XMLObjectParseError("No \"%s\" element found" % 
    437472                                        NameID.DEFAULT_ELEMENT_LOCAL_NAME) 
    438473             
    439474        format = elem.attrib.get(NameID.FORMAT_ATTRIB_NAME) 
    440475        if format is None: 
    441             raise XMLObjectParsingError('No "%s" attribute found in "%s" ' 
     476            raise XMLObjectParseError('No "%s" attribute found in "%s" ' 
    442477                                        'element' % 
    443478                                        (format, 
     
    492527 
    493528        if getLocalName(elem) != Subject.DEFAULT_ELEMENT_LOCAL_NAME: 
    494             raise XMLObjectParsingError("No \"%s\" element found" % 
     529            raise XMLObjectParseError("No \"%s\" element found" % 
    495530                                        Subject.DEFAULT_ELEMENT_LOCAL_NAME) 
    496531             
     
    579614 
    580615        if getLocalName(elem) != AttributeQuery.DEFAULT_ELEMENT_LOCAL_NAME: 
    581             raise XMLObjectParsingError("No \"%s\" element found" % 
     616            raise XMLObjectParseError("No \"%s\" element found" % 
    582617                                    AttributeQuery.DEFAULT_ELEMENT_LOCAL_NAME) 
    583618         
     
    589624            attributeValue = elem.attrib.get(attributeName) 
    590625            if attributeValue is None: 
    591                 raise XMLObjectParsingError('No "%s" attribute found in "%s" ' 
     626                raise XMLObjectParseError('No "%s" attribute found in "%s" ' 
    592627                                 'element' % 
    593628                                 (attributeName, 
     
    618653                # Parse Subject 
    619654                attributeQuery.subject = SubjectElementTree.parse(childElem) 
     655             
     656            elif localName == Attribute.DEFAULT_ELEMENT_LOCAL_NAME: 
     657                attribute = AttributeElementTree.parse(elem) 
     658                attributeQuery.attributes.append(attribute) 
    620659            else: 
    621660                raise XMLObjectParseError("Unrecognised AttributeQuery child " 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/saml/test_saml.py

    r5554 r5558  
    2525    XSGroupRoleAttributeValue, AttributeQuery, Issuer, Subject, NameID 
    2626from ndg.security.common.saml.xml import XMLConstants 
    27 from ndg.security.common.saml.xml.etree import AssertionETreeObject, \ 
    28     XSGroupRoleAttributeValueETreeObject, AttributeQueryETreeObject 
     27from ndg.security.common.saml.xml.etree import AssertionElementTree, \ 
     28    XSGroupRoleAttributeValueElementTree, AttributeQueryElementTree 
    2929 
    3030 
     
    213213         
    214214        # Create XML rendering class using the ElementTree implementation 
    215         assertionETreeObject = AssertionETreeObject() 
     215        assertionElementTree = AssertionElementTree() 
    216216         
    217217        # Add mapping for ESG Group/Role Attribute Value to enable ElementTree 
    218218        # Attribute Value factory to render the XML output 
    219         attributeValueETreeObjectClassMap = { 
    220             XSGroupRoleAttributeValue: XSGroupRoleAttributeValueETreeObject            
     219        attributeValueElementTreeClassMap = { 
     220            XSGroupRoleAttributeValue: XSGroupRoleAttributeValueElementTree            
    221221        } 
    222222         
    223223        # Create ElementTree Assertion Element 
    224         assertionElem = assertionETreeObject.create(assertion, 
    225                             customClassMap=attributeValueETreeObjectClassMap) 
     224        assertionElem = assertionElementTree.create(assertion, 
     225                            customClassMap=attributeValueElementTreeClassMap) 
    226226         
    227227        self.assert_(iselement(assertionElem)) 
    228228         
    229229        # Serialise to output 
    230         xmlOutput = assertionETreeObject.prettyPrint() 
     230        xmlOutput = assertionElementTree.prettyPrint() 
    231231        self.assert_(len(xmlOutput)) 
    232232        print(xmlOutput) 
     
    241241                        "https://openid.localhost/philip.kershaw") 
    242242         
    243         elem = AttributeQueryETreeObject.create(attributeQuery) 
    244         xmlOutput = AttributeQueryETreeObject.prettyPrint(elem) 
     243        elem = AttributeQueryElementTree.create(attributeQuery) 
     244        xmlOutput = AttributeQueryElementTree.prettyPrint(elem) 
    245245        print(xmlOutput) 
    246246 
     
    254254                        "https://openid.localhost/philip.kershaw") 
    255255         
    256         elem = AttributeQueryETreeObject.create(attributeQuery) 
    257 #        xmlOutput = AttributeQueryETreeObject.prettyPrint(elem) 
    258         xmlOutput = AttributeQueryETreeObject.serialize(elem) 
     256        elem = AttributeQueryElementTree.create(attributeQuery) 
     257#        xmlOutput = AttributeQueryElementTree.prettyPrint(elem) 
     258        xmlOutput = AttributeQueryElementTree.serialize(elem) 
    259259         
    260260        attributeQueryStream = StringIO() 
     
    265265        elem2 = tree.getroot() 
    266266         
    267         attributeQuery2 = AttributeQueryETreeObject.parse(elem2) 
    268         xmlOutput2 = AttributeQueryETreeObject.serialize(elem2) 
     267        attributeQuery2 = AttributeQueryElementTree.parse(elem2) 
     268        xmlOutput2 = AttributeQueryElementTree.serialize(elem2) 
    269269        self.assert_(xmlOutput == xmlOutput2) 
    270270         
Note: See TracChangeset for help on using the changeset viewer.