package org.openstack.atlas.util.ip;
import org.openstack.atlas.util.ip.exception.IPStringConversionException;
import org.openstack.atlas.util.ip.exception.IPException;
import org.openstack.atlas.util.ip.exception.IpTypeMissMatchException;
import org.openstack.atlas.util.converters.BitConverters;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Random;
public class IPUtils {
private static final Pattern subnetPattern = Pattern.compile("^(.*)/(.*)$");
private static Random rnd = new Random();
public static boolean isValidIpv6String(String in) {
IPv6 ip = new IPv6(in);
try {
ip.getBytes();
} catch (IPStringConversionException ex) {
return false;
}
return true;
}
public static final boolean isValidIpv4Subnet(String in) {
String ip;
String subnet;
Matcher ipMatcher;
if (in == null) {
return false;
}
ipMatcher = subnetPattern.matcher(in);
int subnetint;
if (ipMatcher.find()) {
ip = ipMatcher.group(1);
subnet = ipMatcher.group(2);
try {
subnetint = Integer.parseInt(subnet);
if (subnetint < 0 || subnetint > 32 || !isValidIpv4String(ip)) {
return false;
}
return true;
} catch (NumberFormatException e) {
return false;
}
}
return false;
}
public static boolean isValidIpv6Subnet(String in) {
String ip;
String subnet;
Matcher ipMatcher;
if (in == null) {
return false;
}
ipMatcher = subnetPattern.matcher(in);
int subnetint;
if (ipMatcher.find()) {
ip = ipMatcher.group(1);
subnet = ipMatcher.group(2);
try {
subnetint = Integer.parseInt(subnet);
if (subnetint < 0 || subnetint > 128 || !isValidIpv6String(ip)) {
return false;
}
return true;
} catch (NumberFormatException e) {
return false;
}
}
return false;
}
public static boolean isValidIpv4String(String in) {
IPv4 ip = new IPv4(in);
try {
ip.getBytes();
} catch (IPStringConversionException ex) {
return false;
}
return true;
}
public static byte[] invBytes(byte[] mask) {
int i;
byte[] out = new byte[mask.length];
for (i = 0; i < mask.length; i++) {
out[i] = BitConverters.int2ubyte((~mask[i]) & 0xff);
}
return out;
}
public static byte[] opBytes(byte[] a1, byte[] a2, ByteStreamOperation bop) throws IpTypeMissMatchException, IPStringConversionException {
byte[] out;
int i;
if (a1.length != a2.length) {
throw new IpTypeMissMatchException("Incompatible IP Operation");
}
if (bop == null) {
throw new IPStringConversionException("No ByteStrteamOperation defined");
}
out = new byte[a1.length];
for (i = 0; i < a1.length; i++) {
switch (bop) {
case AND:
out[i] = BitConverters.int2ubyte(BitConverters.ubyte2int(a1[i]) & BitConverters.ubyte2int(a2[i]));
break;
case OR:
out[i] = BitConverters.int2ubyte(BitConverters.ubyte2int(a1[i]) | BitConverters.ubyte2int(a2[i]));
break;
case XOR:
out[i] = BitConverters.int2ubyte(BitConverters.ubyte2int(a1[i]) ^ BitConverters.ubyte2int(a2[i]));
break;
}
}
return out;
}
public static byte[] rollMask(int mask, int addrSize) {
byte[] out = new byte[addrSize];
int i;
int bit_i;
int byte_i;
for (i = 0; i < addrSize * 8; i++) {
byte_i = i / 8;
bit_i = i % 8;
if (mask > 0) {
out[byte_i] |= BitConverters.int2ubyte(1 << (7 - bit_i));
mask--;
} else {
out[byte_i] &= BitConverters.int2ubyte((~(1 << (7 - bit_i))) & 0xff);
}
}
return out;
}
public static boolean bytesEqual(byte[] a1, byte[] a2) {
int i;
if (a1.length != a2.length) {
return false;
}
for (i = 0; i < a1.length; i++) {
if (a1[i] != a2[i]) {
return false;
}
}
return true;
}
}