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

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

Adding Assertion parsing functionality - not finished!

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 Advice(SAMLObject):
578    '''SAML 2.0 Core Advice.
579    '''
580
581    # Element local name
582    DEFAULT_ELEMENT_LOCAL_NAME = "Advice"
583
584    # Default element name.
585    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
586                                 DEFAULT_ELEMENT_LOCAL_NAME,
587                                 SAMLConstants.SAML20_PREFIX)
588
589    # Local name of the XSI type
590    TYPE_LOCAL_NAME = "AdviceType"
591
592    # QName of the XSI type
593    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
594                      TYPE_LOCAL_NAME,
595                      SAMLConstants.SAML20_PREFIX)
596
597    def _getChildren(self, typeOrName=None):
598        '''
599        Gets the list of all child elements attached to this advice.
600       
601        @return the list of all child elements attached to this advice
602        '''
603        raise NotImplementedError()
604
605    def _getAssertionIDReferences(self):
606        '''Gets the list of AssertionID references used as advice.
607       
608        @return the list of AssertionID references used as advice
609        '''
610        raise NotImplementedError()
611
612    def _getAssertionURIReferences(self):
613        '''Gets the list of AssertionURI references used as advice.
614       
615        @return the list of AssertionURI references used as advice
616        '''
617        raise NotImplementedError()
618   
619    def _getAssertions(self):
620        '''Gets the list of Assertions used as advice.
621       
622        @return the list of Assertions used as advice
623        '''
624        raise NotImplementedError()
625   
626    def _getEncryptedAssertions(self):
627        '''Gets the list of EncryptedAssertions used as advice.
628       
629        @return the list of EncryptedAssertions used as advice
630        '''
631        raise NotImplementedError()
632       
633
634class Assertion(SAMLObject):
635    """SAML 2.0 Attribute Assertion for use with NERC DataGrid   
636    """   
637    ns = "urn:oasis:names:tc:SAML:1.0:assertion"
638    nsPfx = "saml"
639    issuer = 'http:#badc.nerc.ac.uk'
640    attributeName = "urn:mace:dir:attribute-def:eduPersonAffiliation"
641    attributeNS = "urn:mace:shibboleth:1.0:attributeNamespace:uri"
642
643    # Element local name.
644    DEFAULT_ELEMENT_LOCAL_NAME = "Assertion"
645
646    # Default element name.
647    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
648                                 DEFAULT_ELEMENT_LOCAL_NAME,
649                                 SAMLConstants.SAML20_PREFIX)
650
651    # Local name of the XSI type.
652    TYPE_LOCAL_NAME = "AssertionType"
653
654    # QName of the XSI type.
655    TYPE_NAME = QName(SAMLConstants.SAML20_NS, TYPE_LOCAL_NAME,
656                      SAMLConstants.SAML20_PREFIX)
657
658    # Version attribute name.
659    VERSION_ATTRIB_NAME = "Version"
660
661    # IssueInstant attribute name.
662    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
663
664    # ID attribute name.
665    ID_ATTRIB_NAME = "ID"
666
667    def __init__(self):
668        # Base class initialisation
669        super(Assertion, self).__init__()
670       
671        self.__version = None
672        self.__issueInstant = None
673        self.__id = None
674        self.__issuer = None
675        self.__subject = None
676       
677        self.__conditions = None
678        self.__advice = None
679        self.__statements = TypedList(Statement)
680       
681        # TODO: Implement AuthnStatement and AuthzDecisionStatement classes
682        self.__authnStatements = []
683        self.__authzDecisionStatements = []
684        self.__attributeStatements = TypedList(AttributeStatement)
685       
686    def _get_version(self):
687        '''@return the SAML Version of this assertion.
688        '''
689        return self.__version
690   
691    def _set_version(self, version):
692        '''@param version the SAML Version of this assertion
693        '''
694        if not isinstance(version, SAMLVersion):
695            raise TypeError("Expecting SAMLVersion type got: %r" % 
696                            version.__class__)
697       
698        self.__version = version
699       
700    version = property(fget=_get_version,
701                       fset=_set_version,
702                       doc="SAML Version of the assertion")
703
704    def _get_issueInstant(self):
705        '''Gets the issue instance of this assertion.
706       
707        @return the issue instance of this assertion'''
708        return self.__issueInstant
709   
710    def _set_issueInstant(self, issueInstant):
711        '''Sets the issue instance of this assertion.
712       
713        @param newIssueInstance the issue instance of this assertion
714        '''
715        if not isinstance(issueInstant, datetime):
716            raise TypeError('Expecting "datetime" type for "issueInstant", '
717                            'got %r' % issueInstant.__class__)
718           
719        self.__issueInstant = issueInstant
720       
721    issueInstant = property(fget=_get_issueInstant, 
722                            fset=_set_issueInstant,
723                            doc="Issue instant of the assertion")
724
725    def _get_id(self):
726        '''Sets the ID of this assertion.
727       
728        @return the ID of this assertion
729        '''
730        return self.__id
731   
732    def _set_id(self, _id):
733        '''Sets the ID of this assertion.
734       
735        @param newID the ID of this assertion
736        '''
737        if not isinstance(_id, basestring):
738            raise TypeError('Expecting basestring derived type for "id", got '
739                            '%r' % _id.__class__)
740        self.__id = _id
741       
742    id = property(fget=_get_id, fset=_set_id, doc="ID of assertion")
743   
744    def _set_issuer(self, issuer):
745        """Set issuer"""
746        if not isinstance(issuer, Issuer):
747            raise TypeError("issuer must be %r, got %r" % (Issuer, 
748                                                           type(issuer)))
749        self.__issuer = issuer
750   
751    def _get_issuer(self):
752        """Get the issuer name """
753        return self.__issuer
754
755    issuer = property(fget=_get_issuer, 
756                      fset=_set_issuer,
757                      doc="Issuer of assertion")
758   
759    def _set_subject(self, subject):
760        """Set subject string."""
761        if not isinstance(subject, Subject):
762            raise TypeError("subject must be %r, got %r" % (Subject, 
763                                                            type(subject)))
764
765        self.__subject = subject
766   
767    def _get_subject(self):
768        """Get subject string."""
769        return self.__subject
770
771    subject = property(fget=_get_subject,
772                       fset=_set_subject, 
773                       doc="Attribute Assertion subject")
774   
775    def _get_conditions(self):
776        """Get conditions string."""
777        return self.__conditions
778   
779    def _set_conditions(self, value):
780        """Get conditions string."""
781        if not isinstance(value, Conditions):
782            raise TypeError("Conditions must be %r, got %r" % (Conditions, 
783                                                               type(value)))
784
785        self.__conditions = value
786
787    conditions = property(fget=_get_conditions,
788                          fset=_set_conditions,
789                          doc="Attribute Assertion conditions")
790   
791    def _set_advice(self, advice):
792        """Set advice string."""
793        if not isinstance(advice, basestring):
794            raise TypeError("advice must be a string")
795
796        self.__advice = advice
797   
798    def _get_advice(self):
799        """Get advice string."""
800        return self.__advice
801
802    advice = property(fget=_get_advice,
803                      fset=_set_advice, 
804                      doc="Attribute Assertion advice")
805   
806    def _get_statements(self):
807        """Get statements string."""
808        return self.__statements
809
810    statements = property(fget=_get_statements,
811                          doc="Attribute Assertion statements")
812   
813    def _get_authnStatements(self):
814        """Get authnStatements string."""
815        return self.__authnStatements
816
817    authnStatements = property(fget=_get_authnStatements,
818                               doc="Attribute Assertion authentication "
819                                   "statements")
820   
821    def _get_authzDecisionStatements(self):
822        """Get authorisation decision statements."""
823        return self.__authzDecisionStatements
824
825    authzDecisionStatements = property(fget=_get_authzDecisionStatements,
826                                       doc="Attribute Assertion authorisation "
827                                           "decision statements")
828   
829    def _get_attributeStatements(self):
830        """Get attributeStatements string."""
831        return self.__attributeStatements
832
833    attributeStatements = property(fget=_get_attributeStatements,
834                                   doc="Attribute Assertion attribute "
835                                       "statements")
836   
837
838class AttributeValue(SAMLObject):
839
840    # Element name, no namespace
841    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeValue"
842
843    # Default element name
844    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
845                                 DEFAULT_ELEMENT_LOCAL_NAME,
846                                 SAMLConstants.SAML20_PREFIX)
847
848class XSStringAttributeValue(AttributeValue):
849
850    # Local name of the XSI type
851    TYPE_LOCAL_NAME = "string"
852       
853    # QName of the XSI type
854    TYPE_NAME = QName(SAMLConstants.XSD_NS, 
855                      TYPE_LOCAL_NAME, 
856                      SAMLConstants.XSD_PREFIX)
857 
858    def __init__(self):
859        self.__value = 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("Input must be a basestring derived type, got %r" %
867                            value.__class__)
868           
869        self.__value = value
870
871    value = property(fget=_getValue, fset=_setValue, doc="string value") 
872   
873
874# TODO: Move this class out of the SAML package back into ndg.security.common
875class XSGroupRoleAttributeValue(AttributeValue): 
876    '''ESG Specific Group/Role attribute value.  ESG attribute permissions are
877    organised into group/role pairs
878    '''
879    DEFAULT_NS = "http://www.earthsystemgrid.org"
880    DEFAULT_PREFIX = "esg"
881    TYPE_LOCAL_NAME = "groupRole"
882   
883    GROUP_ATTRIB_NAME = "group"
884    ROLE_ATTRIB_NAME = "role"
885   
886    # QName of the XSI type
887    TYPE_NAME = QName(DEFAULT_NS, 
888                      TYPE_LOCAL_NAME, 
889                      DEFAULT_PREFIX)
890     
891    def __init__(self, 
892                 namespaceURI=DEFAULT_NS, 
893                 elementLocalName=TYPE_LOCAL_NAME, 
894                 namespacePrefix=DEFAULT_PREFIX):
895        '''@param namespaceURI: the namespace the element is in
896        @param elementLocalName: the local name of the XML element this Object
897        represents
898        @param namespacePrefix: the prefix for the given namespace'''
899        self.__namespaceURI = namespaceURI
900        self.__elementLocalName = elementLocalName
901        self.__namespacePrefix = namespacePrefix
902        self.__group = None
903        self.__role = None       
904
905    def _getNamespaceURI(self):
906        return self.__namespaceURI
907
908    def _setNamespaceURI(self, value):
909        if not isinstance(value, basestring):
910            raise TypeError("Expecting %r type for namespaceURI got %r" %
911                            (basestring, value.__class__))
912        self.__namespaceURI = value
913
914    def _getElementLocalName(self):
915        return self.__elementLocalName
916
917    def _setElementLocalName(self, value):
918        if not isinstance(value, basestring):
919            raise TypeError("Expecting %r type for elementLocalName got %r" %
920                            (basestring, value.__class__))
921        self.__elementLocalName = value
922
923    def _getNamespacePrefix(self):
924        return self.__namespacePrefix
925
926    def _setNamespacePrefix(self, value):
927        if not isinstance(value, basestring):
928            raise TypeError("Expecting %r type for namespacePrefix got %r" %
929                            (basestring, value.__class__))
930        self.__namespacePrefix = value
931
932    namespaceURI = property(fget=_getNamespaceURI, 
933                            fset=_setNamespaceURI, 
934                            doc="the namespace the element is in")
935
936    elementLocalName = property(fget=_getElementLocalName, 
937                                fset=_setElementLocalName, 
938                                doc="the local name of the XML element this "
939                                    "Object represents")
940
941    namespacePrefix = property(fget=_getNamespacePrefix, 
942                               fset=_setNamespacePrefix, 
943                               doc="the prefix for the given namespace")
944
945    def _getGroup(self):
946        return self.__group
947     
948    def _setGroup(self, group): 
949        self.__group = group
950     
951    group = property(fget=_getGroup, fset=_setGroup)
952     
953    def _getRole(self):
954        return self.__role
955     
956    def _setRole(self, role):
957        self.__role = role
958     
959    role = property(fget=_getRole, fset=_setRole)
960
961    def getOrderedChildren(self):
962        # no children
963        return None
964
965
966class StatusDetail(SAMLObject):
967    '''Implementation of SAML 2.0 StatusDetail'''
968   
969    # Local Name of StatusDetail.
970    DEFAULT_ELEMENT_LOCAL_NAME = "StatusDetail"
971
972    # Default element name.
973    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
974                                 DEFAULT_ELEMENT_LOCAL_NAME,
975                                 SAMLConstants.SAML20P_PREFIX)
976
977    # Local name of the XSI type.
978    TYPE_LOCAL_NAME = "StatusDetailType"
979
980    # QName of the XSI type.
981    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
982                      TYPE_LOCAL_NAME,
983                      SAMLConstants.SAML20P_PREFIX)
984   
985    def __init__(self):
986        # child "any" elements.
987        self.__unknownChildren = TypedList(SAMLObject)         
988        self.__qname = QName(StatusDetail.DEFAULT_ELEMENT_NAME.namespaceURI,
989                             StatusDetail.DEFAULT_ELEMENT_NAME,
990                             StatusDetail.DEFAULT_ELEMENT_NAME.prefix)
991   
992    def getUnknownXMLObjects(self, qname=None): 
993        if qname is not None:
994            if not isinstance(qname, QName):
995                raise TypeError("\"qname\" must be a %r derived type, "
996                                "got %r" % (QName, type(qname)))
997               
998            children = []
999            for child in self.__unknownChildren:
1000                childQName = getattr(child, "qname", None)
1001                if childQName is not None:
1002                    if childQName.namespaceURI == qname.namespaceURI or \
1003                       childQName.localPart == qname.localPart:
1004                        children.append(child)
1005                       
1006            return children
1007        else:
1008            return self.__unknownChildren
1009   
1010    unknownChildren = property(fget=getUnknownXMLObjects,
1011                               doc="Child objects of Status Detail - may be "
1012                                   "any type")
1013               
1014    def _getQName(self):
1015        return self.__qname
1016       
1017    def _setQName(self, value):
1018        if not isinstance(value, QName):
1019            raise TypeError("\"qname\" must be a %r derived type, "
1020                            "got %r" % (QName, type(value)))
1021           
1022        self.__qname = value
1023
1024    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1025   
1026
1027class StatusMessage(SAMLObject):
1028    '''Implementation of SAML 2.0 Status Message'''
1029
1030    def __init__(self):
1031        # Value attribute URI.
1032        self.__value = None       
1033        self.__qname = None
1034             
1035    def _getValue(self):
1036        return self.__value
1037       
1038    def _setValue(self, value):
1039        if not isinstance(value, basestring):
1040            raise TypeError("\"value\" must be a basestring derived type, "
1041                            "got %r" % value.__class__)
1042           
1043        self.__value = value
1044
1045    value = property(fget=_getValue, fset=_setValue, 
1046                     doc="Status message value")
1047               
1048    def _getQName(self):
1049        return self.__qname
1050       
1051    def _setQName(self, value):
1052        if not isinstance(value, QName):
1053            raise TypeError("\"qname\" must be a %r derived type, "
1054                            "got %r" % (QName, type(value)))
1055           
1056        self.__qname = value
1057
1058    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1059
1060
1061class StatusCode(SAMLObject):
1062    '''Implementation of SAML 2.0 StatusCode.'''
1063   
1064    # Local Name of StatusCode.
1065    DEFAULT_ELEMENT_LOCAL_NAME = "StatusCode"
1066
1067    # Default element name.
1068    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1069                                 DEFAULT_ELEMENT_LOCAL_NAME,
1070                                 SAMLConstants.SAML20P_PREFIX)
1071
1072    # Local name of the XSI type.
1073    TYPE_LOCAL_NAME = "StatusCodeType"
1074
1075    # QName of the XSI type.
1076    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1077                      TYPE_LOCAL_NAME,
1078                      SAMLConstants.SAML20P_PREFIX)
1079
1080    # Local Name of the Value attribute.
1081    VALUE_ATTRIB_NAME = "Value"
1082
1083    # URI for Success status code.
1084    SUCCESS_URI = "urn:oasis:names:tc:SAML:2.0:status:Success"
1085
1086    # URI for Requester status code.
1087    REQUESTER_URI = "urn:oasis:names:tc:SAML:2.0:status:Requester"
1088
1089    # URI for Responder status code.
1090    RESPONDER_URI = "urn:oasis:names:tc:SAML:2.0:status:Responder"
1091
1092    # URI for VersionMismatch status code.
1093    VERSION_MISMATCH_URI = "urn:oasis:names:tc:SAML:2.0:status:VersionMismatch"
1094
1095    # URI for AuthnFailed status code.
1096    AUTHN_FAILED_URI = "urn:oasis:names:tc:SAML:2.0:status:AuthnFailed"
1097
1098    # URI for InvalidAttrNameOrValue status code.
1099    INVALID_ATTR_NAME_VALUE_URI = \
1100                "urn:oasis:names:tc:SAML:2.0:status:InvalidAttrNameOrValue"
1101
1102    # URI for InvalidNameIDPolicy status code.
1103    INVALID_NAMEID_POLICY_URI = \
1104                "urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy"
1105
1106    # URI for NoAuthnContext status code.
1107    NO_AUTHN_CONTEXT_URI = "urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext"
1108
1109    # URI for NoAvailableIDP status code.
1110    NO_AVAILABLE_IDP_URI = "urn:oasis:names:tc:SAML:2.0:status:NoAvailableIDP"
1111
1112    # URI for NoPassive status code.
1113    NO_PASSIVE_URI = "urn:oasis:names:tc:SAML:2.0:status:NoPassive"
1114
1115    # URI for NoSupportedIDP status code.
1116    NO_SUPPORTED_IDP_URI = "urn:oasis:names:tc:SAML:2.0:status:NoSupportedIDP"
1117
1118    # URI for PartialLogout status code.
1119    PARTIAL_LOGOUT_URI = "urn:oasis:names:tc:SAML:2.0:status:PartialLogout"
1120
1121    # URI for ProxyCountExceeded status code.
1122    PROXY_COUNT_EXCEEDED_URI = \
1123                "urn:oasis:names:tc:SAML:2.0:status:ProxyCountExceeded"
1124
1125    # URI for RequestDenied status code.
1126    REQUEST_DENIED_URI = "urn:oasis:names:tc:SAML:2.0:status:RequestDenied"
1127
1128    # URI for RequestUnsupported status code.
1129    REQUEST_UNSUPPORTED_URI = \
1130                "urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported"
1131
1132    # URI for RequestVersionDeprecated status code.
1133    REQUEST_VERSION_DEPRECATED_URI = \
1134                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionDeprecated"
1135
1136    # URI for RequestVersionTooHigh status code.
1137    REQUEST_VERSION_TOO_HIGH_URI = \
1138                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooHigh"
1139   
1140    # URI for RequestVersionTooLow status code.
1141    REQUEST_VERSION_TOO_LOW_URI = \
1142                "urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooLow"
1143
1144    # URI for ResourceNotRecognized status code.
1145    RESOURCE_NOT_RECOGNIZED_URI = \
1146                "urn:oasis:names:tc:SAML:2.0:status:ResourceNotRecognized"
1147
1148    # URI for TooManyResponses status code.
1149    TOO_MANY_RESPONSES = "urn:oasis:names:tc:SAML:2.0:status:TooManyResponses"
1150
1151    # URI for UnknownAttrProfile status code.
1152    UNKNOWN_ATTR_PROFILE_URI = \
1153                "urn:oasis:names:tc:SAML:2.0:status:UnknownAttrProfile"
1154
1155    # URI for UnknownPrincipal status code.
1156    UNKNOWN_PRINCIPAL_URI = \
1157                "urn:oasis:names:tc:SAML:2.0:status:UnknownPrincipal"
1158
1159    # URI for UnsupportedBinding status code.
1160    UNSUPPORTED_BINDING_URI = \
1161                "urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding"
1162
1163    def __init__(self):
1164        # Value attribute URI.
1165        self.__value = None
1166   
1167        # Nested secondary StatusCode child element.
1168        self.__childStatusCode = None
1169       
1170        self.__qname = QName(StatusCode.DEFAULT_ELEMENT_NAME.namespaceURI,
1171                             StatusCode.DEFAULT_ELEMENT_NAME.localPart,
1172                             StatusCode.DEFAULT_ELEMENT_NAME.prefix)
1173
1174    def _getStatusCode(self): 
1175        return self.__childStatusCode
1176   
1177    def _setStatusCode(self, value):
1178        if not isinstance(value, StatusCode):
1179            raise TypeError('Child "statusCode" must be a %r derived type, '
1180                            "got %r" % (StatusCode, type(value)))
1181           
1182        self.__childStatusCode = value
1183
1184    value = property(fget=_getStatusCode, 
1185                     fset=_setStatusCode, 
1186                     doc="Child Status code")
1187             
1188    def _getValue(self):
1189        return self.__value
1190       
1191    def _setValue(self, value):
1192        if not isinstance(value, basestring):
1193            raise TypeError("\"value\" must be a basestring derived type, "
1194                            "got %r" % value.__class__)
1195           
1196        self.__value = value
1197
1198    value = property(fget=_getValue, fset=_setValue, doc="Status code value")
1199               
1200    def _getQName(self):
1201        return self.__qname
1202       
1203    def _setQName(self, value):
1204        if not isinstance(value, QName):
1205            raise TypeError("\"qname\" must be a %r derived type, "
1206                            "got %r" % (QName, type(value)))
1207           
1208        self.__qname = value
1209
1210    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1211       
1212
1213class Status(SAMLObject): 
1214    '''SAML 2.0 Core Status'''
1215   
1216    # Local Name of Status.
1217    DEFAULT_ELEMENT_LOCAL_NAME = "Status"
1218
1219    # Default element name.
1220    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1221                                 DEFAULT_ELEMENT_LOCAL_NAME,
1222                                 SAMLConstants.SAML20P_PREFIX)
1223
1224    # Local name of the XSI type.
1225    TYPE_LOCAL_NAME = "StatusType"
1226
1227    # QName of the XSI type.
1228    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1229                      TYPE_LOCAL_NAME,
1230                      SAMLConstants.SAML20P_PREFIX)
1231
1232    def __init__(self):
1233        # StatusCode element.
1234        self.__statusCode = None
1235   
1236        # StatusMessage element.
1237        self.__statusMessage = None
1238   
1239        # StatusDetail element.
1240        self.__statusDetail = None
1241       
1242        self.__qname = QName(Status.DEFAULT_ELEMENT_NAME.namespaceURI,
1243                             Status.DEFAULT_ELEMENT_NAME.localPart,
1244                             Status.DEFAULT_ELEMENT_NAME.prefix)
1245               
1246    def _getQName(self):
1247        return self.__qname
1248       
1249    def _setQName(self, value):
1250        if not isinstance(value, QName):
1251            raise TypeError("\"qname\" must be a %r derived type, "
1252                            "got %r" % (QName, type(value)))
1253           
1254        self.__qname = value
1255
1256    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1257       
1258    def _getStatusCode(self):
1259        '''
1260        Gets the Code of this Status.
1261       
1262        @return Status StatusCode
1263        '''
1264        return self.__statusCode
1265
1266    def _setStatusCode(self, value):
1267        '''
1268        Sets the Code of this Status.
1269       
1270        @param newStatusCode the Code of this Status
1271        '''
1272        if not isinstance(value, StatusCode):
1273            raise TypeError('"statusCode" must be a %r derived type, '
1274                            "got %r" % (StatusCode, type(value)))
1275           
1276        self.__statusCode = value
1277       
1278    statusCode = property(fget=_getStatusCode,
1279                          fset=_setStatusCode,
1280                          doc="status code object")
1281   
1282    def _getStatusMessage(self):
1283        '''
1284        Gets the Message of this Status.
1285       
1286        @return Status StatusMessage
1287        '''
1288        return self.__statusMessage
1289
1290    def _setStatusMessage(self, value):
1291        '''
1292        Sets the Message of this Status.
1293       
1294        @param newStatusMessage the Message of this Status
1295        '''
1296        if not isinstance(value, basestring):
1297            raise TypeError('"statusMessage" must be a %r derived type, '
1298                            "got %r" % (basestring, type(value)))
1299           
1300        self.__statusMessage = value
1301       
1302    statusMessage = property(fget=_getStatusMessage,
1303                             fset=_setStatusMessage,
1304                             doc="status message")
1305
1306    def _getStatusDetail(self):
1307        '''
1308        Gets the Detail of this Status.
1309       
1310        @return Status StatusDetail
1311        '''
1312        return self.__statusDetail
1313   
1314    def _setStatusDetail(self, value):
1315        '''
1316        Sets the Detail of this Status.
1317       
1318        @param newStatusDetail the Detail of this Status
1319        '''
1320        self.__statusDetail = value
1321       
1322    statusDetail = property(fget=_getStatusDetail,
1323                            fset=_setStatusDetail,
1324                            doc="status message")
1325
1326
1327class RequestAbstractType(SAMLObject): 
1328    '''SAML 2.0 Core RequestAbstractType'''
1329   
1330    # Local name of the XSI type.
1331    TYPE_LOCAL_NAME = "RequestAbstractType"
1332
1333    # QName of the XSI type.
1334    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1335                      TYPE_LOCAL_NAME,
1336                      SAMLConstants.SAML20P_PREFIX)
1337
1338    # ID attribute name.
1339    ID_ATTRIB_NAME = "ID"
1340
1341    # Version attribute name.
1342    VERSION_ATTRIB_NAME = "Version"
1343
1344    # IssueInstant attribute name.
1345    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
1346
1347    # Destination attribute name.
1348    DESTINATION_ATTRIB_NAME = "Destination"
1349
1350    # Consent attribute name.
1351    CONSENT_ATTRIB_NAME = "Consent"
1352
1353    # Unspecified consent URI.
1354    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
1355
1356    # Obtained consent URI.
1357    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
1358
1359    # Prior consent URI.
1360    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
1361
1362    # Implicit consent URI.
1363    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
1364
1365    # Explicit consent URI.
1366    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
1367
1368    # Unavailable consent URI.
1369    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
1370
1371    # Inapplicable consent URI.
1372    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable" 
1373
1374    def __init__(self):
1375        # SAML Version of the request.
1376        self.__version = None
1377   
1378        # Unique identifier of the request.
1379        self.__id = None
1380   
1381        # Date/time request was issued.
1382        self.__issueInstant = None
1383   
1384        # URI of the request destination.
1385        self.__destination = None
1386   
1387        # URI of the SAML user consent type.
1388        self.__consent = None
1389   
1390        # URI of the SAML user consent type.
1391        self.__issuer = None
1392   
1393        # Extensions child element.
1394        self.__extensions = None
1395       
1396    def _get_version(self):
1397        '''@return the SAML Version of this assertion.
1398        '''
1399        return self.__version
1400   
1401    def _set_version(self, version):
1402        '''@param version the SAML Version of this assertion
1403        '''
1404        if not isinstance(version, SAMLVersion):
1405            raise TypeError("Expecting SAMLVersion type got: %r" % 
1406                            version.__class__)
1407       
1408        self.__version = version
1409       
1410    version = property(fget=_get_version,
1411                       fset=_set_version,
1412                       doc="SAML Version of the assertion")
1413
1414    def _get_issueInstant(self):
1415        '''Gets the date/time the request was issued
1416       
1417        @return the issue instance of this request'''
1418        return self.__issueInstant
1419   
1420    def _set_issueInstant(self, value):
1421        '''Sets the date/time the request was issued
1422       
1423        @param value the issue instance of this request
1424        '''
1425        if not isinstance(value, datetime):
1426            raise TypeError('Expecting "datetime" type for "issueInstant", '
1427                            'got %r' % type(value))
1428           
1429        self.__issueInstant = value
1430       
1431    issueInstant = property(fget=_get_issueInstant, 
1432                            fset=_set_issueInstant,
1433                            doc="Issue instant of the request") 
1434
1435    def _get_id(self):
1436        '''Sets the unique identifier for this request.
1437       
1438        @return the ID of this request
1439        '''
1440        return self.__id
1441   
1442    def _set_id(self, value):
1443        '''Sets the unique identifier for this request
1444       
1445        @param newID the ID of this assertion
1446        '''
1447        if not isinstance(value, basestring):
1448            raise TypeError('Expecting basestring derived type for "id", got '
1449                            '%r' % type(value))
1450        self.__id = value
1451       
1452    id = property(fget=_get_id, fset=_set_id, doc="ID of request")
1453
1454    def _get_destination(self):
1455        '''Gets the URI of the destination of the request.
1456       
1457        @return the URI of the destination of the request
1458        '''
1459        return self.__destination
1460   
1461    def _set_destination(self, value):
1462        '''Sets the URI of the destination of the request.
1463       
1464        @param newDestination the URI of the destination of the request'''
1465        if not isinstance(value, basestring):
1466            raise TypeError('Expecting basestring derived type for '
1467                            '"destination", got %r' % type(value))
1468        self.__destination = value
1469       
1470    destination = property(fget=_get_destination, 
1471                           fset=_set_destination,
1472                           doc="Destination of request")
1473     
1474    def _get_consent(self):
1475        '''Gets the consent obtained from the principal for sending this
1476        request.
1477       
1478        @return: the consent obtained from the principal for sending this
1479        request
1480        '''
1481        return self.__consent
1482       
1483    def _set_consent(self, value):
1484        '''Sets the consent obtained from the principal for sending this
1485        request.
1486       
1487        @param value: the new consent obtained from the principal for
1488        sending this request
1489        ''' 
1490        if not isinstance(value, basestring):
1491            raise TypeError('Expecting basestring derived type for "consent", '
1492                            'got %r' % type(value))
1493        self.__consent = value
1494             
1495    consent = property(fget=_get_consent, 
1496                       fset=_set_consent,
1497                       doc="Consent for request")
1498   
1499    def _set_issuer(self, issuer):
1500        """Set issuer of request"""
1501        if not isinstance(issuer, Issuer):
1502            raise TypeError('"issuer" must be a %r, got %r' % (Issuer, 
1503                                                               type(issuer)))
1504       
1505        self.__issuer = issuer
1506   
1507    def _get_issuer(self):
1508        """Get the issuer name """
1509        return self.__issuer
1510
1511    issuer = property(fget=_get_issuer, 
1512                      fset=_set_issuer,
1513                      doc="Issuer of request")
1514 
1515    def _get_extensions(self):
1516        '''Gets the Extensions of this request.
1517       
1518        @return: the Status of this request
1519        '''
1520        return self.__extensions
1521     
1522    def _set_extensions(self, value):
1523        '''Sets the Extensions of this request.
1524       
1525        @param value: the Extensions of this request
1526        '''
1527        self.__extensions = value
1528       
1529    extensions = property(fget=_get_extensions, 
1530                          fset=_set_extensions,
1531                          doc="Request extensions")
1532
1533
1534class SubjectQuery(RequestAbstractType):
1535    """SAML 2.0 Core Subject Query type"""
1536   
1537    def __init__(self):
1538        self.__subject = None
1539       
1540    def _getSubject(self):
1541        '''Gets the Subject of this request.
1542       
1543        @return the Subject of this request'''   
1544        return self.__subject
1545   
1546    def _setSubject(self, value):
1547        '''Sets the Subject of this request.
1548       
1549        @param newSubject the Subject of this request'''
1550        if not isinstance(value, Subject):
1551            raise TypeError('Setting "subject", got %r, expecting %r' %
1552                            (Subject, type(value)))
1553           
1554        self.__subject = value
1555       
1556    subject = property(fget=_getSubject, fset=_setSubject, doc="Query subject")
1557   
1558   
1559class AttributeQuery(SubjectQuery):
1560    '''SAML 2.0 AttributeQuery'''
1561   
1562    # Element local name.
1563    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeQuery"
1564
1565    # Default element name.
1566    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1567                                 DEFAULT_ELEMENT_LOCAL_NAME,
1568                                 SAMLConstants.SAML20P_PREFIX)
1569
1570    # Local name of the XSI type.
1571    TYPE_LOCAL_NAME = "AttributeQueryType"
1572
1573    # QName of the XSI type.
1574    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1575                      TYPE_LOCAL_NAME,
1576                      SAMLConstants.SAML20P_PREFIX)
1577
1578    def __init__(self):
1579        self.__attributes = TypedList(Attribute)
1580 
1581    def _getAttributes(self):
1582        '''Gets the Attributes of this query.
1583       
1584        @return the list of Attributes of this query'''
1585        return self.__attributes
1586
1587    def _setAttributes(self, value):
1588        self.__attributes = value
1589
1590    attributes = property(fget=_getAttributes, 
1591                          fset=_setAttributes, 
1592                          doc="Attributes")
1593
1594
1595class StatusResponseType(SAMLObject):
1596    '''SAML 2.0 Core Status Response Type
1597    '''
1598
1599    # Local name of the XSI type.
1600    TYPE_LOCAL_NAME = "StatusResponseType"
1601
1602    # QName of the XSI type.
1603    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1604                      TYPE_LOCAL_NAME,
1605                      SAMLConstants.SAML20P_PREFIX)
1606
1607    # ID attribute name
1608    ID_ATTRIB_NAME = "ID"
1609
1610    # InResponseTo attribute name
1611    IN_RESPONSE_TO_ATTRIB_NAME = "InResponseTo"
1612
1613    # Version attribute name
1614    VERSION_ATTRIB_NAME = "Version"
1615
1616    # IssueInstant attribute name
1617    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
1618
1619    # Destination attribute name
1620    DESTINATION_ATTRIB_NAME = "Destination"
1621
1622    # Consent attribute name.
1623    CONSENT_ATTRIB_NAME = "Consent"
1624
1625    # Unspecified consent URI
1626    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
1627
1628    # Obtained consent URI
1629    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
1630
1631    # Prior consent URI
1632    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
1633
1634    # Implicit consent URI
1635    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
1636
1637    # Explicit consent URI
1638    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
1639
1640    # Unavailable consent URI
1641    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
1642
1643    # Inapplicable consent URI
1644    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable"
1645
1646    def __init__(self):
1647        self.__qname = None
1648       
1649        self.__version = SAMLVersion(SAMLVersion.VERSION_20)
1650        self.__id = None
1651        self.__inResponseTo = None
1652        self.__issueInstant = None
1653        self.__destination = None
1654        self.__consent = None
1655        self.__issuer = None
1656        self.__status = None
1657        self.__extensions = None
1658       
1659    def _getQName(self):
1660        return self.__qname
1661       
1662    def _setQName(self, value):
1663        if not isinstance(value, QName):
1664            raise TypeError("\"qname\" must be a %r derived type, "
1665                            "got %r" % (QName, type(value)))
1666           
1667        self.__qname = value
1668
1669    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
1670
1671    def _get_version(self):
1672        '''@return the SAML Version of this response.
1673        '''
1674        return self.__version
1675   
1676    def _set_version(self, version):
1677        '''@param version the SAML Version of this response
1678        '''
1679        if not isinstance(version, SAMLVersion):
1680            raise TypeError("Expecting SAMLVersion type got: %r" % 
1681                            version.__class__)
1682       
1683        self.__version = version
1684       
1685    version = property(fget=_get_version,
1686                       fset=_set_version,
1687                       doc="SAML Version of the response")
1688
1689    def _get_id(self):
1690        '''Sets the ID of this response.
1691       
1692        @return the ID of this response
1693        '''
1694        return self.__id
1695   
1696    def _set_id(self, value):
1697        '''Sets the ID of this response.
1698       
1699        @param value: the ID of this response
1700        '''
1701        if not isinstance(value, basestring):
1702            raise TypeError('Expecting basestring derived type for "id", got '
1703                            '%r' % type(value))
1704        self.__id = value
1705       
1706    id = property(fget=_get_id, fset=_set_id, doc="ID of response")
1707
1708    def _getInResponseTo(self):
1709        '''Get the unique request identifier for which this is a response
1710       
1711        @return value: the unique identifier of the originating
1712        request
1713        '''
1714        return self.__inResponseTo
1715   
1716    def _setInResponseTo(self, value):
1717        '''Set the unique request identifier for which this is a response
1718       
1719        @param value: the unique identifier of the originating
1720        request
1721        '''
1722        if not isinstance(value, basestring):
1723            raise TypeError('Expecting basestring derived type for '
1724                            '"inResponseTo", got %r' % type(value))
1725        self.__inResponseTo = value
1726       
1727    inResponseTo = property(fget=_getInResponseTo, 
1728                            fset=_setInResponseTo,
1729                            doc="unique request identifier for which this is "
1730                                "a response")
1731
1732    def _get_issueInstant(self):
1733        '''Gets the issue instance of this response.
1734       
1735        @return the issue instance of this response'''
1736        return self.__issueInstant
1737   
1738    def _set_issueInstant(self, issueInstant):
1739        '''Sets the issue instance of this response.
1740       
1741        @param newIssueInstance the issue instance of this response
1742        '''
1743        if not isinstance(issueInstant, datetime):
1744            raise TypeError('Expecting "datetime" type for "issueInstant", '
1745                            'got %r' % issueInstant.__class__)
1746           
1747        self.__issueInstant = issueInstant
1748       
1749    issueInstant = property(fget=_get_issueInstant, 
1750                            fset=_set_issueInstant,
1751                            doc="Issue instant of the response")
1752
1753    def _get_destination(self):
1754        '''Gets the URI of the destination of the response.
1755       
1756        @return the URI of the destination of the response
1757        '''
1758        return self.__destination
1759   
1760    def _set_destination(self, value):
1761        '''Sets the URI of the destination of the response.
1762       
1763        @param value: the URI of the destination of the response'''
1764        if not isinstance(value, basestring):
1765            raise TypeError('Expecting basestring derived type for '
1766                            '"destination", got %r' % type(value))
1767        self.__destination = value
1768       
1769    destination = property(fget=_get_destination, 
1770                           fset=_set_destination,
1771                           doc="Destination of response")
1772     
1773    def _get_consent(self):
1774        '''Gets the consent obtained from the principal for sending this
1775        response.
1776       
1777        @return: the consent obtained from the principal for sending this
1778        response
1779        '''
1780        return self.__consent
1781       
1782    def _set_consent(self, value):
1783        '''Sets the consent obtained from the principal for sending this
1784        response.
1785       
1786        @param value: the new consent obtained from the principal for
1787        sending this response
1788        ''' 
1789        if not isinstance(value, basestring):
1790            raise TypeError('Expecting basestring derived type for "consent", '
1791                            'got %r' % type(value))
1792        self.__consent = value
1793             
1794    consent = property(fget=_get_consent, 
1795                       fset=_set_consent,
1796                       doc="Consent for response")
1797   
1798    def _set_issuer(self, issuer):
1799        """Set issuer of response"""
1800        if not isinstance(issuer, Issuer):
1801            raise TypeError('"issuer" must be a %r, got %r' % (Issuer,
1802                                                               type(issuer)))
1803        self.__issuer = issuer
1804   
1805    def _get_issuer(self):
1806        """Get the issuer name """
1807        return self.__issuer
1808
1809    issuer = property(fget=_get_issuer, 
1810                      fset=_set_issuer,
1811                      doc="Issuer of response")
1812   
1813    def _getStatus(self):
1814        '''Gets the Status of this response.
1815       
1816        @return the Status of this response
1817        '''
1818        return self.__status
1819
1820    def _setStatus(self, value):
1821        '''Sets the Status of this response.
1822       
1823        @param newStatus the Status of this response
1824        '''
1825        if not isinstance(value, Status):
1826            raise TypeError('"status" must be a %r, got %r' % (Status,
1827                                                               type(value)))
1828        self.__status = value
1829       
1830    status = property(fget=_getStatus, fset=_setStatus, doc="Response status")   
1831       
1832    def _get_extensions(self):
1833        '''Gets the Extensions of this response.
1834       
1835        @return: the Status of this response
1836        '''
1837        return self.__extensions
1838     
1839    def _set_extensions(self, value):
1840        '''Sets the Extensions of this response.
1841       
1842        @param value: the Extensions of this response
1843        '''
1844        if not isinstance(value, (list, tuple)):
1845            raise TypeError('Expecting list or tuple for "extensions", got %r'
1846                            % type(value))
1847        self.__extensions = value
1848       
1849    extensions = property(fget=_get_extensions, 
1850                          fset=_set_extensions,
1851                          doc="Response extensions")   
1852
1853
1854class Response(StatusResponseType):
1855    '''SAML2 Core Response'''
1856   
1857    # Element local name.
1858    DEFAULT_ELEMENT_LOCAL_NAME = "Response"
1859   
1860    # Default element name.
1861    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1862                                 DEFAULT_ELEMENT_LOCAL_NAME, 
1863                                 SAMLConstants.SAML20P_PREFIX)
1864   
1865    # Local name of the XSI type.
1866    TYPE_LOCAL_NAME = "ResponseType"
1867       
1868    # QName of the XSI type.
1869    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1870                      TYPE_LOCAL_NAME, 
1871                      SAMLConstants.SAML20P_PREFIX)
1872   
1873    def __init__(self):
1874        '''''' 
1875        super(Response, self).__init__()
1876       
1877        # Assertion child elements
1878        self.__indexedChildren = []
1879   
1880    def _getAssertions(self): 
1881        return self.__indexedChildren
1882   
1883    assertions = property(fget=_getAssertions,
1884                          doc="Assertions contained in this response")
Note: See TracBrowser for help on using the repository browser.