@@ -89,6 +89,11 @@ class OneLogin_Saml2_Utils(object):
8989 RESPONSE_SIGNATURE_XPATH = '/samlp:Response/ds:Signature'
9090 ASSERTION_SIGNATURE_XPATH = '/samlp:Response/saml:Assertion/ds:Signature'
9191
92+ TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
93+ TIME_FORMAT_2 = "%Y-%m-%dT%H:%M:%S.%fZ"
94+ TIME_FORMAT_WITH_FRAGMENT = re .compile (
95+ "^(\d{4,4}-\d{2,2}-\d{2,2}T\d{2,2}:\d{2,2}:\d{2,2})(\.\d*)?Z?$" )
96+
9297 @staticmethod
9398 def decode_base64_and_inflate (value ):
9499 """
@@ -445,7 +450,7 @@ def parse_time_to_SAML(time):
445450 :rtype: string
446451 """
447452 data = datetime .utcfromtimestamp (float (time ))
448- return data .strftime ('%Y-%m-%dT%H:%M:%SZ' )
453+ return data .strftime (OneLogin_Saml2_Utils . TIME_FORMAT )
449454
450455 @staticmethod
451456 def parse_SAML_to_time (timestr ):
@@ -460,9 +465,16 @@ def parse_SAML_to_time(timestr):
460465 :rtype: int
461466 """
462467 try :
463- data = datetime .strptime (timestr , '%Y-%m-%dT%H:%M:%SZ' )
468+ data = datetime .strptime (timestr , OneLogin_Saml2_Utils . TIME_FORMAT )
464469 except ValueError :
465- data = datetime .strptime (timestr , '%Y-%m-%dT%H:%M:%S.%fZ' )
470+ try :
471+ data = datetime .strptime (timestr , OneLogin_Saml2_Utils .TIME_FORMAT_2 )
472+ except ValueError :
473+ elem = OneLogin_Saml2_Utils .TIME_FORMAT_WITH_FRAGMENT .match (timestr )
474+ if not elem :
475+ raise Exception ("time data %s does not match format %s" % (timestr , "yyyy-mm-ddThh:mm:ss(\.s+)?Z" ))
476+ data = datetime .strptime (elem .groups ()[0 ] + "Z" , OneLogin_Saml2_Utils .TIME_FORMAT )
477+
466478 return calendar .timegm (data .utctimetuple ())
467479
468480 @staticmethod
0 commit comments