source: TI12-security/trunk/NDG_XACML/ndg/xacml/core/attributedesignator.py @ 6796

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDG_XACML/ndg/xacml/core/attributedesignator.py@6796
Revision 6796, 10.9 KB checked in by pjkersha, 10 years ago (diff)

Refactored functions package to enable dynamic creation of function classes for all the XACML primitive types for any given function e.g. equal module implements EqualBase? and dynamically creates the <type>-equal classes for all the types: string, AnyURI, Boolean etc.

Line 
1"""NDG XACML AttributeDesignator type
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.utils import TypedList
13from ndg.xacml.core.expression import Expression
14from ndg.xacml.core.attributevalue import AttributeValue
15from ndg.xacml.core.context.request import Request
16from ndg.xacml.core.context.exceptions import MissingAttributeError
17
18
19class AttributeDesignator(Expression):
20    '''XACML Attribute Designator type
21    '''
22    ATTRIBUTE_ID_ATTRIB_NAME = 'AttributeId'
23    ISSUER_ATTRIB_NAME = 'Issuer'
24    MUST_BE_PRESENT_ATTRIB_NAME = 'MustBePresent'
25   
26    __slots__ = ('__attributeId', '__issuer', '__mustBePresent')
27   
28    def __init__(self):
29        super(AttributeDesignator, self).__init__()
30        self.__attributeId = None
31        self.__issuer = None
32        self.__mustBePresent = False
33
34    @property
35    def attributeId(self):
36        """Get Attribute Id"""
37        return self.__attributeId
38
39    @attributeId.setter
40    def attributeId(self, value):
41        """Set Attribute Id"""
42        if not isinstance(value, basestring):
43            raise TypeError('Expecting %r type for "attributeId" '
44                            'attribute; got %r' % (basestring, type(value)))
45           
46        self.__attributeId = value 
47       
48    @property
49    def issuer(self):
50        """Get Issuer"""
51        return self.__issuer
52
53    @issuer.setter
54    def issuer(self, value):
55        """Set Issuer"""
56        if not isinstance(value, basestring):
57            raise TypeError('Expecting %r type for "issuer" '
58                            'attribute; got %r' % (basestring, type(value)))
59           
60        self.__issuer = value   
61
62    @property
63    def mustBePresent(self):
64        """Get Must Be Present flag"""
65        return self.__mustBePresent
66
67    @mustBePresent.setter
68    def mustBePresent(self, value):
69        """Set Must Be Present flag"""
70        if not isinstance(value, bool):
71            raise TypeError('Expecting %r type for "mustBePresent" '
72                            'attribute; got %r' % (bool, type(value)))
73           
74        self.__mustBePresent = value       
75               
76       
77class SubjectAttributeDesignator(AttributeDesignator):
78    """XACML Subject Attribute Designator type"""
79    ELEMENT_LOCAL_NAME = 'SubjectAttributeDesignator'
80
81    def evaluate(self, context):
82        """Evaluate the result of the SubjectAttributeDesignator in a condition
83       
84        @param context: the request context
85        @type context: ndg.xacml.core.context.request.Request
86        @return: attribute value(s) resulting from execution of this expression
87        in a condition
88        @rtype: AttributeValue/NoneType 
89        """ 
90        if not isinstance(context, Request):
91            raise TypeError('Expecting %r type for context input; got %r' %
92                            (Request, type(context)))
93       
94        attributeValueBag = TypedList(AttributeValue)
95        dataType = self.dataType
96        attributeId = self.attributeId
97        issuer = self.issuer
98       
99        if issuer is not None:
100            _issuerMatch = lambda _issuer: issuer == _issuer
101        else:
102            _issuerMatch = lambda _issuer: True
103       
104        _attributeMatch = lambda attr: (attr.attributeId == attributeId and 
105                                        attr.dataType == dataType and
106                                        _issuerMatch(attr.issuer))
107                                       
108        for subject in context.subjects: 
109            for attr in subject.attributes:
110                if _attributeMatch(attr):
111                    attributeValueBag.extend([i for i in attr.attributeValues
112                                              if i.dataType == dataType])
113                   
114        if len(attributeValueBag) == 0 and self.mustBePresent:
115            raise MissingAttributeError('"MustBePresent" is set for %r but no '
116                                        'match for attributeId=%r, dataType=%r '
117                                        'and issuer=%r' % 
118                                        (self.__class__.__name__,
119                                         self.attributeId,
120                                         self.dataType,
121                                         self.issuer)) 
122                       
123        return attributeValueBag
124       
125       
126class ResourceAttributeDesignator(AttributeDesignator):
127    """XACML Resource Attribute Designator type"""
128    ELEMENT_LOCAL_NAME = 'ResourceAttributeDesignator'
129   
130    def evaluate(self, context):
131        """Evaluate the result of the ResourceAttributeDesignator in a condition
132       
133        @param context: the request context
134        @type context: ndg.xacml.core.context.request.Request
135        @return: attribute value(s) resulting from execution of this expression
136        in a condition
137        @rtype: AttributeValue/NoneType 
138        """ 
139        if not isinstance(context, Request):
140            raise TypeError('Expecting %r type for context input; got %r' %
141                            (Request, type(context)))
142       
143        attributeValueBag = TypedList(AttributeValue)
144        dataType = self.dataType
145        attributeId = self.attributeId
146        issuer = self.issuer
147       
148        if issuer is not None:
149            _issuerMatch = lambda _issuer: issuer == _issuer
150        else:
151            _issuerMatch = lambda _issuer: True
152       
153        _attributeMatch = lambda attr: (attr.attributeId == attributeId and 
154                                        attr.dataType == dataType and
155                                        _issuerMatch(attr.issuer))
156                   
157        for resource in context.resources:
158            for attr in resource.attributes:
159                if _attributeMatch(attr):
160                    attributeValueBag.extend([i for i in attr.attributeValueBag
161                                              if i.dataType == dataType])
162                   
163        if len(attributeValueBag) == 0 and self.mustBePresent:
164            raise MissingAttributeError('"MustBePresent" is set for %r but no '
165                                        'match for attributeId=%r, dataType=%r '
166                                        'and issuer=%r' % 
167                                        (self.__class__.__name__,
168                                         self.attributeId,
169                                         self.dataType,
170                                         self.issuer)) 
171                       
172        return attributeValueBag   
173   
174       
175class ActionAttributeDesignator(AttributeDesignator):
176    """XACML Action Attribute Designator type"""
177    ELEMENT_LOCAL_NAME = 'ActionAttributeDesignator'
178   
179    def evaluate(self, context):
180        """Evaluate the result of the ActionAttributeDesignator in a condition
181       
182        @param context: the request context
183        @type context: ndg.xacml.core.context.request.Request
184        @return: attribute value(s) resulting from execution of this expression
185        in a condition
186        @rtype: AttributeValue/NoneType 
187        """ 
188        if not isinstance(context, Request):
189            raise TypeError('Expecting %r type for context input; got %r' %
190                            (Request, type(context)))
191       
192        attributeValueBag = TypedList(AttributeValue)
193        dataType = self.dataType
194        attributeId = self.attributeId
195        issuer = self.issuer
196        action = context.action
197       
198        if issuer is not None:
199            _issuerMatch = lambda _issuer: issuer == _issuer
200        else:
201            _issuerMatch = lambda _issuer: True
202       
203        _attributeMatch = lambda attr: (attr.attributeId == attributeId and 
204                                        attr.dataType == dataType and
205                                        _issuerMatch(attr.issuer))
206                   
207        for attr in action.attributes:
208            if _attributeMatch(attr):
209                attributeValueBag.extend([i for i in attr.attributeValues
210                                          if i.dataType == dataType])
211                   
212        if len(attributeValueBag) == 0 and self.mustBePresent:
213            raise MissingAttributeError('"MustBePresent" is set for %r but no '
214                                        'match for attributeId=%r, dataType=%r '
215                                        'and issuer=%r' % 
216                                        (self.__class__.__name__,
217                                         self.attributeId,
218                                         self.dataType,
219                                         self.issuer)) 
220                       
221        return attributeValueBag   
222   
223   
224class EnvironmentAttributeDesignator(AttributeDesignator):
225    """XACML Environment Attribute Designator type"""
226    ELEMENT_LOCAL_NAME = 'EnvironmentAttributeDesignator'
227   
228    def evaluate(self, context):
229        """Evaluate the result of the EnvironmentAttributeDesignator in a
230        condition
231       
232        @param context: the request context
233        @type context: ndg.xacml.core.context.request.Request
234        @return: attribute value(s) resulting from execution of this expression
235        in a condition
236        @rtype: AttributeValue/NoneType 
237        """ 
238        if not isinstance(context, Request):
239            raise TypeError('Expecting %r type for context input; got %r' %
240                            (Request, type(context)))
241       
242        attributeValueBag = []
243        dataType = self.dataType
244        attributeId = self.attributeId
245        issuer = self.issuer
246        environment = context.environment
247       
248        if issuer is not None:
249            _issuerMatch = lambda _issuer: issuer == _issuer
250        else:
251            _issuerMatch = lambda _issuer: True   
252       
253        _attributeMatch = lambda attr: (attr.attributeId == attributeId and 
254                                        attr.dataType == dataType and
255                                        _issuerMatch(attr.issuer))
256                 
257        for attr in environment.attributes:
258            if _attributeMatch(attr):
259                attributeValueBag.extend([i for i in attr.attributeValues
260                                          if i.dataType == dataType])
261                   
262        if len(attributeValueBag) == 0 and self.mustBePresent:
263            raise MissingAttributeError('"MustBePresent" is set for %r but no '
264                                        'match for attributeId=%r, dataType=%r '
265                                        'and issuer=%r' % 
266                                        (self.__class__.__name__,
267                                         self.attributeId,
268                                         self.dataType,
269                                         self.issuer)) 
270                       
271        return attributeValueBag
Note: See TracBrowser for help on using the repository browser.