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

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

Working SAML Attribute Query with SOAP binding

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