Ignore:
Timestamp:
14/05/09 11:51:21 (11 years ago)
Author:
pjkersha
Message:
  • Important fixes to PDP.evaluate to ensure all targets yield permit status for an access control decision.
  • additional debug info for WSGI middleware
  • new OpenID Provider AXInterfaceReloginRequired - allows for case where a session is stale
  • ndg.security.test.unit - put unit tests in this package in parallel to the existing integration test package.
File:
1 edited

Legend:

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

    r5280 r5285  
    314314         
    315315        sessionId = subject[Subject.SESSIONID_NS] 
     316         
     317        log.debug("PIP: received attribute query: %r", attributeQuery) 
     318         
    316319        attributeCertificate = self._getAttributeCertificate( 
    317320                                        attributeAuthorityURI, 
     
    395398        ''' 
    396399         
     400        log.debug("PIP._getAttributeCertificateFromSessionManager ...") 
     401         
    397402        try: 
    398403            # Create Session Manager client - if a file path was set, setting 
     
    444449             
    445450    def _getAttributeCertificateFromAttributeAuthority(self, 
    446                                                    attributeAuthorityURI, 
    447                                                    username): 
     451                                                       attributeAuthorityURI, 
     452                                                       username): 
    448453        '''Retrieve an Attribute Certificate direct from an Attribute 
    449454        Authority.  This method is invoked if no session ID or Session  
     
    458463        ''' 
    459464         
     465        log.debug("PIP._getAttributeCertificateFromAttributeAuthority ...") 
     466        
    460467        try: 
    461468            # Create Attribute Authority client - if a file path was set,  
     
    506513        matchingTargets = [target for target in self.policy.targets  
    507514                           if target.regEx.match(resourceURI) is not None] 
    508          
     515        numMatchingTargets = len(matchingTargets) 
     516        if numMatchingTargets == 0: 
     517            log.debug("PDP.evaluate: granting access - no targets matched " 
     518                      "the resource URI path [%s]",  
     519                      resourceURI) 
     520            return Response(status=Response.DECISION_PERMIT) 
     521         
     522        # Iterate through matching targets checking for user access 
    509523        knownAttributeAuthorityURIs = [] 
    510524        request.subject[Subject.ROLES_NS] = [] 
     525        permitForAllTargets = [Response.DECISION_PERMIT]*numMatchingTargets 
     526         
     527        # Keep a look-up of the decisions for each target 
     528        status = [] 
     529         
    511530        for matchingTarget in matchingTargets: 
    512531             
     
    522541                                        matchingTarget.attributeAuthorityURI 
    523542                 
     543                # Exit from function returning indeterminate status if a  
     544                # problem occurs here 
    524545                try: 
    525546                    attributeResponse=self.pip.attributeQuery(attributeQuery) 
    526547                     
    527548                except SubjectRetrievalError, e: 
     549                    # i.e. a defined exception within the scope of this 
     550                    # module 
    528551                    log.exception(e) 
    529552                    return Response(Response.DECISION_INDETERMINATE, 
     
    538561                                        matchingTarget.attributeAuthorityURI) 
    539562                 
     563                # Accumulate attributes retrieved from multiple attribute 
     564                # authorities 
    540565                request.subject[Subject.ROLES_NS] += attributeResponse[ 
    541566                                                            Subject.ROLES_NS] 
    542567                
    543         # Match the subject's attributes against the target 
    544         for attr in matchingTarget.attributes: 
    545             if attr in request.subject[Subject.ROLES_NS]: 
    546                 return Response(Response.DECISION_PERMIT) 
    547              
    548         return Response(Response.DECISION_DENY, 
    549                         message="Insufficient privileges to access the " 
    550                                 "resource") 
    551      
    552  
    553          
     568            # Match the subject's attributes against the target 
     569            # One of any rule - at least one of the subject's attributes 
     570            # must match one of the attributes restricting access to the 
     571            # resource. 
     572            status.append(PDP._match(matchingTarget.attributes,  
     573                                     request.subject[Subject.ROLES_NS])) 
     574             
     575        # All targets must yield permit status for access to be granted 
     576        if status == permitForAllTargets: 
     577            return Response(Response.DECISION_PERMIT) 
     578        else:     
     579            return Response(Response.DECISION_DENY, 
     580                            message="Insufficient privileges to access the " 
     581                                    "resource") 
     582         
     583    @staticmethod 
     584    def _match(resourceAttr, subjectRoleAttr): 
     585        """Helper method to iterate over user and resource attributes 
     586        If one at least one match is found, a permit response is returned 
     587        """ 
     588        for attr in resourceAttr: 
     589            if attr in subjectRoleAttr: 
     590                return Response.DECISION_PERMIT 
     591             
     592        return Response.DECISION_DENY 
     593 
     594         
Note: See TracChangeset for help on using the changeset viewer.