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

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

Work on XACML !ETree based parsing. Added first basic unit test.

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