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

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

Incomplete - task 2: XACML-Security Integration

  • updating epydoc ready for release.
  • Property svn:keywords set to Id
RevLine 
[6740]1"""NDG XACML ElementTree Policy Reader 
[6731]2
[7087]3NERC DataGrid
[6734]4"""
5__author__ = "P J Kershaw"
6__date__ = "16/03/10"
7__copyright__ = "(C) 2010 Science and Technology Facilities Council"
8__contact__ = "Philip.Kershaw@stfc.ac.uk"
9__license__ = "BSD - see LICENSE file in top-level directory"
10__contact__ = "Philip.Kershaw@stfc.ac.uk"
[7064]11__revision__ = "$Id$"
[6746]12from ndg.xacml.parsers import XMLParseError
13from ndg.xacml.core.policy import Policy
[6754]14from ndg.xacml.core.policydefaults import PolicyDefaults
[6746]15from ndg.xacml.core.variabledefinition import VariableDefinition
16from ndg.xacml.core.rule import Rule
17from ndg.xacml.core.target import Target
[6740]18from ndg.xacml.parsers.etree import QName
[6746]19from ndg.xacml.parsers.etree.reader import ETreeAbstractReader
[6752]20from ndg.xacml.parsers.etree.factory import ReaderFactory
[6731]21   
22   
[6746]23class PolicyReader(ETreeAbstractReader):
[6731]24    """Parse a Policy Document using ElementTree
[6750]25    @cvar TYPE: XACML type to instantiate from parsed object
26    @type string: type"""
27    TYPE = Policy
28   
[6731]29    def __call__(self, obj):
30        """Parse policy object"""
31        elem = super(PolicyReader, self)._parse(obj)
32       
[6750]33        # XACML type to instantiate
[6752]34        xacmlType = PolicyReader.TYPE
35        policy = xacmlType()
[6731]36       
37        localName = QName.getLocalPart(elem.tag)
[6752]38        if localName != xacmlType.ELEMENT_LOCAL_NAME:
[6731]39            raise XMLParseError("No \"%s\" element found" % 
[6752]40                                xacmlType.ELEMENT_LOCAL_NAME)
[6731]41       
42        # Unpack *required* attributes from top-level element
43        attributeValues = []
[6752]44        for attributeName in (xacmlType.POLICY_ID_ATTRIB_NAME,
45                              xacmlType.RULE_COMBINING_ALG_ID_ATTRIB_NAME):
[6731]46            attributeValue = elem.attrib.get(attributeName)
47            if attributeValue is None:
48                raise XMLParseError('No "%s" attribute found in "%s" '
49                                        'element' %
50                                        (attributeName,
[6752]51                                         xacmlType.ELEMENT_LOCAL_NAME))
[6731]52               
53            attributeValues.append(attributeValue) 
54                   
55        policy.policyId, policy.ruleCombiningAlgId = attributeValues
56       
57        # Defaults to XACML version 1.0
58        # TODO: version check
[6752]59        policy.version = (elem.attrib.get(xacmlType.VERSION_ATTRIB_NAME) or 
60                          xacmlType.DEFAULT_XACML_VERSION)
[6731]61           
62        # Parse sub-elements
63        for childElem in elem:
64            localName = QName.getLocalPart(childElem.tag)
65           
[6752]66            if localName == xacmlType.DESCRIPTION_LOCAL_NAME:
[6751]67                if childElem.text is not None:
68                    policy.description = childElem.text.strip()
[6731]69                   
[6752]70            elif localName == xacmlType.POLICY_DEFAULTS_LOCAL_NAME:
[6754]71                PolicyDefaultsReader = ReaderFactory.getReader(PolicyDefaults)
72                policy.policyDefaults = PolicyDefaultsReader.parse(childElem)
[6731]73                   
74            elif localName == Target.ELEMENT_LOCAL_NAME:
[6752]75                TargetReader = ReaderFactory.getReader(Target)
[6734]76                policy.target = TargetReader.parse(childElem)
[6731]77             
[6752]78            elif localName == xacmlType.COMBINER_PARAMETERS_LOCAL_NAME:
[6731]79                raise NotImplementedError()
80             
[6752]81            elif localName == xacmlType.RULE_COMBINER_PARAMETERS_LOCAL_NAME:
[6731]82                raise NotImplementedError()
83           
84            elif localName == VariableDefinition.ELEMENT_LOCAL_NAME:
[6752]85                VariableDefinitionReader = ReaderFactory.getReader(
86                                                            VariableDefinition)
[6731]87                variableDefinition = VariableDefinitionReader.parse(childElem)
88               
89            elif localName == Rule.ELEMENT_LOCAL_NAME:
[6752]90                RuleReader = ReaderFactory.getReader(Rule)
[6734]91                policy.rules.append(RuleReader.parse(childElem))
[6731]92                   
[6752]93            elif localName == xacmlType.OBLIGATIONS_LOCAL_NAME:
[6754]94                raise NotImplementedError('Parsing for Obligations element is '
95                                          'not implemented')
[6731]96           
97            else:
98                raise XMLParseError("XACML Policy child element name %r not "
99                                    "recognised" % localName)
100       
101        return policy
102   
Note: See TracBrowser for help on using the repository browser.