Skip to content

Commit 0e18606

Browse files
committed
refined configuation and hazelcast configuration
1 parent 8af1b9c commit 0e18606

File tree

8 files changed

+54
-23
lines changed

8 files changed

+54
-23
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package de.muenchen.captchaservice.common;
2+
3+
public class HazelcastConstants {
4+
public static final String INVALIDATED_PAYLOADS = "INVALIDATED_PAYLOADS";
5+
public static final String SOURCE_ADDRESSES = "SOURCE_ADDRESSES";
6+
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
package de.muenchen.captchaservice.configuration.captcha;
22

33
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.NotNull;
45
import org.springframework.boot.context.properties.ConfigurationProperties;
56
import org.springframework.validation.annotation.Validated;
67

78
import java.util.Map;
89

10+
/**
11+
*
12+
* @param hmacKey
13+
* @param sites
14+
* @param captchaTimeoutSeconds How long a created captcha challenge is valid.
15+
* @param sourceAddressWindowSeconds How long a source address is saved for.
16+
*/
917
@ConfigurationProperties(prefix = "captcha")
1018
@Validated
11-
public record CaptchaProperties(@NotBlank String hmacKey, long ttlSeconds, Map<String, CaptchaSite> sites, long sourceAddressWindowSeconds) {
12-
public CaptchaProperties(final String hmacKey, final long ttlSeconds, final Map<String, CaptchaSite> sites, final long sourceAddressWindowSeconds) {
19+
public record CaptchaProperties(@NotBlank String hmacKey, Map<String, CaptchaSite> sites, @NotNull Long captchaTimeoutSeconds,
20+
@NotNull Long sourceAddressWindowSeconds) {
21+
public CaptchaProperties(final String hmacKey, final Map<String, CaptchaSite> sites, final Long captchaTimeoutSeconds,
22+
final Long sourceAddressWindowSeconds) {
1323
this.hmacKey = hmacKey;
14-
this.ttlSeconds = ttlSeconds;
1524
this.sites = sites != null ? Map.copyOf(sites) : Map.of();
25+
this.captchaTimeoutSeconds = captchaTimeoutSeconds;
1626
this.sourceAddressWindowSeconds = sourceAddressWindowSeconds;
1727
}
1828
}
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package de.muenchen.captchaservice.configuration;
1+
package de.muenchen.captchaservice.configuration.hazelcast;
22

33
import com.hazelcast.config.*;
44
import com.hazelcast.core.Hazelcast;
55
import com.hazelcast.core.HazelcastInstance;
6+
import de.muenchen.captchaservice.common.HazelcastConstants;
67
import lombok.RequiredArgsConstructor;
78
import org.springframework.beans.factory.annotation.Autowired;
8-
import org.springframework.beans.factory.annotation.Value;
99
import org.springframework.context.annotation.Bean;
1010
import org.springframework.context.annotation.Configuration;
1111
import org.springframework.context.annotation.Profile;
@@ -22,12 +22,12 @@ public HazelcastInstance hazelcastInstance(@Autowired final Config config) {
2222

2323
@Bean
2424
@Profile({ "!hazelcast-k8s" })
25-
public Config localConfig(@Value("${spring.session.timeout:1000}") final int timeout) {
25+
public Config localConfig() {
2626
final Config hazelcastConfig = new Config();
2727
hazelcastConfig.setClusterName(hazelcastProperties.getClusterName());
2828
hazelcastConfig.setInstanceName(hazelcastProperties.getInstanceName());
2929

30-
addSessionTimeoutToHazelcastConfig(hazelcastConfig, timeout);
30+
addSessionTimeoutToHazelcastConfig(hazelcastConfig);
3131

3232
final NetworkConfig networkConfig = hazelcastConfig.getNetworkConfig();
3333

@@ -42,12 +42,12 @@ public Config localConfig(@Value("${spring.session.timeout:1000}") final int tim
4242

4343
@Bean
4444
@Profile({ "hazelcast-k8s" })
45-
public Config config(@Value("${spring.session.timeout:1000}") final int timeout) {
45+
public Config config() {
4646
final Config hazelcastConfig = new Config();
4747
hazelcastConfig.setClusterName(hazelcastProperties.getClusterName());
4848
hazelcastConfig.setInstanceName(hazelcastProperties.getInstanceName());
4949

50-
addSessionTimeoutToHazelcastConfig(hazelcastConfig, timeout);
50+
addSessionTimeoutToHazelcastConfig(hazelcastConfig);
5151

5252
hazelcastConfig.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
5353
hazelcastConfig.getNetworkConfig().getJoin().getKubernetesConfig().setEnabled(true)
@@ -64,15 +64,19 @@ public Config config(@Value("${spring.session.timeout:1000}") final int timeout)
6464
* time to live.
6565
*
6666
* @param hazelcastConfig to add the timeout.
67-
* @param sessionTimeout for security session.
6867
*/
69-
private void addSessionTimeoutToHazelcastConfig(final Config hazelcastConfig, final int sessionTimeout) {
70-
final MapConfig sessionConfig = new MapConfig();
71-
sessionConfig.setName("SOURCE_ADDRESSES");
72-
sessionConfig.setTimeToLiveSeconds(sessionTimeout);
73-
sessionConfig.getEvictionConfig().setEvictionPolicy(EvictionPolicy.LRU);
68+
private void addSessionTimeoutToHazelcastConfig(final Config hazelcastConfig) {
69+
final MapConfig invalidatedPayloadsConfig = new MapConfig();
70+
invalidatedPayloadsConfig.setName(HazelcastConstants.INVALIDATED_PAYLOADS);
71+
invalidatedPayloadsConfig.setTimeToLiveSeconds(hazelcastProperties.getTimeoutSeconds());
72+
invalidatedPayloadsConfig.getEvictionConfig().setEvictionPolicy(EvictionPolicy.LRU);
73+
hazelcastConfig.addMapConfig(invalidatedPayloadsConfig);
7474

75-
hazelcastConfig.addMapConfig(sessionConfig);
75+
final MapConfig sourceAddressesConfig = new MapConfig();
76+
sourceAddressesConfig.setName(HazelcastConstants.SOURCE_ADDRESSES);
77+
sourceAddressesConfig.setTimeToLiveSeconds(hazelcastProperties.getTimeoutSeconds());
78+
sourceAddressesConfig.getEvictionConfig().setEvictionPolicy(EvictionPolicy.LRU);
79+
hazelcastConfig.addMapConfig(sourceAddressesConfig);
7680
}
7781

7882
}
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package de.muenchen.captchaservice.configuration;
1+
package de.muenchen.captchaservice.configuration.hazelcast;
22

33
import lombok.Data;
44
import org.springframework.boot.context.properties.ConfigurationProperties;
55

66
@Data
7-
@ConfigurationProperties("refarch.hazelcast")
7+
@ConfigurationProperties("hazelcast")
88
public class HazelcastProperties {
99
/**
1010
* Name of the hazelcast cluster.
@@ -19,4 +19,9 @@ public class HazelcastProperties {
1919
* Required for running hazelcast inside kubernetes.
2020
*/
2121
private String serviceName;
22+
23+
/**
24+
* General timeout for Hazelcast data.
25+
*/
26+
private int timeoutSeconds = 86400;
2227
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.hazelcast.core.HazelcastInstance;
44
import com.hazelcast.map.IMap;
5+
import de.muenchen.captchaservice.common.HazelcastConstants;
56
import de.muenchen.captchaservice.configuration.captcha.CaptchaProperties;
67
import de.muenchen.captchaservice.data.SourceAddress;
78
import de.muenchen.captchaservice.service.difficulty.DifficultyService;
@@ -23,7 +24,7 @@ public class CaptchaService {
2324
public CaptchaService(final CaptchaProperties captchaProperties, final DifficultyService difficultyService, final HazelcastInstance hazelcastInstance) {
2425
this.captchaProperties = captchaProperties;
2526
this.difficultyService = difficultyService;
26-
invalidatedPayloads = hazelcastInstance.getMap("INVALIDATED_PAYLOADS");
27+
invalidatedPayloads = hazelcastInstance.getMap(HazelcastConstants.INVALIDATED_PAYLOADS);
2728
}
2829

2930
public Altcha.Challenge createChallenge(final String siteKey, final SourceAddress sourceAddress) {
@@ -33,7 +34,7 @@ public Altcha.Challenge createChallenge(final String siteKey, final SourceAddres
3334
options.algorithm = Altcha.Algorithm.SHA256;
3435
options.hmacKey = captchaProperties.hmacKey();
3536
options.maxNumber = difficulty;
36-
options.expires = (System.currentTimeMillis() / 1000) + captchaProperties.ttlSeconds();
37+
options.expires = (System.currentTimeMillis() / 1000) + captchaProperties.captchaTimeoutSeconds();
3738
try {
3839
return Altcha.createChallenge(options);
3940
} catch (Exception e) {
@@ -60,7 +61,7 @@ public boolean verify(final Altcha.Payload payload) {
6061

6162
public void invalidatePayload(final Altcha.Payload payload) {
6263
final String payloadHash = getPayloadHash(payload);
63-
invalidatedPayloads.set(payloadHash, "", captchaProperties.ttlSeconds(), TimeUnit.SECONDS);
64+
invalidatedPayloads.set(payloadHash, "", captchaProperties.captchaTimeoutSeconds(), TimeUnit.SECONDS);
6465
log.debug("Invalidated payloadHash: {}", payloadHash);
6566
}
6667

captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/difficulty/DifficultyService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.hazelcast.core.HazelcastInstance;
44
import com.hazelcast.map.IMap;
5+
import de.muenchen.captchaservice.common.HazelcastConstants;
56
import de.muenchen.captchaservice.configuration.captcha.CaptchaProperties;
67
import de.muenchen.captchaservice.configuration.captcha.CaptchaSite;
78
import de.muenchen.captchaservice.configuration.captcha.DifficultyItem;
@@ -22,7 +23,7 @@ public class DifficultyService {
2223

2324
public DifficultyService(final CaptchaProperties captchaProperties, final HazelcastInstance hazelcastInstance) {
2425
this.captchaProperties = captchaProperties;
25-
sourceAddresses = hazelcastInstance.getMap("SOURCE_ADDRESSES");
26+
sourceAddresses = hazelcastInstance.getMap(HazelcastConstants.SOURCE_ADDRESSES);
2627
}
2728

2829
public void pokeSourceAddress(final SourceAddress sourceAddress) {

captchaservice-backend/src/main/resources/application-local.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ captcha:
2626
sites:
2727
test:
2828
secret: test
29+
difficulty-map:
30+
- min-visits: 0
31+
max-number: 1000

captchaservice-backend/src/main/resources/application.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,5 @@ info:
5656
captcha:
5757
hmac-key: null
5858
sites: {}
59-
ttl-seconds: 1200
59+
captcha-timeout-seconds: 1200
60+
source-address-window-seconds: 1800

0 commit comments

Comments
 (0)