Enumerate rate limit challenge options
This commit is contained in:
parent
2b07a21477
commit
6af4d41322
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue