source: TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/policyreader.py @ 6751

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

Working rule1 example parsing, working on rule2 which contains a target resource.

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