8000 Actually test jose verification output · davedoesdev/python-jwt@3d9747d · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Nov 13, 2023. It is now read-only.

Commit 3d9747d

Browse files
committed
Actually test jose verification output
1 parent e1177de commit 3d9747d

File tree

11 files changed

+90
-70
lines changed

11 files changed

+90
-70
lines changed
13 Bytes
Binary file not shown.

docs/_build/html/.buildinfo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# Sphinx build info version 1
22
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
3-
config: 46d33ac046d743c94c47e2c5f736b5b7
3+
config: 60dd8fdaaeac31bd0b3eae2504a3b513
44
tags: 645f666f9bcd5a90fca523b33c5a78b7

docs/_build/html/_static/documentation_options.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var DOCUMENTATION_OPTIONS = {
22
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
3-
VERSION: '3.3.1',
3+
VERSION: '3.3.2',
44
LANGUAGE: 'None',
55
COLLAPSE_INDEX: false,
66
BUILDER: 'html',

docs/_build/html/genindex.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<head>
66
<meta charset="utf-8" />
77
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8-
<title>Index &#8212; python-jwt 3.3.1 documentation</title>
8+
<title>Index &#8212; python-jwt 3.3.2 documentation</title>
99
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1010
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
1111
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -24,7 +24,7 @@ <h3>Navigation</h3>
2424
<li class="right" >
2525
<a href="py-modindex.html" title="Python Module Index"
2626
>modules</a> |</li>
27-
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.1 documentation</a> &#187;</li>
27+
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.2 documentation</a> &#187;</li>
2828
<li class="nav-item nav-item-this"><a href="">Index</a></li>
2929
</ul>
3030
</div>
@@ -121,7 +121,7 @@ <h3>Navigation</h3>
121121
<li class="right" >
122122
<a href="py-modindex.html" title="Python Module Index"
123123
>modules</a> |</li>
124-
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.1 documentation</a> &#187;</li>
124+
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.2 documentation</a> &#187;</li>
125125
<li class="nav-item nav-item-this"><a href="">Index</a></li>
126126
</ul>
127127
</div>

docs/_build/html/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<head>
66
<meta charset="utf-8" />
77
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8-
<title>python_jwt module &#8212; python-jwt 3.3.1 documentation</title>
8+
<title>python_jwt module &#8212; python-jwt 3.3.2 documentation</title>
99
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1010
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
1111
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -24,7 +24,7 @@ <h3>Navigation</h3>
2424
<li class="right" >
2525
<a href="py-modindex.html" title="Python Module Index"
2626
>modules</a> |</li>
27-
<li class="nav-item nav-item-0"><a href="#">python-jwt 3.3.1 documentation</a> &#187;</li>
27+
<li class="nav-item nav-item-0"><a href="#">python-jwt 3.3.2 documentation</a> &#187;</li>
2828
<li class="nav-item nav-item-this"><a href="">python_jwt module</a></li>
2929
</ul>
3030
</div>
@@ -203,7 +203,7 @@ <h3>Navigation</h3>
203203
<li class="right" >
204204
<a href="py-modindex.html" title="Python Module Index"
205205
>modules</a> |</li>
206-
<li class="nav-item nav-item-0"><a href="#">python-jwt 3.3.1 documentation</a> &#187;</li>
206+
<li class="nav-item nav-item-0"><a href="#">python-jwt 3.3.2 documentation</a> &#187;</li>
207207
<li class="nav-item nav-item-this"><a href="">python_jwt module</a></li>
208208
</ul>
209209
</div>

docs/_build/html/py-modindex.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<head>
66
<meta charset="utf-8" />
77
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8-
<title>Python Module Index &#8212; python-jwt 3.3.1 documentation</title>
8+
<title>Python Module Index &#8212; python-jwt 3.3.2 documentation</title>
99
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1010
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
1111
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -31,7 +31,7 @@ <h3>Navigation</h3>
3131
<li class="right" >
3232
<a href="#" title="Python Module Index"
3333
>modules</a> |</li>
34-
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.1 documentation</a> &#187;</li>
34+
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.2 documentation</a> &#187;</li>
3535
<li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
3636
</ul>
3737
</div>
@@ -89,7 +89,7 @@ <h3>Navigation</h3>
8989
<li class="right" >
9090
<a href="#" title="Python Module Index"
9191
>modules</a> |</li>
92-
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.1 documentation</a> &#187;</li>
92+
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.2 documentation</a> &#187;</li>
9393
<li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
9494
</ul>
9595
</div>

docs/_build/html/search.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<head>
66
<meta charset="utf-8" />
77
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8-
<title>Search &#8212; python-jwt 3.3.1 documentation</title>
8+
<title>Search &#8212; python-jwt 3.3.2 documentation</title>
99
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1010
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
1111

@@ -30,7 +30,7 @@ <h3>Navigation</h3>
3030
<li class="right" >
3131
<a href="py-modindex.html" title="Python Module Index"
3232
>modules</a> |</li>
33-
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.1 documentation</a> &#187;</li>
33+
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.2 documentation</a> &#187;</li>
3434
<li class="nav-item nav-item-this"><a href="">Search</a></li>
3535
</ul>
3636
</div>
@@ -81,7 +81,7 @@ <h3>Navigation</h3>
8181
<li class="right" >
8282
<a href="py-modindex.html" title="Python Module Index"
8383
>modules</a> |</li>
84-
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.1 documentation</a> &#187;</li>
84+
<li class="nav-item nav-item-0"><a href="index.html">python-jwt 3.3.2 documentation</a> &#187;</li>
8585
<li class="nav-item nav-item-this"><a href="">Search</a></li>
8686
</ul>
8787
</div>

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
# The short X.Y version.
5353
version = '3.3'
5454
# The full version, including alpha/beta/rc tags.
55-
release = '3.3.1'
55+
release = '3.3.2'
5656

5757
# The language for content autogenerated by Sphinx. Refer to documentation
5858
# for a list of supported languages.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def read(name):
66

77
setup(
88
name='python_jwt',
9-
version='3.3.1',
9+
version='3.3.2',
1010
description="Module for generating and verifying JSON Web Tokens",
1111
long_description=read('README.md'),
1212
long_description_content_type='text/markdown',

test/fixtures.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ async function generate(time, header, claims, expires, not_before, key) {
3232
}
3333

3434
async function verify(time, sjwt, iat_skew, key, alg) {
35-
const { header, payload } = jwtVerify(sjwt, await import_key(key, alg), {
35+
const { protectedHeader, payload } = await jwtVerify(sjwt, await import_key(key, alg), {
3636
algorithms: [ alg ],
3737
clockTolerance: iat_skew,
3838
currentDate: new Date(time * 1000)
3939
});
40-
process.stdout.write(JSON.stringify([header, payload]));
40+
process.stdout.write(JSON.stringify([protectedHeader, payload]));
4141
}
4242

4343
exports.generate = generate;

test/jwt_spec.py

Lines changed: 72 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,50 @@ def _setup(alg, priv_type, pub_type, exp, iat_skew, nbf, jti_size, keyless, expe
2626
pubk = None if keyless else pub_keys[alg][pub_type]
2727
jtis = {}
2828
tick = timedelta(milliseconds=15000 if pub_type == 'jose' and exp < iat_skew else 1500)
29+
30+
class ClaimsChecker(Vows.Context):
31+
""" Check claims in token """
32+
def topic(self, token):
33+
""" Get just the claims """
34+
_, claims = token
35+
return claims
36+
37+
def payload_keys_should_be_as_expected(self, claims):
38+
""" Check keys """
39+
expect(list(claims.keys())).to_be_like(keys if jti_size or callable(privk) else [key for key in keys if key != 'jti'])
40+
41+
def payload_values_should_match(self, claims):
42+
""" Check values """
43+
for x in payload: #pylint: disable=consider-using-dict-items
44+
expect(claims[x]).to_equal(payload[x])
45+
46+
def jti_size_should_be_as_expected(self, claims):
47+
""" Check jti size """
48+
if jti_size and not callable(privk): # don't assume format of externally-generated JTIs
49+
expect(len(base64url_decode(claims['jti']))).to_equal(jti_size)
50+
51+
class UniqueClaimsChecker(ClaimsChecker):
52+
def jtis_should_be_unique(self, claims):
53+
""" Check jtis """
54+
if jti_size or callable(privk):
55+
expect(is_string(claims['jti'])).to_be_true()
56+
expect(jtis).Not.to_include(claims['jti'])
57+
jtis[claims['jti']] = True
58+
59+
class HeaderChecker(Vows.Context):
60+
""" Check header in token """
61+
def topic(self, token):
62+
""" Get just the header """
63+
header, _ = token
64+
return header
65+
66+
def header_should_be_as_expected(self, header):
67+
""" Check header """
68+
expect(header).to_equal({
69+
'alg': 'none' if keyless else alg,
70+
'typ': 'JWT'
71+
})
72+
2973
@Vows.batch #pylint: disable=unused-variable
3074
class GenerateJWT(Vows.Context): #pylint: disable=unused-variable
3175
""" generate token """
@@ -61,41 +105,10 @@ def topic(self, topic):
61105
_, sjwt = topic
62106
return jwt.process_jwt(sjwt)
63107

64-
class CheckClaims(Vows.Context):
65-
""" Check claims in token """
66-
def topic(self, token):
67-
""" Get just the claims """
68-
_, claims = token
69-
return claims
70-
71-
def payload_keys_should_be_as_expected(self, claims):
72-
""" Check keys """
73-
expect(list(claims.keys())).to_be_like(keys if jti_size or callable(privk) else [key for key in keys if key != 'jti'])
74-
75-
def payload_values_should_match(self, claims):
76-
""" Check values """
77-
for x in payload: #pylint: disable=consider-using-dict-items
78-
expect(claims[x]).to_equal(payload[x])
79-
80-
def jtis_should_be_unique(self, claims):
81-
""" Check jtis """
82-
if jti_size or callable(privk):
83-
expect(is_string(claims['jti'])).to_be_true()
84-
expect(jtis).Not.to_include(claims['jti'])
85-
jtis[claims['jti']] = True
86-
87-
def jti_size_should_be_as_expected(self, claims):
88-
""" Check jti size """
89-
if jti_size and not callable(privk): # don't assume format of externally-generated JTIs
90-
expect(len(base64url_decode(claims['jti']))).to_equal(jti_size)
91-
92-
def header_should_be_as_expected(self, token):
93-
""" Check header """
94-
header, _ = token
95-
expect(header).to_equal({
96-
'alg': 'none' if keyless else alg,
97-
'typ': 'JWT'
98-
})
108+
class CheckClaims(UniqueClaimsChecker):
109+
pass
110+
class CheckHeader(HeaderChecker):
111+
pass
99112

100113
class VerifyJWTWithGeneratedKey(Vows.Context):
101114
""" Verify token doesn't verify with minted key """
@@ -105,14 +118,22 @@ def topic(self, topic):
105118
clock, sjwt = topic
106119
clock_load(clock)
107120
pubk = None if keyless else generated_keys[alg]
108-
return jwt.verify_jwt(sjwt, pubk, ['none'] if keyless else [alg],
109-
timedelta(seconds=iat_skew))
121+
try:
122+
return jwt.verify_jwt(sjwt, pubk, ['none'] if keyless else [alg],
123+
timedelta(seconds=iat_skew))
124+
except:
125+
if keyless and expected:
126+
print(alg, priv_type, pub_type, exp, iat_skew, nbf, keyless, expected)
127+
raise
110128

111-
def should_fail_to_verify(self, r):
112-
""" Should fail to verify with minted key """
113-
if keyless and expected:
114-
expect(r).to_be_instance_of(tuple)
115-
else:
129+
if keyless and expected:
130+
class CheckClaims(ClaimsChecker):
131+
pass
132+
class CheckHeader(HeaderChecker):
133+
pass
134+
else:
135+
def should_fail_to_verify(self, r):
136+
""" Should fail to verify with minted key """
116137
expect(r).to_be_an_error()
117138

118139
class VerifyJWT(Vows.Context):
@@ -127,16 +148,15 @@ def topic(self, topic):
127148
return jwt.verify_jwt(sjwt, pubk, ['none'] if keyless else [alg],
128149
timedelta(seconds=iat_skew))
129150

130-
def should_verify_as_expected(self, r):
131-
""" Check verified or not, as per expected arg """
132-
try:
133-
if expected:
134-
expect(r).to_be_instance_of(tuple)
135-
else:
136-
expect(r).to_be_an_error()
137-
except:
138-
print(alg, priv_type, pub_type, exp, iat_skew, nbf, keyless, expected)
139-
raise
151+
if expected:
152+
class CheckClaims(ClaimsChecker):
153+
pass
154+
class CheckHeader(HeaderChecker):
155+
pass
156+
else:
157+
def should_fail_to_verify(self, r):
158+
""" Should fail to verify, per expected arg """
159+
expect(r).to_be_an_error()
140160

141161
#pylint: disable=W0621,dangerous-default-value
142162
def setup(algs=algs):

0 commit comments

Comments
 (0)
0