Changeset 1964


Ignore:
Timestamp:
08/01/07 09:21:13 (13 years ago)
Author:
pjkersha
Message:

python/ndg.security.common/ndg/security/common/XMLSec.py: tidy up imports
python/ndg.security.common/ndg/security/common/AttCert.py: updated for
new version of XMLSecDoc parent class. Added standard doc strings.

Location:
TI12-security/trunk/python/ndg.security.common/ndg/security/common
Files:
2 edited

Legend:

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

    r1642 r1964  
    1 """NDG Attribute Certificate (Authentication -or Access- Token) 
     1"""NDG Attribute Certificate (Authorisation -or Access- Token) 
    22 
    33NERC Data Grid Project 
    44 
    5 P J Kershaw 05/04/05 
    6  
    7 Copyright (C) 2006 CCLRC & NERC 
    8  
    9 This software may be distributed under the terms of the Q Public License, 
    10 version 1.0 or later.""" 
     5@author P J Kershaw 05/04/05 
     6 
     7@copyright (C) 2006 CCLRC & NERC 
     8 
     9@license This software may be distributed under the terms of the Q Public  
     10License, version 1.0 or later.""" 
    1111 
    1212reposID = '$Id$' 
     
    2020 
    2121# Time module for use with validity times 
    22 from time import strftime 
    23 from time import strptime 
    24 from datetime import datetime 
    25 from datetime import timedelta 
     22from time import strftime, strptime 
     23from datetime import datetime, timedelta 
    2624 
    2725# XML signature module based on xmlsec and libxml2 
    28 from XMLSecDoc import * 
     26from XMLSec import XMLSecDoc 
    2927 
    3028from X509 import X500DN 
     
    3230 
    3331 
    34 class AttCertError(Exception): 
    35      
     32class AttCertError(Exception):   
    3633    """Exception handling for NDG Attribute Certificate class.""" 
    37      
    38     def __init__(self, msg): 
    39         self.__msg = msg 
    40           
    41     def __str__(self): 
    42         return self.__msg 
    43      
    44  
     34 
     35         
     36#_____________________________________________________________________________ 
     37class _MetaAttCert(type): 
     38    """Enable AttCert to have read only class variables e.g. 
     39     
     40    print AttCert.mappedProvenance is allowed but, 
     41     
     42    AttCert.mappedProvenance = None 
     43     
     44    ... raises - AttributeError: can't set attribute""" 
     45     
     46    #_________________________________________________________________________     
     47    def __getVersion(cls): 
     48        '''Version of THIS format for the certificate''' 
     49        return '1.0' 
     50 
     51    version = property(fget=__getVersion,  
     52                       doc="Version of the certificate format") 
     53    
     54    #_________________________________________________________________________     
     55    def __getMappedProvenance(cls): 
     56        '''Text for mapped provenance setting of certificate''' 
     57        return 'mapped' 
     58 
     59    mappedProvenance = property(fget=__getMappedProvenance, 
     60        doc="Text constant indicating cert has mapped roles from another") 
     61 
     62    #_________________________________________________________________________     
     63    def __getOriginalProvenance(cls): 
     64        '''Text for original provenance setting of certificate''' 
     65        return 'original' 
     66     
     67    origProvenance = property(fget=__getOriginalProvenance, 
     68        doc="Text constant indicating cert has original and not mapped roles") 
     69     
     70     
     71#_____________________________________________________________________________ 
    4572class AttCert(dict, XMLSecDoc): 
    46  
    47     """NDG Attribute Certificate (Authentication or Access Token).""" 
    48  
    49     # Attribute Certificate file version 
    50     __version = "1.0" 
     73    """NDG Attribute Certificate (Authorisation or Access Token).""" 
     74     
     75    __metaclass__ = _MetaAttCert 
    5176 
    5277    # Provenance of certificate may be original or mapped from another 
    5378    # certificate 
    54     mappedProvenance = 'mapped' 
    55     origProvenance = 'original' 
    5679    __provenance = (origProvenance, mappedProvenance) 
    5780 
    5881 
    59     # Nb. pass XMLSecDoc keyword arguments in xmlSecDocKeys dictionary 
    60     def __init__(self, filePath=None, lifeTime=-1, **xmlSecDocKeys): 
    61  
     82    #_________________________________________________________________________     
     83    def __init__(self, lifeTime=28800, **xmlSecDocKw): 
    6284        """Initialisation - Attribute Certificate file path may be specified. 
    6385        Also, holder and issuer details and signing authority key and 
    64         certificate.""" 
     86        certificate. 
     87         
     88        @param lifeTime: set the lifetime for the certificate in seconds. 
     89        Defaults to 8 hours. 
     90        @param **xmlSecDocKw: see XMLSec.XMLSec class for an explanation. 
     91        Keywords include, filePath for the cert. for reading/writing and 
     92        cert./private key settings for digital signature and verification.""" 
    6593 
    6694        # Base class initialisation 
    6795        dict.__init__(self) 
    68         XMLSecDoc.__init__(self, **xmlSecDocKeys) 
    69  
    70  
    71         if filePath is not None: 
    72             if not isinstance(filePath, basestring): 
    73                 raise AttCertError("Input file path must be a valid string") 
    74              
    75             self.filePath = filePath 
    76  
     96        XMLSecDoc.__init__(self, **xmlSecDocKw) 
    7797 
    7898        # Data dictionary version of xml 
     
    82102        self.__dat = { 
    83103             
    84             "version":            AttCert.__version, 
     104            "version":            AttCert.version, 
    85105            "holder":             '', 
    86106            "issuer":             '', 
     
    97117 
    98118 
    99         # Check for input certificate life time interval - if not set default 
    100         # to one day 
    101         if lifeTime is -1: 
    102             self.__lifeTime = 28800 # 8 hours 
    103         else: 
    104             self.__lifeTime = lifeTime 
     119        # Certificate life time interval in seconds 
     120        self.__lifeTime = lifeTime 
    105121         
    106122        self.__dtNotBefore = None 
    107123        self.__dtNotAfter = None 
    108124 
    109          
     125 
     126    #_________________________________________________________________________     
    110127    def __repr__(self): 
    111128        """Override default behaviour to return internal dictionary content""" 
     
    113130 
    114131                 
     132    #_________________________________________________________________________     
    115133    def __delitem__(self, key): 
    116134        "Attribute Certificate keys cannot be removed" 
    117135         
    118         raise AttCertError('Keys cannot be deleted from ' + \ 
    119                            self.__class__.__name__) 
    120  
    121  
     136        raise AttCertError, 'Keys cannot be deleted from ' + \ 
     137                           self.__class__.__name__ 
     138 
     139 
     140    #_________________________________________________________________________     
    122141    def __getitem__(self, key): 
    123142        self.__class__.__name__ + """ behaves as data dictionary of Attribute 
     
    148167        else: 
    149168            # key not recognised as a short or long name version 
    150             raise AttCertError('Key "%s" not recognised for %s' % \ 
    151                                (key, self.__class__.__name__)) 
    152  
    153  
     169            raise AttCertError, 'Key "%s" not recognised for %s' % \ 
     170                               (key, self.__class__.__name__) 
     171 
     172 
     173    #_________________________________________________________________________     
    154174    def __setitem__(self, key, item):         
    155175        self.__class__.__name__ + """ behaves as data dictionary of Attribute 
     
    165185            # key recognised - check if setting provenance 
    166186            if key is "provenance" and not self.isValidProvenance(item): 
    167                 raise AttCertError("Provenance must be set to \"" + \ 
    168                             "\" or \"".join(AttCert.__provenance) + "\"") 
     187                raise AttCertError, "Provenance must be set to \"" + \ 
     188                            "\" or \"".join(AttCert.__provenance) + "\"" 
    169189             
    170190            self.__dat[key] = item 
     
    177197 
    178198        elif self.__dat['validity'].has_key(key): 
    179                  
    180199            # Prevent setting of notBefore/notAfter - restrict to method 
    181200            # setValidityTime 
    182             raise AttCertError(\ 
    183                 "Use setValidityTime method to set notBefore/notAfter times") 
    184              
     201            raise AttCertError, \ 
     202                "Use setValidityTime method to set notBefore/notAfter times"             
    185203        else: 
    186204            # key not recognised as a short or long name version 
    187             raise AttCertError('Key "%s" not recognised for %s' % \ 
    188                                (key, self.__class__.__name__)) 
    189          
    190  
     205            raise AttCertError, 'Key "%s" not recognised for %s' % \ 
     206                               (key, self.__class__.__name__) 
     207         
     208 
     209    #_________________________________________________________________________     
    191210    def __eq__(self, attCert): 
    192211        """Return true if all elements are the same""" 
     
    199218         
    200219 
     220    #_________________________________________________________________________     
    201221    def __nonzero__(self): 
    202222        """Ensure if <attCertInstance> test yields True""" 
     
    204224     
    205225     
     226    #_________________________________________________________________________     
    206227    def clear(self): 
    207         raise AttCertError("Data cannot be cleared from " + \ 
    208                            self.__class__.__name__) 
    209  
    210      
     228        raise AttCertError, "Data cannot be cleared from " + \ 
     229                           self.__class__.__name__ 
     230 
     231     
     232    #_________________________________________________________________________     
    211233    def copy(self): 
    212234 
     
    215237 
    216238     
     239    #_________________________________________________________________________     
    217240    def keys(self): 
    218241        return self.__dat.keys() 
    219242 
     243    #_________________________________________________________________________     
    220244    def items(self): 
    221245        return self.__dat.items() 
    222246 
     247    #_________________________________________________________________________     
    223248    def values(self): 
    224249        return self.__dat.values() 
    225250 
     251    #_________________________________________________________________________     
    226252    def has_key(self, key): 
    227253        return self.__dat.has_key(key) 
    228254 
    229255    # 'in' operator 
     256    #_________________________________________________________________________     
    230257    def __contains__(self, key): 
    231258        return key in self.__dat 
    232  
    233  
    234     def getExptdVersion(self): 
    235         """Return the Attribute Certificate XML expected version.""" 
    236         return AttCert.__version 
    237259 
    238260 
     
    243265    # __setitem__ and __getitem__ standard dictionary methods 
    244266    # 
     267    #_________________________________________________________________________     
    245268    def setVersion(self, version): 
    246269        """Set the version number to be written to file."""         
    247270        self.__dat['version'] = version 
    248271     
     272    #_________________________________________________________________________     
    249273    def getVersion(self): 
    250274        """Get version number as set in file.""" 
    251275        return self.__dat['version'] 
    252276     
     277    #_________________________________________________________________________     
    253278    def setHolder(self, holder): 
    254279        """Set holder's Distinguished Name string.""" 
    255280        self.__dat['holder'] = holder 
    256281     
     282    #_________________________________________________________________________     
    257283    def getHolder(self): 
    258284        """Get holder's Distinguished Name string.""" 
    259285        return self.__dat['holder'] 
    260286 
     287    #_________________________________________________________________________     
    261288    def getHolderDN(self): 
    262289         """Get the holder's Distinguished Name as an X500DN instance""" 
    263290         return self.__holderDN 
    264291     
     292    #_________________________________________________________________________     
    265293    def setIssuer(self, issuer): 
    266294        """Set issuer's Distinguished Name.""" 
    267295        self.__dat['issuer'] = issuer 
    268296     
     297    #_________________________________________________________________________     
    269298    def getIssuer(self): 
    270299        """Get the issuer's Distinguished Name string""" 
    271300        return self.__dat['issuer'] 
    272301 
     302    #_________________________________________________________________________     
    273303    def getIssuerDN(self): 
    274304         """Get the issuer's Distinguished Name as an X500DN instance""" 
    275305         return self.__issuerDN 
    276306         
     307    #_________________________________________________________________________     
    277308    def setIssuerName(self, issuerName): 
    278309        """Set the name of the issuer""" 
    279310        self.__dat['issuerName'] = issuerName 
    280311     
     312    #_________________________________________________________________________     
    281313    def getIssuerName(self): 
    282         """Get the name of the issuer""" 
     314        """@return the name of the issuer""" 
    283315        return self.__dat['issuerName'] 
    284316     
     317    #_________________________________________________________________________     
    285318    def setIssuerSerialNumber(self, serialNumber): 
    286         """Set the issuer serial number""" 
     319        """@param serialNumber: the issuer serial number""" 
    287320        self.__dat['issuerSerialNumber'] = serialNumber 
    288321     
     322    #_________________________________________________________________________     
    289323    def getIssuerSerialNumber(self): 
    290         """Get the issuer serial number""" 
     324        """@return the issuer serial number""" 
    291325        return self.__dat['issuerSerialNumber'] 
    292326 
     
    295329    # setValidityTime instead. 
    296330     
     331    #_________________________________________________________________________     
    297332    def getValidityNotBefore(self, asDatetime=False): 
    298333        """Get the validity Not Before date/time string 
    299334 
    300         Set asDatetime to True to return as a datetime type 
    301         Nb. time may not have been set - if so it will be set to None""" 
     335        @param asDatetime: boolean to True to return as a datetime type 
     336        Nb. time may not have been set - if so it will be set to None 
     337         
     338        @return the not before time as string or datetime type - see above""" 
    302339        if asDatetime is True: 
    303340            return self.__dtNotBefore 
     
    306343 
    307344 
     345    #_________________________________________________________________________     
    308346    def getValidityNotAfter(self, asDatetime=False): 
    309347        """Get the validity Not After date/time string 
    310348 
    311         Set asDatetime to True to return as a datetime type 
    312         Nb. time may not have been set - if so it will be set to None""" 
     349        @param asDatetime: boolean set to True to return as a datetime type 
     350        Nb. time may not have been set - if so it will be set to None 
     351         
     352        @return the not after time as string or datetime type - see above""" 
    313353        if asDatetime is True: 
    314354            return self.__dtNotAfter 
     
    317357 
    318358     
     359    #_________________________________________________________________________     
    319360    def getRoleSet(self): 
    320         """Get the roleSet as a list of role dictionaries.""" 
     361        """@return the roleSet as a list of role dictionaries.""" 
    321362        return self.__dat['attributes']['roleSet'] 
    322363 
    323364 
     365    #_________________________________________________________________________     
    324366    def getRoles(self): 
    325         """Return roles as a list""" 
     367        """Return roles as a list 
     368         
     369        @return list of roles contained in the certificate""" 
     370         
    326371        try: 
    327372            return [i.values()[0].values()[0] \ 
     
    331376 
    332377         
     378    #_________________________________________________________________________     
    333379    def setProvenance(self, provenance): 
    334         """Set the provenance for the certificate: 'original' or 'mapped'.""" 
     380        """Set the provenance for the certificate: 'original' or 'mapped'. 
     381         
     382        @param provenance: string provenance setting""" 
    335383 
    336384        if not self.isValidProvenance(provenance): 
    337             raise AttCertError("Provenance must be set to \"" + \ 
    338                                "\" or \"".join(AttCert.__provenance) + "\"") 
     385            raise AttCertError, "Provenance must be set to \"" + \ 
     386                               "\" or \"".join(AttCert.__provenance) + "\"" 
    339387         
    340388        self.__dat['provenance'] = provenance 
    341389 
    342390     
     391    #_________________________________________________________________________     
    343392    def getProvenance(self): 
    344         """Get the provenance for the certificate.""" 
     393        """Get the provenance for the certificate. 
     394         
     395        @return provenance of certificate mapped or original""" 
    345396        return self.__dat['provenance'] 
    346397     
    347398 
     399    #_________________________________________________________________________     
    348400    def isValidProvenance(self, provenance=None): 
    349401        """Check provenance is set correctly - to 'original'/'mapped'. 
     
    351403        If no provenance argument is provided, test against the setting in 
    352404        the current instance. 
     405         
     406        @param provenance: by default the current provenance setting is  
     407        checked i.e. self.__dat['provenance'].  Set this keyword to override 
     408        and check against an alternate provenance setting. 
     409        @return True if certificate has a valid provenance setting 
    353410        """ 
    354411         
     
    359416         
    360417 
     418    #_________________________________________________________________________     
    361419    def isOriginal(self): 
    362         """Check for original provenance.""" 
     420        """Check for original provenance. 
     421        @return True if certificate has original roles""" 
    363422        return self.__dat['provenance'] == self.__class__.origProvenance 
    364423 
    365424 
     425    #_________________________________________________________________________     
    366426    def isMapped(self): 
    367         """Check for mapped provenance.""" 
     427        """Check for mapped provenance. 
     428        @return True if certificate contain roles mapped from another""" 
    368429        return self.__dat['provenance'] == self.__class__.mappedProvenance 
    369430 
    370431 
     432    #_________________________________________________________________________     
    371433    def addRoles(self, roleName): 
    372         """Add new roles to the roleSet in attributes.""" 
     434        """Add new roles to the roleSet in attributes. 
     435         
     436        @param roleName: role name or list of role names to add to certificate 
     437        """ 
    373438 
    374439        if isinstance(roleName, basestring): 
     
    379444 
    380445 
     446    #_________________________________________________________________________     
    381447    def parse(self, xmlTxt, rtnRootElem=False): 
    382  
    383448        """Parse an Attribute Certificate content contained in string input 
    384449 
    385         xmlTxt:     Attribute Certificate XML content as string""" 
     450        @param xmlTxt:     Attribute Certificate XML content as string 
     451        @param rtnRootElem: boolean set to True to return the ElementTree 
     452        root element 
     453        @return root element if rtnRootElem keyword is set to True""" 
    386454         
    387455        rootElem = ElementTree.XML(xmlTxt) 
     
    391459 
    392460 
    393         # Call base class parser method to initialise libxml2 objects for 
     461        # Call base class parser method to initialise DOM objects for 
    394462        # signature validation 
    395463        try: 
     
    397465 
    398466        except Exception, e: 
    399             raise AttCertError("Attribute Certificate: %s" % e) 
     467            raise AttCertError, "Attribute Certificate: %s" % e 
    400468 
    401469        if rtnRootElem: 
     
    403471 
    404472         
    405     def read(self, filePath=None): 
    406  
    407         """Read Attribute Certificate 
    408  
    409         filePath:   file to be read, if omitted __filePath member variable is 
    410                     used instead""" 
     473    #_________________________________________________________________________     
     474    def read(self, filePath=None, **xmlSecDocKw): 
     475        """Read an Attribute Certificate from file 
     476 
     477        @param filePath:   file to be read, if omitted XMLSecDoc.__filePath  
     478        member variable is used instead""" 
    411479 
    412480        if filePath: 
    413             if not isinstance(filePath, basestring): 
    414                 raise AttCertError("Input file path must be a string.") 
    415  
    416481            self.filePath = filePath 
    417         else: 
    418             filePath = self.filePath 
    419  
    420482 
    421483        try:     
    422             tree = ElementTree.parse(filePath) 
     484            tree = ElementTree.parse(self.filePath) 
    423485            rootElem = tree.getroot() 
    424486        except Exception, e: 
    425             raise AttCertError("Attribute Certificate: %s" % e) 
     487            raise AttCertError, "Attribute Certificate: %s" % e 
    426488         
    427489        # Call generic ElementTree parser 
    428490        self.__parse(rootElem) 
    429  
    430491 
    431492        # Call base class read method to initialise libxml2 objects for 
    432493        # signature validation 
    433494        try: 
    434             XMLSecDoc.read(self) 
     495            XMLSecDoc.read(self, **xmlSecDocKw) 
    435496 
    436497        except Exception, e: 
    437             raise AttCertError("Attribute Certificate: %s" % e) 
    438  
    439  
    440  
    441          
     498            raise AttCertError, "Attribute Certificate: %s" % e 
     499 
     500         
     501    #_________________________________________________________________________     
    442502    def __parse(self, rootElem): 
    443  
    444503        """Private XML parsing method accepts a ElementTree.Element type 
    445504        as input 
    446505 
    447         rootElem:      ElementTree.Element type 
     506        @param rootElem: root element of doc - ElementTree.Element type 
    448507        """ 
    449508         
     
    452511         
    453512        if not acInfoElem: 
    454             raise AttCertError("<acInfo> tag not found in \"%s\"" % \ 
    455                                self.filePath) 
     513            raise AttCertError, "<acInfo> tag not found in \"%s\"" % \ 
     514                               self.filePath 
    456515 
    457516 
    458517        # Copy all acInfo tags into dictionary 
    459518        for elem in acInfoElem: 
    460          
    461             if not self.__dat.has_key(elem.tag): 
    462                 raise AttCertError(self.filePath + "\": <" + \ 
    463                                    elem.tag + "> not recognised.") 
     519            if elem.tag not in self.__dat: 
     520                raise AttCertError, '%s: "<%s>" not recognised.' % \ 
     521                                    (self.filePath, elem.tag) 
    464522 
    465523            # Make sure not to copy validity and attributes tags - handle  
     
    473531 
    474532        except X500DNError, x500dnErr: 
    475             raise AttCertError("Issuer DN: %s" % x500dnErr) 
     533            raise AttCertError, "Issuer DN: %s" % x500dnErr 
    476534 
    477535 
     
    480538 
    481539        except X500DNError, x500dnErr: 
    482             raise AttCertError("Holder DN: %s" % x500dnErr) 
     540            raise AttCertError, "Holder DN: %s" % x500dnErr 
    483541         
    484542                                  
     
    488546         
    489547        if self.__dat['validity']['notBefore'] is None: 
    490             raise AttCertError("<notBefore> tag not found in \"%s\"" % \ 
    491                                self.filePath) 
     548            raise AttCertError, "<notBefore> tag not found in \"%s\"" % \ 
     549                               self.filePath 
    492550 
    493551        # Update datetime object equivalent 
     
    500558         
    501559        if self.__dat['validity']['notAfter'] is None: 
    502             raise AttCertError("<notAfter> tag not found in \"%s\"" % 
    503                                self.filePath) 
    504  
     560            raise AttCertError, '<notAfter> tag not found in "%s"' % \ 
     561                               self.filePath 
    505562 
    506563        # Update datetime object equivalent 
     
    508565                                        self.__dat['validity']['notAfter']) 
    509566 
    510  
    511567        # set up role list 
    512568        roleElem = acInfoElem.findall("attributes/roleSet/role/name") 
    513569        if roleElem is None: 
    514             raise AttCertError("<role> tag not found in \"%s\"" % \ 
    515                                self.filePath) 
     570            raise AttCertError, "<role> tag not found in \"%s\"" % \ 
     571                               self.filePath 
    516572         
    517573        self.__dat['attributes']['roleSet'] = \ 
     
    520576         
    521577        if not self.isValidVersion():            
    522             raise AttCertError('Attribute Certificate version is ' + \ 
     578            raise AttCertError, 'Attribute Certificate version is ' + \ 
    523579                               self.__dat['version'] + ' but version ' + \ 
    524                                AttCert.__version + ' expected') 
    525  
    526  
    527  
    528  
     580                               AttCert.version + ' expected' 
     581 
     582 
     583    #_________________________________________________________________________     
    529584    def createXML(self): 
    530  
    531585        """Create XML for Attribute Token from current data settings and 
    532586        return as a string.  The XML created is MINUS the digital signature. 
    533         To obtain the signed version, run the sign method and pass the attCert 
    534         object reference into str() 
    535  
    536         Implementation of virtual method defined in XMLSecDoc base class""" 
     587        To obtain the signed version, run the applyEnvelopedSignature method  
     588        (inherited from XMLSecDoc) and pass the attCert object reference into  
     589        str() 
     590 
     591        @return xmlTxt: formatted XML for certificate as a string""" 
    537592 
    538593        # Nb. 
     
    543598        # Check for valid provenance 
    544599        if not self.isValidProvenance(): 
    545             raise AttCertError("Provenance must be set to \"" + \ 
    546                                "\" or \"".join(AttCert.__provenance) + "\"") 
     600            raise AttCertError, "Provenance must be set to \"" + \ 
     601                               "\" or \"".join(AttCert.__provenance) + "\"" 
    547602 
    548603         
    549604        # Create string of all XML content         
    550         xmlTxt = \ 
    551 """<attributeCertificate> 
     605        xmlTxt = """<attributeCertificate> 
    552606    <acInfo> 
    553607        <version>""" + self.__dat['version'] + """</version> 
     
    565619        <attributes> 
    566620            <roleSet> 
    567                 """ + \ 
    568         "".join(["""<role> 
     621""" + "".join([\ 
     622"""        <role> 
    569623                    <name>""" + i['role']['name'] + """</name> 
    570624                </role> 
    571             """ for i in self.__dat['attributes']['roleSet']]) +\ 
     625            """ for i in self.__dat['attributes']['roleSet']]) + \ 
    572626            """</roleSet> 
    573627        </attributes> 
     
    576630</attributeCertificate>""" 
    577631 
    578  
    579632        # Return XML file content as a string 
    580633        return xmlTxt 
    581634 
    582635 
    583  
    584  
     636    #_________________________________________________________________________     
    585637    def setValidityTime(self, 
    586638                        dtNotBefore=None,  
     
    588640                        lifeTime=None, 
    589641                        notBeforeOffset=None): 
    590  
    591642        """Set the notBefore and notAfter times which determine the window for 
    592         which the Attribute Certificate is valid 
     643        which the Attribute Certificate is valid.  These times are set as 
     644        datetime types and also the correct string format settings are made  
     645        ready for output. 
    593646 
    594647        Nb. use UTC time.  lifeTime and notBeforeOffset are in seconds 
     648         
     649        @param dtNotBefore: not before time as datetime type.  If omitted, 
     650        it defaults to the current time 
     651         
     652        @param dtNotAfter: not after time as datetime type.  Defaults to  
     653        self.__dtNotBefore + self.__lifetime.  If dtNotAfter is set it will 
     654        reset self.__lifetime to self.__dtNotAfter - self.dtNotBefore 
     655         
     656        @param lifetime: lifetime for certificate in seconds i.e. not after 
     657        time - not before time.  If dtNotAfter is set then this keyword will 
     658        be ignored. 
     659         
     660        @param notBeforeOffset: skew the not before time by some offset.  This 
     661        is useful in cases where system clocks are not correctly synchronized 
     662        between different hosts.  Set a negative value to skew the offset 
     663        backward in time. 
    595664        """ 
    596665 
    597666        if dtNotBefore is not None: 
    598667            if not isinstance(dtNotBefore, datetime): 
    599                 raise AttCertError(\ 
    600                                 "Input not before time must be datetime type") 
     668                raise AttCertError, \ 
     669                                "Input not before time must be datetime type" 
    601670             
    602671            self.__dtNotBefore = dtNotBefore 
     
    610679             
    611680 
    612  
    613681        if dtNotAfter is not None: 
    614682            if not isinstance(dtNotAfter, datetime): 
    615                 raise AttCertError(\ 
    616                                 "Input not after time must be datetime type") 
     683                raise AttCertError, \ 
     684                                "Input not after time must be datetime type" 
    617685 
    618686            # Use input Not After time to calculate a new lifetime setting 
    619687            dtDeltaLifeTime = dtNotAfter - self.__dtNotBefore 
    620688            if dtDeltaLifeTime < timedelta(0): 
    621                 raise AttCertError("Input Not After time is invalid %s" % \ 
    622                                    str(dtNotAfter)) 
     689                raise AttCertError, "Input Not After time is invalid %s" % \ 
     690                                   str(dtNotAfter) 
    623691 
    624692            self.__lifeTime = dtDeltaLifeTime.days*86400 + \ 
     
    637705                dtDeltaLifeTime = timedelta(seconds=self.__lifeTime) 
    638706            except Exception, e: 
    639                 raise AttCertError("Invalid Certificate lifetime set %.3f" % \ 
    640                                    self.__lifeTime) 
     707                raise AttCertError, "Invalid Certificate lifetime set %.3f" %\ 
     708                                   self.__lifeTime 
    641709             
    642710            # Add certificate lifetime to calculate not after time 
     
    653721 
    654722 
     723    #_________________________________________________________________________     
    655724    def datetime2timeStr(self, dtVal): 
    656  
    657         """Convert a datetime object to a notBefore/notAfter time string""" 
     725        """Convert a datetime object to a notBefore/notAfter time string 
     726         
     727        @param dtVal: input datetime 
     728        @return datetime converted into correct string format for AttCert""" 
    658729 
    659730        if not isinstance(dtVal, datetime): 
    660             raise AttCertError(\ 
    661                         "Invalid datetime object for conversion to string") 
     731            raise AttCertError, \ 
     732                        "Invalid datetime object for conversion to string" 
    662733         
    663734        # Convert from 1-12 to 0-11 month format used in XML file 
     
    675746     
    676747 
     748    #_________________________________________________________________________     
    677749    def timeStr2datetime(self, sTime): 
    678  
    679         """Convert a notBefore/notAfter time string to a datetime object""" 
    680  
    681         # Convert from 0-11 to 1-12 month format used by datetime() 
     750        """Convert a notBefore/notAfter time string to a datetime object 
     751         
     752        @param sTime: time in string format as used by AttCert 
     753        @return datetime type equivalent of string input""" 
     754 
    682755        try: 
    683             #lTime = [int(i) for i in sTime.split()] 
    684756            lTime = strptime(sTime, "%Y %m %d %H %M %S") 
    685              
    686             # Use 1-12 format 
    687             # P J Kershaw 09/05/05 
    688             #lTime[1] += 1 
    689          
    690             return datetime(lTime[0], lTime[1], lTime[2], 
    691                             lTime[3], lTime[4], lTime[5]) 
     757            return datetime(*lTime[0:6]) 
     758         
    692759        except Exception, e: 
    693             raise AttCertError(\ 
    694                 "Error converting time string into datetime object: %s" % e) 
    695          
    696  
    697  
    698  
     760            raise AttCertError, \ 
     761                "Error converting time string into datetime object: %s" % e 
     762         
     763 
     764 
     765 
     766    #_________________________________________________________________________     
    699767    def isValidTime(self, dtNow=None, raiseExcep=False): 
    700768        """Check Attribute Certificate for expiry.  Set raiseExcep to True 
    701769        to raise an exception with a message indicating the nature of the  
    702         time error""" 
     770        time error 
     771         
     772        @param dtNow: the time to test against in datetime format.  This time 
     773        must be within the range of the not before and not after times in 
     774        order for the certificate to be valid.  Defaults to the current  
     775        system time 
     776         
     777        @param raiseExcep: boolean set to True to raise an exception if the  
     778        time is invalid.  Defaults to False in which case no exception is 
     779        raised if the time is invalid, instead False is returned 
     780         
     781        @return boolean True if time is valid, False if invalid.  Also see 
     782        raiseExcep keyword above.""" 
    703783 
    704784        if not isinstance(self.__dtNotBefore, datetime): 
    705             raise AttCertError("Not Before datetime is not set") 
     785            raise AttCertError, "Not Before datetime is not set" 
    706786 
    707787        if not isinstance(self.__dtNotAfter, datetime): 
    708             raise AttCertError("Not After datetime is not set") 
     788            raise AttCertError, "Not After datetime is not set" 
    709789        
    710790        if dtNow is None: 
     
    735815        else: 
    736816            return dtNow > self.__dtNotBefore and dtNow < self.__dtNotAfter 
    737  
    738  
    739          
    740          
     817         
     818         
     819    #_________________________________________________________________________     
    741820    def isValidVersion(self): 
    742  
    743         """Check Attribute Certificate XML file version""" 
    744         return self.__dat['version'] == AttCert.__version 
    745  
    746  
    747  
    748  
     821        """Check Attribute Certificate XML file version 
     822         
     823        @return boolean True if certificate version matches the expected one, 
     824        False otherwise. 
     825        """ 
     826        return self.__dat['version'] == AttCert.version 
     827 
     828 
     829    #_________________________________________________________________________     
    749830    def isValid(self, 
    750831                raiseExcep=False, 
     
    753834                chkProvenance=True, 
    754835                chkSig=True, 
    755                 **xmlSecDocKeys): 
    756  
     836                **xmlSecDocKw): 
    757837        """Check Attribute Certificate is valid: 
    758838 
     
    762842        - Signature is valid. 
    763843 
    764         chkTime:                set to True to do time validity check (default 
    765                                 is True) 
    766  
    767         chkVersion:             set to True to Attribute Certificate file 
    768                                 version (default is True) 
    769  
    770         chkProvenance:          set to True to check provenance value is valid 
    771                                 (default is True) 
    772  
    773         chkSig:                 set to True to check digital signature - for 
    774                                 this certFilePathList must contain the root 
    775                                 certificate of the X.509 certificate used to 
    776                                 sign the AttCert.  Alternatively, 
    777                                 certFilePathList can be set via __init__ 
    778                                 (default chkSig value is True) 
     844        @param chkTime: set to True to do time validity check (default is  
     845        True) 
     846 
     847        @param chkVersion: set to True to Attribute Certificate file 
     848        version (default is True) 
     849 
     850        @param chkProvenanceset to True to check provenance value is valid 
     851        (default is True) 
     852 
     853        @param chkSig: set to True to check digital signature - for 
     854        this certFilePathList must contain the root certificate of the X.509  
     855        certificate used to sign the AttCert.  Alternatively, certFilePathList 
     856        can be set via __init__ (default chkSig value is True) 
    779857                                 
    780         raiseExcep:             set to true to raise an exception if invalid 
    781                                 instead of returning False.  Default is to set 
    782                                 this flag to False. 
    783  
    784         Also accepts keyword arguments corresponding to XMLSecDoc.isValidSig: 
    785          
    786         xmlTxt:                 string buffer containing the text from the XML 
    787                                 file to be checked.  If omitted, the 
    788                                 filePath argument is used instead. 
    789  
    790         filePath:               file path to XML file to be checked.  This 
    791                                 argument is used if no xmlTxt was provided. 
    792                                 If filePath itself is omitted the file set 
    793                                 by self.__filePath is read instead. 
    794  
    795         certFilePathList:       list of files paths must contain certificate  
    796                                 of trusted authority used to validate the 
    797                                 signature.  If set, it is copied into  
    798                                 self.__certFilePathList.  If omitted 
    799                                 self.__certFilePathList is used unchanged.                              
     858        @param raiseExcep: set to true to raise an exception if invalid  
     859        instead of returning False.  Default is to set this flag to False. 
     860 
     861        @param **xmlSecDocKw: Also accepts keyword arguments corresponding to  
     862        XMLSecDoc.verifyEnvelopedSignature(). 
     863         
     864        @return boolean True if certificate is valid, False otherwise.  Also 
     865        see explanation for raiseExcep keyword.                          
    800866        """ 
    801867 
     
    805871            return False 
    806872 
    807          
    808873        if chkVersion and not self.isValidVersion(): 
    809874            if raiseExcep: 
    810                 raise AttCertError('Attribute Certificate version is ' + \ 
     875                raise AttCertError, 'Attribute Certificate version is ' + \ 
    811876                                   self.__dat['version'] + ' but version ' + \ 
    812                                    AttCert.__version + ' expected') 
    813              
     877                                   AttCert.version + ' expected' 
    814878            return False 
    815  
    816879 
    817880        if chkProvenance and not self.isValidProvenance(): 
    818881            if raiseExcep: 
    819                 raise AttCertError(\ 
     882                raise AttCertError, \ 
    820883                    "Attribute Certificate Provenance must be set to \"" + \ 
    821                     "\" or \"".join(AttCert.__provenance) + "\"") 
    822                  
     884                    "\" or \"".join(AttCert.__provenance) + "\"" 
    823885            return False 
    824  
    825886 
    826887        # Handle exception from XMLSecDocc.isValidSig() regardless of 
    827888        # raiseExcep flag setting 
    828         try:             
    829             if chkSig and not self.isValidSig(**xmlSecDocKeys): 
    830                 if raiseExcep: 
    831                     raise AttCertError(\ 
    832                                 "Attribute Certificate signature is invalid") 
     889        if chkSig: 
     890            try: 
     891                self.verifyEnvelopedSignature(**xmlSecDocKw) 
     892         
     893            except InvalidSignature, e: 
     894                 if raiseExcep: 
     895                     raise AttCertError, \ 
     896                                "Attribute Certificate signature:" + str(e) 
     897                 else: 
     898                     return False 
    833899                 
    834                 return False 
    835          
    836         except Exception, e: 
    837             raise AttCertError(str(e)) 
    838          
    839  
    840900        # All tests passed 
    841901        return True 
    842902 
    843903 
    844  
    845904#_____________________________________________________________________________ 
    846905# Alternative AttCert constructors 
    847 # 
    848906def AttCertRead(filePath): 
    849907    """Create a new attribute certificate read in from a file""" 
     
    854912    return attCert 
    855913 
    856  
    857  
    858  
     914#_________________________________________________________________________     
    859915def AttCertParse(attCertTxt): 
    860916    """Create a new attribute certificate from string of file content""" 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/XMLSec.py

    r1962 r1964  
    2222import sys 
    2323 
    24 # For asString() - enables XML header to be stripped if required 
     24# For removal of BEGIN and END CERTIFICATE markers from X.509 certs 
    2525import re 
    26  
    27 # Use to create buffer for string output for asString() method 
    28 from cStringIO import StringIO 
    2926 
    3027# Include for re-parsing doc ready for canonicalization in sign method - see 
Note: See TracChangeset for help on using the changeset viewer.