Ignore:
Timestamp:
08/04/09 12:36:14 (11 years ago)
Author:
pjkersha
Message:

Working Policy Decision Point:

  • A PIP (Policy Information Point) helps the PDP by retrieving user attributes for a given Attribute Authority.
  • TODO: Session Manager calls are made over SOAP to the users session running at their home institution. This has some caching capability to avoid repeated calls to the user's Session Manager but it could host it's own Session Manager instance for improved performance
  • ndg.security.server.sessionmanager: improved UserSession? to include a timestamp on creation and timeout check via isValid() method. Added auditSessions() method to enable expired sessions to be weeded out. Changed _createUserSession to public method createUserSession. This is useful where a session needs to be created for a user who has already been authenticated.
  • ndg.security.test.config.attributeauthority: changed test attributes to urn's to namespace them.
Location:
TI12-security/trunk/python/ndg.security.common/ndg/security/common
Files:
5 edited

Legend:

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

    r5181 r5182  
    3939    """Exception handling for NDG Attribute Certificate class.""" 
    4040 
     41class AttCertInvalidSignature(AttCertError): 
     42    """Error with certificate signature""" 
     43     
    4144class AttCertNotBeforeTimeError(AttCertError): 
    4245    """Current time is before the Attribute Certificate's not before time""" 
     
    10761079        if chkProvenance and not self.isValidProvenance(): 
    10771080            if raiseExcep: 
    1078                 raise AttCertError( 
    1079                     "Attribute Certificate Provenance must be set to \"" 
    1080                     "\" or \"".join(AttCert.__validProvenanceSettings) + "\"") 
     1081                raise AttCertError('Attribute Certificate Provenance must be ' 
     1082                                   'set to "%s"' % "\" or \"".join( 
     1083                                            AttCert.__validProvenanceSettings)) 
    10811084            return False 
    10821085 
     
    10891092            except InvalidSignature, e: 
    10901093                 if raiseExcep: 
    1091                      raise AttCertError(e) 
     1094                     raise AttCertInvalidSignature(e) 
    10921095                 else: 
    10931096                     return False 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/authz/msi.py

    r5181 r5182  
    1717# For parsing: ElementTree helpers  
    1818getNs = lambda elem: elem.tag.split('}')[0][1:] 
    19 getLocalName = lambda elem: elem.tag.rsplit('}',1)[-1] 
     19getLocalName = lambda elem: elem.tag.rsplit('}', 1)[ - 1] 
    2020 
    2121class PolicyParseError(Exception): 
     
    4343                 
    4444            else: 
    45                 raise PolicyParseError("Invalid policy attribute: %s" % 
     45                raise PolicyParseError("Invalid policy attribute: %s" %  
    4646                                        localName) 
    4747                 
     
    7979                self.attributeAuthorityURI = elem[0].text.strip() 
    8080            else: 
    81                 raise ResourceParseError("Invalid resource attribute: %s" % 
     81                raise ResourceParseError("Invalid resource attribute: %s" %  
    8282                                         localName) 
    8383     
     
    114114                if key not in self.__class__.namespaces: 
    115115                    raise KeyError('Namespace "%s" not recognised.  Valid ' 
    116                                    'namespaces are: %s' % 
     116                                   'namespaces are: %s' %  
    117117                                   self.__class__.namespaces) 
    118118         
     
    177177        SubjectRetrievalError.__init__(self, msg or  
    178178                                       InvalidAttributeCertificate.__doc__) 
    179          
     179 
     180class AttributeCertificateInvalidSignature(SubjectRetrievalError): 
     181    ("There is a problem with the signature of the certificate containing " 
     182     "authorisation roles") 
     183    def __init__(self, msg=None): 
     184        SubjectRetrievalError.__init__(self, msg or  
     185                                AttributeCertificateInvalidSignature.__doc__) 
     186               
    180187class AttributeCertificateNotBeforeTimeError(SubjectRetrievalError): 
    181188    ("There is a time issuing error with certificate containing authorisation " 
     
    217224    'A problem occurred requesting a certificate containing authorisation roles' 
    218225    def __init__(self, msg=None): 
    219         SubjectRetrievalError.__init__(self,msg or  
     226        SubjectRetrievalError.__init__(self, msg or  
    220227                                    AttributeCertificateRequestError.__doc__) 
    221228 
    222229class PIPAttributeQuery(_AttrDict): 
     230    '''Policy Information Point Query class.''' 
    223231    namespaces = ( 
    224232        "urn:ndg:security:authz:1.0:attr:subject", 
     
    227235    (SUBJECT_NS, ATTRIBUTEAUTHORITY_NS) = namespaces     
    228236 
    229 class PIPAttributeResponse(_AttrDict): 
     237class PIPAttributeResponse(dict): 
     238    '''Policy Information Point Response class.''' 
    230239    namespaces = ( 
    231         "urn:ndg:security:authz:1.0:attr:attributeCertificate", 
     240        Subject.ROLES_NS, 
    232241    ) 
    233     (ATTRIBUTECERTIFICATE_NS,) = namespaces 
    234242 
    235243 
     
    251259        ndg.security.common.wssecurity.WSSecurityConfig 
    252260        ''' 
    253         self._subjectCache = {} 
    254          
    255261        self.wssecurityCfg = WSSecurityConfig() 
    256262        wssePrefix = prefix + 'wssecurity' 
    257263        self.wssecurityCfg.update(cfg, prefix=wssePrefix) 
    258264                  
    259         self.sslCACertFilePathList = cfg.get(prefix+'sslCACertFilePathList',[]) 
     265        # List of CA certificates used to verify peer certificate with SSL 
     266        # connections to Attribute Authority 
     267        self.sslCACertFilePathList = cfg.get(prefix + 'sslCACertFilePathList', []) 
     268         
     269        # List of CA certificates used to verify the signatures of  
     270        # Attribute Certificates retrieved 
     271        self.caCertFilePathList = cfg.get(prefix + 'caCertFilePathList', []) 
    260272 
    261273    def attributeQuery(self, attributeQuery): 
     
    274286                                    PIPAttributeQuery.ATTRIBUTEAUTHORITY_NS] 
    275287         
    276         # Check this subject's cache for an Attribute Certificate previously 
    277         # retrieved. 
    278         attributeCertificate = None 
    279         if self._subjectCache.get(sessionId) is not None: 
    280             subjectCred = subjectCache.credentialByURI.get( 
    281                                                         attributeAuthorityURI) 
    282              
    283             if subjectCred is not None: 
    284                 if subjectCred['attCert'].isValid(): 
    285                     attributeCertificate = subjectCred['attCert'] 
    286          
    287         # If no Attribute Certificate is available, retrieve from the relevant 
    288         # Attribute Authority       
    289         if attributeCertificate is None:   
    290             sessionId = subject[Subject.SESSIONID_NS] 
    291             attributeCertificate = self._getAttributeCertificate( 
     288        sessionId = subject[Subject.SESSIONID_NS] 
     289        attributeCertificate = self._getAttributeCertificate( 
    292290                                        sessionId, 
    293291                                        subject[Subject.SESSIONMANAGERURI_NS], 
    294292                                        attributeAuthorityURI) 
    295              
    296             # Make a new wallet for this subject 
    297             self._subjectCache[sessionId] = \ 
    298                         CredentialWallet(userId=attributeCertificate.userId) 
    299                          
    300             self._subjectCache[sessionId].addCredential( 
    301                                 attributeCertificate, 
    302                                 attributeAuthorityURI=attributeAuthorityURI) 
    303293 
    304294        attributeResponse = PIPAttributeResponse() 
    305         attributeResponse[PIPAttributeResponse.ATTRIBUTECERTIFICATE_NS] = \ 
    306                                                         attributeCertificate 
     295        attributeResponse[Subject.ROLES_NS] = attributeCertificate.roles 
    307296          
    308297        return attributeResponse 
    309298     
    310299     
    311     def _getAttributeCertificate(self,  
     300    def _getAttributeCertificate(self, 
    312301                                 sessionId, 
    313302                                 sessionManagerURI, 
     
    372361         
    373362        try: 
     363            attCert.certFilePathList = self.caCertFilePathList 
    374364            attCert.isValid(raiseExcep=True) 
     365         
     366        except AttCertInvalidSignature, e: 
     367            log.exception(e) 
     368            raise AttributeCertificateInvalidSignature() 
    375369         
    376370        except AttCertNotBeforeTimeError, e:    
     
    415409                 
    416410                attributeQuery = PIPAttributeQuery() 
    417                 attributeQuery[PIPAttributeQuery.SUBJECT_NS]=request.subject 
     411                attributeQuery[PIPAttributeQuery.SUBJECT_NS] = request.subject 
    418412                 
    419413                attributeQuery[PIPAttributeQuery.ATTRIBUTEAUTHORITY_NS] = \ 
    420414                                        matchingTarget.attributeAuthorityURI 
    421415                 
    422                 attributeResponse = self.pip.attributeQuery(attributeQuery) 
     416                try: 
     417                    attributeResponse = self.pip.attributeQuery(attributeQuery) 
     418                     
     419                except SubjectRetrievalError, e: 
     420                    log.exception(e) 
     421                    return Response(Response.DECISION_INDETERMINATE, 
     422                                    message=str(e)) 
     423                     
     424                except Exception, e: 
     425                    log.exception(e) 
     426                    return Response(Response.DECISION_INDETERMINATE, 
     427                                    message="An internal error occurred") 
     428                     
    423429                knownAttributeAuthorityURIs.append( 
    424430                                        matchingTarget.attributeAuthorityURI) 
    425431                 
    426                 attributeCertificate = attributeResponse[ 
    427                                 PIPAttributeResponse.ATTRIBUTECERTIFICATE_NS] 
    428                 request.subject[Subject.ROLES_NS] = attributeCertificate.roles  
     432                request.subject[Subject.ROLES_NS] = attributeResponse[ 
     433                                                            Subject.ROLES_NS] 
    429434                
    430435        # Match the subject's attributes against the target 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/credentialwallet.py

    r5181 r5182  
    419419                     for attrName in CredentialWallet._protectedAttrs]) 
    420420         
    421     def __setstate__(self): 
     421    def __setstate__(self, attrDict): 
    422422        '''Enable pickling for use with beaker.session''' 
    423         pass 
     423        for attr, val in attrDict.items(): 
     424            setattr(self, attr, val) 
    424425     
    425426    def parseConfig(self, cfg, prefix='', section='DEFAULT'): 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/sessionmanager.py

    r5063 r5182  
    108108    excepMap = { 
    109109        'SessionNotFound':                         SessionNotFound, 
    110         'UserSessionX509CertNotBeforeTimeError':   SessionCertTimeError, 
     110        'UserSessionNotBeforeTimeError':   SessionCertTimeError, 
    111111        'UserSessionExpired':                      SessionExpired, 
    112112        'InvalidUserSession':                      InvalidSession 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wssecurity/signaturehandler/__init__.py

    r5181 r5182  
    1717from M2Crypto import X509, BIO, RSA 
    1818import base64 
    19  
    20 # Conditional import as this is required for the encryption 
    21 # handler 
    22 try: 
    23     # For shared key encryption 
    24     from Crypto.Cipher import AES, DES3 
    25 except: 
    26     from warnings import warn 
    27     warn('Crypto.Cipher not available: EncryptionHandler disabled!', 
    28          RuntimeWarning) 
    29     class AES: 
    30         MODE_ECB = None 
    31         MODE_CBC = None 
    32          
    33     class DES3:  
    34         MODE_CBC = None 
    3519 
    3620import os 
Note: See TracChangeset for help on using the changeset viewer.