package com.subgraph.orchid.directory.router;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import com.subgraph.orchid.RouterMicrodescriptor;
import com.subgraph.orchid.Tor;
import com.subgraph.orchid.crypto.TorPublicKey;
import com.subgraph.orchid.data.HexDigest;
import com.subgraph.orchid.data.IPv4Address;
import com.subgraph.orchid.data.exitpolicy.ExitPorts;
public class RouterMicrodescriptorImpl implements RouterMicrodescriptor {
private IPv4Address address;
private int routerPort;
private TorPublicKey onionKey;
private byte[] ntorOnionKey;
private Set<String> familyMembers = Collections.emptySet();
private ExitPorts acceptPorts;
private ExitPorts rejectPorts;
private String rawDocumentData;
private HexDigest descriptorDigest;
private long lastListed;
private CacheLocation cacheLocation = CacheLocation.NOT_CACHED;
public void setAddress(IPv4Address address) {
this.address = address;
}
public void setRouterPort(int port) {
this.routerPort = port;
}
public void setOnionKey(TorPublicKey onionKey) {
this.onionKey = onionKey;
}
public void setNtorOnionKey(byte[] ntorOnionKey) {
this.ntorOnionKey = ntorOnionKey;
}
public void addFamilyMember(String familyMember) {
if(familyMembers.isEmpty()) {
familyMembers = new HashSet<String>();
}
familyMembers.add(familyMember);
}
public void addAcceptPorts(String portlist) {
acceptPorts = ExitPorts.createAcceptExitPorts(portlist);
}
public void addRejectPorts(String portlist) {
rejectPorts = ExitPorts.createRejectExitPorts(portlist);
}
public void setRawDocumentData(String rawData) {
this.rawDocumentData = rawData;
}
public void setDescriptorDigest(HexDigest descriptorDigest) {
this.descriptorDigest = descriptorDigest;
}
public void setLastListed(long ts) {
this.lastListed = ts;
}
public boolean isValidDocument() {
return (descriptorDigest != null) && (onionKey != null);
}
public String getRawDocumentData() {
return rawDocumentData;
}
public TorPublicKey getOnionKey() {
return onionKey;
}
public byte[] getNTorOnionKey() {
return ntorOnionKey;
}
public IPv4Address getAddress() {
return address;
}
public int getRouterPort() {
return routerPort;
}
public Set<String> getFamilyMembers() {
return familyMembers;
}
public boolean exitPolicyAccepts(IPv4Address address, int port) {
return exitPolicyAccepts(port);
}
public boolean exitPolicyAccepts(int port) {
if(acceptPorts == null) {
return false;
}
if(rejectPorts != null && !rejectPorts.acceptsPort(port)) {
return false;
}
return acceptPorts.acceptsPort(port);
}
public HexDigest getDescriptorDigest() {
return descriptorDigest;
}
public boolean equals(Object o) {
if(!(o instanceof RouterMicrodescriptorImpl))
return false;
final RouterMicrodescriptorImpl other = (RouterMicrodescriptorImpl) o;
if(other.getDescriptorDigest() == null || descriptorDigest == null)
return false;
return other.getDescriptorDigest().equals(descriptorDigest);
}
public int hashCode() {
if(descriptorDigest == null)
return 0;
return descriptorDigest.hashCode();
}
public long getLastListed() {
return lastListed;
}
public void setCacheLocation(CacheLocation location) {
this.cacheLocation = location;
}
public CacheLocation getCacheLocation() {
return cacheLocation;
}
public int getBodyLength() {
return rawDocumentData.length();
}
public ByteBuffer getRawDocumentBytes() {
if(getRawDocumentData() == null) {
return ByteBuffer.allocate(0);
} else {
return ByteBuffer.wrap(getRawDocumentData().getBytes(Tor.getDefaultCharset()));
}
}
}