package mireka.filter.local; import java.util.ArrayList; import java.util.List; import mireka.address.GlobalPostmaster; import mireka.address.Recipient; import mireka.address.RemotePart; import mireka.address.RemotePartContainingRecipient; import mireka.filter.FilterReply; import mireka.filter.RecipientContext; import mireka.filter.StatelessFilterType; import mireka.filter.local.table.RemotePartSpecification; import org.subethamail.smtp.RejectException; /** * This filter rejects recipient addresses of which remote part is not a local * domain (or address literal). It does not rejects the special, global * postmaster address. */ public class ProhibitRelaying extends StatelessFilterType { private List<RemotePartSpecification> localDomainSpecifications = new ArrayList<RemotePartSpecification>(); @Override public FilterReply verifyRecipient(RecipientContext recipientContext) throws RejectException { Recipient recipient = recipientContext.recipient; if (recipient instanceof GlobalPostmaster) return FilterReply.NEUTRAL; else if (recipient instanceof RemotePartContainingRecipient) return verifyRemotePartContainingRecipient((RemotePartContainingRecipient) recipient); else throw new IllegalArgumentException(); } private FilterReply verifyRemotePartContainingRecipient( RemotePartContainingRecipient recipient) throws RejectException { RemotePart remotePart = recipient.getMailbox().getRemotePart(); for (RemotePartSpecification remotePartSpecification : localDomainSpecifications) { if (remotePartSpecification.isSatisfiedBy(remotePart)) return FilterReply.NEUTRAL; } throw new RejectException(550, "Relaying prohibited, user is not local (" + recipient + ")"); } public void addLocalDomainSpecification( RemotePartSpecification remotePartSpecification) { if (remotePartSpecification == null) throw new NullPointerException(); localDomainSpecifications.add(remotePartSpecification); } public void setLocalDomainSpecifications( List<RemotePartSpecification> specifications) { this.localDomainSpecifications.clear(); for (RemotePartSpecification specification : specifications) addLocalDomainSpecification(specification); } }