15
15
import pytest
16
16
17
17
from cryptography .hazmat .primitives .asymmetric import rsa
18
- from jwt import PyJWK , PyJWTError , algorithms
18
+ from jwt import DecodeError , PyJWK , PyJWTError , algorithms
19
19
from zope .interface .verify import verifyClass
20
20
21
21
from tests .common .db .oidc import GitHubPublisherFactory , PendingGitHubPublisherFactory
@@ -104,6 +104,44 @@ def test_verify_jwt_signature(self, monkeypatch):
104
104
)
105
105
]
106
106
107
+ @pytest .mark .parametrize ("exc" , [DecodeError , TypeError ("foo" )])
108
+ def test_verify_jwt_signature_get_key_for_token_fails (self , monkeypatch , exc ):
109
+ service = services .OIDCPublisherService (
110
+ session = pretend .stub (),
111
+ publisher = "fakepublisher" ,
112
+ issuer_url = pretend .stub (),
113
+ audience = "fakeaudience" ,
114
+ cache_url = pretend .stub (),
115
+ metrics = pretend .stub (
116
+ increment = pretend .call_recorder (lambda * a , ** kw : None )
117
+ ),
118
+ )
119
+
120
+ token = pretend .stub ()
121
+ jwt = pretend .stub (decode = pretend .raiser (exc ), PyJWTError = PyJWTError )
122
+ monkeypatch .setattr (service , "_get_key_for_token" , pretend .raiser (exc ))
123
+ monkeypatch .setattr (services , "jwt" , jwt )
124
+ monkeypatch .setattr (
125
+ services .sentry_sdk ,
126
+ "capture_message" ,
127
+ pretend .call_recorder (lambda s : None ),
128
+ )
129
+
130
+ assert service .verify_jwt_signature (token ) is None
131
+ assert service .metrics .increment .calls == [
132
+ pretend .call (
133
+ "warehouse.oidc.verify_jwt_signature.malformed_jwt" ,
134
+ tags = ["publisher:fakepublisher" ],
135
+ )
136
+ ]
137
+
138
+ if exc != DecodeError :
139
+ assert services .sentry_sdk .capture_message .calls == [
140
+ pretend .call (f"JWT backend raised generic error: { exc } " )
141
+ ]
142
+ else :
143
+ assert services .sentry_sdk .capture_message .calls == []
144
+
107
145
@pytest .mark .parametrize ("exc" , [PyJWTError , TypeError ("foo" )])
108
146
def test_verify_jwt_signature_fails (self , monkeypatch , exc ):
109
147
service = services .OIDCPublisherService (
@@ -124,9 +162,11 @@ def test_verify_jwt_signature_fails(self, monkeypatch, exc):
124
162
service , "_get_key_for_token" , pretend .call_recorder (lambda t : key )
125
163
)
126
164
monkeypatch .setattr (services , "jwt" , jwt )
127
-
128
- sentry_sdk = pretend .stub (capture_message = pretend .call_recorder (lambda s : None ))
129
- monkeypatch .setattr (services , "sentry_sdk" , sentry_sdk )
165
+ monkeypatch .setattr (
166
+ services .sentry_sdk ,
167
+ "capture_message" ,
168
+ pretend .call_recorder (lambda s : None ),
169
+ )
130
170
131
171
assert service .verify_jwt_signature (token ) is None
132
172
assert service .metrics .increment .calls == [
@@ -137,11 +177,11 @@ def test_verify_jwt_signature_fails(self, monkeypatch, exc):
137
177
]
138
178
139
179
if exc != PyJWTError :
140
- assert sentry_sdk .capture_message .calls == [
141
- pretend .call (f"JWT verify raised generic error: { exc } " )
180
+ assert services . sentry_sdk .capture_message .calls == [
181
+ pretend .call (f"JWT backend raised generic error: { exc } " )
142
182
]
143
183
else :
144
- assert sentry_sdk .capture_message .calls == []
184
+ assert services . sentry_sdk .capture_message .calls == []
145
185
146
186
def test_find_publisher (self , monkeypatch ):
147
187
service = services .OIDCPublisherService (
0 commit comments