Skip to content

Commit 4d28e6a

Browse files
committed
Rename exceptions that don't have Error in their name
...but keep the old names around as deprecated aliases for backward compatibility.
1 parent 2221cb6 commit 4d28e6a

File tree

3 files changed

+43
-25
lines changed

3 files changed

+43
-25
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ jwt.encode({'exp': datetime.utcnow()}, 'secret')
122122
```
123123

124124
Expiration time is automatically verified in `jwt.decode()` and raises
125-
`jwt.ExpiredSignature` if the expiration time is in the past:
125+
`jwt.ExpiredSignatureError` if the expiration time is in the past:
126126

127127
```python
128128
import jwt
129129

130130
try:
131131
jwt.decode('JWT_STRING', 'secret')
132-
except jwt.ExpiredSignature:
132+
except jwt.ExpiredSignatureError:
133133
# Signature has expired
134134
```
135135

jwt/__init__.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,21 @@
2828

2929
__version__ = '0.4.0'
3030
__all__ = [
31-
'encode', 'decode', 'InvalidTokenError', 'DecodeError',
32-
'ExpiredSignature', 'InvalidAudience', 'InvalidIssuer'
31+
# Functions
32+
'encode',
33+
'decode',
34+
35+
# Exceptions
36+
'InvalidTokenError',
37+
'DecodeError',
38+
'ExpiredSignatureError',
39+
'InvalidAudienceError',
40+
'InvalidIssuerError'
41+
42+
# Deprecated aliases
43+
'ExpiredSignature',
44+
'InvalidAudience',
45+
'InvalidIssuer',
3346
]
3447

3548

@@ -41,18 +54,23 @@ class DecodeError(InvalidTokenError):
4154
pass
4255

4356

44-
class ExpiredSignature(InvalidTokenError):
57+
class ExpiredSignatureError(InvalidTokenError):
4558
pass
4659

4760

48-
class InvalidAudience(InvalidTokenError):
61+
class InvalidAudienceError(InvalidTokenError):
4962
pass
5063

5164

52-
class InvalidIssuer(InvalidTokenError):
65+
class InvalidIssuerError(InvalidTokenError):
5366
pass
5467

5568

69+
# Compatibility aliases (deprecated)
70+
ExpiredSignature = ExpiredSignatureError
71+
InvalidAudience = InvalidAudienceError
72+
InvalidIssuer = InvalidIssuerError
73+
5674
signing_methods = {
5775
'none': lambda msg, key: b'',
5876
'HS256': lambda msg, key: hmac.new(key, msg, hashlib.sha256).digest(),
@@ -399,13 +417,13 @@ def verify_signature(payload, signing_input, header, signature, key='',
399417
utc_timestamp = timegm(datetime.utcnow().utctimetuple())
400418

401419
if payload['nbf'] > (utc_timestamp + leeway):
402-
raise ExpiredSignature('Signature not yet valid')
420+
raise ExpiredSignatureError('Signature not yet valid')
403421

404422
if 'exp' in payload and verify_expiration:
405423
utc_timestamp = timegm(datetime.utcnow().utctimetuple())
406424

407425
if payload['exp'] < (utc_timestamp - leeway):
408-
raise ExpiredSignature('Signature has expired')
426+
raise ExpiredSignatureError('Signature has expired')
409427

410428
if audience is not None:
411429
if isinstance(audience, list):
@@ -414,8 +432,8 @@ def verify_signature(payload, signing_input, header, signature, key='',
414432
audiences = [audience]
415433

416434
if payload.get('aud') not in audiences:
417-
raise InvalidAudience('Invalid audience')
435+
raise InvalidAudienceError('Invalid audience')
418436

419437
if issuer is not None:
420438
if payload.get('iss') != issuer:
421-
raise InvalidIssuer('Invalid issuer')
439+
raise InvalidIssuerError('Invalid issuer')

tests/test_jwt.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -357,13 +357,13 @@ def test_decode_with_expiration(self):
357357
jwt_message = jwt.encode(self.payload, secret)
358358

359359
self.assertRaises(
360-
jwt.ExpiredSignature,
360+
jwt.ExpiredSignatureError,
361361
lambda: jwt.decode(jwt_message, secret))
362362

363363
decoded_payload, signing, header, signature = jwt.load(jwt_message)
364364

365365
self.assertRaises(
366-
jwt.ExpiredSignature,
366+
jwt.ExpiredSignatureError,
367367
lambda: jwt.verify_signature(
368368
decoded_payload, signing, header, signature, secret))
369369

@@ -373,13 +373,13 @@ def test_decode_with_notbefore(self):
373373
jwt_message = jwt.encode(self.payload, secret)
374374

375375
self.assertRaises(
376-
jwt.ExpiredSignature,
376+
jwt.ExpiredSignatureError,
377377
lambda: jwt.decode(jwt_message, secret))
378378

379379
decoded_payload, signing, header, signature = jwt.load(jwt_message)
380380

381381
self.assertRaises(
382-
jwt.ExpiredSignature,
382+
jwt.ExpiredSignatureError,
383383
lambda: jwt.verify_signature(
384384
decoded_payload, signing, header, signature, secret))
385385

@@ -422,11 +422,11 @@ def test_decode_with_expiration_with_leeway(self):
422422
# With 1 seconds, should fail
423423
for leeway in (1, timedelta(seconds=1)):
424424
self.assertRaises(
425-
jwt.ExpiredSignature,
425+
jwt.ExpiredSignatureError,
426426
lambda: jwt.decode(jwt_message, secret, leeway=leeway))
427427

428428
self.assertRaises(
429-
jwt.ExpiredSignature,
429+
jwt.ExpiredSignatureError,
430430
lambda: jwt.verify_signature(decoded_payload, signing,
431431
header, signature, secret,
432432
leeway=leeway))
@@ -446,11 +446,11 @@ def test_decode_with_notbefore_with_leeway(self):
446446

447447
# With 1 seconds, should fail
448448
self.assertRaises(
449-
jwt.ExpiredSignature,
449+
jwt.ExpiredSignatureError,
450450
lambda: jwt.decode(jwt_message, secret, leeway=1))
451451

452452
self.assertRaises(
453-
jwt.ExpiredSignature,
453+
jwt.ExpiredSignatureError,
454454
lambda: jwt.verify_signature(decoded_payload, signing,
455455
header, signature, secret, leeway=1))
456456

@@ -737,7 +737,7 @@ def test_raise_exception_invalid_audience(self):
737737
token = jwt.encode(payload, 'secret')
738738

739739
self.assertRaises(
740-
jwt.InvalidAudience,
740+
jwt.InvalidAudienceError,
741741
lambda: jwt.decode(token, 'secret', audience=audience))
742742

743743
def test_raise_exception_invalid_audience_in_array(self):
@@ -751,7 +751,7 @@ def test_raise_exception_invalid_audience_in_array(self):
751751
token = jwt.encode(payload, 'secret')
752752

753753
self.assertRaises(
754-
jwt.InvalidAudience,
754+
jwt.InvalidAudienceError,
755755
lambda: jwt.decode(token, 'secret', audience=audience))
756756

757757
def test_raise_exception_token_without_audience(self):
@@ -764,7 +764,7 @@ def test_raise_exception_token_without_audience(self):
764764
token = jwt.encode(payload, 'secret')
765765

766766
self.assertRaises(
767-
jwt.InvalidAudience,
767+
jwt.InvalidAudienceError,
768768
lambda: jwt.decode(token, 'secret', audience=audience))
769769

770770
def test_raise_exception_token_without_audience_in_array(self):
@@ -777,7 +777,7 @@ def test_raise_exception_token_without_audience_in_array(self):
777777
token = jwt.encode(payload, 'secret')
778778

779779
self.assertRaises(
780-
jwt.InvalidAudience,
780+
jwt.InvalidAudienceError,
781781
lambda: jwt.decode(token, 'secret', audience=audience))
782782

783783
def test_check_issuer(self):
@@ -804,7 +804,7 @@ def test_raise_exception_invalid_issuer(self):
804804
token = jwt.encode(payload, 'secret')
805805

806806
self.assertRaises(
807-
jwt.InvalidIssuer,
807+
jwt.InvalidIssuerError,
808808
lambda: jwt.decode(token, 'secret', issuer=issuer))
809809

810810
def test_raise_exception_token_without_issuer(self):
@@ -817,7 +817,7 @@ def test_raise_exception_token_without_issuer(self):
817817
token = jwt.encode(payload, 'secret')
818818

819819
self.assertRaises(
820-
jwt.InvalidIssuer,
820+
jwt.InvalidIssuerError,
821821
lambda: jwt.decode(token, 'secret', issuer=issuer))
822822

823823
def test_custom_json_encoder(self):

0 commit comments

Comments
 (0)