Skip to content

Commit 0340f25

Browse files
committed
added max-verifies-per-payload configuration property
1 parent 04509b6 commit 0340f25

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package de.muenchen.captchaservice.configuration.captcha;
22

3+
import jakarta.validation.constraints.Min;
34
import jakarta.validation.constraints.NotNull;
45

56
import java.util.List;
67

7-
public record CaptchaSite(String siteKey, String secret, @NotNull List<DifficultyItem> difficultyMap) {
8-
public CaptchaSite(final String siteKey, final String secret, final List<DifficultyItem> difficultyMap) {
8+
public record CaptchaSite(String siteKey, String secret, @Min(1) Integer maxVerifiesPerPayload, @NotNull List<DifficultyItem> difficultyMap) {
9+
public CaptchaSite(final String siteKey, final String secret, final Integer maxVerifiesPerPayload, final List<DifficultyItem> difficultyMap) {
910
this.siteKey = siteKey;
1011
this.secret = secret;
12+
this.maxVerifiesPerPayload = maxVerifiesPerPayload != null ? maxVerifiesPerPayload : 1;
1113
this.difficultyMap = List.copyOf(difficultyMap);
1214
}
1315
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/controller/captcha/CaptchaController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public PostVerifyResponse postVerify(@Valid @RequestBody final PostVerifyRequest
4040
throw new UnauthorizedException("Wrong credentials.");
4141
}
4242

43-
final boolean isValid = captchaService.verify(request.getPayload());
43+
final boolean isValid = captchaService.verify(request.getSiteKey(), request.getPayload());
4444
return new PostVerifyResponse(isValid);
4545
}
4646
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/captcha/CaptchaService.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import com.hazelcast.map.IMap;
55
import de.muenchen.captchaservice.common.HazelcastConstants;
66
import de.muenchen.captchaservice.configuration.captcha.CaptchaProperties;
7+
import de.muenchen.captchaservice.configuration.captcha.CaptchaSite;
78
import de.muenchen.captchaservice.data.SourceAddress;
89
import de.muenchen.captchaservice.service.difficulty.DifficultyService;
910
import lombok.extern.slf4j.Slf4j;
1011
import org.altcha.altcha.Altcha;
1112
import org.apache.commons.codec.digest.DigestUtils;
1213
import org.springframework.stereotype.Service;
1314

15+
import java.util.UUID;
1416
import java.util.concurrent.TimeUnit;
1517

1618
@Service
@@ -43,8 +45,8 @@ public Altcha.Challenge createChallenge(final String siteKey, final SourceAddres
4345
return null;
4446
}
4547

46-
public boolean verify(final Altcha.Payload payload) {
47-
if (isPayloadInvalidated(payload)) {
48+
public boolean verify(final String siteKey, final Altcha.Payload payload) {
49+
if (isPayloadInvalidated(siteKey, payload)) {
4850
return false;
4951
}
5052
try {
@@ -61,12 +63,16 @@ public boolean verify(final Altcha.Payload payload) {
6163

6264
public void invalidatePayload(final Altcha.Payload payload) {
6365
final String payloadHash = getPayloadHash(payload);
64-
invalidatedPayloads.set(payloadHash, "", captchaProperties.captchaTimeoutSeconds(), TimeUnit.SECONDS);
66+
invalidatedPayloads.set(String.format("%s_%s_%s", payloadHash, System.currentTimeMillis(), UUID.randomUUID()), "",
67+
captchaProperties.captchaTimeoutSeconds(), TimeUnit.SECONDS);
6568
log.debug("Invalidated payloadHash: {}", payloadHash);
6669
}
6770

68-
public boolean isPayloadInvalidated(final Altcha.Payload payload) {
69-
return invalidatedPayloads.containsKey(getPayloadHash(payload));
71+
public boolean isPayloadInvalidated(final String siteKey, final Altcha.Payload payload) {
72+
CaptchaSite site = captchaProperties.sites().get(siteKey);
73+
String payloadHash = getPayloadHash(payload);
74+
final long payloadHashCount = invalidatedPayloads.keySet().stream().filter(s -> s.startsWith(String.format("%s_", payloadHash))).count();
75+
return payloadHashCount >= site.maxVerifiesPerPayload();
7076
}
7177

7278
private static String getPayloadHash(final Altcha.Payload payload) {

0 commit comments

Comments
 (0)