source: TI12-security/trunk/python/ndg.security.saml/saml/__init__.py @ 5596

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

test_saml unit tests fixed running in new saml egg

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