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

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.common/ndg/security/common/saml/__init__.py@5554
Revision 5554, 37.8 KB checked in by pjkersha, 11 years ago (diff)
  • Started adding ElementTree based parsers for SAML classes in ndg.security.common.saml.xml.etree.
  • ndg.security.common.utils.prettyPrint needs a bug fix for namespace declarations
Line 
1"""Implementation of SAML 2.0 for NDG Security
2
3NERC DataGrid Project
4
5This implementation is adapted from the Java OpenSAML implementation.  The
6copyright and licence information are included here:
7
8Copyright [2005] [University Corporation for Advanced Internet Development, Inc.]
9
10Licensed under the Apache License, Version 2.0 (the "License");
11you may not use this file except in compliance with the License.
12You may obtain a copy of the License at
13
14http://www.apache.org/licenses/LICENSE-2.0
15
16Unless required by applicable law or agreed to in writing, software
17distributed under the License is distributed on an "AS IS" BASIS,
18WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19See the License for the specific language governing permissions and
20limitations under the License.
21"""
22__author__ = "P J Kershaw"
23__date__ = "22/07/08"
24__copyright__ = "(C) 2009 Science and Technology Facilities Council"
25__contact__ = "Philip.Kershaw@stfc.ac.uk"
26__license__ = "BSD - see LICENSE file in top-level directory"
27__contact__ = "Philip.Kershaw@stfc.ac.uk"
28__revision__ = "$Id$"
29
30import logging
31log = logging.getLogger(__name__)
32
33# Time module for use with validity times
34from time import strftime, strptime
35from datetime import datetime, timedelta
36   
37from ndg.security.common.utils import QName, TypedList
38from ndg.security.common.saml.xml import SAMLConstants, XMLConstants
39
40     
41class SAMLObject(object):
42    """Base class for all SAML types"""
43
44
45class SAMLVersion(object):
46    """Version helper class"""
47    VERSION_10 = (1, 0)
48    VERSION_11 = (1, 1)
49    VERSION_20 = (2, 0)
50    KNOWN_VERSIONS = (VERSION_10, VERSION_11, VERSION_20)
51   
52    def __init__(self, version):
53        if isinstance(version, basestring):
54            self.__version = SAMLVersion.valueOf(version)
55        elif isinstance(version, (tuple, list)):
56            self.__version = tuple(version)
57        else:
58            raise TypeError("Expecting string, tuple or list type for SAML "
59                            "version initialiser; got %r" % version)
60   
61    def __str__(self):
62        return ".".join([str(i) for i in self.__version])
63   
64    def __eq__(self, version):
65        """Test for equality against an input version string, tuple or list"""
66               
67        if isinstance(version, basestring):
68            return self.__version == SAMLVersion.valueOf(version)
69        elif isinstance(version, (tuple, list)):
70            return self.__version == tuple(version)
71        else:
72            raise TypeError("Expecting string, tuple or list type for SAML "
73                            "version comparison; got %r" % version)
74           
75    def __ne__(self, version):
76        return self.__eq__(version)
77   
78    @staticmethod
79    def valueOf(version):
80        """Parse input string into version tuple
81        @type version: version
82        @param version: SAML version
83        @rtype: tuple
84        @return: SAML version tuple"""
85        return tuple(version.split("."))
86   
87
88class Assertion(SAMLObject):
89    """SAML 2.0 Attribute Assertion for use with NERC DataGrid   
90    """   
91    ns = "urn:oasis:names:tc:SAML:1.0:assertion"
92    nsPfx = "saml"
93    issuer = 'http:#badc.nerc.ac.uk'
94    attributeName = "urn:mace:dir:attribute-def:eduPersonAffiliation"
95    attributeNS = "urn:mace:shibboleth:1.0:attributeNamespace:uri"
96
97    # Element local name.
98    DEFAULT_ELEMENT_LOCAL_NAME = "Assertion"
99
100    # Default element name.
101    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
102                                 DEFAULT_ELEMENT_LOCAL_NAME,
103                                 SAMLConstants.SAML20_PREFIX)
104
105    # Local name of the XSI type.
106    TYPE_LOCAL_NAME = "AssertionType"
107
108    # QName of the XSI type.
109    TYPE_NAME = QName(SAMLConstants.SAML20_NS, TYPE_LOCAL_NAME,
110                      SAMLConstants.SAML20_PREFIX)
111
112    # Version attribute name.
113    VERSION_ATTRIB_NAME = "Version"
114
115    # IssueInstant attribute name.
116    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
117
118    # ID attribute name.
119    ID_ATTRIB_NAME = "ID"
120
121    def __init__(self, **xmlSecDocKw):
122        """@type **xmlSecDocKw: dict
123        @param **xmlSecDocKw: see XMLSec.XMLSec class for an explanation.
124        Keywords include, filePath for the cert. for reading/writing and
125        cert./private key settings for digital signature and verification."""
126
127        # Base class initialisation
128        super(Assertion, self).__init__()
129       
130        self._version = None
131        self._issueInstant = None
132        self._id = None
133        self._issuer = None
134        self._subject = None
135        self._conditions = []
136        self._advice = None
137        self._statements = []
138        self._authnStatements = []
139        self._authzDecisionStatements = []
140        self._attributeStatements = []
141       
142    def _get_version(self):
143        '''@return the SAML Version of this assertion.
144        '''
145        return self._version
146   
147    def _set_version(self, version):
148        '''@param version the SAML Version of this assertion
149        '''
150        if not isinstance(version, SAMLVersion):
151            raise TypeError("Expecting SAMLVersion type got: %r" % 
152                            version.__class__)
153       
154        self._version = version
155       
156    version = property(fget=_get_version,
157                       fset=_set_version,
158                       doc="SAML Version of the assertion")
159
160    def _get_issueInstant(self):
161        '''Gets the issue instance of this assertion.
162       
163        @return the issue instance of this assertion'''
164        return self._issueInstant
165   
166    def _set_issueInstant(self, issueInstant):
167        '''Sets the issue instance of this assertion.
168       
169        @param newIssueInstance the issue instance of this assertion
170        '''
171        if not isinstance(issueInstant, datetime):
172            raise TypeError('Expecting "datetime" type for "issueInstant", '
173                            'got %r' % issueInstant.__class__)
174           
175        self._issueInstant = issueInstant
176       
177    issueInstant = property(fget=_get_issueInstant, 
178                            fset=_set_issueInstant,
179                            doc="Issue instant of the assertion")
180
181    def _get_id(self):
182        '''Sets the ID of this assertion.
183       
184        @return the ID of this assertion
185        '''
186        return self._id
187   
188    def _set_id(self, _id):
189        '''Sets the ID of this assertion.
190       
191        @param newID the ID of this assertion
192        '''
193        if not isinstance(_id, basestring):
194            raise TypeError('Expecting basestring derived type for "id", got '
195                            '%r' % _id.__class__)
196        self._id = _id
197       
198    id = property(fget=_get_id, fset=_set_id, doc="ID of assertion")
199
200   
201    def _set_issuer(self, issuer):
202        """Set issuer"""
203        if not isinstance(issuer, basestring):
204            raise TypeError("issuer must be a string, got %r" % 
205                            issuer.__class__)
206       
207        self._issuer = issuer
208   
209    def _get_issuer(self):
210        """Get the issuer name """
211        return self._issuer
212
213    issuer = property(fget=_get_issuer, 
214                      fset=_set_issuer,
215                      doc="Issuer of assertion")
216   
217
218    def _set_subject(self, subject):
219        """Set subject string."""
220        if not isinstance(subject, basestring):
221            raise TypeError("subject must be a string, got %r" % 
222                            subject.__class__)
223
224        self._subject = subject
225   
226    def _get_subject(self):
227        """Get subject string."""
228        return self._subject
229
230    subject = property(fget=_get_subject,
231                       fset=_set_subject, 
232                       doc="Attribute Assertion subject")
233   
234    def _set_conditions(self, conditions):
235        """Set assertion conditions."""
236        if not isinstance(conditions, (list, tuple)):
237            raise TypeError("conditions must be a string")
238
239        self._conditions = list(conditions)
240   
241    def _get_conditions(self):
242        """Get conditions string."""
243        return self._conditions
244
245    conditions = property(fget=_get_conditions,
246                          fset=_set_conditions, 
247                          doc="Attribute Assertion conditions")
248   
249    def _set_advice(self, advice):
250        """Set advice string."""
251        if not isinstance(advice, basestring):
252            raise TypeError("advice must be a string")
253
254        self._advice = advice
255   
256    def _get_advice(self):
257        """Get advice string."""
258        return self._advice
259
260    advice = property(fget=_get_advice,
261                      fset=_set_advice, 
262                      doc="Attribute Assertion advice")
263   
264    def _set_statements(self, statements):
265        """Set statements list."""
266        if not isinstance(statements, (list, tuple)):
267            raise TypeError("statements must be a list/tuple.")
268
269        self._statements = list(statements)
270   
271    def _get_statements(self):
272        """Get statements string."""
273        return self._statements
274
275    statements = property(fget=_get_statements,
276                          fset=_set_statements, 
277                          doc="Attribute Assertion statements")
278
279    def _set_authnStatements(self, authnStatements):
280        """Set authentication statements string."""
281        if not isinstance(authnStatements, (list, tuple)):
282            raise TypeError("authnStatements must be a list/tuple")
283
284        self._authnStatements = list(authnStatements)
285   
286    def _get_authnStatements(self):
287        """Get authnStatements string."""
288        return self._authnStatements
289
290    authnStatements = property(fget=_get_authnStatements,
291                               fset=_set_authnStatements, 
292                               doc="Attribute Assertion authentication "
293                                   "statements")
294   
295    def _set_authzDecisionStatements(self, authzDecisionStatements):
296        """Set authorisation decision statements."""
297        if not isinstance(authzDecisionStatements, (list, tuple)):
298            raise TypeError("authorisation decision statements must be a "
299                            "list/tuple")
300
301        self._authzDecisionStatements = list(authzDecisionStatements)
302   
303    def _get_authzDecisionStatements(self):
304        """Get authorisation decision statements."""
305        return self._authzDecisionStatements
306
307    authzDecisionStatements = property(fget=_get_authzDecisionStatements,
308                                       fset=_set_authzDecisionStatements, 
309                                       doc="Attribute Assertion authorisation "
310                                           "decision statements")
311   
312
313    def _set_attributeStatements(self, attributeStatements):
314        """Set attribute statements for the asssertion."""
315        if not isinstance(attributeStatements, (list, tuple)):
316            raise TypeError("attributeStatements must be a list/tuple")
317
318        self._attributeStatements = list(attributeStatements)
319   
320    def _get_attributeStatements(self):
321        """Get attributeStatements string."""
322        return self._attributeStatements
323
324    attributeStatements = property(fget=_get_attributeStatements,
325                               fset=_set_attributeStatements, 
326                               doc="Attribute Assertion attribute statements")
327
328
329class Attribute(SAMLObject):
330    '''SAML 2.0 Core Attribute.'''
331   
332    # Local name of the Attribute element.
333    DEFAULT_ELEMENT_LOCAL_NAME = "Attribute"
334
335    # Default element name.
336    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
337                                 DEFAULT_ELEMENT_LOCAL_NAME,
338                                 SAMLConstants.SAML20_PREFIX)
339
340    # Local name of the XSI type.
341    TYPE_LOCAL_NAME = "AttributeType"
342
343    # QName of the XSI type.
344    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
345                      TYPE_LOCAL_NAME,
346                      SAMLConstants.SAML20_PREFIX)
347
348    # Name of the Name attribute.
349    NAME_ATTRIB_NAME = "Name"
350
351    # Name for the NameFormat attribute.
352    NAME_FORMAT_ATTRIB_NAME = "NameFormat"
353
354    # Name of the FriendlyName attribute.
355    FRIENDLY_NAME_ATTRIB_NAME = "FriendlyName"
356
357    # Unspecified attribute format ID.
358    UNSPECIFIED = "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"
359
360    # URI reference attribute format ID.
361    URI_REFERENCE = "urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
362
363    # Basic attribute format ID.
364    BASIC = "urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
365
366    def __init__(self):
367        self._name = None
368        self._nameFormat = None
369        self._friendlyName = None
370        self._attributeValues = []
371
372    def _get_name(self):
373        return self._name
374   
375    def _set_name(self, name):
376        if not isinstance(name, basestring):
377            raise TypeError("Expecting basestring type for name, got %r"% name)
378       
379        self._name = name
380       
381    name = property(fget=_get_name,
382                    fset=_set_name,
383                    doc="name of this attribute")
384   
385    def _get_nameFormat(self):
386        return self._nameFormat
387   
388    def _set_nameFormat(self, nameFormat):
389        if not isinstance(nameFormat, basestring):
390            raise TypeError("Expecting basestring type for nameFormat, got %r"
391                            % nameFormat)
392           
393        self._nameFormat = nameFormat
394       
395    nameFormat = property(fget=_get_nameFormat,
396                          fset=_set_nameFormat,
397                          doc="Get the name format of this attribute.")
398   
399    def _get_friendlyName(self):
400        return self._friendlyName
401   
402    def _set_friendlyName(self, friendlyName):
403        if not isinstance(friendlyName, basestring):
404            raise TypeError("Expecting basestring type for friendlyName, got "
405                            "%r" % friendlyName)
406           
407        self._friendlyName = friendlyName
408       
409    friendlyName = property(fget=_get_friendlyName,
410                            fset=_set_friendlyName,
411                            doc="the friendly name of this attribute.")
412   
413    def _get_attributeValues(self):
414        return self._attributeValues
415   
416    def _set_attributeValues(self, attributeValues):
417        if not isinstance(attributeValues, (list, tuple)):
418            raise TypeError("Expecting basestring type for attributeValues, "
419                            "got %r" % attributeValues)
420           
421        self._attributeValues = attributeValues
422       
423    attributeValues = property(fget=_get_attributeValues,
424                               fset=_set_attributeValues,
425                               doc="the list of attribute values for this "
426                               "attribute.")
427
428class AttributeValue(SAMLObject):
429
430    # Element name, no namespace
431    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeValue"
432
433    # Default element name
434    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
435                                 DEFAULT_ELEMENT_LOCAL_NAME,
436                                 SAMLConstants.SAML20_PREFIX)
437   
438   
439class XSStringAttributeValue(AttributeValue):
440
441    # Local name of the XSI type
442    TYPE_LOCAL_NAME = "string"
443       
444    # QName of the XSI type
445    TYPE_NAME = QName(XMLConstants.XSD_NS, 
446                      TYPE_LOCAL_NAME, 
447                      XMLConstants.XSD_PREFIX)
448 
449    def __init__(self):
450        self.__value = None
451       
452    def _getValue(self):
453        return self.__value
454       
455    def _setValue(self, value):
456        if not isinstance(value, basestring):
457            raise TypeError("Input must be a basestring derived type, got %r" %
458                            value.__class__)
459           
460        self.__value = value
461
462    value = property(fget=_getValue, fset=_setValue, doc="string value") 
463   
464class Statement(SAMLObject):
465    pass
466
467class AttributeStatement(Statement):
468    '''SAML 2.0 Core AttributeStatement'''
469
470    def __init__(self):
471        self.__attributes = TypedList(Attribute)
472        self.__encryptedAttributes = TypedList(Attribute)
473
474    # Element local name
475    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeStatement"
476   
477    # Default element name.
478    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
479                                 DEFAULT_ELEMENT_LOCAL_NAME, 
480                                 SAMLConstants.SAML20_PREFIX)
481   
482    # Local name of the XSI type.
483    TYPE_LOCAL_NAME = "AttributeStatementType" 
484       
485    # QName of the XSI type.
486    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
487                      TYPE_LOCAL_NAME, 
488                      SAMLConstants.SAML20_PREFIX)
489
490    def _get_attributes(self):
491        '''@return the attributes expressed in this statement
492        '''
493        return self.__attributes
494
495    attributes = property(fget=_get_attributes)
496   
497    def _get_encryptedAttributes(self):
498       '''@return the encrypted attribtues expressed in this statement
499       '''
500       return self.__encryptedAttributes
501   
502    encryptedAttributes = property(fget=_get_encryptedAttributes)
503   
504
505class XSGroupRoleAttributeValue(AttributeValue): 
506    '''ESG Specific Group/Role attribute value.  ESG attribute permissions are
507    organised into group/role pairs
508    '''
509    DEFAULT_NS = "http://www.esg.org"
510    DEFAULT_PREFIX = "esg"
511    TYPE_LOCAL_NAME = "groupRole"
512   
513    GROUP_ATTRIB_NAME = "group"
514    ROLE_ATTRIB_NAME = "role"
515   
516    # QName of the XSI type
517    TYPE_NAME = QName(DEFAULT_NS, 
518                      TYPE_LOCAL_NAME, 
519                      DEFAULT_PREFIX)
520     
521    def __init__(self, 
522                 namespaceURI=DEFAULT_NS, 
523                 elementLocalName=TYPE_LOCAL_NAME, 
524                 namespacePrefix=DEFAULT_PREFIX):
525        '''@param namespaceURI: the namespace the element is in
526        @param elementLocalName: the local name of the XML element this Object
527        represents
528        @param namespacePrefix: the prefix for the given namespace'''
529        self.__namespaceURI = namespaceURI
530        self.__elementLocalName = elementLocalName
531        self.__namespacePrefix = namespacePrefix
532        self.__group = None
533        self.__role = None       
534
535    def _getNamespaceURI(self):
536        return self.__namespaceURI
537
538    def _setNamespaceURI(self, value):
539        if not isinstance(value, basestring):
540            raise TypeError("Expecting %r type for namespaceURI got %r" %
541                            (basestring, value.__class__))
542        self.__namespaceURI = value
543
544    def _getElementLocalName(self):
545        return self.__elementLocalName
546
547    def _setElementLocalName(self, value):
548        if not isinstance(value, basestring):
549            raise TypeError("Expecting %r type for elementLocalName got %r" %
550                            (basestring, value.__class__))
551        self.__elementLocalName = value
552
553    def _getNamespacePrefix(self):
554        return self.__namespacePrefix
555
556    def _setNamespacePrefix(self, value):
557        if not isinstance(value, basestring):
558            raise TypeError("Expecting %r type for namespacePrefix got %r" %
559                            (basestring, value.__class__))
560        self.__namespacePrefix = value
561
562    namespaceURI = property(fget=_getNamespaceURI, 
563                            fset=_setNamespaceURI, 
564                            doc="the namespace the element is in")
565
566    elementLocalName = property(fget=_getElementLocalName, 
567                                fset=_setElementLocalName, 
568                                doc="the local name of the XML element this "
569                                    "Object represents")
570
571    namespacePrefix = property(fget=_getNamespacePrefix, 
572                               fset=_setNamespacePrefix, 
573                               doc="the prefix for the given namespace")
574
575    def _getGroup(self):
576        return self.__group
577     
578    def _setGroup(self, group): 
579        self.__group = group
580     
581    group = property(fget=_getGroup, fset=_setGroup)
582     
583    def _getRole(self):
584        return self.__role
585     
586    def _setRole(self, role):
587        self.__role = role
588     
589    role = property(fget=_getRole, fset=_setRole)
590
591    def getOrderedChildren(self):
592        # no children
593        return None
594
595
596class AbstractNameIDType(SAMLObject):
597    '''Abstract implementation of NameIDType'''
598
599    # SPNameQualifier attribute name.
600    SP_NAME_QUALIFIER_ATTRIB_NAME = "SPNameQualifier"
601
602    # Format attribute name.
603    FORMAT_ATTRIB_NAME = "Format"
604
605    # SPProviderID attribute name.
606    SPPROVIDED_ID_ATTRIB_NAME = "SPProvidedID"
607
608    # URI for unspecified name format.
609    UNSPECIFIED = "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
610
611    # URI for email name format.
612    EMAIL = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
613
614    # URI for X509 subject name format.
615    X509_SUBJECT = "urn:oasis:names:tc:SAML:1.1:nameid-format:x509SubjectName"
616
617    # URI for windows domain qualified name name format.
618    WIN_DOMAIN_QUALIFIED = \
619        "urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName"
620
621    # URI for kerberos name format.
622    KERBEROS = "urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos"
623
624    # URI for SAML entity name format.
625    ENTITY = "urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
626
627    # URI for persistent name format.
628    PERSISTENT = "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
629
630    # URI for transient name format.
631    TRANSIENT = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
632
633    # Special URI used by NameIDPolicy to indicate a NameID should be encrypted
634    ENCRYPTED = "urn:oasis:names:tc:SAML:2.0:nameid-format:encrypted"
635   
636    def __init__(self, namespaceURI, elementLocalName, namespacePrefix): 
637        '''@param namespaceURI the namespace the element is in
638        @param elementLocalName the local name of the XML element this Object
639        represents
640        @param namespacePrefix the prefix for the given namespace
641        '''
642        self.__qname = QName(namespaceURI, elementLocalName, namespacePrefix)
643   
644        # Name of the Name ID.
645        self.__name = None
646       
647        # Name Qualifier of the Name ID.
648        self.__nameQualifier = None
649   
650        # SP Name Qualifier of the Name ID.
651        self.__spNameQualifier = None
652   
653        # Format of the Name ID.
654        self.__format = None
655   
656        # SP ProvidedID of the NameID.
657        self.__spProvidedID = None
658
659        self.__value = None
660       
661    def _getQName(self):
662        return self.__qname
663       
664    def _setQName(self, value):
665        if not isinstance(value, QName):
666            raise TypeError("\"qname\" must be a %r derived type, "
667                            "got %r" % (QName, type(value)))
668           
669        self.__qname = value
670
671    qname = property(fget=_getQName, fset=_setQName, doc="qualified name")
672             
673    def _getValue(self):
674        return self.__value
675       
676    def _setValue(self, value):
677        if not isinstance(value, basestring):
678            raise TypeError("\"value\" must be a basestring derived type, "
679                            "got %r" % value.__class__)
680           
681        self.__value = value
682
683    value = property(fget=_getValue, fset=_setValue, doc="string value") 
684   
685    def _getNameQualifier(self): 
686        return self.__nameQualifier
687   
688    def _setNameQualifier(self, value): 
689        self.__nameQualifier = value
690
691    nameQualifier = property(fget=_getNameQualifier, 
692                             fset=_setNameQualifier, 
693                             doc="Name qualifier")   
694
695    def _getSPNameQualifier(self): 
696        return self.__spNameQualifier
697   
698    def _setSPNameQualifier(self, value): 
699        self.__spNameQualifier = value
700
701    spNameQualifier = property(fget=_getSPNameQualifier, 
702                               fset=_setSPNameQualifier, 
703                               doc="SP Name qualifier")   
704   
705    def _getFormat(self):
706        return self.__format
707       
708    def _setFormat(self, format):
709        if not isinstance(format, basestring):
710            raise TypeError("\"format\" must be a basestring derived type, "
711                            "got %r" % format.__class__)
712           
713        self.__format = format
714
715    format = property(fget=_getFormat, fset=_setFormat, doc="Name format") 
716   
717    def _getSPProvidedID(self): 
718        return self.__spProvidedID
719   
720    def _setSPProvidedID(self, value): 
721        self.__spProvidedID = value
722
723    spProvidedID = property(fget=_getSPProvidedID, fset=_setSPProvidedID, 
724                            doc="SP Provided Identifier") 
725   
726    def getOrderedChildren(self): 
727        raise NotImplementedError()
728
729   
730class Issuer(AbstractNameIDType):
731
732    # Element local name.
733    DEFAULT_ELEMENT_LOCAL_NAME = "Issuer"
734
735    # Default element name.
736    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
737                                 DEFAULT_ELEMENT_LOCAL_NAME,
738                                 SAMLConstants.SAML20_PREFIX)
739
740    # Local name of the XSI type.
741    TYPE_LOCAL_NAME = "IssuerType"
742
743    # QName of the XSI type.
744    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
745                      TYPE_LOCAL_NAME,
746                      SAMLConstants.SAML20_PREFIX) 
747   
748    def __init__(self, 
749                 namespaceURI=SAMLConstants.SAML20_NS, 
750                 elementLocalName=DEFAULT_ELEMENT_LOCAL_NAME, 
751                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
752        super(Issuer, self).__init__(namespaceURI=namespaceURI,
753                                     elementLocalName=elementLocalName,
754                                     namespacePrefix=namespacePrefix)
755
756     
757class NameID(AbstractNameIDType):
758    '''SAML 2.0 Core NameID'''
759    # Element local name.
760    DEFAULT_ELEMENT_LOCAL_NAME = "NameID"
761
762    # Default element name.
763    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
764                                 DEFAULT_ELEMENT_LOCAL_NAME,
765                                 SAMLConstants.SAML20_PREFIX)
766
767    # Local name of the XSI type.
768    TYPE_LOCAL_NAME = "NameIDType"
769
770    # QName of the XSI type.
771    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
772                      TYPE_LOCAL_NAME,
773                      SAMLConstants.SAML20_PREFIX)
774   
775    def __init__(self, 
776                 namespaceURI=SAMLConstants.SAML20_NS, 
777                 elementLocalName=DEFAULT_ELEMENT_LOCAL_NAME, 
778                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
779        super(NameID, self).__init__(namespaceURI=namespaceURI,
780                                     elementLocalName=elementLocalName,
781                                     namespacePrefix=namespacePrefix)
782       
783   
784class Subject(SAMLObject):
785    '''Concrete implementation of @link org.opensaml.saml2.core.Subject.'''
786   
787    # Element local name.
788    DEFAULT_ELEMENT_LOCAL_NAME = "Subject"
789
790    # Default element name.
791    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS, 
792                                 DEFAULT_ELEMENT_LOCAL_NAME,
793                                 SAMLConstants.SAML20_PREFIX)
794
795    # Local name of the XSI type.
796    TYPE_LOCAL_NAME = "SubjectType"
797
798    # QName of the XSI type.
799    TYPE_NAME = QName(SAMLConstants.SAML20_NS, 
800                      TYPE_LOCAL_NAME,
801                      SAMLConstants.SAML20_PREFIX)
802
803    def __init__(self, 
804                 namespaceURI=SAMLConstants.SAML20_NS, 
805                 elementLocalName=DEFAULT_ELEMENT_LOCAL_NAME, 
806                 namespacePrefix=SAMLConstants.SAML20_PREFIX):
807        '''@param namespaceURI the namespace the element is in
808        @param elementLocalName the local name of the XML element this Object
809        represents
810        @param namespacePrefix the prefix for the given namespace
811        '''
812        self.__qname = QName(namespaceURI, 
813                             tag=elementLocalName, 
814                             prefix=namespacePrefix)
815       
816        # BaseID child element.
817        self.__baseID = None
818   
819        # NameID child element.
820        self.__nameID = None
821   
822        # EncryptedID child element.
823        self.__encryptedID = None
824   
825        # Subject Confirmations of the Subject.
826        self.__subjectConfirmations = []
827   
828    def _get_qname(self):
829        return self.__qname
830   
831    qname = property(fget=_get_qname, doc="Qualified Name for Subject")
832   
833    def _getBaseID(self): 
834        return self.__baseID
835
836    def _setBaseID(self, value):
837        if not isinstance(value, basestring):
838            raise TypeError("Expecting %r type for \"baseID\" got %r" %
839                            (basestring, value.__class__))
840        self.__baseID = value
841
842    baseID = property(fget=_getBaseID, 
843                      fset=_setBaseID, 
844                      doc="Base identifier")
845     
846    def _getNameID(self):
847        return self.__nameID
848   
849    def _setNameID(self, value):
850        if not isinstance(value, NameID):
851            raise TypeError("Expecting %r type for \"nameID\" got %r" %
852                            (NameID, type(value)))
853        self.__nameID = value
854
855    nameID = property(fget=_getNameID, 
856                      fset=_setNameID, 
857                      doc="Name identifier")
858   
859    def _getEncryptedID(self):
860        return self.__encryptedID
861   
862    def _setEncryptedID(self, value): 
863        self.__encryptedID = value
864
865    encryptedID = property(fget=_getEncryptedID, 
866                           fset=_setEncryptedID, 
867                           doc="EncryptedID's Docstring")   
868    def _getSubjectConfirmations(self): 
869        return self.__subjectConfirmations
870
871    subjectConfirmations = property(fget=_getSubjectConfirmations, 
872                                    doc="Subject Confirmations")   
873    def getOrderedChildren(self): 
874        children = []
875
876        if self.baseID is not None:
877            children.append(self.baseID)
878       
879        if self.nameID is not None: 
880            children.append(self.nameID)
881       
882        if self.encryptedID is not None: 
883            children.append(self.encryptedID)
884       
885        children += self.subjectConfirmations
886
887        return tuple(children)
888   
889
890class RequestAbstractType(SAMLObject): 
891    '''SAML 2.0 Core RequestAbstractType'''
892   
893    # Local name of the XSI type.
894    TYPE_LOCAL_NAME = "RequestAbstractType"
895
896    # QName of the XSI type.
897    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
898                      TYPE_LOCAL_NAME,
899                      SAMLConstants.SAML20P_PREFIX)
900
901    # ID attribute name.
902    ID_ATTRIB_NAME = "ID"
903
904    # Version attribute name.
905    VERSION_ATTRIB_NAME = "Version"
906
907    # IssueInstant attribute name.
908    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant"
909
910    # Destination attribute name.
911    DESTINATION_ATTRIB_NAME = "Destination"
912
913    # Consent attribute name.
914    CONSENT_ATTRIB_NAME = "Consent"
915
916    # Unspecified consent URI.
917    UNSPECIFIED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unspecified"
918
919    # Obtained consent URI.
920    OBTAINED_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:obtained"
921
922    # Prior consent URI.
923    PRIOR_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:prior"
924
925    # Implicit consent URI.
926    IMPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:implicit"
927
928    # Explicit consent URI.
929    EXPLICIT_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:explicit"
930
931    # Unavailable consent URI.
932    UNAVAILABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:unavailable"
933
934    # Inapplicable consent URI.
935    INAPPLICABLE_CONSENT = "urn:oasis:names:tc:SAML:2.0:consent:inapplicable" 
936
937    def __init__(self):
938        # SAML Version of the request.
939        self.__version = None
940   
941        # Unique identifier of the request.
942        self.__id = None
943   
944        # Date/time request was issued.
945        self.__issueInstant = None
946   
947        # URI of the request destination.
948        self.__destination = None
949   
950        # URI of the SAML user consent type.
951        self.__consent = None
952   
953        # URI of the SAML user consent type.
954        self.__issuer = None
955   
956        # Extensions child element.
957        self.__extensions = None
958       
959    def _get_version(self):
960        '''@return the SAML Version of this assertion.
961        '''
962        return self.__version
963   
964    def _set_version(self, version):
965        '''@param version the SAML Version of this assertion
966        '''
967        if not isinstance(version, SAMLVersion):
968            raise TypeError("Expecting SAMLVersion type got: %r" % 
969                            version.__class__)
970       
971        self.__version = version
972       
973    version = property(fget=_get_version,
974                       fset=_set_version,
975                       doc="SAML Version of the assertion")
976
977    def _get_issueInstant(self):
978        '''Gets the date/time the request was issued
979       
980        @return the issue instance of this request'''
981        return self.__issueInstant
982   
983    def _set_issueInstant(self, value):
984        '''Sets the date/time the request was issued
985       
986        @param value the issue instance of this request
987        '''
988        if not isinstance(value, datetime):
989            raise TypeError('Expecting "datetime" type for "issueInstant", '
990                            'got %r' % type(value))
991           
992        self.__issueInstant = value
993       
994    issueInstant = property(fget=_get_issueInstant, 
995                            fset=_set_issueInstant,
996                            doc="Issue instant of the request") 
997
998    def _get_id(self):
999        '''Sets the unique identifier for this request.
1000       
1001        @return the ID of this request
1002        '''
1003        return self.__id
1004   
1005    def _set_id(self, value):
1006        '''Sets the unique identifier for this request
1007       
1008        @param newID the ID of this assertion
1009        '''
1010        if not isinstance(value, basestring):
1011            raise TypeError('Expecting basestring derived type for "id", got '
1012                            '%r' % type(value))
1013        self.__id = value
1014       
1015    id = property(fget=_get_id, fset=_set_id, doc="ID of request")
1016
1017    def _get_destination(self):
1018        '''Gets the URI of the destination of the request.
1019       
1020        @return the URI of the destination of the request
1021        '''
1022        return self.__destination
1023   
1024    def _set_destination(self, value):
1025        '''Sets the URI of the destination of the request.
1026       
1027        @param newDestination the URI of the destination of the request'''
1028        if not isinstance(value, basestring):
1029            raise TypeError('Expecting basestring derived type for '
1030                            '"destination", got %r' % type(value))
1031        self.__destination = value
1032       
1033    destination = property(fget=_get_destination, 
1034                           fset=_set_destination,
1035                           doc="Destination of request")
1036     
1037    def _get_consent(self):
1038        '''Gets the consent obtained from the principal for sending this
1039        request.
1040       
1041        @return: the consent obtained from the principal for sending this
1042        request
1043        '''
1044        return self.__consent
1045       
1046    def _set_consent(self, value):
1047        '''Sets the consent obtained from the principal for sending this
1048        request.
1049       
1050        @param value: the new consent obtained from the principal for
1051        sending this request
1052        ''' 
1053        if not isinstance(value, basestring):
1054            raise TypeError('Expecting basestring derived type for "consent", '
1055                            'got %r' % type(value))
1056        self.__consent = value
1057             
1058    consent = property(fget=_get_consent, 
1059                       fset=_set_consent,
1060                       doc="Consent for request")
1061   
1062    def _set_issuer(self, issuer):
1063        """Set issuer of request"""
1064        if not isinstance(issuer, Issuer):
1065            raise TypeError("\"issuer\" must be a %r, got %r" % 
1066                            issuer.__class__)
1067       
1068        self.__issuer = issuer
1069   
1070    def _get_issuer(self):
1071        """Get the issuer name """
1072        return self.__issuer
1073
1074    issuer = property(fget=_get_issuer, 
1075                      fset=_set_issuer,
1076                      doc="Issuer of request")
1077 
1078    def _get_extensions(self):
1079        '''Gets the Extensions of this request.
1080       
1081        @return: the Status of this request
1082        '''
1083        return self.__extensions
1084     
1085    def _set_extensions(self, value):
1086        '''Sets the Extensions of this request.
1087       
1088        @param value: the Extensions of this request
1089        '''
1090        self.__extensions = value
1091       
1092    extensions = property(fget=_get_extensions, 
1093                          fset=_set_extensions,
1094                          doc="Request extensions")
1095
1096
1097class SubjectQuery(RequestAbstractType):
1098
1099    def __init__(self):
1100        self.__subject = None
1101       
1102    def _getSubject(self):
1103        '''Gets the Subject of this request.
1104       
1105        @return the Subject of this request'''   
1106        return self.__subject
1107   
1108    def _setSubject(self, value):
1109        '''Sets the Subject of this request.
1110       
1111        @param newSubject the Subject of this request'''
1112        if not isinstance(value, Subject):
1113            raise TypeError('Setting "subject", got %r, expecting %r' %
1114                            (Subject, type(value)))
1115           
1116        self.__subject = value
1117       
1118    subject = property(fget=_getSubject, fset=_setSubject, doc="Query subject")
1119   
1120   
1121class AttributeQuery(SubjectQuery):
1122    '''SAML 2.0 AttributeQuery.'''
1123   
1124    # Element local name.
1125    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeQuery"
1126
1127    # Default element name.
1128    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20P_NS, 
1129                                 DEFAULT_ELEMENT_LOCAL_NAME,
1130                                 SAMLConstants.SAML20P_PREFIX)
1131
1132    # Local name of the XSI type.
1133    TYPE_LOCAL_NAME = "AttributeQueryType"
1134
1135    # QName of the XSI type.
1136    TYPE_NAME = QName(SAMLConstants.SAML20P_NS, 
1137                      TYPE_LOCAL_NAME,
1138                      SAMLConstants.SAML20P_PREFIX)
1139
1140    def __init__(self):
1141        self.__attributes = TypedList(Attribute)
1142 
1143    def _getAttributes(self):
1144        '''Gets the Attributes of this query.
1145       
1146        @return the list of Attributes of this query'''
1147        return self.__attributes
1148
1149    def _setAttributes(self, value):
1150        self.__attributes = value
1151
1152    attributes = property(fget=_getAttributes, 
1153                          fset=_setAttributes, 
1154                          doc="Attributes")
1155   
1156    def getOrderedChildren(self):
1157        """TODO: is this required??"""
1158        raise NotImplementedError()
1159
Note: See TracBrowser for help on using the repository browser.