source: TI12-security/trunk/python/ndg.security.saml/saml/saml2/core.py @ 5597

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

Refactored SAML package structure into saml2, core and common sub-packages

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
32
33from saml.common import SAMLObject, SAMLVersion
34from saml.common.xml import SAMLConstants
35from saml.xml import QName
36from saml.utils import TypedList
37
38
39class Attribute(SAMLObject):
40    '''SAML 2.0 Core Attribute.'''
41   
42    # Local name of the Attribute element.
43    DEFAULT_ELEMENT_LOCAL_NAME = "Attribute"
44
45    # Default element name.
46    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
47                                 DEFAULT_ELEMENT_LOCAL_NAME,
48                                 SAMLConstants.SAML20_PREFIX)
49
50    # Local name of the XSI type.
51    TYPE_LOCAL_NAME = "AttributeType"
52
53    # QName of the XSI type.
54    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
55                      TYPE_LOCAL_NAME,
56                      SAMLConstants.SAML20_PREFIX)
57
58    # Name of the Name attribute.
59    NAME_ATTRIB_NAME = "Name"
60
61    # Name for the NameFormat attribute.
62    NAME_FORMAT_ATTRIB_NAME = "NameFormat"
63
64    # Name of the FriendlyName attribute.
65    FRIENDLY_NAME_ATTRIB_NAME = "FriendlyName"
66
67    # Unspecified attribute format ID.
68    UNSPECIFIED = "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"
69
70    # URI reference attribute format ID.
71    URI_REFERENCE = "urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
72
73    # Basic attribute format ID.
74    BASIC = "urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
75
76    def __init__(self):
77        """Initialise Attribute Class attributes"""
78        self.__name = None
79        self.__nameFormat = None
80        self.__friendlyName = None
81        self.__attributeValues = []
82
83    def _get_name(self):
84        return self.__name
85   
86    def _set_name(self, name):
87        if not isinstance(name, basestring):
88            raise TypeError("Expecting basestring type for name, got %r"% name)
89       
90        self.__name = name
91       
92    name = property(fget=_get_name,
93                    fset=_set_name,
94                    doc="name of this attribute")
95   
96    def _get_nameFormat(self):
97        return self.__nameFormat
98   
99    def _set_nameFormat(self, nameFormat):
100        if not isinstance(nameFormat, basestring):
101            raise TypeError("Expecting basestring type for nameFormat, got %r"
102                            % nameFormat)
103           
104        self.__nameFormat = nameFormat
105       
106    nameFormat = property(fget=_get_nameFormat,
107                          fset=_set_nameFormat,
108                          doc="Get the name format of this attribute.")
109   
110    def _get_friendlyName(self):
111        return self.__friendlyName
112   
113    def _set_friendlyName(self, friendlyName):
114        if not isinstance(friendlyName, basestring):
115            raise TypeError("Expecting basestring type for friendlyName, got "
116                            "%r" % friendlyName)
117           
118        self.__friendlyName = friendlyName
119       
120    friendlyName = property(fget=_get_friendlyName,
121                            fset=_set_friendlyName,
122                            doc="the friendly name of this attribute.")
123   
124    def _get_attributeValues(self):
125        return self.__attributeValues
126   
127    def _set_attributeValues(self, attributeValues):
128        if not isinstance(attributeValues, (list, tuple)):
129            raise TypeError("Expecting basestring type for attributeValues, "
130                            "got %r" % attributeValues)
131           
132        self.__attributeValues = attributeValues
133       
134    attributeValues = property(fget=_get_attributeValues,
135                               fset=_set_attributeValues,
136                               doc="the list of attribute values for this "
137                               "attribute.")
138   
139class Statement(SAMLObject):
140    pass
141
142class AttributeStatement(Statement):
143    '''SAML 2.0 Core AttributeStatement'''
144
145    def __init__(self):
146        self.__attributes = TypedList(Attribute)
147        self.__encryptedAttributes = TypedList(Attribute)
148
149    # Element local name
150    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeStatement"
151   
152    # Default element name.
153    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
154                                 DEFAULT_ELEMENT_LOCAL_NAME, 
155                                 SAMLConstants.SAML20_PREFIX)
156   
157    # Local name of the XSI type.
158    TYPE_LOCAL_NAME = "AttributeStatementType" 
159       
160    # QName of the XSI type.
161    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
162                      TYPE_LOCAL_NAME, 
163                      SAMLConstants.SAML20_PREFIX)
164
165    def _get_attributes(self):
166        '''@return the attributes expressed in this statement
167        '''
168        return self.__attributes
169
170    attributes = property(fget=_get_attributes)
171   
172    def _get_encryptedAttributes(self):
173       '''@return the encrypted attribtues expressed in this statement
174       '''
175       return self.__encryptedAttributes
176   
177    encryptedAttributes = property(fget=_get_encryptedAttributes)
178       
179   
180class Subject(SAMLObject):
181    '''Concrete implementation of @link org.opensaml.saml2.core.Subject.'''
182   
183    # Element local name.
184    DEFAULT_ELEMENT_LOCAL_NAME = "Subject"
185
186    # Default element name.
187    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
188                                 DEFAULT_ELEMENT_LOCAL_NAME,
189                                 SAMLConstants.SAML20_PREFIX)
190
191    # Local name of the XSI type.
192    TYPE_LOCAL_NAME = "SubjectType"
193
194    # QName of the XSI type.
195    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
196                      TYPE_LOCAL_NAME,
197                      SAMLConstants.SAML20_PREFIX)
198
199    def __init__(self, 
200                 namespaceURI=SAMLConstants.SAML20_NS, 
201                 elementLocalName=DEFAULT_ELEMENT_LOCAL_NAME, 
202                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
203        '''@param namespaceURI the namespace the element is in
204        @param elementLocalName the local name of the XML element this Object
205        represents
206        @param namespacePrefix the prefix for the given namespace
207        '''
208        self.__qname = QName(namespaceURI, 
209                             elementLocalName, 
210                             namespacePrefix)
211       
212        # BaseID child element.
213        self.__baseID = None
214   
215        # NameID child element.
216        self.__nameID = None
217   
218        # EncryptedID child element.
219        self.__encryptedID = None
220   
221        # Subject Confirmations of the Subject.
222        self.__subjectConfirmations = []
223   
224    def _get_qname(self):
225        return self.__qname
226   
227    qname = property(fget=_get_qname, doc="Qualified Name for Subject")
228   
229    def _getBaseID(self): 
230        return self.__baseID
231
232    def _setBaseID(self, value):
233        if not isinstance(value, basestring):
234            raise TypeError("Expecting %r type for \"baseID\" got %r" %
235                            (basestring, value.__class__))
236        self.__baseID = value
237
238    baseID = property(fget=_getBaseID, 
239                      fset=_setBaseID, 
240                      doc="Base identifier")
241     
242    def _getNameID(self):
243        return self.__nameID
244   
245    def _setNameID(self, value):
246        if not isinstance(value, NameID):
247            raise TypeError("Expecting %r type for \"nameID\" got %r" %
248                            (NameID, type(value)))
249        self.__nameID = value
250
251    nameID = property(fget=_getNameID, 
252                      fset=_setNameID, 
253                      doc="Name identifier")
254   
255    def _getEncryptedID(self):
256        return self.__encryptedID
257   
258    def _setEncryptedID(self, value): 
259        self.__encryptedID = value
260
261    encryptedID = property(fget=_getEncryptedID, 
262                           fset=_setEncryptedID, 
263                           doc="EncryptedID's Docstring")   
264    def _getSubjectConfirmations(self): 
265        return self.__subjectConfirmations
266
267    subjectConfirmations = property(fget=_getSubjectConfirmations, 
268                                    doc="Subject Confirmations")   
269    def getOrderedChildren(self): 
270        children = []
271
272        if self.baseID is not None:
273            children.append(self.baseID)
274       
275        if self.nameID is not None: 
276            children.append(self.nameID)
277       
278        if self.encryptedID is not None: 
279            children.append(self.encryptedID)
280       
281        children += self.subjectConfirmations
282
283        return tuple(children)
284
285
286class AbstractNameIDType(SAMLObject):
287    '''Abstract implementation of NameIDType'''
288
289    # SPNameQualifier attribute name.
290    SP_NAME_QUALIFIER_ATTRIB_NAME = "SPNameQualifier"
291
292    # Format attribute name.
293    FORMAT_ATTRIB_NAME = "Format"
294
295    # SPProviderID attribute name.
296    SPPROVIDED_ID_ATTRIB_NAME = "SPProvidedID"
297
298    # URI for unspecified name format.
299    UNSPECIFIED = "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
300
301    # URI for email name format.
302    EMAIL = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
303
304    # URI for X509 subject name format.
305    X509_SUBJECT = "urn:oasis:names:tc:SAML:1.1:nameid-format:x509SubjectName"
306
307    # URI for windows domain qualified name name format.
308    WIN_DOMAIN_QUALIFIED = \
309        "urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName"
310
311    # URI for kerberos name format.
312    KERBEROS = "urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos"
313
314    # URI for SAML entity name format.
315    ENTITY = "urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
316
317    # URI for persistent name format.
318    PERSISTENT = "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
319
320    # URI for transient name format.
321    TRANSIENT = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
322
323    # Special URI used by NameIDPolicy to indicate a NameID should be encrypted
324    ENCRYPTED = "urn:oasis:names:tc:SAML:2.0:nameid-format:encrypted"
325   
326    def __init__(self, namespaceURI, elementLocalName, namespacePrefix): 
327        '''@param namespaceURI the namespace the element is in
328        @param elementLocalName the local name of the XML element this Object
329        represents
330        @param namespacePrefix the prefix for the given namespace
331        '''
332        self.__qname = QName(namespaceURI, elementLocalName, namespacePrefix)
333   
334        # Name of the Name ID.
335        self.__name = None
336       
337        # Name Qualifier of the Name ID.
338        self.__nameQualifier = None
339   
340        # SP Name Qualifier of the Name ID.
341        self.__spNameQualifier = None
342   
343        # Format of the Name ID.
344        self.__format = None
345   
346        # SP ProvidedID of the NameID.
347        self.__spProvidedID = None
348
349        self.__value = None
350       
351    def _getQName(self):
352        return self.__qname
353       
354    def _setQName(self, value):
355        if not isinstance(value, QName):
356            raise TypeError("\"qname\" must be a %r derived type, "
357                            "got %r" % (QName, type(value)))
358           
359        self.__qname = value
360
361    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
362             
363    def _getValue(self):
364        return self.__value
365       
366    def _setValue(self, value):
367        if not isinstance(value, basestring):
368            raise TypeError("\"value\" must be a basestring derived type, "
369                            "got %r" % value.__class__)
370           
371        self.__value = value
372
373    value = property(fget=_getValue, fset=_setValue, doc="string value") 
374   
375    def _getNameQualifier(self): 
376        return self.__nameQualifier
377   
378    def _setNameQualifier(self, value): 
379        self.__nameQualifier = value
380
381    nameQualifier = property(fget=_getNameQualifier, 
382                             fset=_setNameQualifier, 
383                             doc="Name qualifier")   
384
385    def _getSPNameQualifier(self): 
386        return self.__spNameQualifier
387   
388    def _setSPNameQualifier(self, value): 
389        self.__spNameQualifier = value
390
391    spNameQualifier = property(fget=_getSPNameQualifier, 
392                               fset=_setSPNameQualifier, 
393                               doc="SP Name qualifier")   
394   
395    def _getFormat(self):
396        return self.__format
397       
398    def _setFormat(self, format):
399        if not isinstance(format, basestring):
400            raise TypeError("\"format\" must be a basestring derived type, "
401                            "got %r" % format.__class__)
402           
403        self.__format = format
404
405    format = property(fget=_getFormat, fset=_setFormat, doc="Name format") 
406   
407    def _getSPProvidedID(self): 
408        return self.__spProvidedID
409   
410    def _setSPProvidedID(self, value): 
411        self.__spProvidedID = value
412
413    spProvidedID = property(fget=_getSPProvidedID, fset=_setSPProvidedID, 
414                            doc="SP Provided Identifier") 
415   
416    def getOrderedChildren(self): 
417        raise NotImplementedError()
418
419   
420class Issuer(AbstractNameIDType):
421    """SAML 2.0 Core Issuer type"""
422   
423    # Element local name.
424    DEFAULT_ELEMENT_LOCAL_NAME = "Issuer"
425
426    # Default element name.
427    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
428                                 DEFAULT_ELEMENT_LOCAL_NAME,
429                                 SAMLConstants.SAML20_PREFIX)
430
431    # Local name of the XSI type.
432    TYPE_LOCAL_NAME = "IssuerType"
433
434    # QName of the XSI type.
435    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
436                      TYPE_LOCAL_NAME,
437                      SAMLConstants.SAML20_PREFIX) 
438   
439    def __init__(self, 
440                 namespaceURI=SAMLConstants.SAML20_NS, 
441                 localPart=DEFAULT_ELEMENT_LOCAL_NAME, 
442                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
443        super(Issuer, self).__init__(namespaceURI,
444                                     localPart,
445                                     namespacePrefix)
446
447     
448class NameID(AbstractNameIDType):
449    '''SAML 2.0 Core NameID'''
450    # Element local name.
451    DEFAULT_ELEMENT_LOCAL_NAME = "NameID"
452
453    # Default element name.
454    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
455                                 DEFAULT_ELEMENT_LOCAL_NAME,
456                                 SAMLConstants.SAML20_PREFIX)
457
458    # Local name of the XSI type.
459    TYPE_LOCAL_NAME = "NameIDType"
460
461    # QName of the XSI type.
462    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
463                      TYPE_LOCAL_NAME,
464                      SAMLConstants.SAML20_PREFIX)
465   
466    def __init__(self, 
467                 namespaceURI=SAMLConstants.SAML20_NS, 
468                 localPart=DEFAULT_ELEMENT_LOCAL_NAME, 
469                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
470        super(NameID, self).__init__(namespaceURI,
471                                     localPart,
472                                     namespacePrefix)
473
474
475class Conditions(SAMLObject): 
476    '''SAML 2.0 Core Conditions.'''
477   
478    # Element local name.
479    DEFAULT_ELEMENT_LOCAL_NAME = "Conditions"
480
481    # Default element name.
482    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
483                                 DEFAULT_ELEMENT_LOCAL_NAME,
484                                 SAMLConstants.SAML20_PREFIX)
485
486    # Local name of the XSI type.
487    TYPE_LOCAL_NAME = "ConditionsType"
488
489    # QName of the XSI type.
490    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
491                      TYPE_LOCAL_NAME,
492                      SAMLConstants.SAML20_PREFIX)
493
494    # NotBefore attribute name.
495    NOT_BEFORE_ATTRIB_NAME = "NotBefore"
496
497    # NotOnOrAfter attribute name.
498    NOT_ON_OR_AFTER_ATTRIB_NAME = "NotOnOrAfter"
499
500    def __init__(self):
501       
502        # A Condition.
503        self.__conditions = []
504   
505        # Not Before conditions.
506        self.__notBefore = None
507   
508        # Not On Or After conditions.
509        self.__notOnOrAfter = None
510
511    def _getNotBefore(self):
512        '''Get the date/time before which the assertion is invalid.
513       
514        @return the date/time before which the assertion is invalid'''
515        return self.__notBefore
516   
517    def _setNotBefore(self, value):
518        '''Sets the date/time before which the assertion is invalid.
519       
520        @param newNotBefore the date/time before which the assertion is invalid
521        '''
522        if not isinstance(value, datetime):
523            raise TypeError('Expecting "datetime" type for "notBefore", '
524                            'got %r' % type(value))
525        self.__notBefore = value
526
527    def _getNotOnOrAfter(self):
528        '''Gets the date/time on, or after, which the assertion is invalid.
529       
530        @return the date/time on, or after, which the assertion is invalid'
531        '''
532        return self.__notBefore
533   
534    def _setNotOnOrAfter(self, value):
535        '''Sets the date/time on, or after, which the assertion is invalid.
536       
537        @param newNotOnOrAfter the date/time on, or after, which the assertion
538        is invalid
539        '''
540        if not isinstance(value, datetime):
541            raise TypeError('Expecting "datetime" type for "notOnOrAfter", '
542                            'got %r' % type(value))
543        self.__notOnOrAfter = value 
544
545    def _getConditions(self):
546        '''Gets all the conditions on the assertion.
547       
548        @return all the conditions on the assertion
549        '''
550        return self.__conditions
551   
552    conditions = property(fget=_getConditions,
553                          doc="List of conditions")
554   
555    def _getAudienceRestrictions(self):
556        '''Gets the audience restriction conditions for the assertion.
557       
558        @return the audience restriction conditions for the assertion
559        '''
560        raise NotImplementedError()
561
562    def _getOneTimeUse(self):
563        '''Gets the OneTimeUse condition for the assertion.
564       
565        @return the OneTimeUse condition for the assertion
566        '''
567        raise NotImplementedError()
568
569    def _getProxyRestriction(self):   
570        '''Gets the ProxyRestriction condition for the assertion.
571       
572        @return the ProxyRestriction condition for the assertion
573        '''
574        raise NotImplementedError()
575       
576
577class Assertion(SAMLObject):
578    """SAML 2.0 Attribute Assertion for use with NERC DataGrid   
579    """   
580    ns = "urn:oasis:names:tc:SAML:1.0:assertion"
581    nsPfx = "saml"
582    issuer = 'http:#badc.nerc.ac.uk'
583    attributeName = "urn:mace:dir:attribute-def:eduPersonAffiliation"
584    attributeNS = "urn:mace:shibboleth:1.0:attributeNamespace:uri"
585
586    # Element local name.
587    DEFAULT_ELEMENT_LOCAL_NAME = "Assertion"
588
589    # Default element name.
590    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
591                                 DEFAULT_ELEMENT_LOCAL_NAME,
592                                 SAMLConstants.SAML20_PREFIX)
593
594    # Local name of the XSI type.
595    TYPE_LOCAL_NAME = "AssertionType"
596
597    # QName of the XSI type.
598    TYPE_NAME = QName(SAMLConstants.SAML20_NS, TYPE_LOCAL_NAME,
599                      SAMLConstants.SAML20_PREFIX)
600
601    # Version attribute name.
602    VERSION_ATTRIB_NAME = "Version"
603
604    # IssueInstant attribute name.
605    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
606
607    # ID attribute name.
608    ID_ATTRIB_NAME = "ID"
609
610    def __init__(self):
611        # Base class initialisation
612        super(Assertion, self).__init__()
613       
614        self.__version = None
615        self.__issueInstant = None
616        self.__id = None
617        self.__issuer = None
618        self.__subject = None
619       
620        self.__conditions = None
621        self.__advice = None
622        self.__statements = TypedList(Statement)
623       
624        # TODO: Implement AuthnStatement and AuthzDecisionStatement classes
625        self.__authnStatements = []
626        self.__authzDecisionStatements = []
627        self.__attributeStatements = TypedList(AttributeStatement)
628       
629    def _get_version(self):
630        '''@return the SAML Version of this assertion.
631        '''
632        return self.__version
633   
634    def _set_version(self, version):
635        '''@param version the SAML Version of this assertion
636        '''
637        if not isinstance(version, SAMLVersion):
638            raise TypeError("Expecting SAMLVersion type got: %r" % 
639                            version.__class__)
640       
641        self.__version = version
642       
643    version = property(fget=_get_version,
644                       fset=_set_version,
645                       doc="SAML Version of the assertion")
646
647    def _get_issueInstant(self):
648        '''Gets the issue instance of this assertion.
649       
650        @return the issue instance of this assertion'''
651        return self.__issueInstant
652   
653    def _set_issueInstant(self, issueInstant):
654        '''Sets the issue instance of this assertion.
655       
656        @param newIssueInstance the issue instance of this assertion
657        '''
658        if not isinstance(issueInstant, datetime):
659            raise TypeError('Expecting "datetime" type for "issueInstant", '
660                            'got %r' % issueInstant.__class__)
661           
662        self.__issueInstant = issueInstant
663       
664    issueInstant = property(fget=_get_issueInstant, 
665                            fset=_set_issueInstant,
666                            doc="Issue instant of the assertion")
667
668    def _get_id(self):
669        '''Sets the ID of this assertion.
670       
671        @return the ID of this assertion
672        '''
673        return self.__id
674   
675    def _set_id(self, _id):
676        '''Sets the ID of this assertion.
677       
678        @param newID the ID of this assertion
679        '''
680        if not isinstance(_id, basestring):
681            raise TypeError('Expecting basestring derived type for "id", got '
682                            '%r' % _id.__class__)
683        self.__id = _id
684       
685    id = property(fget=_get_id, fset=_set_id, doc="ID of assertion")
686   
687    def _set_issuer(self, issuer):
688        """Set issuer"""
689        if not isinstance(issuer, Issuer):
690            raise TypeError("issuer must be %r, got %r" % (Issuer, 
691                                                           type(issuer)))
692        self.__issuer = issuer
693   
694    def _get_issuer(self):
695        """Get the issuer name """
696        return self.__issuer
697
698    issuer = property(fget=_get_issuer, 
699                      fset=_set_issuer,
700                      doc="Issuer of assertion")
701   
702    def _set_subject(self, subject):
703        """Set subject string."""
704        if not isinstance(subject, Subject):
705            raise TypeError("subject must be %r, got %r" % (Subject, 
706                                                            type(subject)))
707
708        self.__subject = subject
709   
710    def _get_subject(self):
711        """Get subject string."""
712        return self.__subject
713
714    subject = property(fget=_get_subject,
715                       fset=_set_subject, 
716                       doc="Attribute Assertion subject")
717   
718    def _get_conditions(self):
719        """Get conditions string."""
720        return self.__conditions
721   
722    def _set_conditions(self, value):
723        """Get conditions string."""
724        if not isinstance(value, Conditions):
725            raise TypeError("Conditions must be %r, got %r" % (Conditions, 
726                                                               type(value)))
727
728        self.__conditions = value
729
730    conditions = property(fget=_get_conditions,
731                          fset=_set_conditions,
732                          doc="Attribute Assertion conditions")
733   
734    def _set_advice(self, advice):
735        """Set advice string."""
736        if not isinstance(advice, basestring):
737            raise TypeError("advice must be a string")
738
739        self.__advice = advice
740   
741    def _get_advice(self):
742        """Get advice string."""
743        return self.__advice
744
745    advice = property(fget=_get_advice,
746                      fset=_set_advice, 
747                      doc="Attribute Assertion advice")
748   
749    def _get_statements(self):
750        """Get statements string."""
751        return self.__statements
752
753    statements = property(fget=_get_statements,
754                          doc="Attribute Assertion statements")
755   
756    def _get_authnStatements(self):
757        """Get authnStatements string."""
758        return self.__authnStatements
759
760    authnStatements = property(fget=_get_authnStatements,
761                               doc="Attribute Assertion authentication "
762                                   "statements")
763   
764    def _get_authzDecisionStatements(self):
765        """Get authorisation decision statements."""
766        return self.__authzDecisionStatements
767
768    authzDecisionStatements = property(fget=_get_authzDecisionStatements,
769                                       doc="Attribute Assertion authorisation "
770                                           "decision statements")
771   
772    def _get_attributeStatements(self):
773        """Get attributeStatements string."""
774        return self.__attributeStatements
775
776    attributeStatements = property(fget=_get_attributeStatements,
777                                   doc="Attribute Assertion attribute "
778                                       "statements")
779   
780
781class AttributeValue(SAMLObject):
782
783    # Element name, no namespace
784    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeValue"
785
786    # Default element name
787    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
788                                 DEFAULT_ELEMENT_LOCAL_NAME,
789                                 SAMLConstants.SAML20_PREFIX)
790
791
792class StatusDetail(SAMLObject):
793    '''Implementation of SAML 2.0 StatusDetail'''
794   
795    # Local Name of StatusDetail.
796    DEFAULT_ELEMENT_LOCAL_NAME = "StatusDetail"
797
798    # Default element name.
799    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
800                                 DEFAULT_ELEMENT_LOCAL_NAME,
801                                 SAMLConstants.SAML20P_PREFIX)
802
803    # Local name of the XSI type.
804    TYPE_LOCAL_NAME = "StatusDetailType"
805
806    # QName of the XSI type.
807    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
808                      TYPE_LOCAL_NAME,
809                      SAMLConstants.SAML20P_PREFIX)
810   
811    def __init__(self):
812        # child "any" elements.
813        self.__unknownChildren = TypedList(SAMLObject)         
814        self.__qname = QName(StatusDetail.DEFAULT_ELEMENT_NAME.namespaceURI,
815                             StatusDetail.DEFAULT_ELEMENT_NAME,
816                             StatusDetail.DEFAULT_ELEMENT_NAME.prefix)
817   
818    def getUnknownXMLObjects(self, qname=None): 
819        if qname is not None:
820            if not isinstance(qname, QName):
821                raise TypeError("\"qname\" must be a %r derived type, "
822                                "got %r" % (QName, type(qname)))
823               
824            children = []
825            for child in self.__unknownChildren:
826                childQName = getattr(child, "qname", None)
827                if childQName is not None:
828                    if childQName.namespaceURI == qname.namespaceURI or \
829                       childQName.localPart == qname.localPart:
830                        children.append(child)
831                       
832            return children
833        else:
834            return self.__unknownChildren
835   
836    unknownChildren = property(fget=getUnknownXMLObjects,
837                               doc="Child objects of Status Detail - may be "
838                                   "any type")
839               
840    def _getQName(self):
841        return self.__qname
842       
843    def _setQName(self, value):
844        if not isinstance(value, QName):
845            raise TypeError("\"qname\" must be a %r derived type, "
846                            "got %r" % (QName, type(value)))
847           
848        self.__qname = value
849
850    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
851   
852
853class StatusMessage(SAMLObject):
854    '''Implementation of SAML 2.0 Status Message'''
855
856    def __init__(self):
857        # Value attribute URI.
858        self.__value = None       
859        self.__qname = None
860             
861    def _getValue(self):
862        return self.__value
863       
864    def _setValue(self, value):
865        if not isinstance(value, basestring):
866            raise TypeError("\"value\" must be a basestring derived type, "
867                            "got %r" % value.__class__)
868           
869        self.__value = value
870
871    value = property(fget=_getValue, fset=_setValue, 
872                     doc="Status message value")
873               
874    def _getQName(self):
875        return self.__qname
876       
877    def _setQName(self, value):
878        if not isinstance(value, QName):
879            raise TypeError("\"qname\" must be a %r derived type, "
880                            "got %r" % (QName, type(value)))
881           
882        self.__qname = value
883
884    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
885
886
887class StatusCode(SAMLObject):
888    '''Implementation of SAML 2.0 StatusCode.'''
889   
890    # Local Name of StatusCode.
891    DEFAULT_ELEMENT_LOCAL_NAME = "StatusCode"
892
893    # Default element name.
894    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
895                                 DEFAULT_ELEMENT_LOCAL_NAME,
896                                 SAMLConstants.SAML20P_PREFIX)
897
898    # Local name of the XSI type.
899    TYPE_LOCAL_NAME = "StatusCodeType"
900
901    # QName of the XSI type.
902    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
903                      TYPE_LOCAL_NAME,
904                      SAMLConstants.SAML20P_PREFIX)
905
906    # Local Name of the Value attribute.
907    VALUE_ATTRIB_NAME = "Value"
908
909    # URI for Success status code.
910    SUCCESS_URI = "urn:oasis:names:tc:SAML:2.0:status:Success"
911
912    # URI for Requester status code.
913    REQUESTER_URI = "urn:oasis:names:tc:SAML:2.0:status:Requester"
914
915    # URI for Responder status code.
916    RESPONDER_URI = "urn:oasis:names:tc:SAML:2.0:status:Responder"
917
918    # URI for VersionMismatch status code.
919    VERSION_MISMATCH_URI = "urn:oasis:names:tc:SAML:2.0:status:VersionMismatch"
920
921    # URI for AuthnFailed status code.
922    AUTHN_FAILED_URI = "urn:oasis:names:tc:SAML:2.0:status:AuthnFailed"
923
924    # URI for InvalidAttrNameOrValue status code.
925    INVALID_ATTR_NAME_VALUE_URI = \
926                "urn:oasis:names:tc:SAML:2.0:status:InvalidAttrNameOrValue"
927
928    # URI for InvalidNameIDPolicy status code.
929    INVALID_NAMEID_POLICY_URI = \
930                "urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy"
931
932    # URI for NoAuthnContext status code.
933    NO_AUTHN_CONTEXT_URI = "urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext"
934
935    # URI for NoAvailableIDP status code.
936    NO_AVAILABLE_IDP_URI = "urn:oasis:names:tc:SAML:2.0:status:NoAvailableIDP"
937
938    # URI for NoPassive status code.
939    NO_PASSIVE_URI = "urn:oasis:names:tc:SAML:2.0:status:NoPassive"
940
941    # URI for NoSupportedIDP status code.
942    NO_SUPPORTED_IDP_URI = "urn:oasis:names:tc:SAML:2.0:status:NoSupportedIDP"
943
944    # URI for PartialLogout status code.
945    PARTIAL_LOGOUT_URI = "urn:oasis:names:tc:SAML:2.0:status:PartialLogout"
946
947    # URI for ProxyCountExceeded status code.
948    PROXY_COUNT_EXCEEDED_URI = \
949                "urn:oasis:names:tc:SAML:2.0:status:ProxyCountExceeded"
950
951    # URI for RequestDenied status code.
952    REQUEST_DENIED_URI = "urn:oasis:names:tc:SAML:2.0:status:RequestDenied"
953
954    # URI for RequestUnsupported status code.
955    REQUEST_UNSUPPORTED_URI = \
956                "urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported"
957
958    # URI for RequestVersionDeprecated status code.
959    REQUEST_VERSION_DEPRECATED_URI = \
960                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionDeprecated"
961
962    # URI for RequestVersionTooHigh status code.
963    REQUEST_VERSION_TOO_HIGH_URI = \
964                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooHigh"
965   
966    # URI for RequestVersionTooLow status code.
967    REQUEST_VERSION_TOO_LOW_URI = \
968                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooLow"
969
970    # URI for ResourceNotRecognized status code.
971    RESOURCE_NOT_RECOGNIZED_URI = \
972                "urn:oasis:names:tc:SAML:2.0:status:ResourceNotRecognized"
973
974    # URI for TooManyResponses status code.
975    TOO_MANY_RESPONSES = "urn:oasis:names:tc:SAML:2.0:status:TooManyResponses"
976
977    # URI for UnknownAttrProfile status code.
978    UNKNOWN_ATTR_PROFILE_URI = \
979                "urn:oasis:names:tc:SAML:2.0:status:UnknownAttrProfile"
980
981    # URI for UnknownPrincipal status code.
982    UNKNOWN_PRINCIPAL_URI = \
983                "urn:oasis:names:tc:SAML:2.0:status:UnknownPrincipal"
984
985    # URI for UnsupportedBinding status code.
986    UNSUPPORTED_BINDING_URI = \
987                "urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding"
988
989    def __init__(self):
990        # Value attribute URI.
991        self.__value = None
992   
993        # Nested secondary StatusCode child element.
994        self.__childStatusCode = None
995       
996        self.__qname = QName(StatusCode.DEFAULT_ELEMENT_NAME.namespaceURI,
997                             StatusCode.DEFAULT_ELEMENT_NAME.localPart,
998                             StatusCode.DEFAULT_ELEMENT_NAME.prefix)
999
1000    def _getStatusCode(self): 
1001        return self.__childStatusCode
1002   
1003    def _setStatusCode(self, value):
1004        if not isinstance(value, StatusCode):
1005            raise TypeError('Child "statusCode" must be a %r derived type, '
1006                            "got %r" % (StatusCode, type(value)))
1007           
1008        self.__childStatusCode = value
1009
1010    value = property(fget=_getStatusCode, 
1011                     fset=_setStatusCode, 
1012                     doc="Child Status code")
1013             
1014    def _getValue(self):
1015        return self.__value
1016       
1017    def _setValue(self, value):
1018        if not isinstance(value, basestring):
1019            raise TypeError("\"value\" must be a basestring derived type, "
1020                            "got %r" % value.__class__)
1021           
1022        self.__value = value
1023
1024    value = property(fget=_getValue, fset=_setValue, doc="Status code value")
1025               
1026    def _getQName(self):
1027        return self.__qname
1028       
1029    def _setQName(self, value):
1030        if not isinstance(value, QName):
1031            raise TypeError("\"qname\" must be a %r derived type, "
1032                            "got %r" % (QName, type(value)))
1033           
1034        self.__qname = value
1035
1036    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1037       
1038
1039class Status(SAMLObject): 
1040    '''SAML 2.0 Core Status'''
1041   
1042    # Local Name of Status.
1043    DEFAULT_ELEMENT_LOCAL_NAME = "Status"
1044
1045    # Default element name.
1046    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1047                                 DEFAULT_ELEMENT_LOCAL_NAME,
1048                                 SAMLConstants.SAML20P_PREFIX)
1049
1050    # Local name of the XSI type.
1051    TYPE_LOCAL_NAME = "StatusType"
1052
1053    # QName of the XSI type.
1054    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1055                      TYPE_LOCAL_NAME,
1056                      SAMLConstants.SAML20P_PREFIX)
1057
1058    def __init__(self):
1059        # StatusCode element.
1060        self.__statusCode = None
1061   
1062        # StatusMessage element.
1063        self.__statusMessage = None
1064   
1065        # StatusDetail element.
1066        self.__statusDetail = None
1067       
1068        self.__qname = QName(Status.DEFAULT_ELEMENT_NAME.namespaceURI,
1069                             Status.DEFAULT_ELEMENT_NAME.localPart,
1070                             Status.DEFAULT_ELEMENT_NAME.prefix)
1071               
1072    def _getQName(self):
1073        return self.__qname
1074       
1075    def _setQName(self, value):
1076        if not isinstance(value, QName):
1077            raise TypeError("\"qname\" must be a %r derived type, "
1078                            "got %r" % (QName, type(value)))
1079           
1080        self.__qname = value
1081
1082    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1083       
1084    def _getStatusCode(self):
1085        '''
1086        Gets the Code of this Status.
1087       
1088        @return Status StatusCode
1089        '''
1090        return self.__statusCode
1091
1092    def _setStatusCode(self, value):
1093        '''
1094        Sets the Code of this Status.
1095       
1096        @param newStatusCode the Code of this Status
1097        '''
1098        if not isinstance(value, StatusCode):
1099            raise TypeError('"statusCode" must be a %r derived type, '
1100                            "got %r" % (StatusCode, type(value)))
1101           
1102        self.__statusCode = value
1103       
1104    statusCode = property(fget=_getStatusCode,
1105                          fset=_setStatusCode,
1106                          doc="status code object")
1107   
1108    def _getStatusMessage(self):
1109        '''
1110        Gets the Message of this Status.
1111       
1112        @return Status StatusMessage
1113        '''
1114        return self.__statusMessage
1115
1116    def _setStatusMessage(self, value):
1117        '''
1118        Sets the Message of this Status.
1119       
1120        @param newStatusMessage the Message of this Status
1121        '''
1122        if not isinstance(value, basestring):
1123            raise TypeError('"statusMessage" must be a %r derived type, '
1124                            "got %r" % (basestring, type(value)))
1125           
1126        self.__statusMessage = value
1127       
1128    statusMessage = property(fget=_getStatusMessage,
1129                             fset=_setStatusMessage,
1130                             doc="status message")
1131
1132    def _getStatusDetail(self):
1133        '''
1134        Gets the Detail of this Status.
1135       
1136        @return Status StatusDetail
1137        '''
1138        return self.__statusDetail
1139   
1140    def _setStatusDetail(self, value):
1141        '''
1142        Sets the Detail of this Status.
1143       
1144        @param newStatusDetail the Detail of this Status
1145        '''
1146        self.__statusDetail = value
1147       
1148    statusDetail = property(fget=_getStatusDetail,
1149                            fset=_setStatusDetail,
1150                            doc="status message")
1151
1152
1153class RequestAbstractType(SAMLObject): 
1154    '''SAML 2.0 Core RequestAbstractType'''
1155   
1156    # Local name of the XSI type.
1157    TYPE_LOCAL_NAME = "RequestAbstractType"
1158
1159    # QName of the XSI type.
1160    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1161                      TYPE_LOCAL_NAME,
1162                      SAMLConstants.SAML20P_PREFIX)
1163
1164    # ID attribute name.
1165    ID_ATTRIB_NAME = "ID"
1166
1167    # Version attribute name.
1168    VERSION_ATTRIB_NAME = "Version"
1169
1170    # IssueInstant attribute name.
1171    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
1172
1173    # Destination attribute name.
1174    DESTINATION_ATTRIB_NAME = "Destination"
1175
1176    # Consent attribute name.
1177    CONSENT_ATTRIB_NAME = "Consent"
1178
1179    # Unspecified consent URI.
1180    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
1181
1182    # Obtained consent URI.
1183    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
1184
1185    # Prior consent URI.
1186    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
1187
1188    # Implicit consent URI.
1189    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
1190
1191    # Explicit consent URI.
1192    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
1193
1194    # Unavailable consent URI.
1195    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
1196
1197    # Inapplicable consent URI.
1198    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable" 
1199
1200    def __init__(self):
1201        # SAML Version of the request.
1202        self.__version = None
1203   
1204        # Unique identifier of the request.
1205        self.__id = None
1206   
1207        # Date/time request was issued.
1208        self.__issueInstant = None
1209   
1210        # URI of the request destination.
1211        self.__destination = None
1212   
1213        # URI of the SAML user consent type.
1214        self.__consent = None
1215   
1216        # URI of the SAML user consent type.
1217        self.__issuer = None
1218   
1219        # Extensions child element.
1220        self.__extensions = None
1221       
1222    def _get_version(self):
1223        '''@return the SAML Version of this assertion.
1224        '''
1225        return self.__version
1226   
1227    def _set_version(self, version):
1228        '''@param version the SAML Version of this assertion
1229        '''
1230        if not isinstance(version, SAMLVersion):
1231            raise TypeError("Expecting SAMLVersion type got: %r" % 
1232                            version.__class__)
1233       
1234        self.__version = version
1235       
1236    version = property(fget=_get_version,
1237                       fset=_set_version,
1238                       doc="SAML Version of the assertion")
1239
1240    def _get_issueInstant(self):
1241        '''Gets the date/time the request was issued
1242       
1243        @return the issue instance of this request'''
1244        return self.__issueInstant
1245   
1246    def _set_issueInstant(self, value):
1247        '''Sets the date/time the request was issued
1248       
1249        @param value the issue instance of this request
1250        '''
1251        if not isinstance(value, datetime):
1252            raise TypeError('Expecting "datetime" type for "issueInstant", '
1253                            'got %r' % type(value))
1254           
1255        self.__issueInstant = value
1256       
1257    issueInstant = property(fget=_get_issueInstant, 
1258                            fset=_set_issueInstant,
1259                            doc="Issue instant of the request") 
1260
1261    def _get_id(self):
1262        '''Sets the unique identifier for this request.
1263       
1264        @return the ID of this request
1265        '''
1266        return self.__id
1267   
1268    def _set_id(self, value):
1269        '''Sets the unique identifier for this request
1270       
1271        @param newID the ID of this assertion
1272        '''
1273        if not isinstance(value, basestring):
1274            raise TypeError('Expecting basestring derived type for "id", got '
1275                            '%r' % type(value))
1276        self.__id = value
1277       
1278    id = property(fget=_get_id, fset=_set_id, doc="ID of request")
1279
1280    def _get_destination(self):
1281        '''Gets the URI of the destination of the request.
1282       
1283        @return the URI of the destination of the request
1284        '''
1285        return self.__destination
1286   
1287    def _set_destination(self, value):
1288        '''Sets the URI of the destination of the request.
1289       
1290        @param newDestination the URI of the destination of the request'''
1291        if not isinstance(value, basestring):
1292            raise TypeError('Expecting basestring derived type for '
1293                            '"destination", got %r' % type(value))
1294        self.__destination = value
1295       
1296    destination = property(fget=_get_destination, 
1297                           fset=_set_destination,
1298                           doc="Destination of request")
1299     
1300    def _get_consent(self):
1301        '''Gets the consent obtained from the principal for sending this
1302        request.
1303       
1304        @return: the consent obtained from the principal for sending this
1305        request
1306        '''
1307        return self.__consent
1308       
1309    def _set_consent(self, value):
1310        '''Sets the consent obtained from the principal for sending this
1311        request.
1312       
1313        @param value: the new consent obtained from the principal for
1314        sending this request
1315        ''' 
1316        if not isinstance(value, basestring):
1317            raise TypeError('Expecting basestring derived type for "consent", '
1318                            'got %r' % type(value))
1319        self.__consent = value
1320             
1321    consent = property(fget=_get_consent, 
1322                       fset=_set_consent,
1323                       doc="Consent for request")
1324   
1325    def _set_issuer(self, issuer):
1326        """Set issuer of request"""
1327        if not isinstance(issuer, Issuer):
1328            raise TypeError('"issuer" must be a %r, got %r' % (Issuer, 
1329                                                               type(issuer)))
1330       
1331        self.__issuer = issuer
1332   
1333    def _get_issuer(self):
1334        """Get the issuer name """
1335        return self.__issuer
1336
1337    issuer = property(fget=_get_issuer, 
1338                      fset=_set_issuer,
1339                      doc="Issuer of request")
1340 
1341    def _get_extensions(self):
1342        '''Gets the Extensions of this request.
1343       
1344        @return: the Status of this request
1345        '''
1346        return self.__extensions
1347     
1348    def _set_extensions(self, value):
1349        '''Sets the Extensions of this request.
1350       
1351        @param value: the Extensions of this request
1352        '''
1353        self.__extensions = value
1354       
1355    extensions = property(fget=_get_extensions, 
1356                          fset=_set_extensions,
1357                          doc="Request extensions")
1358
1359
1360class SubjectQuery(RequestAbstractType):
1361    """SAML 2.0 Core Subject Query type"""
1362   
1363    def __init__(self):
1364        self.__subject = None
1365       
1366    def _getSubject(self):
1367        '''Gets the Subject of this request.
1368       
1369        @return the Subject of this request'''   
1370        return self.__subject
1371   
1372    def _setSubject(self, value):
1373        '''Sets the Subject of this request.
1374       
1375        @param newSubject the Subject of this request'''
1376        if not isinstance(value, Subject):
1377            raise TypeError('Setting "subject", got %r, expecting %r' %
1378                            (Subject, type(value)))
1379           
1380        self.__subject = value
1381       
1382    subject = property(fget=_getSubject, fset=_setSubject, doc="Query subject")
1383   
1384   
1385class AttributeQuery(SubjectQuery):
1386    '''SAML 2.0 AttributeQuery'''
1387   
1388    # Element local name.
1389    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeQuery"
1390
1391    # Default element name.
1392    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1393                                 DEFAULT_ELEMENT_LOCAL_NAME,
1394                                 SAMLConstants.SAML20P_PREFIX)
1395
1396    # Local name of the XSI type.
1397    TYPE_LOCAL_NAME = "AttributeQueryType"
1398
1399    # QName of the XSI type.
1400    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1401                      TYPE_LOCAL_NAME,
1402                      SAMLConstants.SAML20P_PREFIX)
1403
1404    def __init__(self):
1405        self.__attributes = TypedList(Attribute)
1406 
1407    def _getAttributes(self):
1408        '''Gets the Attributes of this query.
1409       
1410        @return the list of Attributes of this query'''
1411        return self.__attributes
1412
1413    def _setAttributes(self, value):
1414        self.__attributes = value
1415
1416    attributes = property(fget=_getAttributes, 
1417                          fset=_setAttributes, 
1418                          doc="Attributes")
1419
1420
1421class StatusResponseType(SAMLObject):
1422    '''SAML 2.0 Core Status Response Type
1423    '''
1424
1425    # Local name of the XSI type.
1426    TYPE_LOCAL_NAME = "StatusResponseType"
1427
1428    # QName of the XSI type.
1429    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1430                      TYPE_LOCAL_NAME,
1431                      SAMLConstants.SAML20P_PREFIX)
1432
1433    # ID attribute name
1434    ID_ATTRIB_NAME = "ID"
1435
1436    # InResponseTo attribute name
1437    IN_RESPONSE_TO_ATTRIB_NAME = "InResponseTo"
1438
1439    # Version attribute name
1440    VERSION_ATTRIB_NAME = "Version"
1441
1442    # IssueInstant attribute name
1443    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
1444
1445    # Destination attribute name
1446    DESTINATION_ATTRIB_NAME = "Destination"
1447
1448    # Consent attribute name.
1449    CONSENT_ATTRIB_NAME = "Consent"
1450
1451    # Unspecified consent URI
1452    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
1453
1454    # Obtained consent URI
1455    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
1456
1457    # Prior consent URI
1458    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
1459
1460    # Implicit consent URI
1461    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
1462
1463    # Explicit consent URI
1464    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
1465
1466    # Unavailable consent URI
1467    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
1468
1469    # Inapplicable consent URI
1470    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable"
1471
1472    def __init__(self):
1473        self.__qname = None
1474       
1475        self.__version = SAMLVersion(SAMLVersion.VERSION_20)
1476        self.__id = None
1477        self.__inResponseTo = None
1478        self.__issueInstant = None
1479        self.__destination = None
1480        self.__consent = None
1481        self.__issuer = None
1482        self.__status = None
1483        self.__extensions = None
1484       
1485    def _getQName(self):
1486        return self.__qname
1487       
1488    def _setQName(self, value):
1489        if not isinstance(value, QName):
1490            raise TypeError("\"qname\" must be a %r derived type, "
1491                            "got %r" % (QName, type(value)))
1492           
1493        self.__qname = value
1494
1495    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1496
1497    def _get_version(self):
1498        '''@return the SAML Version of this response.
1499        '''
1500        return self.__version
1501   
1502    def _set_version(self, version):
1503        '''@param version the SAML Version of this response
1504        '''
1505        if not isinstance(version, SAMLVersion):
1506            raise TypeError("Expecting SAMLVersion type got: %r" % 
1507                            version.__class__)
1508       
1509        self.__version = version
1510       
1511    version = property(fget=_get_version,
1512                       fset=_set_version,
1513                       doc="SAML Version of the response")
1514
1515    def _get_id(self):
1516        '''Sets the ID of this response.
1517       
1518        @return the ID of this response
1519        '''
1520        return self.__id
1521   
1522    def _set_id(self, value):
1523        '''Sets the ID of this response.
1524       
1525        @param value: the ID of this response
1526        '''
1527        if not isinstance(value, basestring):
1528            raise TypeError('Expecting basestring derived type for "id", got '
1529                            '%r' % type(value))
1530        self.__id = value
1531       
1532    id = property(fget=_get_id, fset=_set_id, doc="ID of response")
1533
1534    def _getInResponseTo(self):
1535        '''Get the unique request identifier for which this is a response
1536       
1537        @return value: the unique identifier of the originating
1538        request
1539        '''
1540        return self.__inResponseTo
1541   
1542    def _setInResponseTo(self, value):
1543        '''Set the unique request identifier for which this is a response
1544       
1545        @param value: the unique identifier of the originating
1546        request
1547        '''
1548        if not isinstance(value, basestring):
1549            raise TypeError('Expecting basestring derived type for '
1550                            '"inResponseTo", got %r' % type(value))
1551        self.__inResponseTo = value
1552       
1553    inResponseTo = property(fget=_getInResponseTo, 
1554                            fset=_setInResponseTo,
1555                            doc="unique request identifier for which this is "
1556                                "a response")
1557
1558    def _get_issueInstant(self):
1559        '''Gets the issue instance of this response.
1560       
1561        @return the issue instance of this response'''
1562        return self.__issueInstant
1563   
1564    def _set_issueInstant(self, issueInstant):
1565        '''Sets the issue instance of this response.
1566       
1567        @param newIssueInstance the issue instance of this response
1568        '''
1569        if not isinstance(issueInstant, datetime):
1570            raise TypeError('Expecting "datetime" type for "issueInstant", '
1571                            'got %r' % issueInstant.__class__)
1572           
1573        self.__issueInstant = issueInstant
1574       
1575    issueInstant = property(fget=_get_issueInstant, 
1576                            fset=_set_issueInstant,
1577                            doc="Issue instant of the response")
1578
1579    def _get_destination(self):
1580        '''Gets the URI of the destination of the response.
1581       
1582        @return the URI of the destination of the response
1583        '''
1584        return self.__destination
1585   
1586    def _set_destination(self, value):
1587        '''Sets the URI of the destination of the response.
1588       
1589        @param value: the URI of the destination of the response'''
1590        if not isinstance(value, basestring):
1591            raise TypeError('Expecting basestring derived type for '
1592                            '"destination", got %r' % type(value))
1593        self.__destination = value
1594       
1595    destination = property(fget=_get_destination, 
1596                           fset=_set_destination,
1597                           doc="Destination of response")
1598     
1599    def _get_consent(self):
1600        '''Gets the consent obtained from the principal for sending this
1601        response.
1602       
1603        @return: the consent obtained from the principal for sending this
1604        response
1605        '''
1606        return self.__consent
1607       
1608    def _set_consent(self, value):
1609        '''Sets the consent obtained from the principal for sending this
1610        response.
1611       
1612        @param value: the new consent obtained from the principal for
1613        sending this response
1614        ''' 
1615        if not isinstance(value, basestring):
1616            raise TypeError('Expecting basestring derived type for "consent", '
1617                            'got %r' % type(value))
1618        self.__consent = value
1619             
1620    consent = property(fget=_get_consent, 
1621                       fset=_set_consent,
1622                       doc="Consent for response")
1623   
1624    def _set_issuer(self, issuer):
1625        """Set issuer of response"""
1626        if not isinstance(issuer, Issuer):
1627            raise TypeError('"issuer" must be a %r, got %r' % (Issuer,
1628                                                               type(issuer)))
1629        self.__issuer = issuer
1630   
1631    def _get_issuer(self):
1632        """Get the issuer name """
1633        return self.__issuer
1634
1635    issuer = property(fget=_get_issuer, 
1636                      fset=_set_issuer,
1637                      doc="Issuer of response")
1638   
1639    def _getStatus(self):
1640        '''Gets the Status of this response.
1641       
1642        @return the Status of this response
1643        '''
1644        return self.__status
1645
1646    def _setStatus(self, value):
1647        '''Sets the Status of this response.
1648       
1649        @param newStatus the Status of this response
1650        '''
1651        if not isinstance(value, Status):
1652            raise TypeError('"status" must be a %r, got %r' % (Status,
1653                                                               type(value)))
1654        self.__status = value
1655       
1656    status = property(fget=_getStatus, fset=_setStatus, doc="Response status")   
1657       
1658    def _get_extensions(self):
1659        '''Gets the Extensions of this response.
1660       
1661        @return: the Status of this response
1662        '''
1663        return self.__extensions
1664     
1665    def _set_extensions(self, value):
1666        '''Sets the Extensions of this response.
1667       
1668        @param value: the Extensions of this response
1669        '''
1670        if not isinstance(value, (list, tuple)):
1671            raise TypeError('Expecting list or tuple for "extensions", got %r'
1672                            % type(value))
1673        self.__extensions = value
1674       
1675    extensions = property(fget=_get_extensions, 
1676                          fset=_set_extensions,
1677                          doc="Response extensions")   
1678
1679
1680class Response(StatusResponseType):
1681    '''SAML2 Core Response'''
1682   
1683    # Element local name.
1684    DEFAULT_ELEMENT_LOCAL_NAME = "Response"
1685   
1686    # Default element name.
1687    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1688                                 DEFAULT_ELEMENT_LOCAL_NAME, 
1689                                 SAMLConstants.SAML20P_PREFIX)
1690   
1691    # Local name of the XSI type.
1692    TYPE_LOCAL_NAME = "ResponseType"
1693       
1694    # QName of the XSI type.
1695    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1696                      TYPE_LOCAL_NAME, 
1697                      SAMLConstants.SAML20P_PREFIX)
1698   
1699    def __init__(self):
1700        '''''' 
1701        super(Response, self).__init__()
1702       
1703        # Assertion child elements
1704        self.__indexedChildren = []
1705   
1706    def _getAssertions(self): 
1707        return self.__indexedChildren
1708   
1709    assertions = property(fget=_getAssertions,
1710                          doc="Assertions contained in this response")
Note: See TracBrowser for help on using the repository browser.