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

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

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

Line 
1'''
2Created on 24 Feb 2010
3
4@author: pjkersha
5'''
6from ndg.security.common.utils import TypedList
7from ndg.security.common.authz.xacml import PolicyComponent
8from ndg.security.common.authz.xacml.action import Action
9from ndg.security.common.authz.xacml.resource import Resource
10from ndg.security.common.authz.xacml.subject import Subject
11from ndg.security.common.authz.xacml.environment import Environment
12
13
14class Target(PolicyComponent):
15    ELEMENT_LOCAL_NAME = "Target"
16   
17    __slots__ = ('__actions', '_resources', '__actions', '__environments')
18   
19    def __init__(self):
20        self.__actions = TypedList(Subject)
21        self.__resources = TypedList(Resource)
22        self.__actions = TypedList(Actions)
23        self.__environments = TypedList(Environment)
24   
25    @property
26    def actions(self):
27        return self.__actions
28   
29    @property
30    def resources(self):
31        return self.__resources
32   
33    @property
34    def actions(self):
35        return self.__actions
36   
37    @property
38    def environments(self):
39        return self.__environments
40   
41   
42class _Target(PolicyComponent):
43    """Define access behaviour for a resource match a given URI pattern"""
44    URI_PATTERN_LOCALNAME = "URIPattern"
45    ATTRIBUTES_LOCALNAME = "Attributes"
46    ATTRIBUTE_AUTHORITY_LOCALNAME = "AttributeAuthority"
47   
48    __slots__ = (
49        '__uriPattern',
50        '__attributes',
51        '__regEx'       
52    )
53     
54    def __init__(self):
55        super(Target, self).__init__()
56        self.__uriPattern = None
57        self.__attributes = []
58        self.__regEx = None
59       
60    def getUriPattern(self):
61        return self.__uriPattern
62
63    def setUriPattern(self, value):
64        if not isinstance(value, basestring):
65            raise TypeError('Expecting string type for "uriPattern" '
66                            'attribute; got %r' % type(value))
67        self.__uriPattern = value
68
69    uriPattern = property(getUriPattern, 
70                          setUriPattern, 
71                          doc="URI Pattern to match this target")
72
73    def getAttributes(self):
74        return self.__attributes
75
76    def setAttributes(self, value):
77        if (not isinstance(value, TypedList) and 
78            not issubclass(value.elementType, Attribute.__class__)):
79            raise TypeError('Expecting TypedList(Attribute) for "attributes" '
80                            'attribute; got %r' % type(value))
81        self.__attributes = value
82
83    attributes = property(getAttributes, 
84                          setAttributes, 
85                          doc="Attributes restricting access to this target")
86
87    def getRegEx(self):
88        return self.__regEx
89
90    def setRegEx(self, value):
91        self.__regEx = value
92
93    regEx = property(getRegEx, setRegEx, doc="RegEx's Docstring")
94       
95    def parse(self, root):
96       
97        self.xmlns = QName.getNs(root.tag)
98        version1_0attributeAuthorityURI = None
99       
100        for elem in root:
101            localName = QName.getLocalPart(elem.tag)
102            if localName == Target.URI_PATTERN_LOCALNAME:
103                self.uriPattern = elem.text.strip()
104                self.regEx = re.compile(self.uriPattern)
105               
106            elif localName == Target.ATTRIBUTES_LOCALNAME:
107                for attrElem in elem:
108                    if self.xmlns == Target.VERSION_1_1_XMLNS:
109                        self.attributes.append(Attribute.Parse(attrElem))
110                    else:
111                        attribute = Attribute()
112                        attribute.name = attrElem.text.strip()
113                        self.attributes.append(attribute)
114                   
115            elif localName == Target.ATTRIBUTE_AUTHORITY_LOCALNAME:
116                # Expecting first element to contain the URI
117                warnings.warn(
118                        Target.ATTRIBUTE_AUTHORITY_LOCALNAME_DEPRECATED_MSG,
119                        PendingDeprecationWarning)
120               
121                version1_0attributeAuthorityURI = elem[-1].text.strip()
122            else:
123                raise TargetParseError("Invalid Target attribute: %s" % 
124                                       localName)
125               
126        if self.xmlns == Target.VERSION_1_0_XMLNS:
127            msg = ("Setting all attributes with Attribute Authority "
128                   "URI set read using Version 1.0 schema.  This will "
129                   "be deprecated in future releases")
130           
131            warnings.warn(msg, PendingDeprecationWarning)
132            log.warning(msg)
133           
134            if version1_0attributeAuthorityURI is None:
135                raise TargetParseError("Assuming version 1.0 schema "
136                                       "for Attribute Authority URI setting "
137                                       "but no URI has been set")
138               
139            for attribute in self.attributes:
140                attribute.attributeAuthorityURI = \
141                    version1_0attributeAuthorityURI
142   
143    @classmethod
144    def Parse(cls, root):
145        resource = cls()
146        resource.parse(root)
147        return resource
148   
149    def __str__(self):
150        return str(self.uriPattern)
151
Note: See TracBrowser for help on using the repository browser.