Skip to content

Commit 693a30f

Browse files
committed
Sem-Ver: bugfix Catch SubjectDoesNotMatchIssuerException in the frameworks.
Signed-off-by: David Black <[email protected]>
1 parent 4979783 commit 693a30f

File tree

4 files changed

+59
-4
lines changed

4 files changed

+59
-4
lines changed

atlassian_jwt_auth/frameworks/common/asap.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
PublicKeyRetrieverException,
55
NoTokenProvidedError,
66
JtiUniquenessException,
7+
SubjectDoesNotMatchIssuerException,
78
)
89

910

@@ -57,6 +58,10 @@ def _process_asap_token(request, backend, settings, verifier=None):
5758
error_response = backend.get_401_response(
5859
'Unauthorized: Invalid token - duplicate jti', request=request
5960
)
61+
except SubjectDoesNotMatchIssuerException:
62+
error_response = backend.get_401_response(
63+
'Unauthorized: Subject and Issuer do not match', request=request
64+
)
6065

6166
if error_response is not None and settings.ASAP_REQUIRED:
6267
return error_response

atlassian_jwt_auth/frameworks/django/tests/test_django.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ def test_request_subject_does_not_need_to_match_issuer_from_settings(self):
163163
self.test_settings['ASAP_SUBJECT_SHOULD_MATCH_ISSUER'] = False
164164
self.check_response('needed', 'one', 200, subject='different_than_is')
165165

166+
def test_request_subject_and_issue_not_matching(self):
167+
self.check_response(
168+
'needed',
169+
'Subject and Issuer do not match',
170+
401,
171+
subject='different_than_is',
172+
)
173+
166174

167175
class TestAsapDecorator(DjangoAsapMixin, RS256KeyTestMixin, SimpleTestCase):
168176
def test_request_with_valid_token_is_allowed(self):
@@ -294,10 +302,14 @@ def test_request_subject_does_need_to_match_issuer_override_settings(self):
294302
with override_settings(**dict(
295303
self.test_settings, ASAP_SUBJECT_SHOULD_MATCH_ISSUER=False)):
296304
message = 'Issuer does not match the subject'
297-
with self.assertRaisesRegexp(ValueError, message):
298-
response = self.client.get(
299-
reverse('subject_does_need_to_match_issuer'),
300-
HTTP_AUTHORIZATION=b'Bearer ' + token)
305+
response = self.client.get(
306+
reverse('subject_does_need_to_match_issuer'),
307+
HTTP_AUTHORIZATION=b'Bearer ' + token)
308+
self.assertContains(
309+
response,
310+
'Unauthorized: Subject and Issuer do not match',
311+
status_code=401
312+
)
301313

302314
def test_request_subject_does_not_need_to_match_issuer_from_settings(self):
303315
token = create_token(

atlassian_jwt_auth/frameworks/flask/tests/test_flask.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,20 @@ def test_decorated_request_with_invalid_issuer_is_rejected(self):
105105
)
106106
url = '/restricted-to-another-client/'
107107
self.assertEqual(self.send_request(token, url=url).status_code, 403)
108+
109+
def test_request_subject_and_issue_not_matching(self):
110+
token = create_token(
111+
'client-app', 'server-app',
112+
'client-app/key01', self._private_key_pem,
113+
subject='different'
114+
)
115+
self.assertEqual(self.send_request(token).status_code, 401)
116+
117+
def test_request_subject_does_not_need_to_match_issuer_from_settings(self):
118+
self.app.config['ASAP_SUBJECT_SHOULD_MATCH_ISSUER'] = False
119+
token = create_token(
120+
'client-app', 'server-app',
121+
'client-app/key01', self._private_key_pem,
122+
subject='different'
123+
)
124+
self.assertEqual(self.send_request(token).status_code, 200)

atlassian_jwt_auth/frameworks/wsgi/tests/test_wsgi.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,24 @@ def test_request_with_invalid_token_is_rejected(self):
8787
body, resp_info, environ = self.send_request(token=b'notavalidtoken')
8888
self.assertEqual(resp_info['status'], '401 Unauthorized')
8989
self.assertNotIn('ATL_ASAP_CLAIMS', environ)
90+
91+
def test_request_subject_and_issue_not_matching(self):
92+
token = create_token(
93+
'client-app', 'server-app',
94+
'client-app/key01', self._private_key_pem,
95+
subject='different'
96+
)
97+
body, resp_info, environ = self.send_request(token=token)
98+
self.assertEqual(resp_info['status'], '401 Unauthorized')
99+
self.assertNotIn('ATL_ASAP_CLAIMS', environ)
100+
101+
def test_request_subject_does_not_need_to_match_issuer_from_settings(self):
102+
self.config['ASAP_SUBJECT_SHOULD_MATCH_ISSUER'] = False
103+
token = create_token(
104+
'client-app', 'server-app',
105+
'client-app/key01', self._private_key_pem,
106+
subject='different'
107+
)
108+
body, resp_info, environ = self.send_request(token=token)
109+
self.assertEqual(resp_info['status'], '200 OK')
110+
self.assertIn('ATL_ASAP_CLAIMS', environ)

0 commit comments

Comments
 (0)