Changeset 5503


Ignore:
Timestamp:
21/07/09 16:39:02 (10 years ago)
Author:
pjkersha
Message:

Started SAML interface for Attribute Authority - made major additions to SAML module and added unit test for
port of ESG SAML sample code  http://www.ci.uchicago.edu/wiki/bin/view/ESGProject/ESGSAMLAttributes#ESG_Attribute_Service

  • ndg.security.common.saml: added new SAML classes needed for ESG SAML interface
  • ndg.security.test.unit.attributeauthority.saml: unit test for ESG ported SAML code.
Location:
TI12-security/trunk/python
Files:
3 added
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/saml/__init__.py

    r4840 r5503  
    2929from ndg.security.common.xmlsec.etree import XMLSecDoc, InvalidSignature 
    3030 
    31 #_____________________________________________________________________________ 
    32 class AttributeAssertionError(Exception):   
    33     """Exception handling for NDG Attribute Assertion class.""" 
    34  
    35 #_____________________________________________________________________________ 
    36 class AttributeAssertionReadOnlyDict(dict): 
    37     def __init__(self, inputDict): 
    38         super(AttributeAssertionReadOnlyDict, self).__init__(inputDict) 
    39          
    40     def __setitem__(self, key, item): 
    41         raise KeyError("Items are read-only in this dictionary") 
    42         
    43 #_____________________________________________________________________________ 
    44 class _MetaAttributeAssertion(type): 
    45     """Enable AttributeAssertion to have read only class variables e.g. 
    46      
    47     print AttributeAssertion.mappedProvenance is allowed but, 
    48      
    49     AttributeAssertion.mappedProvenance = None 
    50      
    51     ... raises - AttributeError: can't set attribute""" 
    52      
    53     #_________________________________________________________________________     
    54     def __getVersion(cls): 
    55         '''Version of THIS format for the certificate''' 
    56         return '1.0' 
    57  
    58     version = property(fget=__getVersion,  
    59                        doc="Version of the certificate format") 
    60     
    61     #_________________________________________________________________________     
    62     def __getMappedProvenance(cls): 
    63         '''Text for mapped provenance setting of certificate''' 
    64         return 'mapped' 
    65  
    66     mappedProvenance = property(fget=__getMappedProvenance, 
    67         doc="Text constant indicating cert has mapped roles from another") 
    68  
    69     #_________________________________________________________________________     
    70     def __getOriginalProvenance(cls): 
    71         '''Text for original provenance setting of certificate''' 
    72         return 'original' 
    73      
    74     origProvenance = property(fget=__getOriginalProvenance, 
    75         doc="Text constant indicating cert has original and not mapped roles") 
    76      
    77      
    78 #_____________________________________________________________________________ 
    79 class AttributeAssertion(dict, XMLSecDoc): 
    80     """NDG SAML 1.1 Attribute Assertion for use with NERC DataGrid 
    81      
    82     @type __validProvenanceSettings: tuple 
    83     @cvar __validProvenanceSettings: string constants for allowable certificate 
    84     provenance settings 
    85      
    86     @type namespace: string 
    87     @cvar namespace: namespace for Attribute Assertion""" 
    88      
    89     __metaclass__ = _MetaAttributeAssertion 
    90  
    91     # Provenance of certificate may be original or mapped from another 
    92     # certificate 
    93     __validProvenanceSettings = ('original', 'mapped') 
    94      
     31class AssertionMarshaller(object): 
     32    """ElementTree based marshalling of Assertion class into XML 
     33    """ 
     34    def __init__(self, assertion): 
     35        self._elem = Element() 
     36        self._root = None 
     37         
     38    def parse(self, source): 
     39        """Read in the XML from source 
     40        @type source: basestring/file 
     41        @param source: file path to XML file or file object 
     42        """ 
     43        elem = ElementTree.parse(source) 
     44        root = elem.getroot() 
     45         
     46        return root 
     47         
     48    def serialise(self): 
     49        return txt 
     50 
     51class SAMLObject(XMLObject): 
     52    pass 
     53 
     54class QName(object): 
     55    def __init__(self, namespaceURI, localPart, prefix): 
     56        self.namespaceURI = namespaceURI 
     57        self.localPart = localPart 
     58        self.prefix = prefix 
     59 
     60    def _getPrefix(self): 
     61        return self.__prefix 
     62 
     63    def _setPrefix(self, value): 
     64        self.__prefix = value 
     65     
     66    prefix = property(_getPrefix, _setPrefix, None,  
     67                      "Prefix") 
     68 
     69    def _getLocalPart(self): 
     70        return self.__localPart 
     71     
     72    def _setLocalPart(self, value): 
     73        self.__localPart = value 
     74         
     75    localPart = property(_getLocalPart, _setLocalPart, None,  
     76                         "LocalPart") 
     77 
     78    def _getNamespaceURI(self): 
     79        return self.__namespaceURI 
     80 
     81    def _setNamespaceURI(self, value): 
     82        self.__namespaceURI = value 
     83   
     84    namespaceURI = property(_getNamespaceURI, _setNamespaceURI, None,  
     85                            "Namespace URI'") 
     86 
     87 
     88class XMLConstants(object): 
     89    pass 
     90 
     91class SAMLConstants(XMLConstants): 
     92    '''XML related constants used in the SAML specifications.''' 
     93     
     94    # HTTP Constants 
     95     
     96    # HTTP Request Method - POST. 
     97    POST_METHOD = "POST" 
     98     
     99    # HTTP Method - GET. 
     100    GET_METHOD = "GET" 
     101     
     102    # OpenSAML 2 
     103     
     104    # Directory, on the classpath, schemas are located in. 
     105    SCHEMA_DIR = "/schema/" 
     106     
     107    #    Core XML 
     108     
     109    # XML core schema system Id. 
     110    XML_SCHEMA_LOCATION = SCHEMA_DIR + "xml.xsd" 
     111     
     112    #  XML Signature schema Id. 
     113    XMLSIG_SCHEMA_LOCATION = SCHEMA_DIR + "xmldsig-core-schema.xsd" 
     114     
     115    # XML Encryption schema Id. 
     116    XMLENC_SCHEMA_LOCATION = SCHEMA_DIR + "xenc-schema.xsd" 
     117 
     118     
     119    #    SOAP 
     120     
     121    #  SOAP 1.1 schema Id. 
     122    SOAP11ENV_SCHEMA_LOCATION = SCHEMA_DIR + SCHEMA_DIR + "soap-envelope.xsd" 
     123     
     124    #  SOAP 1.1 Envelope XML namespace. 
     125    SOAP11ENV_NS = "http:#schemas.xmlsoap.org/soap/envelope/" 
     126     
     127    #  SOAP 1.1 Envelope QName prefix. 
     128    SOAP11ENV_PREFIX = "SOAP-ENV" 
     129     
     130    #  Liberty PAOS XML Namespace. 
     131    PAOS_NS = "urn:liberty:paos:2003-08" 
     132     
     133    #  Liberty PAOS QName prefix. 
     134    PAOS_PREFIX = "paos" 
     135 
     136     
     137    #    SAML 1.X 
     138     
     139    # SAML 1.0 Assertion schema system Id. 
     140    SAML10_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-assertion-01.xsd" 
     141     
     142    # SAML 1.1 Assertion schema system Id. 
     143    SAML11_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-assertion-1.1.xsd" 
     144     
     145    # SAML 1.X XML namespace. 
     146    SAML1_NS = "urn:oasis:names:tc:SAML:1.0:assertion" 
     147     
     148    # SAML 1.0 Protocol schema system Id. 
     149    SAML10P_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-protocol-01.xsd" 
     150     
     151    # SAML 1.1 Protocol schema system Id. 
     152    SAML11P_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-protocol-1.1.xsd" 
     153 
     154    # SAML 1.X protocol XML namespace. 
     155    SAML10P_NS = "urn:oasis:names:tc:SAML:1.0:protocol" 
     156     
     157    # SAML 1.1 protocol XML namespace, used only in SAML 2 metadata protocol 
     158    # SupportEnumeration. 
     159    SAML11P_NS = "urn:oasis:names:tc:SAML:1.1:protocol" 
     160     
     161    # SAML 1.X Protocol QName prefix. 
     162    SAML1P_PREFIX = "samlp" 
     163 
     164    # SAML 1.X Assertion QName prefix. 
     165    SAML1_PREFIX = "saml" 
     166     
     167    # SAML 1 Metadata extension XML namespace. 
     168    SAML1MD_NS = "urn:oasis:names:tc:SAML:profiles:v1metadata" 
     169     
     170    # SAML 1 Metadata extension schema system Id. 
     171    SAML1MD_SCHEMA_LOCATION = SCHEMA_DIR + "sstc-saml1x-metadata.xsd" 
     172     
     173    # SAML 1 Metadata extension namespace prefix. 
     174    SAML1MD_PREFIX = "saml1md" 
     175     
     176    # URI for SAML 1 Artifact binding. 
     177    SAML1_ARTIFACT_BINDING_URI = \ 
     178        "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" 
     179     
     180    # URI for SAML 1 POST binding. 
     181    SAML1_POST_BINDING_URI = \ 
     182        "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" 
     183     
     184    # URI for SAML 1 SOAP 1.1 binding. 
     185    SAML1_SOAP11_BINDING_URI = \ 
     186        "urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding" 
     187     
     188     
     189    #    SAML 2.0 
     190     
     191    # SAML 2.0 Assertion schema Id. 
     192    SAML20_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-assertion-2.0.xsd" 
     193     
     194    # SAML 2.0 Assertion XML Namespace. 
     195    SAML20_NS = "urn:oasis:names:tc:SAML:2.0:assertion" 
     196     
     197    # SAML 2.0 Assertion QName prefix. 
     198    SAML20_PREFIX ="saml" 
     199     
     200    # SAML 2.0 Protocol schema Id. 
     201    SAML20P_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-protocol-2.0.xsd" 
     202     
     203    # SAML 2.0 Protocol XML Namespace. 
     204    SAML20P_NS = "urn:oasis:names:tc:SAML:2.0:protocol" 
     205     
     206    # SAML 2.0 Protocol QName prefix. 
     207    SAML20P_PREFIX ="samlp" 
     208     
     209    # SAML 2.0 Protocol Third-party extension schema Id. 
     210    SAML20PTHRPTY_SCHEMA_LOCATION = SCHEMA_DIR + \ 
     211                                    "sstc-saml-protocol-ext-thirdparty.xsd" 
     212     
     213    # SAML 2.0 Protocol XML Namespace. 
     214    SAML20PTHRPTY_NS = "urn:oasis:names:tc:SAML:protocol:ext:third-party" 
     215     
     216    # SAML 2.0 Protocol QName prefix. 
     217    SAML20PTHRPTY_PREFIX ="thrpty" 
     218     
     219    # SAML 2.0 Metadata schema Id. 
     220    SAML20MD_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-metadata-2.0.xsd" 
     221     
     222    # SAML 2.0 Metadata XML Namespace. 
     223    SAML20MD_NS ="urn:oasis:names:tc:SAML:2.0:metadata" 
     224     
     225    # SAML 2.0 Standalone Query Metadata extension XML namespace. 
     226    SAML20MDQUERY_NS = "urn:oasis:names:tc:SAML:metadata:ext:query" 
     227     
     228    # SAML 2.0 Standalone Query Metadata extension schema system Id. 
     229    SAML20MDQUERY_SCHEMA_LOCATION = SCHEMA_DIR + \ 
     230                                    "sstc-saml-metadata-ext-query.xsd" 
     231     
     232    # SAML 2.0 Standalone Query Metadata extension prefix. 
     233    SAML20MDQUERY_PREFIX = "query" 
     234     
     235    # SAML 2.0 Metadata QName prefix. 
     236    SAML20MD_PREFIX = "md" 
     237     
     238    # SAML 2.0 Authentication Context schema Id. 
     239    SAML20AC_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-authn-context-2.0.xsd" 
     240     
     241    # SAML 2.0 Authentication Context XML Namespace. 
     242    SAML20AC_NS ="urn:oasis:names:tc:SAML:2.0:ac" 
     243     
     244    # SAML 2.0 Authentication Context QName prefix. 
     245    SAML20AC_PREFIX = "ac" 
     246     
     247    # SAML 2.0 Enhanced Client/Proxy SSO Profile schema Id. 
     248    SAML20ECP_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-ecp-2.0.xsd" 
     249     
     250    # SAML 2.0 Enhanced Client/Proxy SSO Profile XML Namespace. 
     251    SAML20ECP_NS = "urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp" 
     252     
     253    # SAML 2.0 Enhanced Client/Proxy SSO Profile QName prefix. 
     254    SAML20ECP_PREFIX = "ecp" 
     255     
     256    # SAML 2.0 DCE PAC Attribute Profile schema Id. 
     257    SAML20DCE_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-dce-2.0.xsd" 
     258     
     259    # SAML 2.0 DCE PAC Attribute Profile XML Namespace. 
     260    SAML20DCE_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE" 
     261     
     262    # SAML 2.0 DCE PAC Attribute Profile QName prefix. 
     263    SAML20DCE_PREFIX = "DCE" 
     264     
     265    # SAML 2.0 X.500 Attribute Profile schema Id. 
     266    SAML20X500_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-x500-2.0.xsd" 
     267     
     268    # SAML 2.0 X.500 Attribute Profile XML Namespace. 
     269    SAML20X500_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500" 
     270     
     271    # SAML 2.0 X.500 Attribute Profile QName prefix. 
     272    SAML20X500_PREFIX = "x500" 
     273     
     274    # SAML 2.0 XACML Attribute Profile schema Id. 
     275    SAML20XACML_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-xacml-2.0.xsd" 
     276     
     277    # SAML 2.0 XACML Attribute Profile XML Namespace. 
     278    SAML20XACML_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML" 
     279     
     280    # SAML 2.0 XACML Attribute Profile QName prefix. 
     281    SAML20XACML_PREFIX = "xacmlprof" 
     282     
     283    # URI for SAML 2 Artifact binding. 
     284    SAML2_ARTIFACT_BINDING_URI = \ 
     285                        "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" 
     286     
     287    # URI for SAML 2 POST binding. 
     288    SAML2_POST_BINDING_URI = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
     289     
     290    # URI for SAML 2 POST-SimpleSign binding. 
     291    SAML2_POST_SIMPLE_SIGN_BINDING_URI = \ 
     292                "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" 
     293     
     294    # URI for SAML 2 HTTP redirect binding. 
     295    SAML2_REDIRECT_BINDING_URI = \ 
     296                "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
     297     
     298    # URI for SAML 2 SOAP binding. 
     299    SAML2_SOAP11_BINDING_URI = "urn:oasis:names:tc:SAML:2.0:bindings:SOAP" 
     300 
     301 
     302class SAMLVersion(object): 
     303    VERSION_10 = (1, 0) 
     304    VERSION_11 = (1, 1) 
     305    VERSION_20 = (2, 0) 
     306     
     307    def __init__(self, version): 
     308        self.__version = version 
     309     
     310    def __str__(self): 
     311        return ".".join([str(i) for i in self.__version]) 
     312     
     313    @classmethod 
     314    def valueOf(cls, version): 
     315        return tuple(version.split(".")) 
     316     
     317 
     318class Assertion(XMLObject, XMLSecDoc): 
     319    """SAML 2.0 Attribute Assertion for use with NERC DataGrid     
     320    """     
    95321    ns = "urn:oasis:names:tc:SAML:1.0:assertion" 
    96322    nsPfx = "saml" 
    97     issuer = 'http://badc.nerc.ac.uk' 
     323    issuer = 'http:#badc.nerc.ac.uk' 
    98324    attributeName = "urn:mace:dir:attribute-def:eduPersonAffiliation" 
    99325    attributeNS = "urn:mace:shibboleth:1.0:attributeNamespace:uri" 
    100326 
    101     #_________________________________________________________________________     
    102     def __init__(self, provenance='original', lifetime=28800, **xmlSecDocKw): 
    103         """Initialisation - Attribute Assertion file path may be specified. 
    104         Also, holder and issuer details and signing authority key and 
    105         certificate. 
    106          
    107         @type lifetime: int 
    108         @param lifetime: set the lifetime for the certificate in seconds. 
    109         Defaults to 8 hours. 
    110          
    111         @type **xmlSecDocKw: dict 
     327    # Element local name. 
     328    DEFAULT_ELEMENT_LOCAL_NAME = "Assertion" 
     329 
     330    # Default element name. 
     331    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS,  
     332                                 DEFAULT_ELEMENT_LOCAL_NAME, 
     333                                 SAMLConstants.SAML20_PREFIX) 
     334 
     335    # Local name of the XSI type. 
     336    TYPE_LOCAL_NAME = "AssertionType" 
     337 
     338    # QName of the XSI type. 
     339    TYPE_NAME = QName(SAMLConstants.SAML20_NS, TYPE_LOCAL_NAME, 
     340                      SAMLConstants.SAML20_PREFIX) 
     341 
     342    # Version attribute name. 
     343    VERSION_ATTRIB_NAME = "Version" 
     344 
     345    # IssueInstant attribute name. 
     346    ISSUE_INSTANT_ATTRIB_NAME = "IssueInstant" 
     347 
     348    # ID attribute name. 
     349    ID_ATTRIB_NAME = "ID" 
     350 
     351    def __init__(self, **xmlSecDocKw): 
     352        """@type **xmlSecDocKw: dict 
    112353        @param **xmlSecDocKw: see XMLSec.XMLSec class for an explanation. 
    113354        Keywords include, filePath for the cert. for reading/writing and 
     
    115356 
    116357        # Base class initialisation 
    117         dict.__init__(self) 
     358        XMLObject.__init__(self) 
    118359        XMLSecDoc.__init__(self, **xmlSecDocKw) 
    119  
    120         #: Data dictionary version of xml 
    121         #: 
    122         #: Nb. RoleSet is an empty list - it will be filled role dictionary 
    123         #: items [{'role': {'name': '<Name>'}}, ... ] 
    124         self.__dat = { 
    125              
    126             "version":            AttributeAssertion.version, 
    127             "holder":             '', 
    128             "issuer":             '', 
    129             "issuerName":         '', 
    130             "issuerSerialNumber": 0, 
    131             "userId":             '', 
    132             "validity":           {"notBefore": '', "notAfter": ''}, 
    133             "attributes":         {"roleSet": []}, 
    134             "provenance":         '' 
    135         } 
    136  
    137         #: Holder X500DN object - instantiated in read method 
    138         self.__issuerDN = None 
    139         #: issuer X500DN object - instantiated in read method 
    140         self.__holderDN = None 
    141  
    142         self.__setProvenance(provenance) 
    143          
    144         #: Certificate life time interval in seconds 
    145         self.__lifetime = lifetime 
    146          
    147         #: Certificate not before time as datetime type 
    148         self.__dtNotBefore = None 
    149          
    150         #: Certificate not after time as a datetime type 
    151         self.__dtNotAfter = None 
    152  
    153         self._createXML() 
    154          
    155  
    156     #_________________________________________________________________________     
    157     def __repr__(self): 
    158         """Override default behaviour to return internal dictionary content""" 
    159         return str(self.__dat) 
    160  
    161  
    162     #_________________________________________________________________________     
    163     def __str__(self): 
    164         """Override XMLSec.XMLSecDoc equivalent""" 
    165         return self.toString() 
    166       
    167                  
    168     #_________________________________________________________________________     
    169     def __delitem__(self, key): 
    170         "Attribute Assertion keys cannot be removed" 
    171          
    172         raise AttributeAssertionError('Keys cannot be deleted from ' + \ 
    173                                       AttributeAssertion.__name__) 
    174  
    175  
    176     #_________________________________________________________________________     
    177     def __getitem__(self, key): 
    178         """Get an item from the __dat, __dat['validity'] or  
    179         __dat['attributes'] dictionaries.  This class behaves as data  
    180         dictionary of Attribute Assertion properties 
    181  
    182         @param key: name of key - key can be specified belonging to validity 
    183         or the attributes sub dictionaries 
    184         @param item: value to set dictionary item to 
    185         """ 
    186          
    187         # Check input key 
    188         if key in self.__dat: 
    189  
    190             # key recognised 
    191             item = self.__dat[key]                 
    192  
    193         elif key in self.__dat['validity']: 
    194  
    195             # Allow indexing via validity keys - a shorthand way of  
    196             # referencing for convenience 
    197             item = self.__dat['validity'][key] 
    198  
    199         elif key in self.__dat['attributes']: 
    200  
    201             # Allow indexing via attributes keys - a shorthand way of  
    202             # referencing for convenience 
    203             item = self.__dat['attributes'][key] 
    204  
    205         else: 
    206             # key not recognised as a short or long name version 
    207             raise KeyError('Key "%s" not recognised for %s' % \ 
    208                                (key, AttributeAssertion.__name__)) 
    209  
    210         if isinstance(item, dict): 
    211             return AttributeAssertionReadOnlyDict(item) 
    212         else: 
    213             return item 
    214  
    215  
    216     #_________________________________________________________________________     
    217     def __setitem__(self, key, item):         
    218         """Set an item from the __dat dictionary.  This class behaves as data  
    219         dictionary of Attribute Assertion properties 
    220  
    221         @type key: string 
    222         @param key: name of key - key can be specified belonging to validity 
    223         or the attributes sub dictionaries 
    224          
    225         @type item: string / int 
    226         @param item: value to set dictionary item to 
    227         """ 
    228  
    229         # Check input key 
    230         if key in self.__dat: 
    231  
    232             # key recognised - check if setting provenance 
    233             if key == "provenance": 
    234                 self.__setProvenance(item) 
    235                  
    236             elif key == "version": 
    237                 self.__setVersion(item) 
    238                   
    239             elif key == "holder": 
    240                 self.__setHolder(item) 
    241                  
    242             elif key == "issuer": 
    243                 self.__setIssuer(item) 
    244              
    245             elif key == "issuerName": 
    246                 self.__setIssuerName(item) 
    247              
    248             elif key == "issuerSerialNumber": 
    249                 self.__setIssuerSerialNumber(item) 
    250           
    251             elif key == "userId": 
    252                 self.__setUserId(item) 
    253                     
    254             elif key == "validity": 
    255                 raise KeyError("'%s': use setValidityTime method " % \ 
    256                                key + "to set notBefore/notAfter times") 
    257                              
    258             elif key == "attributes": 
    259                 raise KeyError("'%s': use addRoles method to " % \ 
    260                                key + "set list of role attributes")            
    261             else:     
    262                 raise KeyError("Key '%s' not recognised for %s'" % \ 
    263                                (key, AttributeAssertion.__name__)) 
    264  
    265         elif key in self.__dat['attributes'] or \ 
    266              key in self.__dat['attributes']['roleSet']: 
    267  
    268             # To complex to allow direct setting here 
    269             raise KeyError("'%s': use addRoles method to " % key + \ 
    270                            "set list of roles")            
    271  
    272         elif key in self.__dat['validity']: 
    273             # Prevent setting of notBefore/notAfter - restrict to method 
    274             # setValidityTime 
    275             raise KeyError("'%s': use setValidityTime method " % key + \ 
    276                            "to set notBefore/notAfter times")           
    277         else: 
    278             # key not recognised as a short or long name version 
    279             raise KeyError("Key '%s' not recognised for %s'" % \ 
    280                            (key, AttributeAssertion.__name__)) 
    281          
    282  
    283     #_________________________________________________________________________     
    284     def __eq__(self, attributeAssertion): 
    285         """Return true if all elements are the same"""         
    286         try: 
    287             return min([self.__dat[key] == attributeAssertion[key] \ 
    288                        for key in self.__dat.keys()]) 
    289         except: 
    290             return False 
    291          
    292  
    293     #_________________________________________________________________________     
    294     def __nonzero__(self): 
    295         """Ensure if <attributeAssertionInstance> test yields True""" 
    296         return True 
    297      
    298      
    299     #_________________________________________________________________________     
    300     def clear(self): 
    301         raise AttributeAssertionError("Data cannot be cleared from " + \ 
    302                                       AttributeAssertion.__name__) 
    303  
    304      
    305     #_________________________________________________________________________     
    306     def copy(self): 
    307         return copy.copy(self) 
    308  
    309      
    310     #_________________________________________________________________________     
    311     def keys(self): 
    312         return self.__dat.keys() 
    313  
    314     #_________________________________________________________________________     
    315     def items(self): 
    316         return self.__dat.items() 
    317  
    318     #_________________________________________________________________________     
    319     def values(self): 
    320         return self.__dat.values() 
    321  
    322     #_________________________________________________________________________     
    323     def has_key(self, key): 
    324         return self.__dat.has_key(key) 
    325  
    326     # 'in' operator 
    327     #_________________________________________________________________________     
    328     def __contains__(self, key): 
    329         return key in self.__dat 
    330  
    331  
    332     # 
    333     # Get/Set methods 
    334     # 
    335     # Nb. it's also possible to access the data dictionary parameters via 
    336     # __setitem__ and __getitem__ standard dictionary methods 
    337     # 
    338     #_________________________________________________________________________     
    339     def __setVersion(self, version): 
    340         """Set the version number to be written to file."""         
    341         self.__dat['version'] = version 
    342      
    343     #_________________________________________________________________________     
    344     def __getVersion(self): 
    345         """Get version number as set in file.""" 
    346         return self.__dat['version'] 
    347  
    348     version = property(fget=__getVersion, 
    349                        fset=__setVersion,  
    350                        doc="Attribute Assertion version") 
    351      
    352     #_________________________________________________________________________     
    353     def __setHolder(self, holder): 
    354         """Set holder's Distinguished Name string.""" 
    355         if not isinstance(holder, basestring): 
    356             raise AttributeError("holder DN must be a string") 
    357  
    358         self.__dat['holder'] = holder 
    359      
    360     #_________________________________________________________________________     
    361     def __getHolder(self): 
    362         """Get holder's Distinguished Name string.""" 
    363         return self.__dat['holder'] 
    364  
    365     holder = property(fget=__getHolder, 
    366                       fset=__setHolder,  
    367                       doc="Attribute Assertion holder DN") 
    368  
    369     #_________________________________________________________________________     
    370     def __getHolderDN(self): 
    371          """Get the holder's Distinguished Name as an X500DN instance""" 
    372          return self.__holderDN 
    373       
    374     holderDN = property(fget=__getHolderDN, 
    375                         doc="Attribute Assertion holder DN as X500DN type") 
    376      
    377     #_________________________________________________________________________     
    378     def __setIssuer(self, issuer): 
    379         """Set issuer's Distinguished Name.""" 
     360         
     361        self._version = None 
     362        self._issueInstant = None 
     363        self._id = None 
     364        self._issuer = None 
     365        self._subject = None 
     366        self._conditions = [] 
     367        self._advice = None 
     368        self._statements = [] 
     369        self._authnStatements = [] 
     370        self._authzDecisionStatements = [] 
     371        self._attributeStatements = [] 
     372         
     373    def _get_version(self): 
     374        '''@return the SAML Version of this assertion. 
     375        ''' 
     376        return self._version 
     377     
     378    def _set_version(self, version): 
     379        '''@param version the SAML Version of this assertion 
     380        ''' 
     381        if not isinstance(version, SAMLVersion): 
     382            raise TypeError("Expecting SAMLVersion type got: %r" % version) 
     383         
     384        self._version = version 
     385         
     386    version = property(fget=_get_version, 
     387                       fset=_set_version, 
     388                       doc="SAML Version of the assertion") 
     389 
     390    def _get_issuerInstant(self): 
     391        '''Gets the issue instance of this assertion. 
     392         
     393        @return the issue instance of this assertion''' 
     394        return self._issueInstant 
     395     
     396    def _set_issuerInstant(self, issueInstant): 
     397        '''Sets the issue instance of this assertion. 
     398         
     399        @param newIssueInstance the issue instance of this assertion 
     400        ''' 
     401        self._issueInstant = issueInstant 
     402         
     403    issuerInstant = property(fget=_get_issuerInstant,  
     404                             fset=_set_issuerInstant, 
     405                             doc="Issuer isntant of assertion") 
     406 
     407    def _get_id(self): 
     408        '''Sets the ID of this assertion. 
     409         
     410        @return the ID of this assertion 
     411        ''' 
     412        return self._id 
     413     
     414    def _set_id(self, _id): 
     415        '''Sets the ID of this assertion. 
     416         
     417        @param newID the ID of this assertion 
     418        ''' 
     419        self._id = _id 
     420         
     421    id = property(fget=_get_id, fset=_set_id, doc="ID of assertion") 
     422 
     423     
     424    def _set_issuer(self, issuer): 
     425        """Set issuer""" 
    380426        if not isinstance(issuer, basestring): 
    381             raise AttributeError("issuer DN must be a string") 
    382          
    383         self.__dat['issuer'] = issuer 
    384      
    385     #_________________________________________________________________________     
    386     def __getIssuer(self): 
    387         """Get the issuer's Distinguished Name string""" 
    388         return self.__dat['issuer'] 
    389  
    390     issuer = property(fget=__getIssuer,  
    391                       fset=__setIssuer, 
    392                       doc="Certificate Issuer DN") 
    393  
    394     #_________________________________________________________________________     
    395     def __getIssuerDN(self): 
    396          """Get the issuer's Distinguished Name as an X500DN instance""" 
    397          return self.__issuerDN 
    398       
    399     issuerDN = property(fget=__getIssuerDN, 
    400                         doc="Attribute Assertion issuer DN as X500DN type") 
    401          
    402     #_________________________________________________________________________     
    403     def __setIssuerName(self, issuerName): 
    404         """Set the name of the issuer""" 
    405         if not isinstance(issuerName, basestring): 
    406             raise AttributeError("issuerName must be a string") 
    407          
    408         self._rootElem.set('Issuer', issuerName) 
    409      
    410     #_________________________________________________________________________     
    411     def __getIssuerName(self): 
    412         """@rtype: string 
    413         @return: the name of the issuer""" 
    414         return self._rootElem.get('Issuer') 
    415  
    416     issuerName = property(fget=__getIssuerName,  
    417                           fset=__setIssuerName, 
    418                           doc="Certificate Issuer name") 
    419     
    420     #_________________________________________________________________________     
    421     def __setIssuerSerialNumber(self, serialNumber): 
    422         """@param serialNumber: the issuer serial number""" 
    423         if not isinstance(serialNumber, int): 
    424             raise AttributeError("issuerSerialNumber must be an integer") 
    425  
    426         self.__dat['issuerSerialNumber'] = serialNumber 
    427      
    428     #_________________________________________________________________________     
    429     def __getIssuerSerialNumber(self): 
    430         """@rtype: string 
    431         @return: the issuer serial number""" 
    432         return self.__dat['issuerSerialNumber'] 
    433      
    434     issuerSerialNumber = property(fget=__getIssuerSerialNumber,  
    435                                   fset=__setIssuerSerialNumber, 
    436                                   doc="Certificate Issuer Serial Number") 
    437   
    438          
    439     #_________________________________________________________________________     
    440     def __setUserId(self, userId): 
    441         """Set the name of the userId 
    442         @type userId: string 
    443         @param userId: user identifier""" 
    444         if not isinstance(userId, basestring): 
    445             raise AttributeError("userId must be a string") 
    446          
    447         self.__dat['userId'] = userId 
    448      
    449     #_________________________________________________________________________     
    450     def __getUserId(self): 
    451         """@rtype: string 
    452         @return: the user idenitifier""" 
    453         return self.__dat['userId'] 
    454  
    455     userId = property(fget=__getUserId,  
    456                       fset=__setUserId, 
    457                       doc="Certificate user identifier") 
    458      
    459  
    460     # Nb. no setValidityNotBefore/setValidityNotAfter methods - use 
    461     # setValidityTime instead. 
    462      
    463     #_________________________________________________________________________     
    464     def getValidityNotBefore(self, asDatetime=False): 
    465         """Get the validity Not Before date/time string 
    466  
    467         @param asDatetime: boolean to True to return as a datetime type 
    468         Nb. time may not have been set - if so it will be set to None 
    469          
    470         @rtype: string/datetime 
    471         @return: the not before time""" 
    472         if asDatetime is True: 
    473             return self.__dtNotBefore 
    474         else: 
    475             return self.__dat['validity']['notBefore'] 
    476  
    477     validityNotBefore = property(fget=getValidityNotBefore,  
    478                                 doc="Validity not before time as a string") 
    479  
    480  
    481     #_________________________________________________________________________     
    482     def getValidityNotAfter(self, asDatetime=False): 
    483         """Get the validity Not After date/time string 
    484  
    485         @param asDatetime: boolean set to True to return as a datetime type 
    486         Nb. time may not have been set - if so it will be set to None 
    487          
    488         @rtype: string/datetime 
    489         @return: the not after time""" 
    490         if asDatetime is True: 
    491             return self.__dtNotAfter 
    492         else: 
    493             return self.__dat['validity']['notAfter'] 
    494  
    495     validityNotAfter = property(fget=getValidityNotAfter,  
    496                                 doc="Validity not after time as a string") 
    497  
    498      
    499     #_________________________________________________________________________     
    500     def __getRoleSet(self): 
    501         """@rtype: list of dict type 
    502         @return: the roleSet as a list of role dictionaries.""" 
    503         return self.__dat['attributes']['roleSet'] 
    504  
    505     roleSet = property(fget=__getRoleSet, doc="Role set dictionary") 
    506  
    507     #_________________________________________________________________________     
    508     def __getRoles(self): 
    509         """Return roles as a list 
    510          
    511         @rtype: list 
    512         @return: list of roles contained in the certificate""" 
    513          
    514         try: 
    515             return [i.values()[0].values()[0] \ 
    516                     for i in self.__dat['attributes']['roleSet']] 
    517         except: 
    518             return [] 
    519          
    520     roles = property(fget=__getRoles,  
    521                      doc="List of roles in Attribute Assertion") 
    522  
    523          
    524     #_________________________________________________________________________     
    525     def __setProvenance(self, provenance): 
    526         """Set the provenance for the certificate: 'original' or 'mapped'. 
    527          
    528         @param provenance: string provenance setting""" 
    529  
    530         if not self.isValidProvenance(provenance): 
    531             raise AttributeAssertionError('Provenance must be set to "' + \ 
    532                 '" or '.join(AttributeAssertion.__validProvenanceSettings)+'"') 
    533          
    534         self.__dat['provenance'] = provenance 
    535  
    536      
    537     #_________________________________________________________________________     
    538     def __getProvenance(self): 
    539         """Get the provenance for the certificate. 
    540          
    541         @rtype: string 
    542         @return: provenance of certificate mapped or original""" 
    543         return self.__dat['provenance'] 
    544  
    545     provenance = property(fget=__getProvenance, 
    546                           fset=__setProvenance,  
    547                           doc="Provenance of the cert. - original or mapped") 
    548     
    549  
    550     #_________________________________________________________________________     
    551     def isValidProvenance(self, provenance=None): 
    552         """Check provenance is set correctly - to 'original'/'mapped'. 
    553  
    554         If no provenance argument is provided, test against the setting in 
    555         the current instance. 
    556          
    557         @param provenance: by default the current provenance setting is  
    558         checked i.e. self.__dat['provenance'].  Set this keyword to override 
    559         and check against an alternate provenance setting. 
    560          
    561         @rtype: bool 
    562         @return: True if certificate has a valid provenance setting 
    563         """ 
    564          
    565         if not provenance: 
    566             provenance = self.__dat['provenance'] 
    567  
    568         return provenance in AttributeAssertion.__validProvenanceSettings 
    569          
    570  
    571     #_________________________________________________________________________     
    572     def isOriginal(self): 
    573         """Check for original provenance. 
    574         @rtype: bool 
    575         @return: True if certificate has original roles""" 
    576         return self.__dat['provenance'] == AttributeAssertion.origProvenance 
    577  
    578  
    579     #_________________________________________________________________________     
    580     def isMapped(self): 
    581         """Check for mapped provenance. 
    582         @rtype: bool 
    583         @return: True if certificate contain roles mapped from another""" 
    584         return self.__dat['provenance'] == AttributeAssertion.mappedProvenance 
    585  
    586  
    587     #_________________________________________________________________________     
    588     def addRoles(self, roleName): 
    589         """Add new roles to the roleSet in attributes. 
    590          
    591         @param roleName: role name or list of role names to add to certificate 
    592         """ 
    593  
    594         if isinstance(roleName, basestring): 
    595             roleName = [roleName] 
    596              
    597         self.__dat['attributes']['roleSet'].extend(\ 
    598                                 [{'role': {'name': i}} for i in roleName]) 
     427            raise TypeError("issuer must be a string") 
     428         
     429        self._issuer = issuer 
     430     
     431    def _get_issuer(self): 
     432        """Get the issuer name """ 
     433        return self._issuer 
     434 
     435    issuer = property(fget=_get_issuer,  
     436                      fset=_set_issuer, 
     437                      doc="Issuer of assertion") 
     438     
     439 
     440    def _set_subject(self, subject): 
     441        """Set subject string.""" 
     442        if not isinstance(subject, basestring): 
     443            raise TypeError("subject must be a string") 
     444 
     445        self._subject = subject 
     446     
     447    def _get_subject(self): 
     448        """Get subject string.""" 
     449        return self._subject 
     450 
     451    subject = property(fget=_get_subject, 
     452                       fset=_set_subject,  
     453                       doc="Attribute Assertion subject") 
     454     
     455    def _set_conditions(self, conditions): 
     456        """Set assertion conditions.""" 
     457        if not isinstance(conditions, (list, tuple)): 
     458            raise TypeError("conditions must be a string") 
     459 
     460        self._conditions = list(conditions) 
     461     
     462    def _get_conditions(self): 
     463        """Get conditions string.""" 
     464        return self._conditions 
     465 
     466    conditions = property(fget=_get_conditions, 
     467                          fset=_set_conditions,  
     468                          doc="Attribute Assertion conditions") 
     469     
     470    def _set_advice(self, advice): 
     471        """Set advice string.""" 
     472        if not isinstance(advice, basestring): 
     473            raise TypeError("advice must be a string") 
     474 
     475        self._advice = advice 
     476     
     477    def _get_advice(self): 
     478        """Get advice string.""" 
     479        return self._advice 
     480 
     481    advice = property(fget=_get_advice, 
     482                      fset=_set_advice,  
     483                      doc="Attribute Assertion advice") 
     484     
     485    def _set_statements(self, statements): 
     486        """Set statements list.""" 
     487        if not isinstance(statements, (list, tuple)): 
     488            raise TypeError("statements must be a list/tuple.") 
     489 
     490        self._statements = list(statements) 
     491     
     492    def _get_statements(self): 
     493        """Get statements string.""" 
     494        return self._statements 
     495 
     496    statements = property(fget=_get_statements, 
     497                          fset=_set_statements,  
     498                          doc="Attribute Assertion statements") 
     499 
     500    def _set_authnStatements(self, authnStatements): 
     501        """Set authentication statements string.""" 
     502        if not isinstance(authnStatements, (list, tuple)): 
     503            raise TypeError("authnStatements must be a list/tuple") 
     504 
     505        self._authnStatements = list(authnStatements) 
     506     
     507    def _get_authnStatements(self): 
     508        """Get authnStatements string.""" 
     509        return self._authnStatements 
     510 
     511    authnStatements = property(fget=_get_authnStatements, 
     512                               fset=_set_authnStatements,  
     513                               doc="Attribute Assertion authentication " 
     514                                   "statements") 
     515     
     516    def _set_authzDecisionStatements(self, authzDecisionStatements): 
     517        """Set authorisation decision statements.""" 
     518        if not isinstance(authzDecisionStatements, (list, tuple)): 
     519            raise TypeError("authorisation decision statements must be a " 
     520                            "list/tuple") 
     521 
     522        self._authzDecisionStatements = list(authzDecisionStatements) 
     523     
     524    def _get_authzDecisionStatements(self): 
     525        """Get authorisation decision statements.""" 
     526        return self._authzDecisionStatements 
     527 
     528    authzDecisionStatements = property(fget=_get_authzDecisionStatements, 
     529                                       fset=_set_authzDecisionStatements,  
     530                                       doc="Attribute Assertion authorisation " 
     531                                           "decision statements") 
     532     
     533 
     534    def _set_attributeStatements(self, attributeStatements): 
     535        """Set attribute statements for the asssertion.""" 
     536        if not isinstance(attributeStatements, (list, tuple)): 
     537            raise TypeError("attributeStatements must be a list/tuple") 
     538 
     539        self._attributeStatements = list(attributeStatements) 
     540     
     541    def _get_attributeStatements(self): 
     542        """Get attributeStatements string.""" 
     543        return self._attributeStatements 
     544 
     545    attributeStatements = property(fget=_get_attributeStatements, 
     546                               fset=_set_attributeStatements,  
     547                               doc="Attribute Assertion attribute statements") 
    599548 
    600549 
     
    622571 
    623572        except Exception, e: 
    624             raise AttributeAssertionError("Attribute Assertion: %s" % e) 
     573            raise AssertionError("Attribute Assertion: %s" % e) 
    625574 
    626575        if rtnRootElem: 
    627576            return rootElem 
    628577 
    629          
    630     #_________________________________________________________________________     
    631578    def __parse(self, rootElem): 
    632579        """Private XML parsing method accepts a ElementTree.Element type 
     
    640587         
    641588        if not acInfoElem: 
    642             raise AttributeAssertionError("<acInfo> tag not found in \"%s\"" % \ 
     589            raise AssertionError("<acInfo> tag not found in \"%s\"" % \ 
    643590                               self.filePath) 
    644591 
     
    647594        for elem in acInfoElem: 
    648595            if elem.tag not in self.__dat: 
    649                 raise AttributeAssertionError('%s: "<%s>" not recognised.' % \ 
     596                raise AssertionError('%s: "<%s>" not recognised.' % \ 
    650597                                    (self.filePath, elem.tag)) 
    651598 
     
    660607 
    661608        except X500DNError, x500dnErr: 
    662             raise AttributeAssertionError("Issuer DN: %s" % x500dnErr) 
     609            raise AssertionError("Issuer DN: %s" % x500dnErr) 
    663610 
    664611 
     
    667614 
    668615        except X500DNError, x500dnErr: 
    669             raise AttributeAssertionError("Holder DN: %s" % x500dnErr) 
     616            raise AssertionError("Holder DN: %s" % x500dnErr) 
    670617         
    671618                                  
     
    675622         
    676623        if self.__dat['validity']['notBefore'] is None: 
    677             raise AttributeAssertionError('<notBefore> tag not found in "%s"'%\ 
     624            raise AssertionError('<notBefore> tag not found in "%s"'%\ 
    678625                                                               self.filePath) 
    679626        elif self.__dat['validity']['notBefore'] == '': 
     
    692639         
    693640        if self.__dat['validity']['notAfter'] is None: 
    694             raise AttributeAssertionError('<notAfter> tag not found in "%s"' % \ 
     641            raise AssertionError('<notAfter> tag not found in "%s"' % \ 
    695642                               self.filePath) 
    696643        elif self.__dat['validity']['notBefore'] == '': 
     
    707654        roleElem = acInfoElem.findall("attributes/roleSet/role/name") 
    708655        if roleElem is None: 
    709             raise AttributeAssertionError("<role> tag not found in \"%s\"" % \ 
     656            raise AssertionError("<role> tag not found in \"%s\"" % \ 
    710657                               self.filePath) 
    711658         
     
    715662         
    716663        if not self.isValidVersion():            
    717             raise AttributeAssertionError('Attribute Assertion version is ' + \ 
     664            raise AssertionError('Attribute Assertion version is ' + \ 
    718665                               self.__dat['version'] + ' but version ' + \ 
    719                                AttributeAssertion.version + ' expected') 
     666                               Assertion.version + ' expected') 
    720667 
    721668 
     
    732679 
    733680        # Nb. 
    734         # * this method is used by AttributeAssertion.read() 
     681        # * this method is used by Assertion.read() 
    735682        # * Signing by Attribute Authority is separate - see  
    736         # AttributeAssertion.sign() 
     683        # Assertion.sign() 
    737684         
    738685 
    739686        # Check for valid provenance 
    740687        if not self.isValidProvenance(): 
    741             raise AttributeAssertionError("Provenance must be set to \"" + \ 
    742                 "\" or \"".join(AttributeAssertion.__validProvenanceSettings)+\ 
     688            raise AssertionError("Provenance must be set to \"" + \ 
     689                "\" or \"".join(Assertion.__validProvenanceSettings)+\ 
    743690                "\"") 
    744691 
    745692         
    746693        self._rootElem = ElementTree.Element("{%s}Assertion" %  
    747                                              AttributeAssertion.ns) 
     694                                             Assertion.ns) 
    748695        self._rootETree = ElementTree.ElementTree(element=self._rootElem) 
    749696         
    750         self._rootElem.set('xmlns:%s' % AttributeAssertion.nsPfx,  
    751                            AttributeAssertion.ns) 
     697        self._rootElem.set('xmlns:%s' % Assertion.nsPfx,  
     698                           Assertion.ns) 
    752699        self._rootElem.set('MajorVersion', '1') 
    753700        self._rootElem.set('MinorVersion', '1') 
     
    756703        conditionsElem = ElementTree.SubElement(self._rootElem, 
    757704                                                '{%s}Conditions' % \ 
    758                                                 AttributeAssertion.ns)     
     705                                                Assertion.ns)     
    759706        conditionsElem.set('NotBefore', 'x') 
    760707        conditionsElem.set('NotAfter', 'y') 
     
    762709        attributeStatementElem = ElementTree.SubElement(self._rootElem, 
    763710                                                '{%s}AttributeStatement' % \ 
    764                                                 AttributeAssertion.ns) 
     711                                                Assertion.ns) 
    765712         
    766713        subjectElem = ElementTree.SubElement(attributeStatementElem, 
    767714                                             '{%s}Subject' % \ 
    768                                              AttributeAssertion.ns) 
     715                                             Assertion.ns) 
    769716         
    770717        attributeElem = ElementTree.SubElement(attributeStatementElem, 
    771718                                               '{%s}Attribute' % \ 
    772                                                AttributeAssertion.ns) 
     719                                               Assertion.ns) 
    773720     
    774721        attributeElem.set('AttributeName', 
     
    780727           attributeValElem = ElementTree.SubElement(attributeElem, 
    781728                                                     '{%s}AttributeValue' % \ 
    782                                                      AttributeAssertion.ns) 
     729                                                     Assertion.ns) 
    783730           attributeValElem.text = val 
    784731 
     
    792739        '''        
    793740        self.parse(self._createXML()) 
    794         super(AttributeAssertion, self).applyEnvelopedSignature(**xmlSecDocKw) 
     741        super(Assertion, self).applyEnvelopedSignature(**xmlSecDocKw) 
    795742 
    796743        
     
    827774        if dtNotBefore is not None: 
    828775            if not isinstance(dtNotBefore, datetime): 
    829                 raise AttributeAssertionError(\ 
     776                raise AssertionError(\ 
    830777                                "Input not before time must be datetime type") 
    831778             
     
    842789        if dtNotAfter is not None: 
    843790            if not isinstance(dtNotAfter, datetime): 
    844                 raise AttributeAssertionError(\ 
     791                raise AssertionError(\ 
    845792                                "Input not after time must be datetime type") 
    846793 
     
    848795            dtDeltaLifeTime = dtNotAfter - self.__dtNotBefore 
    849796            if dtDeltaLifeTime < timedelta(0): 
    850                 raise AttributeAssertionError("Input Not After time is invalid %s" % \ 
     797                raise AssertionError("Input Not After time is invalid %s" % \ 
    851798                                   str(dtNotAfter)) 
    852799 
     
    866813                dtDeltaLifeTime = timedelta(seconds=self.__lifetime) 
    867814            except Exception, e: 
    868                 raise AttributeAssertionError("Invalid Certificate lifetime set %.3f" %\ 
     815                raise AssertionError("Invalid Certificate lifetime set %.3f" %\ 
    869816                                   self.__lifetime) 
    870817             
     
    887834         
    888835        @rtype: string 
    889         @return: datetime converted into correct string format for AttributeAssertion""" 
     836        @return: datetime converted into correct string format for Assertion""" 
    890837 
    891838        if not isinstance(dtVal, datetime): 
    892             raise AttributeAssertionError("Invalid datetime object for " 
     839            raise AssertionError("Invalid datetime object for " 
    893840                                          "conversion to string") 
    894841         
     
    910857        """Convert a notBefore/notAfter time string to a datetime object 
    911858         
    912         @param sTime: time in string format as used by AttributeAssertion 
     859        @param sTime: time in string format as used by Assertion 
    913860        @rtype: datetime 
    914861        @return: datetime type equivalent of string input""" 
     
    919866         
    920867        except Exception, e: 
    921             raise AttributeAssertionError(\ 
     868            raise AssertionError(\ 
    922869                "Error converting time string into datetime object: %s" % e) 
    923870         
     
    943890 
    944891        if not isinstance(self.__dtNotBefore, datetime): 
    945             raise AttributeAssertionError("Not Before datetime is not set") 
     892            raise AssertionError("Not Before datetime is not set") 
    946893 
    947894        if not isinstance(self.__dtNotAfter, datetime): 
    948             raise AttributeAssertionError("Not After datetime is not set") 
     895            raise AssertionError("Not After datetime is not set") 
    949896        
    950897        if dtNow is None: 
     
    959906        if raiseExcep: 
    960907            if dtNow < self.__dtNotBefore: 
    961                 raise AttributeAssertionError("Current time %s " % \ 
     908                raise AssertionError("Current time %s " % \ 
    962909                           dtNow.strftime("%d/%m/%Y %H:%M:%S") + \ 
    963910                           "is before Attribute Assertion's " + \ 
     
    966913             
    967914            if dtNow > self.__dtNotAfter: 
    968                 raise AttributeAssertionError("Current time %s " % \ 
     915                raise AssertionError("Current time %s " % \ 
    969916                           dtNow.strftime("%d/%m/%Y %H:%M:%S") + \ 
    970917                           "is after Attribute Assertion's " + \ 
     
    985932        False otherwise. 
    986933        """ 
    987         return self.__dat['version'] == AttributeAssertion.version 
     934        return self.__dat['version'] == Assertion.version 
    988935 
    989936 
     
    1014961        @param chkSig: set to True to check digital signature - for 
    1015962        this certFilePathList must contain the root certificate of the X.509  
    1016         certificate used to sign the AttributeAssertion.  Alternatively, certFilePathList 
     963        certificate used to sign the Assertion.  Alternatively, certFilePathList 
    1017964        can be set via __init__ (default chkSig value is True) 
    1018965                                 
     
    1035982        if chkVersion and not self.isValidVersion(): 
    1036983            if raiseExcep: 
    1037                 raise AttributeAssertionError('Attribute Assertion version is ' + \ 
     984                raise AssertionError('Attribute Assertion version is ' + \ 
    1038985                                   self.__dat['version'] + ' but version ' + \ 
    1039                                    AttributeAssertion.version + ' expected') 
     986                                   Assertion.version + ' expected') 
    1040987            return False 
    1041988 
    1042989        if chkProvenance and not self.isValidProvenance(): 
    1043990            if raiseExcep: 
    1044                 raise AttributeAssertionError(\ 
     991                raise AssertionError(\ 
    1045992                    "Attribute Assertion Provenance must be set to \"" + \ 
    1046                     "\" or \"".join(AttributeAssertion.__validProvenanceSettings) + "\"") 
     993                    "\" or \"".join(Assertion.__validProvenanceSettings) + "\"") 
    1047994            return False 
    1048995 
     
    10551002            except InvalidSignature, e: 
    10561003                 if raiseExcep: 
    1057                      raise AttributeAssertionError(e) 
     1004                     raise AssertionError(e) 
    10581005                 else: 
    10591006                     return False 
     
    10641011 
    10651012#_____________________________________________________________________________ 
    1066 # Alternative AttributeAssertion constructors 
    1067 def AttributeAssertionRead(filePath): 
     1013# Alternative Assertion constructors 
     1014def AssertionRead(filePath): 
    10681015    """Read an attribute assertion from a file""" 
    10691016     
    1070     attributeAssertion = AttributeAssertion(filePath=filePath) 
     1017    attributeAssertion = Assertion(filePath=filePath) 
    10711018    attributeAssertion.read() 
    10721019     
     
    10741021 
    10751022#_________________________________________________________________________     
    1076 def AttributeAssertionParse(attributeAssertionTxt): 
     1023def AssertionParse(attributeAssertionTxt): 
    10771024    """Parse an attribute assertion from a string""" 
    10781025     
    1079     attributeAssertion = AttributeAssertion() 
     1026    attributeAssertion = Assertion() 
    10801027    attributeAssertion.parse(attributeAssertionTxt) 
    10811028     
     
    10851032    ns = "urn:oasis:names:tc:SAML:1.0:assertion" 
    10861033    nsPfx = "saml" 
    1087     issuer = 'http://badc.nerc.ac.uk' 
     1034    issuer = 'http:#badc.nerc.ac.uk' 
    10881035    attributeName="urn:mace:dir:attribute-def:eduPersonAffiliation" 
    10891036    attributeNS="urn:mace:shibboleth:1.0:attributeNamespace:uri" 
     
    11211068 
    11221069    return tostring(assertionElem) 
    1123      
     1070 
     1071class Attribute(SAMLObject): 
     1072    '''SAML 2.0 Core Attribute.''' 
     1073     
     1074    # Local name of the Attribute element.  
     1075    DEFAULT_ELEMENT_LOCAL_NAME = "Attribute" 
     1076 
     1077    # Default element name.  
     1078    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS,  
     1079                                 DEFAULT_ELEMENT_LOCAL_NAME, 
     1080                                 SAMLConstants.SAML20_PREFIX) 
     1081 
     1082    # Local name of the XSI type.  
     1083    TYPE_LOCAL_NAME = "AttributeType" 
     1084 
     1085    # QName of the XSI type.  
     1086    TYPE_NAME = QName(SAMLConstants.SAML20_NS,  
     1087                      TYPE_LOCAL_NAME, 
     1088                      SAMLConstants.SAML20_PREFIX) 
     1089 
     1090    # Name of the Name attribute.  
     1091    NAME_ATTTRIB_NAME = "Name" 
     1092 
     1093    # Name for the NameFormat attribute.  
     1094    NAME_FORMAT_ATTRIB_NAME = "NameFormat" 
     1095 
     1096    # Name of the FriendlyName attribute.  
     1097    FRIENDLY_NAME_ATTRIB_NAME = "FriendlyName" 
     1098 
     1099    # Unspecified attribute format ID.  
     1100    UNSPECIFIED = "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified" 
     1101 
     1102    # URI reference attribute format ID.  
     1103    URI_REFERENCE = "urn:oasis:names:tc:SAML:2.0:attrname-format:uri" 
     1104 
     1105    # Basic attribute format ID.  
     1106    BASIC = "urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
     1107 
     1108    def __init__(self): 
     1109        self._name = None 
     1110        self._nameFormat = None 
     1111        self._friendlyName = None 
     1112        self._attributeValues = [] 
     1113 
     1114    def _get_name(self): 
     1115        return self._name 
     1116     
     1117    def _set_name(self, name): 
     1118        if not isinstance(name, basestring): 
     1119            raise TypeError("Expecting basestring type for name, got %r"% name) 
     1120         
     1121        self._name = name 
     1122         
     1123    name = property(fget=_get_name, 
     1124                    fset=_set_name, 
     1125                    doc="name of this attribute") 
     1126     
     1127    def _get_nameFormat(self): 
     1128        return self._nameFormat 
     1129     
     1130    def _set_nameFormat(self, nameFormat): 
     1131        if not isinstance(nameFormat, basestring): 
     1132            raise TypeError("Expecting basestring type for nameFormat, got %r" 
     1133                            % nameFormat) 
     1134             
     1135        self._nameFormat = nameFormat 
     1136         
     1137    nameFormat = property(fget=_get_nameFormat, 
     1138                          fset=_set_nameFormat, 
     1139                          doc="Get the name format of this attribute.") 
     1140     
     1141    def _get_friendlyName(self): 
     1142        return self._friendlyName 
     1143     
     1144    def _set_friendlyName(self, friendlyName): 
     1145        if not isinstance(friendlyName, basestring): 
     1146            raise TypeError("Expecting basestring type for friendlyName, got " 
     1147                            "%r" % friendlyName) 
     1148             
     1149        self._friendlyName = friendlyName 
     1150         
     1151    friendlyName = property(fget=_get_friendlyName, 
     1152                            fset=_set_friendlyName, 
     1153                            doc="the friendly name of this attribute.") 
     1154     
     1155    def _get_attributeValues(self): 
     1156        return self._attributeValues 
     1157     
     1158    def _set_attributeValues(self, attributeValues): 
     1159        if not isinstance(attributeValues, (list, tuple)): 
     1160            raise TypeError("Expecting basestring type for attributeValues, " 
     1161                            "got %r" % attributeValues) 
     1162             
     1163        self._attributeValues = attributeValues 
     1164         
     1165    attributeValues = property(fget=_get_attributeValues, 
     1166                               fset=_set_attributeValues, 
     1167                               doc="the list of attribute values for this " 
     1168                               "attribute.") 
     1169 
     1170class AttributeValue(SAMLObject): 
     1171 
     1172    # Element name, no namespace 
     1173    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeValue" 
     1174 
     1175    # Default element name 
     1176    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS,  
     1177                                 DEFAULT_ELEMENT_LOCAL_NAME, 
     1178                                 SAMLConstants.SAML20_PREFIX) 
     1179     
     1180class Statement(object): 
     1181    pass 
     1182 
     1183class AttributeStatement(Statement): 
     1184    '''SAML 2.0 Core AttributeStatement''' 
     1185 
     1186    def __init__(self): 
     1187        self._attributes = [] 
     1188        self._encryptedAttributes = [] 
     1189 
     1190    # Element local name 
     1191    DEFAULT_ELEMENT_LOCAL_NAME = "AttributeStatement" 
     1192     
     1193    # Default element name. 
     1194    DEFAULT_ELEMENT_NAME = QName(SAMLConstants.SAML20_NS,  
     1195                                 DEFAULT_ELEMENT_LOCAL_NAME,  
     1196                                 SAMLConstants.SAML20_PREFIX) 
     1197     
     1198    # Local name of the XSI type.  
     1199    TYPE_LOCAL_NAME = "AttributeStatementType"  
     1200         
     1201    # QName of the XSI type. 
     1202    TYPE_NAME = QName(SAMLConstants.SAML20_NS,  
     1203                      TYPE_LOCAL_NAME,  
     1204                      SAMLConstants.SAML20_PREFIX) 
     1205 
     1206    def _get_attributes(self): 
     1207        '''@return the attributes expressed in this statement 
     1208        ''' 
     1209        return self._attributes 
     1210 
     1211    attributes = property(fget=_get_attributes) 
     1212     
     1213    def _get_encryptedAttributes(self): 
     1214       '''@return the encrypted attribtues expressed in this statement 
     1215       ''' 
     1216       return self._encryptedAttributes 
     1217    
     1218    encryptedAttributes = property(fget=_get_encryptedAttributes) 
     1219     
     1220 
     1221class XSGroupRole(object):  
     1222     '''ESG Specific Group/Role attribute.  ESG attribute permissions are 
     1223     organised into group/role pairs 
     1224     ''' 
     1225     TYPE_LOCAL_NAME = "groupRole" 
     1226      
     1227     def __init__(self, namespaceURI, elementLocalName, namespacePrefix): 
     1228         '''@param namespaceURI the namespace the element is in 
     1229         @param elementLocalName the local name of the XML element this Object  
     1230         represents 
     1231         @param namespacePrefix the prefix for the given namespace''' 
     1232         self.namespaceURI = namespaceURI 
     1233         self.elementLocalName = elementLocalName 
     1234         self.namespacePrefix = namespacePrefix 
     1235         self.__group = None 
     1236         self.__role = None         
     1237           
     1238     def _getGroup(self): 
     1239         return self.__group 
     1240      
     1241     def _setGroup(self, group):  
     1242         self.__group = group 
     1243      
     1244     group = property(fget=_getGroup, fset=_setGroup) 
     1245      
     1246     def _getRole(self): 
     1247         return self.__role 
     1248      
     1249     def _setRole(self, role): 
     1250         self.__role = role 
     1251      
     1252     role = property(fget=_getRole, fset=_setRole) 
     1253 
     1254     def getOrderedChildren(self): 
     1255         # no children 
     1256         return None 
     1257      
    11241258from StringIO import StringIO 
    11251259def tostring(elem, **kw): 
     
    11321266if __name__ == "__main__": 
    11331267    import pdb;pdb.set_trace() 
    1134     attrAss = AttributeAssertion() 
     1268    attrAss = Assertion() 
    11351269    attrAss.issuerName = "http://badc.nerc.ac.uk" 
    11361270    print attrAss.issuerName 
Note: See TracChangeset for help on using the changeset viewer.