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

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

Started testing PDP with custom Group/Role? Attribute Value type. Custom match and Bag functions are needed to enable evaluation of rules using the custom type.

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