package com.subgraph.orchid.data.exitpolicy;
import com.subgraph.orchid.TorParsingException;
import com.subgraph.orchid.data.IPv4Address;
public class Network {
public static final Network ALL_ADDRESSES = new Network(IPv4Address.createFromString("0.0.0.0"), 0, "*");
public static Network createFromString(String networkString) {
final String[] parts = networkString.split("/");
final IPv4Address network = IPv4Address.createFromString(parts[0]);
if(parts.length == 1)
return new Network(network, 32, networkString);
if(parts.length != 2)
throw new TorParsingException("Invalid network CIDR notation: " + networkString);
try {
final int maskBits = Integer.parseInt(parts[1]);
return new Network(network, maskBits, networkString);
} catch(NumberFormatException e) {
throw new TorParsingException("Invalid netblock mask bit value: " + parts[1]);
}
}
private final IPv4Address network;
private final int maskValue;
private final String originalString;
Network(IPv4Address network, int bits, String originalString) {
this.network = network;
this.maskValue = createMask(bits);
this.originalString = originalString;
}
private static int createMask(int maskBits) {
return maskBits == 0 ? 0 : (1 << 31) >> (maskBits - 1);
}
public boolean contains(IPv4Address address) {
return (address.getAddressData() & maskValue) == (network.getAddressData() & maskValue);
}
public String toString() {
return originalString;
}
}