Changeset 4152 for TI12-security


Ignore:
Timestamp:
29/08/08 08:43:44 (11 years ago)
Author:
pjkersha
Message:

Changed ndgPage.kid in pylons container to allow for Pylons 0.9.7 - some helpers have moved to a sub-package 'rails'

ndg.security.server.wsgi.soap,
ndg.security.server.wsgi.wssecurity: more work on SOAP middleware - add filtering for GET reqests

Location:
TI12-security/trunk/python
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/Tests/pylonsAttributeAuthority/ndgsecurity/development.ini

    r4020 r4152  
    1515use = egg:Paste#http 
    1616host = 0.0.0.0 
    17 port = 5010 
     17port = 5000 
    1818 
    1919[app:main1] 
     
    3131paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPMiddleware 
    3232ServiceSOAPBindingClass = ndg.security.server.zsi.attributeauthority.AttributeAuthorityWS 
    33 pathInfo = /AttributeAuthority 
     33path = /AttributeAuthority 
     34enableWSDLQuery = True 
    3435 
    3536[filter:wsseSignatureVerificationFilter] 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/pylons/container/templates/ndg/security/ndgPage.kid

    r4125 r4152  
    99        <!--! The following includes the javascript, note that the XML 
    1010        function is needed to avoid escaping the < character --> 
    11         ${XML(h.javascript_include_tag(builtins=True))} 
     11        <?python 
     12            # Fudge for WebHelpers migration to 0.6.1 
     13            if hasattr(h, 'javascript_include_tag'): 
     14                javascript_include_tag = h.javascript_include_tag 
     15            else: 
     16                javascript_include_tag = h.rails.javascript_include_tag 
     17        ?> 
     18        ${XML(javascript_include_tag(builtins=True))} 
    1219        <script type="text/javascript" src="${g['server']}/js/toggleDiv.js"/> 
    1320 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/soap.py

    r4020 r4152  
    1414log = logging.getLogger(__name__) 
    1515 
     16import paste.request 
    1617from ZSI import EvaluateException, ParseException 
    1718from ZSI.parse import ParsedSoap 
     
    3031        self.app_conf.update(kw) 
    3132             
    32         if 'pathInfo' not in self.app_conf: 
    33             self.app_conf['pathInfo'] = '/' 
     33        if 'path' not in self.app_conf: 
     34            self.app_conf['path'] = '/' 
    3435         
    3536        if 'ServiceSOAPBindingClass' in self.app_conf: 
     
    4950                  
    5051        self.serviceSOAPBinding = serviceSOAPBindingClass() 
     52        self.enableWSDLQuery = bool() 
     53        if self.app_conf.get('enableWSDLQuery', False) and \ 
     54           hasattr(self.serviceSOAPBinding, '_wsdl'): 
     55            self.enableWSDLQuery = True 
    5156 
    5257        
    5358    def __call__(self, environ, start_response): 
    5459        log.debug("SOAPMiddleware.__call__") 
     60 
     61        def start_response_wrapper(status, response_hdrs, exc_info=None): 
     62            '''Ensure text/xml content type and set content length''' 
     63             
     64            contentKeys = ('content-type', 'content-length') 
     65            response_hdrs_alt = [(name, val) for name, val in response_hdrs\ 
     66                                 if name.lower() not in contentKeys] 
     67             
     68            response_hdrs_alt += [('content-type', 'text/xml'), 
     69                                  ('content-length', str(len(self.soapOut)))] 
     70                             
     71            return start_response(status, response_hdrs_alt, exc_info) 
    5572         
     73        if environ.get('REQUEST_METHOD') == 'GET' and \ 
     74           'wsdl' in dict(paste.request.parse_querystring(environ)): 
     75            if self.enableWSDLQuery: 
     76                wsdl = self.serviceSOAPBinding._wsdl 
     77                start_response("200 OK", [('Content-type', 'text/xml'), 
     78                                          ('Content-length', str(len(wsdl)))]) 
     79                return wsdl 
     80                 
     81                 
    5682        # Apply filter for calls 
    57         if not environ['PATH_INFO'].startswith(self.app_conf['pathInfo']): 
     83        if not self.isSOAPMessage(environ) or \ 
     84           not environ['PATH_INFO'].startswith(self.app_conf['path']): 
    5885            return self.app(environ, start_response) 
    5986 
    60         def start_response_wrapper(status, response_headers, exc_info=None): 
    61             '''Ensure text/xml content type and set content length''' 
    62             response_headers_alt=[(name,val) for name, val in response_headers\ 
    63                     if name.lower() not in ('content-type', 'content-length')] 
    64              
    65             response_headers_alt += [('content-type', 'text/xml'), 
    66                                 ('content-length', "%d" % len(self.soapOut))] 
    67                              
    68             return start_response(status,  
    69                                   response_headers_alt, 
    70                                   exc_info) 
    71  
     87        # Check for ParsedSoap object set in environment, if not present, 
     88        # make one 
    7289        if 'ZSI.parse.ParsedSoap' in environ: 
    7390            ps = environ['ZSI.parse.ParsedSoap'] 
     
    8198             
    8299            ps = ParsedSoap(soapIn) 
    83              
     100         
     101        # Map SOAP Action to method in binding class 
    84102        method = getattr(self.serviceSOAPBinding,  
    85103                         'soap_%s' % environ['HTTP_SOAPACTION'].strip('"')) 
    86104         
     105        # TODO: change method to return response only: request, response tuple 
     106        # is carry over from Twisted based code 
    87107        try: 
    88108            req, resp = method(ps) 
     
    90110            self._writeFault(req, resp) 
    91111         
     112        # Serialize output using SOAP writer class 
    92113        sw = SoapWriter() 
    93114        sw.serialize(resp) 
     
    107128        app = self.app(environ, start_response_wrapper) 
    108129        #start_response("200 OK", [('Content-type', 'text/xml')]) 
    109         return [self.soapOut] 
     130        return self.soapOut 
    110131 
    111  
     132    @classmethod 
     133    def isSOAPMessage(cls, environ): 
     134        '''Generic method to filter out non-soap messages''' 
     135        return environ.get('REQUEST_METHOD', '') == 'POST' and \ 
     136               environ.get('HTTP_SOAPACTION') is not None 
     137         
     138         
    112139def makeFilter(app, app_conf):   
    113140    from ndgsecurity.config.attributeauthority import AttributeAuthorityWS 
     
    115142    return SOAPMiddleware(app, app_conf, 
    116143                          ServiceSOAPBinding=AttributeAuthorityWS(), 
    117                           pathInfo='/AttributeAuthority') 
     144                          path='/AttributeAuthority') 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/wssecurity.py

    r4129 r4152  
    2020from ZSI.writer import SoapWriter 
    2121from ndg.security.common.wssecurity.dom import SignatureHandler 
     22from ndg.security.server.wsgi.soap import SOAPMiddleware 
    2223 
    23 class SignatureMiddleware(object): 
     24class SignatureMiddleware(SOAPMiddleware): 
    2425    '''Apply WS-Security digital signature to SOAP message''' 
    2526     
     
    3031     
    3132    def __call__(self, environ, start_response): 
     33        if not self.isSOAPMessage(environ): 
     34            return self.app(environ, start_response) 
    3235         
    3336        log.debug('Signing outbound message ...') 
     
    4447     
    4548 
    46 class SignatureVerificationMiddleware(object): 
     49class SignatureVerificationMiddleware(SOAPMiddleware): 
    4750    '''Verify WS-Security digital signature in SOAP message''' 
    4851     
     
    5457     
    5558    def __call__(self, environ, start_response): 
     59        if not self.isSOAPMessage(environ): 
     60            return self.app(environ, start_response) 
    5661         
    5762        if 'SOAP_ACTION' not in environ: 
Note: See TracChangeset for help on using the changeset viewer.