source: TI12-security/trunk/ndg_xacml/ndg/xacml/parsers/etree/matchreader.py @ 7087

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

Incomplete - task 2: XACML-Security Integration

  • updating epydoc ready for release.
  • Property svn:keywords set to Id
Line 
1"""NDG XACML ElementTree based generic reader for subject, resource, action and
2environment match types
3
4NERC DataGrid
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.attributevalue import AttributeValue
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.factory import ReaderFactory
19
20
21class MatchReaderBase(ETreeAbstractReader):
22    '''ElementTree based XACML generic Match parser for subject, resource,
23    action and environment match types
24    '''
25    ATTRIBUTE_DESIGNATOR_TYPE = None
26   
27    def __init__(self):
28        if self.__class__.ATTRIBUTE_DESIGNATOR_TYPE is None:
29            raise NotImplementedError('Extend this class setting the '
30                                      '"ATTRIBUTE_DESIGNATOR_TYPE" '
31                                      '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        xacmlType = self.__class__.TYPE
40        match = xacmlType()
41       
42        localName = QName.getLocalPart(elem.tag)
43        if localName != xacmlType.ELEMENT_LOCAL_NAME:
44            raise XMLParseError("No \"%s\" element found" % 
45                                xacmlType.ELEMENT_LOCAL_NAME)
46       
47        # Unpack *required* attributes from top-level element
48        attributeValues = []
49        for attributeName in (xacmlType.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                                                 xacmlType.ELEMENT_LOCAL_NAME))
55               
56            attributeValues.append(attributeValue) 
57                   
58        match.matchId, = attributeValues
59         
60        # Assign specific attribute designator type from derived class
61        attributeDesignatorType = self.__class__.ATTRIBUTE_DESIGNATOR_TYPE
62        attributeDesignatorReaderType = ReaderFactory.getReader(
63                                                        attributeDesignatorType)
64     
65        # Parse match elements
66        for childElem in elem:
67            localName = QName.getLocalPart(childElem.tag)
68           
69            if localName == xacmlType.ATTRIBUTE_VALUE_ELEMENT_LOCAL_NAME:
70                AttributeValueReader = ReaderFactory.getReader(AttributeValue)
71                match.attributeValue = AttributeValueReader.parse(childElem)
72               
73            elif localName == attributeDesignatorType.ELEMENT_LOCAL_NAME:
74                if match.attributeSelector is not None:
75                    raise XMLParseError("XACML %r child element may only be "
76                                        "either a %r or %r element NOT both" %
77                            (xacmlType.ELEMENT_LOCAL_NAME,
78                             attributeDesignatorType.ELEMENT_LOCAL_NAME,
79                             AttributeSelector.ELEMENT_LOCAL_NAME))
80                   
81                match.attributeDesignator = attributeDesignatorReaderType.parse(
82                                                                    childElem)
83                       
84            elif localName == AttributeSelector.ELEMENT_LOCAL_NAME:
85                if match.attributeDesignator is not None:
86                    raise XMLParseError("XACML %r child element may only be "
87                                        "either a %r or %r element NOT both" %
88                            (xacmlType.ELEMENT_LOCAL_NAME,
89                             attributeDesignatorType.ELEMENT_LOCAL_NAME,
90                             AttributeSelector.ELEMENT_LOCAL_NAME))
91                   
92                AttributeSelectorReader = ReaderFactory.getReader(
93                                                            AttributeSelector)
94               
95                match.attributeSelector = AttributeSelectorReader.parse(
96                                                                    childElem)
97            else:
98                raise XMLParseError("XACML %r child element name %r not "
99                                    "recognised" % 
100                                    (xacmlType.MATCH_TYPE.ELEMENT_LOCAL_NAME,
101                                     localName))
102                   
103        return match
104
105   
106       
107
Note: See TracBrowser for help on using the repository browser.