package com.subgraph.orchid.data.exitpolicy;
import java.util.ArrayList;
import java.util.List;
import com.subgraph.orchid.data.IPv4Address;
public class ExitPolicy {
private final List<PolicyRule> rules = new ArrayList<PolicyRule>();
public void addAcceptRule(String rule) {
rules.add(PolicyRule.createAcceptFromString(rule));
}
public void addRejectRule(String rule) {
rules.add(PolicyRule.createRejectFromString(rule));
}
public boolean acceptsTarget(ExitTarget target) {
if(target.isAddressTarget())
return acceptsDestination(target.getAddress(), target.getPort());
else
return acceptsPort(target.getPort());
}
public boolean acceptsDestination(IPv4Address address, int port) {
if(address == null)
return acceptsPort(port);
for(PolicyRule r: rules) {
if(r.matchesDestination(address, port))
return r.isAcceptRule();
}
// Default accept (see dir-spec.txt section 2.1, 'accept'/'reject' keywords)
return true;
}
public boolean acceptsPort(int port) {
for(PolicyRule r: rules) {
if(r.matchesPort(port))
return r.isAcceptRule();
}
return false;
}
public String toString() {
final StringBuilder sb = new StringBuilder();
for(PolicyRule r: rules) {
sb.append(r);
sb.append("\n");
}
return sb.toString();
}
}