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

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg-security/TI12-security/trunk/ndg_xacml/ndg/xacml/parsers/etree/policyreader.py@7109
Revision 7109, 4.7 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
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
[7109]26    @type TYPE: type"""
[6750]27    TYPE = Policy
28   
[6731]29    def __call__(self, obj):
[7109]30        """Parse policy object
31       
32        @param obj: input object to parse
33        @type obj: ElementTree Element, or stream object
34        @return: new XACML expression instance
35        @rtype: ndg.xacml.core.policy.Policy derived type
36        @raise XMLParseError: error reading element 
37        @raise NotImplementedError: parsing is not implemented for rule
38        combiner, combiner parameters and obligations elements.         
39        """
[6731]40        elem = super(PolicyReader, self)._parse(obj)
41       
[6750]42        # XACML type to instantiate
[6752]43        xacmlType = PolicyReader.TYPE
44        policy = xacmlType()
[6731]45       
46        localName = QName.getLocalPart(elem.tag)
[6752]47        if localName != xacmlType.ELEMENT_LOCAL_NAME:
[6731]48            raise XMLParseError("No \"%s\" element found" % 
[6752]49                                xacmlType.ELEMENT_LOCAL_NAME)
[6731]50       
51        # Unpack *required* attributes from top-level element
52        attributeValues = []
[6752]53        for attributeName in (xacmlType.POLICY_ID_ATTRIB_NAME,
54                              xacmlType.RULE_COMBINING_ALG_ID_ATTRIB_NAME):
[6731]55            attributeValue = elem.attrib.get(attributeName)
56            if attributeValue is None:
57                raise XMLParseError('No "%s" attribute found in "%s" '
58                                        'element' %
59                                        (attributeName,
[6752]60                                         xacmlType.ELEMENT_LOCAL_NAME))
[6731]61               
62            attributeValues.append(attributeValue) 
63                   
64        policy.policyId, policy.ruleCombiningAlgId = attributeValues
65       
66        # Defaults to XACML version 1.0
67        # TODO: version check
[6752]68        policy.version = (elem.attrib.get(xacmlType.VERSION_ATTRIB_NAME) or 
69                          xacmlType.DEFAULT_XACML_VERSION)
[6731]70           
71        # Parse sub-elements
72        for childElem in elem:
73            localName = QName.getLocalPart(childElem.tag)
74           
[6752]75            if localName == xacmlType.DESCRIPTION_LOCAL_NAME:
[6751]76                if childElem.text is not None:
77                    policy.description = childElem.text.strip()
[6731]78                   
[6752]79            elif localName == xacmlType.POLICY_DEFAULTS_LOCAL_NAME:
[6754]80                PolicyDefaultsReader = ReaderFactory.getReader(PolicyDefaults)
81                policy.policyDefaults = PolicyDefaultsReader.parse(childElem)
[6731]82                   
83            elif localName == Target.ELEMENT_LOCAL_NAME:
[6752]84                TargetReader = ReaderFactory.getReader(Target)
[6734]85                policy.target = TargetReader.parse(childElem)
[6731]86             
[6752]87            elif localName == xacmlType.COMBINER_PARAMETERS_LOCAL_NAME:
[6731]88                raise NotImplementedError()
89             
[6752]90            elif localName == xacmlType.RULE_COMBINER_PARAMETERS_LOCAL_NAME:
[6731]91                raise NotImplementedError()
92           
93            elif localName == VariableDefinition.ELEMENT_LOCAL_NAME:
[6752]94                VariableDefinitionReader = ReaderFactory.getReader(
95                                                            VariableDefinition)
[6731]96                variableDefinition = VariableDefinitionReader.parse(childElem)
97               
98            elif localName == Rule.ELEMENT_LOCAL_NAME:
[6752]99                RuleReader = ReaderFactory.getReader(Rule)
[6734]100                policy.rules.append(RuleReader.parse(childElem))
[6731]101                   
[6752]102            elif localName == xacmlType.OBLIGATIONS_LOCAL_NAME:
[6754]103                raise NotImplementedError('Parsing for Obligations element is '
104                                          'not implemented')
[6731]105           
106            else:
107                raise XMLParseError("XACML Policy child element name %r not "
108                                    "recognised" % localName)
109       
110        return policy
111   
Note: See TracBrowser for help on using the repository browser.