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

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

Working ElementTree serialisation/deserialisation for AuthzDecisionQuery?

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