1 package io.getunleash.strategy;
2
3 import io.getunleash.UnleashContext;
4 import io.getunleash.util.IpAddressMatcher;
5 import java.util.Arrays;
6 import java.util.Map;
7 import java.util.Optional;
8 import java.util.regex.Pattern;
9 import java.util.stream.Stream;
10
11 public final class RemoteAddressStrategy implements Strategy {
12 static final String PARAM = "IPs";
13 private static final String STRATEGY_NAME = "remoteAddress";
14 private static final Pattern SPLITTER = Pattern.compile(",");
15
16 @Override
17 public String getName() {
18 return STRATEGY_NAME;
19 }
20
21 @Override
22 public boolean isEnabled(Map<String, String> parameters) {
23 return false;
24 }
25
26 @Override
27 public boolean isEnabled(Map<String, String> parameters, UnleashContext context) {
28 return Optional.ofNullable(parameters.get(PARAM))
29 .map(ips -> Arrays.asList(SPLITTER.split(ips, -1)))
30 .map(
31 ips ->
32 ips.stream()
33 .flatMap(
34 ipAddress ->
35 buildIpAddressMatcher(ipAddress)
36 .map(Stream::of)
37 .orElseGet(Stream::empty))
38 .map(
39 subnet ->
40 context.getRemoteAddress()
41 .map(subnet::matches)
42 .orElse(false))
43 .anyMatch(Boolean.TRUE::equals))
44 .orElse(false);
45 }
46
47 private Optional<IpAddressMatcher> buildIpAddressMatcher(String ipAddress) {
48 try {
49 return Optional.of(new IpAddressMatcher(ipAddress));
50 } catch (IllegalArgumentException ex) {
51 return Optional.empty();
52 }
53 }
54 }
55