Changeset 5092


Ignore:
Timestamp:
11/03/09 16:04:44 (11 years ago)
Author:
pjkersha
Message:

Moved from pdp package and added new functionality

File:
1 copied

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/authz/xacml.py

    r5087 r5092  
    1515 
    1616from ndg.security.common.authz.pdp import PDPInterface 
    17          
    18 class Subject(object): 
     17 
     18class XacmlBase(object): 
     19    pass 
     20 
     21class Subject(XacmlBase): 
    1922    '''XACML Subject designator''' 
    2023 
    21 class Resource(object): 
     24class Resource(XacmlBase): 
    2225    '''XACML Resource designator''' 
    2326 
    24 class Action(object): 
     27class Action(XacmlBase): 
    2528    '''XACML Action designator''' 
    2629 
    27 class Environment(object): 
     30class Environment(XacmlBase): 
    2831    '''XACML Environment designator''' 
    2932 
    30 class Policy(object): 
    31     def __init__(self): 
    32         self.description = None 
    33         self.rules = [] 
    34         self.algID = None 
     33class PolicySet(XacmlBase): 
     34    def __init__(self): 
     35        self.policies = [] 
     36        self.combiningAlg = None 
     37         
     38class Policy(XacmlBase): 
     39 
     40    def __init__(self, 
     41                 id, 
     42                 combiningAlg, 
     43                 description, 
     44                 target, 
     45                 ruleList): 
     46        self.id = id 
     47        self.description = description 
     48        self.ruleList = ruleList 
     49        self.combiningAlg = combiningAlg 
    3550        self.obligations = [] 
    36         self.target = None 
     51        self.target = target 
    3752 
    3853    def encode(self): 
     
    4055        raise NotImplemented() 
    4156     
    42 class Target(object): 
    43     def __init__(self): 
    44         self.subject = Subject() 
    45         self.resource = Resource() 
    46         self.action = Action() 
    47  
    48     
    49 class Effect(object): 
     57class Target(XacmlBase): 
     58    '''The target selects policies relevant to a request''' 
     59 
     60    def __init__(self): 
     61        self.subjects = [] 
     62        self.resources = [] 
     63        self.actions = [] 
     64        self.rules = [] 
     65 
     66class AttributeDesignator(XacmlBase): 
     67    ACTION_TARGET, ENVIRONMENT_TARGET, RESOURCE_TARGET, SUBJECT_TARGET=range(4) 
     68 
     69    def __init__(self, target, type, id, mustBePresent=False, issuer=None): 
     70        self.target = target 
     71        self.type = type 
     72        self.id = id 
     73        self.mustBePresent = mustBePresent 
     74        self.issuer = issuer 
     75 
     76 
     77class TargetMatch(XacmlBase): 
     78    SUBJECT, RESOURCE, ACTION = range(3) 
     79     
     80    def __init__(self, 
     81                 type, 
     82                 function, 
     83                 eval, 
     84                 attributeValue): 
     85        pass 
     86class FunctionBase(XacmlBase): 
     87    def __init__(self, id): 
     88        id = None 
     89        returnType = None 
     90        returnsBag = False 
     91         
     92    def checkInputs(self, inputs): 
     93        '''Checks that the given inputs are of the right types, in the right  
     94        order, and are the right number for this function to evaluate.''' 
     95        raise NotImplementedError() 
     96           
     97    def checkInputsNoBag(self, inputs): 
     98        '''Checks that the given inputs are of the right types, in the right  
     99        order, and are the right number for this function to evaluate.''' 
     100        raise NotImplementedError() 
     101  
     102    def evaluate(self, inputs, context): 
     103        '''Evaluates the Function using the given inputs.''' 
     104        raise NotImplementedError() 
     105 
     106class MatchFunction(FunctionBase): 
     107    NAME_REGEXP_STRING_MATCH = \ 
     108        "urn:oasis:names:tc:xacml:1.0:function:regexp-string-match" 
     109    NAME_RFC822NAME_MATCH = \ 
     110        "urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match" 
     111    NAME_X500NAME_MATCH = \ 
     112        "urn:oasis:names:tc:xacml:1.0:function:x500Name-match"      
     113 
     114    supportedIdentifiers = (NAME_REGEXP_STRING_MATCH,  
     115                            NAME_RFC822NAME_MATCH, 
     116                            NAME_X500NAME_MATCH) 
     117     
     118    lut = { 
     119        NAME_REGEXP_STRING_MATCH: 'regexpStringMatch', 
     120        NAME_RFC822NAME_MATCH: 'rfc822NameMatch', 
     121        NAME_X500NAME_MATCH: 'x500NameMatch' 
     122    } 
     123    def __init__(self, functionName): 
     124        self.functionName = functionName 
     125         
     126    def _setFunctionName(self, functionName): 
     127        if functionName not in MatchFunction.supportedIdentifiers: 
     128            matchFunctionList = ', '.join(MatchFunction.matchFunctionNames) 
     129            raise TypeError("Function name [%s] is not on of the recognised " 
     130                            "types: %s" % (functionName, matchFunctionList)) 
     131        self._functionName = functionName 
     132         
     133    def _getFunctionName(self): 
     134        return self._functionName 
     135     
     136    functionName = property(fset=_setFunctionName, 
     137                            fget=_getFunctionName) 
     138 
     139    def regexpStringMatch(self, regex, val): 
     140        return re.match(regex, val) is not None 
     141     
     142    def rfc822NameMatch(self, *inputs): 
     143        raise NotImplementedError() 
     144     
     145    def x500NameMatch(self, *inputs): 
     146        raise NotImplementedError() 
     147     
     148    def evaluate(self, inputs, context): 
     149        matchFunction = getattr(self, MatchFunction.lut[self.functionName]) 
     150        match = matchFunction(self, *inputs) 
     151        if match: 
     152            return EvaluationResult(status=Status.STATUS_OK) 
     153         
     154class Status(XacmlBase): 
     155    STATUS_MISSING_ATTRIBUTE = \ 
     156        "urn:oasis:names:tc:xacml:1.0:status:missing-attribute" 
     157    STATUS_OK = "urn:oasis:names:tc:xacml:1.0:status:ok" 
     158    STATUS_PROCESSING_ERROR = \ 
     159        "urn:oasis:names:tc:xacml:1.0:status:processing-error" 
     160    STATUS_SYNTAX_ERROR = \ 
     161        "urn:oasis:names:tc:xacml:1.0:status:syntax-error"   
     162      
     163class EvaluationResult(XacmlBase): 
     164    def __init__(self,  
     165                 attributeValue=None,  
     166                 status=None,  
     167                 indeterminate=False): 
     168        self.status = status 
     169        self.attributeValue = attributeValue 
     170        self.indeterminate = indeterminate 
     171             
     172class Effect(XacmlBase): 
    50173    def __str__(self): 
    51174        raise NotImplementedError() 
     
    59182        return 'permit' 
    60183 
    61 class Rule(object): 
     184class Rule(XacmlBase): 
    62185    '''Consists of a condition, an effect, and a target. 
    63186    ''' 
     
    77200         
    78201        
    79 class Request(object): 
    80     '''XACML Request object 
     202class Request(XacmlBase): 
     203    '''XACML Request XacmlBase 
    81204     
    82205    TODO: refactor from this initial placeholder''' 
     
    86209        self.action = Action() 
    87210        self.environment = Environment() 
    88          
     211  
     212class PEP(XacmlBase): 
     213    pass 
     214        
    89215class PDP(PDPInterface): 
    90216    '''Modify PDPInterface to use the four XACML request designators: subject, 
     
    95221        pass 
    96222     
    97     def accessPermitted(self, subject, resource, action, environment): 
     223    def accessPermitted(self, request): 
    98224        '''Make access control decision - override this in a derived class to 
    99225        implement the decision logic but this method may be called within 
     
    124250        # Default to denied 
    125251        return False 
     252 
     253 
     254class RuleCombiningAlg(XacmlBase): 
     255    id = None 
     256 
     257class DenyOverrides(RuleCombiningAlg): 
     258   '''Deny-overrides: If any rule evaluates to Deny, then the final  
     259   authorization decision is also Deny.''' 
     260   id = 'Deny-overrides' 
     261    
     262class OrderedDenyOverrides(RuleCombiningAlg): 
     263    '''Ordered-deny-overrides: Same as deny-overrides, except the order in  
     264    which relevant rules are evaluated is the same as the order in which they  
     265    are added in the policy.''' 
     266    id = 'Ordered-deny-overrides' 
     267     
     268class PermitOverrides(RuleCombiningAlg): 
     269    '''Permit-overrides: If any rule evaluates to Permit, then the final  
     270    authorization decision is also Permit.''' 
     271     
     272class OrderedPermitOverrides(RuleCombiningAlg): 
     273    '''Ordered-permit-overrides: Same as permit-overrides, except the order in 
     274    which relevant rules are evaluated is the same as the order in which they  
     275    are added in the policy.''' 
     276    id = 'Ordered-permit-overrides' 
     277     
     278class FirstApplicable(RuleCombiningAlg): 
     279    '''First-applicable: The result of the first relevant rule encountered is  
     280    the final authorization decision as well.''' 
     281    id = 'First-applicable' 
Note: See TracChangeset for help on using the changeset viewer.