Changeset 5751 for TI12-security


Ignore:
Timestamp:
22/09/09 17:13:12 (10 years ago)
Author:
pjkersha
Message:

Refactored properties and attributes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/ssl.py

    r5362 r5751  
    100100    SSLOptions directive enabled. 
    101101    """ 
    102     sslKeyName = 'HTTPS' 
    103  
     102    SSL_KEYNAME = 'HTTPS' 
     103    SSL_KEYVALUE = '1' 
     104     
    104105    _isSSLRequest = lambda self: self.environ.get( 
    105                                 ApacheSSLAuthNMiddleware.sslKeyName) == '1' 
     106                                    ApacheSSLAuthNMiddleware.SSL_KEYNAME) == \ 
     107                                    ApacheSSLAuthNMiddleware.SSL_KEYVALUE 
    106108    isSSLRequest = property(fget=_isSSLRequest, 
    107109                            doc="Is an SSL request boolean - depends on " 
    108110                                "'HTTPS' Apache environment variable setting") 
    109111     
    110     sslClientCertKeyName = 'SSL_CLIENT_CERT' 
     112    SSL_CLIENT_CERT_KEYNAME = 'SSL_CLIENT_CERT' 
    111113     
    112114    propertyDefaults = { 
     
    118120         
    119121    _isSSLClientCertSet = lambda self: bool(self.environ.get( 
    120                                 ApacheSSLAuthNMiddleware.sslClientCertKeyName))  
     122                            ApacheSSLAuthNMiddleware.SSL_CLIENT_CERT_KEYNAME))  
    121123    isSSLClientCertSet = property(fget=_isSSLClientCertSet, 
    122124                                  doc="Check for client X.509 certificate " 
    123125                                      "'SSL_CLIENT_CERT' setting in environ") 
    124126     
    125     def __init__(self, app, global_conf, prefix='', **app_conf): 
     127    def __init__(self, app, global_conf, prefix='sslAuthn.', **app_conf): 
    126128         
    127129        super(ApacheSSLAuthNMiddleware, self).__init__(app,  
     
    130132                                                       **app_conf) 
    131133         
     134        self.__caCertFilePathList = None 
     135        self.__caCertStack = None 
     136        self.__verifyClientCert = None 
     137         
    132138        self.rePathMatchList = [re.compile(r) for r in  
    133139                                app_conf.get('rePathMatchList','').split()] 
    134140 
    135         self.caCertFilePathList = app_conf.get('caCertFilePathList', []) 
     141        self.caCertStack = app_conf.get('caCertFilePathList', []) 
    136142         
    137143        # A custom class may be specified to determine what verification to 
     
    145151                dict(filter(isClientCertVerificationProperty,app_conf.items())) 
    146152                 
    147             self._verifyClientCert = instantiateClass( 
     153            self.verifyClientCert = instantiateClass( 
    148154                             clientCertVerificationClassName,  
    149155                             None,  
     
    152158        else:  
    153159            # Default to carry out no verification 
    154             self._verifyClientCert = NoClientCertVerification() 
    155          
    156          
    157     def _setCACertsFromFileList(self, caCertFilePathList): 
     160            self.verifyClientCert = NoClientCertVerification() 
     161         
     162    def _setCACertStack(self, caCertList): 
    158163        '''Read CA certificates from file and add them to an X.509 Cert. 
    159164        stack 
    160165         
    161         @type caCertFilePathList: list or tuple 
    162         @param caCertFilePathList: list of file paths for CA certificates to 
    163         be used to verify certificate used to sign message''' 
    164          
    165         if isinstance(caCertFilePathList, basestring): 
    166             # Try parsing a space separated list of file paths 
    167             caCertFilePathList = caCertFilePathList.split() 
    168              
    169         elif not isinstance(caCertFilePathList, (list, tuple)): 
    170             raise TypeError('Expecting a list or tuple for ' 
    171                             '"caCertFilePathList"') 
    172  
    173         self._caCertFilePathList = caCertFilePathList 
    174         self._caCertStack = X509Stack() 
    175  
    176         for caCertFilePath in caCertFilePathList: 
    177             x509Cert = X509Cert.Read(os.path.expandvars(caCertFilePath)) 
    178             self._caCertStack.push(x509Cert) 
     166        @type caCertList: basestring, list, tuple or  
     167        ndg.security.common.X509.X509Stack 
     168        @param caCertList: list of file paths for CA certificates to 
     169        be used to verify certificate used to sign message.  If a single 
     170        string, it will be parsed into a list based on space separator to  
     171        delimit items''' 
     172         
     173        if isinstance(caCertList, X509Stack): 
     174            self.__caCertFilePathList = [] 
     175            self.__caCertStack = caCertList 
     176            return 
     177         
     178        else: 
     179            if isinstance(caCertList, basestring): 
     180                # Try parsing a space separated list of file paths 
     181                self.__caCertFilePathList = caCertList.split() 
     182                 
     183            elif isinstance(caCertList, (list, tuple)): 
     184                self.__caCertFilePathList = caCertList 
     185            else: 
     186                raise TypeError('Expecting a list or tuple for ' 
     187                                '"caCertList"') 
     188     
     189            self.__caCertStack = X509Stack() 
     190     
     191            for caCertFilePath in self.__caCertFilePathList: 
     192                x509Cert = X509Cert.Read(os.path.expandvars(caCertFilePath)) 
     193                self.__caCertStack.push(x509Cert) 
     194     
     195    def _getCACertStack(self): 
     196        return self.__caCertStack 
     197 
     198    caCertStack = property(fset=_setCACertStack, 
     199                           fget=_getCACertStack, 
     200                           doc="CA certificate stack object - " 
     201                               "peer certificate must validate against one") 
    179202     
    180203    def _getCACertFilePathList(self): 
    181         return self._caCertFilePathList 
    182      
    183     caCertFilePathList = property(fset=_setCACertsFromFileList, 
     204        return self.__caCertFilePathList 
     205     
     206    caCertFilePathList = property(fset=_setCACertStack, 
    184207                                  fget=_getCACertFilePathList, 
    185208                                  doc="list of CA certificate file paths - " 
    186209                                      "peer certificate must validate against " 
    187                                       "one") 
    188        
     210                                      "one.  This property is set from the " 
     211                                      "caCertStack property assignment") 
     212 
     213    caCertStack = property(fset=_setCACertStack, 
     214                           fget=_getCACertStack, 
     215                           doc="CA certificate stack object - " 
     216                               "peer certificate must validate against one") 
     217     
     218    def _setVerifyClientCert(self, value): 
     219        ''' 
     220        @type value: ClientCertVerificationInterface derived type 
     221        @param value: custom SSL client verification interface 
     222        ''' 
     223         
     224        if not isinstance(value, ClientCertVerificationInterface): 
     225            raise TypeError('Expecting %r type for "verifyClientCert"; got ' 
     226                            '%r' % type(value)) 
     227         
     228        if not callable(value): 
     229            raise TypeError('Expecting callable for "verifyClientCert"') 
     230         
     231        self.__verifyClientCert = value 
     232     
     233    def _getVerifyClientCert(self): 
     234        return self.__verifyClientCert 
     235 
     236    verifyClientCert = property(fset=_setVerifyClientCert, 
     237                                fget=_getVerifyClientCert, 
     238                                doc="Client certificate verification " 
     239                                    "interface object") 
     240     
    189241    @NDGSecurityMiddlewareBase.initCall          
    190242    def __call__(self, environ, start_response): 
     
    193245        log.debug("ApacheSSLAuthNMiddleware.__call__ ...") 
    194246         
    195         if not self.isSSLRequest: 
     247        if not self._pathMatch(): 
     248            log.debug("ApacheSSLAuthNMiddleware: ignoring path [%s]",  
     249                      self.pathInfo) 
     250            return self._setResponse() 
     251         
     252        elif not self.isSSLRequest: 
    196253            log.warning("ApacheSSLAuthNMiddleware: 'HTTPS' environment " 
    197254                        "variable not found in environment; ignoring request") 
    198255            return self._setResponse() 
    199              
    200         elif not self._pathMatch(): 
    201             log.debug("ApacheSSLAuthNMiddleware: ignoring path [%s]",  
    202                       self.pathInfo) 
    203             return self._setResponse() 
    204                      
     256                         
    205257        elif not self.isSSLClientCertSet: 
    206258            log.error("ApacheSSLAuthNMiddleware: No SSL Client certificate " 
     
    221273                     **kw): 
    222274        return super(ApacheSSLAuthNMiddleware,  
    223                      self)._setResponse(notFoundMsg=notFoundMsg) 
     275                     self)._setResponse(notFoundMsg=notFoundMsg, **kw) 
    224276 
    225277    def _setErrorResponse(self, msg='Invalid SSL client certificate', **kw): 
     
    241293    def isValidClientCert(self): 
    242294        sslClientCert = self.environ[ 
    243                                 ApacheSSLAuthNMiddleware.sslClientCertKeyName] 
     295                            ApacheSSLAuthNMiddleware.SSL_CLIENT_CERT_KEYNAME] 
    244296        x509Cert = X509Cert.Parse(sslClientCert) 
    245297         
    246         if len(self._caCertStack) == 0: 
     298        if len(self.caCertStack) == 0: 
    247299            log.warning("No CA certificates set for Client certificate " 
    248300                        "signature verification") 
    249301        else: 
    250302            try: 
    251                 self._caCertStack.verifyCertChain(x509Cert2Verify=x509Cert) 
     303                self.caCertStack.verifyCertChain(x509Cert2Verify=x509Cert) 
    252304 
    253305            except X509CertError, e: 
     
    263315        # Check certificate Distinguished Name via  
    264316        # ClientCertVerificationInterface object 
    265         return self._verifyClientCert(x509Cert) 
    266  
     317        return self.verifyClientCert(x509Cert) 
     318 
Note: See TracChangeset for help on using the changeset viewer.