diff --git a/securedrop/journalist_app/__init__.py b/securedrop/journalist_app/__init__.py index e476346b0e..d89f5d8cda 100644 --- a/securedrop/journalist_app/__init__.py +++ b/securedrop/journalist_app/__init__.py @@ -20,8 +20,6 @@ _insecure_views = ["main.login", "static"] _insecure_api_views = ["api.get_token", "api.get_endpoints"] -# Timezone-naive datetime format expected by SecureDrop Client -API_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" def get_logo_url(app: Flask) -> str: @@ -67,7 +65,7 @@ class JSONEncoder(json.JSONEncoder): def default(self, obj: "Any") -> "Any": if isinstance(obj, datetime): - return obj.strftime(API_DATETIME_FORMAT) + return obj.isoformat() super().default(obj) app.json_encoder = JSONEncoder diff --git a/securedrop/tests/test_journalist_api.py b/securedrop/tests/test_journalist_api.py index 884a06a11e..7d3a67b7dc 100644 --- a/securedrop/tests/test_journalist_api.py +++ b/securedrop/tests/test_journalist_api.py @@ -20,8 +20,7 @@ def assert_valid_timestamp(timestamp: str) -> None: """verify the timestamp is encoded in the format we want""" - dt_format = "%Y-%m-%dT%H:%M:%S.%fZ" - assert timestamp == datetime.strptime(timestamp, dt_format).strftime(dt_format) + assert timestamp == datetime.fromisoformat(timestamp).isoformat() def test_unauthenticated_user_gets_all_endpoints(journalist_app): diff --git a/securedrop/tests/test_journalist_session.py b/securedrop/tests/test_journalist_session.py index 2d1fa3fed4..5fd20ee71e 100644 --- a/securedrop/tests/test_journalist_session.py +++ b/securedrop/tests/test_journalist_session.py @@ -292,7 +292,7 @@ def test_session_api_login(journalist_app, test_journo, redis): # Then the expiration date returned in `get_token` response also conforms to the same rules assert ( datetime.now(timezone.utc) - < datetime.strptime(resp.json["expiration"], "%Y-%m-%dT%H:%M:%S.%f%z") + < datetime.fromisoformat(resp.json["expiration"]) < ( datetime.now(timezone.utc) + timedelta(seconds=journalist_app.config["SESSION_LIFETIME"])