Ignore:
Timestamp:
16/04/10 15:15:05 (10 years ago)
Author:
pjkersha
Message:

Moved PDP evaluate content into Policy.evaluate

File:
1 edited

Legend:

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

    r6823 r6825  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
     12import traceback 
     13import logging 
     14log = logging.getLogger(__name__) 
     15 
    1216from ndg.xacml.utils import TypedList 
    1317from ndg.xacml.parsers import AbstractReaderFactory, AbstractReader 
     
    2125from ndg.xacml.core.exceptions import (UnsupportedStdFunctionError, 
    2226                                       UnsupportedFunctionError) 
     27 
     28# Evaluation of a request context 
     29from ndg.xacml.core.context.response import Response 
     30from ndg.xacml.core.context.result import Result, Decision, StatusCode 
     31from ndg.xacml.core.context.exceptions import XacmlContextError 
    2332 
    2433 
     
    252261                              "Policy PolicyDefaults element")    
    253262 
    254  
     263    def evaluate(self, request): 
     264        """Make an access control decision for the given request based on this 
     265        policy 
     266         
     267        @param request: XACML request context 
     268        @type request: ndg.xacml.core.context.request.Request 
     269        @return: XACML response instance 
     270        @rtype: ndg.xacml.core.context.response.Response 
     271        """ 
     272        response = Response() 
     273        result = Result.createInitialised(decision=Decision.NOT_APPLICABLE) 
     274        response.results.append(result) 
     275             
     276        # Exception block around all rule processing in order to set 
     277        # INDETERMINATE response from any exceptions raised 
     278        try: 
     279            log.debug('Checking policy %r target for match with request...', 
     280                      self.policyId) 
     281             
     282            target = self.target 
     283             
     284            # If no target is set, ALL requests are counted as matches 
     285            if target is not None: 
     286                if not target.match(request): 
     287                    # The target didn't match so the whole policy does not apply 
     288                    # to this request 
     289                    log.debug('No match for policy target setting %r decision', 
     290                              Decision.NOT_APPLICABLE_STR) 
     291                     
     292                    result.decision = Decision.NOT_APPLICABLE 
     293                    return response 
     294             
     295            log.debug('Request matches the Policy %r target', self.policyId) 
     296             
     297            # Apply the rule combining algorithm here combining the  
     298            # effects from the rules evaluated into an overall decision 
     299            result.decision = self.ruleCombiningAlg.evaluate(self.rules, 
     300                                                             request) 
     301        except XacmlContextError, e: 
     302            log.error('Exception raised evaluating request context, returning ' 
     303                      '%r decision:%s',  
     304                      e.response.results[0].decision,  
     305                      traceback.format_exc()) 
     306             
     307            result = e.response.results[0] 
     308             
     309        except Exception: 
     310            # Catch all so that nothing is handled from within the scope of this 
     311            # method 
     312            log.error('No PDPError type exception raised evaluating request ' 
     313                      'context, returning %r decision:%s',  
     314                      Decision.INDETERMINATE_STR,  
     315                      traceback.format_exc())  
     316                        
     317            result.decision = Decision.INDETERMINATE 
     318            result.status.statusCode.value = StatusCode.PROCESSING_ERROR 
     319             
     320        return response 
     321 
Note: See TracChangeset for help on using the changeset viewer.