package org.free.bacnet4j.util; public class IpAddressUtils{ public static boolean ipWhiteListCheck(String allowedIp, String remoteIp)throws IpWhiteListException{ String remoteIpParts[] = remoteIp.split("\\."); if(remoteIpParts.length != 4) throw new IpWhiteListException((new StringBuilder()).append("Invalid remote IP address: ").append(remoteIp).toString()); else return ipWhiteListCheckImpl(allowedIp, remoteIp, remoteIpParts); } public static boolean ipWhiteListCheck(String allowedIps[], String remoteIp) throws IpWhiteListException{ String remoteIpParts[] = remoteIp.split("\\."); if(remoteIpParts.length != 4) throw new IpWhiteListException((new StringBuilder()).append("Invalid remote IP address: ").append(remoteIp).toString()); for(int i = 0; i < allowedIps.length; i++) if(ipWhiteListCheckImpl(allowedIps[i], remoteIp, remoteIpParts)) return true; return false; } private static boolean ipWhiteListCheckImpl(String allowedIp, String remoteIp, String remoteIpParts[]) throws IpWhiteListException { String allowedIpParts[] = allowedIp.split("\\."); if(allowedIpParts.length != 4) throw new IpWhiteListException((new StringBuilder()).append("Invalid allowed IP address: ").append(allowedIp).toString()); else return validateIpPart(allowedIpParts[0], remoteIpParts[0], allowedIp, remoteIp) && validateIpPart(allowedIpParts[1], remoteIpParts[1], allowedIp, remoteIp) && validateIpPart(allowedIpParts[2], remoteIpParts[2], allowedIp, remoteIp) && validateIpPart(allowedIpParts[3], remoteIpParts[3], allowedIp, remoteIp); } private static boolean validateIpPart(String allowed, String remote, String allowedIp, String remoteIp) throws IpWhiteListException{ if("*".equals(allowed)) return true; int dash = allowed.indexOf('-'); int from; int to; int rem; try{ if(dash == -1) return Integer.parseInt(allowed) == Integer.parseInt(remote); } catch(NumberFormatException e){ throw new IpWhiteListException((new StringBuilder()) .append("Integer parsing error. allowed=") .append(allowedIp).append(", remote=") .append(remoteIp).toString()); } from = Integer.parseInt(allowed.substring(0, dash)); to = Integer.parseInt(allowed.substring(dash + 1)); rem = Integer.parseInt(remote); return from <= rem && rem <= to; } public static String checkIpMask(String ip){ String ipParts[] = ip.split("\\."); if(ipParts.length != 4) return "IP address must have 4 parts"; String message = checkIpMaskPart(ipParts[0]); if(message != null) return message; message = checkIpMaskPart(ipParts[1]); if(message != null) return message; message = checkIpMaskPart(ipParts[2]); if(message != null) return message; message = checkIpMaskPart(ipParts[3]); if(message != null) return message; else return null; } private static String checkIpMaskPart(String part){ int dash; if("*".equals(part)) return null; dash = part.indexOf('-'); if(dash == -1){ int value = Integer.parseInt(part); if(value < 0 || value > 255) return (new StringBuilder()).append("Value out of range in '") .append(part).append("'").toString(); //break MISSING_BLOCK_LABEL_219; } int from; from = Integer.parseInt(part.substring(0, dash)); if(from < 0 || from > 255) return (new StringBuilder()).append("'From' value out of range in '").append(part).append("'").toString(); int to; try{ to = Integer.parseInt(part.substring(dash + 1)); if(to < 0 || to > 255) return (new StringBuilder()).append("'To' value out of range in '").append(part).append("'").toString(); } catch(NumberFormatException e){ return (new StringBuilder()).append("Integer parsing error in '").append(part).append("'").toString(); } if(from > to) return (new StringBuilder()).append("'From' value is greater than 'To' value in '").append(part).append("'").toString(); return null; } public static byte[] toIpAddress(String addr) throws IllegalArgumentException{ if(addr == null) throw new IllegalArgumentException("Invalid address: (null)"); String parts[] = addr.split("\\."); if(parts.length != 4) throw new IllegalArgumentException("IP address must have 4 parts"); byte ip[] = new byte[4]; for(int i = 0; i < 4; i++) try{ int part = Integer.parseInt(parts[i]); if(part < 0 || part > 255) throw new IllegalArgumentException((new StringBuilder()).append("Value out of range in '").append(parts[i]).append("'").toString()); ip[i] = (byte)part; } catch(NumberFormatException e){ throw new IllegalArgumentException((new StringBuilder()).append("Integer parsing error in '").append(parts[i]).append("'").toString()); } return ip; } public static String toIpString(byte b[]) throws IllegalArgumentException{ if(b.length != 4) throw new IllegalArgumentException("IP address must have 4 parts"); StringBuilder sb = new StringBuilder(); sb.append(b[0] & 0xff); for(int i = 1; i < b.length; i++) sb.append('.').append(b[i] & 0xff); return sb.toString(); } }