Ignore:
Timestamp:
24/11/09 14:14:53 (10 years ago)
Author:
pjkersha
Message:

Unit tested MSI PDP with per attribute entry attribute authority addresses.

File:
1 edited

Legend:

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

    r6033 r6043  
    522522 
    523523 
     524class PIPBase(object): 
     525    """Policy Information Point base class.  PIP enables PDP to get user  
     526    attribute information in order to make access control decisions  
     527    """ 
     528    def __init__(self, prefix='', **cfg): 
     529        '''Initialise settings for connection to an Attribute Authority''' 
     530        raise NotImplementedError(PIPBase.__init__.__doc__) 
     531     
     532    def attributeQuery(self, attributeQuery): 
     533        """Query the Attribute Authority specified in the request to retrieve 
     534        the attributes if any corresponding to the subject 
     535         
     536        @type attributeResponse: PIPAttributeQuery 
     537        @param attributeResponse:  
     538        @rtype: PIPAttributeResponse 
     539        @return: response containing the attributes retrieved from the 
     540        Attribute Authority""" 
     541        raise NotImplementedError(PIPBase.attributeQuery.__doc__) 
     542     
     543 
    524544from ndg.security.common.wssecurity import WSSecurityConfig 
    525545 
    526  
    527 class PIP(object): 
     546class NdgPIP(PIPBase): 
    528547    """Policy Information Point - this implementation enables the PDP to  
    529548    retrieve attributes about the Subject""" 
     
    541560        ''' 
    542561        self.wssecurityCfg = WSSecurityConfig() 
    543         wssePrefix = prefix + PIP.wsseSectionName 
     562        wssePrefix = prefix + NdgPIP.wsseSectionName 
    544563        self.wssecurityCfg.update(cfg, prefix=wssePrefix) 
    545564                  
     
    551570        # Attribute Certificates retrieved 
    552571        self.caCertFilePathList = cfg.get(prefix + 'caCertFilePathList', []) 
    553  
    554572 
    555573    def attributeQuery(self, attributeQuery): 
     
    636654         
    637655        return attrCert 
    638      
    639656             
    640657    def _getAttributeCertificateFromSessionManager(self, 
     
    668685            log.error("Creating Session Manager client: %s" % e) 
    669686            raise InitSessionCtxError() 
    670          
    671           
     687              
    672688        try: 
    673689            # Make request for attribute certificate 
     
    703719                       e.__class__, e)) 
    704720            raise AttributeCertificateRequestError() 
    705  
    706721             
    707722    def _getAttributeCertificateFromAttributeAuthority(self, 
     
    752767                      e.__class__, e) 
    753768            raise AttributeCertificateRequestError() 
    754   
    755             
     769         
     770# Backwards compatibility 
     771PIP = NdgPIP 
     772 
     773           
    756774class PDP(object): 
    757775    """Policy Decision Point""" 
     
    763781 
    764782    def _getPolicy(self): 
    765         if self._policy is None: 
     783        if self.__policy is None: 
    766784            raise TypeError("Policy object has not been initialised") 
    767         return self._policy 
     785        return self.__policy 
    768786     
    769787    def _setPolicy(self, policy): 
     
    771789            raise TypeError("Expecting %s or None type for PDP policy; got %r"% 
    772790                            (Policy.__class__.__name__, policy)) 
    773         self._policy = policy 
     791        self.__policy = policy 
    774792 
    775793    policy = property(fget=_getPolicy, 
     
    779797 
    780798    def _getPIP(self): 
    781         if self._pip is None: 
     799        if self.__pip is None: 
    782800            raise TypeError("PIP object has not been initialised") 
    783801         
    784         return self._pip 
     802        return self.__pip 
    785803     
    786804    def _setPIP(self, pip): 
    787         if not isinstance(pip, (PIP, None.__class__)): 
     805        if not isinstance(pip, (PIPBase, None.__class__)): 
    788806            raise TypeError("Expecting %s or None type for PDP PIP; got %r"% 
    789                             (PIP.__class__.__name__, pip)) 
    790         self._pip = pip 
     807                            (PIPBase.__class__.__name__, pip)) 
     808        self.__pip = pip 
    791809 
    792810    pip = property(fget=_getPIP, 
     
    816834        status = [] 
    817835         
     836        # Make a query object for querying the Policy Information Point 
     837        attributeQuery = PIPAttributeQuery() 
     838        attributeQuery[PIPAttributeQuery.SUBJECT_NS] = request.subject 
     839         
     840        # Keep a cache of queried Attribute Authorities to avoid calling them  
     841        # multiple times 
     842        queriedAttributeAuthorityURIs = [] 
     843         
     844        # Iterate through the targets gathering user attributes from the 
     845        # relevant attribute authorities 
    818846        for matchingTarget in matchingTargets: 
    819847             
    820848            # Make call to the Policy Information Point to pull user 
    821             # attributes applicable to this resource 
    822             attributeQuery = PIPAttributeQuery() 
    823             attributeQuery[PIPAttributeQuery.SUBJECT_NS] = request.subject 
    824              
    825             attributeQuery[PIPAttributeQuery.ATTRIBUTEAUTHORITY_NS] = \ 
    826                                     matchingTarget.attributeAuthorityURI 
    827              
    828             # Exit from function returning indeterminate status if a  
    829             # problem occurs here 
    830             try: 
    831                 attributeResponse = self.pip.attributeQuery(attributeQuery) 
    832                  
    833             except SubjectRetrievalError, e: 
    834                 # i.e. a defined exception within the scope of this 
    835                 # module 
    836                 log.exception(e) 
    837                 return Response(Response.DECISION_INDETERMINATE, 
    838                                 message=str(e)) 
    839                  
    840             except Exception, e: 
    841                 log.exception(e) 
    842                 return Response(Response.DECISION_INDETERMINATE, 
    843                                 message="An internal error occurred") 
    844                              
    845             # Accumulate attributes retrieved from multiple attribute 
    846             # authorities 
    847             request.subject[Subject.ROLES_NS] += attributeResponse[ 
    848                                                         Subject.ROLES_NS] 
     849            # attributes applicable to this resource  
     850            for attribute in matchingTarget.attributes: 
     851                if (attribute.attributeAuthorityURI in  
     852                    queriedAttributeAuthorityURIs):  
     853                    continue 
     854                           
     855                attributeQuery[PIPAttributeQuery.ATTRIBUTEAUTHORITY_NS] = \ 
     856                                        attribute.attributeAuthorityURI 
     857             
     858                # Exit from function returning indeterminate status if a  
     859                # problem occurs here 
     860                try: 
     861                    attributeResponse = self.pip.attributeQuery(attributeQuery) 
     862                     
     863                except SubjectRetrievalError, e: 
     864                    # i.e. a defined exception within the scope of this 
     865                    # module 
     866                    log.exception(e) 
     867                    return Response(Response.DECISION_INDETERMINATE,  
     868                                    message=str(e)) 
     869                                 
     870                except Exception, e: 
     871                    log.exception(e) 
     872                    return Response(Response.DECISION_INDETERMINATE, 
     873                                    message="An internal error occurred") 
     874                                 
     875                # Accumulate attributes retrieved from multiple attribute 
     876                # authorities 
     877                request.subject[Subject.ROLES_NS] += attributeResponse[ 
     878                                                            Subject.ROLES_NS] 
    849879                
    850880            # Match the subject's attributes against the target 
     
    869899         
    870900    @staticmethod 
    871     def _match(resourceAttr, subjectRoleAttr): 
     901    def _match(resourceAttr, subjectAttr): 
    872902        """Helper method to iterate over user and resource attributes 
    873903        If one at least one match is found, a permit response is returned 
    874904        """ 
    875905        for attr in resourceAttr: 
    876             if attr in subjectRoleAttr: 
     906            if attr.name in subjectAttr: 
    877907                return Response.DECISION_PERMIT 
    878908             
Note: See TracChangeset for help on using the changeset viewer.