From 72ba98b1b856db84327f2836eac3b4a4b3099bea Mon Sep 17 00:00:00 2001 From: Wido den Hollander Date: Mon, 24 Nov 2014 14:42:02 +0100 Subject: [PATCH] Validate IPv4 address using Apache Commons Validator --- pom.xml | 6 ++++ server/src/com/cloud/api/ApiServlet.java | 4 +-- utils/pom.xml | 4 +++ utils/src/com/cloud/utils/net/NetUtils.java | 32 ++------------------- 4 files changed, 15 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 99e23a1e285..e68b3074882 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,7 @@ 1.3.22 2.6 1.4 + 1.4.0 0.9.8 0.10 build/replace.properties @@ -233,6 +234,11 @@ commons-codec ${cs.codec.version} + + commons-validator + commons-validator + ${cs.commons-validator.version} + org.bouncycastle bcprov-jdk16 diff --git a/server/src/com/cloud/api/ApiServlet.java b/server/src/com/cloud/api/ApiServlet.java index a2460256bd9..a4266f7cf4d 100644 --- a/server/src/com/cloud/api/ApiServlet.java +++ b/server/src/com/cloud/api/ApiServlet.java @@ -344,14 +344,14 @@ public class ApiServlet extends HttpServlet { 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 6b16b99742a..7d3210a9be2 100755 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -58,6 +58,10 @@ cglib cglib-nodep + + commons-validator + commons-validator + commons-codec commons-codec diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 1f41825598a..8875bb93430 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -22,7 +22,6 @@ package com.cloud.utils.net; 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 java.util.regex.Pattern; 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 class NetUtils { } 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) {