package com.sequenceiq.cloudbreak.validation; import java.util.Arrays; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import org.apache.commons.net.util.SubnetUtils; public class SubnetValidator implements ConstraintValidator<ValidSubnet, String> { @Override public void initialize(ValidSubnet constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null) { return true; } else if (value.isEmpty()) { return false; } try { SubnetUtils.SubnetInfo info = new SubnetUtils(value).getInfo(); int addr = toInt(info.getAddress()); int lowerAddr = toInt(info.getLowAddress()) - 1; if (addr != lowerAddr) { return false; } Ip ip = new Ip(info.getAddress()); return (new Ip("10.0.0.0").compareTo(ip) <= 0 && new Ip("10.255.255.255").compareTo(ip) >= 0) || (new Ip("172.16.0.0").compareTo(ip) <= 0 && new Ip("172.31.255.255").compareTo(ip) >= 0) || (new Ip("192.168.0.0").compareTo(ip) <= 0 && new Ip("192.168.255.255").compareTo(ip) >= 0); } catch (RuntimeException e) { return false; } } private int toInt(String addr) { return Integer.parseInt(addr.replace(".", "")); } private static class Ip implements Comparable<Ip> { private final int[] parts; Ip(String ip) { parts = Arrays.asList(ip.split("\\.")).stream().mapToInt(Integer::parseInt).toArray(); } @Override public int compareTo(Ip o) { if (this == o) { return 0; } for (int i = 0; i < parts.length; i++) { if (parts[i] < o.parts[i]) { return -1; } else if (parts[i] > o.parts[i]) { return 1; } } return 0; } } }