Skip to content

Commit bb3e6a9

Browse files
authored
Merge branch 'master' into tob-travis-friendly-tokens
2 parents db1a181 + fe4b61d commit bb3e6a9

File tree

10 files changed

+27
-77
lines changed

10 files changed

+27
-77
lines changed

tests/unit/accounts/test_forms.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -615,15 +615,13 @@ def test_creation(self):
615615
user_service = pretend.stub()
616616
challenge = pretend.stub()
617617
origin = pretend.stub()
618-
icon_url = pretend.stub()
619618
rp_id = pretend.stub()
620619

621620
form = forms.WebAuthnAuthenticationForm(
622621
user_id=user_id,
623622
user_service=user_service,
624623
challenge=challenge,
625624
origin=origin,
626-
icon_url=icon_url,
627625
rp_id=rp_id,
628626
)
629627

@@ -636,7 +634,6 @@ def test_credential_bad_payload(self):
636634
user_service=pretend.stub(),
637635
challenge=pretend.stub(),
638636
origin=pretend.stub(),
639-
icon_url=pretend.stub(),
640637
rp_id=pretend.stub(),
641638
)
642639
assert not form.validate()
@@ -653,7 +650,6 @@ def test_credential_invalid(self):
653650
),
654651
challenge=pretend.stub(),
655652
origin=pretend.stub(),
656-
icon_url=pretend.stub(),
657653
rp_id=pretend.stub(),
658654
)
659655
assert not form.validate()
@@ -670,7 +666,6 @@ def test_credential_valid(self):
670666
),
671667
challenge=pretend.stub(),
672668
origin=pretend.stub(),
673-
icon_url=pretend.stub(),
674669
rp_id=pretend.stub(),
675670
)
676671
assert form.validate()

tests/unit/accounts/test_services.py

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -426,22 +426,15 @@ def test_check_totp_value_user_rate_limited(self, user_service, metrics):
426426
]
427427

428428
@pytest.mark.parametrize(
429-
("challenge", "rp_name", "rp_id", "icon_url"),
430-
(
431-
["fake_challenge", "fake_rp_name", "fake_rp_id", "fake_icon_url"],
432-
[None, None, None, None],
433-
),
429+
("challenge", "rp_name", "rp_id"),
430+
(["fake_challenge", "fake_rp_name", "fake_rp_id"], [None, None, None]),
434431
)
435432
def test_get_webauthn_credential_options(
436-
self, user_service, challenge, rp_name, rp_id, icon_url
433+
self, user_service, challenge, rp_name, rp_id
437434
):
438435
user = UserFactory.create()
439436
options = user_service.get_webauthn_credential_options(
440-
user.id,
441-
challenge=challenge,
442-
rp_name=rp_name,
443-
rp_id=rp_id,
444-
icon_url=icon_url,
437+
user.id, challenge=challenge, rp_name=rp_name, rp_id=rp_id
445438
)
446439

447440
assert options["user"]["id"] == str(user.id)
@@ -450,11 +443,7 @@ def test_get_webauthn_credential_options(
450443
assert options["challenge"] == challenge
451444
assert options["rp"]["name"] == rp_name
452445
assert options["rp"]["id"] == rp_id
453-
454-
if icon_url:
455-
assert options["user"]["icon"] == icon_url
456-
else:
457-
assert "icon" not in options["user"]
446+
assert "icon" not in options["user"]
458447

459448
def test_get_webauthn_assertion_options(self, user_service):
460449
user = UserFactory.create()
@@ -467,10 +456,7 @@ def test_get_webauthn_assertion_options(self, user_service):
467456
)
468457

469458
options = user_service.get_webauthn_assertion_options(
470-
user.id,
471-
challenge="fake_challenge",
472-
icon_url="fake_icon_url",
473-
rp_id="fake_rp_id",
459+
user.id, challenge="fake_challenge", rp_id="fake_rp_id"
474460
)
475461

476462
assert options["challenge"] == "fake_challenge"
@@ -550,7 +536,6 @@ def test_verify_webauthn_assertion(self, user_service, monkeypatch):
550536
pretend.stub(),
551537
challenge=pretend.stub(),
552538
origin=pretend.stub(),
553-
icon_url=pretend.stub(),
554539
rp_id=pretend.stub(),
555540
)
556541
assert updated_sign_count == 2

tests/unit/manage/test_views.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,12 +1138,7 @@ def test_get_webauthn_options(self):
11381138
get_webauthn_challenge=pretend.call_recorder(lambda: "fake_challenge")
11391139
),
11401140
find_service=lambda *a, **kw: user_service,
1141-
registry=pretend.stub(
1142-
settings={
1143-
"site.name": "fake_site_name",
1144-
"warehouse.domain": "fake_domain",
1145-
}
1146-
),
1141+
registry=pretend.stub(settings={"site.name": "fake_site_name"}),
11471142
domain="fake_domain",
11481143
)
11491144

@@ -1157,7 +1152,6 @@ def test_get_webauthn_options(self):
11571152
challenge="fake_challenge",
11581153
rp_name=request.registry.settings["site.name"],
11591154
rp_id=request.domain,
1160-
icon_url=request.registry.settings["warehouse.domain"],
11611155
)
11621156
]
11631157

tests/unit/utils/test_webauthn.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,11 @@ def test_verify_assertion_response(monkeypatch):
8080
challenge="not_a_real_challenge",
8181
user=not_a_real_user,
8282
origin="fake_origin",
83-
icon_url="fake_icon_url",
8483
rp_id="fake_rp_id",
8584
)
8685

8786
assert get_webauthn_users.calls == [
88-
pretend.call(not_a_real_user, icon_url="fake_icon_url", rp_id="fake_rp_id")
87+
pretend.call(not_a_real_user, rp_id="fake_rp_id")
8988
]
9089
assert assertion_cls.calls == [
9190
pretend.call(
@@ -117,6 +116,5 @@ def test_verify_assertion_response_failure(monkeypatch):
117116
challenge="not_a_real_challenge",
118117
user=pretend.stub(),
119118
origin="fake_origin",
120-
icon_url="fake_icon_url",
121119
rp_id="fake_rp_id",
122120
)

warehouse/accounts/forms.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,10 @@ def validate_totp_value(self, field):
268268
class WebAuthnAuthenticationForm(WebAuthnCredentialMixin, _TwoFactorAuthenticationForm):
269269
__params__ = ["credential"]
270270

271-
def __init__(self, *args, challenge, origin, icon_url, rp_id, **kwargs):
271+
def __init__(self, *args, challenge, origin, rp_id, **kwargs):
272272
super().__init__(*args, **kwargs)
273273
self.challenge = challenge
274274
self.origin = origin
275-
self.icon_url = icon_url
276275
self.rp_id = rp_id
277276

278277
def validate_credential(self, field):
@@ -289,7 +288,6 @@ def validate_credential(self, field):
289288
assertion_dict,
290289
challenge=self.challenge,
291290
origin=self.origin,
292-
icon_url=self.icon_url,
293291
rp_id=self.rp_id,
294292
)
295293

warehouse/accounts/interfaces.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,15 +137,13 @@ def add_webauthn(user_id, **kwargs):
137137
Returns None if the user already has this credential.
138138
"""
139139

140-
def get_webauthn_credential_options(
141-
user_id, *, challenge, rp_name, rp_id, icon_url
142-
):
140+
def get_webauthn_credential_options(user_id, *, challenge, rp_name, rp_id):
143141
"""
144142
Returns a dictionary of credential options suitable for beginning the WebAuthn
145143
provisioning process for the given user.
146144
"""
147145

148-
def get_webauthn_assertion_options(user_id, *, challenge, icon_url, rp_id):
146+
def get_webauthn_assertion_options(user_id, *, challenge, rp_id):
149147
"""
150148
Returns a dictionary of assertion options suitable for beginning the WebAuthn
151149
authentication process for the given user.
@@ -160,9 +158,7 @@ def verify_webauthn_credential(credential, *, challenge, rp_id, origin):
160158
webauthn.RegistrationRejectedException on failure.
161159
"""
162160

163-
def verify_webauthn_assertion(
164-
user_id, assertion, *, challenge, origin, icon_url, rp_id
165-
):
161+
def verify_webauthn_assertion(user_id, assertion, *, challenge, origin, rp_id):
166162
"""
167163
Checks whether the given assertion was produced by the given user's WebAuthn
168164
device.

warehouse/accounts/services.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -327,29 +327,25 @@ def check_totp_value(self, user_id, totp_value, *, tags=None):
327327

328328
return valid
329329

330-
def get_webauthn_credential_options(
331-
self, user_id, *, challenge, rp_name, rp_id, icon_url
332-
):
330+
def get_webauthn_credential_options(self, user_id, *, challenge, rp_name, rp_id):
333331
"""
334332
Returns a dictionary of credential options suitable for beginning the WebAuthn
335333
provisioning process for the given user.
336334
"""
337335
user = self.get_user(user_id)
338336

339337
return webauthn.get_credential_options(
340-
user, challenge=challenge, rp_name=rp_name, rp_id=rp_id, icon_url=icon_url
338+
user, challenge=challenge, rp_name=rp_name, rp_id=rp_id
341339
)
342340

343-
def get_webauthn_assertion_options(self, user_id, *, challenge, icon_url, rp_id):
341+
def get_webauthn_assertion_options(self, user_id, *, challenge, rp_id):
344342
"""
345343
Returns a dictionary of assertion options suitable for beginning the WebAuthn
346344
authentication process for the given user.
347345
"""
348346
user = self.get_user(user_id)
349347

350-
return webauthn.get_assertion_options(
351-
user, challenge=challenge, icon_url=icon_url, rp_id=rp_id
352-
)
348+
return webauthn.get_assertion_options(user, challenge=challenge, rp_id=rp_id)
353349

354350
def verify_webauthn_credential(self, credential, *, challenge, rp_id, origin):
355351
"""
@@ -375,7 +371,7 @@ def verify_webauthn_credential(self, credential, *, challenge, rp_id, origin):
375371
return validated_credential
376372

377373
def verify_webauthn_assertion(
378-
self, user_id, assertion, *, challenge, origin, icon_url, rp_id
374+
self, user_id, assertion, *, challenge, origin, rp_id
379375
):
380376
"""
381377
Checks whether the given assertion was produced by the given user's WebAuthn
@@ -387,12 +383,7 @@ def verify_webauthn_assertion(
387383
user = self.get_user(user_id)
388384

389385
return webauthn.verify_assertion_response(
390-
assertion,
391-
challenge=challenge,
392-
user=user,
393-
origin=origin,
394-
icon_url=icon_url,
395-
rp_id=rp_id,
386+
assertion, challenge=challenge, user=user, origin=origin, rp_id=rp_id
396387
)
397388

398389
def add_webauthn(self, user_id, **kwargs):

warehouse/accounts/views.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,7 @@ def webauthn_authentication_options(request):
252252
userid = two_factor_data.get("userid")
253253
user_service = request.find_service(IUserService, context=None)
254254
return user_service.get_webauthn_assertion_options(
255-
userid,
256-
challenge=request.session.get_webauthn_challenge(),
257-
icon_url=request.registry.settings.get("warehouse.domain", request.domain),
258-
rp_id=request.domain,
255+
userid, challenge=request.session.get_webauthn_challenge(), rp_id=request.domain
259256
)
260257

261258

@@ -288,7 +285,6 @@ def webauthn_authentication_validate(request):
288285
user_service=user_service,
289286
challenge=request.session.get_webauthn_challenge(),
290287
origin=request.host_url,
291-
icon_url=request.registry.settings.get("warehouse.domain", request.domain),
292288
rp_id=request.domain,
293289
)
294290

warehouse/manage/views.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,9 +474,6 @@ def webauthn_provision_options(self):
474474
challenge=self.request.session.get_webauthn_challenge(),
475475
rp_name=self.request.registry.settings["site.name"],
476476
rp_id=self.request.domain,
477-
icon_url=self.request.registry.settings.get(
478-
"warehouse.domain", self.request.domain
479-
),
480477
)
481478

482479
@view_config(

warehouse/utils/webauthn.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class RegistrationRejectedException(Exception):
3232
WebAuthnCredential = pywebauthn.WebAuthnCredential
3333

3434

35-
def _get_webauthn_users(user, *, icon_url, rp_id):
35+
def _get_webauthn_users(user, *, rp_id):
3636
"""
3737
Returns a webauthn.WebAuthnUser instance corresponding
3838
to the given user model, with properties suitable for
@@ -43,7 +43,7 @@ def _get_webauthn_users(user, *, icon_url, rp_id):
4343
str(user.id),
4444
user.username,
4545
user.name,
46-
icon_url,
46+
None,
4747
credential.credential_id,
4848
credential.public_key,
4949
credential.sign_count,
@@ -74,25 +74,25 @@ def generate_webauthn_challenge():
7474
return _webauthn_b64encode(os.urandom(32)).decode()
7575

7676

77-
def get_credential_options(user, *, challenge, rp_name, rp_id, icon_url):
77+
def get_credential_options(user, *, challenge, rp_name, rp_id):
7878
"""
7979
Returns a dictionary of options for credential creation
8080
on the client side.
8181
"""
8282
options = pywebauthn.WebAuthnMakeCredentialOptions(
83-
challenge, rp_name, rp_id, str(user.id), user.username, user.name, icon_url
83+
challenge, rp_name, rp_id, str(user.id), user.username, user.name, None
8484
)
8585

8686
return options.registration_dict
8787

8888

89-
def get_assertion_options(user, *, challenge, icon_url, rp_id):
89+
def get_assertion_options(user, *, challenge, rp_id):
9090
"""
9191
Returns a dictionary of options for assertion retrieval
9292
on the client side.
9393
"""
9494
options = pywebauthn.WebAuthnAssertionOptions(
95-
_get_webauthn_users(user, icon_url=icon_url, rp_id=rp_id), challenge
95+
_get_webauthn_users(user, rp_id=rp_id), challenge
9696
)
9797

9898
return options.assertion_dict
@@ -120,15 +120,15 @@ def verify_registration_response(response, challenge, *, rp_id, origin):
120120
raise RegistrationRejectedException(str(e))
121121

122122

123-
def verify_assertion_response(assertion, *, challenge, user, origin, icon_url, rp_id):
123+
def verify_assertion_response(assertion, *, challenge, user, origin, rp_id):
124124
"""
125125
Validates the challenge and assertion information
126126
sent from the client during authentication.
127127
128128
Returns an updated signage count on success.
129129
Raises AuthenticationRejectedException on failure.
130130
"""
131-
webauthn_users = _get_webauthn_users(user, icon_url=icon_url, rp_id=rp_id)
131+
webauthn_users = _get_webauthn_users(user, rp_id=rp_id)
132132
cred_ids = [cred.credential_id for cred in webauthn_users]
133133
encoded_challenge = _webauthn_b64encode(challenge.encode()).decode()
134134

0 commit comments

Comments
 (0)