source: TI12-security/trunk/ndg_xacml/ndg/xacml/test/policy/test_policy.py @ 7682

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg-security/TI12-security/trunk/ndg_xacml/ndg/xacml/test/policy/test_policy.py@7682
Revision 7682, 12.9 KB checked in by pjkersha, 10 years ago (diff)

Working and tested version with functionality for adding custom attribute value types and functions.

  • Property svn:keywords set to Id
Line 
1#!/usr/bin/env python
2"""NDG XACML Policy unit tests
3
4NERC DataGrid
5"""
6__author__ = "P J Kershaw"
7__date__ = "16/03/10"
8__copyright__ = "(C) 2010 Science and Technology Facilities Council"
9__contact__ = "Philip.Kershaw@stfc.ac.uk"
10__license__ = "BSD - see LICENSE file in top-level directory"
11__contact__ = "Philip.Kershaw@stfc.ac.uk"
12__revision__ = "$Id$"
13import unittest
14from os import path
15import logging
16logging.basicConfig(level=logging.DEBUG)
17
18from ndg.xacml.core.policy import Policy
19from ndg.xacml.core.functions import functionMap
20from ndg.xacml.core.attributedesignator import SubjectAttributeDesignator
21from ndg.xacml.core.attributeselector import AttributeSelector
22from ndg.xacml.core.attributevalue import AttributeValueClassFactory
23from ndg.xacml.parsers.etree.factory import ReaderFactory
24from ndg.xacml.parsers.etree.attributevaluereader import \
25                                                DataTypeReaderClassFactory
26
27from ndg.xacml.test import (XACML_NDGTEST1_FILEPATH, THIS_DIR, 
28                            GroupRoleAttributeValue, 
29                            ETreeGroupRoleDataTypeReader,
30                            GroupRoleBag,
31                            GroupRoleAtLeastOneMemberOf)
32                               
33   
34class XACMLPolicyTestCase(unittest.TestCase):
35    XACML_TEST1_FILENAME = "rule1.xml"
36    XACML_TEST1_FILEPATH = path.join(THIS_DIR, XACML_TEST1_FILENAME)
37    XACML_TEST2_FILENAME = "rule2.xml"
38    XACML_TEST2_FILEPATH = path.join(THIS_DIR, XACML_TEST2_FILENAME)
39    XACML_TEST3_FILENAME = "rule3.xml"
40    XACML_TEST3_FILEPATH = path.join(THIS_DIR, XACML_TEST3_FILENAME)
41    XACML_TEST4_FILENAME = "rule4.xml"
42    XACML_TEST4_FILEPATH = path.join(THIS_DIR, XACML_TEST4_FILENAME)
43    XACML_ESGFTEST1_FILENAME = "esgf1.xml"
44    XACML_ESGFTEST1_FILEPATH = path.join(THIS_DIR, XACML_ESGFTEST1_FILENAME)
45   
46    def test01ETreeParseRule1Policy(self):
47        PolicyReader = ReaderFactory.getReader(Policy)
48        policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST1_FILEPATH)
49        self.assert_(policy)
50       
51        self.assert_(
52            policy.policyId == "urn:oasis:names:tc:example:SimplePolicy1")
53       
54        self.assert_(policy.ruleCombiningAlgId == \
55        "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides")
56       
57        self.assert_(
58            "Med Example Corp access control policy" in policy.description)
59       
60        self.assert_(len(policy.target.subjects) == 0)
61       
62        self.assert_(policy.rules[0].id == \
63                     "urn:oasis:names:tc:xacml:2.0:example:SimpleRule1")
64       
65        self.assert_(policy.rules[0].effect == 'Permit')
66       
67        self.assert_(
68            'Any subject with an e-mail name in the med.example.com domain' in \
69            policy.rules[0].description)
70       
71        self.assert_(len(policy.rules[0].target.subjects) == 1)
72        self.assert_(len(policy.rules[0].target.actions) == 0)
73        self.assert_(len(policy.rules[0].target.resources) == 0)
74        self.assert_(len(policy.rules[0].target.environments) == 0)
75       
76        self.assert_(len(policy.rules[0].target.subjects[0
77                                                         ].subjectMatches) == 1)
78       
79        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
80            ].matchId == \
81            "urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match")
82       
83        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
84            ].attributeValue.dataType == \
85            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name")
86       
87        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
88            ].attributeDesignator.dataType == \
89            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name")
90       
91        # Attribute ID
92        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
93            ].attributeDesignator.attributeId == \
94            "urn:oasis:names:tc:xacml:1.0:subject:subject-id")
95         
96    def test02ETreeParseRule2Policy(self):
97        PolicyReader = ReaderFactory.getReader(Policy)
98        policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST2_FILEPATH)
99        self.assert_(policy)
100       
101        self.assert_(
102        policy.policyId == "urn:oasis:names:tc:xacml:2.0:example:policyid:2")
103       
104        self.assert_(policy.ruleCombiningAlgId == \
105        "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides")
106       
107        self.assert_(policy.description is None)
108       
109        self.assert_(len(policy.target.actions) == 0)
110       
111        self.assert_(policy.rules[0].id == \
112                     "urn:oasis:names:tc:xacml:2.0:example:ruleid:2")
113       
114        self.assert_(policy.rules[0].effect == 'Permit')
115       
116        self.assert_(policy.rules[0].description == """\
117A person may read any medical record in the
118            http://www.med.example.com/records.xsd namespace
119            for which he or she is the designated parent or guardian,
120            and for which the patient is under 16 years of age""")
121       
122        self.assert_(len(policy.rules[0].target.subjects) == 0)
123        self.assert_(len(policy.rules[0].target.actions) == 1)
124        self.assert_(len(policy.rules[0].target.resources) == 1)
125        self.assert_(len(policy.rules[0].target.environments) == 0)
126       
127        self.assert_(len(policy.rules[0].target.resources[0
128                                                    ].resourceMatches) == 2)
129       
130        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
131            ].matchId == "urn:oasis:names:tc:xacml:1.0:function:string-equal")
132       
133        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
134            ].attributeValue.dataType == \
135                                    "http://www.w3.org/2001/XMLSchema#string")
136       
137        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
138            ].attributeValue.value == 'urn:med:example:schemas:record')
139       
140        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
141            ].attributeDesignator.dataType == \
142                                    "http://www.w3.org/2001/XMLSchema#string")
143       
144        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
145            ].attributeDesignator.attributeId == \
146                            "urn:oasis:names:tc:xacml:1.0:resource:xpath")
147        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
148            ].matchId == \
149                "urn:oasis:names:tc:xacml:1.0:function:xpath-node-match")
150       
151        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
152            ].attributeValue.dataType == \
153                                    "http://www.w3.org/2001/XMLSchema#string")
154       
155        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
156            ].attributeValue.value == '/md:record')
157       
158        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
159            ].attributeDesignator.dataType == \
160                                    "http://www.w3.org/2001/XMLSchema#string")
161       
162        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
163            ].attributeDesignator.attributeId == \
164                                "urn:oasis:names:tc:xacml:1.0:resource:xpath")
165       
166        # Verify Action
167        self.assert_(len(policy.rules[0].target.actions[0
168                                                    ].actionMatches) == 1)
169       
170        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
171            ].matchId == "urn:oasis:names:tc:xacml:1.0:function:string-equal")
172       
173        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
174            ].attributeValue.dataType == \
175                                    "http://www.w3.org/2001/XMLSchema#string")
176       
177        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
178            ].attributeValue.value == "read")
179       
180        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
181            ].attributeDesignator.dataType == \
182                                    "http://www.w3.org/2001/XMLSchema#string")
183       
184        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
185            ].attributeDesignator.attributeId == \
186                            "urn:oasis:names:tc:xacml:1.0:action:action-id")
187
188        self.assert_(policy.rules[0].condition)       
189        self.assert_(policy.rules[0].condition.expression.functionId == \
190                     "urn:oasis:names:tc:xacml:1.0:function:and")
191       
192        self.assert_(len(policy.rules[0].condition.expression.expressions) == 1)
193       
194        self.assert_(policy.rules[0].condition.expression.expressions[0
195            ].functionId == \
196                'urn:oasis:names:tc:xacml:1.0:function:string-equal')
197       
198        self.assert_(len(policy.rules[0].condition.expression.expressions) == 1)
199       
200        self.assert_(len(policy.rules[0].condition.expression.expressions[0
201                     ].expressions) == 2)
202       
203        self.assert_(policy.rules[0].condition.expression.expressions[0
204            ].expressions[0].functionId == \
205                "urn:oasis:names:tc:xacml:1.0:function:string-one-and-only")
206       
207        self.assert_(isinstance(
208                        policy.rules[0].condition.expression.expressions[0
209                            ].expressions[0
210                            ].expressions[0], SubjectAttributeDesignator))
211       
212        self.assert_(policy.rules[0].condition.expression.expressions[0
213                            ].expressions[0
214                            ].expressions[0].attributeId == \
215                            "urn:oasis:names:tc:xacml:2.0:example:attribute:"
216                            "parent-guardian-id")
217
218        self.assert_(policy.rules[0].condition.expression.expressions[0
219                            ].expressions[0
220                            ].expressions[0].dataType == \
221                            "http://www.w3.org/2001/XMLSchema#string")
222       
223        self.assert_(policy.rules[0].condition.expression.expressions[0
224                            ].expressions[0
225                            ].expressions[0].attributeId == \
226                            "urn:oasis:names:tc:xacml:2.0:example:attribute:"
227                            "parent-guardian-id")
228       
229        self.assert_(isinstance(policy.rules[0
230                            ].condition.expression.expressions[0
231                            ].expressions[1
232                            ].expressions[0], AttributeSelector))
233       
234        self.assert_(policy.rules[0
235                            ].condition.expression.expressions[0
236                            ].expressions[1
237                            ].expressions[0].requestContextPath == \
238                            "//md:record/md:parentGuardian/md:parentGuardianId/"
239                            "text()")
240       
241        self.assert_(policy.rules[0
242                            ].condition.expression.expressions[0
243                            ].expressions[1
244                            ].expressions[0].dataType == \
245                            "http://www.w3.org/2001/XMLSchema#string")
246
247    def test03ETreeParseRule3Policy(self):
248        PolicyReader = ReaderFactory.getReader(Policy)
249       
250        try:
251            policy = PolicyReader.parse(
252                                    XACMLPolicyTestCase.XACML_TEST3_FILEPATH)
253            self.assert_(policy)
254        except NotImplementedError, e:
255            print("Expecting Obligations not implemented exception: %s" %e)
256                   
257    def test04ETreeParseRule4Policy(self):
258        PolicyReader = ReaderFactory.getReader(Policy)
259        policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST4_FILEPATH)
260        self.assert_(policy)
261                   
262    def test05ETreeParseNdg1Policy(self):
263        # Example policy for URI Regular expression based matching of
264        # resources for NDG
265        PolicyReader = ReaderFactory.getReader(Policy)
266        policy = PolicyReader.parse(XACML_NDGTEST1_FILEPATH)
267        self.assert_(policy)   
268                   
269    def test05ETreeParsePolicyWithCustomAttributeTypes(self):
270        # Example policy with custom attribute value type used with ESGF
271       
272        # Add new type
273        AttributeValueClassFactory.addClass('urn:grouprole', 
274                                            GroupRoleAttributeValue)
275       
276        # Add new parser for this type
277        DataTypeReaderClassFactory.addReader('urn:grouprole', 
278                                ETreeGroupRoleDataTypeReader)
279       
280        # Add extra matching and bag functions
281        functionMap['urn:grouprole-bag'] = GroupRoleBag
282        functionMap['urn:grouprole-at-least-one-member-of'
283                    ] = GroupRoleAtLeastOneMemberOf
284                           
285        PolicyReader = ReaderFactory.getReader(Policy)
286        policy = PolicyReader.parse(self.__class__.XACML_ESGFTEST1_FILEPATH)
287        self.assert_(policy) 
288       
289       
290if __name__ == "__main__":
291    unittest.main()
Note: See TracBrowser for help on using the repository browser.