Ignore:
Timestamp:
26/03/10 14:09:05 (10 years ago)
Author:
pjkersha
Message:

Added matching functions component.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/context/pdp.py

    r6776 r6777  
    2020from ndg.xacml.core.context.response import Response 
    2121from ndg.xacml.core.context.result import Result, Decision 
     22from ndg.xacml.core.functions import FunctionMap 
    2223from ndg.xacml.parsers import AbstractReader 
    2324                             
     
    3940        if policy is not None: 
    4041            self.policy = policy 
     42             
     43        self.matchFunc = FunctionMap.withLoadedMap() 
     44 
    4145         
    4246    @classmethod 
    43     def fromPolicy(cls, source, reader): 
     47    def fromPolicySource(cls, source, readerFactory): 
    4448        """Create a new PDP instance with a given policy 
    4549        @param source: source for policy 
    4650        @type source: type (dependent on the reader set, it could be for example 
    4751        a file path string, file object, XML element instance) 
    48         @param reader: the reader instance to use to read this policy 
    49         @type reader: ndg.xacml.parsers.AbstractReader derived type 
    50         """ 
    51         if not isinstance(reader, AbstractReader): 
    52             raise TypeError('Expecting %r derived type for "reader" input; got ' 
    53                             '%r instead' % (AbstractReader, type(reader))) 
    54              
     52        @param readerFactory: reader factory returns the reader to use to read  
     53        this policy 
     54        @type readerFactory: ndg.xacml.parsers.AbstractReader derived type 
     55        """            
    5556        pdp = cls() 
    56         pdp.policy = reader.parse(source) 
     57        pdp.policy = Policy.fromSource(source, readerFactory) 
    5758        return pdp 
    5859     
     
    7980        @rtype: ndg.xacml.core.context.response.Response 
    8081        """ 
    81         response = Response 
     82        response = Response() 
    8283        result = Result() 
    8384        response.results.append(result) 
     
    9697             
    9798            if not self.matchTarget(self.policy.target, request): 
    98                 log.debug('No match for policy target setting Decision=%r', 
     99                log.debug('No match for policy target setting Decision=%s', 
    99100                          Decision.NOT_APPLICABLE_STR) 
    100101                 
     
    111112        except: 
    112113            log.error('Exception raised evaluating request context, returning ' 
    113                       'Decision=%r:%s',  
     114                      'Decision=%s:%s',  
    114115                      Decision.INDETERMINATE_STR,  
    115116                      traceback.format_exc()) 
     
    147148        return False 
    148149     
    149     @classmethod 
    150     def matchTargetChild(cls, targetChild, requestChild): 
     150    def matchTargetChild(self, targetChild, requestChild): 
    151151        """Match a child (Subject, Resource, Action or Environment) from the  
    152152        request context with a given target's child 
     
    169169         
    170170        for childMatch in targetChild.matches: 
    171             attributeValue = childMatch.attributeValue 
     171            # Get the match function from the Match ID 
     172            matchFunc = self.matchFunc.get(childMatch.matchId) 
     173            if matchFunc is NotImplemented: 
     174                raise NotImplementedError('No match function implemented for ' 
     175                                          'MatchId="%s"' % childMatch.matchId) 
     176                 
     177            if matchFunc is None: 
     178                raise Exception('Match function namespace %r is not recognised'  
     179                                % childMatch.matchId) 
     180                 
     181            matchAttributeValue = childMatch.attributeValue.value 
    172182             
    173183            # Create a match function based on the presence or absence of an 
     
    178188                 
    179189                _attributeMatch = lambda requestChildAttribute: ( 
    180                     requestChildAttribute.attributeValue == attributeValue and 
     190                    matchFunc(matchAttributeValue,  
     191                              requestChildAttribute.attributeValue.value) and 
    181192                    requestChildAttribute.attributeId == attributeId and 
    182193                    requestChildAttribute.dataType == dataType  
     
    192203            else: 
    193204                _attributeMatch = lambda requestChildAttribute: ( 
    194                     requestChildAttribute.attributeValue == attributeValue 
     205                    matchFunc(matchAttributeValue,  
     206                              requestChildAttribute.attributeValue.value) 
    195207                ) 
    196208                 
Note: See TracChangeset for help on using the changeset viewer.