source: TI12-security/trunk/ndg_security_saml/saml/saml2/core.py @ 6558

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/ndg_security_saml/saml/saml2/core.py@6558
Revision 6558, 93.4 KB checked in by pjkersha, 11 years ago (diff)

Working serialised Response with AuthzDecisionStatement? in unit tests.

Line 
1"""SAML 2.0 core module
2
3Implementation of SAML 2.0 for NDG Security
4
5NERC DataGrid Project
6
7This implementation is adapted from the Java OpenSAML implementation.  The
8copyright and licence information are included here:
9
10Copyright [2005] [University Corporation for Advanced Internet Development, Inc.]
11
12Licensed under the Apache License, Version 2.0 (the "License");
13you may not use this file except in compliance with the License.
14You may obtain a copy of the License at
15
16http://www.apache.org/licenses/LICENSE-2.0
17
18Unless required by applicable law or agreed to in writing, software
19distributed under the License is distributed on an "AS IS" BASIS,
20WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21See the License for the specific language governing permissions and
22limitations under the License.
23"""
24__author__ = "P J Kershaw"
25__date__ = "11/08/09"
26__copyright__ = "(C) 2009 Science and Technology Facilities Council"
27__contact__ = "Philip.Kershaw@stfc.ac.uk"
28__license__ = "BSD - see LICENSE file in top-level directory"
29__contact__ = "Philip.Kershaw@stfc.ac.uk"
30__revision__ = "$Id: $"
31from datetime import datetime
32from urlparse import urlsplit, urlunsplit
33import urllib
34
35from saml.common import SAMLObject, SAMLVersion
36from saml.common.xml import SAMLConstants, QName
37from saml.utils import TypedList
38
39
40class Attribute(SAMLObject):
41    '''SAML 2.0 Core Attribute.'''
42   
43    # Local name of the Attribute element.
44    DEFAULT_ELEMENT_LOCAL_NAME = "Attribute"
45
46    # Default element name.
47    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
48                                 DEFAULT_ELEMENT_LOCAL_NAME,
49                                 SAMLConstants.SAML20_PREFIX)
50
51    # Local name of the XSI type.
52    TYPE_LOCAL_NAME = "AttributeType"
53
54    # QName of the XSI type.
55    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
56                      TYPE_LOCAL_NAME,
57                      SAMLConstants.SAML20_PREFIX)
58
59    # Name of the Name attribute.
60    NAME_ATTRIB_NAME = "Name"
61
62    # Name for the NameFormat attribute.
63    NAME_FORMAT_ATTRIB_NAME = "NameFormat"
64
65    # Name of the FriendlyName attribute.
66    FRIENDLY_NAME_ATTRIB_NAME = "FriendlyName"
67
68    # Unspecified attribute format ID.
69    UNSPECIFIED = "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"
70
71    # URI reference attribute format ID.
72    URI_REFERENCE = "urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
73
74    # Basic attribute format ID.
75    BASIC = "urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
76
77    __slots__ = (
78        '__name',
79        '__nameFormat',
80        '__friendlyName',
81        '__attributeValues'
82    )
83   
84    def __init__(self, **kw):
85        """Initialise Attribute Class attributes"""
86        super(Attribute, self).__init__(**kw)
87       
88        self.__name = None
89        self.__nameFormat = None
90        self.__friendlyName = None
91        self.__attributeValues = []
92
93    def _get_name(self):
94        return self.__name
95   
96    def _set_name(self, name):
97        if not isinstance(name, basestring):
98            raise TypeError("Expecting basestring type for name, got %r"% name)
99       
100        self.__name = name
101       
102    name = property(fget=_get_name,
103                    fset=_set_name,
104                    doc="name of this attribute")
105   
106    def _get_nameFormat(self):
107        return self.__nameFormat
108   
109    def _set_nameFormat(self, nameFormat):
110        if not isinstance(nameFormat, basestring):
111            raise TypeError("Expecting basestring type for nameFormat, got %r"
112                            % nameFormat)
113           
114        self.__nameFormat = nameFormat
115       
116    nameFormat = property(fget=_get_nameFormat,
117                          fset=_set_nameFormat,
118                          doc="Get the name format of this attribute.")
119   
120    def _get_friendlyName(self):
121        return self.__friendlyName
122   
123    def _set_friendlyName(self, friendlyName):
124        if not isinstance(friendlyName, basestring):
125            raise TypeError("Expecting basestring type for friendlyName, got "
126                            "%r" % friendlyName)
127           
128        self.__friendlyName = friendlyName
129       
130    friendlyName = property(fget=_get_friendlyName,
131                            fset=_set_friendlyName,
132                            doc="the friendly name of this attribute.")
133   
134    def _get_attributeValues(self):
135        return self.__attributeValues
136   
137    def _set_attributeValues(self, attributeValues):
138        if not isinstance(attributeValues, (list, tuple)):
139            raise TypeError("Expecting basestring type for attributeValues, "
140                            "got %r" % attributeValues)
141           
142        self.__attributeValues = attributeValues
143       
144    attributeValues = property(fget=_get_attributeValues,
145                               fset=_set_attributeValues,
146                               doc="the list of attribute values for this "
147                               "attribute.")
148
149
150class Statement(SAMLObject):
151    '''SAML 2.0 Core Statement.  Abstract base class which all statement
152    types must implement.'''
153    __slots__ = ()
154   
155    # Element local name
156    DEFAULT_ELEMENT_LOCAL_NAME = "Statement"
157
158    # Default element name
159    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
160                                 DEFAULT_ELEMENT_LOCAL_NAME,
161                                 SAMLConstants.SAML20_PREFIX)
162
163    # Local name of the XSI type
164    TYPE_LOCAL_NAME = "StatementAbstractType"
165
166    # QName of the XSI type
167    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
168                      TYPE_LOCAL_NAME,
169                      SAMLConstants.SAML20_PREFIX)
170   
171           
172class AttributeStatement(Statement):
173    '''SAML 2.0 Core AttributeStatement'''
174    __slots__ = ('__attributes', '__encryptedAttributes')
175   
176    def __init__(self, **kw):
177        super(AttributeStatement, self).__init__(**kw)
178       
179        self.__attributes = TypedList(Attribute)
180        self.__encryptedAttributes = TypedList(Attribute)
181
182    # Element local name
183    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeStatement"
184   
185    # Default element name.
186    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
187                                 DEFAULT_ELEMENT_LOCAL_NAME, 
188                                 SAMLConstants.SAML20_PREFIX)
189   
190    # Local name of the XSI type.
191    TYPE_LOCAL_NAME = "AttributeStatementType" 
192       
193    # QName of the XSI type.
194    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
195                      TYPE_LOCAL_NAME, 
196                      SAMLConstants.SAML20_PREFIX)
197
198    def _get_attributes(self):
199        '''@return: the attributes expressed in this statement
200        '''
201        return self.__attributes
202
203    attributes = property(fget=_get_attributes)
204   
205    def _get_encryptedAttributes(self):
206       '''@return: the encrypted attribtues expressed in this statement
207       '''
208       return self.__encryptedAttributes
209   
210    encryptedAttributes = property(fget=_get_encryptedAttributes)
211
212
213class AuthnStatement(Statement):
214    '''SAML 2.0 Core AuthnStatement.  Currently implemented in abstract form
215    only
216    '''
217
218    # Element local name
219    DEFAULT_ELEMENT_LOCAL_NAME = "AuthnStatement"
220
221    # Default element name
222    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
223                                 DEFAULT_ELEMENT_LOCAL_NAME,
224                                 SAMLConstants.SAML20_PREFIX)
225
226    # Local name of the XSI type
227    TYPE_LOCAL_NAME = "AuthnStatementType"
228
229    # QName of the XSI type
230    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
231                      TYPE_LOCAL_NAME,
232                      SAMLConstants.SAML20_PREFIX)
233
234    # AuthnInstant attribute name
235    AUTHN_INSTANT_ATTRIB_NAME = "AuthnInstant"
236
237    # SessionIndex attribute name
238    SESSION_INDEX_ATTRIB_NAME = "SessionIndex"
239
240    # SessionNoOnOrAfter attribute name
241    SESSION_NOT_ON_OR_AFTER_ATTRIB_NAME = "SessionNotOnOrAfter"
242
243    def _getAuthnInstant(self):
244        '''Gets the time when the authentication took place.
245       
246        @return: the time when the authentication took place
247        '''
248        raise NotImplementedError()
249
250    def _setAuthnInstant(self, value):
251        '''Sets the time when the authentication took place.
252       
253        @param value: the time when the authentication took place
254        '''
255        raise NotImplementedError()
256
257    def _getSessionIndex(self):
258        '''Get the session index between the principal and the authenticating
259        authority.
260       
261        @return: the session index between the principal and the authenticating
262        authority
263        '''
264        raise NotImplementedError()
265
266    def _setSessionIndex(self, value):
267        '''Sets the session index between the principal and the authenticating
268        authority.
269       
270        @param value: the session index between the principal and the
271        authenticating authority
272        '''
273        raise NotImplementedError()
274
275    def _getSessionNotOnOrAfter(self):
276        '''Get the time when the session between the principal and the SAML
277        authority ends.
278       
279        @return: the time when the session between the principal and the SAML
280        authority ends
281        '''
282        raise NotImplementedError()
283
284    def _setSessionNotOnOrAfter(self, value):
285        '''Set the time when the session between the principal and the SAML
286        authority ends.
287       
288        @param value: the time when the session between the
289        principal and the SAML authority ends
290        '''
291        raise NotImplementedError()
292
293    def _getSubjectLocality(self):
294        '''Get the DNS domain and IP address of the system where the principal
295        was authenticated.
296       
297        @return: the DNS domain and IP address of the system where the principal
298        was authenticated
299        '''
300        raise NotImplementedError()
301
302    def _setSubjectLocality(self, value):
303        '''Set the DNS domain and IP address of the system where the principal
304        was authenticated.
305       
306        @param value: the DNS domain and IP address of the system where
307        the principal was authenticated
308        '''
309        raise NotImplementedError()
310
311    def _getAuthnContext(self):
312        '''Gets the context used to authenticate the subject.
313       
314        @return: the context used to authenticate the subject
315        '''
316        raise NotImplementedError()
317
318    def _setAuthnContext(self, value):
319        '''Sets the context used to authenticate the subject.
320       
321        @param value: the context used to authenticate the subject
322        '''
323        raise NotImplementedError()
324
325
326class DecisionType(object):
327    """Define decision types for the authorisation decisions"""
328   
329    # "Permit" decision type
330    PERMIT_STR = "Permit"
331   
332    # "Deny" decision type
333    DENY_STR = "Deny"
334   
335    # "Indeterminate" decision type
336    INDETERMINATE_STR = "Indeterminate"
337       
338    TYPES = (PERMIT_STR, DENY_STR, INDETERMINATE_STR)
339   
340    __slots__ = ('__value',)
341   
342    def __init__(self, decisionType):
343        self.__value = None
344        self.value = decisionType
345
346    def _setValue(self, value):
347        if not isinstance(value, basestring):
348            raise TypeError('Expecting string type for "value" attribute; got '
349                            '%r instead' % type(value))
350           
351        if value not in DecisionType.TYPES:
352            raise AttributeError('Permissable decision types are %r; got %r '
353                                 'instead' % (DecisionType.TYPES, value))
354        self.__value = value
355       
356    def _getValue(self):
357        return self.__value
358   
359    value = property(fget=_getValue, fset=_setValue, doc="Decision value")
360   
361    def __str__(self):
362        return self.__value
363
364    def __eq__(self, decision):
365        return self.__value == decision.value
366
367
368class PermitDecisionType(DecisionType):
369    """Permit authorisation Decision"""
370    def __init__(self):
371        super(PermitDecisionType, self).__init__(DecisionType.PERMIT_STR)
372       
373    def _setValue(self): 
374        raise AttributeError("can't set attribute")
375
376
377class DenyDecisionType(DecisionType):
378    """Deny authorisation Decision"""
379    def __init__(self):
380        super(DenyDecisionType, self).__init__(DecisionType.DENY_STR)
381       
382    def _setValue(self, value): 
383        raise AttributeError("can't set attribute")
384
385
386class IndeterminateDecisionType(DecisionType):
387    """Indeterminate authorisation Decision"""
388    def __init__(self):
389        super(IndeterminateDecisionType, self).__init__(
390                                            DecisionType.INDETERMINATE_STR)
391       
392    def _setValue(self, value): 
393        raise AttributeError("can't set attribute")
394
395# Add instances of each for convenience
396DecisionType.PERMIT = PermitDecisionType()
397DecisionType.DENY = DenyDecisionType()
398DecisionType.INDETERMINATE = IndeterminateDecisionType()
399
400
401class AuthzDecisionStatement(Statement):
402    '''SAML 2.0 Core AuthzDecisionStatement.  Currently implemented in abstract
403    form only'''
404   
405    # Element local name
406    DEFAULT_ELEMENT_LOCAL_NAME = "AuthzDecisionStatement"
407
408    # Default element name
409    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
410                                 DEFAULT_ELEMENT_LOCAL_NAME,
411                                 SAMLConstants.SAML20_PREFIX)
412
413    # Local name of the XSI type
414    TYPE_LOCAL_NAME = "AuthzDecisionStatementType"
415
416    # QName of the XSI type
417    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
418                      TYPE_LOCAL_NAME,
419                      SAMLConstants.SAML20_PREFIX)
420
421    # Resource attribute name
422    RESOURCE_ATTRIB_NAME = "Resource"
423
424    # Decision attribute name
425    DECISION_ATTRIB_NAME = "Decision"
426   
427    def __init__(self, 
428                 normalizeResource=True, 
429                 safeNormalizationChars='/%',
430                 **kw):
431        '''Create new authorisation decision statement
432        '''
433        super(AuthzDecisionStatement, self).__init__(**kw)
434
435        # Resource attribute value.
436        self.__resource = None 
437       
438        self.__decision = DecisionType.INDETERMINATE   
439        self.__actions = TypedList(Action)
440        self.__evidence = None
441       
442        # Tuning for normalization of resource URIs in property set method
443        self.normalizeResource = normalizeResource
444        self.safeNormalizationChars = safeNormalizationChars
445
446    def _getNormalizeResource(self):
447        return self.__normalizeResource
448
449    def _setNormalizeResource(self, value):
450        if not isinstance(value, bool):
451            raise TypeError('Expecting bool type for "normalizeResource" '
452                            'attribute; got %r instead' % type(value))
453           
454        self.__normalizeResource = value
455
456    normalizeResource = property(_getNormalizeResource, 
457                                 _setNormalizeResource, 
458                                 doc="Flag to normalize new resource value "
459                                     "assigned to the \"resource\" property.  "
460                                     "The setting only applies for URIs "
461                                     'beginning with "http://" or "https://"')
462
463    def _getSafeNormalizationChars(self):
464        return self.__safeNormalizationChars
465
466    def _setSafeNormalizationChars(self, value):
467        if not isinstance(value, basestring):
468            raise TypeError('Expecting string type for "normalizeResource" '
469                            'attribute; got %r instead' % type(value))
470           
471        self.__safeNormalizationChars = value
472
473    safeNormalizationChars = property(_getSafeNormalizationChars, 
474                                      _setSafeNormalizationChars, 
475                                      doc="String containing a list of "
476                                          "characters that should not be "
477                                          "converted when Normalizing the "
478                                          "resource URI.  These are passed to "
479                                          "urllib.quote when the resource "
480                                          "property is set.  The default "
481                                          "characters are '/%'")
482
483    def _getResource(self):
484        '''Gets the Resource attrib value of this query.
485
486        @return: the Resource attrib value of this query'''
487        return self.__resource
488   
489    def _setResource(self, value):
490        '''Sets the Resource attrib value of this query normalizing the path
491        component, removing spurious port numbers (80 for HTTP and 443 for
492        HTTPS) and converting the host component to lower case.
493       
494        @param value: the new Resource attrib value of this query'''
495        if not isinstance(value, basestring):
496            raise TypeError('Expecting string type for "resource" attribute; '
497                            'got %r instead' % type(value))
498       
499        if (self.normalizeResource and 
500            value.startswith('http://') or value.startswith('https://')):
501            # Normalise the path, set the host name to lower case and remove
502            # port redundant numbers 80 and 443
503            splitResult = urlsplit(value)
504            uriComponents = list(splitResult)
505           
506            # hostname attribute is lowercase
507            uriComponents[1] = splitResult.hostname
508           
509            if splitResult.port is not None:
510                isHttpWithStdPort = (splitResult.port == 80 and 
511                                     splitResult.scheme == 'http')
512               
513                isHttpsWithStdPort = (splitResult.port == 443 and
514                                      splitResult.scheme == 'https')
515               
516                if not isHttpWithStdPort and not isHttpsWithStdPort:
517                    uriComponents[1] += ":%d" % splitResult.port
518           
519            uriComponents[2] = urllib.quote(splitResult.path, 
520                                            self.safeNormalizationChars)
521           
522            self.__resource = urlunsplit(uriComponents)
523        else:
524            self.__resource = value
525   
526    resource = property(fget=_getResource, fset=_setResource,
527                        doc="Resource for which authorisation was requested")
528
529    def _getDecision(self):
530        '''
531        Gets the decision of the authorization request.
532       
533        @return: the decision of the authorization request
534        '''
535        return self.__decision
536
537    def _setDecision(self, value):
538        '''
539        Sets the decision of the authorization request.
540       
541        @param value: the decision of the authorization request
542        '''
543        if not isinstance(value, DecisionType):
544            raise TypeError('Expecting %r type for "decision" attribute; '
545                            'got %r instead' % (DecisionType, type(value)))
546        self.__decision = value
547
548    decision = property(_getDecision, _setDecision, 
549                        doc="Authorization decision as a DecisionType instance")
550   
551    @property
552    def actions(self):
553        '''The actions for which authorisation is requested
554       
555        @return: the Actions of this statement'''
556        return self.__actions
557   
558    def _getEvidence(self):
559        '''Gets the Evidence of this statement.
560
561        @return: the Evidence of this statement'''
562        return self.__evidence
563
564    def _setEvidence(self, value):
565        '''Sets the Evidence of this query.
566        @param newEvidence: the new Evidence of this statement''' 
567        if not isinstance(value, Evidence):
568            raise TypeError('Expecting Evidence type for "evidence" '
569                            'attribute; got %r' % type(value))
570
571        self.__evidence = value 
572
573    evidence = property(fget=_getEvidence, fset=_setEvidence, 
574                        doc="A set of assertions which the Authority may use "
575                            "to base its authorisation decision on")
576   
577    def getOrderedChildren(self):
578        children = []
579
580        superChildren = super(AuthzDecisionStatement, self).getOrderedChildren()
581        if superChildren:
582            children.extend(superChildren)
583
584        children.extend(self.__actions)
585       
586        if self.__evidence is not None:
587            children.extend(self.__evidence)
588
589        if len(children) == 0:
590            return None
591
592        return tuple(children)
593       
594
595class Subject(SAMLObject):
596    '''Concrete implementation of @link org.opensaml.saml2.core.Subject.'''
597   
598    # Element local name.
599    DEFAULT_ELEMENT_LOCAL_NAME = "Subject"
600
601    # Default element name.
602    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
603                                 DEFAULT_ELEMENT_LOCAL_NAME,
604                                 SAMLConstants.SAML20_PREFIX)
605
606    # Local name of the XSI type.
607    TYPE_LOCAL_NAME = "SubjectType"
608
609    # QName of the XSI type.
610    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
611                      TYPE_LOCAL_NAME,
612                      SAMLConstants.SAML20_PREFIX)
613    __slots__ = (
614        '__qname',
615        '__baseID',
616        '__nameID',
617        '__encryptedID',
618        '__subjectConfirmations'
619    )
620   
621    def __init__(self, **kw):
622        super(Subject, self).__init__(**kw)
623       
624        # BaseID child element.
625        self.__baseID = None
626   
627        # NameID child element.
628        self.__nameID = None
629   
630        # EncryptedID child element.
631        self.__encryptedID = None
632   
633        # Subject Confirmations of the Subject.
634        self.__subjectConfirmations = []
635   
636    def _getBaseID(self): 
637        return self.__baseID
638
639    def _setBaseID(self, value):
640        if not isinstance(value, basestring):
641            raise TypeError("Expecting %r type for \"baseID\" got %r" %
642                            (basestring, value.__class__))
643        self.__baseID = value
644
645    baseID = property(fget=_getBaseID, 
646                      fset=_setBaseID, 
647                      doc="Base identifier")
648     
649    def _getNameID(self):
650        return self.__nameID
651   
652    def _setNameID(self, value):
653        if not isinstance(value, NameID):
654            raise TypeError("Expecting %r type for \"nameID\" got %r" %
655                            (NameID, type(value)))
656        self.__nameID = value
657
658    nameID = property(fget=_getNameID, 
659                      fset=_setNameID, 
660                      doc="Name identifier")
661   
662    def _getEncryptedID(self):
663        return self.__encryptedID
664   
665    def _setEncryptedID(self, value): 
666        self.__encryptedID = value
667
668    encryptedID = property(fget=_getEncryptedID, 
669                           fset=_setEncryptedID, 
670                           doc="EncryptedID's Docstring")
671   
672    def _getSubjectConfirmations(self): 
673        return self.__subjectConfirmations
674
675    subjectConfirmations = property(fget=_getSubjectConfirmations, 
676                                    doc="Subject Confirmations")   
677   
678    def getOrderedChildren(self): 
679        children = []
680
681        if self.baseID is not None:
682            children.append(self.baseID)
683       
684        if self.nameID is not None: 
685            children.append(self.nameID)
686       
687        if self.encryptedID is not None: 
688            children.append(self.encryptedID)
689       
690        children += self.subjectConfirmations
691
692        return tuple(children)
693
694
695class AbstractNameIDType(SAMLObject):
696    '''Abstract implementation of NameIDType'''
697
698    # SPNameQualifier attribute name.
699    SP_NAME_QUALIFIER_ATTRIB_NAME = "SPNameQualifier"
700
701    # Format attribute name.
702    FORMAT_ATTRIB_NAME = "Format"
703
704    # SPProviderID attribute name.
705    SPPROVIDED_ID_ATTRIB_NAME = "SPProvidedID"
706
707    # URI for unspecified name format.
708    UNSPECIFIED = "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
709
710    # URI for email name format.
711    EMAIL = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
712
713    # URI for X509 subject name format.
714    X509_SUBJECT = "urn:oasis:names:tc:SAML:1.1:nameid-format:x509SubjectName"
715
716    # URI for windows domain qualified name name format.
717    WIN_DOMAIN_QUALIFIED = \
718        "urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName"
719
720    # URI for kerberos name format.
721    KERBEROS = "urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos"
722
723    # URI for SAML entity name format.
724    ENTITY = "urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
725
726    # URI for persistent name format.
727    PERSISTENT = "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
728
729    # URI for transient name format.
730    TRANSIENT = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
731
732    # Special URI used by NameIDPolicy to indicate a NameID should be encrypted
733    ENCRYPTED = "urn:oasis:names:tc:SAML:2.0:nameid-format:encrypted"
734   
735    __slots__ = (
736        '__qname',
737        '__name',
738        '__nameQualifier',
739        '__spNameQualifier',
740        '__format',
741        '__spProvidedID',
742        '__value'
743    )
744   
745    def __init__(self, namespaceURI, elementLocalName, namespacePrefix): 
746        '''@param namespaceURI: the namespace the element is in
747        @param elementLocalName: the local name of the XML element this Object
748        represents
749        @param namespacePrefix: the prefix for the given namespace
750        '''
751        self.__qname = QName(namespaceURI, elementLocalName, namespacePrefix)
752   
753        # Name of the Name ID.
754        self.__name = None
755       
756        # Name Qualifier of the Name ID.
757        self.__nameQualifier = None
758   
759        # SP Name Qualifier of the Name ID.
760        self.__spNameQualifier = None
761   
762        # Format of the Name ID.
763        self.__format = None
764   
765        # SP ProvidedID of the NameID.
766        self.__spProvidedID = None
767
768        self.__value = None
769       
770    def _getQName(self):
771        return self.__qname
772       
773    def _setQName(self, value):
774        if not isinstance(value, QName):
775            raise TypeError("\"qname\" must be a %r derived type, "
776                            "got %r" % (QName, type(value)))
777           
778        self.__qname = value
779
780    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
781             
782    def _getValue(self):
783        return self.__value
784       
785    def _setValue(self, value):
786        if not isinstance(value, basestring):
787            raise TypeError("\"value\" must be a basestring derived type, "
788                            "got %r" % value.__class__)
789           
790        self.__value = value
791
792    value = property(fget=_getValue, fset=_setValue, doc="string value") 
793   
794    def _getNameQualifier(self): 
795        return self.__nameQualifier
796   
797    def _setNameQualifier(self, value): 
798        self.__nameQualifier = value
799
800    nameQualifier = property(fget=_getNameQualifier, 
801                             fset=_setNameQualifier, 
802                             doc="Name qualifier")   
803
804    def _getSPNameQualifier(self): 
805        return self.__spNameQualifier
806   
807    def _setSPNameQualifier(self, value): 
808        self.__spNameQualifier = value
809
810    spNameQualifier = property(fget=_getSPNameQualifier, 
811                               fset=_setSPNameQualifier, 
812                               doc="SP Name qualifier")   
813   
814    def _getFormat(self):
815        return self.__format
816       
817    def _setFormat(self, format):
818        if not isinstance(format, basestring):
819            raise TypeError("\"format\" must be a basestring derived type, "
820                            "got %r" % format.__class__)
821           
822        self.__format = format
823
824    format = property(fget=_getFormat, fset=_setFormat, doc="Name format") 
825   
826    def _getSPProvidedID(self): 
827        return self.__spProvidedID
828   
829    def _setSPProvidedID(self, value): 
830        self.__spProvidedID = value
831
832    spProvidedID = property(fget=_getSPProvidedID, fset=_setSPProvidedID, 
833                            doc="SP Provided Identifier") 
834   
835    def getOrderedChildren(self): 
836        raise NotImplementedError()
837
838   
839class Issuer(AbstractNameIDType):
840    """SAML 2.0 Core Issuer type"""
841   
842    # Element local name.
843    DEFAULT_ELEMENT_LOCAL_NAME = "Issuer"
844
845    # Default element name.
846    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
847                                 DEFAULT_ELEMENT_LOCAL_NAME,
848                                 SAMLConstants.SAML20_PREFIX)
849
850    # Local name of the XSI type.
851    TYPE_LOCAL_NAME = "IssuerType"
852
853    # QName of the XSI type.
854    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
855                      TYPE_LOCAL_NAME,
856                      SAMLConstants.SAML20_PREFIX) 
857   
858    def __init__(self, 
859                 namespaceURI=SAMLConstants.SAML20_NS, 
860                 localPart=DEFAULT_ELEMENT_LOCAL_NAME, 
861                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
862        super(Issuer, self).__init__(namespaceURI,
863                                     localPart,
864                                     namespacePrefix)
865
866     
867class NameID(AbstractNameIDType):
868    '''SAML 2.0 Core NameID'''
869    # Element local name.
870    DEFAULT_ELEMENT_LOCAL_NAME = "NameID"
871
872    # Default element name.
873    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
874                                 DEFAULT_ELEMENT_LOCAL_NAME,
875                                 SAMLConstants.SAML20_PREFIX)
876
877    # Local name of the XSI type.
878    TYPE_LOCAL_NAME = "NameIDType"
879
880    # QName of the XSI type.
881    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
882                      TYPE_LOCAL_NAME,
883                      SAMLConstants.SAML20_PREFIX)
884   
885    __slots__ = ()
886   
887    def __init__(self, 
888                 namespaceURI=SAMLConstants.SAML20_NS, 
889                 localPart=DEFAULT_ELEMENT_LOCAL_NAME, 
890                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
891        super(NameID, self).__init__(namespaceURI,
892                                     localPart,
893                                     namespacePrefix)
894
895
896class Conditions(SAMLObject): 
897    '''SAML 2.0 Core Conditions.'''
898   
899    # Element local name.
900    DEFAULT_ELEMENT_LOCAL_NAME = "Conditions"
901
902    # Default element name.
903    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
904                                 DEFAULT_ELEMENT_LOCAL_NAME,
905                                 SAMLConstants.SAML20_PREFIX)
906
907    # Local name of the XSI type.
908    TYPE_LOCAL_NAME = "ConditionsType"
909
910    # QName of the XSI type.
911    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
912                      TYPE_LOCAL_NAME,
913                      SAMLConstants.SAML20_PREFIX)
914
915    # NotBefore attribute name.
916    NOT_BEFORE_ATTRIB_NAME = "NotBefore"
917
918    # NotOnOrAfter attribute name.
919    NOT_ON_OR_AFTER_ATTRIB_NAME = "NotOnOrAfter"
920
921    __slots__ = (
922        '__conditions',
923        '__notBefore',
924        '__notOnOrAfter'
925    )
926   
927    def __init__(self):
928       
929        # A Condition.
930        self.__conditions = []
931   
932        # Not Before conditions.
933        self.__notBefore = None
934   
935        # Not On Or After conditions.
936        self.__notOnOrAfter = None
937
938    def _getNotBefore(self):
939        '''Get the date/time before which the assertion is invalid.
940       
941        @return: the date/time before which the assertion is invalid'''
942        return self.__notBefore
943   
944    def _setNotBefore(self, value):
945        '''Sets the date/time before which the assertion is invalid.
946       
947        @param value: the date/time before which the assertion is invalid
948        '''
949        if not isinstance(value, datetime):
950            raise TypeError('Expecting "datetime" type for "notBefore", '
951                            'got %r' % type(value))
952        self.__notBefore = value
953
954    def _getNotOnOrAfter(self):
955        '''Gets the date/time on, or after, which the assertion is invalid.
956       
957        @return: the date/time on, or after, which the assertion is invalid'
958        '''
959        return self.__notBefore
960   
961    def _setNotOnOrAfter(self, value):
962        '''Sets the date/time on, or after, which the assertion is invalid.
963       
964        @param value: the date/time on, or after, which the assertion
965        is invalid
966        '''
967        if not isinstance(value, datetime):
968            raise TypeError('Expecting "datetime" type for "notOnOrAfter", '
969                            'got %r' % type(value))
970        self.__notOnOrAfter = value 
971
972    notBefore = property(_getNotBefore, _setNotBefore, 
973                         doc="Not before time restriction")
974
975    notOnOrAfter = property(_getNotOnOrAfter, _setNotOnOrAfter, 
976                            doc="Not on or after time restriction")
977
978    def _getConditions(self):
979        '''Gets all the conditions on the assertion.
980       
981        @return: all the conditions on the assertion
982        '''
983        return self.__conditions
984   
985    conditions = property(fget=_getConditions,
986                          doc="List of conditions")
987   
988    def _getAudienceRestrictions(self):
989        '''Gets the audience restriction conditions for the assertion.
990       
991        @return: the audience restriction conditions for the assertion
992        '''
993        raise NotImplementedError()
994
995    def _getOneTimeUse(self):
996        '''Gets the OneTimeUse condition for the assertion.
997       
998        @return: the OneTimeUse condition for the assertion
999        '''
1000        raise NotImplementedError()
1001
1002    def _getProxyRestriction(self):   
1003        '''Gets the ProxyRestriction condition for the assertion.
1004       
1005        @return: the ProxyRestriction condition for the assertion
1006        '''
1007        raise NotImplementedError()
1008   
1009   
1010class Advice(SAMLObject):
1011    '''SAML 2.0 Core Advice.
1012    '''
1013
1014    # Element local name
1015    DEFAULT_ELEMENT_LOCAL_NAME = "Advice"
1016
1017    # Default element name.
1018    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
1019                                 DEFAULT_ELEMENT_LOCAL_NAME,
1020                                 SAMLConstants.SAML20_PREFIX)
1021
1022    # Local name of the XSI type
1023    TYPE_LOCAL_NAME = "AdviceType"
1024
1025    # QName of the XSI type
1026    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
1027                      TYPE_LOCAL_NAME,
1028                      SAMLConstants.SAML20_PREFIX)
1029
1030    def _getChildren(self, typeOrName=None):
1031        '''
1032        Gets the list of all child elements attached to this advice.
1033       
1034        @return: the list of all child elements attached to this advice
1035        '''
1036        raise NotImplementedError()
1037
1038    def _getAssertionIDReferences(self):
1039        '''Gets the list of AssertionID references used as advice.
1040       
1041        @return: the list of AssertionID references used as advice
1042        '''
1043        raise NotImplementedError()
1044
1045    def _getAssertionURIReferences(self):
1046        '''Gets the list of AssertionURI references used as advice.
1047       
1048        @return: the list of AssertionURI references used as advice
1049        '''
1050        raise NotImplementedError()
1051   
1052    def _getAssertions(self):
1053        '''Gets the list of Assertions used as advice.
1054       
1055        @return: the list of Assertions used as advice
1056        '''
1057        raise NotImplementedError()
1058   
1059    def _getEncryptedAssertions(self):
1060        '''Gets the list of EncryptedAssertions used as advice.
1061       
1062        @return: the list of EncryptedAssertions used as advice
1063        '''
1064        raise NotImplementedError()
1065       
1066
1067class Assertion(SAMLObject):
1068    """SAML 2.0 Attribute Assertion for use with NERC DataGrid   
1069    """   
1070    ns = "urn:oasis:names:tc:SAML:1.0:assertion"
1071    nsPfx = "saml"
1072    issuer = 'http:#badc.nerc.ac.uk'
1073    attributeName = "urn:mace:dir:attribute-def:eduPersonAffiliation"
1074    attributeNS = "urn:mace:shibboleth:1.0:attributeNamespace:uri"
1075
1076    # Element local name.
1077    DEFAULT_ELEMENT_LOCAL_NAME = "Assertion"
1078
1079    # Default element name.
1080    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
1081                                 DEFAULT_ELEMENT_LOCAL_NAME,
1082                                 SAMLConstants.SAML20_PREFIX)
1083
1084    # Local name of the XSI type.
1085    TYPE_LOCAL_NAME = "AssertionType"
1086
1087    # QName of the XSI type.
1088    TYPE_NAME = QName(SAMLConstants.SAML20_NS, TYPE_LOCAL_NAME,
1089                      SAMLConstants.SAML20_PREFIX)
1090
1091    # Version attribute name.
1092    VERSION_ATTRIB_NAME = "Version"
1093
1094    # IssueInstant attribute name.
1095    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
1096
1097    # ID attribute name.
1098    ID_ATTRIB_NAME = "ID"
1099
1100    __slots__ = (
1101        '__version',
1102        '__issueInstant',
1103        '__id',
1104        '__issuer',
1105        '__subject',
1106        '__conditions',
1107        '__advice',
1108        '__statements',
1109        '__authnStatements',
1110        '__authzDecisionStatements',
1111        '__attributeStatements'
1112    )
1113   
1114    def __init__(self):
1115        # Base class initialisation
1116        super(Assertion, self).__init__()
1117       
1118        self.__version = None
1119        self.__issueInstant = None
1120        self.__id = None
1121        self.__issuer = None
1122        self.__subject = None
1123       
1124        self.__conditions = None
1125        self.__advice = None
1126        self.__statements = TypedList(Statement)
1127       
1128        # TODO: Implement AuthnStatement and AuthzDecisionStatement classes
1129        self.__authnStatements = []
1130        self.__authzDecisionStatements = TypedList(AuthzDecisionStatement)
1131        self.__attributeStatements = TypedList(AttributeStatement)
1132       
1133    def _get_version(self):
1134        '''@return: the SAML Version of this assertion.
1135        '''
1136        return self.__version
1137   
1138    def _set_version(self, version):
1139        '''@param version: the SAML Version of this assertion
1140        '''
1141        if not isinstance(version, SAMLVersion):
1142            raise TypeError("Expecting SAMLVersion type got: %r" % 
1143                            version.__class__)
1144       
1145        self.__version = version
1146       
1147    version = property(fget=_get_version,
1148                       fset=_set_version,
1149                       doc="SAML Version of the assertion")
1150
1151    def _get_issueInstant(self):
1152        '''Gets the issue instance of this assertion.
1153       
1154        @return: the issue instance of this assertion'''
1155        return self.__issueInstant
1156   
1157    def _set_issueInstant(self, issueInstant):
1158        '''Sets the issue instance of this assertion.
1159       
1160        @param issueInstant: the issue instance of this assertion
1161        '''
1162        if not isinstance(issueInstant, datetime):
1163            raise TypeError('Expecting "datetime" type for "issueInstant", '
1164                            'got %r' % issueInstant.__class__)
1165           
1166        self.__issueInstant = issueInstant
1167       
1168    issueInstant = property(fget=_get_issueInstant, 
1169                            fset=_set_issueInstant,
1170                            doc="Issue instant of the assertion")
1171
1172    def _get_id(self):
1173        '''Sets the ID of this assertion.
1174       
1175        @return: the ID of this assertion
1176        '''
1177        return self.__id
1178   
1179    def _set_id(self, _id):
1180        '''Sets the ID of this assertion.
1181       
1182        @param _id: the ID of this assertion
1183        '''
1184        if not isinstance(_id, basestring):
1185            raise TypeError('Expecting basestring derived type for "id", got '
1186                            '%r' % _id.__class__)
1187        self.__id = _id
1188       
1189    id = property(fget=_get_id, fset=_set_id, doc="ID of assertion")
1190   
1191    def _set_issuer(self, issuer):
1192        """Set issuer"""
1193        if not isinstance(issuer, Issuer):
1194            raise TypeError("issuer must be %r, got %r" % (Issuer, 
1195                                                           type(issuer)))
1196        self.__issuer = issuer
1197   
1198    def _get_issuer(self):
1199        """Get the issuer name """
1200        return self.__issuer
1201
1202    issuer = property(fget=_get_issuer, 
1203                      fset=_set_issuer,
1204                      doc="Issuer of assertion")
1205   
1206    def _set_subject(self, subject):
1207        """Set subject string."""
1208        if not isinstance(subject, Subject):
1209            raise TypeError("subject must be %r, got %r" % (Subject, 
1210                                                            type(subject)))
1211
1212        self.__subject = subject
1213   
1214    def _get_subject(self):
1215        """Get subject string."""
1216        return self.__subject
1217
1218    subject = property(fget=_get_subject,
1219                       fset=_set_subject, 
1220                       doc="Attribute Assertion subject")
1221   
1222    def _get_conditions(self):
1223        """Get conditions string."""
1224        return self.__conditions
1225   
1226    def _set_conditions(self, value):
1227        """Get conditions string."""
1228        if not isinstance(value, Conditions):
1229            raise TypeError("Conditions must be %r, got %r" % (Conditions, 
1230                                                               type(value)))
1231
1232        self.__conditions = value
1233
1234    conditions = property(fget=_get_conditions,
1235                          fset=_set_conditions,
1236                          doc="Attribute Assertion conditions")
1237   
1238    def _set_advice(self, advice):
1239        """Set advice string."""
1240        if not isinstance(advice, basestring):
1241            raise TypeError("advice must be a string")
1242
1243        self.__advice = advice
1244   
1245    def _get_advice(self):
1246        """Get advice string."""
1247        return self.__advice
1248
1249    advice = property(fget=_get_advice,
1250                      fset=_set_advice, 
1251                      doc="Attribute Assertion advice")
1252   
1253    @property
1254    def statements(self):
1255        """Attribute Assertion statements"""
1256        return self.__statements
1257   
1258    @property
1259    def authnStatements(self):
1260        """Attribute Assertion authentication"""
1261        return self.__authnStatements
1262   
1263    @property
1264    def authzDecisionStatements(self):
1265        """Attribute Assertion authorisation decision statements"""
1266        return self.__authzDecisionStatements
1267   
1268    @property
1269    def attributeStatements(self):
1270        """Attribute Assertion attribute statements"""
1271        return self.__attributeStatements
1272   
1273
1274class AttributeValue(SAMLObject):
1275    """Base class for Attribute Value type"""
1276   
1277    # Element name, no namespace
1278    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeValue"
1279
1280    # Default element name
1281    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
1282                                 DEFAULT_ELEMENT_LOCAL_NAME,
1283                                 SAMLConstants.SAML20_PREFIX)
1284    __slots__ = ()
1285
1286
1287class XSStringAttributeValue(AttributeValue):
1288    """XML XS:String Attribute Value type"""
1289   
1290    # Local name of the XSI type
1291    TYPE_LOCAL_NAME = "string"
1292       
1293    # QName of the XSI type
1294    TYPE_NAME = QName(SAMLConstants.XSD_NS, 
1295                      TYPE_LOCAL_NAME, 
1296                      SAMLConstants.XSD_PREFIX)
1297   
1298    DEFAULT_FORMAT = "%s#%s" % (SAMLConstants.XSD_NS, TYPE_LOCAL_NAME)
1299 
1300    __slots__ = ('__value',)
1301   
1302    def __init__(self):
1303        self.__value = None
1304       
1305    def _getValue(self):
1306        return self.__value
1307       
1308    def _setValue(self, value):
1309        if not isinstance(value, basestring):
1310            raise TypeError("Input must be a basestring derived type, got %r" %
1311                            value.__class__)
1312           
1313        self.__value = value
1314
1315    value = property(fget=_getValue, fset=_setValue, doc="string value") 
1316
1317
1318class StatusDetail(SAMLObject):
1319    '''Implementation of SAML 2.0 StatusDetail'''
1320   
1321    # Local Name of StatusDetail.
1322    DEFAULT_ELEMENT_LOCAL_NAME = "StatusDetail"
1323
1324    # Default element name.
1325    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1326                                 DEFAULT_ELEMENT_LOCAL_NAME,
1327                                 SAMLConstants.SAML20P_PREFIX)
1328
1329    # Local name of the XSI type.
1330    TYPE_LOCAL_NAME = "StatusDetailType"
1331
1332    # QName of the XSI type.
1333    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1334                      TYPE_LOCAL_NAME,
1335                      SAMLConstants.SAML20P_PREFIX)
1336   
1337    __slots__ = ('__unknownChildren', '__qname')
1338   
1339    def __init__(self):
1340        # child "any" elements.
1341        self.__unknownChildren = TypedList(SAMLObject)         
1342        self.__qname = QName(StatusDetail.DEFAULT_ELEMENT_NAME.namespaceURI,
1343                             StatusDetail.DEFAULT_ELEMENT_NAME,
1344                             StatusDetail.DEFAULT_ELEMENT_NAME.prefix)
1345   
1346    def getUnknownXMLTypes(self, qname=None): 
1347        if qname is not None:
1348            if not isinstance(qname, QName):
1349                raise TypeError("\"qname\" must be a %r derived type, "
1350                                "got %r" % (QName, type(qname)))
1351               
1352            children = []
1353            for child in self.__unknownChildren:
1354                childQName = getattr(child, "qname", None)
1355                if childQName is not None:
1356                    if childQName.namespaceURI == qname.namespaceURI or \
1357                       childQName.localPart == qname.localPart:
1358                        children.append(child)
1359                       
1360            return children
1361        else:
1362            return self.__unknownChildren
1363   
1364    unknownChildren = property(fget=getUnknownXMLTypes,
1365                               doc="Child objects of Status Detail - may be "
1366                                   "any type")
1367               
1368    def _getQName(self):
1369        return self.__qname
1370       
1371    def _setQName(self, value):
1372        if not isinstance(value, QName):
1373            raise TypeError("\"qname\" must be a %r derived type, "
1374                            "got %r" % (QName, type(value)))
1375           
1376        self.__qname = value
1377
1378    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1379   
1380
1381class StatusMessage(SAMLObject):
1382    '''Implementation of SAML 2.0 Status Message'''
1383
1384    DEFAULT_ELEMENT_LOCAL_NAME = "StatusMessage"
1385    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1386                                 DEFAULT_ELEMENT_LOCAL_NAME,
1387                                 SAMLConstants.SAML20P_PREFIX)
1388   
1389    __slots__ = ('__value', '__qname')
1390   
1391    def __init__(self):
1392        # Value attribute URI.
1393        self.__value = None       
1394        self.__qname = QName(StatusMessage.DEFAULT_ELEMENT_NAME.namespaceURI,
1395                             StatusMessage.DEFAULT_ELEMENT_NAME.localPart,
1396                             StatusMessage.DEFAULT_ELEMENT_NAME.prefix)
1397             
1398    def _getValue(self):
1399        return self.__value
1400       
1401    def _setValue(self, value):
1402        if not isinstance(value, basestring):
1403            raise TypeError("\"value\" must be a basestring derived type, "
1404                            "got %r" % type(value))
1405           
1406        self.__value = value
1407
1408    value = property(fget=_getValue, fset=_setValue, 
1409                     doc="Status message value")
1410               
1411    def _getQName(self):
1412        return self.__qname
1413       
1414    def _setQName(self, value):
1415        if not isinstance(value, QName):
1416            raise TypeError("\"qname\" must be a %r derived type, "
1417                            "got %r" % (QName, type(value)))
1418           
1419        self.__qname = value
1420
1421    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1422
1423
1424class StatusCode(SAMLObject):
1425    '''Implementation of SAML 2.0 StatusCode.'''
1426   
1427    # Local Name of StatusCode.
1428    DEFAULT_ELEMENT_LOCAL_NAME = "StatusCode"
1429
1430    # Default element name.
1431    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1432                                 DEFAULT_ELEMENT_LOCAL_NAME,
1433                                 SAMLConstants.SAML20P_PREFIX)
1434
1435    # Local name of the XSI type.
1436    TYPE_LOCAL_NAME = "StatusCodeType"
1437
1438    # QName of the XSI type.
1439    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1440                      TYPE_LOCAL_NAME,
1441                      SAMLConstants.SAML20P_PREFIX)
1442
1443    # Local Name of the Value attribute.
1444    VALUE_ATTRIB_NAME = "Value"
1445
1446    # URI for Success status code.
1447    SUCCESS_URI = "urn:oasis:names:tc:SAML:2.0:status:Success"
1448
1449    # URI for Requester status code.
1450    REQUESTER_URI = "urn:oasis:names:tc:SAML:2.0:status:Requester"
1451
1452    # URI for Responder status code.
1453    RESPONDER_URI = "urn:oasis:names:tc:SAML:2.0:status:Responder"
1454
1455    # URI for VersionMismatch status code.
1456    VERSION_MISMATCH_URI = "urn:oasis:names:tc:SAML:2.0:status:VersionMismatch"
1457
1458    # URI for AuthnFailed status code.
1459    AUTHN_FAILED_URI = "urn:oasis:names:tc:SAML:2.0:status:AuthnFailed"
1460
1461    # URI for InvalidAttrNameOrValue status code.
1462    INVALID_ATTR_NAME_VALUE_URI = \
1463                "urn:oasis:names:tc:SAML:2.0:status:InvalidAttrNameOrValue"
1464
1465    # URI for InvalidNameIDPolicy status code.
1466    INVALID_NAMEID_POLICY_URI = \
1467                "urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy"
1468
1469    # URI for NoAuthnContext status code.
1470    NO_AUTHN_CONTEXT_URI = "urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext"
1471
1472    # URI for NoAvailableIDP status code.
1473    NO_AVAILABLE_IDP_URI = "urn:oasis:names:tc:SAML:2.0:status:NoAvailableIDP"
1474
1475    # URI for NoPassive status code.
1476    NO_PASSIVE_URI = "urn:oasis:names:tc:SAML:2.0:status:NoPassive"
1477
1478    # URI for NoSupportedIDP status code.
1479    NO_SUPPORTED_IDP_URI = "urn:oasis:names:tc:SAML:2.0:status:NoSupportedIDP"
1480
1481    # URI for PartialLogout status code.
1482    PARTIAL_LOGOUT_URI = "urn:oasis:names:tc:SAML:2.0:status:PartialLogout"
1483
1484    # URI for ProxyCountExceeded status code.
1485    PROXY_COUNT_EXCEEDED_URI = \
1486                "urn:oasis:names:tc:SAML:2.0:status:ProxyCountExceeded"
1487
1488    # URI for RequestDenied status code.
1489    REQUEST_DENIED_URI = "urn:oasis:names:tc:SAML:2.0:status:RequestDenied"
1490
1491    # URI for RequestUnsupported status code.
1492    REQUEST_UNSUPPORTED_URI = \
1493                "urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported"
1494
1495    # URI for RequestVersionDeprecated status code.
1496    REQUEST_VERSION_DEPRECATED_URI = \
1497                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionDeprecated"
1498
1499    # URI for RequestVersionTooHigh status code.
1500    REQUEST_VERSION_TOO_HIGH_URI = \
1501                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooHigh"
1502   
1503    # URI for RequestVersionTooLow status code.
1504    REQUEST_VERSION_TOO_LOW_URI = \
1505                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooLow"
1506
1507    # URI for ResourceNotRecognized status code.
1508    RESOURCE_NOT_RECOGNIZED_URI = \
1509                "urn:oasis:names:tc:SAML:2.0:status:ResourceNotRecognized"
1510
1511    # URI for TooManyResponses status code.
1512    TOO_MANY_RESPONSES = "urn:oasis:names:tc:SAML:2.0:status:TooManyResponses"
1513
1514    # URI for UnknownAttrProfile status code.
1515    UNKNOWN_ATTR_PROFILE_URI = \
1516                "urn:oasis:names:tc:SAML:2.0:status:UnknownAttrProfile"
1517
1518    # URI for UnknownPrincipal status code.
1519    UNKNOWN_PRINCIPAL_URI = \
1520                "urn:oasis:names:tc:SAML:2.0:status:UnknownPrincipal"
1521
1522    # URI for UnsupportedBinding status code.
1523    UNSUPPORTED_BINDING_URI = \
1524                "urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding"
1525
1526    __slots__ = ('__value', '__childStatusCode', '__qname')
1527   
1528    def __init__(self):
1529        # Value attribute URI.
1530        self.__value = None
1531   
1532        # Nested secondary StatusCode child element.
1533        self.__childStatusCode = None
1534       
1535        self.__qname = QName(StatusCode.DEFAULT_ELEMENT_NAME.namespaceURI,
1536                             StatusCode.DEFAULT_ELEMENT_NAME.localPart,
1537                             StatusCode.DEFAULT_ELEMENT_NAME.prefix)
1538
1539    def _getStatusCode(self): 
1540        return self.__childStatusCode
1541   
1542    def _setStatusCode(self, value):
1543        if not isinstance(value, StatusCode):
1544            raise TypeError('Child "statusCode" must be a %r derived type, '
1545                            "got %r" % (StatusCode, type(value)))
1546           
1547        self.__childStatusCode = value
1548
1549    value = property(fget=_getStatusCode, 
1550                     fset=_setStatusCode, 
1551                     doc="Child Status code")
1552             
1553    def _getValue(self):
1554        return self.__value
1555       
1556    def _setValue(self, value):
1557        if not isinstance(value, basestring):
1558            raise TypeError("\"value\" must be a basestring derived type, "
1559                            "got %r" % value.__class__)
1560           
1561        self.__value = value
1562
1563    value = property(fget=_getValue, fset=_setValue, doc="Status code value")
1564               
1565    def _getQName(self):
1566        return self.__qname
1567       
1568    def _setQName(self, value):
1569        if not isinstance(value, QName):
1570            raise TypeError("\"qname\" must be a %r derived type, "
1571                            "got %r" % (QName, type(value)))
1572           
1573        self.__qname = value
1574
1575    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1576       
1577
1578class Status(SAMLObject): 
1579    '''SAML 2.0 Core Status'''
1580   
1581    # Local Name of Status.
1582    DEFAULT_ELEMENT_LOCAL_NAME = "Status"
1583
1584    # Default element name.
1585    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1586                                 DEFAULT_ELEMENT_LOCAL_NAME,
1587                                 SAMLConstants.SAML20P_PREFIX)
1588
1589    # Local name of the XSI type.
1590    TYPE_LOCAL_NAME = "StatusType"
1591
1592    # QName of the XSI type.
1593    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1594                      TYPE_LOCAL_NAME,
1595                      SAMLConstants.SAML20P_PREFIX)
1596
1597    __slots__ = ('__statusCode', '__statusMessage', '__statusDetail', '__qname')
1598   
1599    def __init__(self):
1600        # StatusCode element.
1601        self.__statusCode = None
1602   
1603        # StatusMessage element.
1604        self.__statusMessage = None
1605   
1606        # StatusDetail element.
1607        self.__statusDetail = None
1608       
1609        self.__qname = QName(Status.DEFAULT_ELEMENT_NAME.namespaceURI,
1610                             Status.DEFAULT_ELEMENT_NAME.localPart,
1611                             Status.DEFAULT_ELEMENT_NAME.prefix)
1612               
1613    def _getQName(self):
1614        return self.__qname
1615       
1616    def _setQName(self, value):
1617        if not isinstance(value, QName):
1618            raise TypeError("\"qname\" must be a %r derived type, "
1619                            "got %r" % (QName, type(value)))
1620           
1621        self.__qname = value
1622
1623    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1624       
1625    def _getStatusCode(self):
1626        '''
1627        Gets the Code of this Status.
1628       
1629        @return: Status StatusCode
1630        '''
1631        return self.__statusCode
1632
1633    def _setStatusCode(self, value):
1634        '''
1635        Sets the Code of this Status.
1636       
1637        @param value:         the Code of this Status
1638        '''
1639        if not isinstance(value, StatusCode):
1640            raise TypeError('"statusCode" must be a %r derived type, '
1641                            "got %r" % (StatusCode, type(value)))
1642           
1643        self.__statusCode = value
1644       
1645    statusCode = property(fget=_getStatusCode,
1646                          fset=_setStatusCode,
1647                          doc="status code object")
1648   
1649    def _getStatusMessage(self):
1650        '''
1651        Gets the Message of this Status.
1652       
1653        @return: Status StatusMessage
1654        '''
1655        return self.__statusMessage
1656
1657    def _setStatusMessage(self, value):
1658        '''
1659        Sets the Message of this Status.
1660       
1661        @param value: the Message of this Status
1662        '''
1663        if not isinstance(value, StatusMessage):
1664            raise TypeError('"statusMessage" must be a %r derived type, '
1665                            "got %r" % (StatusMessage, type(value)))
1666           
1667        self.__statusMessage = value
1668       
1669    statusMessage = property(fget=_getStatusMessage,
1670                             fset=_setStatusMessage,
1671                             doc="status message")
1672
1673    def _getStatusDetail(self):
1674        '''
1675        Gets the Detail of this Status.
1676       
1677        @return: Status StatusDetail
1678        '''
1679        return self.__statusDetail
1680   
1681    def _setStatusDetail(self, value):
1682        '''
1683        Sets the Detail of this Status.
1684       
1685        @param value: the Detail of this Status
1686        '''
1687        self.__statusDetail = value
1688       
1689    statusDetail = property(fget=_getStatusDetail,
1690                            fset=_setStatusDetail,
1691                            doc="status message")
1692
1693
1694class Action(SAMLObject): 
1695    '''SAML 2.0 Core Action'''
1696   
1697    # Element local name.
1698    DEFAULT_ELEMENT_LOCAL_NAME = "Action"
1699
1700    # Default element name.
1701    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
1702                                 DEFAULT_ELEMENT_LOCAL_NAME,
1703                                 SAMLConstants.SAML20_PREFIX)
1704
1705    # Local name of the XSI type.
1706    TYPE_LOCAL_NAME = "ActionType"
1707
1708    # QName of the XSI type
1709    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
1710                      TYPE_LOCAL_NAME,
1711                      SAMLConstants.SAML20_PREFIX)
1712
1713    # Name of the Namespace attribute.
1714    NAMESPACE_ATTRIB_NAME = "Namespace"
1715
1716    # Read/Write/Execute/Delete/Control action namespace.
1717    RWEDC_NS_URI = "urn:oasis:names:tc:SAML:1.0:action:rwedc"
1718
1719    # Read/Write/Execute/Delete/Control negation action namespace.
1720    RWEDC_NEGATION_NS_URI = "urn:oasis:names:tc:SAML:1.0:action:rwedc-negation"
1721
1722    # Get/Head/Put/Post action namespace.
1723    GHPP_NS_URI = "urn:oasis:names:tc:SAML:1.0:action:ghpp"
1724
1725    # UNIX file permission action namespace.
1726    UNIX_NS_URI = "urn:oasis:names:tc:SAML:1.0:action:unix"
1727
1728    ACTION_NS_IDENTIFIERS = (
1729        RWEDC_NS_URI,
1730        RWEDC_NEGATION_NS_URI,   
1731        GHPP_NS_URI,
1732        UNIX_NS_URI       
1733    )
1734   
1735    # Read action.
1736    READ_ACTION = "Read"
1737
1738    # Write action.
1739    WRITE_ACTION = "Write"
1740
1741    # Execute action.
1742    EXECUTE_ACTION = "Execute"
1743
1744    # Delete action.
1745    DELETE_ACTION = "Delete"
1746
1747    # Control action.
1748    CONTROL_ACTION = "Control"
1749
1750    # Negated Read action.
1751    NEG_READ_ACTION = "~Read"
1752
1753    # Negated Write action.
1754    NEG_WRITE_ACTION = "~Write"
1755
1756    # Negated Execute action.
1757    NEG_EXECUTE_ACTION = "~Execute"
1758
1759    # Negated Delete action.
1760    NEG_DELETE_ACTION = "~Delete"
1761
1762    # Negated Control action.
1763    NEG_CONTROL_ACTION = "~Control"
1764
1765    # HTTP GET action.
1766    HTTP_GET_ACTION = "GET"
1767
1768    # HTTP HEAD action.
1769    HTTP_HEAD_ACTION = "HEAD"
1770
1771    # HTTP PUT action.
1772    HTTP_PUT_ACTION = "PUT"
1773
1774    # HTTP POST action.
1775    HTTP_POST_ACTION = "POST"
1776   
1777    ACTION_TYPES = {
1778        RWEDC_NS_URI: (READ_ACTION, WRITE_ACTION, EXECUTE_ACTION, DELETE_ACTION,
1779                       CONTROL_ACTION),
1780        RWEDC_NEGATION_NS_URI: (READ_ACTION, WRITE_ACTION, EXECUTE_ACTION, 
1781                                DELETE_ACTION, CONTROL_ACTION, NEG_READ_ACTION, 
1782                                NEG_WRITE_ACTION, NEG_EXECUTE_ACTION, 
1783                                NEG_CONTROL_ACTION),   
1784        GHPP_NS_URI: (HTTP_GET_ACTION, HTTP_HEAD_ACTION, HTTP_PUT_ACTION,
1785                      HTTP_POST_ACTION),
1786                     
1787        # This namespace uses octal bitmask for file permissions
1788        UNIX_NS_URI: ()   
1789    }
1790   
1791    def __init__(self, **kw):
1792        '''Create an authorization action type
1793        '''
1794        super(Action, self).__init__(**kw)
1795
1796        # URI of the Namespace of this action.  Default to read/write/negation
1797        # type - 2.7.4.2 SAML 2 Core Spec. 15 March 2005
1798        self.__namespace = Action.RWEDC_NEGATION_NS_URI
1799
1800        #Value value
1801        self.__action = None       
1802   
1803        self.__actionTypes = Action.ACTION_TYPES
1804
1805    def _getActionTypes(self):
1806        return self.__actionTypes
1807
1808    def _setActionTypes(self, value):
1809        if not isinstance(value, dict):
1810            raise TypeError('Expecting list or tuple type for "actionTypes" '
1811                            'attribute; got %r' % type(value))
1812           
1813        for k, v in value.items():
1814            if not isinstance(v, (tuple, type(None))):
1815                raise TypeError('Expecting None or tuple type for '
1816                                '"actionTypes" dictionary values; got %r for '
1817                                '%r key' % (type(value), k))
1818        self.__actionTypes = value
1819
1820    actionTypes = property(_getActionTypes, 
1821                           _setActionTypes, 
1822                           doc="Restrict vocabulary of action types")
1823       
1824    def _getNamespace(self):
1825        '''
1826        gets the namespace scope of the specified value.
1827       
1828        @return: the namespace scope of the specified value
1829        '''
1830        return self.__namespace
1831
1832    def _setNamespace(self, value):
1833        '''
1834        Sets the namespace scope of the specified value.
1835       
1836        @param value: the namespace scope of the specified value
1837        '''
1838        if not isinstance(value, basestring):
1839            raise TypeError('Expecting string type for "namespace" '
1840                            'attribute; got %r' % type(value))
1841           
1842        if value not in self.__actionTypes.keys():
1843            raise AttributeError('"namespace" action type %r not recognised. '
1844                                 'It must be one of these action types: %r' % 
1845                                 self.__actionNsIdentifiers)
1846           
1847        self.__namespace = value
1848
1849    namespace = property(_getNamespace, _setNamespace, doc="Action Namespace")
1850
1851    def _getValue(self):
1852        '''
1853        gets the URI of the action to be performed.
1854       
1855        @return: the URI of the action to be performed
1856        '''
1857        return self.__value
1858
1859    def _setValue(self, value):
1860        '''
1861        Sets the URI of the action to be performed.
1862       
1863        @param value: the URI of the value to be performed
1864        '''
1865        # int and oct allow for UNIX file permissions action type
1866        if not isinstance(value, (basestring, int)):
1867            raise TypeError('Expecting string or int type for "action" '
1868                            'attribute; got %r' % type(value))
1869           
1870        # Default to read/write/negation type - 2.7.4.2 SAML 2 Core Spec.
1871        # 15 March 2005
1872        allowedActions = self.__actionTypes.get(self.__namespace,
1873                                                Action.RWEDC_NEGATION_NS_URI)
1874       
1875        # Only apply restriction for action type that has a restricted
1876        # vocabulary - UNIX type is missed out of this because its an octal
1877        # mask
1878        if len(allowedActions) > 0 and value not in allowedActions:
1879            raise AttributeError('%r action not recognised; known actions for '
1880                                 'the %r namespace identifier are: %r.  ' 
1881                                 'If this is not as expected make sure to set '
1882                                 'the "namespace" attribute to an alternative '
1883                                 'value first or override completely by '
1884                                 'explicitly setting the "allowTypes" '
1885                                 'attribute' % 
1886                                 (value, self.__namespace, allowedActions))
1887        self.__value = value
1888
1889    value = property(_getValue, _setValue, doc="Action string")
1890       
1891
1892class RequestAbstractType(SAMLObject): 
1893    '''SAML 2.0 Core RequestAbstractType'''
1894   
1895    # Local name of the XSI type.
1896    TYPE_LOCAL_NAME = "RequestAbstractType"
1897
1898    # QName of the XSI type.
1899    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1900                      TYPE_LOCAL_NAME,
1901                      SAMLConstants.SAML20P_PREFIX)
1902
1903    # ID attribute name.
1904    ID_ATTRIB_NAME = "ID"
1905
1906    # Version attribute name.
1907    VERSION_ATTRIB_NAME = "Version"
1908
1909    # IssueInstant attribute name.
1910    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
1911
1912    # Destination attribute name.
1913    DESTINATION_ATTRIB_NAME = "Destination"
1914
1915    # Consent attribute name.
1916    CONSENT_ATTRIB_NAME = "Consent"
1917
1918    # Unspecified consent URI.
1919    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
1920
1921    # Obtained consent URI.
1922    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
1923
1924    # Prior consent URI.
1925    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
1926
1927    # Implicit consent URI.
1928    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
1929
1930    # Explicit consent URI.
1931    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
1932
1933    # Unavailable consent URI.
1934    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
1935
1936    # Inapplicable consent URI.
1937    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable"
1938     
1939    __slots__ = (
1940        '__version',
1941        '__id',
1942        '__issueInstant',
1943        '__destination',
1944        '__consent',
1945        '__issuer',
1946        '__extensions'
1947    )
1948   
1949    def __init__(self):
1950        # SAML Version of the request.
1951        self.__version = None
1952   
1953        # Unique identifier of the request.
1954        self.__id = None
1955   
1956        # Date/time request was issued.
1957        self.__issueInstant = None
1958   
1959        # URI of the request destination.
1960        self.__destination = None
1961   
1962        # URI of the SAML user consent type.
1963        self.__consent = None
1964   
1965        # URI of the SAML user consent type.
1966        self.__issuer = None
1967   
1968        # Extensions child element.
1969        self.__extensions = None
1970       
1971    def _get_version(self):
1972        '''@return: the SAML Version of this assertion.
1973        '''
1974        return self.__version
1975   
1976    def _set_version(self, version):
1977        '''@param version: the SAML Version of this assertion
1978        '''
1979        if not isinstance(version, SAMLVersion):
1980            raise TypeError("Expecting SAMLVersion type got: %r" % 
1981                            version.__class__)
1982       
1983        self.__version = version
1984       
1985    version = property(fget=_get_version,
1986                       fset=_set_version,
1987                       doc="SAML Version of the assertion")
1988
1989    def _get_issueInstant(self):
1990        '''Gets the date/time the request was issued
1991       
1992        @return: the issue instance of this request'''
1993        return self.__issueInstant
1994   
1995    def _set_issueInstant(self, value):
1996        '''Sets the date/time the request was issued
1997       
1998        @param value: the issue instance of this request
1999        '''
2000        if not isinstance(value, datetime):
2001            raise TypeError('Expecting "datetime" type for "issueInstant", '
2002                            'got %r' % type(value))
2003           
2004        self.__issueInstant = value
2005       
2006    issueInstant = property(fget=_get_issueInstant, 
2007                            fset=_set_issueInstant,
2008                            doc="Issue instant of the request") 
2009
2010    def _get_id(self):
2011        '''Sets the unique identifier for this request.
2012       
2013        @return: the ID of this request
2014        '''
2015        return self.__id
2016   
2017    def _set_id(self, value):
2018        '''Sets the unique identifier for this request
2019       
2020        @param value: the ID of this assertion
2021        '''
2022        if not isinstance(value, basestring):
2023            raise TypeError('Expecting basestring derived type for "id", got '
2024                            '%r' % type(value))
2025        self.__id = value
2026       
2027    id = property(fget=_get_id, fset=_set_id, doc="ID of request")
2028
2029    def _get_destination(self):
2030        '''Gets the URI of the destination of the request.
2031       
2032        @return: the URI of the destination of the request
2033        '''
2034        return self.__destination
2035   
2036    def _set_destination(self, value):
2037        '''Sets the URI of the destination of the request.
2038       
2039        @param value: the URI of the destination of the request'''
2040        if not isinstance(value, basestring):
2041            raise TypeError('Expecting basestring derived type for '
2042                            '"destination", got %r' % type(value))
2043        self.__destination = value
2044       
2045    destination = property(fget=_get_destination, 
2046                           fset=_set_destination,
2047                           doc="Destination of request")
2048     
2049    def _get_consent(self):
2050        '''Gets the consent obtained from the principal for sending this
2051        request.
2052       
2053        @return: the consent obtained from the principal for sending this
2054        request
2055        '''
2056        return self.__consent
2057       
2058    def _set_consent(self, value):
2059        '''Sets the consent obtained from the principal for sending this
2060        request.
2061       
2062        @param value: the new consent obtained from the principal for
2063        sending this request
2064        ''' 
2065        if not isinstance(value, basestring):
2066            raise TypeError('Expecting basestring derived type for "consent", '
2067                            'got %r' % type(value))
2068        self.__consent = value
2069             
2070    consent = property(fget=_get_consent, 
2071                       fset=_set_consent,
2072                       doc="Consent for request")
2073   
2074    def _set_issuer(self, issuer):
2075        """Set issuer of request"""
2076        if not isinstance(issuer, Issuer):
2077            raise TypeError('"issuer" must be a %r, got %r' % (Issuer, 
2078                                                               type(issuer)))
2079       
2080        self.__issuer = issuer
2081   
2082    def _get_issuer(self):
2083        """Get the issuer name """
2084        return self.__issuer
2085
2086    issuer = property(fget=_get_issuer, 
2087                      fset=_set_issuer,
2088                      doc="Issuer of request")
2089 
2090    def _get_extensions(self):
2091        '''Gets the Extensions of this request.
2092       
2093        @return: the Status of this request
2094        '''
2095        return self.__extensions
2096     
2097    def _set_extensions(self, value):
2098        '''Sets the Extensions of this request.
2099       
2100        @param value: the Extensions of this request
2101        '''
2102        self.__extensions = value
2103       
2104    extensions = property(fget=_get_extensions, 
2105                          fset=_set_extensions,
2106                          doc="Request extensions")
2107
2108
2109class SubjectQuery(RequestAbstractType):
2110    """SAML 2.0 Core Subject Query type"""
2111    __slots__ = ('__subject', )
2112   
2113    def __init__(self):
2114        self.__subject = None
2115       
2116    def _getSubject(self):
2117        '''Gets the Subject of this request.
2118       
2119        @return: the Subject of this request'''   
2120        return self.__subject
2121   
2122    def _setSubject(self, value):
2123        '''Sets the Subject of this request.
2124       
2125        @param value: the Subject of this request'''
2126        if not isinstance(value, Subject):
2127            raise TypeError('Setting "subject", got %r, expecting %r' %
2128                            (Subject, type(value)))
2129           
2130        self.__subject = value
2131       
2132    subject = property(fget=_getSubject, fset=_setSubject, doc="Query subject")
2133   
2134   
2135class AttributeQuery(SubjectQuery):
2136    '''SAML 2.0 AttributeQuery'''
2137   
2138    # Element local name.
2139    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeQuery"
2140
2141    # Default element name.
2142    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
2143                                 DEFAULT_ELEMENT_LOCAL_NAME,
2144                                 SAMLConstants.SAML20P_PREFIX)
2145
2146    # Local name of the XSI type.
2147    TYPE_LOCAL_NAME = "AttributeQueryType"
2148
2149    # QName of the XSI type.
2150    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
2151                      TYPE_LOCAL_NAME,
2152                      SAMLConstants.SAML20P_PREFIX)
2153
2154    __slots__ = ('__attributes',)
2155   
2156    def __init__(self):
2157        self.__attributes = TypedList(Attribute)
2158 
2159    def _getAttributes(self):
2160        '''Gets the Attributes of this query.
2161       
2162        @return: the list of Attributes of this query'''
2163        return self.__attributes
2164
2165    def _setAttributes(self, value):
2166        self.__attributes = value
2167
2168    attributes = property(fget=_getAttributes, 
2169                          fset=_setAttributes, 
2170                          doc="Attributes")
2171
2172
2173class Evidentiary(SAMLObject):
2174    """Base class for types set in an evidence object"""
2175    __slots__ = ()
2176
2177
2178class AssertionURIRef(Evidentiary):
2179    '''SAML 2.0 Core AssertionURIRef'''
2180    __slots__ = ('__assertionURI',)
2181   
2182    # Element local name
2183    DEFAULT_ELEMENT_LOCAL_NAME = "AssertionURIRef"
2184
2185    # Default element name
2186    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
2187                                 DEFAULT_ELEMENT_LOCAL_NAME,
2188                                 SAMLConstants.SAML20_PREFIX)
2189   
2190    def __init__(self):
2191        '''Create assertion URI reference'''
2192        super(AssertionURIRef, self).__init__()
2193       
2194        # URI of the Assertion
2195        self.__assertionURI = None   
2196
2197    def _getAssertionURI(self):
2198        return self.__assertionURI
2199
2200    def _setAssertionURI(self, value):
2201        if not isinstance(value, basestring):
2202            raise TypeError('Expecting string type for "assertionID" '
2203                            'attribute; got %r' % type(value))
2204        self.__assertionURI = value
2205
2206    def getOrderedChildren(self):
2207        return None
2208
2209    assertionURI = property(_getAssertionURI, _setAssertionURI, 
2210                            doc="Assertion URI")
2211   
2212   
2213class AssertionIDRef(Evidentiary):
2214    '''SAML 2.0 Core AssertionIDRef.'''
2215
2216    # Element local name.
2217    DEFAULT_ELEMENT_LOCAL_NAME = "AssertionIDRef"
2218
2219    # Default element name.
2220    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
2221                                 DEFAULT_ELEMENT_LOCAL_NAME,
2222                                 SAMLConstants.SAML20_PREFIX)
2223   
2224    __slots__ = ("_AssertionID",)
2225   
2226    def __init__(self, namespaceURI, elementLocalName, namespacePrefix):
2227        '''
2228        @param namespaceURI: the namespace the element is in
2229        @param elementLocalName: the local name of the XML element this Object
2230        represents
2231        @param namespacePrefix: the prefix for the given namespace
2232        '''
2233        super(AssertionIDRef, self).__init__(namespaceURI, 
2234                                             elementLocalName, 
2235                                             namespacePrefix)
2236        self.__assertionID = None
2237   
2238    def _getAssertionID(self):
2239        '''Gets the ID of the assertion this references.
2240       
2241        @return: the ID of the assertion this references'''
2242        return self.__assertionID
2243       
2244    def _setAssertionID(self, value):
2245        '''Sets the ID of the assertion this references.
2246       
2247        @param value: the ID of the assertion this references'''
2248        if not isinstance(value, basestring):
2249            raise TypeError('Expecting string type for "assertionID" '
2250                            'attribute; got %r' % type(value))
2251        self.__assertionID = value
2252
2253    def getOrderedChildren(self):
2254        return None
2255
2256    assertionID = property(_getAssertionID, _setAssertionID, 
2257                           doc="Assertion ID")
2258       
2259   
2260class EncryptedElementType(SAMLObject):
2261    '''SAML 2.0 Core EncryptedElementType'''
2262   
2263    # Local name of the XSI type.
2264    TYPE_LOCAL_NAME = "EncryptedElementType"
2265       
2266    # QName of the XSI type.
2267    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
2268                      TYPE_LOCAL_NAME, 
2269                      SAMLConstants.SAML20_PREFIX)
2270   
2271    __slots__ = ()
2272   
2273    def _getEncryptedData(self):
2274        '''Get the EncryptedData child element.
2275       
2276        @return the EncryptedData child element'''
2277        raise NotImplementedError()
2278   
2279    def _setEncryptedData(self, value):
2280        '''Set the EncryptedData child element.
2281       
2282        @param newEncryptedData the new EncryptedData child element'''
2283        raise NotImplementedError()
2284   
2285    def _getEncryptedKeys(self):
2286        '''A list of EncryptedKey child elements.
2287       
2288        @return a list of EncryptedKey child elements'''
2289        raise NotImplementedError()
2290   
2291   
2292class EncryptedAssertion(EncryptedElementType, Evidentiary):
2293    '''SAML 2.0 Core EncryptedAssertion.'''
2294   
2295    # Element local name.
2296    DEFAULT_ELEMENT_LOCAL_NAME = "EncryptedAssertion"
2297
2298    # Default element name.
2299    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
2300                                 DEFAULT_ELEMENT_LOCAL_NAME,
2301                                 SAMLConstants.SAML20_PREFIX) 
2302    __slots__ = ()
2303     
2304   
2305class Evidence(SAMLObject):
2306    '''SAML 2.0 Core Evidence.'''
2307   
2308    # Element local name.
2309    DEFAULT_ELEMENT_LOCAL_NAME = "Evidence"
2310   
2311    # Default element name.
2312    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
2313                                 DEFAULT_ELEMENT_LOCAL_NAME, 
2314                                 SAMLConstants.SAML20_PREFIX)
2315   
2316    # Local name of the XSI type.
2317    TYPE_LOCAL_NAME = "EvidenceType" 
2318       
2319    # QName of the XSI type.
2320    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
2321                      TYPE_LOCAL_NAME, 
2322                      SAMLConstants.SAML20_PREFIX)
2323
2324    __slots__ = ('__values',)
2325   
2326    def __init__(self, **kw):
2327        '''Create an authorization evidence type
2328        '''
2329        super(Evidence, self).__init__(**kw)
2330
2331        # Assertion of the Evidence.
2332        self.__values = TypedList(Evidentiary) 
2333       
2334    @property
2335    def assertionIDReferences(self):
2336        '''Gets the list of AssertionID references used as evidence.
2337   
2338        @return: the list of AssertionID references used as evidence'''
2339        return [i for i in self.__values
2340                if (getattr(i, "DEFAULT_ELEMENT_NAME") == 
2341                    AssertionIDRef.DEFAULT_ELEMENT_NAME)]
2342   
2343    @property
2344    def assertionURIReferences(self):
2345        '''Gets the list of AssertionURI references used as evidence.
2346       
2347        @return: the list of AssertionURI references used as evidence'''
2348        return [i for i in self.__values
2349                if (getattr(i, "DEFAULT_ELEMENT_NAME") == 
2350                    AssertionURIRef.DEFAULT_ELEMENT_NAME)]
2351   
2352    @property
2353    def assertions(self):
2354        '''Gets the list of Assertions used as evidence.
2355       
2356        @return: the list of Assertions used as evidence'''
2357        return [i for i in self.__values
2358                if (getattr(i, "DEFAULT_ELEMENT_NAME") == 
2359                    Assertion.DEFAULT_ELEMENT_NAME)]
2360   
2361    @property
2362    def encryptedAssertions(self):
2363        '''Gets the list of EncryptedAssertions used as evidence.
2364       
2365        @return: the list of EncryptedAssertions used as evidence'''
2366        return [i for i in self.__values
2367                if (getattr(i, "DEFAULT_ELEMENT_NAME") == 
2368                    EncryptedAssertion.DEFAULT_ELEMENT_NAME)]   
2369
2370    @property
2371    def values(self):
2372        '''Gets the list of all elements used as evidence.
2373       
2374        @return: the list of Evidentiary objects used as evidence'''
2375        return self.__values
2376   
2377    def getOrderedChildren(self):
2378        children = []
2379
2380        if len(self.__values) == 0:
2381            return None
2382
2383        children.extend(self.__values)
2384
2385        return tuple(children)
2386   
2387
2388class AuthzDecisionQuery(SubjectQuery):
2389    '''SAML 2.0 AuthzDecisionQuery.'''
2390
2391    # Element local name.
2392    DEFAULT_ELEMENT_LOCAL_NAME = "AuthzDecisionQuery"
2393
2394    # Default element name.
2395    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
2396                                 DEFAULT_ELEMENT_LOCAL_NAME,
2397                                 SAMLConstants.SAML20P_PREFIX)
2398
2399    # Local name of the XSI type.
2400    TYPE_LOCAL_NAME = "AuthzDecisionQueryType"
2401
2402    # QName of the XSI type.
2403    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
2404                      TYPE_LOCAL_NAME,
2405                      SAMLConstants.SAML20P_PREFIX)
2406
2407    # Resource attribute name.
2408    RESOURCE_ATTRIB_NAME = "Resource"
2409   
2410    __slots__ = (
2411       '__resource',
2412       '__evidence',
2413       '__actions',
2414       '__normalizeResource',
2415       '__safeNormalizationChars'
2416    )
2417   
2418    def __init__(self, 
2419                 normalizeResource=True, 
2420                 safeNormalizationChars='/%',
2421                 **kw):
2422        '''Create new authorisation decision query
2423        '''
2424        super(AuthzDecisionQuery, self).__init__(**kw)
2425
2426        # Resource attribute value.
2427        self.__resource = None
2428   
2429        # Evidence child element.
2430        self.__evidence = None
2431   
2432        # Action child elements.
2433        self.__actions = TypedList(Action)   
2434       
2435        # Tuning for normalization of resource URIs in property set method
2436        self.normalizeResource = normalizeResource
2437        self.safeNormalizationChars = safeNormalizationChars
2438
2439    def _getNormalizeResource(self):
2440        return self.__normalizeResource
2441
2442    def _setNormalizeResource(self, value):
2443        if not isinstance(value, bool):
2444            raise TypeError('Expecting bool type for "normalizeResource" '
2445                            'attribute; got %r instead' % type(value))
2446           
2447        self.__normalizeResource = value
2448
2449    normalizeResource = property(_getNormalizeResource, 
2450                                 _setNormalizeResource, 
2451                                 doc="Flag to normalize new resource value "
2452                                     "assigned to the \"resource\" property.  "
2453                                     "The setting only applies for URIs "
2454                                     'beginning with "http://" or "https://"')
2455
2456    def _getSafeNormalizationChars(self):
2457        return self.__safeNormalizationChars
2458
2459    def _setSafeNormalizationChars(self, value):
2460        if not isinstance(value, basestring):
2461            raise TypeError('Expecting string type for "normalizeResource" '
2462                            'attribute; got %r instead' % type(value))
2463           
2464        self.__safeNormalizationChars = value
2465
2466    safeNormalizationChars = property(_getSafeNormalizationChars, 
2467                                      _setSafeNormalizationChars, 
2468                                      doc="String containing a list of "
2469                                          "characters that should not be "
2470                                          "converted when Normalizing the "
2471                                          "resource URI.  These are passed to "
2472                                          "urllib.quote when the resource "
2473                                          "property is set.  The default "
2474                                          "characters are '/%'")
2475
2476    def _getResource(self):
2477        '''Gets the Resource attrib value of this query.
2478
2479        @return: the Resource attrib value of this query'''
2480        return self.__resource
2481   
2482    def _setResource(self, value):
2483        '''Sets the Resource attrib value of this query normalizing the path
2484        component, removing spurious port numbers (80 for HTTP and 443 for
2485        HTTPS) and converting the host component to lower case.
2486       
2487        @param value: the new Resource attrib value of this query'''
2488        if not isinstance(value, basestring):
2489            raise TypeError('Expecting string type for "resource" attribute; '
2490                            'got %r instead' % type(value))
2491       
2492        if (self.normalizeResource and 
2493            value.startswith('http://') or value.startswith('https://')):
2494            # Normalise the path, set the host name to lower case and remove
2495            # port redundant numbers 80 and 443
2496            splitResult = urlsplit(value)
2497            uriComponents = list(splitResult)
2498           
2499            # hostname attribute is lowercase
2500            uriComponents[1] = splitResult.hostname
2501           
2502            if splitResult.port is not None:
2503                isHttpWithStdPort = (splitResult.port == 80 and 
2504                                     splitResult.scheme == 'http')
2505               
2506                isHttpsWithStdPort = (splitResult.port == 443 and
2507                                      splitResult.scheme == 'https')
2508               
2509                if not isHttpWithStdPort and not isHttpsWithStdPort:
2510                    uriComponents[1] += ":%d" % splitResult.port
2511           
2512            uriComponents[2] = urllib.quote(splitResult.path, 
2513                                            self.safeNormalizationChars)
2514           
2515            self.__resource = urlunsplit(uriComponents)
2516        else:
2517            self.__resource = value
2518   
2519    resource = property(fget=_getResource, fset=_setResource,
2520                        doc="Resource for which authorisation is requested")
2521   
2522    @property
2523    def actions(self):
2524        '''The actions for which authorisation is requested
2525       
2526        @return: the Actions of this query'''
2527        return self.__actions
2528   
2529    def _getEvidence(self):
2530        '''Gets the Evidence of this query.
2531
2532        @return: the Evidence of this query'''
2533        return self.__evidence
2534
2535    def _setEvidence(self, value):
2536        '''Sets the Evidence of this query.
2537        @param newEvidence: the new Evidence of this query''' 
2538        if not isinstance(value, Evidence):
2539            raise TypeError('Expecting Evidence type for "evidence" '
2540                            'attribute; got %r' % type(value))
2541
2542        self.__evidence = value 
2543
2544    evidence = property(fget=_getEvidence, fset=_setEvidence, 
2545                        doc="A set of assertions which the Authority may use "
2546                            "to base its authorisation decision on")
2547   
2548    def getOrderedChildren(self):
2549        children = []
2550
2551        superChildren = super(AuthzDecisionQuery, self).getOrderedChildren()
2552        if superChildren:
2553            children.extend(superChildren)
2554
2555        children.extend(self.__actions)
2556       
2557        if self.__evidence is not None:
2558            children.extend(self.__evidence)
2559
2560        if len(children) == 0:
2561            return None
2562
2563        return tuple(children)
2564
2565
2566class StatusResponseType(SAMLObject):
2567    '''SAML 2.0 Core Status Response Type
2568    '''
2569
2570    # Local name of the XSI type.
2571    TYPE_LOCAL_NAME = "StatusResponseType"
2572
2573    # QName of the XSI type.
2574    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
2575                      TYPE_LOCAL_NAME,
2576                      SAMLConstants.SAML20P_PREFIX)
2577
2578    # ID attribute name
2579    ID_ATTRIB_NAME = "ID"
2580
2581    # InResponseTo attribute name
2582    IN_RESPONSE_TO_ATTRIB_NAME = "InResponseTo"
2583
2584    # Version attribute name
2585    VERSION_ATTRIB_NAME = "Version"
2586
2587    # IssueInstant attribute name
2588    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
2589
2590    # Destination attribute name
2591    DESTINATION_ATTRIB_NAME = "Destination"
2592
2593    # Consent attribute name.
2594    CONSENT_ATTRIB_NAME = "Consent"
2595
2596    # Unspecified consent URI
2597    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
2598
2599    # Obtained consent URI
2600    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
2601
2602    # Prior consent URI
2603    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
2604
2605    # Implicit consent URI
2606    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
2607
2608    # Explicit consent URI
2609    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
2610
2611    # Unavailable consent URI
2612    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
2613
2614    # Inapplicable consent URI
2615    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable"
2616
2617    __slots__ = (
2618        '__qname',       
2619        '__version',
2620        '__id',
2621        '__inResponseTo',
2622        '__issueInstant',
2623        '__destination',
2624        '__consent',
2625        '__issuer',
2626        '__status',
2627        '__extensions'               
2628    )
2629   
2630    def __init__(self):
2631        self.__qname = None
2632       
2633        self.__version = SAMLVersion(SAMLVersion.VERSION_20)
2634        self.__id = None
2635        self.__inResponseTo = None
2636        self.__issueInstant = None
2637        self.__destination = None
2638        self.__consent = None
2639        self.__issuer = None
2640        self.__status = None
2641        self.__extensions = None
2642       
2643    def _getQName(self):
2644        return self.__qname
2645       
2646    def _setQName(self, value):
2647        if not isinstance(value, QName):
2648            raise TypeError("\"qname\" must be a %r derived type, "
2649                            "got %r" % (QName, type(value)))
2650           
2651        self.__qname = value
2652
2653    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
2654
2655    def _get_version(self):
2656        '''@return: the SAML Version of this response.
2657        '''
2658        return self.__version
2659   
2660    def _set_version(self, version):
2661        '''@param version: the SAML Version of this response
2662        '''
2663        if not isinstance(version, SAMLVersion):
2664            raise TypeError("Expecting SAMLVersion type got: %r" % 
2665                            version.__class__)
2666       
2667        self.__version = version
2668       
2669    version = property(fget=_get_version,
2670                       fset=_set_version,
2671                       doc="SAML Version of the response")
2672
2673    def _get_id(self):
2674        '''Sets the ID of this response.
2675       
2676        @return: the ID of this response
2677        '''
2678        return self.__id
2679   
2680    def _set_id(self, value):
2681        '''Sets the ID of this response.
2682       
2683        @param value: the ID of this response
2684        '''
2685        if not isinstance(value, basestring):
2686            raise TypeError('Expecting basestring derived type for "id", got '
2687                            '%r' % type(value))
2688        self.__id = value
2689       
2690    id = property(fget=_get_id, fset=_set_id, doc="ID of response")
2691
2692    def _getInResponseTo(self):
2693        '''Get the unique request identifier for which this is a response
2694       
2695        @return: the unique identifier of the originating
2696        request
2697        '''
2698        return self.__inResponseTo
2699   
2700    def _setInResponseTo(self, value):
2701        '''Set the unique request identifier for which this is a response
2702       
2703        @param value: the unique identifier of the originating
2704        request
2705        '''
2706        if not isinstance(value, basestring):
2707            raise TypeError('Expecting basestring derived type for '
2708                            '"inResponseTo", got %r' % type(value))
2709        self.__inResponseTo = value
2710       
2711    inResponseTo = property(fget=_getInResponseTo, 
2712                            fset=_setInResponseTo,
2713                            doc="unique request identifier for which this is "
2714                                "a response")
2715
2716    def _get_issueInstant(self):
2717        '''Gets the issue instance of this response.
2718       
2719        @return: the issue instance of this response'''
2720        return self.__issueInstant
2721   
2722    def _set_issueInstant(self, issueInstant):
2723        '''Sets the issue instance of this response.
2724       
2725        @param newIssueInstance: the issue instance of this response
2726        '''
2727        if not isinstance(issueInstant, datetime):
2728            raise TypeError('Expecting "datetime" type for "issueInstant", '
2729                            'got %r' % issueInstant.__class__)
2730           
2731        self.__issueInstant = issueInstant
2732       
2733    issueInstant = property(fget=_get_issueInstant, 
2734                            fset=_set_issueInstant,
2735                            doc="Issue instant of the response")
2736
2737    def _get_destination(self):
2738        '''Gets the URI of the destination of the response.
2739       
2740        @return: the URI of the destination of the response
2741        '''
2742        return self.__destination
2743   
2744    def _set_destination(self, value):
2745        '''Sets the URI of the destination of the response.
2746       
2747        @param value: the URI of the destination of the response'''
2748        if not isinstance(value, basestring):
2749            raise TypeError('Expecting basestring derived type for '
2750                            '"destination", got %r' % type(value))
2751        self.__destination = value
2752       
2753    destination = property(fget=_get_destination, 
2754                           fset=_set_destination,
2755                           doc="Destination of response")
2756     
2757    def _get_consent(self):
2758        '''Gets the consent obtained from the principal for sending this
2759        response.
2760       
2761        @return: the consent obtained from the principal for sending this
2762        response
2763        '''
2764        return self.__consent
2765       
2766    def _set_consent(self, value):
2767        '''Sets the consent obtained from the principal for sending this
2768        response.
2769       
2770        @param value: the new consent obtained from the principal for
2771        sending this response
2772        ''' 
2773        if not isinstance(value, basestring):
2774            raise TypeError('Expecting basestring derived type for "consent", '
2775                            'got %r' % type(value))
2776        self.__consent = value
2777             
2778    consent = property(fget=_get_consent, 
2779                       fset=_set_consent,
2780                       doc="Consent for response")
2781   
2782    def _set_issuer(self, issuer):
2783        """Set issuer of response"""
2784        if not isinstance(issuer, Issuer):
2785            raise TypeError('"issuer" must be a %r, got %r' % (Issuer,
2786                                                               type(issuer)))
2787        self.__issuer = issuer
2788   
2789    def _get_issuer(self):
2790        """Get the issuer name """
2791        return self.__issuer
2792
2793    issuer = property(fget=_get_issuer, 
2794                      fset=_set_issuer,
2795                      doc="Issuer of response")
2796   
2797    def _getStatus(self):
2798        '''Gets the Status of this response.
2799       
2800        @return: the Status of this response
2801        '''
2802        return self.__status
2803
2804    def _setStatus(self, value):
2805        '''Sets the Status of this response.
2806       
2807        @param newStatus: the Status of this response
2808        '''
2809        if not isinstance(value, Status):
2810            raise TypeError('"status" must be a %r, got %r' % (Status,
2811                                                               type(value)))
2812        self.__status = value
2813       
2814    status = property(fget=_getStatus, fset=_setStatus, doc="Response status")   
2815       
2816    def _get_extensions(self):
2817        '''Gets the Extensions of this response.
2818       
2819        @return: the Status of this response
2820        '''
2821        return self.__extensions
2822     
2823    def _set_extensions(self, value):
2824        '''Sets the Extensions of this response.
2825       
2826        @param value: the Extensions of this response
2827        '''
2828        if not isinstance(value, (list, tuple)):
2829            raise TypeError('Expecting list or tuple for "extensions", got %r'
2830                            % type(value))
2831        self.__extensions = value
2832       
2833    extensions = property(fget=_get_extensions, 
2834                          fset=_set_extensions,
2835                          doc="Response extensions")   
2836
2837
2838class Response(StatusResponseType):
2839    '''SAML2 Core Response'''
2840   
2841    # Element local name.
2842    DEFAULT_ELEMENT_LOCAL_NAME = "Response"
2843   
2844    # Default element name.
2845    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
2846                                 DEFAULT_ELEMENT_LOCAL_NAME, 
2847                                 SAMLConstants.SAML20P_PREFIX)
2848   
2849    # Local name of the XSI type.
2850    TYPE_LOCAL_NAME = "ResponseType"
2851       
2852    # QName of the XSI type.
2853    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
2854                      TYPE_LOCAL_NAME, 
2855                      SAMLConstants.SAML20P_PREFIX)
2856   
2857    __slots__ = ('__indexedChildren',)
2858   
2859    def __init__(self):
2860        '''''' 
2861        super(Response, self).__init__()
2862       
2863        # Assertion child elements
2864        self.__indexedChildren = []
2865   
2866    def _getAssertions(self): 
2867        return self.__indexedChildren
2868   
2869    assertions = property(fget=_getAssertions,
2870                          doc="Assertions contained in this response")
Note: See TracBrowser for help on using the repository browser.