mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +00:00
Issue #19940: ssl.cert_time_to_seconds() now interprets the given time string in the UTC timezone (as specified in RFC 5280), not the local timezone.
Patch by Akira.
This commit is contained in:
parent
3a74ce2088
commit
c695c95626
5 changed files with 126 additions and 16 deletions
|
@ -86,6 +86,12 @@ def have_verify_flags():
|
|||
# 0.9.8 or higher
|
||||
return ssl.OPENSSL_VERSION_INFO >= (0, 9, 8, 0, 15)
|
||||
|
||||
def utc_offset(): #NOTE: ignore issues like #1647654
|
||||
# local time = utc time + utc offset
|
||||
if time.daylight and time.localtime().tm_isdst > 0:
|
||||
return -time.altzone # seconds
|
||||
return -time.timezone
|
||||
|
||||
def asn1time(cert_time):
|
||||
# Some versions of OpenSSL ignore seconds, see #18207
|
||||
# 0.9.8.i
|
||||
|
@ -651,6 +657,71 @@ class BasicSocketTests(unittest.TestCase):
|
|||
ctx.wrap_socket(s)
|
||||
self.assertEqual(str(cx.exception), "only stream sockets are supported")
|
||||
|
||||
def cert_time_ok(self, timestring, timestamp):
|
||||
self.assertEqual(ssl.cert_time_to_seconds(timestring), timestamp)
|
||||
|
||||
def cert_time_fail(self, timestring):
|
||||
with self.assertRaises(ValueError):
|
||||
ssl.cert_time_to_seconds(timestring)
|
||||
|
||||
@unittest.skipUnless(utc_offset(),
|
||||
'local time needs to be different from UTC')
|
||||
def test_cert_time_to_seconds_timezone(self):
|
||||
# Issue #19940: ssl.cert_time_to_seconds() returns wrong
|
||||
# results if local timezone is not UTC
|
||||
self.cert_time_ok("May 9 00:00:00 2007 GMT", 1178668800.0)
|
||||
self.cert_time_ok("Jan 5 09:34:43 2018 GMT", 1515144883.0)
|
||||
|
||||
def test_cert_time_to_seconds(self):
|
||||
timestring = "Jan 5 09:34:43 2018 GMT"
|
||||
ts = 1515144883.0
|
||||
self.cert_time_ok(timestring, ts)
|
||||
# accept keyword parameter, assert its name
|
||||
self.assertEqual(ssl.cert_time_to_seconds(cert_time=timestring), ts)
|
||||
# accept both %e and %d (space or zero generated by strftime)
|
||||
self.cert_time_ok("Jan 05 09:34:43 2018 GMT", ts)
|
||||
# case-insensitive
|
||||
self.cert_time_ok("JaN 5 09:34:43 2018 GmT", ts)
|
||||
self.cert_time_fail("Jan 5 09:34 2018 GMT") # no seconds
|
||||
self.cert_time_fail("Jan 5 09:34:43 2018") # no GMT
|
||||
self.cert_time_fail("Jan 5 09:34:43 2018 UTC") # not GMT timezone
|
||||
self.cert_time_fail("Jan 35 09:34:43 2018 GMT") # invalid day
|
||||
self.cert_time_fail("Jon 5 09:34:43 2018 GMT") # invalid month
|
||||
self.cert_time_fail("Jan 5 24:00:00 2018 GMT") # invalid hour
|
||||
self.cert_time_fail("Jan 5 09:60:43 2018 GMT") # invalid minute
|
||||
|
||||
newyear_ts = 1230768000.0
|
||||
# leap seconds
|
||||
self.cert_time_ok("Dec 31 23:59:60 2008 GMT", newyear_ts)
|
||||
# same timestamp
|
||||
self.cert_time_ok("Jan 1 00:00:00 2009 GMT", newyear_ts)
|
||||
|
||||
self.cert_time_ok("Jan 5 09:34:59 2018 GMT", 1515144899)
|
||||
# allow 60th second (even if it is not a leap second)
|
||||
self.cert_time_ok("Jan 5 09:34:60 2018 GMT", 1515144900)
|
||||
# allow 2nd leap second for compatibility with time.strptime()
|
||||
self.cert_time_ok("Jan 5 09:34:61 2018 GMT", 1515144901)
|
||||
self.cert_time_fail("Jan 5 09:34:62 2018 GMT") # invalid seconds
|
||||
|
||||
# no special treatement for the special value:
|
||||
# 99991231235959Z (rfc 5280)
|
||||
self.cert_time_ok("Dec 31 23:59:59 9999 GMT", 253402300799.0)
|
||||
|
||||
@support.run_with_locale('LC_ALL', '')
|
||||
def test_cert_time_to_seconds_locale(self):
|
||||
# `cert_time_to_seconds()` should be locale independent
|
||||
|
||||
def local_february_name():
|
||||
return time.strftime('%b', (1, 2, 3, 4, 5, 6, 0, 0, 0))
|
||||
|
||||
if local_february_name().lower() == 'feb':
|
||||
self.skipTest("locale-specific month name needs to be "
|
||||
"different from C locale")
|
||||
|
||||
# locale-independent
|
||||
self.cert_time_ok("Feb 9 00:00:00 2007 GMT", 1170979200.0)
|
||||
self.cert_time_fail(local_february_name() + " 9 00:00:00 2007 GMT")
|
||||
|
||||
|
||||
class ContextTests(unittest.TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue