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