source: TI12-security/trunk/NDG_XACML/ndg/xacml/core/context/result.py @ 6770

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

Added Context Handler and Attribute classes.

Line 
1"""NDG XACML module for Result type
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "23/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: $"
12import logging
13log = logging.getLogger(__name__)
14
15from ndg.xacml.core.context import XacmlContextBase
16from ndg.xacml.core.obligation import Obligation
17
18
19class StatusCode(XacmlContextBase):
20    '''XACML Response Result StatusCode.'''
21   
22    # Local Name of StatusCode.
23    ELEMENT_LOCAL_NAME = "StatusCode"
24
25
26    __slots__ = ('__value', '__childStatusCode',)
27   
28    def __init__(self, **kw):
29        super(StatusCode, self).__init__(**kw)
30       
31        # Value attribute URI.
32        self.__value = None
33   
34        # Nested secondary StatusCode child element.
35        self.__childStatusCode = None
36
37    def _getStatusCode(self): 
38        return self.__childStatusCode
39   
40    def _setStatusCode(self, value):
41        if not isinstance(value, StatusCode):
42            raise TypeError('Child "statusCode" must be a %r derived type, '
43                            "got %r" % (StatusCode, type(value)))
44           
45        self.__childStatusCode = value
46
47    value = property(fget=_getStatusCode, 
48                     fset=_setStatusCode, 
49                     doc="Child Status code")
50             
51    def _getValue(self):
52        return self.__value
53       
54    def _setValue(self, value):
55        if not isinstance(value, basestring):
56            raise TypeError("\"value\" must be a basestring derived type, "
57                            "got %r" % value.__class__)
58           
59        self.__value = value
60
61    value = property(fget=_getValue, fset=_setValue, doc="Status code value")
62   
63
64class Status(XacmlContextBase): 
65    '''XACML Response Result Status'''
66   
67    # Local Name of Status.
68    ELEMENT_LOCAL_NAME = "Status"
69
70    __slots__ = ('__statusCode', '__statusMessage', '__statusDetail', )
71   
72    def __init__(self, **kw):
73        super(Status, self).__init__(**kw)
74       
75        # StatusCode element.
76        self.__statusCode = None
77   
78        # StatusMessage element.
79        self.__statusMessage = None
80   
81        # StatusDetail element.
82        self.__statusDetail = None
83   
84    def _getStatusCode(self):
85        '''
86        Gets the Code of this Status.
87       
88        @return: Status StatusCode
89        '''
90        return self.__statusCode
91
92    def _setStatusCode(self, value):
93        '''
94        Sets the Code of this Status.
95       
96        @param value: the Code of this Status
97        '''
98        if not isinstance(value, StatusCode):
99            raise TypeError('"statusCode" must be a %r derived type, '
100                            "got %r" % (StatusCode, type(value)))
101           
102        self.__statusCode = value
103       
104    statusCode = property(fget=_getStatusCode,
105                          fset=_setStatusCode,
106                          doc="status code object")
107   
108    def _getStatusMessage(self):
109        '''
110        Gets the Message of this Status.
111       
112        @return: Status StatusMessage
113        '''
114        return self.__statusMessage
115
116    def _setStatusMessage(self, value):
117        '''
118        Sets the Message of this Status.
119       
120        @param value: the Message of this Status
121        '''
122        if not isinstance(value, basestring):
123            raise TypeError('"statusMessage" must be a %r derived type, '
124                            "got %r" % (basestring, type(value)))
125           
126        self.__statusMessage = value
127       
128    statusMessage = property(fget=_getStatusMessage,
129                             fset=_setStatusMessage,
130                             doc="status message")
131
132    def _getStatusDetail(self):
133        '''
134        Gets the Detail of this Status.
135       
136        @return: Status StatusDetail
137        '''
138        return self.__statusDetail
139   
140    def _setStatusDetail(self, value):
141        '''
142        Sets the Detail of this Status.
143       
144        @param value: the Detail of this Status
145        '''
146        self.__statusDetail = value
147       
148    statusDetail = property(fget=_getStatusDetail,
149                            fset=_setStatusDetail,
150                            doc="status message")
151           
152
153class Decision(object):
154    """Define decision types for Response Result"""
155   
156    # "Permit" decision type
157    PERMIT_STR = "Permit"
158   
159    # "Deny" decision type
160    DENY_STR = "Deny"
161   
162    # "Indeterminate" decision type
163    INDETERMINATE_STR = "Indeterminate"
164   
165    NOT_APPLICABLE_STR = "NotApplicable"
166       
167    TYPES = (PERMIT_STR, DENY_STR, INDETERMINATE_STR, NOT_APPLICABLE_STR)
168   
169    __slots__ = ('__value',)
170   
171    def __init__(self, decisionType):
172        self.__value = None
173        self.value = decisionType
174
175    def __getstate__(self):
176        '''Enable pickling'''
177        _dict = {}
178        for attrName in Decision.__slots__:
179            # Ugly hack to allow for derived classes setting private member
180            # variables
181            if attrName.startswith('__'):
182                attrName = "_Decision" + attrName
183               
184            _dict[attrName] = getattr(self, attrName)
185           
186        return _dict
187 
188    def __setstate__(self, attrDict):
189        '''Enable pickling'''
190        for attrName, val in attrDict.items():
191            setattr(self, attrName, val)
192           
193    def _setValue(self, value):
194        if isinstance(value, Decision):
195            # Cast to string
196            value = str(value)
197           
198        elif not isinstance(value, basestring):
199            raise TypeError('Expecting string or Decision instance for '
200                            '"value" attribute; got %r instead' % type(value))
201           
202        if value not in self.__class__.TYPES:
203            raise AttributeError('Permissable decision types are %r; got '
204                                 '%r instead' % (Decision.TYPES, value))
205        self.__value = value
206       
207    def _getValue(self):
208        return self.__value
209   
210    value = property(fget=_getValue, fset=_setValue, doc="Decision value")
211   
212    def __str__(self):
213        return self.__value
214
215    def __eq__(self, decision):
216        if isinstance(decision, Decision):
217            # Cast to string
218            value = decision.value
219           
220        elif isinstance(decision, basestring):
221            value = decision
222           
223        else:
224            raise TypeError('Expecting string or Decision instance for '
225                            'input decision value; got %r instead' % type(value))
226           
227        if value not in self.__class__.TYPES:
228            raise AttributeError('Permissable decision types are %r; got '
229                                 '%r instead' % (Decision.TYPES, value))
230           
231        return self.__value == value       
232
233
234class PermitDecision(Decision):
235    """Permit authorisation Decision"""
236    __slots__ = ()
237
238    def __init__(self):
239        super(PermitDecision, self).__init__(Decision.PERMIT_STR)
240       
241    def _setValue(self): 
242        raise AttributeError("can't set attribute")
243
244
245class DenyDecision(Decision):
246    """Deny authorisation Decision"""
247    __slots__ = ()
248   
249    def __init__(self):
250        super(DenyDecision, self).__init__(Decision.DENY_STR)
251       
252    def _setValue(self, value): 
253        raise AttributeError("can't set attribute")
254
255
256class IndeterminateDecision(Decision):
257    """Indeterminate authorisation Decision"""
258    __slots__ = ()
259   
260    def __init__(self):
261        super(IndeterminateDecision, self).__init__(Decision.INDETERMINATE_STR)
262       
263    def _setValue(self, value): 
264        raise AttributeError("can't set attribute")
265
266
267class NotApplicableDecision(Decision):
268    """NotApplicable authorisation Decision"""
269    __slots__ = ()
270   
271    def __init__(self):
272        super(NotApplicableDecision, self).__init__(Decision.NOT_APPLICABLE_STR)
273       
274    def _setValue(self, value): 
275        raise AttributeError("can't set attribute")
276   
277   
278# Add instances of each for convenience
279Decision.PERMIT = PermitDecision()
280Decision.DENY = DenyDecision()
281Decision.INDETERMINATE = IndeterminateDecision()
282Decision.NOT_APPLICABLE = NotApplicableDecision()
283
284
285class Result(XacmlContextBase):
286    """XACML Result type - element in a Response"""
287    __slots__ = ('__resourceId', '__decision', '__status', '__obligations')
288   
289    ELEMENT_LOCAL_NAME  = 'Result'
290    REOSURCE_ID_ATTRIB_NAME = 'ResourceId'
291   
292    def __init__(self):
293        self.__decision = None
294        self.__status = None
295        self.__resourceId = None
296        self.__obligations = None
297       
298    @property
299    def resourceId(self):
300        """Result resource Id"""
301        return self.__resourceId
302
303    @resourceId.setter
304    def resourceId(self, value):
305        """Result resource Id"""
306        if not isinstance(value, basestring):
307            raise TypeError('Expecting %r type for "resourceId" '
308                            'result; got %r' % (basestring, type(value)))
309           
310        self.__resourceId = value
311                       
312    @property
313    def decision(self):
314        """Result decision"""
315        return self.__decision
316   
317    @decision.setter
318    def decision(self, value):
319        """Request decision"""
320        if not isinstance(value, Decision):
321            raise TypeError('Expecting %r type for result "decision" '
322                            'attribute; got %r' % (Decision, type(value)))
323                                   
324    @property
325    def status(self):
326        """Result status"""
327        return self.__status
328   
329    @status.setter
330    def status(self, value):
331        """Result status"""
332        if not isinstance(value, Status):
333            raise TypeError('Expecting %r type for result "status" '
334                            'attribute; got %r' % (Status, type(value)))
335                                   
336    @property
337    def obligation(self):
338        """Result obligation"""
339        return self.__obligation
340   
341    @obligation.setter
342    def obligation(self, value):
343        """Result obligation"""
344        if not isinstance(value, Obligation):
345            raise TypeError('Expecting %r type for result "obligation" '
346                            'attribute; got %r' % (Obligation, type(value)))
Note: See TracBrowser for help on using the repository browser.