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?.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/ndg_xacml/ndg/xacml/parsers/etree/attributevaluereader.py

    r7109 r7661  
    1515from ndg.xacml.parsers.etree import QName 
    1616from ndg.xacml.parsers.etree.expressionreader import ExpressionReader 
     17from ndg.xacml.utils import VettedDict 
    1718 
    1819 
    1920class AttributeValueReader(ExpressionReader): 
    20     '''ElementTree based XACML Expression type parser 
     21    '''ElementTree based XACML AttributeValue type parser 
    2122     
    2223    @cvar TYPE: XACML class type that this reader will read values into 
     
    6162              
    6263        attributeValueClass = self.__class__.FACTORY(elemAttributeValues[0]) 
     64        if attributeValueClass is None: 
     65            raise XMLParseError("No Attribute Value class available for " 
     66                                "parsing %r type" % elemAttributeValues[0]) 
     67             
    6368        attributeValue = attributeValueClass() 
    6469        attributeValue.dataType = elemAttributeValues[0] 
     
    7984        @raise XMLParseError: error parsing attribute ID XML attribute 
    8085        """ 
     86        reader = DataTypeReaderClassFactory.getReader(attributeValue) 
     87        reader.parse(elem, attributeValue) 
     88         
     89 
     90class ETreeDataTypeReaderBase(object):   
     91    @classmethod 
     92    def parse(cls, elem, attributeValue): 
    8193        if elem.text is None: 
    8294            raise XMLParseError('No attribute value element found parsing %r' %  
     
    8496             
    8597        attributeValue.value = elem.text 
     98 
     99         
     100class ETreeDataTypeReaderClassMap(VettedDict): 
     101    """Specialised dictionary to hold mappings of XACML AttributeValue DataTypes 
     102    and their equivalent ElementTree reader classes 
     103    """ 
    86104     
     105    def __init__(self): 
     106        """Force entries to derive from AttributeValue and IDs to 
     107        be string type 
     108        """         
     109        # Filters are defined as staticmethods but reference via self here to  
     110        # enable derived class to override them as standard methods without 
     111        # needing to redefine this __init__ method             
     112        VettedDict.__init__(self, self.keyFilter, self.valueFilter) 
     113         
     114    @staticmethod 
     115    def keyFilter(key): 
     116        """Enforce string type keys for Attribute Value DataType URIs 
     117         
     118        @param key: URN for attribute 
     119        @type key: basestring 
     120        @return: boolean True indicating key is OK 
     121        @rtype: bool 
     122        @raise TypeError: incorrect input type 
     123        """ 
     124        if not isinstance(key, basestring): 
     125            raise TypeError('Expecting %r derived type for key; got %r' %  
     126                            (basestring, type(key)))  
     127        return True  
     128     
     129    @staticmethod 
     130    def valueFilter(value): 
     131        """Enforce ElementTree abstract reader derived types for values 
     132        @param value: attribute value 
     133        @type value:  
     134        ndg.xacml.parsers.etree.attributevaluereader.ETreeDataTypeReaderBase to  
     135        their derived type 
     136        @return: boolean True indicating attribute value is correct type 
     137        @rtype: bool 
     138        @raise TypeError: incorrect input type 
     139        """ 
     140        if not issubclass(value, ETreeDataTypeReaderBase): 
     141            raise TypeError('Expecting %r derived type for value; got %r' %  
     142                            (ETreeDataTypeReaderBase, type(value)))  
     143        return True  
     144     
     145               
     146class DataTypeReaderClassFactory(object): 
     147    """Return class to parse the content of the Attribute value based on the  
     148    DataType setting""" 
     149    MAP = ETreeDataTypeReaderClassMap() 
     150    _id = None 
     151    for _id in AttributeValue.TYPE_URIS: 
     152        MAP[_id] = ETreeDataTypeReaderBase 
     153         
     154    del _id 
     155     
     156    @classmethod 
     157    def addReader(cls, identifier, readerClass): 
     158        cls.MAP[identifier] = readerClass 
     159         
     160    @classmethod 
     161    def getReader(cls, attributeValue): 
     162        return cls.MAP[attributeValue.dataType] 
     163     
Note: See TracChangeset for help on using the changeset viewer.