package org.opennaas.extensions.router.model.utils; import java.io.IOException; import java.util.regex.Pattern; import com.google.common.net.InetAddresses; /** * It is used to parse different messages * * @author Carlos Baez Ruiz */ public class IPUtilsHelper { private static final String IP_ADDRESS_PATTERN = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; public static long ipv4StringToLong(String ip) throws IOException { return ModelHelper.ipv4StringToLong(ip); } public static String ipv4LongToString(long ip) throws IOException { return ModelHelper.ipv4LongToString(ip); } public static short[] parseStrIPToBytesIP(String IP) { short[] newIP = new short[4]; String[] splittedIP = IP.split("\\."); newIP[0] = Short.parseShort(splittedIP[0]); newIP[1] = Short.parseShort(splittedIP[1]); newIP[2] = Short.parseShort(splittedIP[2]); newIP[3] = Short.parseShort(splittedIP[3]); return newIP; } public static int parseAddressToInt(String address) { String[] ipAddress = address.split("\\."); int bitPrefixA = Integer.parseInt(ipAddress[0]) << 24; int bitPrefixB = bitPrefixA | (Integer.parseInt(ipAddress[1]) << 16); int bitPrefixC = bitPrefixB | (Integer.parseInt(ipAddress[2]) << 8); int result = bitPrefixC | (Integer.parseInt(ipAddress[3])); return result; } public static String ipAddressAndMaskToComposedIPAddress(String ipAddress, String mask) { return ipAddress + "/" + parseLongToShortIpv4NetMask(mask); } public static String[] composedIPAddressToIPAddressAndMask(String composedIPAddress) { String[] parts = composedIPAddress.split("\\/"); if (parts.length > 1) { parts[1] = parseShortToLongIpv4NetMask(parts[1]); } return parts; } /* extra methods */ public static String parseShortToLongIpv4NetMask(String netmask) { String netmaskResult = ""; int intNetmask = 0; try { intNetmask = Integer.parseInt(netmask); } catch (Exception e) { return netmask; } if (intNetmask <= 0) return "0.0.0.0"; if (intNetmask >= 32) return "255.255.255.255"; // create the mask in bits int andMask = 0x000000ff; int bitNetmask = 0xffffffff << (32 - intNetmask); int bitprefixA = ((bitNetmask >> 24) & andMask); int bitprefixB = ((bitNetmask >> 16) & andMask); int bitprefixC = ((bitNetmask >> 8) & andMask); int bitprefixD = ((bitNetmask >> 0) & andMask); /* parse to string */ netmaskResult = String.valueOf(bitprefixA) + "." + String.valueOf(bitprefixB) + "." + String.valueOf(bitprefixC) + "." + String .valueOf(bitprefixD); return netmaskResult; } public static String parseLongToShortIpv4NetMask(String netmask) { int MAX_MASK = 32; String[] arrayLongNetmask = netmask.split("\\."); int bitPrefixA = Integer.parseInt(arrayLongNetmask[0]) << 24; int bitPrefixB = bitPrefixA | (Integer.parseInt(arrayLongNetmask[1]) << 16); int bitPrefixC = bitPrefixB | (Integer.parseInt(arrayLongNetmask[2]) << 8); int bitPrefixD = bitPrefixC | (Integer.parseInt(arrayLongNetmask[3])); if (bitPrefixD == 0) return "0"; int cont = 0; while ((bitPrefixD % 2) == 0) { ++cont; bitPrefixD = bitPrefixD / 2; } String resultMask = String.valueOf(MAX_MASK - cont); return resultMask; } /** * Check for a pattern [0..255].[0..255].[0..255].[0..255] * * @param ipAddress * @return false if don't find the pattern */ public static boolean validateIpAddressPattern(String ipAddress) { return ipAddress.matches(IP_ADDRESS_PATTERN); } public static boolean validateAnIpAddressWithRegularExpression(String iPaddress) { final Pattern IP_PATTERN = Pattern.compile("b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).)" + "{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b"); return IP_PATTERN.matcher(iPaddress).matches(); } public static boolean validateIPv6Address(String ipAddress) { return InetAddresses.isInetAddress(ipAddress); } public static boolean isIPValidAddress(String ipAddress) { return (isIPv4ValidAddress(ipAddress) || isIPv6ValidAddress(ipAddress)); } public static boolean isIPv4ValidAddress(String ipAddress) { if (ipAddress.split("/").length != 2) return false; String ip = getAddressFromIP(ipAddress); String mask = getPrefixFromIp(ipAddress); boolean validIP = validateIpAddressPattern(ip); boolean validMask = validateSubnetMask(mask); return (validIP && validMask); } public static boolean validateSubnetMask(String mask) { int maskSize = Integer.valueOf(mask); if ((maskSize < 0) || (maskSize > 32)) return false; return true; } public static boolean isIPv6ValidAddress(String ipAddress) { if (ipAddress.split("/").length != 2) return false; String ip = getAddressFromIP(ipAddress); String preffix = getPrefixFromIp(ipAddress); boolean validIP = validateIPv6Address(ip); boolean validPrefix = validateIPv6Prefix(Short.valueOf(preffix)); return (validIP && validPrefix); } public static boolean validateIPv6Prefix(Short prefixLength) { if (prefixLength < 0 || prefixLength > 128) return false; return true; } public static String getAddressFromIP(String ip) { return ip.split("/")[0]; } public static String getPrefixFromIp(String ip) { return ip.split("/")[1]; } public static boolean isIPWithoutMaskValidAddress(String ipAddress) { return (validateIPv6Address(ipAddress) || validateIpAddressPattern(ipAddress)); } // TODO test for simplified addresses public static String parseShortToLongIPv6Prefix(String address, short prefix) { if (!validateIpAddressPattern(address) && (validateIPv6Address(address)) && (validateIPv6Prefix(prefix))) { if (prefix == 0) return "0:0:0:0:0:0:0:0"; if (prefix == 16) return address.split(":")[0]; if (prefix == 32) return address.split(":")[0] + ":" + address.split(":")[1]; if (prefix == 48) return address.split(":")[0] + ":" + address.split(":")[1] + ":" + address.split(":")[2]; if (prefix == 64) return address.split(":")[0] + ":" + address.split(":")[1] + ":" + address.split(":")[2] + ":" + address.split(":")[3]; if (prefix == 80) return address.split(":")[0] + ":" + address.split(":")[1] + ":" + address.split(":")[2] + ":" + address.split(":")[3] + ":" + address .split(":")[4]; if (prefix == 96) return address.split(":")[0] + ":" + address.split(":")[1] + ":" + address.split(":")[2] + ":" + address.split(":")[3] + ":" + address .split(":")[4] + ":" + address.split(":")[5]; if (prefix == 112) return address.split(":")[0] + ":" + address.split(":")[1] + ":" + address.split(":")[2] + ":" + address.split(":")[3] + ":" + address .split(":")[4] + ":" + address.split(":")[5] + ":" + address.split(":")[6]; if (prefix == 128) return address; } return null; } }