source: TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/__init__.py @ 6777

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

Added matching functions component.

Line 
1"""NDG XACML package for match functions
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "26/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 abc import ABCMeta, abstractmethod
13
14from ndg.xacml.utils import VettedDict
15from ndg.xacml.utils.factory import callModuleObject
16
17
18class AbstractFunction(object):
19    """Base class for all XACML matching functions"""
20   
21    __metaclass__ = ABCMeta
22    FUNCTION_NS = None
23    V1_0_FUNCTION_NS = "urn:oasis:names:tc:xacml:1.0:function:"
24    V2_0_FUNCTION_NS = "urn:oasis:names:tc:xacml:2.0:function:"
25   
26    def __init__(self):
27        if self.__class__.FUNCTION_NS is None:
28            raise TypeError('"FUNCTION_NS" class variable must be defined in '
29                            'derived classes')
30#    @classmethod
31#    def __subclasshook__(cls, C):
32#        if cls is AbstractFunction:
33#            if
34#            return True
35#        else:
36#            return NotImplemented
37           
38    @abstractmethod
39    def evaluate(self, *inputs):
40        """Evaluate the function from the given input arguments and context
41        @param inputs: input arguments need to evaluate the function
42        @type inputs: tuple
43        @return: True for match, False otherwise
44        @rtype: bool
45        """
46       
47class XacmlFunctionNames(object):
48    """XACML standard match function names"""
49    FUNCTION_NAMES = (
50        'urn:oasis:names:tc:xacml:1.0:function:string-equal',
51        'urn:oasis:names:tc:xacml:1.0:function:boolean-equal',
52        'urn:oasis:names:tc:xacml:1.0:function:integer-equal',
53        'urn:oasis:names:tc:xacml:1.0:function:double-equal',
54        'urn:oasis:names:tc:xacml:1.0:function:date-equal',
55        'urn:oasis:names:tc:xacml:1.0:function:time-equal',
56        'urn:oasis:names:tc:xacml:1.0:function:dateTime-equal',
57        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-equal',
58        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-equal',
59        'urn:oasis:names:tc:xacml:1.0:function:anyURI-equal',
60        'urn:oasis:names:tc:xacml:1.0:function:x500Name-equal',
61        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal',
62        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal',
63        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal',
64        'urn:oasis:names:tc:xacml:1.0:function:integer-add',
65        'urn:oasis:names:tc:xacml:1.0:function:double-add',
66        'urn:oasis:names:tc:xacml:1.0:function:integer-subtract',
67        'urn:oasis:names:tc:xacml:1.0:function:double-subtract',
68        'urn:oasis:names:tc:xacml:1.0:function:integer-multiply',
69        'urn:oasis:names:tc:xacml:1.0:function:double-multiply',
70        'urn:oasis:names:tc:xacml:1.0:function:integer-divide',
71        'urn:oasis:names:tc:xacml:1.0:function:double-divide',
72        'urn:oasis:names:tc:xacml:1.0:function:integer-mod',
73        'urn:oasis:names:tc:xacml:1.0:function:integer-abs',
74        'urn:oasis:names:tc:xacml:1.0:function:double-abs',
75        'urn:oasis:names:tc:xacml:1.0:function:round',
76        'urn:oasis:names:tc:xacml:1.0:function:floor',
77        'urn:oasis:names:tc:xacml:1.0:function:string-normalize-space',
78        'urn:oasis:names:tc:xacml:1.0:function:string-normalize-to-lower-case',
79        'urn:oasis:names:tc:xacml:1.0:function:double-to-integer',
80        'urn:oasis:names:tc:xacml:1.0:function:integer-to-double',
81        'urn:oasis:names:tc:xacml:1.0:function:or',
82        'urn:oasis:names:tc:xacml:1.0:function:and',
83        'urn:oasis:names:tc:xacml:1.0:function:n-of',
84        'urn:oasis:names:tc:xacml:1.0:function:not',
85        'urn:oasis:names:tc:xacml:1.0:function:integer-greater-than',
86        'urn:oasis:names:tc:xacml:1.0:function:integer-greater-than-or-equal',
87        'urn:oasis:names:tc:xacml:1.0:function:integer-less-than',
88        'urn:oasis:names:tc:xacml:1.0:function:integer-less-than-or-equal',
89        'urn:oasis:names:tc:xacml:1.0:function:double-greater-than',
90        'urn:oasis:names:tc:xacml:1.0:function:double-greater-than-or-equal',
91        'urn:oasis:names:tc:xacml:1.0:function:double-less-than',
92        'urn:oasis:names:tc:xacml:1.0:function:double-less-than-or-equal',
93        'urn:oasis:names:tc:xacml:1.0:function:dateTime-add-dayTimeDuration',
94        'urn:oasis:names:tc:xacml:1.0:function:dateTime-add-yearMonthDuration',
95        'urn:oasis:names:tc:xacml:1.0:function:dateTime-subtract-dayTimeDuration',
96        'urn:oasis:names:tc:xacml:1.0:function:dateTime-subtract-yearMonthDuration', 
97        'urn:oasis:names:tc:xacml:1.0:function:date-add-yearMonthDuration',
98        'urn:oasis:names:tc:xacml:1.0:function:date-subtract-yearMonthDuration',
99        'urn:oasis:names:tc:xacml:1.0:function:string-greater-than',
100        'urn:oasis:names:tc:xacml:1.0:function:string-greater-than-or-equal',
101        'urn:oasis:names:tc:xacml:1.0:function:string-less-than',
102        'urn:oasis:names:tc:xacml:1.0:function:string-less-than-or-equal',
103        'urn:oasis:names:tc:xacml:1.0:function:time-greater-than',
104        'urn:oasis:names:tc:xacml:1.0:function:time-greater-than-or-equal',
105        'urn:oasis:names:tc:xacml:1.0:function:time-less-than',
106        'urn:oasis:names:tc:xacml:1.0:function:time-less-than-or-equal',
107        'urn:oasis:names:tc:xacml:2.0:function:time-in-range',
108        'urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than',
109        'urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal',
110        'urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than',
111        'urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal',
112        'urn:oasis:names:tc:xacml:1.0:function:date-greater-than',
113        'urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal',
114        'urn:oasis:names:tc:xacml:1.0:function:date-less-than',
115        'urn:oasis:names:tc:xacml:1.0:function:date-less-than-or-equal',
116        'urn:oasis:names:tc:xacml:1.0:function:string-one-and-only',
117        'urn:oasis:names:tc:xacml:1.0:function:string-bag-size',
118        'urn:oasis:names:tc:xacml:1.0:function:string-is-in',
119        'urn:oasis:names:tc:xacml:1.0:function:string-bag',
120        'urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only',
121        'urn:oasis:names:tc:xacml:1.0:function:boolean-bag-size',
122        'urn:oasis:names:tc:xacml:1.0:function:boolean-is-in',
123        'urn:oasis:names:tc:xacml:1.0:function:boolean-bag',
124        'urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only',
125        'urn:oasis:names:tc:xacml:1.0:function:integer-bag-size',
126        'urn:oasis:names:tc:xacml:1.0:function:integer-is-in',
127        'urn:oasis:names:tc:xacml:1.0:function:integer-bag',
128        'urn:oasis:names:tc:xacml:1.0:function:double-one-and-only',
129        'urn:oasis:names:tc:xacml:1.0:function:double-bag-size',
130        'urn:oasis:names:tc:xacml:1.0:function:double-is-in',
131        'urn:oasis:names:tc:xacml:1.0:function:double-bag',
132        'urn:oasis:names:tc:xacml:1.0:function:time-one-and-only',
133        'urn:oasis:names:tc:xacml:1.0:function:time-bag-size',
134        'urn:oasis:names:tc:xacml:1.0:function:time-is-in',
135        'urn:oasis:names:tc:xacml:1.0:function:time-bag',
136        'urn:oasis:names:tc:xacml:1.0:function:date-one-and-only',
137        'urn:oasis:names:tc:xacml:1.0:function:date-bag-size',
138        'urn:oasis:names:tc:xacml:1.0:function:date-is-in',
139        'urn:oasis:names:tc:xacml:1.0:function:date-bag',
140        'urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only',
141        'urn:oasis:names:tc:xacml:1.0:function:dateTime-bag-size',
142        'urn:oasis:names:tc:xacml:1.0:function:dateTime-is-in',
143        'urn:oasis:names:tc:xacml:1.0:function:dateTime-bag',
144        'urn:oasis:names:tc:xacml:1.0:function:anyURI-one-and-only',
145        'urn:oasis:names:tc:xacml:1.0:function:anyURI-bag-size',
146        'urn:oasis:names:tc:xacml:1.0:function:anyURI-is-in',
147        'urn:oasis:names:tc:xacml:1.0:function:anyURI-bag',
148        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-one-and-only',
149        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag-size',
150        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-is-in',
151        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag',
152        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-one-and-only',
153        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag-size',
154        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-is-in',
155        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag',
156        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-one-and-only',
157        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-bag-size',
158        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-is-in',
159        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-bag',
160        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-one-and-only',
161        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-bag-size',
162        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-is-in',
163        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-bag',
164        'urn:oasis:names:tc:xacml:1.0:function:x500Name-one-and-only',
165        'urn:oasis:names:tc:xacml:1.0:function:x500Name-bag-size',
166        'urn:oasis:names:tc:xacml:1.0:function:x500Name-is-in',
167        'urn:oasis:names:tc:xacml:1.0:function:x500Name-bag',
168        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-one-and-only',
169        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag-size',
170        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-is-in',
171        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag',
172        'urn:oasis:names:tc:xacml:2.0:function:string-concatenate',
173        'urn:oasis:names:tc:xacml:2.0:function:uri-string-concatenate',
174        'urn:oasis:names:tc:xacml:1.0:function:any-of',
175        'urn:oasis:names:tc:xacml:1.0:function:all-of',
176        'urn:oasis:names:tc:xacml:1.0:function:any-of-any',
177        'urn:oasis:names:tc:xacml:1.0:function:all-of-any',
178        'urn:oasis:names:tc:xacml:1.0:function:any-of-all',
179        'urn:oasis:names:tc:xacml:1.0:function:all-of-all',
180        'urn:oasis:names:tc:xacml:1.0:function:map',
181        'urn:oasis:names:tc:xacml:1.0:function:x500Name-match',
182        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match',
183        'urn:oasis:names:tc:xacml:1.0:function:string-regexp-match',
184        'urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match',
185        'urn:oasis:names:tc:xacml:2.0:function:ipAddress-regexp-match',
186        'urn:oasis:names:tc:xacml:2.0:function:dnsName-regexp-match',
187        'urn:oasis:names:tc:xacml:2.0:function:rfc822Name-regexp-match',
188        'urn:oasis:names:tc:xacml:2.0:function:x500Name-regexp-match',
189        'urn:oasis:names:tc:xacml:1.0:function:xpath-node-count',
190        'urn:oasis:names:tc:xacml:1.0:function:xpath-node-equal',
191        'urn:oasis:names:tc:xacml:1.0:function:xpath-node-match',
192        'urn:oasis:names:tc:xacml:1.0:function:string-intersection',
193        'urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of',
194        'urn:oasis:names:tc:xacml:1.0:function:string-union',
195        'urn:oasis:names:tc:xacml:1.0:function:string-subset',
196        'urn:oasis:names:tc:xacml:1.0:function:string-set-equals',
197        'urn:oasis:names:tc:xacml:1.0:function:boolean-intersection',
198        'urn:oasis:names:tc:xacml:1.0:function:boolean-at-least-one-member-of',
199        'urn:oasis:names:tc:xacml:1.0:function:boolean-union',
200        'urn:oasis:names:tc:xacml:1.0:function:boolean-subset',
201        'urn:oasis:names:tc:xacml:1.0:function:boolean-set-equals',
202        'urn:oasis:names:tc:xacml:1.0:function:integer-intersection',
203        'urn:oasis:names:tc:xacml:1.0:function:integer-at-least-one-member-of',
204        'urn:oasis:names:tc:xacml:1.0:function:integer-union',
205        'urn:oasis:names:tc:xacml:1.0:function:integer-subset',
206        'urn:oasis:names:tc:xacml:1.0:function:integer-set-equals',
207        'urn:oasis:names:tc:xacml:1.0:function:double-intersection',
208        'urn:oasis:names:tc:xacml:1.0:function:double-at-least-one-member-of',
209        'urn:oasis:names:tc:xacml:1.0:function:double-union',
210        'urn:oasis:names:tc:xacml:1.0:function:double-subset',
211        'urn:oasis:names:tc:xacml:1.0:function:double-set-equals',
212        'urn:oasis:names:tc:xacml:1.0:function:time-intersection',
213        'urn:oasis:names:tc:xacml:1.0:function:time-at-least-one-member-of',
214        'urn:oasis:names:tc:xacml:1.0:function:time-union',
215        'urn:oasis:names:tc:xacml:1.0:function:time-subset',
216        'urn:oasis:names:tc:xacml:1.0:function:time-set-equals',
217        'urn:oasis:names:tc:xacml:1.0:function:date-intersection',
218        'urn:oasis:names:tc:xacml:1.0:function:date-at-least-one-member-of',
219        'urn:oasis:names:tc:xacml:1.0:function:date-union',
220        'urn:oasis:names:tc:xacml:1.0:function:date-subset',
221        'urn:oasis:names:tc:xacml:1.0:function:date-set-equals',
222        'urn:oasis:names:tc:xacml:1.0:function:dateTime-intersection',
223        'urn:oasis:names:tc:xacml:1.0:function:dateTime-at-least-one-member-of',
224        'urn:oasis:names:tc:xacml:1.0:function:dateTime-union',
225        'urn:oasis:names:tc:xacml:1.0:function:dateTime-subset',
226        'urn:oasis:names:tc:xacml:1.0:function:dateTime-set-equals',
227        'urn:oasis:names:tc:xacml:1.0:function:anyURI-intersection',
228        'urn:oasis:names:tc:xacml:1.0:function:anyURI-at-least-one-member-of',
229        'urn:oasis:names:tc:xacml:1.0:function:anyURI-union',
230        'urn:oasis:names:tc:xacml:1.0:function:anyURI-subset',
231        'urn:oasis:names:tc:xacml:1.0:function:anyURI-set-equals',
232        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-intersection',
233        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-at-least-one-member-of',
234        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-union',
235        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-subset',
236        'urn:oasis:names:tc:xacml:1.0:function:hexBinary-set-equals',
237        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-intersection',
238        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-at-least-one-member-of',
239        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-union',
240        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-subset',
241        'urn:oasis:names:tc:xacml:1.0:function:base64Binary-set-equals',
242        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-intersection',
243        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-at-least-one-member-of',
244        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-union',
245        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-subset',
246        'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-set-equals',
247        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-intersection',
248        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-at-least-one-member-of',
249        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-union',
250        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-subset',
251        'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-set-equals',
252        'urn:oasis:names:tc:xacml:1.0:function:x500Name-intersection',
253        'urn:oasis:names:tc:xacml:1.0:function:x500Name-at-least-one-member-of',
254        'urn:oasis:names:tc:xacml:1.0:function:x500Name-union',
255        'urn:oasis:names:tc:xacml:1.0:function:x500Name-subset',
256        'urn:oasis:names:tc:xacml:1.0:function:x500Name-set-equals',
257        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-intersection',
258        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-at-least-one-member-of',
259        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-union',
260        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-subset',
261        'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-set-equals',
262    )
263
264
265class FunctionMapError(Exception):
266    """Generic Error exception class for FunctionMap"""
267   
268   
269class FunctionMapConfigError(FunctionMapError):
270    """Configuration related exception for FunctionMap"""
271       
272       
273class FunctionMap(VettedDict):
274    """Map function IDs to their implementations"""
275    FUNCTION_PKG_PREFIX = 'ndg.xacml.core.functions.'
276   
277    V1_0_PKG_PREFIX = FUNCTION_PKG_PREFIX + 'v1.'
278    V2_0_PKG_PREFIX = FUNCTION_PKG_PREFIX + 'v2.'
279   
280    SUPPORTED_NSS = {
281        AbstractFunction.V1_0_FUNCTION_NS: V1_0_PKG_PREFIX,
282        AbstractFunction.V2_0_FUNCTION_NS: V2_0_PKG_PREFIX
283    }
284   
285    def __init__(self):
286        """Force function entries to derive from AbstractFunction and IDs to
287        be string type
288        """
289        def keyFilter(key):
290            """Enforce string type keys"""
291            if not isinstance(key, basestring):
292                raise TypeError('Expecting %r type for key; got %r' % 
293                                (basestring, type(key))) 
294            return True 
295       
296        def valueFilter(value):
297            """Enforce AbstractFunction derived types for match functions"""
298
299            if not isinstance(value, 
300                              (AbstractFunction, NotImplemented.__class__)):
301                raise TypeError('Expecting %r derived type for value; got %r' % 
302                                (AbstractFunction, type(value))) 
303            return True 
304                     
305        super(FunctionMap, self).__init__(keyFilter, valueFilter)
306       
307    def load(self):
308        """Load function map with implementations from the relevant function
309        package"""
310       
311        for functionNs in XacmlFunctionNames.FUNCTION_NAMES:
312            self._loadFunction(functionNs)
313           
314    @classmethod
315    def withLoadedMap(cls):
316        """Return a pre-loaded map"""
317        functionMap = cls()
318        functionMap.load()
319        return functionMap
320           
321    def _loadFunction(self, functionNs):
322        """Get package to retrieve function class from for given namespace
323        """
324        cls = FunctionMap
325        classPath = None
326        for namespacePrefix, pkgNamePrefix in cls.SUPPORTED_NSS.items():
327            if functionNs.startswith(namespacePrefix):
328                # Namespace is recognised - translate into a path to a function
329                # class in the right functions package
330                functionName = functionNs.split(namespacePrefix)[-1]
331                functionNameParts = functionName.split('-')
332               
333                moduleName = '_'.join(functionNameParts).lower()
334                className = ''.join([n[0].upper() + n[1:] 
335                                     for n in functionNameParts])
336                classPath = pkgNamePrefix + moduleName + '.' + className
337                break
338
339        if classPath is None:
340            raise FunctionMapConfigError('Namespace for function not '
341                                         'recognised: %r' % functionNs) 
342                       
343        # Try importing the function class and loading it into the
344        # map
345        try:
346            self[functionNs] = callModuleObject(classPath)
347        except ImportError:
348            # No implementation exists - default to Abstract function
349            self[functionNs] = NotImplemented
350           
351
352
353       
Note: See TracBrowser for help on using the repository browser.