4
4
import com .hazelcast .map .IMap ;
5
5
import de .muenchen .captchaservice .common .HazelcastConstants ;
6
6
import de .muenchen .captchaservice .configuration .captcha .CaptchaProperties ;
7
+ import de .muenchen .captchaservice .configuration .captcha .CaptchaSite ;
7
8
import de .muenchen .captchaservice .data .SourceAddress ;
8
9
import de .muenchen .captchaservice .service .difficulty .DifficultyService ;
9
10
import lombok .extern .slf4j .Slf4j ;
10
11
import org .altcha .altcha .Altcha ;
11
12
import org .apache .commons .codec .digest .DigestUtils ;
12
13
import org .springframework .stereotype .Service ;
13
14
15
+ import java .util .UUID ;
14
16
import java .util .concurrent .TimeUnit ;
15
17
16
18
@ Service
@@ -43,8 +45,8 @@ public Altcha.Challenge createChallenge(final String siteKey, final SourceAddres
43
45
return null ;
44
46
}
45
47
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 )) {
48
50
return false ;
49
51
}
50
52
try {
@@ -61,12 +63,16 @@ public boolean verify(final Altcha.Payload payload) {
61
63
62
64
public void invalidatePayload (final Altcha .Payload payload ) {
63
65
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 );
65
68
log .debug ("Invalidated payloadHash: {}" , payloadHash );
66
69
}
67
70
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 ();
70
76
}
71
77
72
78
private static String getPayloadHash (final Altcha .Payload payload ) {
0 commit comments