Changeset 5675


Ignore:
Timestamp:
28/08/09 16:58:07 (10 years ago)
Author:
pjkersha
Message:

Refactoring SOAPBindingMiddleware to accept a ZSI Service binding input from an upstream middleware component.

  • completed refactoring on zsi and soap middleware
  • TODO: fix wssecurity module middleware classes' config settings
Location:
TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi
Files:
6 edited

Legend:

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

    r5657 r5675  
    177177    @classmethod         
    178178    def filter_app_factory(cls, app, app_conf, **local_conf): 
    179         '''Function signature for Paste Deploy filter''' 
     179        '''Function signature for Paste Deploy filter 
     180         
     181        @type app: callable following WSGI interface 
     182        @param app: next middleware application in the chain       
     183        @type app_conf: dict         
     184        @param app_conf: PasteDeploy global configuration dictionary 
     185        @type prefix: basestring 
     186        @param prefix: prefix for app_conf parameters e.g. 'ndgsecurity.' - 
     187        enables other global configuration parameters to be filtered out 
     188        @type local_conf: dict         
     189        @param local_conf: PasteDeploy application specific configuration  
     190        dictionary 
     191        ''' 
    180192        return cls(app, app_conf, **local_conf) 
    181193        
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/attributeauthority.py

    r5674 r5675  
    4747        self.__attributeQueryKeyName = None 
    4848 
    49     @classmethod 
    50     def filter_app_factory(cls, app, global_conf, prefix='attributeauthority.', 
    51                            **app_conf): 
     49    def initialise(self, global_conf, prefix='attributeauthority.', 
     50                   **app_conf): 
    5251        """Set-up Attribute authority middleware using a Paste app factory  
    5352        pattern.  Overloaded base class method to enable custom settings from  
     
    6463        dictionary 
    6564        """ 
    66         app = AttributeAuthorityMiddleware(app) 
    67          
    6865        # Set key name for attribute authority set in environ 
    6966        environKeyOptName = prefix + \ 
     
    7774            ENVIRON_KEYNAME_ATTR_QUERY_IFACE_CFG_OPT_NAME 
    7875             
    79         app.attributeQueryKeyName = app_conf.pop( 
     76        self.attributeQueryKeyName = app_conf.pop( 
    8077            attrQueryIfaceEnvironKeyOptName, 
    8178            AttributeAuthorityMiddleware.DEFAULT_ATTR_QUERY_IFACE_KEYNAME) 
    8279         
    83         app.aa = AttributeAuthority.fromProperties(propPrefix=prefix, 
     80        self.aa = AttributeAuthority.fromProperties(propPrefix=prefix, 
    8481                                                   **app_conf) 
    85         app.attributeQuery = app.aa.samlAttributeQueryFactory() 
     82        self.attributeQuery = self.aa.samlAttributeQueryFactory() 
     83 
     84    @classmethod 
     85    def filter_app_factory(cls, app, global_conf, **app_conf): 
     86        '''Wrapper to enable instantiation compatible with Paste Deploy 
     87        filter application factory function signature 
     88         
     89        @type app: callable following WSGI interface 
     90        @param app: next middleware application in the chain       
     91        @type global_conf: dict         
     92        @param global_conf: PasteDeploy global configuration dictionary 
     93        @type prefix: basestring 
     94        @param prefix: prefix for configuration items 
     95        @type app_conf: dict         
     96        @param app_conf: PasteDeploy application specific configuration  
     97        dictionary 
     98        ''' 
     99        app = AttributeAuthorityMiddleware(app) 
     100        app.initialise(global_conf, **app_conf) 
    86101         
    87102        return app 
    88         
     103     
    89104    def __call__(self, environ, start_response): 
    90105        '''Set the Attribute Authority instantiated at initialisation in  
     
    174189    ndg.security.server.attributeauthority.AttributeAuthority instance provided 
    175190    from environ 
     191     
     192    @type DEFAULT_ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME: basestring 
     193    @cvar DEFAULT_ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME: Key name used to index the  
     194    ndg.security.server.attributeauthority.AttributeAuthority instance in the  
     195    environ dictionary 
     196    @type ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME_CFG_OPTNAME: basestring 
     197    @cvar ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME_CFG_OPTNAME: configuration option name 
     198    for the attribute authority environ key 
     199    @type DEFAULT_ENVIRON_KEYNAME: basestring 
     200    @cvar DEFAULT_ENVIRON_KEYNAME: default value for Key name used to index  
     201    THIS SOAP Service Binding middleware instance in the environ dictionary 
     202    @type ENVIRON_KEYNAME_CFG_OPTNAME: basestring 
     203    @cvar ENVIRON_KEYNAME_CFG_OPTNAME: configuration option name for this  
     204    middleware's environ key 
    176205    """ 
    177     DEFAULT_ATTRIBUTE_AUTHORITY_KEYNAME = \ 
     206    DEFAULT_ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME = \ 
    178207                "ndg.security.server.attributeauthority.AttributeAuthority" 
    179     ATTRIBUTE_AUTHORITY_KEYNAME_CFG_OPTNAME = 'attributeAuthorityEnvironKeyName' 
     208    ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME_CFG_OPTNAME = \ 
     209                'attributeAuthorityEnvironKeyName' 
     210     
     211    DEFAULT_ENVIRON_KEYNAME = ("ndg.security.server.wsgi.attributeauthority." 
     212                               "AttributeAuthoritySOAPBindingMiddleware") 
     213    ENVIRON_KEYNAME_CFG_OPTNAME = 'environKeyName' 
    180214              
    181215    def __init__(self, app): 
     
    188222         
    189223        self.__keyName = None 
    190  
     224        self.__attributeAuthorityKeyName = None 
     225         
    191226    def _getKeyName(self): 
    192227        return self.__keyName 
     
    200235    keyName = property(fget=_getKeyName,  
    201236                       fset=_setKeyName,  
    202                        doc="Key name used to index Attribute Authority in " 
    203                            "environ dictionary")    
    204           
     237                       doc="Key name used to index THIS SOAP Service Binding " 
     238                           "middleware instance in the environ dictionary")    
     239 
     240    def _getAttributeAuthorityKeyName(self): 
     241        return self.__attributeAuthorityKeyName 
     242 
     243    def _setAttributeAuthorityKeyName(self, val): 
     244        if not isinstance(val, basestring): 
     245            raise TypeError('Expecting %r for "attributeAuthorityKeyName" ' 
     246                            'attribute; got %r' %(basestring, type(val))) 
     247        self.__attributeAuthorityKeyName = val 
     248         
     249    attributeAuthorityKeyName = property(fget=_getAttributeAuthorityKeyName,  
     250                                         fset=_setAttributeAuthorityKeyName,  
     251                                         doc="Key name used to index the " 
     252                                             "ndg.security.server.attribute" 
     253                                             "authority.AttributeAuthority " 
     254                                             "instance in the environ " 
     255                                             "dictionary")  
     256              
    205257    @classmethod 
    206258    def filter_app_factory(cls, app, global_conf,  
     
    223275        # Generic Binding middleware intercepts the SOAP_ACTION set in environ 
    224276        # and maps it to the matching soap_{SOAP_ACTION} method from this class 
    225         app = SOAPBindingMiddleware.filter_app_factory(app, global_conf, 
    226                                                        **app_conf) 
    227          
    228         app = cls(app) 
    229         app.keyName = app_conf.get(cls.ATTRIBUTE_AUTHORITY_KEYNAME_CFG_OPTNAME, 
    230                                    cls.DEFAULT_ATTRIBUTE_AUTHORITY_KEYNAME) 
     277        soapBindingApp = SOAPBindingMiddleware.filter_app_factory(app,  
     278                                                                  global_conf, 
     279                                                                  **app_conf) 
     280         
     281        # Make the SOAP Binding wrapper pick up this Attribute Authority 
     282        # specific SOAP Binding 
     283        soapBindingApp.serviceSOAPBindingKeyName = app_conf.get( 
     284                                   cls.ENVIRON_KEYNAME_CFG_OPTNAME, 
     285                                   cls.DEFAULT_ENVIRON_KEYNAME) 
     286         
     287        # Instantiate this middleware and copy the environ key name setting for 
     288        # the Attribute Authority Service SOAP Binding 
     289        app = cls(soapBindingApp) 
     290        app.keyName = soapBindingApp.serviceSOAPBindingKeyName 
     291         
     292        # envrion key name for the  
     293        # ndg.security.server.attributeauthority.AttributeAuthority instance 
     294        app.attributeAuthorityKeyName = app_conf.get( 
     295                           cls.ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME_CFG_OPTNAME, 
     296                           cls.DEFAULT_ATTRIBUTE_AUTHORITY_ENVIRON_KEYNAME) 
     297         
    231298        return app 
    232     
     299  
     300    def __call__(self, environ, start_response): 
     301        """Set a reference to self in environ for the SOAPBindingMiddleware  
     302        instance to pick up downstream 
     303         
     304        @type environ: dict 
     305        @param environ: WSGI environment variables dictionary 
     306        @type start_response: function 
     307        @param start_response: standard WSGI start response function 
     308        """ 
     309 
     310        environ[self.keyName] = self 
     311        return self._app(environ, start_response) 
     312     
    233313    def soap_getAttCert(self, ps): 
    234314        '''Retrieve an Attribute Certificate 
     
    273353     
    274354    def _setAttributeAuthorityFromEnviron(self): 
    275         self.aa = self.environ.get(self.keyName) 
     355        self.aa = self.environ.get(self.attributeAuthorityKeyName) 
    276356        if self.aa is None: 
    277357            raise AttributeAuthoritySOAPBindingMiddlewareConfigError( 
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/saml/__init__.py

    r5663 r5675  
    5757                            "SOAPAttributeInterfaceMiddleware.queryInterface") 
    5858     
    59     def __init__(self, app, global_conf, prefix='', **app_conf): 
     59    def __init__(self, app): 
     60        '''@type app: callable following WSGI interface 
     61        @param app: next middleware application in the chain  
     62        '''      
     63        NDGSecurityPathFilter.__init__(self, app, None) 
     64         
     65        self._app = app 
     66                  
     67    def initialise(self, global_conf, prefix='', **app_conf): 
    6068        ''' 
     69        @type global_conf: dict         
     70        @param global_conf: PasteDeploy global configuration dictionary 
     71        @type prefix: basestring 
     72        @param prefix: prefix for configuration items 
     73        @type app_conf: dict         
     74        @param app_conf: PasteDeploy application specific configuration  
     75        dictionary 
     76        ''' 
     77        self.__queryInterfaceKeyName = None 
     78         
     79        self.pathMatchList = app_conf.get( 
     80            prefix + SOAPAttributeInterfaceMiddleware.PATH_OPTNAME, ['/']) 
     81                    
     82        self.queryInterfaceKeyName = app_conf.get(prefix + \ 
     83            SOAPAttributeInterfaceMiddleware.QUERY_INTERFACE_KEYNAME_OPTNAME, 
     84            prefix + \ 
     85            SOAPAttributeInterfaceMiddleware.DEFAULT_QUERY_INTERFACE_KEYNAME) 
     86         
     87    @classmethod 
     88    def filter_app_factory(cls, app, global_conf, **app_conf): 
     89        """Set-up using a Paste app factory pattern.  Set this method to avoid 
     90        possible conflicts from multiple inheritance 
     91         
    6192        @type app: callable following WSGI interface 
    6293        @param app: next middleware application in the chain       
     
    6899        @param app_conf: PasteDeploy application specific configuration  
    69100        dictionary 
    70         ''' 
    71         NDGSecurityPathFilter.__init__(self, app, None) 
    72          
    73         self._app = app 
    74         self.__queryInterfaceKeyName = None 
    75          
    76         self.pathMatchList = app_conf.get( 
    77             prefix + SOAPAttributeInterfaceMiddleware.PATH_OPTNAME, ['/']) 
    78                     
    79         self.queryInterfaceKeyName = app_conf.get(prefix + \ 
    80             SOAPAttributeInterfaceMiddleware.QUERY_INTERFACE_KEYNAME_OPTNAME, 
    81             prefix + \ 
    82             SOAPAttributeInterfaceMiddleware.DEFAULT_QUERY_INTERFACE_KEYNAME) 
    83  
     101        """ 
     102        app = cls(app) 
     103        app.initialise(global_conf, **app_conf) 
     104         
     105        return app 
     106     
    84107    def _getQueryInterfaceKeyName(self): 
    85108        return self.__queryInterfaceKeyName 
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/soap.py

    r5674 r5675  
    5252        from exception2SOAPFault''' 
    5353        return environ.get(cls.SOAP_FAULT_SET_KEYNAME, False) == True 
     54         
     55    @classmethod 
     56    def filter_app_factory(cls, app, global_conf, **app_conf): 
     57        """Set-up using a Paste app factory pattern.   
     58         
     59        @type app: callable following WSGI interface 
     60        @param app: next middleware application in the chain       
     61        @type global_conf: dict         
     62        @param global_conf: PasteDeploy global configuration dictionary 
     63        @type prefix: basestring 
     64        @param prefix: prefix for configuration items 
     65        @type app_conf: dict         
     66        @param app_conf: PasteDeploy application specific configuration  
     67        dictionary 
     68        """ 
     69        app = cls(app) 
     70        app.initialise(global_conf, **app_conf) 
     71         
     72        return app 
     73     
     74    def initialise(self, global_conf, **app_conf): 
     75        """Set attributes from keyword dictionaries global and or app_conf 
     76        @type global_conf: dict         
     77        @param global_conf: PasteDeploy global configuration dictionary 
     78        @type prefix: basestring 
     79        @param prefix: prefix for configuration items 
     80        @type app_conf: dict         
     81        @param app_conf: PasteDeploy application specific configuration  
     82        """ 
     83        raise NotImplementedError() 
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/wssecurity.py

    r5674 r5675  
    4747        self.__signatureHandler = None 
    4848         
    49     @classmethod 
    50     def filter_app_factory(cls, app, global_conf, **app_conf): 
    51         """Set-up Signature filter using a Paste app factory pattern.   
    52          
    53         @type app: callable following WSGI interface 
    54         @param app: next middleware application in the chain       
     49    def initialise(self, global_conf, **app_conf): 
     50        """Set-up Signature filter attributes using a Paste app factory  
     51        pattern.   
     52         
    5553        @type global_conf: dict         
    5654        @param global_conf: PasteDeploy global configuration dictionary 
     
    6159        dictionary 
    6260        """ 
    63         app = ZSIMiddleware.filter_app_factory(app, global_conf, **app_conf) 
     61        super(SignatureFilter, self).initialise(global_conf, **app_conf) 
    6462 
    6563        # Where possible remove keywords not applicable to SignatureHandler 
    66         wsseCfgFilePath = app_conf.pop(cls.WSSE_CFG_FILEPATH_OPTNAME, None) 
    67         wsseCfgFileSection = app_conf.pop(cls.WSSE_CFG_FILE_SECTION_OPTNAME,  
    68                                           None) 
    69         wsseCfgFilePrefix = app_conf.pop(cls.WSSE_CFG_FILE_PREFIX_OPTNAME, None) 
    70          
    71         app.signatureHandler = SignatureHandler(cfg=wsseCfgFilePath, 
     64        wsseCfgFilePath = app_conf.pop( 
     65                                SignatureFilter.WSSE_CFG_FILEPATH_OPTNAME,  
     66                                None) 
     67        wsseCfgFileSection = app_conf.pop( 
     68                                SignatureFilter.WSSE_CFG_FILE_SECTION_OPTNAME,  
     69                                None) 
     70        wsseCfgFilePrefix = app_conf.pop( 
     71                                SignatureFilter.WSSE_CFG_FILE_PREFIX_OPTNAME,  
     72                                None) 
     73         
     74        self.signatureHandler = SignatureHandler(cfg=wsseCfgFilePath, 
    7275                                            cfgFileSection=wsseCfgFileSection, 
    7376                                            cfgFilePrefix=wsseCfgFilePrefix, 
    7477                                            **app_conf) 
    75         return app 
    7678 
    7779    def _getSignatureHandler(self): 
     
    9597         
    9698    def __init__(self, app): 
    97         super(ApplySignatureFilter, self).__init__(*arg, **kw) 
     99        super(ApplySignatureFilter, self).__init__(app) 
    98100        self.__wsseSignatureVerificationFilterID = None 
    99101         
    100     @classmethod 
    101     def filter_app_factory(cls, app, global_conf, **app_conf): 
    102         """Set-up Signature filter using a Paste app factory pattern.   
    103          
    104         @type app: callable following WSGI interface 
    105         @param app: next middleware application in the chain       
     102    def initialise(self, global_conf, **app_conf): 
     103        """Set-up Signature filter attributes using a Paste app factory  
     104        pattern.   
     105         
    106106        @type global_conf: dict         
    107107        @param global_conf: PasteDeploy global configuration dictionary 
     
    112112        dictionary 
    113113        """ 
    114         app = ZSIMiddleware.filter_app_factory(app, global_conf, **app_conf) 
    115         app.wsseSignatureVerificationFilterID = app_conf.pop( 
    116                             cls.WSSE_SIGNATURE_VERIFICATION_FILTERID_OPTNAME, 
    117                             None) 
    118         return app 
     114        super(ApplySignatureFilter, self).initialise(global_conf, **app_conf) 
     115        self.wsseSignatureVerificationFilterID = app_conf.pop( 
     116            ApplySignatureFilter.WSSE_SIGNATURE_VERIFICATION_FILTERID_OPTNAME, 
     117            None) 
    119118 
    120119    def _getWsseSignatureVerificationFilterID(self): 
    121120        return self.__wsseSignatureVerificationFilterID 
    122  
    123121 
    124122    def _setWsseSignatureVerificationFilterID(self, value): 
     
    138136    def __call__(self, environ, start_response): 
    139137        '''Sign message''' 
    140         if not self.isSOAPMessage(environ) or \ 
     138        if not ApplySignatureFilter.isSOAPMessage(environ) or \ 
    141139           not self.pathMatch(environ): 
    142140            log.debug("ApplySignatureFilter.__call__: Non-SOAP request or " 
     
    146144         
    147145        log.debug('Signing outbound message ...') 
    148         if self.isSOAPFaultSet(environ): 
     146        if ApplySignatureFilter.isSOAPFaultSet(environ): 
    149147            # TODO: If the Signature handler is signing any sub-elements in the 
    150148            # message body this is going to run into problems because the  
     
    157155        # the client  
    158156        try: 
    159             sw = self.getSOAPWriter(environ) 
     157            sw = ApplySignatureFilter.getSOAPWriter(environ) 
    160158             
    161159            # Copy signature value in order to apply signature confirmation 
     
    175173        except Exception, e: 
    176174            sw = self.exception2SOAPFault(environ, e) 
    177             self.setSOAPWriter(environ, sw) 
     175            ApplySignatureFilter.setSOAPWriter(environ, sw) 
    178176          
    179177        try: 
     
    181179        except Exception, e: 
    182180            sw = self.exception2SOAPFault(environ, e) 
    183             self.setSOAPWriter(environ, sw) 
     181            ApplySignatureFilter.setSOAPWriter(environ, sw) 
    184182         
    185183        return self.writeResponse(environ, start_response) 
     
    191189    def __call__(self, environ, start_response): 
    192190        '''Verify message signature''' 
    193         if not self.isSOAPMessage(environ) or \ 
     191        if not SignatureVerificationFilter.isSOAPMessage(environ) or \ 
    194192           not self.pathMatch(environ): 
    195193            log.debug("SignatureVerificationFilter.__call__: Non-SOAP " 
     
    209207        except Exception, e: 
    210208            sw = self.exception2SOAPFault(environ, e) 
    211             self.setSOAPWriter(environ, sw) 
     209            SignatureVerificationFilter.setSOAPWriter(environ, sw) 
    212210             
    213211        return self.writeResponse(environ, start_response) 
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/zsi.py

    r5674 r5675  
    6363        self.__writerClass = None 
    6464        self.__writeResponseSet = None 
     65        self.__filterID = None 
    6566 
    6667    def _getCharset(self): 
     
    128129                            "referenced in environ by this identifier") 
    129130 
    130     @classmethod 
    131     def filter_app_factory(cls, app, global_conf, **app_conf): 
    132         app = cls(app) 
    133          
    134         if ZSIMiddleware.CHARSET_OPTNAME in app_conf: 
    135             app.charset = '; charset='+app_conf[ZSIMiddleware.CHARSET_OPTNAME] 
     131    def initialise(self, global_conf, prefix='soap.', **app_conf): 
     132        """Set-up ZSI middleware interface attributes.  Overloaded base class  
     133        method to enable custom settings from app_conf 
     134         
     135        @type global_conf: dict         
     136        @param global_conf: PasteDeploy global configuration dictionary 
     137        @type prefix: basestring 
     138        @param prefix: prefix for configuration items 
     139        @type app_conf: dict         
     140        @param app_conf: PasteDeploy application specific configuration  
     141        dictionary 
     142        """ 
     143        charsetOptName = prefix + ZSIMiddleware.CHARSET_OPTNAME 
     144        if charsetOptName in app_conf: 
     145            self.charset = '; charset='+app_conf[charsetOptName] 
    136146        else: 
    137             app.charset = '; charset=utf-8' 
    138  
    139         if ZSIMiddleware.PATH_OPTNAME in app_conf: 
    140             if app_conf[ZSIMiddleware.PATH_OPTNAME] != '/': 
    141                 app.path = app_conf[ZSIMiddleware.PATH_OPTNAME].rstrip('/') 
     147            self.charset = '; charset=utf-8' 
     148             
     149        pathOptName = prefix + ZSIMiddleware.PATH_OPTNAME 
     150        if pathOptName in app_conf: 
     151            if app_conf[pathOptName] != '/': 
     152                self.path = app_conf[pathOptName].rstrip('/') 
    142153            else: 
    143                 app.path = app_conf[ZSIMiddleware.PATH_OPTNAME] 
     154                self.path = app_conf[pathOptName] 
    144155        else: 
    145             app.path = '/' 
     156            self.path = '/' 
    146157 
    147158        # This flag if set to True causes this handler to call the  
    148159        # start_response method and output the SOAP response 
    149         app.writeResponseSet = app_conf.get( 
    150                                         ZSIMiddleware.WRITE_RESPONSE_OPTNAME, 
    151                                         'false').lower() == 'true' 
     160        writeResponseOptName = ZSIMiddleware.WRITE_RESPONSE_OPTNAME 
     161        self.writeResponseSet = app_conf.get(writeResponseOptName, 
     162                                             'false').lower() == 'true' 
    152163 
    153164        # Check for a list of other filters to be referenced by this one 
    154         if ZSIMiddleware.REFERENCED_FILTERS_OPTNAME in app_conf: 
     165        referencedFiltersOptName = ZSIMiddleware.REFERENCED_FILTERS_OPTNAME 
     166        if referencedFiltersOptName in app_conf: 
    155167            # __call__  may reference any filters in environ keyed by these 
    156168            # keywords 
    157             app.referencedFilterKeys = app_conf.pop( 
    158                             ZSIMiddleware.REFERENCED_FILTERS_OPTNAME).split() 
     169            self.referencedFilterKeys = app_conf.pop( 
     170                                            referencedFiltersOptName).split() 
    159171 
    160172             
     
    163175        # input URI and compare with this value to see if the request is  
    164176        # actually to the local Session Manager instance 
    165         app.publishedURI = app_conf.pop(ZSIMiddleware.PUBLISHED_URI_OPTNAME, 
    166                                         None) 
    167              
    168         if ZSIMiddleware.READER_CLASS_OPTNAME in app_conf: 
    169             readerClassName = app_conf.pop(ZSIMiddleware.READER_CLASS_OPTNAME) 
    170             app.readerClass = importClass(readerClassName) 
     177        publishedUriOptName = ZSIMiddleware.PUBLISHED_URI_OPTNAME 
     178        self.publishedURI = app_conf.pop(publishedUriOptName, None) 
     179         
     180        readerClassOptName = ZSIMiddleware.READER_CLASS_OPTNAME 
     181        if readerClassOptName in app_conf: 
     182            readerClassName = app_conf.pop(readerClassOptName) 
     183            self.readerClass = importClass(readerClassName) 
    171184        else: 
    172             app.readerClass = DomletteReader 
    173          
    174         if ZSIMiddleware.WRITERCLASS_OPTNAME in app_conf: 
    175             writerClassName = app_conf.pop(ZSIMiddleware.WRITERCLASS_OPTNAME) 
    176             app.writerClass = importClass(writerClassName) 
     185            self.readerClass = DomletteReader 
     186             
     187        writerClassOptName = ZSIMiddleware.WRITERCLASS_OPTNAME 
     188        if writerClassOptName in app_conf: 
     189            writerClassName = app_conf.pop(writerClassOptName) 
     190            self.writerClass = importClass(writerClassName) 
    177191        else: 
    178             app.writerClass = DomletteElementProxy 
    179              
    180         return app 
    181              
     192            self.writerClass = DomletteElementProxy 
    182193 
    183194    def __call__(self, environ, start_response): 
     
    267278            if len(soapIn) < contentLength: 
    268279                raise ZSIMiddlewareReadError("Expecting %d content length; " 
    269                                               "received %d instead." %  
    270                                               (contentLength, len(soapIn))) 
     280                                             "received %d instead." %  
     281                                             (contentLength, len(soapIn))) 
    271282             
    272283            log.debug("SOAP Request for handler %r" % ZSIMiddleware) 
     
    409420                                   "endpoint") 
    410421 
    411  
    412     @classmethod 
    413     def filter_app_factory(cls, app, global_conf, prefix='', **app_conf): 
    414         """Set-up ZSI SOAP Binding middleware interface using a Paste app 
    415         factory pattern.  Overloaded base class method to enable custom  
    416         settings from app_conf 
    417          
    418         @type app: callable following WSGI interface 
    419         @param app: next middleware application in the chain       
     422    def initialise(self, global_conf, prefix='', **app_conf): 
     423        """Set-up ZSI SOAP Binding middleware interface attributes. 
     424         Overloaded base class method to enable custom settings from app_conf 
     425         
    420426        @type global_conf: dict         
    421427        @param global_conf: PasteDeploy global configuration dictionary 
     
    426432        dictionary 
    427433        """ 
    428         app = ZSIMiddleware.filter_app_factory(app, global_conf, **app_conf) 
     434        super(SOAPBindingMiddleware, self).initialise(global_conf,  
     435                                                      prefix=prefix, 
     436                                                      **app_conf) 
    429437         
    430438        serviceSOAPBindingEnvironKeyNameOptName = prefix + \ 
    431                             cls.SERVICE_SOAP_BINDING_ENVIRON_KEYNAME_OPTNAME 
     439            SOAPBindingMiddleware.SERVICE_SOAP_BINDING_ENVIRON_KEYNAME_OPTNAME 
    432440        serviceSOAPBindingClassNameOptName = prefix + \ 
    433                             cls.SERVICE_SOAP_BINDING_CLASSNAME_OPTNAME 
     441            SOAPBindingMiddleware.SERVICE_SOAP_BINDING_CLASSNAME_OPTNAME 
    434442                             
    435443        if serviceSOAPBindingEnvironKeyNameOptName and \ 
    436444           serviceSOAPBindingClassNameOptName in app_conf: 
    437445            raise ZSIMiddlewareConfigError('Only "%s" or "%s" may be set; not ' 
    438                             ' both' %  
    439                             (cls.SERVICE_SOAP_BINDING_ENVIRON_KEYNAME_OPTNAME, 
    440                              cls.SERVICE_SOAP_BINDING_CLASSNAME_OPTNAME)) 
     446                                           ' both' %  
     447            (SOAPBindingMiddleware.SERVICE_SOAP_BINDING_ENVIRON_KEYNAME_OPTNAME, 
     448             SOAPBindingMiddleware.SERVICE_SOAP_BINDING_CLASSNAME_OPTNAME)) 
    441449             
    442450        if serviceSOAPBindingClassNameOptName in app_conf: 
     
    446454                 
    447455            # Filter 
    448             prefixOptName = prefix + cls.SERVICE_SOAP_BINDING_PROPPREFIX_OPTNAME 
     456            prefixOptName = prefix + \ 
     457                SOAPBindingMiddleware.SERVICE_SOAP_BINDING_PROPPREFIX_OPTNAME 
    449458            prefix = app_conf.get(prefixOptName, 
    450                         cls.DEFAULT_SERVICE_SOAP_BINDING_PROPPREFIX_OPTNAME) 
     459                            SOAPBindingMiddleware. 
     460                            DEFAULT_SERVICE_SOAP_BINDING_PROPPREFIX_OPTNAME) 
    451461             
    452462            serviceSOAPBindingKw = dict([(k.replace(prefix, ''), v) 
     
    454464                                         if k.startswith(prefix)]) 
    455465     
    456             app.serviceSOAPBinding = instantiateClass(modName, 
     466            self.serviceSOAPBinding = instantiateClass(modName, 
    457467                                       className, 
    458468                                       objectType=ServiceSOAPBinding, 
     
    461471            # Alternatively, reference another binding instance made available 
    462472            # by upstream middleware via environ 
    463             app.serviceSOAPBindingKeyName = app_conf.get( 
     473            self.serviceSOAPBindingKeyName = app_conf.get( 
    464474                            serviceSOAPBindingEnvironKeyNameOptName, 
    465                             cls.DEFAULT_SERVICE_SOAP_BINDING_ENVIRON_KEYNAME) 
     475                            SOAPBindingMiddleware. 
     476                            DEFAULT_SERVICE_SOAP_BINDING_ENVIRON_KEYNAME) 
    466477         
    467478         
    468479        # Flag to enable display of WSDL via wsdl query arg in a GET request 
    469         enableWSDLQueryOptName = prefix + cls.ENABLE_WSDL_QUERY_OPTNAME 
    470         app.enableWSDLQuery = cls.str2Bool(app_conf.get(enableWSDLQueryOptName, 
    471                                                         ''))    
    472         return app 
     480        enableWSDLQueryOptName = prefix + \ 
     481                                SOAPBindingMiddleware.ENABLE_WSDL_QUERY_OPTNAME 
     482        self.enableWSDLQuery = SOAPBindingMiddleware.str2Bool( 
     483                                    app_conf.get(enableWSDLQueryOptName, ''))    
    473484     
    474485    def __call__(self, environ, start_response): 
     
    479490        serviceSOAPBinding = environ.get(self.serviceSOAPBindingKeyName, 
    480491                                         self.serviceSOAPBinding) 
    481                         
     492        if serviceSOAPBinding is None: 
     493            raise ZSIMiddlewareConfigError('No SOAP service binding set in ' 
     494                                           'environ or configured from start' 
     495                                           '-up') 
     496              
    482497        if self.pathMatch(environ) and self.enableWSDLQuery and \ 
    483498           environ.get('REQUEST_METHOD', '') == 'GET' and \ 
Note: See TracChangeset for help on using the changeset viewer.