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

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

Added Context Handler and Attribute classes.

Line 
1"""NDG Security Obligation type definition
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "24/02/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 import XacmlCoreBase
14from ndg.xacml.core.attributevalue import AttributeValue
15
16
17class AttributeAssignment(AttributeValue):
18    """XCAML AttributeAssignment type"""
19       
20
21class Effect(object):
22    """Define effect type for Obligation"""
23   
24    # "Permit" effect type
25    PERMIT_STR = "Permit"
26   
27    # "Deny" effect type
28    DENY_STR = "Deny"
29       
30    TYPES = (PERMIT_STR, DENY_STR)
31   
32    __slots__ = ('__value',)
33   
34    def __init__(self, effectType):
35        self.__value = None
36        self.value = effectType
37
38    def __getstate__(self):
39        '''Enable pickling'''
40        _dict = {}
41        for attrName in Effect.__slots__:
42            # Ugly hack to allow for derived classes setting private member
43            # variables
44            if attrName.startswith('__'):
45                attrName = "_Effect" + attrName
46               
47            _dict[attrName] = getattr(self, attrName)
48           
49        return _dict
50 
51    def __setstate__(self, attrDict):
52        '''Enable pickling'''
53        for attrName, val in attrDict.items():
54            setattr(self, attrName, val)
55           
56    def _setValue(self, value):
57        if isinstance(value, Effect):
58            # Cast to string
59            value = str(value)
60           
61        elif not isinstance(value, basestring):
62            raise TypeError('Expecting string or Effect instance for '
63                            '"value" attribute; got %r instead' % type(value))
64           
65        if value not in self.__class__.TYPES:
66            raise AttributeError('Permissable effect types are %r; got '
67                                 '%r instead' % (Effect.TYPES, value))
68        self.__value = value
69       
70    def _getValue(self):
71        return self.__value
72   
73    value = property(fget=_getValue, fset=_setValue, doc="Effect value")
74   
75    def __str__(self):
76        return self.__value
77
78    def __eq__(self, effect):
79        if isinstance(effect, Effect):
80            # Cast to string
81            value = effect.value
82           
83        elif isinstance(effect, basestring):
84            value = effect
85           
86        else:
87            raise TypeError('Expecting string or Effect instance for '
88                            'input effect value; got %r instead' % type(value))
89           
90        if value not in self.__class__.TYPES:
91            raise AttributeError('Permissable effect types are %r; got '
92                                 '%r instead' % (Effect.TYPES, value))
93           
94        return self.__value == value
95   
96
97class Obligation(XacmlCoreBase):
98    """XACML Obligation type"""
99    ELEMENT_LOCAL_NAME = 'Obligation'
100    ATTRIBUTE_ASSIGNMENTS_ELEMENT_LOCAL_NAME = 'AttributeAssignment'
101    FULFILLON_ELEMENT_LOCAL_NAME = 'FulfillOn'
102    OBLIGATION_ID_ATTRIB_NAME = 'ObligationId'
103   
104    __slots__ = ('__attributeAssignments', '__obligationId', '__fulfillOn')
105   
106    def __init__(self):
107        self.__attributeAssignments = TypedList(AttributeAssignment)
108        self.__obligationId = None
109        self.__fulfillOn = None
110       
111    @property
112    def attributeAssignments(self):
113        """Obligation attribute assignments"""
114        return self.__attributeAssignments
115   
116    @property
117    def obligationId(self):
118        """obligation Id"""
119        return self.__obligationId
120
121    @obligationId.setter
122    def obligationId(self, value):
123        """obligation Id"""
124        if not isinstance(value, basestring):
125            raise TypeError('Expecting %r type for "obligationId" attribute; '
126                            'got %r' % (basestring, type(value)))
127           
128        self.__obligationId = value       
129   
130    @property
131    def fulfillOn(self):
132        """Fulfill obligation on the given effect Permit/Deny"""
133        return self.__fulfillOn
134
135    @fulfillOn.setter
136    def fulfillOn(self, value):
137        """Fulfill obligation on the given effect Permit/Deny"""
138        if not isinstance(value, basestring):
139            raise TypeError('Expecting %r type for "fulfillOn" attribute; got '
140                            '%r' % (Effect, type(value)))
141           
142        self.__fulfillOn = value
143       
Note: See TracBrowser for help on using the repository browser.