Ignore:
Timestamp:
12/02/10 17:05:04 (11 years ago)
Author:
pjkersha
Message:
  • Refactored classfactory module as a more generic factory for importing any module object
  • Started unit tests with refactored SAML SOAP bindings.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/saml_utils/binding/soap/__init__.py

    r6567 r6570  
    1717from saml.common import SAMLObject 
    1818 
     19from ndg.security.common.utils.factory import importModuleObject 
    1920from ndg.security.common.utils.configfileparsers import ( 
    2021                                                    CaseSensitiveConfigParser) 
    21 from ndg.security.common.utils.etree import QName    
    22 from ndg.security.common.X509 import X500DN  
    2322from ndg.security.common.soap import SOAPEnvelopeBase 
    2423from ndg.security.common.soap.etree import SOAPEnvelope 
     
    4039class SOAPBinding(object): 
    4140    '''Client SAML SOAP Binding''' 
     41    REQUEST_ENVELOPE_CLASS_OPTNAME = 'requestEnvelopeClass' 
     42    RESPONSE_ENVELOPE_CLASS_OPTNAME = 'responseEnvelopeClass' 
     43    SERIALISE_OPTNAME = 'serialise' 
     44    DESERIALISE_OPTNAME = 'deserialise'   
     45     
     46    CONFIG_FILE_OPTNAMES = ( 
     47        REQUEST_ENVELOPE_CLASS_OPTNAME, 
     48        RESPONSE_ENVELOPE_CLASS_OPTNAME, 
     49        SERIALISE_OPTNAME, 
     50        DESERIALISE_OPTNAME 
     51    ) 
     52     
     53    __PRIVATE_ATTR_PREFIX = "__" 
     54    __slots__ = tuple([__PRIVATE_ATTR_PREFIX + i  
     55                       for i in CONFIG_FILE_OPTNAMES + ("__client",)]) 
     56    del i 
    4257     
    4358    isIterable = staticmethod(_isIterable) 
    44     __slots__ = ( 
    45         "__client", 
    46         "__requestEnvelopeClass", 
    47         "__serialise", 
    48         "__deserialise" 
    49     ) 
    5059     
    5160    def __init__(self,  
     
    5463                 serialise=None, 
    5564                 deserialise=None, 
    56                  handlers=(HTTPSHandler,)): 
     65                 handlers=()): 
    5766        '''Create SAML SOAP Client - Nb. serialisation functions must be set 
    5867        before send()ing the request''' 
     
    6978        self.client = UrlLib2SOAPClient() 
    7079         
    71         # ElementTree based envelope class 
     80        # Configurable envelope classes 
    7281        self.requestEnvelopeClass = requestEnvelopeClass 
    7382        self.client.responseEnvelopeClass = responseEnvelopeClass 
     
    8493 
    8594    def _setSerialise(self, value): 
    86         if not callable(value): 
     95        if isinstance(value, basestring): 
     96            self.__deserialise = importModuleObject(value) 
     97             
     98        elif callable(value): 
     99            self.__deserialise = value 
     100        else: 
    87101            raise TypeError('Expecting callable for "serialise"; got %r' %  
    88102                            value) 
     
    96110 
    97111    def _setDeserialise(self, value): 
    98         if not callable(value): 
     112        if isinstance(value, basestring): 
     113            self.__deserialise = importModuleObject(value) 
     114             
     115        elif callable(value): 
     116            self.__deserialise = value 
     117        else: 
    99118            raise TypeError('Expecting callable for "deserialise"; got %r' %  
    100119                            value) 
    101         self.__deserialise = value 
     120         
    102121 
    103122    deserialise = property(_getDeserialise,  
     
    110129 
    111130    def _setRequestEnvelopeClass(self, value): 
    112         if not issubclass(value, SOAPEnvelopeBase): 
    113             raise TypeError('Expecting %r for "requestEnvelopeClass"; got %r' %  
     131        if isinstance(value, basestring): 
     132            self.client.responseEnvelopeClass = importClass(value) 
     133             
     134        elif issubclass(value, SOAPEnvelopeBase): 
     135            self.client.responseEnvelopeClass = value 
     136        else: 
     137            raise TypeError('Expecting %r derived type or string for ' 
     138                            '"requestEnvelopeClass" attribute; got %r' %  
    114139                            (SOAPEnvelopeBase, value)) 
    115140         
     
    173198            raise SOAPBindingInvalidResponse("Expecting single child element " 
    174199                                             "is SOAP body") 
    175              
    176         if QName.getLocalPart(response.envelope.body.elem[0].tag)!='Response': 
    177             raise SOAPBindingInvalidResponse('Expecting "Response" element in ' 
    178                                              'SOAP body') 
    179200             
    180201        response = self.deserialise(response.envelope.body.elem[0]) 
     
    225246                # No prefix set - attempt to set all attributes    
    226247                setattr(self, optName, val) 
    227          
     248                 
     249    def __setattr__(self, name, value): 
     250        """Enable setting of SOAPBinding.client.responseEnvelopeClass as if it 
     251        were an attribute of self 
     252        """ 
     253        try: 
     254            super(SOAPBinding, self).__setattr__(name, value) 
     255             
     256        except AttributeError: 
     257            if 'name' == SOAPBinding.RESPONSE_ENVELOPE_CLASS_OPTNAME: 
     258                if isinstance(value, basestring): 
     259                    self.client.responseEnvelopeClass = importClass(value) 
     260                elif issubclass(value, SOAPEnvelopeBase): 
     261                    self.client.responseEnvelopeClass = value 
     262                else: 
     263                    raise TypeError('Expecting string or type instance for %r; ' 
     264                                    'got %r instead.' % (name, type(value))) 
     265            else: 
     266                raise 
     267                     
    228268    def __getstate__(self): 
    229269        '''Explicit implementation needed with __slots__''' 
Note: See TracChangeset for help on using the changeset viewer.