Enumerate rate limit challenge options

This commit is contained in:
Jon Chambers 2025-04-01 10:49:11 -04:00 committed by Jon Chambers
parent 2b07a21477
commit 6af4d41322
3 changed files with 28 additions and 10 deletions

View File

@ -0,0 +1,21 @@
/*
* Copyright 2025 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.limits;
public enum RateLimitChallengeOption {
CAPTCHA("captcha"),
PUSH_CHALLENGE("pushChallenge");
private final String apiName;
RateLimitChallengeOption(final String apiName) {
this.apiName = apiName;
}
public String getApiName() {
return apiName;
}
}

View File

@ -13,26 +13,23 @@ public class RateLimitChallengeOptionManager {
private final RateLimiters rateLimiters; private final RateLimiters rateLimiters;
public static final String OPTION_CAPTCHA = "captcha";
public static final String OPTION_PUSH_CHALLENGE = "pushChallenge";
public RateLimitChallengeOptionManager(final RateLimiters rateLimiters) { public RateLimitChallengeOptionManager(final RateLimiters rateLimiters) {
this.rateLimiters = rateLimiters; this.rateLimiters = rateLimiters;
} }
public List<String> getChallengeOptions(final Account account) { public List<RateLimitChallengeOption> getChallengeOptions(final Account account) {
final List<String> options = new ArrayList<>(2); final List<RateLimitChallengeOption> options = new ArrayList<>(2);
if (rateLimiters.getCaptchaChallengeAttemptLimiter().hasAvailablePermits(account.getUuid(), 1) && if (rateLimiters.getCaptchaChallengeAttemptLimiter().hasAvailablePermits(account.getUuid(), 1) &&
rateLimiters.getCaptchaChallengeSuccessLimiter().hasAvailablePermits(account.getUuid(), 1)) { rateLimiters.getCaptchaChallengeSuccessLimiter().hasAvailablePermits(account.getUuid(), 1)) {
options.add(OPTION_CAPTCHA); options.add(RateLimitChallengeOption.CAPTCHA);
} }
if (rateLimiters.getPushChallengeAttemptLimiter().hasAvailablePermits(account.getUuid(), 1) && if (rateLimiters.getPushChallengeAttemptLimiter().hasAvailablePermits(account.getUuid(), 1) &&
rateLimiters.getPushChallengeSuccessLimiter().hasAvailablePermits(account.getUuid(), 1)) { rateLimiters.getPushChallengeSuccessLimiter().hasAvailablePermits(account.getUuid(), 1)) {
options.add(OPTION_PUSH_CHALLENGE); options.add(RateLimitChallengeOption.PUSH_CHALLENGE);
} }
return options; return options;

View File

@ -64,15 +64,15 @@ class RateLimitChallengeOptionManagerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getUuid()).thenReturn(UUID.randomUUID()); when(account.getUuid()).thenReturn(UUID.randomUUID());
final List<String> options = rateLimitChallengeOptionManager.getChallengeOptions(account); final List<RateLimitChallengeOption> options = rateLimitChallengeOptionManager.getChallengeOptions(account);
assertEquals(expectedLength, options.size()); assertEquals(expectedLength, options.size());
if (expectCaptcha) { if (expectCaptcha) {
assertTrue(options.contains(RateLimitChallengeOptionManager.OPTION_CAPTCHA)); assertTrue(options.contains(RateLimitChallengeOption.CAPTCHA));
} }
if (expectPushChallenge) { if (expectPushChallenge) {
assertTrue(options.contains(RateLimitChallengeOptionManager.OPTION_PUSH_CHALLENGE)); assertTrue(options.contains(RateLimitChallengeOption.PUSH_CHALLENGE));
} }
} }