Changeset 4822


Ignore:
Timestamp:
16/01/09 13:46:39 (11 years ago)
Author:
pjkersha
Message:
  • added ndg.security.server.wsgi.NDGSecurityMiddlewareBase generic base class for WSGI middleware
  • added pep (Policy Enforcement Point) package to intercept requests and apply security constraints.
  • refactored SSLClientAuthNMiddleware to use NDGSecurityMiddlewareBase class
Location:
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi
Files:
2 added
2 edited

Legend:

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

    r4770 r4822  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = '$Id$' 
     12 
     13class NDGSecurityMiddlewareBase(object): 
     14    """Base class for NDG Security Middleware classes""" 
     15    propertyDefaults = {} 
     16     
     17    def __init__(self, app, app_conf, **local_conf): 
     18        pass 
     19     
     20    # Utility functions to support Paste Deploy application and filter function 
     21    # signatures 
     22    @classmethod         
     23    def filter_app_factory(cls, app, app_conf, **local_conf): 
     24        '''Function signature for Paste Deploy filter''' 
     25        return cls(app, app_conf, **local_conf) 
     26        
     27    @classmethod 
     28    def app_factory(cls, app_conf, **local_conf): 
     29        '''Function Signature for Paste Deploy app''' 
     30        return cls(None, app_conf, **local_conf) 
     31     
     32    @classmethod 
     33    def _filterOpts(cls, opt, newOpt, prefix=''): 
     34        '''Convenience utility to filter input options set in __init__ via 
     35        app_conf or keywords 
     36         
     37        @type opt: dict 
     38        @param opt: existing options set.  These will be updated by this 
     39        method based on the content of newOpt 
     40        @type newOpt: dict 
     41        @param newOpt: new options to update opt with 
     42        @type prefix: basestring  
     43        @param prefix: if set, remove the given prefix from the input options 
     44        @raise KeyError: if an option is set that is not in the classes 
     45        defOpt class variable 
     46        ''' 
     47         
     48        badOpt = [] 
     49        for k,v in newOpt.items(): 
     50            if prefix and k.startswith(prefix): 
     51                subK = k.replace(prefix, '')                     
     52                filtK = '_'.join(subK.split('.'))   
     53            else: 
     54                filtK = k 
     55                     
     56            if filtK not in cls.propertyDefaults: 
     57                badOpt += [k]                 
     58            else: 
     59                opt[filtK] = v 
     60                 
     61        if len(badOpt) > 0: 
     62            raise TypeError("Invalid input option(s) set: %s" %  
     63                            (", ".join(badOpt))) 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/sslclientauthn.py

    r4821 r4822  
    1 """SSL Client Authentication Middleware 
     1"""SSL Client Authentication Middleware Module 
    22 
    33Apply to SSL client authentication to configured URL paths. 
     
    1616__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1717__revision__ = "$Id$" 
     18__license__ = "BSD" 
    1819import logging 
    1920log = logging.getLogger(__name__) 
    2021import os 
    2122import httplib 
     23 
     24from ndg.security.server.wsgi import NDGSecurityMiddlewareBase 
    2225from ndg.security.common.X509 import X509Stack, X509Cert, X509CertError 
    2326 
    24 class SSLClientAuthNMiddleware(object): 
     27class SSLClientAuthNMiddleware(NDGSecurityMiddlewareBase): 
     28    '''Apply to SSL client authentication to configured URL paths. 
     29 
     30    SSL Client certificate is expected to be present in environ as  
     31    SSL_CLIENT_CERT key as set by standard Apache SSL.''' 
    2532 
    2633    sslClientCertKeyName = 'SSL_CLIENT_CERT' 
     
    205212            return self._setErrorResponse(environ, start_response) 
    206213             
    207     def _setResponse(self, environ, start_response): 
    208         if self._app: 
    209             return self._app(environ, start_response) 
    210         else: 
    211             response = 'No application set for SSLClientAuthNMiddleware' 
    212             status = '%d %s' % (404, httplib.responses[404]) 
    213             start_response(status, 
    214                            [('Content-type', 'text/plain'), 
    215                             ('Content-Length', str(len(response)))]) 
    216             return response 
    217  
    218     def _setErrorResponse(self, environ, start_response, 
     214    def _setResponse(self,  
     215                     environ,  
     216                     start_response, 
     217                     notFoundMsg='No application set for ' 
     218                                 'SSLClientAuthNMiddleware'): 
     219        super(SSLClientAuthNMiddleware, self)._setResponse(environ,  
     220                                                           start_response, 
     221                                                           notFoundMsg=msg) 
     222 
     223    def _setErrorResponse(self,  
     224                          environ,  
     225                          start_response, 
    219226                          msg='Invalid SSL client certificate'): 
    220         response = msg 
    221         status = '%d %s' % (self.errorResponseCode,  
    222                             httplib.responses[self.errorResponseCode]) 
    223          
    224         start_response(status, 
    225                        [('Content-type', 'text/plain'), 
    226                         ('Content-Length', str(len(response)))]) 
    227         return response 
     227        super(SSLClientAuthNMiddleware, self)._setResponse(environ,  
     228                                                   start_response, 
     229                                                   msg=msg, 
     230                                                   code=self.errorResponseCode) 
    228231 
    229232    def isValidClientCert(self, environ): 
Note: See TracChangeset for help on using the changeset viewer.