Skip to content

Commit dc4e788

Browse files
authored
Merge pull request #420 from andersk/naive-utc
Replace deprecated `datetime.utcfromtimestamp`, `datetime.utcnow`
2 parents 0320fd4 + 8d13647 commit dc4e788

File tree

2 files changed

+12
-13
lines changed

2 files changed

+12
-13
lines changed

src/onelogin/saml2/utils.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
import base64
1111
import warnings
1212
from copy import deepcopy
13-
import calendar
14-
from datetime import datetime
13+
from datetime import datetime, timezone
1514
from hashlib import sha1, sha256, sha384, sha512
1615
from isodate import parse_duration as duration_parser
1716
import re
@@ -389,7 +388,7 @@ def parse_time_to_SAML(time):
389388
:return: SAML2 timestamp.
390389
:rtype: string
391390
"""
392-
data = datetime.utcfromtimestamp(float(time))
391+
data = datetime.fromtimestamp(float(time), timezone.utc)
393392
return data.strftime(OneLogin_Saml2_Utils.TIME_FORMAT)
394393

395394
@staticmethod
@@ -405,25 +404,25 @@ def parse_SAML_to_time(timestr):
405404
:rtype: int
406405
"""
407406
try:
408-
data = datetime.strptime(timestr, OneLogin_Saml2_Utils.TIME_FORMAT)
407+
data = datetime.strptime(timestr, OneLogin_Saml2_Utils.TIME_FORMAT).replace(tzinfo=timezone.utc)
409408
except ValueError:
410409
try:
411-
data = datetime.strptime(timestr, OneLogin_Saml2_Utils.TIME_FORMAT_2)
410+
data = datetime.strptime(timestr, OneLogin_Saml2_Utils.TIME_FORMAT_2).replace(tzinfo=timezone.utc)
412411
except ValueError:
413412
elem = OneLogin_Saml2_Utils.TIME_FORMAT_WITH_FRAGMENT.match(timestr)
414413
if not elem:
415414
raise Exception("time data %s does not match format %s" % (timestr, r"yyyy-mm-ddThh:mm:ss(\.s+)?Z"))
416-
data = datetime.strptime(elem.groups()[0] + "Z", OneLogin_Saml2_Utils.TIME_FORMAT)
415+
data = datetime.strptime(elem.groups()[0] + "Z", OneLogin_Saml2_Utils.TIME_FORMAT).replace(tzinfo=timezone.utc)
417416

418-
return calendar.timegm(data.utctimetuple())
417+
return int(data.timestamp())
419418

420419
@staticmethod
421420
def now():
422421
"""
423422
:return: unix timestamp of actual time.
424423
:rtype: int
425424
"""
426-
return calendar.timegm(datetime.utcnow().utctimetuple())
425+
return int(datetime.now(timezone.utc).timestamp())
427426

428427
@staticmethod
429428
def parse_duration(duration, timestamp=None):
@@ -445,10 +444,10 @@ def parse_duration(duration, timestamp=None):
445444

446445
timedelta = duration_parser(duration)
447446
if timestamp is None:
448-
data = datetime.utcnow() + timedelta
447+
data = datetime.now(timezone.utc) + timedelta
449448
else:
450-
data = datetime.utcfromtimestamp(timestamp) + timedelta
451-
return calendar.timegm(data.utctimetuple())
449+
data = datetime.fromtimestamp(timestamp, timezone.utc) + timedelta
450+
return int(data.timestamp())
452451

453452
@staticmethod
454453
def get_expire_time(cache_duration=None, valid_until=None):

tests/src/OneLogin/saml2_tests/metadata_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import json
55
from os.path import dirname, join, exists
66
from time import strftime
7-
from datetime import datetime
7+
from datetime import datetime, timezone
88
import unittest
99

1010
from onelogin.saml2 import compat
@@ -97,7 +97,7 @@ def testBuilder(self):
9797
self.assertNotIn("cacheDuration", metadata5)
9898
self.assertIn('validUntil="2014-10-01T11:04:29Z"', metadata5)
9999

100-
datetime_value = datetime.now()
100+
datetime_value = datetime.now(timezone.utc)
101101
metadata6 = OneLogin_Saml2_Metadata.builder(sp_data, security["authnRequestsSigned"], security["wantAssertionsSigned"], datetime_value, "P1Y", contacts, organization)
102102
self.assertIsNotNone(metadata5)
103103
self.assertIn("<md:SPSSODescriptor", metadata6)

0 commit comments

Comments
 (0)