Changeset 4171 for TI12-security/trunk


Ignore:
Timestamp:
03/09/08 16:40:00 (11 years ago)
Author:
pjkersha
Message:

Fixes to SOAP and WS-Security middleware, added SOAP fault handling for exceptions

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

Legend:

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

    r4159 r4171  
    3333path = /AttributeAuthority 
    3434enableWSDLQuery = True 
     35charset = utf-8 
    3536 
    3637[filter:wsseSignatureVerificationFilter] 
     
    5455# Logging configuration 
    5556[loggers] 
    56 keys = root, ndgsecurity 
     57keys = root, ndgsecurity, ndg 
    5758 
    5859[handlers] 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wssecurity/BaseSignatureHandler.py

    r4159 r4171  
    290290        elif self.cfg.get('caCertFilePathList'): 
    291291            self.caCertFilePathList = self.cfg['caCertFilePathList'] 
    292  
    293         self._caX509Stack = [] 
    294292         
    295293        self.addTimestamp = self.cfg['addTimestamp'] 
     
    660658        @type caCertList: M2Crypto.X509.X509 certificate objects''' 
    661659         
    662         if not self.caCertIsSet: 
     660        if not hasattr(self, '_caX509Stack'): 
    663661            self._caX509Stack = X509Stack() 
    664662             
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/SessionMgr/__init__.py

    r4158 r4171  
    11161116        """Update existing properties from an input dictionary 
    11171117        Check input keys are valid names""" 
    1118         raise NotImplementedError, \ 
    1119             self.getRoles.__doc__.replace('\n       ','') 
     1118        raise NotImplementedError( 
     1119                            self.setProperties.__doc__.replace('\n       ','')) 
    11201120 
    11211121 
     
    11411141        issuing certificate is only set if the user certificate is a proxy 
    11421142        """ 
    1143         raise NotImplementedError, \ 
    1144             self.getRoles.__doc__.replace('\n       ','') 
    1145              
     1143        raise NotImplementedError(self.logon.__doc__.replace('\n       ','')) 
     1144             
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid_provider.py

    r4162 r4171  
    341341        @rtype: basestring 
    342342        @return: WSGI response 
    343  
    344343        """ 
    345344 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/soap.py

    r4159 r4171  
    3131    '''Middleware configurable to a given ZSI SOAP binding'''   
    3232     
     33    soapWriterKey = 'ZSI.writer.SoapWriter' 
     34    parsedSOAPKey = 'ZSI.parse.ParsedSoap' 
     35     
    3336    def __init__(self, app, app_conf, **kw): 
    3437        log.debug("SOAPMiddleware.__init__ ...") 
     
    3639        self.app_conf = app_conf 
    3740        self.app_conf.update(kw) 
     41         
     42        if 'charset' in self.app_conf: 
     43            self.app_conf['charset'] = '; ' + self.app_conf['charset'] 
     44        else: 
     45            self.app_conf['charset'] = '; charset=utf-8' 
     46 
    3847             
    3948        if 'path' not in self.app_conf: 
     
    6271    def __call__(self, environ, start_response): 
    6372        log.debug("SOAPMiddleware.__call__") 
    64  
     73         
     74        charset_ = self.app_conf['charset'] 
    6575        def start_response_wrapper(status, response_hdrs, exc_info=None): 
    6676            '''Ensure text/xml content type and set content length''' 
    6777             
    68             contentKeys = ('content-type', 'content-length') 
     78            log.debug("Altering content-type to text/xml...") 
     79            contentKeys = ('content-type',)#('content-type', 'content-length') 
    6980            response_hdrs_alt = [(name, val) for name, val in response_hdrs\ 
    7081                                 if name.lower() not in contentKeys] 
    7182             
    72             response_hdrs_alt += [('content-type', 'text/xml'), 
    73                                   ('content-length', str(len(self.soapOut)))] 
     83            response_hdrs_alt += [('content-type', 'text/xml'+charset_)] 
     84 
    7485                             
    7586            return start_response(status, response_hdrs_alt, exc_info) 
     
    100111            req, resp = method(ps) 
    101112        except Exception, e: 
    102             self._writeFault(req, resp) 
    103          
    104         # Serialize output using SOAP writer class 
    105         sw = SoapWriter() 
    106         sw.serialize(resp) 
     113            sw = self.exception2SOAPFault(e) 
     114        else:  
     115            # Serialize output using SOAP writer class 
     116            sw = SoapWriter() 
     117            sw.serialize(resp) 
    107118         
    108119        # Make SoapWriter object available to any SOAP filters that follow 
    109         environ['ZSI.writer.SoapWriter'] = sw 
     120        environ[SOAPMiddleware.soapWriterKey] = sw 
    110121        self.soapOut = str(sw) 
    111122         
     
    114125        log.debug(self.soapOut) 
    115126        log.debug("_"*80) 
    116 #                 
    117 #        if soap is not None: 
    118 #            return self._writeResponse(request, soap) 
     127 
     128        return self.app(environ, start_response_wrapper) 
     129 
     130 
     131    def exception2SOAPFault(self, e): 
     132        '''Convert an exception into a SOAP fault message''' 
     133        soapFault = fault.FaultFromException(e, None) 
     134        sw = SoapWriter() 
     135        soapFault.serialize(sw) 
     136        return sw 
     137     
    119138         
    120         app = self.app(environ, start_response_wrapper) 
    121         #start_response("200 OK", [('Content-type', 'text/xml')]) 
    122         return self.soapOut 
    123  
    124139    @classmethod 
    125140    def isSOAPMessage(cls, environ): 
     
    143158        # Check for ParsedSoap object set in environment, if not present, 
    144159        # make one 
    145         ps = environ.get('ZSI.parse.ParsedSoap') 
     160        ps = environ.get(SOAPMiddleware.parsedSOAPKey) 
    146161        if ps is None: 
    147162            # TODO: allow for chunked data 
     
    160175             
    161176            ps = ParsedSoap(soapIn) 
    162             environ['ZSI.parse.ParsedSoap'] = ps 
     177            environ[SOAPMiddleware.parsedSOAPKey] = ps 
    163178             
    164         return environ['ZSI.parse.ParsedSoap'] 
     179        return environ[SOAPMiddleware.parsedSOAPKey] 
    165180     
    166         
     181    @classmethod 
     182    def getSOAPWriter(cls, environ): 
     183        '''Access SoapWriter object set in environment by this classes' call 
     184        method''' 
     185         
     186        sw = environ.get(SOAPMiddleware.soapWriterKey) 
     187        if sw is None: 
     188            raise KeyError("Expecting '%s' key in environ: missing call to " 
     189                           "SOAPMiddleware?" % SOAPMiddleware.soapWriterKey) 
     190        return sw 
     191     
     192      
    167193def makeFilter(app, app_conf):   
    168     from ndgsecurity.config.attributeauthority import AttributeAuthorityWS 
    169      
    170     return SOAPMiddleware(app, app_conf, 
    171                           ServiceSOAPBinding=AttributeAuthorityWS(), 
    172                           path='/AttributeAuthority') 
     194    return SOAPMiddleware(app, app_conf) 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/wssecurity.py

    r4159 r4171  
    4848        app = self.app(environ, start_response) 
    4949 
    50         if 'ZSI.writer.SoapWriter' not in environ: 
    51             raise KeyError("Expecting 'ZSI.writer.SoapWriter' key in environ") 
     50        sw = self.getSOAPWriter(environ) 
     51        self.signatureHandler.sign(sw) 
     52        self.soapOut = str(sw) 
    5253         
    53         sw = environ['ZSI.writer.SoapWriter'] 
    54         self.signatureHandler.sign(sw) 
    55         soapOut = str(sw) 
    56          
    57         return soapOut 
     54#        try: 
     55#            start_response('200 OK',  
     56#                           [('Content-Length', str(len(self.soapOut))), 
     57#                            ('Content-type', 'text/xml')]) 
     58#        except Exception, e: 
     59#            raise 
     60        return self.soapOut 
    5861     
    5962 
     
    7376        # Pass on in environment as an efficiency measure for any following 
    7477        # SOAP Middleware 
    75         environ['ZSI.parse.ParsedSoap'] = ps 
    7678        return self.app(environ, start_response) 
    7779 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/attAuthority/AttAuthorityClientTest.py

    r4129 r4171  
    1616import os, sys, getpass, re 
    1717from ConfigParser import SafeConfigParser 
     18import logging 
     19logging.basicConfig() 
    1820 
    1921from ndg.security.common.AttAuthority import AttAuthorityClient 
Note: See TracChangeset for help on using the changeset viewer.