@@ -65,6 +65,10 @@ class OneLogin_Saml2_Utils(object):
6565 RESPONSE_SIGNATURE_XPATH = '/samlp:Response/ds:Signature'
6666 ASSERTION_SIGNATURE_XPATH = '/samlp:Response/saml:Assertion/ds:Signature'
6767
68+ TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
69+ TIME_FORMAT_2 = "%Y-%m-%dT%H:%M:%S.%fZ"
70+ TIME_FORMAT_WITH_FRAGMENT = re .compile (r'^(\d{4,4}-\d{2,2}-\d{2,2}T\d{2,2}:\d{2,2}:\d{2,2})(\.\d*)?Z?$' )
71+
6872 @staticmethod
6973 def escape_url (url , lowercase_urlencoding = False ):
7074 """
@@ -401,7 +405,7 @@ def parse_time_to_SAML(time):
401405 :rtype: string
402406 """
403407 data = datetime .utcfromtimestamp (float (time ))
404- return data .strftime ('%Y-%m-%dT%H:%M:%SZ' )
408+ return data .strftime (OneLogin_Saml2_Utils . TIME_FORMAT )
405409
406410 @staticmethod
407411 def parse_SAML_to_time (timestr ):
@@ -416,9 +420,16 @@ def parse_SAML_to_time(timestr):
416420 :rtype: int
417421 """
418422 try :
419- data = datetime .strptime (timestr , '%Y-%m-%dT%H:%M:%SZ' )
423+ data = datetime .strptime (timestr , OneLogin_Saml2_Utils . TIME_FORMAT )
420424 except ValueError :
421- data = datetime .strptime (timestr , '%Y-%m-%dT%H:%M:%S.%fZ' )
425+ try :
426+ data = datetime .strptime (timestr , OneLogin_Saml2_Utils .TIME_FORMAT_2 )
427+ except ValueError :
428+ elem = OneLogin_Saml2_Utils .TIME_FORMAT_WITH_FRAGMENT .match (timestr )
429+ if not elem :
430+ raise Exception ("time data %s does not match format %s" % (timestr , r'yyyy-mm-ddThh:mm:ss(\.s+)?Z' ))
431+ data = datetime .strptime (elem .groups ()[0 ] + "Z" , OneLogin_Saml2_Utils .TIME_FORMAT )
432+
422433 return calendar .timegm (data .utctimetuple ())
423434
424435 @staticmethod
0 commit comments