source: TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/matchreader.py @ 6750

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/matchreader.py@6750
Revision 6750, 4.8 KB checked in by pjkersha, 11 years ago (diff)

Parsing functionality near complete for rule1.xml

Line 
1"""NDG XACML ElementTree based generic reader for subject, resource, action and
2environment match types
3
4NERC DataGrid Project
5"""
6__author__ = "P J Kershaw"
7__date__ = "16/03/10"
8__copyright__ = "(C) 2010 Science and Technology Facilities Council"
9__contact__ = "Philip.Kershaw@stfc.ac.uk"
10__license__ = "BSD - see LICENSE file in top-level directory"
11__contact__ = "Philip.Kershaw@stfc.ac.uk"
12__revision__ = "$Id: $"
13from ndg.xacml.core.match import SubjectMatch
14from ndg.xacml.core.attributeselector import AttributeSelector
15from ndg.xacml.parsers import XMLParseError
16from ndg.xacml.parsers.etree import QName
17from ndg.xacml.parsers.etree.reader import ETreeAbstractReader
18from ndg.xacml.parsers.etree.attributevaluereader import AttributeValueReader
19from ndg.xacml.parsers.etree.attributedesignatorreader import (
20    SubjectAttributeDesignatorReader)
21from ndg.xacml.parsers.etree.attributeselectorreader import \
22    AttributeSelectorReader
23
24
25class MatchReaderBase(ETreeAbstractReader):
26    '''ElementTree based XACML generic Match parser for subject, resource,
27    action and environment match types
28    '''
29    ATTRIBUTE_DESIGNATOR_READER_TYPE = None
30   
31    def __init__(self):
32        if self.__class__.ATTRIBUTE_DESIGNATOR_READER_TYPE is None:
33            raise NotImplementedError('Extend this class setting the '
34                                      '"ATTRIBUTE_DESIGNATOR_READER_TYPE" '
35                                      'class variable')
36           
37        super(MatchReaderBase, self).__init__()
38       
39    def __call__(self, obj):
40        """Parse subject object"""
41        elem = super(MatchReaderBase, self)._parse(obj)
42       
43        cls = self.__class__.TYPE
44        match = cls()
45       
46        localName = QName.getLocalPart(elem.tag)
47        if localName != cls.ELEMENT_LOCAL_NAME:
48            raise XMLParseError("No \"%s\" element found" % 
49                                cls.ELEMENT_LOCAL_NAME)
50       
51        # Unpack *required* attributes from top-level element
52        attributeValues = []
53        for attributeName in (cls.MATCH_ID_ATTRIB_NAME, ):
54            attributeValue = elem.attrib.get(attributeName)
55            if attributeValue is None:
56                raise XMLParseError('No "%s" attribute found in "%s" '
57                                    'element' % (attributeName,
58                                                 cls.ELEMENT_LOCAL_NAME))
59               
60            attributeValues.append(attributeValue) 
61                   
62        match.matchId, = attributeValues
63         
64        # Assign specific attribute designator type from derived class
65        attributeDesignatorReaderType = \
66                                self.__class__.ATTRIBUTE_DESIGNATOR_READER_TYPE
67        attributeDesignatorType = attributeDesignatorReaderType.TYPE
68
69        # Parse match elements
70        for childElem in elem:
71            localName = QName.getLocalPart(childElem.tag)
72           
73            if localName == cls.ATTRIBUTE_VALUE_ELEMENT_LOCAL_NAME:
74                match.attributeValue = AttributeValueReader.parse(childElem)
75               
76            elif localName == attributeDesignatorType.ELEMENT_LOCAL_NAME:
77                if match.attributeSelector is not None:
78                    raise XMLParseError("XACML %r child element may only be "
79                                        "either a %r or %r element NOT both" %
80                            (cls.ELEMENT_LOCAL_NAME,
81                             attributeDesignatorType.ELEMENT_LOCAL_NAME,
82                             AttributeSelector.ELEMENT_LOCAL_NAME))
83                   
84                match.attributeDesignator = attributeDesignatorReaderType.parse(
85                                                                    childElem)
86                       
87            elif localName == AttributeSelector.ELEMENT_LOCAL_NAME:
88                if match.attributeDesignator is not None:
89                    raise XMLParseError("XACML %r child element may only be "
90                                        "either a %r or %r element NOT both" %
91                            (cls.ELEMENT_LOCAL_NAME,
92                             attributeDesignatorType.ELEMENT_LOCAL_NAME,
93                             AttributeSelector.ELEMENT_LOCAL_NAME))
94
95                match.attributeSelector = AttributeSelectorReader.parse(
96                                                                    childElem)
97            else:
98                raise XMLParseError("XACML %r child element name %r not "
99                                    "recognised" % 
100                                    (cls.MATCH_TYPE.ELEMENT_LOCAL_NAME,
101                                     localName))
102                   
103        return match
104   
105
106class SubjectMatchReader(MatchReaderBase):
107    """ElementTree based parser for XACML SubjectMatch"""
108    TYPE = SubjectMatch
109    ATTRIBUTE_DESIGNATOR_READER_TYPE = SubjectAttributeDesignatorReader
Note: See TracBrowser for help on using the repository browser.