Ignore:
Timestamp:
16/02/10 16:11:08 (11 years ago)
Author:
pjkersha
Message:
  • Important fix for SOAP client used with SAML SOAP binding: set text/xml content type.
  • Refactored SAML SOAP binding query clients.
File:
1 edited

Legend:

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

    r6572 r6578  
    5656    """ 
    5757    SUBJECT_ID_OPTNAME = 'subjectID' 
     58    SUBJECT_ID_FORMAT_OPTNAME = 'subjectIdFormat' 
    5859    ISSUER_NAME_OPTNAME = 'issuerName' 
    5960    ISSUER_FORMAT_OPTNAME = 'issuerFormat' 
    60     SUBJECT_ID_FORMAT_OPTNAME = 'subjectIdFormat' 
    6161    CLOCK_SKEW_OPTNAME = 'clockSkewTolerance' 
    6262    VERIFY_TIME_CONDITIONS_OPTNAME = 'verifyTimeConditions' 
     
    7272     
    7373    __PRIVATE_ATTR_PREFIX = "__" 
    74     __slots__ = tuple([__PRIVATE_ATTR_PREFIX + i for i in CONFIG_FILE_OPTNAMES]) 
     74    __slots__ = tuple([__PRIVATE_ATTR_PREFIX + i  
     75                       for i in CONFIG_FILE_OPTNAMES + ('query', )]) 
    7576    del i 
    7677     
     78    QUERY_TYPE = SubjectQuery 
     79     
    7780    def __init__(self, **kw): 
    78         '''Create SOAP Client for SAML Attribute Query''' 
    79         self.__issuerName = None 
    80         self.__issuerFormat = Issuer.X509_SUBJECT 
    81         self.__subjectID = None 
    82         self.__subjectIdFormat = NameID.UNSPECIFIED 
     81        '''Create SOAP Client for SAML Subject Query'''        
    8382        self.__clockSkewTolerance = timedelta(seconds=0.) 
    8483        self.__verifyTimeConditions = True 
    8584         
     85        self._initQuery() 
     86         
    8687        super(SubjectQuerySOAPBinding, self).__init__(**kw) 
    8788 
    88     def _getNameIdFormat(self): 
    89         return self.__subjectIdFormat 
    90  
    91     def _setNameIdFormat(self, value): 
    92         self.__subjectIdFormat = value 
    93  
    94     subjectIdFormat = property(_getNameIdFormat, _setNameIdFormat,  
    95                             doc="Subject Name ID format") 
     89    def _initQuery(self): 
     90        """Initialise query settings""" 
     91        self.__query = self.__class__.QUERY_TYPE() 
     92        self.__query.version = SAMLVersion(SAMLVersion.VERSION_20) 
     93        self.__query.id = str(uuid4()) 
     94         
     95        # These properties access the __query instance 
     96        self.issuerFormat = Issuer.X509_SUBJECT 
     97        self.subjectIdFormat = NameID.UNSPECIFIED 
     98 
     99    def _getQuery(self): 
     100        return self.__query 
     101 
     102    def _setQuery(self, value): 
     103        if not isinstance(value, self.__class__.QUERY_TYPE): 
     104            raise TypeError('Expecting %r query type got %r instead' % 
     105                            (self.__class__, type(value))) 
     106        self.__query = value 
     107 
     108    query = property(_getQuery, _setQuery,  
     109                     doc="SAML Subject Query or derived query type") 
     110 
     111    def _getSubjectID(self): 
     112        if self.__query.subject is None or self.__query.subject.nameID is None: 
     113            return None 
     114        else: 
     115            return self.__query.subject.nameID.value 
     116 
     117    def _setSubjectID(self, value): 
     118        if self.__query.subject is None: 
     119            self.__query.subject = Subject() 
     120             
     121        if self.__query.subject.nameID is None: 
     122            self.__query.subject.nameID = NameID() 
     123             
     124        self.__query.subject.nameID.value = value 
     125 
     126    subjectID = property(_getSubjectID, _setSubjectID,  
     127                         doc="ID to be sent as query subject") 
     128     
     129    def _getSubjectIdFormat(self): 
     130        if self.__query.subject is None or self.__query.subject.nameID is None: 
     131            return None 
     132        else: 
     133            return self.__query.subject.nameID.format 
     134 
     135    def _setSubjectIdFormat(self, value): 
     136        if self.__query.subject is None: 
     137            self.__query.subject = Subject() 
     138             
     139        if self.__query.subject.nameID is None: 
     140            self.__query.subject.nameID = NameID() 
     141             
     142        self.__query.subject.nameID.format = value 
     143 
     144    subjectIdFormat = property(_getSubjectIdFormat, _setSubjectIdFormat,  
     145                               doc="Subject Name ID format") 
    96146 
    97147    def _getIssuerFormat(self): 
    98         return self.__issuerFormat 
     148        if self.__query.issuer is None: 
     149            return None 
     150        else: 
     151            return self.__query.issuer.value 
    99152 
    100153    def _setIssuerFormat(self, value): 
    101         if not isinstance(value, basestring): 
    102             raise TypeError('Expecting string type for "issuerFormat"; got %r ' 
    103                             'instead' % type(value)) 
    104         self.__issuerFormat = value 
     154        if self.__query.issuer is None: 
     155            self.__query.issuer = Issuer() 
     156             
     157        self.__query.issuer.format = value 
    105158 
    106159    issuerFormat = property(_getIssuerFormat, _setIssuerFormat,  
    107160                            doc="Issuer format") 
     161 
     162    def _getIssuerName(self): 
     163        if self.__query.issuer is None: 
     164            return None 
     165        else: 
     166            return self.__query.issuer.value 
     167 
     168    def _setIssuerName(self, value): 
     169        if self.__query.issuer is None: 
     170            self.__query.issuer = Issuer() 
     171             
     172        self.__query.issuer.value = value 
     173 
     174    issuerName = property(_getIssuerName, _setIssuerName,  
     175                        doc="Distinguished Name of issuer of SAML Attribute " 
     176                            "Query to Attribute Authority") 
    108177 
    109178    def _getVerifyTimeConditions(self): 
     
    125194                                    doc='Set to True to verify any time ' 
    126195                                        'Conditions set in the returned ' 
    127                                         'response assertions') 
    128          
    129     def _getSubjectID(self): 
    130         return self.__subjectID 
    131  
    132     def _setSubjectID(self, value): 
    133         if not isinstance(value, basestring): 
    134             raise TypeError('Expecting string type for "subjectID"; got %r ' 
    135                             'instead' % type(value)) 
    136         self.__subjectID = value 
    137  
    138     subjectID = property(_getSubjectID, _setSubjectID,  
    139                          doc="ID to be sent as query subject")   
    140  
    141     def _getIssuerName(self): 
    142         return self.__issuerName 
    143  
    144     def _setIssuerName(self, value): 
    145         if not isinstance(value, basestring): 
    146             raise TypeError('Expecting string type for "issuerName"; ' 
    147                             'got %r instead' % type(value)) 
    148              
    149         self.__issuerName = value 
    150  
    151     issuerName = property(_getIssuerName, _setIssuerName,  
    152                         doc="Distinguished Name of issuer of SAML Attribute " 
    153                             "Query to Attribute Authority") 
     196                                        'response assertions')   
    154197 
    155198    def _getClockSkewTolerance(self): 
     
    172215                                      "assertion condition notBefore and " 
    173216                                      "notOnOrAfter times to allow for clock " 
    174                                       "skew")   
    175  
    176     def _createQuery(self, queryClass=SubjectQuery): 
    177         """ Create a SAML SubjectQuery derived type instance 
    178         @param queryClass: query type to create - must be  
    179         saml.saml2.core.SubjectQuery type 
    180         @type queryClass: type 
    181         @return: query instance 
    182         @rtype: saml.saml2.core.SubjectQuery 
    183         """ 
    184         if not issubclass(queryClass, SubjectQuery): 
    185             raise TypeError('Query class %r is not a SubjectQuery derived type' 
    186                             % queryClass) 
    187              
    188         query = queryClass() 
    189         query.version = SAMLVersion(SAMLVersion.VERSION_20) 
    190         query.id = str(uuid4()) 
    191         query.issueInstant = datetime.utcnow() 
    192          
     217                                      "skew") 
     218     
     219    def _validateQueryParameters(self): 
     220        """Perform sanity check immediately before creating the query and  
     221        sending it""" 
    193222        if self.issuerName is None: 
    194             raise AttributeError('No issuer DN has been set for SAML Query') 
    195          
    196         query.issuer = Issuer() 
    197         query.issuer.format = self.issuerFormat 
    198         query.issuer.value = self.issuerName 
    199                          
    200         query.subject = Subject()   
    201         query.subject.nameID = NameID() 
    202         query.subject.nameID.format = self.subjectIdFormat 
    203         query.subject.nameID.value = self.subjectID 
    204              
    205         return query 
     223            raise AttributeError('No issuer name has been set for SAML Query') 
     224 
     225        if self.issuerFormat is None: 
     226            raise AttributeError('No issuer format has been set for SAML Query') 
     227         
     228        if self.subjectID is None: 
     229            raise AttributeError('No subject has been set for SAML Query') 
     230         
     231        if self.subjectIdFormat is None: 
     232            raise AttributeError('No subject format has been set for SAML ' 
     233                                 'Query') 
     234 
     235    def _initSend(self): 
     236        """Perform any final initialisation prior to sending the query - derived 
     237        classes may overload to specify as required""" 
     238        self.__query.issueInstant = datetime.utcnow() 
    206239 
    207240    def send(self, **kw): 
     
    214247        defaults to ndg.security.common.soap.client.UrlLib2SOAPRequest 
    215248        ''' 
    216         query = self._createQuery() 
    217              
    218         response = super(SubjectQuerySOAPBinding, self).send(query, **kw) 
     249        self._validateQueryParameters()  
     250        self._initSend() 
     251            
     252        response = super(SubjectQuerySOAPBinding, self).send(self.query, **kw) 
    219253 
    220254        # Perform validation 
Note: See TracChangeset for help on using the changeset viewer.