Changeset 420


Ignore:
Timestamp:
09/06/05 18:01:29 (14 years ago)
Author:
pjkersha
Message:

attrAuthorityProperties: added setting for attribute certificate file
name prefix and suffix for when stored in Attribute Authority audit
directory.

attrAuthority:
modified so that user proxy certificate is input to createAttrCert() as
text.
createAttrCert() also now checks that the proxy certificate has not
expired and resets the new attribute certificate's expiry time so that
it doesn't out live the proxy cert's.

AttrCert?: use time.strptime() to parse notBefore/notAfter times. Also,
added dtNotAfter arg to setValidityTime() so that a not after datetime
can be input to set the expiry.

X509: Modified X509Cert.read() to parse the not before and not after
times and store them as datetime type.

Location:
security/trunk/python
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • security/trunk/python/NDG.BAK/AttAuthority.py

    r417 r420  
    5757    # Also, draws from Neil Bennett's ACServer class used in the Java 
    5858    # implementation of NDG Security 
    59      
    60  
    61     # Class variables - string constants for set-up of Attribute Certificate 
    62     # file names 
    63     __attrCertFilePfx = "attrCert-" 
    64     __attrCertFileSfx = ".xml" 
    6559 
    6660     
     
    125119 
    126120    def createAttrCert(self, 
    127                        usrProxyCertFilePath, 
     121                       usrProxyCertFilePath=None, 
     122                       usrProxyCertFileTxt=None, 
    128123                       extAttrCertFilePath=None, 
    129124                       extAttrCertFileTxt=None): 
     
    131126        """Create a new Attribute Certificate 
    132127 
    133         usrProxyCertFilePath:   file path to user's proxy certificate 
     128        usrProxyCertFilePath|usrProxyFileTxt: 
     129 
     130                                user's proxy certificate use appropriate 
     131                                keyword for input as a file path or as the 
     132                                text content respectively. 
     133                                 
    134134        extAttrCertFilePath|extAttrCertFileTxt: 
    135135         
     
    145145        # Read proxy certificate 
    146146        try: 
    147             usrProxyCert = X509Cert(usrProxyCertFilePath) 
    148             usrProxyCert.read() 
    149  
    150         except X509CertError, x509CertErr: 
    151             raise AttrAuthorityError(\ 
    152                 "User Proxy Certificate: %s" % str(x509CertErr)) 
    153  
    154          
     147            usrProxyCert = X509Cert() 
     148             
     149            if usrProxyCertFilePath is not None and \ 
     150               isinstance(usrProxyCertFilePath, basestring): 
     151 
     152                usrProxyCert.read(usrProxyCertFilePath) 
     153                 
     154            elif usrProxyCertFileTxt is not None and \ 
     155               isinstance(usrProxyCertFileTxt, basestring): 
     156                 
     157                usrProxyCert.parse(usrProxyCertFileTxt) 
     158 
     159            else: 
     160                raise AttrAuthorityError("no input file path or file text") 
     161             
     162        except Exception, e: 
     163            raise AttrAuthorityError("User Proxy Certificate: %s" % str(e)) 
     164 
     165 
     166        # Check proxy certificate hasn't expired 
     167        if not usrProxyCert.isValidTime(): 
     168            raise AttrAuthorityError("User Proxy Certificate has expired") 
     169 
     170             
    155171        # Get Distinguished name from certificate as an X500DN type 
    156172        usrDN = usrProxyCert.getDN() 
     
    192208            attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
    193209 
     210            # Check against the proxy certificate's expiry 
     211            dtUsrProxyNotAfter = usrProxyCert.getNotAfter() 
     212            if attrCert.getNotAfter(asDateTime=True) > dtUsrProxyNotAfter: 
     213 
     214                # Adjust the attribute certificate's expiry date time 
     215                # so that it agrees with the proxy certificate 
     216                attrCert.setValidityTime(dtNotAfter=dtUsrProxyNotAfter) 
     217             
    194218        except AttrCertError, attrCertErr: 
    195219            raise AttrAuthorityError(\ 
     
    359383        self.__caCertFilePath = properties['caCertFile'] 
    360384        self.__attrCertLifeTime = float(properties['attrCertLifeTime']) 
     385        self.__attrCertFilePfx = properties['attrCertFilePfx'] 
     386        self.__attrCertFileSfx = properties['attrCertFileSfx'] 
    361387        self.__mapConfigFilePath = properties['mapConfigFile'] 
    362388        self.__attrCertDir = properties['attrCertDir'] 
  • security/trunk/python/NDG.BAK/AttCert.py

    r417 r420  
    2727 
    2828# Time module for use with validity times 
     29from time import strftime 
     30from time import strptime 
    2931from datetime import datetime 
    3032from datetime import timedelta 
     
    281283        """Get the issuer serial number""" 
    282284        return self.__dat['issuerSerialNumber'] 
     285 
    283286     
    284287    def setlifeTime(self, lifeTime): 
     
    288291        self.__lifeTime = lifeTime 
    289292 
     293 
    290294    # Nb. no setValidityNotBefore/setValidityNotAfter methods - use 
    291295    # setValidityTime instead. 
    292296     
    293     def getValidityNotBefore(self): 
    294         """Get the validity Not Before date/time""" 
    295         return self.__dat['validity']['notBefore'] 
    296  
    297     def getValidityNotAfter(self): 
    298         """Get the validity Not After date/time""" 
    299         return self.__dat['validity']['notAfter'] 
     297    def getValidityNotBefore(self, asDatetime=False): 
     298        """Get the validity Not Before date/time string 
     299 
     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""" 
     302        if asDateTime is True: 
     303            return self.__dtNotBefore 
     304        else: 
     305            return self.__dat['validity']['notBefore'] 
     306 
     307 
     308    def getValidityNotAfter(self, asDatetime=False): 
     309        """Get the validity Not After date/time string 
     310 
     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""" 
     313        if asDateTime is True: 
     314            return self.__dtNotAfter 
     315        else: 
     316            return self.__dat['validity']['notAfter'] 
     317 
    300318     
    301319    def getRoleSet(self): 
    302320        """Get the roleSet as a list of role dictionaries.""" 
    303321        return self.__dat['attributes']['roleSet'] 
     322 
    304323 
    305324    def getRoles(self): 
     
    585604 
    586605 
    587     def setValidityTime(self, dtNotBefore=None, lifeTime=-1): 
     606    def setValidityTime(self, 
     607                        dtNotBefore=None, 
     608                        dtNotAfter=None, 
     609                        lifeTime=-1): 
    588610 
    589611        """Set the notBefore and notAfter times which determine the window for 
     
    604626            self.__dtNotBefore = datetime.utcnow() 
    605627 
    606         # Check for input certificate life time interval 
    607         if lifeTime is not -1: 
    608             self.__lifeTime = lifeTime 
    609  
    610         try: 
    611             # Make a time delta object with days set to 0 and seconds 
    612             # as 2nd argument 
    613             dtDeltaLifeTime = timedelta(0, self.__lifeTime) 
    614         except: 
    615             raise AttrCertError("Invalid Certificate lifetime set %.3f" % \ 
    616                                 self.__lifeTime) 
     628 
     629 
     630        if dtNotAfter is not None and isinstance(dtNotAfter, datetime): 
     631 
     632            # Use input Not After time to calculate a new lifetime setting 
     633            dtDeltaLifeTime = dtNotAfter - self.__dtNotBefore 
     634            if dtDeltaLifeTime < 0: 
     635                raise AttrCertError("Input Not After time is invalid %s" % \ 
     636                                    str(dtNotAfter)) 
     637 
     638            self.__lifeTime = dtDeltaLifeTime.days*86400 + \ 
     639                              dtDeltaLifeTime.seconds 
     640        else: 
     641            # Check for input certificate life time interval 
     642            if lifeTime is not -1: 
     643                self.__lifeTime = lifeTime 
     644                 
     645            try: 
     646                # Make a time delta object from the lifetime expressed in 
     647                # seconds 
     648                dtDeltaLifeTime = timedelta(seconds=self.__lifeTime) 
     649            except: 
     650                raise AttrCertError("Invalid Certificate lifetime set %.3f" %\ 
     651                                    self.__lifeTime) 
    617652 
    618653         
     
    639674         
    640675        # Convert from 1-12 to 0-11 month format used in XML file 
    641         lDateTime = list(dtVal.utctimetuple()[0:6]) 
     676        #lDateTime = list(dtVal.utctimetuple()[0:6]) 
     677 
     678        #lDateTime[1] -= 1 
     679 
     680        # Format as a single string with no commas or brackets 
     681        #return ''.join(re.findall('[0-9 ]', str(lDateTime))) 
    642682 
    643683        # Use 1-12 format 
    644         # P J Kershaw 09/05/05 
    645         #lDateTime[1] -= 1 
    646  
    647         # Format as a single string with no commas or brackets 
    648         return ''.join(re.findall('[0-9 ]', str(lDateTime))) 
    649  
     684        # P J Kershaw 09/06/05 
     685        return strftime("%Y %m %d %H %M %S") 
    650686 
    651687     
     
    657693        # Convert from 0-11 to 1-12 month format used by datetime() 
    658694        try: 
    659             lTime = [int(i) for i in sTime.split()] 
     695            #lTime = [int(i) for i in sTime.split()] 
     696            lTime = strptime(sTime, "%Y %m %d %H %M %S") 
    660697             
    661698            # Use 1-12 format 
     
    671708 
    672709 
    673      
     710 
    674711    def isValidTime(self): 
    675712 
     
    677714 
    678715        if not isinstance(self.__dtNotBefore, datetime): 
    679             raise AttrCertError("notBefore datetime is not set") 
     716            raise AttrCertError("Not Before datetime is not set") 
    680717 
    681718        if not isinstance(self.__dtNotAfter, datetime): 
    682             raise AttrCertError("notAfter datetime is not set") 
     719            raise AttrCertError("Not After datetime is not set") 
    683720        
    684721        dtNow = datetime.utcnow() 
  • security/trunk/python/NDG.BAK/X509.py

    r418 r420  
    1414import pdb 
    1515import types 
     16import re 
     17 
     18# Handle not before and not after strings 
     19from datetime import * 
     20 
    1621import M2Crypto 
    1722 
     
    4651        self.__m2CryptoX509 = None 
    4752        self.__dn = None 
    48  
     53        self.__dtNotBefore = None 
     54        self.__dtNotAfter = None 
     55         
    4956 
    5057    def __str__(self): 
     
    7885            self.__m2CryptoX509 = M2Crypto.X509.load_cert(self.__filePath) 
    7986        except Exception, e: 
    80             raise X509CertError("Error loading certificate \""%s"\": %s" % \ 
     87            raise X509CertError("Error loading certificate \"%s\": %s" % \ 
    8188                                (self.__filePath, str(e))) 
    8289 
     
    8491        m2CryptoX509Name = self.__m2CryptoX509.get_subject() 
    8592 
    86         # Instiantiate X500 Distinguished name 
     93        # Instantiate X500 Distinguished name 
    8794        self.__dn = X500DN(m2CryptoX509Name=m2CryptoX509Name) 
    8895 
    8996 
     97        # Get not before and not after validity times 
     98        # 
     99        # Only option for M2Crypto seems to be to return the times as 
     100        # formatted strings and then parse them in order to create a datetime 
     101        # type 
     102        datetimeRe = "([a-zA-Z]{3} \d{2} \d{2}:\d{2}:\d{2} \d{4}).*" 
     103        datetimeFmt = "%b %d %H:%M:%S %Y" 
     104         
     105        try: 
     106            # Check for expected format - string may have trailing GMT - ingore             
     107            sNotBefore = re.findall(datetimeRe, 
     108                                    str(self.__m2CryptoX509.get_not_before()) 
     109            lNotBefore = strptime(sNotBefore, datetimeFmt)[0:5] 
     110 
     111            self.__dtNotBefore = datetime(lTime[0], lTime[1], lTime[2], 
     112                                          lTime[3], lTime[4], lTime[5]) 
     113                                     
     114        except Exception, e: 
     115            raise X509CertError("Error parsing not before time: " + str(e)) 
     116 
     117         
     118        try: 
     119            # Check for expected format - string may have trailing GMT - ingore             
     120            sNotAfter = re.findall(datetimeRe, 
     121                                   str(self.__m2CryptoX509.get_not_before()) 
     122            lNotAfter = strptime(sNotAfter, datetimeFmt)[0:5] 
     123 
     124            self.__dtNotAfter = datetime(lTime[0], lTime[1], lTime[2], 
     125                                         lTime[3], lTime[4], lTime[5]) 
     126                                     
     127        except Exception, e: 
     128            raise X509CertError("Error parsing not after time: " + str(e)) 
     129 
     130 
     131 
     132         
    90133    def parse(self, certTxt): 
    91134        """Read a certificate input as a string""" 
     
    132175 
    133176    def getNotBefore(self): 
    134         """Get not before validity time""" 
    135         if self.__m2CryptoX509 is None: 
    136             return None 
    137          
    138         return self.__m2CryptoX509.get_not_before() 
     177        """Get not before validity time as datetime type""" 
     178        if self.__m2CryptoX509 is None: 
     179            return None 
     180         
     181        return self.__dtNotBefore 
    139182         
    140183         
    141184    def getNotAfter(self): 
    142         """Get not after validity time""" 
    143         if self.__m2CryptoX509 is None: 
    144             return None 
    145          
    146         return self.__m2CryptoX509.get_not_after() 
     185        """Get not after validity time as datetime type""" 
     186        if self.__m2CryptoX509 is None: 
     187            return None 
     188         
     189        return self.__dtNotAfter 
    147190         
    148191         
     
    169212         
    170213        return self.__m2CryptoX509.get_subject() 
     214 
     215 
     216    def isValidTime(self): 
     217 
     218        """Check Certificate for expiry""" 
     219 
     220        if not isinstance(self.__dtNotBefore, datetime): 
     221            raise AttrCertError("Not Before datetime is not set") 
     222 
     223        if not isinstance(self.__dtNotAfter, datetime): 
     224            raise AttrCertError("Not After datetime is not set") 
     225        
     226        dtNow = datetime.utcnow() 
     227        return dtNow > self.__dtNotBefore and dtNow < self.__dtNotAfter 
    171228         
    172229 
  • security/trunk/python/NDG/AttAuthority.py

    r417 r420  
    5757    # Also, draws from Neil Bennett's ACServer class used in the Java 
    5858    # implementation of NDG Security 
    59      
    60  
    61     # Class variables - string constants for set-up of Attribute Certificate 
    62     # file names 
    63     __attrCertFilePfx = "attrCert-" 
    64     __attrCertFileSfx = ".xml" 
    6559 
    6660     
     
    125119 
    126120    def createAttrCert(self, 
    127                        usrProxyCertFilePath, 
     121                       usrProxyCertFilePath=None, 
     122                       usrProxyCertFileTxt=None, 
    128123                       extAttrCertFilePath=None, 
    129124                       extAttrCertFileTxt=None): 
     
    131126        """Create a new Attribute Certificate 
    132127 
    133         usrProxyCertFilePath:   file path to user's proxy certificate 
     128        usrProxyCertFilePath|usrProxyFileTxt: 
     129 
     130                                user's proxy certificate use appropriate 
     131                                keyword for input as a file path or as the 
     132                                text content respectively. 
     133                                 
    134134        extAttrCertFilePath|extAttrCertFileTxt: 
    135135         
     
    145145        # Read proxy certificate 
    146146        try: 
    147             usrProxyCert = X509Cert(usrProxyCertFilePath) 
    148             usrProxyCert.read() 
    149  
    150         except X509CertError, x509CertErr: 
    151             raise AttrAuthorityError(\ 
    152                 "User Proxy Certificate: %s" % str(x509CertErr)) 
    153  
    154          
     147            usrProxyCert = X509Cert() 
     148             
     149            if usrProxyCertFilePath is not None and \ 
     150               isinstance(usrProxyCertFilePath, basestring): 
     151 
     152                usrProxyCert.read(usrProxyCertFilePath) 
     153                 
     154            elif usrProxyCertFileTxt is not None and \ 
     155               isinstance(usrProxyCertFileTxt, basestring): 
     156                 
     157                usrProxyCert.parse(usrProxyCertFileTxt) 
     158 
     159            else: 
     160                raise AttrAuthorityError("no input file path or file text") 
     161             
     162        except Exception, e: 
     163            raise AttrAuthorityError("User Proxy Certificate: %s" % str(e)) 
     164 
     165 
     166        # Check proxy certificate hasn't expired 
     167        if not usrProxyCert.isValidTime(): 
     168            raise AttrAuthorityError("User Proxy Certificate has expired") 
     169 
     170             
    155171        # Get Distinguished name from certificate as an X500DN type 
    156172        usrDN = usrProxyCert.getDN() 
     
    192208            attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
    193209 
     210            # Check against the proxy certificate's expiry 
     211            dtUsrProxyNotAfter = usrProxyCert.getNotAfter() 
     212            if attrCert.getNotAfter(asDateTime=True) > dtUsrProxyNotAfter: 
     213 
     214                # Adjust the attribute certificate's expiry date time 
     215                # so that it agrees with the proxy certificate 
     216                attrCert.setValidityTime(dtNotAfter=dtUsrProxyNotAfter) 
     217             
    194218        except AttrCertError, attrCertErr: 
    195219            raise AttrAuthorityError(\ 
     
    359383        self.__caCertFilePath = properties['caCertFile'] 
    360384        self.__attrCertLifeTime = float(properties['attrCertLifeTime']) 
     385        self.__attrCertFilePfx = properties['attrCertFilePfx'] 
     386        self.__attrCertFileSfx = properties['attrCertFileSfx'] 
    361387        self.__mapConfigFilePath = properties['mapConfigFile'] 
    362388        self.__attrCertDir = properties['attrCertDir'] 
  • security/trunk/python/NDG/AttCert.py

    r417 r420  
    2727 
    2828# Time module for use with validity times 
     29from time import strftime 
     30from time import strptime 
    2931from datetime import datetime 
    3032from datetime import timedelta 
     
    281283        """Get the issuer serial number""" 
    282284        return self.__dat['issuerSerialNumber'] 
     285 
    283286     
    284287    def setlifeTime(self, lifeTime): 
     
    288291        self.__lifeTime = lifeTime 
    289292 
     293 
    290294    # Nb. no setValidityNotBefore/setValidityNotAfter methods - use 
    291295    # setValidityTime instead. 
    292296     
    293     def getValidityNotBefore(self): 
    294         """Get the validity Not Before date/time""" 
    295         return self.__dat['validity']['notBefore'] 
    296  
    297     def getValidityNotAfter(self): 
    298         """Get the validity Not After date/time""" 
    299         return self.__dat['validity']['notAfter'] 
     297    def getValidityNotBefore(self, asDatetime=False): 
     298        """Get the validity Not Before date/time string 
     299 
     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""" 
     302        if asDateTime is True: 
     303            return self.__dtNotBefore 
     304        else: 
     305            return self.__dat['validity']['notBefore'] 
     306 
     307 
     308    def getValidityNotAfter(self, asDatetime=False): 
     309        """Get the validity Not After date/time string 
     310 
     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""" 
     313        if asDateTime is True: 
     314            return self.__dtNotAfter 
     315        else: 
     316            return self.__dat['validity']['notAfter'] 
     317 
    300318     
    301319    def getRoleSet(self): 
    302320        """Get the roleSet as a list of role dictionaries.""" 
    303321        return self.__dat['attributes']['roleSet'] 
     322 
    304323 
    305324    def getRoles(self): 
     
    585604 
    586605 
    587     def setValidityTime(self, dtNotBefore=None, lifeTime=-1): 
     606    def setValidityTime(self, 
     607                        dtNotBefore=None, 
     608                        dtNotAfter=None, 
     609                        lifeTime=-1): 
    588610 
    589611        """Set the notBefore and notAfter times which determine the window for 
     
    604626            self.__dtNotBefore = datetime.utcnow() 
    605627 
    606         # Check for input certificate life time interval 
    607         if lifeTime is not -1: 
    608             self.__lifeTime = lifeTime 
    609  
    610         try: 
    611             # Make a time delta object with days set to 0 and seconds 
    612             # as 2nd argument 
    613             dtDeltaLifeTime = timedelta(0, self.__lifeTime) 
    614         except: 
    615             raise AttrCertError("Invalid Certificate lifetime set %.3f" % \ 
    616                                 self.__lifeTime) 
     628 
     629 
     630        if dtNotAfter is not None and isinstance(dtNotAfter, datetime): 
     631 
     632            # Use input Not After time to calculate a new lifetime setting 
     633            dtDeltaLifeTime = dtNotAfter - self.__dtNotBefore 
     634            if dtDeltaLifeTime < 0: 
     635                raise AttrCertError("Input Not After time is invalid %s" % \ 
     636                                    str(dtNotAfter)) 
     637 
     638            self.__lifeTime = dtDeltaLifeTime.days*86400 + \ 
     639                              dtDeltaLifeTime.seconds 
     640        else: 
     641            # Check for input certificate life time interval 
     642            if lifeTime is not -1: 
     643                self.__lifeTime = lifeTime 
     644                 
     645            try: 
     646                # Make a time delta object from the lifetime expressed in 
     647                # seconds 
     648                dtDeltaLifeTime = timedelta(seconds=self.__lifeTime) 
     649            except: 
     650                raise AttrCertError("Invalid Certificate lifetime set %.3f" %\ 
     651                                    self.__lifeTime) 
    617652 
    618653         
     
    639674         
    640675        # Convert from 1-12 to 0-11 month format used in XML file 
    641         lDateTime = list(dtVal.utctimetuple()[0:6]) 
     676        #lDateTime = list(dtVal.utctimetuple()[0:6]) 
     677 
     678        #lDateTime[1] -= 1 
     679 
     680        # Format as a single string with no commas or brackets 
     681        #return ''.join(re.findall('[0-9 ]', str(lDateTime))) 
    642682 
    643683        # Use 1-12 format 
    644         # P J Kershaw 09/05/05 
    645         #lDateTime[1] -= 1 
    646  
    647         # Format as a single string with no commas or brackets 
    648         return ''.join(re.findall('[0-9 ]', str(lDateTime))) 
    649  
     684        # P J Kershaw 09/06/05 
     685        return strftime("%Y %m %d %H %M %S") 
    650686 
    651687     
     
    657693        # Convert from 0-11 to 1-12 month format used by datetime() 
    658694        try: 
    659             lTime = [int(i) for i in sTime.split()] 
     695            #lTime = [int(i) for i in sTime.split()] 
     696            lTime = strptime(sTime, "%Y %m %d %H %M %S") 
    660697             
    661698            # Use 1-12 format 
     
    671708 
    672709 
    673      
     710 
    674711    def isValidTime(self): 
    675712 
     
    677714 
    678715        if not isinstance(self.__dtNotBefore, datetime): 
    679             raise AttrCertError("notBefore datetime is not set") 
     716            raise AttrCertError("Not Before datetime is not set") 
    680717 
    681718        if not isinstance(self.__dtNotAfter, datetime): 
    682             raise AttrCertError("notAfter datetime is not set") 
     719            raise AttrCertError("Not After datetime is not set") 
    683720        
    684721        dtNow = datetime.utcnow() 
  • security/trunk/python/NDG/X509.py

    r418 r420  
    1414import pdb 
    1515import types 
     16import re 
     17 
     18# Handle not before and not after strings 
     19from datetime import * 
     20 
    1621import M2Crypto 
    1722 
     
    4651        self.__m2CryptoX509 = None 
    4752        self.__dn = None 
    48  
     53        self.__dtNotBefore = None 
     54        self.__dtNotAfter = None 
     55         
    4956 
    5057    def __str__(self): 
     
    7885            self.__m2CryptoX509 = M2Crypto.X509.load_cert(self.__filePath) 
    7986        except Exception, e: 
    80             raise X509CertError("Error loading certificate \""%s"\": %s" % \ 
     87            raise X509CertError("Error loading certificate \"%s\": %s" % \ 
    8188                                (self.__filePath, str(e))) 
    8289 
     
    8491        m2CryptoX509Name = self.__m2CryptoX509.get_subject() 
    8592 
    86         # Instiantiate X500 Distinguished name 
     93        # Instantiate X500 Distinguished name 
    8794        self.__dn = X500DN(m2CryptoX509Name=m2CryptoX509Name) 
    8895 
    8996 
     97        # Get not before and not after validity times 
     98        # 
     99        # Only option for M2Crypto seems to be to return the times as 
     100        # formatted strings and then parse them in order to create a datetime 
     101        # type 
     102        datetimeRe = "([a-zA-Z]{3} \d{2} \d{2}:\d{2}:\d{2} \d{4}).*" 
     103        datetimeFmt = "%b %d %H:%M:%S %Y" 
     104         
     105        try: 
     106            # Check for expected format - string may have trailing GMT - ingore             
     107            sNotBefore = re.findall(datetimeRe, 
     108                                    str(self.__m2CryptoX509.get_not_before()) 
     109            lNotBefore = strptime(sNotBefore, datetimeFmt)[0:5] 
     110 
     111            self.__dtNotBefore = datetime(lTime[0], lTime[1], lTime[2], 
     112                                          lTime[3], lTime[4], lTime[5]) 
     113                                     
     114        except Exception, e: 
     115            raise X509CertError("Error parsing not before time: " + str(e)) 
     116 
     117         
     118        try: 
     119            # Check for expected format - string may have trailing GMT - ingore             
     120            sNotAfter = re.findall(datetimeRe, 
     121                                   str(self.__m2CryptoX509.get_not_before()) 
     122            lNotAfter = strptime(sNotAfter, datetimeFmt)[0:5] 
     123 
     124            self.__dtNotAfter = datetime(lTime[0], lTime[1], lTime[2], 
     125                                         lTime[3], lTime[4], lTime[5]) 
     126                                     
     127        except Exception, e: 
     128            raise X509CertError("Error parsing not after time: " + str(e)) 
     129 
     130 
     131 
     132         
    90133    def parse(self, certTxt): 
    91134        """Read a certificate input as a string""" 
     
    132175 
    133176    def getNotBefore(self): 
    134         """Get not before validity time""" 
    135         if self.__m2CryptoX509 is None: 
    136             return None 
    137          
    138         return self.__m2CryptoX509.get_not_before() 
     177        """Get not before validity time as datetime type""" 
     178        if self.__m2CryptoX509 is None: 
     179            return None 
     180         
     181        return self.__dtNotBefore 
    139182         
    140183         
    141184    def getNotAfter(self): 
    142         """Get not after validity time""" 
    143         if self.__m2CryptoX509 is None: 
    144             return None 
    145          
    146         return self.__m2CryptoX509.get_not_after() 
     185        """Get not after validity time as datetime type""" 
     186        if self.__m2CryptoX509 is None: 
     187            return None 
     188         
     189        return self.__dtNotAfter 
    147190         
    148191         
     
    169212         
    170213        return self.__m2CryptoX509.get_subject() 
     214 
     215 
     216    def isValidTime(self): 
     217 
     218        """Check Certificate for expiry""" 
     219 
     220        if not isinstance(self.__dtNotBefore, datetime): 
     221            raise AttrCertError("Not Before datetime is not set") 
     222 
     223        if not isinstance(self.__dtNotAfter, datetime): 
     224            raise AttrCertError("Not After datetime is not set") 
     225        
     226        dtNow = datetime.utcnow() 
     227        return dtNow > self.__dtNotBefore and dtNow < self.__dtNotAfter 
    171228         
    172229 
Note: See TracChangeset for help on using the changeset viewer.