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

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

Adding parsing for Subject type and SubjectMatch? elements.

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.attributedesignator import AttributeDesignator
15from ndg.xacml.core.attributeselector import AttributeSelector
16from ndg.xacml.parsers import XMLParseError
17from ndg.xacml.parsers.etree import QName
18from ndg.xacml.parsers.etree.reader import ETreeAbstractReader
19from ndg.xacml.parsers.etree.attributereader import AttributeValueReader
20
21
22class MatchReaderBase(ETreeAbstractReader):
23    '''ElementTree based XACML generic Match parser for subject, resource,
24    action and environment match types
25    '''
26    MATCH_TYPE = None
27   
28    def __init__(self):
29        if None in (self.__class__.MATCH_TYPE,):
30            raise NotImplementedError('Extend this class setting the "'
31                                      '"MATCH_TYPE" class variable')
32           
33        super(MatchReaderBase, self).__init__()
34       
35    def __call__(self, obj):
36        """Parse subject object"""
37        elem = super(MatchReaderBase, self)._parse(obj)
38       
39        match = self.__class__.MATCH_TYPE()
40        cls = self.__class__.MATCH_TYPE
41       
42        localName = QName.getLocalPart(elem.tag)
43        if localName != cls.ELEMENT_LOCAL_NAME:
44            raise XMLParseError("No \"%s\" element found" % 
45                                cls.ELEMENT_LOCAL_NAME)
46       
47        # Unpack *required* attributes from top-level element
48        attributeValues = []
49        for attributeName in (cls.MATCH_ID_ATTRIB_NAME, ):
50            attributeValue = elem.attrib.get(attributeName)
51            if attributeValue is None:
52                raise XMLParseError('No "%s" attribute found in "%s" '
53                                    'element' % (attributeName,
54                                                 cls.ELEMENT_LOCAL_NAME))
55               
56            attributeValues.append(attributeValue) 
57                   
58        match.matchId, = attributeValues
59           
60        # Parse match elements
61        for childElem in elem:
62            localName = QName.getLocalPart(childElem.tag)
63           
64            if localName == cls.ATTRIBUTE_VALUE_ELEMENT_LOCAL_NAME:
65                match.attributeValue = AttributeValueReader.parse(childElem)
66               
67            elif localName == cls.ATTRIBUTE_DESIGNATOR_ELEMENT_LOCAL_NAME:
68                if match.attributeSelector is not None:
69                    raise XMLParseError("XACML %r child element may only be "
70                                        "either a %r or %r element NOT both" %
71                            (cls.ELEMENT_LOCAL_NAME,
72                             cls.ATTRIBUTE_DESIGNATOR_ELEMENT_LOCAL_NAME,
73                             AttributeSelector.ELEMENT_LOCAL_NAME))
74                   
75                match.attributeDesignator = AttributeDesignatorReader.parse(
76                                                                    childElem)
77                       
78            elif localName == AttributeSelector.ELEMENT_LOCAL_NAME:
79                if match.attributeDesignator is not None:
80                    raise XMLParseError("XACML %r child element may only be "
81                                        "either a %r or %r element NOT both" %
82                            (cls.ELEMENT_LOCAL_NAME,
83                             cls.ATTRIBUTE_DESIGNATOR_ELEMENT_LOCAL_NAME,
84                             AttributeSelector.ELEMENT_LOCAL_NAME))
85
86                match.attributeSelector = AttributeSelectorReader.parse(
87                                                                    childElem)
88            else:
89                raise XMLParseError("XACML %r child element name %r not "
90                                    "recognised" % 
91                                    (cls.MATCH_TYPE.ELEMENT_LOCAL_NAME,
92                                     localName))
93                   
94        return match
95   
96
97class SubjectMatchReader(MatchReaderBase):
98    MATCH_TYPE = SubjectMatch
Note: See TracBrowser for help on using the repository browser.