source: TI12-security/trunk/ndg_xacml/ndg/xacml/test/context/test_pdp_with_custom_attributevalue_types.py @ 7668

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

Modified apply and match classes to use a FunctionMap? class singleton to enable easy addition of new function types.

Line 
1#!/usr/bin/env python
2"""NDG unit tests for PDP working with a policy and request context containing
3custom AttributeValue data types
4
5NERC DataGrid
6"""
7__author__ = "P J Kershaw"
8__date__ = "28/10/10"
9__copyright__ = "(C) 2010 Science and Technology Facilities Council"
10__contact__ = "Philip.Kershaw@stfc.ac.uk"
11__license__ = "BSD - see LICENSE file in top-level directory"
12__contact__ = "Philip.Kershaw@stfc.ac.uk"
13__revision__ = "$Id$"
14import unittest
15import logging
16logging.basicConfig(level=logging.DEBUG)
17
18from ndg.xacml.core import Identifiers
19from ndg.xacml.core.attribute import Attribute
20from ndg.xacml.core.attributevalue import AttributeValueClassFactory
21from ndg.xacml.core.functions import functionMap
22from ndg.xacml.core.functions.v1.bag import BagBase
23from ndg.xacml.core.functions.v1.at_least_one_member_of import \
24    AtLeastOneMemberOfBase
25from ndg.xacml.core.context.request import Request
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
30from ndg.xacml.parsers.etree.factory import ReaderFactory
31from ndg.xacml.parsers.etree.attributevaluereader import (
32                                                DataTypeReaderClassFactory)
33from ndg.xacml.core.context.pdp import PDP
34from ndg.xacml.core.context.result import Decision
35from ndg.xacml.test import (XACML_ESGFTEST1_FILEPATH, 
36                            GroupRoleAttributeValue, 
37                            ETreeGroupRoleDataTypeReader)
38from ndg.xacml.test.context import (AnyUriAttributeValue, StringAttributeValue,
39                                    SUBJECT_ID)
40
41
42class XacmlEvalPdpWithCustomAttrTypes(unittest.TestCase):
43    """Evaluate a policy which contains custom XACML Attribute Value Data types
44    """
45    AT_LEAST_ONE_SUBJECT_ROLE_RESTRICTED_ID = \
46        'http://localhost/at-least-of-subject-role-restricted'       
47         
48    @staticmethod
49    def _createRequestCtx(resourceId, 
50                          includeSubject=True,
51                          subjectGroupRoles=None,
52                          groupRoleAttributeId='urn:esg:attr',
53                          action='read'):
54        """Create an example XACML Request Context for tests"""
55        if subjectGroupRoles is None:
56            subjectGroupRoles = [('ACME', 'default')]
57           
58        request = Request()
59       
60        if includeSubject:
61            subject = Subject()
62            openidSubjectAttribute = Attribute()
63           
64            openidSubjectAttribute.attributeId = "urn:esg:openid"
65            openidSubjectAttribute.dataType = AnyUriAttributeValue.IDENTIFIER
66           
67            openidSubjectAttribute.attributeValues.append(
68                                                        AnyUriAttributeValue())
69            openidSubjectAttribute.attributeValues[-1].value = SUBJECT_ID
70                                       
71           
72            subject.attributes.append(openidSubjectAttribute)
73   
74            for group, role in subjectGroupRoles:
75                groupRoleAttribute = Attribute()
76               
77                groupRoleAttribute.attributeId = groupRoleAttributeId
78                groupRoleAttribute.dataType = 'urn:grouprole'
79               
80                groupRoleAttribute.attributeValues.append(
81                                                    GroupRoleAttributeValue())
82                groupRoleAttribute.attributeValues[-1].group = group
83                groupRoleAttribute.attributeValues[-1].role = role
84           
85                subject.attributes.append(groupRoleAttribute)
86                                     
87            request.subjects.append(subject)
88       
89        resource = Resource()
90        resourceAttribute = Attribute()
91        resource.attributes.append(resourceAttribute)
92       
93        resourceAttribute.attributeId = Identifiers.Resource.RESOURCE_ID
94                           
95        resourceAttribute.dataType = AnyUriAttributeValue.IDENTIFIER
96        resourceAttribute.attributeValues.append(AnyUriAttributeValue())
97        resourceAttribute.attributeValues[-1].value = resourceId
98
99        request.resources.append(resource)
100       
101        request.action = Action()
102        actionAttribute = Attribute()
103        request.action.attributes.append(actionAttribute)
104       
105        actionAttribute.attributeId = Identifiers.Action.ACTION_ID
106        actionAttribute.dataType = StringAttributeValue.IDENTIFIER
107        actionAttribute.attributeValues.append(StringAttributeValue())
108        actionAttribute.attributeValues[-1].value = action
109       
110        return request
111       
112    def setUp(self):
113        """Use ESG sample policy"""
114        # Add new type
115        AttributeValueClassFactory.addClass('urn:grouprole', 
116                                            GroupRoleAttributeValue)
117       
118        # Add new parser for this type
119        DataTypeReaderClassFactory.addReader('urn:grouprole', 
120                                ETreeGroupRoleDataTypeReader)
121       
122        # Add extra matching and bag functions
123       
124        # Example policy with custom attribute value type used with ESGF
125        self.pdp = PDP.fromPolicySource(XACML_ESGFTEST1_FILEPATH, ReaderFactory)
126                   
127    def test01AtLeastOneSubjectRoleResource(self):
128        # Test at least one member function
129        request = self._createRequestCtx(
130                    self.__class__.AT_LEAST_ONE_SUBJECT_ROLE_RESTRICTED_ID,
131                    action='write')
132        response = self.pdp.evaluate(request)
133        self.failIf(response is None, "Null response")
134        for result in response.results:
135            self.failIf(result.decision != Decision.PERMIT, 
136                        "Expecting Permit decision")   
137           
138           
139if __name__ == "__main__":
140    unittest.main()
Note: See TracBrowser for help on using the repository browser.