Skip to content

Commit 920993c

Browse files
authored
Added SHA-512 fallback by default
2 parents ef8fd98 + d79c74a commit 920993c

File tree

5 files changed

+20
-5
lines changed

5 files changed

+20
-5
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Version 1.1.0
44
Released 2018-10-26
55

66
- Change default signing algorithm back to SHA-1. (`#113`_)
7+
- Added a default SHA-512 fallback.
78
- Add support for fallback algorithms during deserialization to
89
support changing the default in the future without breaking existing
910
signatures. (`#113`_)

src/itsdangerous/serializer.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import hashlib
2+
13
from ._compat import text_type
24
from ._json import json
35
from .encoding import want_bytes
@@ -57,7 +59,9 @@ class to the constructor as well as keyword arguments as a dict that
5759
the constructor.
5860
5961
.. versionchanged:: 1.1:
60-
Added support for ``fallback_signers``.
62+
Added support for ``fallback_signers`` and configured a default
63+
SHA-512 fallback. This fallback is for users who used the 1.0
64+
release which was yanked which had SHA-512 support in it.
6165
"""
6266

6367
#: If a serializer module or class is not passed to the constructor
@@ -70,6 +74,9 @@ class to the constructor as well as keyword arguments as a dict that
7074
#: .. versionadded:: 0.14
7175
default_signer = Signer
7276

77+
#: The default fallback signers.
78+
default_fallback_signers = [{"digest_method": hashlib.sha512}]
79+
7380
def __init__(
7481
self,
7582
secret_key,
@@ -90,7 +97,9 @@ def __init__(
9097
signer = self.default_signer
9198
self.signer = signer
9299
self.signer_kwargs = signer_kwargs or {}
93-
self.fallback_signers = fallback_signers or ()
100+
if fallback_signers is None:
101+
fallback_signers = list(self.default_fallback_signers or ())
102+
self.fallback_signers = fallback_signers
94103
self.serializer_kwargs = serializer_kwargs or {}
95104

96105
def load_payload(self, payload, serializer=None):

src/itsdangerous/timed.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ def loads(self, s, max_age=None, return_timestamp=False, salt=None):
132132
if return_timestamp:
133133
return payload, timestamp
134134
return payload
135+
# If we get a signature expired it means we could read the
136+
# signature but it's invalid. In that case we do not want to
137+
# try the next signer.
138+
except SignatureExpired:
139+
raise
135140
except BadSignature as err:
136141
last_exception = err
137142
raise last_exception

tests/test_itsdangerous/test_serializer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,12 @@ def test_serializer_kwargs(self, serializer_factory):
134134
assert serializer.loads(serializer.dumps({(): 1})) == {}
135135

136136
def test_fallback_signers(self, serializer_factory, value):
137-
serializer = serializer_factory(signer_kwargs={"digest_method": hashlib.sha512})
137+
serializer = serializer_factory(signer_kwargs={"digest_method": hashlib.sha256})
138138
signed = serializer.dumps(value)
139139

140140
fallback_serializer = serializer_factory(
141141
signer_kwargs={"digest_method": hashlib.sha1},
142-
fallback_signers=[{"digest_method": hashlib.sha512}],
142+
fallback_signers=[{"digest_method": hashlib.sha256}],
143143
)
144144

145145
assert fallback_serializer.loads(signed) == value

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ setenv =
1212
deps =
1313
pytest-cov
1414
freezegun
15-
commands = pytest --cov --cov-report= {posargs}
15+
commands = pytest --tb=short --cov --cov-report= {posargs}
1616

1717
[testenv:stylecheck]
1818
deps = pre-commit

0 commit comments

Comments
 (0)