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

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

Added request subject, resource, action and environment types

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