Skip to content

Commit f121046

Browse files
authored
Skip ratelimts for admin recovery code burns (#17766)
1 parent 89b83bb commit f121046

File tree

3 files changed

+12
-7
lines changed

3 files changed

+12
-7
lines changed

tests/unit/admin/views/test_users.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1477,12 +1477,15 @@ class TestUserBurnRecoveryCodes:
14771477
def test_burns_recovery_codes(self, db_request, monkeypatch, user_service):
14781478
user = UserFactory.create()
14791479
codes = user_service.generate_recovery_codes(user.id)
1480+
user_service._check_ratelimits = pretend.call_recorder(
1481+
user_service._check_ratelimits
1482+
)
14801483

14811484
# Burn one code in advance
14821485
user.recovery_codes[0].burned = datetime.datetime.now(datetime.UTC)
14831486

14841487
# Provide all the codes, plus one invalid code
1485-
db_request.POST["to_burn"] = f"{'\n'.join(codes)}\ninvalid"
1488+
db_request.POST["to_burn"] = "\n".join(codes) + "\ninvalid"
14861489
db_request.route_path = pretend.call_recorder(lambda *a, **kw: "/foobar")
14871490
db_request.session = pretend.stub(
14881491
flash=pretend.call_recorder(lambda *a, **kw: None)
@@ -1501,6 +1504,7 @@ def test_burns_recovery_codes(self, db_request, monkeypatch, user_service):
15011504
]
15021505
assert result.status_code == 303
15031506
assert result.location == "/foobar"
1507+
assert user_service._check_ratelimits.calls == []
15041508

15051509
def test_no_recovery_codes_provided(self, db_request, monkeypatch, user_service):
15061510
user = UserFactory.create()

warehouse/accounts/services.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -606,13 +606,14 @@ def generate_recovery_codes(self, user_id):
606606

607607
return recovery_codes
608608

609-
def check_recovery_code(self, user_id, code):
609+
def check_recovery_code(self, user_id, code, skip_ratelimits=False):
610610
self._metrics.increment("warehouse.authentication.recovery_code.start")
611611

612-
self._check_ratelimits(
613-
userid=user_id,
614-
tags=["mechanism:check_recovery_code"],
615-
)
612+
if not skip_ratelimits:
613+
self._check_ratelimits(
614+
userid=user_id,
615+
tags=["mechanism:check_recovery_code"],
616+
)
616617

617618
user = self.get_user(user_id)
618619
stored_recovery_code = self.get_recovery_code(user.id, code)

warehouse/admin/views/users.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ def user_burn_recovery_codes(user, request):
619619

620620
for code in codes:
621621
try:
622-
user_service.check_recovery_code(user.id, code)
622+
user_service.check_recovery_code(user.id, code, skip_ratelimits=True)
623623
n_burned += 1
624624
except (BurnedRecoveryCode, InvalidRecoveryCode):
625625
pass

0 commit comments

Comments
 (0)