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, 9 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.