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

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

Added Context Handler and Attribute classes.

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.request import Request
23from ndg.xacml.core.subject import Subject
24from ndg.xacml.core.resource import Resource
25from ndg.xacml.core.action import Action
26
27THIS_DIR = path.dirname(__file__)
28
29
30class XACMLPolicyTestCase(unittest.TestCase):
31    XACML_TEST1_FILENAME = "rule1.xml"
32    XACML_TEST1_FILEPATH = path.join(THIS_DIR, XACML_TEST1_FILENAME)
33    XACML_TEST2_FILENAME = "rule2.xml"
34    XACML_TEST2_FILEPATH = path.join(THIS_DIR, XACML_TEST2_FILENAME)
35    XACML_TEST3_FILENAME = "rule3.xml"
36    XACML_TEST3_FILEPATH = path.join(THIS_DIR, XACML_TEST3_FILENAME)
37    XACML_TEST4_FILENAME = "rule4.xml"
38    XACML_TEST4_FILEPATH = path.join(THIS_DIR, XACML_TEST4_FILENAME)
39    XACML_NDGTEST1_FILENAME = "ndg1.xml"
40    XACML_NDGTEST1_FILEPATH = path.join(THIS_DIR, XACML_NDGTEST1_FILENAME)
41   
42    def test01ETreeParseRule1Policy(self):
43        PolicyReader = ReaderFactory.getReader(Policy)
44        policy = PolicyReader.parse(XACMLTestCase.XACML_TEST1_FILEPATH)
45        self.assert_(policy)
46       
47        self.assert_(
48            policy.policyId == "urn:oasis:names:tc:example:SimplePolicy1")
49       
50        self.assert_(policy.ruleCombiningAlgId == \
51        "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides")
52       
53        self.assert_(
54            "Med Example Corp access control policy" in policy.description)
55       
56        self.assert_(len(policy.target.subjects) == 0)
57       
58        self.assert_(policy.rules[0].id == \
59                     "urn:oasis:names:tc:xacml:2.0:example:SimpleRule1")
60       
61        self.assert_(policy.rules[0].effect == 'Permit')
62       
63        self.assert_(
64            'Any subject with an e-mail name in the med.example.com domain' in \
65            policy.rules[0].description)
66       
67        self.assert_(len(policy.rules[0].target.subjects) == 1)
68        self.assert_(len(policy.rules[0].target.actions) == 0)
69        self.assert_(len(policy.rules[0].target.resources) == 0)
70        self.assert_(len(policy.rules[0].target.environments) == 0)
71       
72        self.assert_(len(policy.rules[0].target.subjects[0].subjectMatches) == 1)
73       
74        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
75            ].matchId == \
76            "urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match")
77       
78        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
79            ].attributeValue.dataType == \
80            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name")
81       
82        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
83            ].attributeDesignator.dataType == \
84            "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name")
85       
86        # Attribute ID
87        self.assert_(policy.rules[0].target.subjects[0].subjectMatches[0
88            ].attributeDesignator.attributeId == \
89            "urn:oasis:names:tc:xacml:1.0:subject:subject-id")
90         
91    def test02ETreeParseRule2Policy(self):
92        PolicyReader = ReaderFactory.getReader(Policy)
93        policy = PolicyReader.parse(XACMLTestCase.XACML_TEST2_FILEPATH)
94        self.assert_(policy)
95       
96        self.assert_(
97        policy.policyId == "urn:oasis:names:tc:xacml:2.0:example:policyid:2")
98       
99        self.assert_(policy.ruleCombiningAlgId == \
100        "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides")
101       
102        self.assert_(policy.description is None)
103       
104        self.assert_(len(policy.target.actions) == 0)
105       
106        self.assert_(policy.rules[0].id == \
107                     "urn:oasis:names:tc:xacml:2.0:example:ruleid:2")
108       
109        self.assert_(policy.rules[0].effect == 'Permit')
110       
111        self.assert_(policy.rules[0].description == """\
112A person may read any medical record in the
113            http://www.med.example.com/records.xsd namespace
114            for which he or she is the designated parent or guardian,
115            and for which the patient is under 16 years of age""")
116       
117        self.assert_(len(policy.rules[0].target.subjects) == 0)
118        self.assert_(len(policy.rules[0].target.actions) == 1)
119        self.assert_(len(policy.rules[0].target.resources) == 1)
120        self.assert_(len(policy.rules[0].target.environments) == 0)
121       
122        self.assert_(len(policy.rules[0].target.resources[0
123                                                    ].resourceMatches) == 2)
124       
125        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
126            ].matchId == "urn:oasis:names:tc:xacml:1.0:function:string-equal")
127       
128        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
129            ].attributeValue.dataType == \
130                                    "http://www.w3.org/2001/XMLSchema#string")
131       
132        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
133            ].attributeValue.value == 'urn:med:example:schemas:record')
134       
135        self.assert_(policy.rules[0].target.resources[0].resourceMatches[0
136            ].attributeDesignator.dataType == \
137                                    "http://www.w3.org/2001/XMLSchema#string")
138       
139        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
140            ].attributeDesignator.attributeId == \
141                            "urn:oasis:names:tc:xacml:1.0:resource:xpath")
142        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
143            ].matchId == \
144                "urn:oasis:names:tc:xacml:1.0:function:xpath-node-match")
145       
146        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
147            ].attributeValue.dataType == \
148                                    "http://www.w3.org/2001/XMLSchema#string")
149       
150        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
151            ].attributeValue.value == '/md:record')
152       
153        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
154            ].attributeDesignator.dataType == \
155                                    "http://www.w3.org/2001/XMLSchema#string")
156       
157        self.assert_(policy.rules[0].target.resources[0].resourceMatches[1
158            ].attributeDesignator.attributeId == \
159                                "urn:oasis:names:tc:xacml:1.0:resource:xpath")
160       
161        # Verify Action
162        self.assert_(len(policy.rules[0].target.actions[0
163                                                    ].actionMatches) == 1)
164       
165        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
166            ].matchId == "urn:oasis:names:tc:xacml:1.0:function:string-equal")
167       
168        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
169            ].attributeValue.dataType == \
170                                    "http://www.w3.org/2001/XMLSchema#string")
171       
172        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
173            ].attributeValue.value == "read")
174       
175        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
176            ].attributeDesignator.dataType == \
177                                    "http://www.w3.org/2001/XMLSchema#string")
178       
179        self.assert_(policy.rules[0].target.actions[0].actionMatches[0
180            ].attributeDesignator.attributeId == \
181                            "urn:oasis:names:tc:xacml:1.0:action:action-id")
182
183        self.assert_(policy.rules[0].condition)       
184        self.assert_(policy.rules[0].condition.expression.functionId == \
185                     "urn:oasis:names:tc:xacml:1.0:function:and")
186       
187        self.assert_(len(policy.rules[0].condition.expression.expressions) == 1)
188       
189        self.assert_(policy.rules[0].condition.expression.expressions[0
190            ].functionId == \
191                'urn:oasis:names:tc:xacml:1.0:function:string-equal')
192       
193        self.assert_(len(policy.rules[0].condition.expression.expressions) == 1)
194       
195        self.assert_(len(policy.rules[0].condition.expression.expressions[0
196                     ].expressions) == 2)
197       
198        self.assert_(policy.rules[0].condition.expression.expressions[0
199            ].expressions[0].functionId == \
200                "urn:oasis:names:tc:xacml:1.0:function:string-one-and-only")
201       
202        self.assert_(isinstance(
203                        policy.rules[0].condition.expression.expressions[0
204                            ].expressions[0
205                            ].expressions[0], SubjectAttributeDesignator))
206       
207        self.assert_(policy.rules[0].condition.expression.expressions[0
208                            ].expressions[0
209                            ].expressions[0].attributeId == \
210                            "urn:oasis:names:tc:xacml:2.0:example:attribute:"
211                            "parent-guardian-id")
212
213        self.assert_(policy.rules[0].condition.expression.expressions[0
214                            ].expressions[0
215                            ].expressions[0].dataType == \
216                            "http://www.w3.org/2001/XMLSchema#string")
217       
218        self.assert_(policy.rules[0].condition.expression.expressions[0
219                            ].expressions[0
220                            ].expressions[0].attributeId == \
221                            "urn:oasis:names:tc:xacml:2.0:example:attribute:"
222                            "parent-guardian-id")
223       
224        self.assert_(isinstance(policy.rules[0
225                            ].condition.expression.expressions[0
226                            ].expressions[1
227                            ].expressions[0], AttributeSelector))
228       
229        self.assert_(policy.rules[0
230                            ].condition.expression.expressions[0
231                            ].expressions[1
232                            ].expressions[0].requestContextPath == \
233                            "//md:record/md:parentGuardian/md:parentGuardianId/"
234                            "text()")
235       
236        self.assert_(policy.rules[0
237                            ].condition.expression.expressions[0
238                            ].expressions[1
239                            ].expressions[0].dataType == \
240                            "http://www.w3.org/2001/XMLSchema#string")
241
242    def test03ETreeParseRule3Policy(self):
243        PolicyReader = ReaderFactory.getReader(Policy)
244       
245        try:
246            policy = PolicyReader.parse(XACMLTestCase.XACML_TEST3_FILEPATH)
247            self.assert_(policy)
248        except NotImplementedError, e:
249            print("Expecting Obligations not implemented exception: %s" %e)
250                   
251    def test04ETreeParseRule4Policy(self):
252        PolicyReader = ReaderFactory.getReader(Policy)
253        policy = PolicyReader.parse(XACMLTestCase.XACML_TEST4_FILEPATH)
254        self.assert_(policy)
255                   
256    def test05ETreeParseNdg1Policy(self):
257        # Example policy for URI Regular expression based matching of
258        # resources for NDG
259        PolicyReader = ReaderFactory.getReader(Policy)
260        policy = PolicyReader.parse(XACMLTestCase.XACML_NDGTEST1_FILEPATH)
261        self.assert_(policy)
262
263
264class XACMLContextTestCase(unittest.TestCase):
265    """Test PDP, PAP, PIP and Context handler"""
266   
267    def test01(self):
268        request = Request()
269       
270        subject = Subject()
271        subject.
272        request.subjects.append(subject)
273
274        request.resources.append(Resource())
275        request.action = Action()
276       
277
278       
279if __name__ == "__main__":
280    unittest.main()
Note: See TracBrowser for help on using the repository browser.