Ignore:
Timestamp:
27/10/10 16:05:18 (10 years ago)
Author:
pjkersha
Message:

ndg_xacml:

  • added support for custom AttributeValue? DataTypes? - this means that the ESGF GroupRole? attribute type can be added directly into XACML policies.
  • TODO: add support for adding custom functions so that a PDP can correctly apply rules based on custom types like the ESGF GroupRole?.
Location:
TI12-security/trunk/ndg_xacml/ndg/xacml/test
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test

    • Property svn:ignore set to
      esg-grouprole.xsd
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/test_policy.py

    r7087 r7661  
    1919from ndg.xacml.core.attributedesignator import SubjectAttributeDesignator 
    2020from ndg.xacml.core.attributeselector import AttributeSelector 
     21from ndg.xacml.core.attributevalue import (AttributeValueClassFactory,  
     22                                           AttributeValue) 
     23from ndg.xacml.parsers.etree import QName 
    2124from ndg.xacml.parsers.etree.factory import ReaderFactory 
     25from ndg.xacml.parsers.etree.attributevaluereader import ( 
     26                                                DataTypeReaderClassFactory, 
     27                                                ETreeDataTypeReaderBase) 
    2228 
    2329from ndg.xacml.test import XACML_NDGTEST1_FILEPATH, THIS_DIR 
    2430 
    2531 
     32class GroupRoleAttributeValue(AttributeValue): 
     33    IDENTIFIER = 'urn:esgf:pcmdi:grouprole' 
     34    TYPE = dict 
     35    GROUPROLE_ELEMENT_LOCAL_NAME = 'groupRole' 
     36    GROUP_ELEMENT_LOCAL_NAME = 'group' 
     37    ROLE_ELEMENT_LOCAL_NAME = 'role' 
     38    ROLE_DEFAULT_VALUE = 'default' 
     39     
     40    __slots__ = ('group', 'role') 
     41     
     42    def __init__(self): 
     43        super(GroupRoleAttributeValue, self).__init__() 
     44        self.group = None 
     45        self.role = self.__class__.ROLE_DEFAULT_VALUE 
     46     
     47     
     48class ETreeGroupRoleDataTypeReader(ETreeDataTypeReaderBase): 
     49         
     50    @classmethod 
     51    def parse(cls, elem, attributeValue): 
     52        """Parse ESG Group/Role type object 
     53 
     54        @param obj: input object to parse 
     55        @type obj: ElementTree Element, or stream object 
     56        @return: ElementTree element 
     57        @rtype: xml.etree.Element 
     58        """ 
     59        if len(elem) != 1: 
     60            raise XMLParseError("Expecting single groupRole child element but "  
     61                                "found only %d element(s)" % len(elem)) 
     62                      
     63        groupRoleElem = elem[0] 
     64         
     65        if (QName.getLocalPart(groupRoleElem.tag) !=  
     66            attributeValue.__class__.GROUPROLE_ELEMENT_LOCAL_NAME): 
     67            raise XMLParseError("%r element found, expecting \"%s\" element "   
     68                                "instead" %  
     69                                xacmlType.GROUPROLE_ELEMENT_LOCAL_NAME) 
     70         
     71        # Allow for any of the defined Expression sub-types in the child  
     72        # elements 
     73        for subElem in groupRoleElem: 
     74            localName = QName.getLocalPart(subElem.tag) 
     75            if localName == attributeValue.__class__.ROLE_ELEMENT_LOCAL_NAME: 
     76                attributeValue.role = subElem.text 
     77            elif localName == attributeValue.__class__.GROUP_ELEMENT_LOCAL_NAME: 
     78                attributeValue.group = subElem.text 
     79            else: 
     80                raise XMLParseError('%r ESG Group/Role sub-element not ' 
     81                                    'recognised' % localName)  
     82                                
     83     
    2684class XACMLPolicyTestCase(unittest.TestCase): 
    2785    XACML_TEST1_FILENAME = "rule1.xml" 
     
    3391    XACML_TEST4_FILENAME = "rule4.xml" 
    3492    XACML_TEST4_FILEPATH = path.join(THIS_DIR, XACML_TEST4_FILENAME) 
    35     
     93    XACML_ESGFTEST1_FILENAME = "esgf1.xml" 
     94    XACML_ESGFTEST1_FILEPATH = path.join(THIS_DIR, XACML_ESGFTEST1_FILENAME) 
     95     
    3696    def test01ETreeParseRule1Policy(self): 
    3797        PolicyReader = ReaderFactory.getReader(Policy) 
     
    239299         
    240300        try: 
    241             policy = PolicyReader.parse(XACMLPolicyTestCase.XACML_TEST3_FILEPATH) 
     301            policy = PolicyReader.parse( 
     302                                    XACMLPolicyTestCase.XACML_TEST3_FILEPATH) 
    242303            self.assert_(policy) 
    243304        except NotImplementedError, e: 
     
    255316        policy = PolicyReader.parse(XACML_NDGTEST1_FILEPATH) 
    256317        self.assert_(policy)     
    257  
     318                     
     319    def test05ETreeParseEsgf1Policy(self): 
     320        # Example policy with custom attribute value type used with ESGF 
     321         
     322        # Add new type 
     323        AttributeValueClassFactory.addClass('urn:esgf:pcmdi:grouprole',  
     324                                            GroupRoleAttributeValue) 
     325         
     326        # Add new parser for this type 
     327        DataTypeReaderClassFactory.addReader('urn:esgf:pcmdi:grouprole',  
     328                                ETreeGroupRoleDataTypeReader) 
     329         
     330        PolicyReader = ReaderFactory.getReader(Policy) 
     331        policy = PolicyReader.parse(self.__class__.XACML_ESGFTEST1_FILEPATH) 
     332        self.assert_(policy)   
     333         
    258334         
    259335if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.