Changeset 5060 for TI12-security


Ignore:
Timestamp:
04/03/09 11:31:37 (11 years ago)
Author:
pjkersha
Message:

Tested 4Suite based WS-Security SignatureHandler? with Java client Attribute Authority Unit tests. 4Suite version is now integrated as the default Singautre Handler for ndg.security.server.wsgi.wssecurity

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

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/utils/classfactory.py

    r4863 r5060  
    1919        Exception.__init__(self, msg) 
    2020 
     21def importClass(moduleName, className=None): 
     22    '''Import a class from a string module name and class name. 
     23     
     24    @param moduleName: Name of module containing the class 
     25    @type moduleName: str  
     26    @param className: Name of the class to import.  If none is given, the  
     27    class name will be assumed to be the last component of modulePath 
     28    @type className: str 
     29    @rtype: class object 
     30    @return: imported class''' 
     31     
     32    if className is None: 
     33        _moduleName, className = moduleName.rsplit(moduleName, 1) 
     34    else: 
     35        _moduleName = moduleName 
     36            
     37    module = __import__(_moduleName) 
     38    components = _moduleName.split('.') 
     39    for component in components[1:]: 
     40        module = getattr(module, component) 
     41 
     42    importedClass = getattr(module, className) 
     43    return importedClass 
     44     
    2145 
    2246def instantiateClass(moduleName, className, moduleFilePath=None,  
     
    7094                module = getattr(module, component) 
    7195 
    72             importedClass = getattr(module, className) 
     96            importedClass = importClass(moduleName, className=className) 
    7397        finally: 
    7498            # revert back to original sys path, if necessary 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wssecurity/foursuite.py

    r5057 r5060  
    7575         
    7676        # Add ID so that the element can be included in the signature 
    77         sigConfirmElem.node.setAttribute('wsu:Id', "signatureConfirmation") 
    78  
     77        sigConfirmElem.setAttributeNS(_WSU.UTILITY,  
     78                                      'Id',  
     79                                      'signatureConfirmation') 
     80         
    7981        # Add ID so that the element can be included in the signature 
    8082        # Following line is a hck to avoid appearance of #x when serialising \n 
    8183        # chars TODO: why is this happening?? 
    8284        b64EncSignatureValue = ''.join(self.b64EncSignatureValue.split('\n')) 
    83         sigConfirmElem.node.setAttribute('Value', b64EncSignatureValue) 
    84          
     85        sigConfirmElem.setAttributeNS(None, 'Value', b64EncSignatureValue) 
    8586         
    8687    def _addTimeStamp(self, wsseElem, elapsedSec=60*5): 
     
    300301                                                    'InclusiveNamespaces') 
    301302            inclNsPfx = ' '.join(self.signedInfoC14nKw['inclusive_namespaces']) 
    302             c14nInclNamespacesElem.setAttributeNS(None, 'PrefixList', inclNsPfx) 
     303            c14nInclNamespacesElem.setAttributeNS(None,'PrefixList',inclNsPfx) 
    303304         
    304305        # Signed Info - Signature method 
     
    529530                    # Check for no inclusive namespaces set 
    530531                    inclusiveNS = getElements(transformElems[0],  
    531                                               "InclusiveNamespaces")[0]                     
    532                     if inclusiveNS: 
    533                         pfxListAttElem = inclusiveNS.getAttributeNodeNS(None,  
     532                                              "InclusiveNamespaces")                    
     533                    if len(inclusiveNS) > 0: 
     534                        pfxListAttElem=inclusiveNS[0].getAttributeNodeNS(None,  
    534535                                                                'PrefixList') 
    535536                             
     
    584585                # Check for inclusive namespaces 
    585586                inclusiveNsElem = getElements(c14nMethodElem, 
    586                                               "InclusiveNamespaces")[0] 
    587                 if inclusiveNsElem:                     
    588                     pfxListAttElem = inclusiveNsElem.getAttributeNodeNS(None, 
     587                                              "InclusiveNamespaces") 
     588                if len(inclusiveNsElem) > 0:                     
     589                    pfxListAttElem=inclusiveNsElem[0].getAttributeNodeNS(None, 
    589590                                                                 'PrefixList') 
    590591                    signedInfoC14nKw['inclusivePrefixes'] = \ 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/soap.py

    r4890 r5060  
    11"""NDG Security SOAP Service Middleware 
    22 
    3 NERC Data Grid Project 
     3NERC DataGrid Project 
    44 
    55""" 
     
    88__copyright__ = "(C) 2009 Science and Technology Facilities Council" 
    99__contact__ = "Philip.Kershaw@stfc.ac.uk" 
     10__license__ = "BSD - see LICENSE file in top-level directory" 
    1011__revision__ = "$Id$" 
    1112import logging 
    1213log = logging.getLogger(__name__) 
    1314 
    14 import paste.request 
    15 from ZSI import EvaluateException, ParseException 
     15import sys 
     16 
    1617from ZSI.parse import ParsedSoap 
    1718from ZSI.writer import SoapWriter 
     
    2021from ZSI.ServiceContainer import ServiceSOAPBinding 
    2122from ndg.security.common.utils.classfactory import instantiateClass 
     23from ndg.security.common.wssecurity.utils import DomletteReader, \ 
     24    DomletteElementProxy 
    2225      
    2326class SOAPMiddlewareError(Exception): 
     
    6366        # This flag if set to True causes this handler to call the  
    6467        # start_response method and output the SOAP response 
    65         self.writeResponseSet = self.app_conf.get('writeResponse',  
     68        self.writeResponseSet = self.app_conf.get('writeResponse', 
    6669                                                  'false').lower() == 'true' 
    6770 
     
    8386            self.publishedURI = self.app_conf.pop('publishedURI') 
    8487             
     88        if 'readerclass' in self.app_conf: 
     89            self.readerclass = importClass(self.app_conf.pop('readerclass')) 
     90        else: 
     91            self.readerclass = DomletteReader 
     92         
     93        if 'writerclass' in self.app_conf: 
     94            self.writerclass = importClass(self.app_conf.pop('writerclass')) 
     95        else: 
     96            self.writerclass = DomletteElementProxy 
     97             
    8598 
    8699    def __call__(self, environ, start_response): 
     
    137150        return None 
    138151 
    139     @classmethod 
    140     def exception2SOAPFault(cls, environ, exception): 
     152    def exception2SOAPFault(self, environ, exception): 
    141153        '''Convert an exception into a SOAP fault message''' 
    142         soapFault = fault.FaultFromException(exception, None) 
    143         sw = SoapWriter() 
     154        soapFault = fault.FaultFromException(exception,  
     155                                             None, 
     156                                             tb=sys.exc_info()[2]) 
     157        sw = SoapWriter(outputclass=self.writerclass) 
    144158        soapFault.serialize(sw) 
    145         environ[cls.soapFaultSetKey] = 'True' 
     159        environ[SOAPMiddleware.soapFaultSetKey] = 'True' 
    146160        return sw 
    147161     
    148     pathMatch = lambda self,environ:environ['PATH_INFO']==self.app_conf['path'] 
     162    pathMatch = lambda self, environ:environ['PATH_INFO'] == self.app_conf['path'] 
    149163         
    150164    @staticmethod 
     
    163177        return bool(environ.get(cls.soapFaultSetKey, False)) == True 
    164178     
    165     @classmethod 
    166     def parseRequest(cls, environ): 
     179    def parseRequest(self, environ): 
    167180        '''Parse SOAP message from environ['wsgi.input'] 
    168181         
     
    178191        # Check for ParsedSoap object set in environment, if not present, 
    179192        # make one 
    180         ps = environ.get(cls.parsedSOAPKey) 
     193        ps = environ.get(SOAPMiddleware.parsedSOAPKey) 
    181194        if ps is None: 
    182195            # TODO: allow for chunked data 
     
    188201                                              (contentLength, len(soapIn))) 
    189202             
    190             log.debug("SOAP Request for handler %r" % cls) 
    191             log.debug("_"*80) 
     203            log.debug("SOAP Request for handler %r" % SOAPMiddleware) 
     204            log.debug("_" * 80) 
    192205            log.debug(soapIn) 
    193             log.debug("_"*80) 
    194              
    195             ps = ParsedSoap(soapIn) 
    196             environ[cls.parsedSOAPKey] = ps 
    197              
    198         return environ[cls.parsedSOAPKey] 
     206            log.debug("_" * 80) 
     207             
     208            ps = ParsedSoap(soapIn, readerclass=self.readerclass) 
     209            environ[SOAPMiddleware.parsedSOAPKey] = ps 
     210             
     211        return environ[SOAPMiddleware.parsedSOAPKey] 
    199212 
    200213 
     
    221234                 
    222235        log.debug("SOAP Response for handler %r" % self.__class__) 
    223         log.debug("_"*80) 
     236        log.debug("_" * 80) 
    224237        log.debug(soapOut) 
    225         log.debug("_"*80) 
     238        log.debug("_" * 80) 
    226239        start_response(errorCode, 
    227                        [('content-type', 'text/xml'+charset), 
     240                       [('content-type', 'text/xml' + charset), 
    228241                        ('content-length', str(len(soapOut)))]) 
    229242        return soapOut 
     
    253266            if filterID in environ: 
    254267                raise SOAPMiddlewareConfigError("An filterID key '%s' is " 
    255                                                 "already set in environ" % 
     268                                                "already set in environ" %  
    256269                                                filterID) 
    257270            environ[filterID] = self 
     
    269282            modName, className = \ 
    270283                        self.app_conf['ServiceSOAPBindingClass'].rsplit('.', 1) 
    271              
    272             self.serviceSOAPBinding = instantiateClass(modName,  
    273                                    className,  
    274                                    objectType=ServiceSOAPBinding,  
     284 
     285            self.serviceSOAPBinding = instantiateClass(modName, 
     286                                   className, 
     287                                   objectType=ServiceSOAPBinding, 
    275288                                   classProperties=self.serviceSOAPBindingKw)             
    276289        else:  
     
    288301            return {} 
    289302         
    290         prefix = self.app_conf['ServiceSOAPBindingPropPrefix']+'.' 
     303        prefix = self.app_conf['ServiceSOAPBindingPropPrefix'] + '.' 
    291304        serviceSOAPBindingKw = dict([(k.replace(prefix, ''), v) \ 
    292                                      for k,v in self.app_conf.items() \ 
     305                                     for k, v in self.app_conf.items() \ 
    293306                                     if k.startswith(prefix)]) 
    294307        return serviceSOAPBindingKw 
     
    338351        else:  
    339352            # Serialize output using SOAP writer class 
    340             sw = SoapWriter() 
     353            sw = SoapWriter(outputclass=self.writerclass) 
    341354            sw.serialize(resp) 
    342355         
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/wssecurity.py

    r4840 r5060  
    1717 
    1818from ZSI.writer import SoapWriter 
    19 from ndg.security.common.wssecurity.dom import SignatureHandler 
     19from ndg.security.common.wssecurity.foursuite import SignatureHandler 
    2020from ndg.security.server.wsgi.soap import SOAPMiddleware, SOAPMiddlewareError 
    2121 
Note: See TracChangeset for help on using the changeset viewer.