Skip to content

Commit 8ff6f63

Browse files
jim-vljim-acb
authored andcommitted
fix: Replaced deprecated utcnow and utcfromtimestamp with timezone-aware datetime
1 parent f3aa8e4 commit 8ff6f63

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

storages/backends/azure_storage.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import datetime
12
import mimetypes
23
import warnings
3-
from datetime import datetime
44
from datetime import timedelta
55
from tempfile import SpooledTemporaryFile
66
from urllib.parse import urlparse
@@ -123,7 +123,7 @@ def __init__(self, **settings):
123123
self._service_client = None
124124
self._client = None
125125
self._user_delegation_key = None
126-
self._user_delegation_key_expiry = datetime.utcnow()
126+
self._user_delegation_key_expiry = datetime.datetime.now(datetime.timezone.utc)
127127
if self.connection_string and (not self.account_name or not self.account_key):
128128
parsed = parse_connection_string(
129129
self.connection_string, case_sensitive_keys=True
@@ -212,7 +212,7 @@ def get_user_delegation_key(self, expiry):
212212
self._user_delegation_key is None
213213
or expiry > self._user_delegation_key_expiry
214214
):
215-
now = datetime.utcnow()
215+
now = datetime.datetime.now(datetime.timezone.utc)
216216
key_expiry_time = now + timedelta(days=7)
217217
self._user_delegation_key = self.service_client.get_user_delegation_key(
218218
key_start_time=now, key_expiry_time=key_expiry_time
@@ -291,7 +291,9 @@ def _save(self, name, content):
291291

292292
def _expire_at(self, expire):
293293
# azure expects time in UTC
294-
return datetime.utcnow() + timedelta(seconds=expire)
294+
aaaa = datetime.datetime.now(datetime.timezone.utc)
295+
bbb = aaaa + timedelta(seconds=expire)
296+
return bbb
295297

296298
def url(self, name, expire=None, parameters=None, mode="r"):
297299
name = self._get_valid_path(name)

storages/backends/s3.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import warnings
88
from datetime import datetime
99
from datetime import timedelta
10+
from datetime import timezone
1011
from urllib.parse import urlencode
1112

1213
from django.contrib.staticfiles.storage import ManifestFilesMixin
@@ -681,7 +682,7 @@ def url(self, name, parameters=None, expire=None, http_method=None):
681682
)
682683

683684
if self.querystring_auth and self.cloudfront_signer:
684-
expiration = datetime.utcnow() + timedelta(seconds=expire)
685+
expiration = datetime.now(timezone.utc) + timedelta(seconds=expire)
685686
return self.cloudfront_signer.generate_presigned_url(
686687
url, date_less_than=expiration
687688
)

tests/test_azure.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def test_url_expire(self, generate_blob_sas_mocked):
161161

162162
with mock.patch("storages.backends.azure_storage.datetime") as datetime_mocked:
163163
# Implicit read permission
164-
datetime_mocked.utcnow.return_value = fixed_time
164+
datetime_mocked.datetime.now.return_value = fixed_time
165165
self.assertEqual(
166166
self.storage.url("some blob", 100),
167167
"https://ret_foo.blob.core.windows.net/test/some%20blob",
@@ -179,7 +179,7 @@ def test_url_expire(self, generate_blob_sas_mocked):
179179
self.assertEqual(str(called_kwargs["permission"]), "r")
180180

181181
# Explicit write permission
182-
datetime_mocked.utcnow.return_value = fixed_time
182+
datetime_mocked.datetime.now.return_value = fixed_time
183183
self.assertEqual(
184184
self.storage.url("some blob", expire=100, mode="w"),
185185
"https://ret_foo.blob.core.windows.net/test/some%20blob",
@@ -219,7 +219,7 @@ def test_url_expire_user_delegation_key(self, generate_blob_sas_mocked):
219219
datetime.datetime(2016, 11, 6, 4), datetime.timezone.utc
220220
)
221221
with mock.patch("storages.backends.azure_storage.datetime") as datetime_mocked:
222-
datetime_mocked.utcnow.return_value = fixed_time
222+
datetime_mocked.datetime.now.return_value = fixed_time
223223
service_client.get_user_delegation_key.return_value = "user delegation key"
224224
self.assertEqual(
225225
self.storage.url("some blob", 100),
@@ -435,3 +435,13 @@ def test_client_settings(self, bsc):
435435
bsc.assert_called_once_with(
436436
"https://test.blob.core.windows.net", credential=None, api_version="1.3"
437437
)
438+
439+
def test_user_delegation_key_expiry_is_aware(self):
440+
"""
441+
Ensure _user_delegation_key_expiry is a UTC-aware datetime.
442+
"""
443+
storage = azure_storage.AzureStorage()
444+
self.assertIsNotNone(storage._user_delegation_key_expiry.tzinfo)
445+
self.assertEqual(
446+
storage._user_delegation_key_expiry.utcoffset().total_seconds(), 0
447+
)

tests/test_s3.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,9 @@ def test_storage_url_custom_domain_signed_urls(self, dt_mocked):
766766
self.assertEqual(self.storage.url(filename), url)
767767

768768
self.storage.querystring_auth = True
769-
dt_mocked.utcnow.return_value = datetime.datetime.utcfromtimestamp(0)
769+
dt_mocked.now.return_value = datetime.datetime.fromtimestamp(
770+
0, datetime.timezone.utc
771+
)
770772
self.assertEqual(self.storage.url(filename), signed_url)
771773

772774
def test_generated_url_is_encoded(self):

0 commit comments

Comments
 (0)