Changeset 6782 for TI12-security/trunk


Ignore:
Timestamp:
26/03/10 16:34:43 (10 years ago)
Author:
pjkersha
Message:

Fixes to PDP target processing following spec. Started Condition processing

Location:
TI12-security/trunk/NDG_XACML/ndg/xacml
Files:
1 added
1 deleted
5 edited

Legend:

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

    r6780 r6782  
    9494        # INDETERMINATE response from any exceptions raised 
    9595        try: 
    96             log.debug('Checking policy target for match...') 
     96            log.debug('Checking policy target for match with request...') 
    9797             
    9898            if not self.matchTarget(self.policy.target, request): 
     
    102102                result.decision = Decision.NOT_APPLICABLE 
    103103                return response 
     104             
     105            log.debug('Request matches the Policy target') 
    104106             
    105107            # Check rules 
     
    109111                    log.debug('No match to request context for target in rule ' 
    110112                              '%r', rule.id) 
    111                     continue          
     113                    continue    
     114                 
     115                # Apply the condition 
     116                self.appyCondition(rule.condition)       
    112117        except: 
    113118            log.error('Exception raised evaluating request context, returning ' 
     
    139144        # decision request, there MUST be at least one positive match between  
    140145        # each section of the <Target> element and the corresponding section of  
    141         # the <xacml-context:Request> element.        
    142         for i in self.__class__.TARGET_CHILD_ATTRS: 
    143             for targetChild in getattr(target, i): 
    144                 for requestChild in getattr(request, i): 
    145                     if self.matchTargetChild(targetChild, requestChild): 
    146                         return True 
     146        # the <xacml-context:Request> element. 
     147        #  
     148        # Also, 7.6: 
     149        # 
     150        # The target value SHALL be "Match" if the subjects, resources, actions  
     151        # and environments specified in the target all match values in the  
     152        # request context.  
     153        statusValues = [False]*len(self.__class__.TARGET_CHILD_ATTRS)  
     154         
     155        # Iterate for target subjects, resources, actions and environments  
     156        # elements 
     157        for i, status in zip(self.__class__.TARGET_CHILD_ATTRS, statusValues): 
     158            # If any one of the <Target> children is missing then it counts as 
     159            # a match e.g. for <Subjects> child element - Section 5.5: 
     160            # 
     161            # <Subjects> [Optional] Matching specification for the subject  
     162            # attributes in the context. If this element is missing, 
     163            # then the target SHALL match all subjects. 
     164            targetElem = getattr(target, i) 
     165            if len(targetElem) == 0: 
     166                status = True 
     167                continue 
     168             
     169            # Iterate over each for example, subject in the list of subjects or 
     170            # for example, resource in the list of resources and so on 
     171            for targetSubElem in targetElem: 
     172                 
     173                # For the given subject/resource/action/environment check for a 
     174                # match with the equivalent in the request 
     175                requestElem = getattr(request, i)  
     176                for requestSubElem in requestElem: 
     177                    if self.matchTargetChild(targetSubElem, requestSubElem): 
     178                        # Within the list of e.g. subjects if one subject  
     179                        # matches then this counts as a subject match overall  
     180                        # for this target 
     181                        status = True 
    147182  
    148         return False 
     183        # Target matches if all the children (i.e. subjects, resources, actions 
     184        # and environment sections) have at least one match.  Otherwise it  
     185        # doesn't count as a match 
     186        return all(statusValues) 
    149187     
    150188    def matchTargetChild(self, targetChild, requestChild): 
     
    164202        this exception will be raised. 
    165203        """ 
     204        matchStatus = True 
     205         
    166206        if targetChild is None: 
    167207            # Default if target child is not set is to match all children 
    168208            return True 
    169209         
     210         
     211        # Section 7.6 
     212        # 
     213        # A subject, resource, action or environment SHALL match a value in the 
     214        # request context if the value of all its <SubjectMatch>,  
     215        # <ResourceMatch>, <ActionMatch> or <EnvironmentMatch> elements,  
     216        # respectively, are “True”. 
    170217        for childMatch in targetChild.matches: 
    171218            # Get the match function from the Match ID 
     
    187234                dataType = childMatch.attributeDesignator.dataType 
    188235                 
     236                # Issuer is an optional match - see core spec 7.2.4 
     237                issuer = childMatch.attributeDesignator.issuer 
     238                if issuer is not None: 
     239                    # Issuer found - set lambda to match this against the  
     240                    # issuer setting in the request 
     241                    _issuerMatch = lambda requestChildIssuer: (issuer ==  
     242                                                            requestChildIssuer) 
     243                else: 
     244                    # No issuer set - lambda returns True regardless 
     245                    _issuerMatch = lambda requestChildIssuer: True 
     246                     
     247                     
    189248                _attributeMatch = lambda requestChildAttribute: ( 
    190249                    matchFunc.evaluate(matchAttributeValue,  
    191250                              requestChildAttribute.attributeValue.value) and 
    192251                    requestChildAttribute.attributeId == attributeId and 
    193                     requestChildAttribute.dataType == dataType  
     252                    requestChildAttribute.dataType == dataType and 
     253                    _issuerMatch(requestChildAttribute.issuer) 
    194254                ) 
    195255                 
     
    208268                 
    209269            for attribute in requestChild.attributes: 
    210                 if _attributeMatch(attribute): 
    211                     return True 
    212                      
    213         return False 
    214  
     270                if _attributeMatch(attribute) == True: 
     271                    if log.getEffectiveLevel() <= logging.DEBUG: 
     272                        log.debug('Request attribute %r set to %r matches ' 
     273                                  'target', 
     274                                  attribute.attributeId, 
     275                                  attribute.attributeValue.value) 
     276                         
     277                    # Default status is True - any *Match element NOT matching 
     278                    # will result in an overall status of no match 
     279                else:         
     280                    # Don't return here but set the status to False.  The other 
     281                    # attributes need to be checked in case an error occurs. 
     282                    # In this case the top-level PDP exception handling block 
     283                    # will catch it and set an overall decision of INDETERMINATE 
     284                    matchStatus = False 
     285                     
     286        return matchStatus 
     287 
     288    def applyCondition(self, condition): 
     289        """Apply a rule condition""" 
     290         
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/string_equal.py

    r6777 r6782  
    44""" 
    55__author__ = "P J Kershaw" 
    6 __date__ = "02/04/09" 
     6__date__ = "26/03/10" 
    77__copyright__ = "" 
    88__license__ = "BSD - see LICENSE file in top-level directory" 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v2/anyuri_regexp_match.py

    r6777 r6782  
    44""" 
    55__author__ = "P J Kershaw" 
    6 __date__ = "02/04/09" 
     6__date__ = "26/03/10" 
    77__copyright__ = "" 
    88__license__ = "BSD - see LICENSE file in top-level directory" 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/test/ndg1.xml

    r6777 r6782  
    1818                <ResourceMatch MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match"> 
    1919                    <ResourceAttributeDesignator 
    20                         AttributeId="urn:siteA:security:authz:1.0:attr:resourceURI" 
     20                        AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" 
    2121                        DataType="http://www.w3.org/2001/XMLSchema#anyURI"/> 
    2222                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI"> 
    23                         ^/.*$ 
     23                        ^http://www.localhost/.*$ 
    2424                    </AttributeValue> 
    2525                </ResourceMatch> 
     
    4545                <Resource> 
    4646                    <!-- Pattern match the request URI --> 
    47                     <ResourceMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:regexp-string-match"> 
     47                    <ResourceMatch MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match"> 
    4848                        <ResourceAttributeDesignator 
    49                             AttributeId="urn:siteA:security:authz:1.0:attr:resourceURI" 
     49                            AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" 
    5050                            DataType="http://www.w3.org/2001/XMLSchema#string"/> 
    51                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string"> 
    52                             ^/test_securedURI.*$ 
     51                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI"> 
     52                            ^http://localhost/test_securedURI.*$ 
    5353                        </AttributeValue> 
    5454                    </ResourceMatch> 
     
    7070                    AttributeId="urn:siteA:security:authz:1.0:attr"  
    7171                    MustBePresent="false"  
    72                     DataType="http://www.w3.org/2001/XMLSchema#string"/> 
     72                    DataType="http://www.w3.org/2001/XMLSchema#string" 
     73                    Issuer="https://localhost:7443/AttributeAuthority"/> 
    7374                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag"> 
    7475                    <!--  
     
    7778                        from the applicable issuing attribute authority 
    7879                    --> 
    79                     <AttributeValue 
    80                         DataType="urn:ndg:security:1.0:authz:attributeType"> 
    81                         <name DataType="http://www.w3.org/2001/XMLSchema#string"> 
    82                             urn:siteA:security:authz:1.0:attr:staff 
    83                         </name> 
    84                         <issuer DataType="http://www.w3.org/2001/XMLSchema#string"> 
    85                             http://localhost:7443/AttributeAuthority 
    86                         </issuer> 
     80                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string"> 
     81                        urn:siteA:security:authz:1.0:attr:staff 
    8782                    </AttributeValue> 
    8883                </Apply> 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/test/test_context.py

    r6780 r6782  
    8282        resourceAttribute.attributeValue = AttributeValue() 
    8383        resourceAttribute.attributeValue.value = \ 
    84                             'file://example/med/record/patient/BartSimpson' 
     84                                        'http://www.localhost/test_securedURI' 
    8585 
    8686        request.resources.append(resource) 
Note: See TracChangeset for help on using the changeset viewer.