Validate IPv4 address using Apache Commons Validator
diff --git a/pom.xml b/pom.xml index 99e23a1..e68b307 100644 --- a/pom.xml +++ b/pom.xml
@@ -82,6 +82,7 @@ <cs.aws.sdk.version>1.3.22</cs.aws.sdk.version> <cs.lang.version>2.6</cs.lang.version> <cs.commons-io.version>1.4</cs.commons-io.version> + <cs.commons-validator.version>1.4.0</cs.commons-validator.version> <cs.reflections.version>0.9.8</cs.reflections.version> <cs.java-ipv6.version>0.10</cs.java-ipv6.version> <cs.replace.properties>build/replace.properties</cs.replace.properties> @@ -234,6 +235,11 @@ <version>${cs.codec.version}</version> </dependency> <dependency> + <groupId>commons-validator</groupId> + <artifactId>commons-validator</artifactId> + <version>${cs.commons-validator.version}</version> + </dependency> + <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>${cs.bcprov.version}</version>
diff --git a/server/src/com/cloud/api/ApiServlet.java b/server/src/com/cloud/api/ApiServlet.java index a246025..a4266f7 100644 --- a/server/src/com/cloud/api/ApiServlet.java +++ b/server/src/com/cloud/api/ApiServlet.java
@@ -344,14 +344,14 @@ if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { return null; } - if(NetUtils.isValidIp(ip)) { + if(NetUtils.isValidIp(ip) || NetUtils.isValidIpv6(ip)) { return ip; } //it could be possible to have multiple IPs in HTTP header, this happens if there are multiple proxy in between //the client and the servlet, so parse the client IP String[] ips = ip.split(","); for(String i : ips) { - if(NetUtils.isValidIp(i.trim())) { + if(NetUtils.isValidIp(i.trim()) || NetUtils.isValidIpv6(i.trim())) { return i.trim(); } }
diff --git a/utils/pom.xml b/utils/pom.xml index 6b16b99..7d3210a 100755 --- a/utils/pom.xml +++ b/utils/pom.xml
@@ -59,6 +59,10 @@ <artifactId>cglib-nodep</artifactId> </dependency> <dependency> + <groupId>commons-validator</groupId> + <artifactId>commons-validator</artifactId> + </dependency> + <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>
diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 1f41825..8875bb9 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java
@@ -22,7 +22,6 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.lang.reflect.Array; import java.math.BigInteger; import java.net.InetAddress; import java.net.InterfaceAddress; @@ -43,6 +42,7 @@ import org.apache.commons.lang.SystemUtils; import org.apache.commons.net.util.SubnetUtils; +import org.apache.commons.validator.routines.InetAddressValidator; import org.apache.log4j.Logger; import com.googlecode.ipv6.IPv6Address; @@ -520,35 +520,9 @@ } public static boolean isValidIp(final String ip) { - final String[] ipAsList = ip.split("\\."); + InetAddressValidator validator = InetAddressValidator.getInstance(); - // The IP address must have four octets - if (Array.getLength(ipAsList) != 4) { - return false; - } - - for (int i = 0; i < 4; i++) { - // Each octet must be an integer - final String octetString = ipAsList[i]; - int octet; - try { - octet = Integer.parseInt(octetString); - } catch (final Exception e) { - return false; - } - // Each octet must be between 0 and 255, inclusive - if (octet < 0 || octet > 255) { - return false; - } - - // Each octetString must have between 1 and 3 characters - if (octetString.length() < 1 || octetString.length() > 3) { - return false; - } - } - - // IP is good, return true - return true; + return validator.isValidInet4Address(ip); } public static boolean isValidCIDR(final String cidr) {