source: TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/authz/xacml/parsers/etree/policyreader.py @ 6734

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/authz/xacml/parsers/etree/policyreader.py@6734
Revision 6734, 3.7 KB checked in by pjkersha, 10 years ago (diff)

Added XACML Target ElementTree based parser.

Line 
1"""NDG Security XACML ElementTree Policy Reader 
2
3NERC DataGrid Project
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"
11__revision__ = "$Id: $"
12from ndg.security.common.authz.xacml.parsers.etree.reader import \
13    EtreeAbstractReader
14from ndg.security.common.authz.xacml import XMLParseError
15from ndg.security.common.authz.xacml.policy import Policy
16from ndg.security.common.authz.xacml.variabledefinition import \
17    VariableDefinition
18from ndg.security.common.authz.xacml.rule import Rule
19from ndg.security.common.authz.xacml.target import Target
20from ndg.security.common.authz.xacml.parsers.etree import QName
21from ndg.security.common.authz.xacml.parsers.etree.targetreader import \
22    TargetReader
23   
24   
25class PolicyReader(EtreeAbstractReader):
26    """Parse a Policy Document using ElementTree
27    """
28    def __call__(self, obj):
29        """Parse policy object"""
30        elem = super(PolicyReader, self)._parse(obj)
31       
32        policy = Policy()
33        cls = Policy
34       
35        localName = QName.getLocalPart(elem.tag)
36        if localName != cls.ELEMENT_LOCAL_NAME:
37            raise XMLParseError("No \"%s\" element found" % 
38                                cls.ELEMENT_LOCAL_NAME)
39       
40        # Unpack *required* attributes from top-level element
41        attributeValues = []
42        for attributeName in (cls.POLICY_ID_ATTRIB_NAME,
43                              cls.RULE_COMBINING_ALG_ID_ATTRIB_NAME):
44            attributeValue = elem.attrib.get(attributeName)
45            if attributeValue is None:
46                raise XMLParseError('No "%s" attribute found in "%s" '
47                                        'element' %
48                                        (attributeName,
49                                         cls.ELEMENT_LOCAL_NAME))
50               
51            attributeValues.append(attributeValue) 
52                   
53        policy.policyId, policy.ruleCombiningAlgId = attributeValues
54       
55        # Defaults to XACML version 1.0
56        # TODO: version check
57        policy.version = (elem.attrib.get(cls.VERSION_ATTRIB_NAME) or 
58                          cls.DEFAULT_XACML_VERSION)
59           
60        # Parse sub-elements
61        for childElem in elem:
62            localName = QName.getLocalPart(childElem.tag)
63           
64            if localName == cls.DESCRIPTION_LOCAL_NAME:
65                if elem.text is not None:
66                    policy.description = elem.text.strip()
67                   
68            elif localName == cls.POLICY_DEFAULTS_LOCAL_NAME:
69                raise NotImplementedError()
70                   
71            elif localName == Target.ELEMENT_LOCAL_NAME:
72                policy.target = TargetReader.parse(childElem)
73             
74            elif localName == cls.COMBINER_PARAMETERS_LOCAL_NAME:
75                raise NotImplementedError()
76             
77            elif localName == cls.RULE_COMBINER_PARAMETERS_LOCAL_NAME:
78                raise NotImplementedError()
79           
80            elif localName == VariableDefinition.ELEMENT_LOCAL_NAME:
81                variableDefinition = VariableDefinitionReader.parse(childElem)
82               
83            elif localName == Rule.ELEMENT_LOCAL_NAME:
84                policy.rules.append(RuleReader.parse(childElem))
85                   
86            elif localName == cls.OBLIGATIONS_LOCAL_NAME:
87                raise NotImplementedError()
88           
89            else:
90                raise XMLParseError("XACML Policy child element name %r not "
91                                    "recognised" % localName)
92       
93        return policy
94   
Note: See TracBrowser for help on using the repository browser.