source: TI12-security/trunk/NDG_XACML/ndg/xacml/test/test_xacml.py @ 6777

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDG_XACML/ndg/xacml/test/test_xacml.py@6777
Revision 6777, 16.0 KB checked in by pjkersha, 9 years ago (diff)

Added matching functions component.

Line 
1"""NDG XACML unit test package
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: $"
12import unittest
13from os import path
14import logging
15logging.basicConfig(level=logging.DEBUG)
16
17from ndg.xacml.core.policy import Policy
18from ndg.xacml.core.attributedesignator import SubjectAttributeDesignator
19from ndg.xacml.core.attributeselector import AttributeSelector
20from ndg.xacml.parsers.etree.factory import ReaderFactory
21
22from ndg.xacml.core.context.pdpinterface import PDPInterface
23from ndg.xacml.core.context.pdp import PDP
24from ndg.xacml.core.context.handler import AbstractContextHandler
25from ndg.xacml.core.attribute import Attribute
26from ndg.xacml.core.attributevalue import AttributeValue
27from ndg.xacml.core.context.request import Request
28from ndg.xacml.core.context.response import Response
29from ndg.xacml.core.context.result import Result, Decision
30from ndg.xacml.core.context.subject import Subject
31from ndg.xacml.core.context.resource import Resource
32from ndg.xacml.core.context.action import Action
33
34THIS_DIR = path.dirname(__file__)
35XACML_NDGTEST1_FILENAME = "ndg1.xml"
36XACML_NDGTEST1_FILEPATH = path.join(THIS_DIR, XACML_NDGTEST1_FILENAME)
37
38
39class XACMLPolicyTestCase(unittest.TestCase):
40    XACML_TEST1_FILENAME = "rule1.xml"
41    XACML_TEST1_FILEPATH = path.join(THIS_DIR, XACML_TEST1_FILENAME)
42    XACML_TEST2_FILENAME = "rule2.xml"
43    XACML_TEST2_FILEPATH = path.join(THIS_DIR, XACML_TEST2_FILENAME)
44    XACML_TEST3_FILENAME = "rule3.xml"
45    XACML_TEST3_FILEPATH = path.join(THIS_DIR, XACML_TEST3_FILENAME)
46    XACML_TEST4_FILENAME = "rule4.xml"
47    XACML_TEST4_FILEPATH = path.join(THIS_DIR, XACML_TEST4_FILENAME)
48   
49    def test01ETreeParseRule1Policy(self):
50        PolicyReader = ReaderFactory.getReader(Policy)
51        policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST1_FILEPATH)
52        self.assert_(policy)
53       
54        self.assert_(
55            policy.policyId == "urn:oasis:names:tc:example:SimplePolicy1")
56       
57        self.assert_(policy.ruleCombiningAlgId == \
58        "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides")
59       
60        self.assert_(
61            "Med Example Corp access control policy" in policy.description)
62       
63        self.assert_(len(policy.target.subjects) == 0)
64       
65        self.assert_(policy.rules[0].id == \
66                     "urn:oasis:names:tc:xacml:2.0:example:SimpleRule1")
67       
68        self.assert_(policy.rules[0].effect == 'Permit')
69       
70        self.assert_(
71            'Any subject with an e-mail name in the med.example.com domain' in \
72            policy.rules[0].description)
73       
74        self.assert_(len(policy.rules[0].target.subjects) == 1)
75        self.assert_(len(policy.rules[0].target.actions) == 0)
76        self.assert_(len(policy.rules[0].target.resources) == 0)
77        self.assert_(len(policy.rules[0].target.environments) == 0)
78       
79        self.assert_(len(policy.rules[0].target.subjects[0].subjectMatches) == 1)
80       
81        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
82            ].matchId == \
83            "urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match")
84       
85        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
86            ].attributeValue.dataType == \
87            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name")
88       
89        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
90            ].attributeDesignator.dataType == \
91            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name")
92       
93        # Attribute ID
94        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
95            ].attributeDesignator.attributeId == \
96            "urn:oasis:names:tc:xacml:1.0:subject:subject-id")
97         
98    def test02ETreeParseRule2Policy(self):
99        PolicyReader = ReaderFactory.getReader(Policy)
100        policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST2_FILEPATH)
101        self.assert_(policy)
102       
103        self.assert_(
104        policy.policyId == "urn:oasis:names:tc:xacml:2.0:example:policyid:2")
105       
106        self.assert_(policy.ruleCombiningAlgId == \
107        "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides")
108       
109        self.assert_(policy.description is None)
110       
111        self.assert_(len(policy.target.actions) == 0)
112       
113        self.assert_(policy.rules[0].id == \
114                     "urn:oasis:names:tc:xacml:2.0:example:ruleid:2")
115       
116        self.assert_(policy.rules[0].effect == 'Permit')
117       
118        self.assert_(policy.rules[0].description == """\
119A person may read any medical record in the
120            http://www.med.example.com/records.xsd namespace
121            for which he or she is the designated parent or guardian,
122            and for which the patient is under 16 years of age""")
123       
124        self.assert_(len(policy.rules[0].target.subjects) == 0)
125        self.assert_(len(policy.rules[0].target.actions) == 1)
126        self.assert_(len(policy.rules[0].target.resources) == 1)
127        self.assert_(len(policy.rules[0].target.environments) == 0)
128       
129        self.assert_(len(policy.rules[0].target.resources[0
130                                                    ].resourceMatches) == 2)
131       
132        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
133            ].matchId == "urn:oasis:names:tc:xacml:1.0:function:string-equal")
134       
135        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
136            ].attributeValue.dataType == \
137                                    "http://www.w3.org/2001/XMLSchema#string")
138       
139        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
140            ].attributeValue.value == 'urn:med:example:schemas:record')
141       
142        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
143            ].attributeDesignator.dataType == \
144                                    "http://www.w3.org/2001/XMLSchema#string")
145       
146        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
147            ].attributeDesignator.attributeId == \
148                            "urn:oasis:names:tc:xacml:1.0:resource:xpath")
149        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
150            ].matchId == \
151                "urn:oasis:names:tc:xacml:1.0:function:xpath-node-match")
152       
153        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
154            ].attributeValue.dataType == \
155                                    "http://www.w3.org/2001/XMLSchema#string")
156       
157        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
158            ].attributeValue.value == '/md:record')
159       
160        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
161            ].attributeDesignator.dataType == \
162                                    "http://www.w3.org/2001/XMLSchema#string")
163       
164        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
165            ].attributeDesignator.attributeId == \
166                                "urn:oasis:names:tc:xacml:1.0:resource:xpath")
167       
168        # Verify Action
169        self.assert_(len(policy.rules[0].target.actions[0
170                                                    ].actionMatches) == 1)
171       
172        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
173            ].matchId == "urn:oasis:names:tc:xacml:1.0:function:string-equal")
174       
175        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
176            ].attributeValue.dataType == \
177                                    "http://www.w3.org/2001/XMLSchema#string")
178       
179        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
180            ].attributeValue.value == "read")
181       
182        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
183            ].attributeDesignator.dataType == \
184                                    "http://www.w3.org/2001/XMLSchema#string")
185       
186        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
187            ].attributeDesignator.attributeId == \
188                            "urn:oasis:names:tc:xacml:1.0:action:action-id")
189
190        self.assert_(policy.rules[0].condition)       
191        self.assert_(policy.rules[0].condition.expression.functionId == \
192                     "urn:oasis:names:tc:xacml:1.0:function:and")
193       
194        self.assert_(len(policy.rules[0].condition.expression.expressions) == 1)
195       
196        self.assert_(policy.rules[0].condition.expression.expressions[0
197            ].functionId == \
198                'urn:oasis:names:tc:xacml:1.0:function:string-equal')
199       
200        self.assert_(len(policy.rules[0].condition.expression.expressions) == 1)
201       
202        self.assert_(len(policy.rules[0].condition.expression.expressions[0
203                     ].expressions) == 2)
204       
205        self.assert_(policy.rules[0].condition.expression.expressions[0
206            ].expressions[0].functionId == \
207                "urn:oasis:names:tc:xacml:1.0:function:string-one-and-only")
208       
209        self.assert_(isinstance(
210                        policy.rules[0].condition.expression.expressions[0
211                            ].expressions[0
212                            ].expressions[0], SubjectAttributeDesignator))
213       
214        self.assert_(policy.rules[0].condition.expression.expressions[0
215                            ].expressions[0
216                            ].expressions[0].attributeId == \
217                            "urn:oasis:names:tc:xacml:2.0:example:attribute:"
218                            "parent-guardian-id")
219
220        self.assert_(policy.rules[0].condition.expression.expressions[0
221                            ].expressions[0
222                            ].expressions[0].dataType == \
223                            "http://www.w3.org/2001/XMLSchema#string")
224       
225        self.assert_(policy.rules[0].condition.expression.expressions[0
226                            ].expressions[0
227                            ].expressions[0].attributeId == \
228                            "urn:oasis:names:tc:xacml:2.0:example:attribute:"
229                            "parent-guardian-id")
230       
231        self.assert_(isinstance(policy.rules[0
232                            ].condition.expression.expressions[0
233                            ].expressions[1
234                            ].expressions[0], AttributeSelector))
235       
236        self.assert_(policy.rules[0
237                            ].condition.expression.expressions[0
238                            ].expressions[1
239                            ].expressions[0].requestContextPath == \
240                            "//md:record/md:parentGuardian/md:parentGuardianId/"
241                            "text()")
242       
243        self.assert_(policy.rules[0
244                            ].condition.expression.expressions[0
245                            ].expressions[1
246                            ].expressions[0].dataType == \
247                            "http://www.w3.org/2001/XMLSchema#string")
248
249    def test03ETreeParseRule3Policy(self):
250        PolicyReader = ReaderFactory.getReader(Policy)
251       
252        try:
253            policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST3_FILEPATH)
254            self.assert_(policy)
255        except NotImplementedError, e:
256            print("Expecting Obligations not implemented exception: %s" %e)
257                   
258    def test04ETreeParseRule4Policy(self):
259        PolicyReader = ReaderFactory.getReader(Policy)
260        policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST4_FILEPATH)
261        self.assert_(policy)
262                   
263    def test05ETreeParseNdg1Policy(self):
264        # Example policy for URI Regular expression based matching of
265        # resources for NDG
266        PolicyReader = ReaderFactory.getReader(Policy)
267        policy = PolicyReader.parse(XACML_NDGTEST1_FILEPATH)
268        self.assert_(policy)   
269               
270class TestContextHandler(AbstractContextHandler):
271    """Test implementation of Context Handler"""
272   
273    def __init__(self):
274        super(TestContextHandler, self).__init__()
275        self.pip = None       
276       
277    def handlePEPRequest(self, myRequest):
278       
279        # Convert myRequest to XACML context request
280        request = myRequest
281       
282        if self.pdp is None:
283            raise TypeError('No "pdp" attribute set')
284       
285        response = self.pdp.evaluate(request)
286       
287        # Convert XACML context response to domain specific request
288        myResponse = response
289       
290        return myResponse
291   
292
293class XACMLContextTestCase(unittest.TestCase):
294    """Test PDP, PAP, PIP and Context handler"""
295   
296    def _createRequestCtx(self):
297        request = Request()
298       
299        subject = Subject()
300        subjectAttribute = Attribute()
301        subject.attributes.append(subjectAttribute)
302        subjectAttribute.attributeId = \
303                            "urn:oasis:names:tc:xacml:1.0:subject:subject-id"
304        subjectAttribute.dataType = \
305                            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name"
306        subjectAttribute.attributeValue = AttributeValue()
307        subjectAttribute.attributeValue.value = 'bs@simpsons.com'
308       
309        request.subjects.append(subject)
310       
311        resource = Resource()
312        resourceAttribute = Attribute()
313        resource.attributes.append(resourceAttribute)
314       
315        resourceAttribute.attributeId = \
316                            "urn:oasis:names:tc:xacml:1.0:resource:resource-id"
317                           
318        resourceAttribute.dataType = "http://www.w3.org/2001/XMLSchema#anyURI"
319        resourceAttribute.attributeValue = AttributeValue()
320        resourceAttribute.attributeValue.value = \
321                            'file://example/med/record/patient/BartSimpson'
322
323        request.resources.append(resource)
324       
325        request.action = Action()
326        actionAttribute = Attribute()
327        request.action.attributes.append(actionAttribute)
328       
329        actionAttribute.attributeId = \
330                                "urn:oasis:names:tc:xacml:1.0:action:action-id"
331        actionAttribute.dataType = "http://www.w3.org/2001/XMLSchema#string"
332        actionAttribute.attributeValue = AttributeValue()
333        actionAttribute.attributeValue.value = 'read'
334       
335        return request
336   
337    def test01CreateRequest(self):
338        requestCtx = self._createRequestCtx()
339        self.assert_(requestCtx)
340       
341    def test02CreateResponse(self):
342        response = Response()
343        result = Result()
344        response.results.append(result)
345        result.decision = Decision.value = Decision.NOT_APPLICABLE
346       
347    def test03AbstractCtxHandler(self):
348        self.assertRaises(TypeError, AbstractContextHandler)
349       
350    def test04CreateCtxHandler(self):
351        ctxHandler = TestContextHandler()
352       
353    def test04PDPInterface(self):
354        self.assertRaises(TypeError, PDPInterface)
355       
356    def test05CreatePDP(self):
357        pdp = PDP()
358        self.assert_(pdp)
359       
360    def _createPDPfromPolicy(self):
361        pdp = PDP.fromPolicySource(XACML_NDGTEST1_FILEPATH, ReaderFactory)
362        return pdp
363       
364    def test06CreatePDPfromPolicy(self):
365        pdp = self._createPDPfromPolicy()
366        self.assert_(pdp)
367       
368    def test07EvaluatePDP(self):
369        request = self._createRequestCtx()
370        pdp = self._createPDPfromPolicy()
371        response = pdp.evaluate(request)
372        self.assert_(response)
373       
374from ndg.xacml.core.functions import FunctionMap
375from ndg.xacml.core.functions.v2.anyuri_regexp_match import AnyURIRegexpMatch
376
377
378class FunctionTestCase(unittest.TestCase):
379    """Test XACML match functions implementation"""
380   
381    def test01(self):   
382        funcMap = FunctionMap()
383        funcMap.load()
384        anyUriMatchNs = \
385            'urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match'
386           
387        self.assert_(isinstance(funcMap.get(anyUriMatchNs), AnyURIRegexpMatch))
388
389       
390if __name__ == "__main__":
391    unittest.main()
Note: See TracBrowser for help on using the repository browser.