1package eu.siacs.conversations.utils;
2
3import com.google.common.net.InetAddresses;
4import java.net.InetAddress;
5import java.util.regex.Pattern;
6
7public class IP {
8
9 private static final Pattern PATTERN_IPV4 =
10 Pattern.compile(
11 "\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
12 private static final Pattern PATTERN_IPV6_HEX4DECCOMPRESSED =
13 Pattern.compile(
14 "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)"
15 + " ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
16 private static final Pattern PATTERN_IPV6_6HEX4DEC =
17 Pattern.compile(
18 "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
19 private static final Pattern PATTERN_IPV6_HEXCOMPRESSED =
20 Pattern.compile(
21 "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z");
22 private static final Pattern PATTERN_IPV6 =
23 Pattern.compile("\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z");
24
25 public static boolean matches(final String server) {
26 return server != null
27 && (PATTERN_IPV4.matcher(server).matches()
28 || PATTERN_IPV6.matcher(server).matches()
29 || PATTERN_IPV6_6HEX4DEC.matcher(server).matches()
30 || PATTERN_IPV6_HEX4DECCOMPRESSED.matcher(server).matches()
31 || PATTERN_IPV6_HEXCOMPRESSED.matcher(server).matches());
32 }
33
34 public static String wrapIPv6(final String host) {
35 if (InetAddresses.isInetAddress(host)) {
36 final InetAddress inetAddress;
37 try {
38 inetAddress = InetAddresses.forString(host);
39 } catch (final IllegalArgumentException e) {
40 return host;
41 }
42 return InetAddresses.toUriString(inetAddress);
43 } else {
44 return host;
45 }
46 }
47
48 public static String unwrapIPv6(final String host) {
49 if (host.length() > 2 && host.charAt(0) == '[' && host.charAt(host.length() - 1) == ']') {
50 final String ip = host.substring(1, host.length() - 1);
51 if (InetAddresses.isInetAddress(ip)) {
52 return ip;
53 }
54 }
55 return host;
56 }
57}