| | |
| | | import de.hsadmin.mods.pac.Pac; |
| | | |
| | | public class EMailAddressProcessorFactory implements EntityProcessorFactory { |
| | | |
| | | |
| | | public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em, T entity) { |
| | | // TODO: combine both keys in a single call (optimization) |
| | | EMailAddress email = (EMailAddress) entity; |
| | | Pac pac = email.getDomain().getUser().getPac(); |
| | | CompoundProcessor cp = new CompoundProcessor(); |
| | | cp.appendProcessor(new ShellProcessor( "postmap -r -i /etc/postfix-mailin/virtual", |
| | | email.getFullDomain() + " -" ) ); |
| | | Config config = Config.getInstance(); |
| | | cp.appendProcessor(new ShellProcessor( "postmap -r -i /etc/postfix-mailin/virtual", |
| | | email.getEMailAddress() + " " + email.getTarget() ) ); |
| | | cp.appendProcessor( |
| | | new ShellProcessor("postmap -r -i /etc/postfix-mailin/virtual", email.getFullDomain() + " -")); |
| | | cp.appendProcessor(new ShellProcessor("postmap -r -i /etc/postfix-mailin/virtual", |
| | | email.getEMailAddress() + " " + email.getTarget())); |
| | | WaitingTasksProcessor waitingTasksProcessor = new WaitingTasksProcessor(cp); |
| | | Config config = Config.getInstance(); |
| | | for (String queueName : config.getProperty("queues.mail").split(",")) { |
| | | waitingTasksProcessor.appendProcessor(queueName, new ShellProcessor( "postmap -r -i /etc/postfix-mailin/relayrecipients", |
| | | email.getEMailAddress() + " anything" ), "Add to relayrecipients" ); |
| | | } |
| | | if (emailAddressCount(em, email) <= 1) { |
| | | String domName = email.getDomain().getName(); |
| | | for (String queueName : config.getProperty("queues.mail").split(",")) { |
| | | waitingTasksProcessor.appendProcessor(queueName, createMailinSetupProcessor(domName, pac), queueName + ".hostsharing.net"); |
| | | } |
| | | waitingTasksProcessor.appendProcessor(queueName, |
| | | new ShellProcessor("postmap -r -i /etc/postfix-mailin/relayrecipients", |
| | | email.getEMailAddress() + " anything"), |
| | | "Add to relayrecipients"); |
| | | } |
| | | return waitingTasksProcessor; |
| | | } |
| | | |
| | | |
| | | public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) { |
| | | // TODO: if update is specified by primary-key or DB query instead of OID, |
| | | // a postmap -d might be neccessary |
| | | // TODO: if update is specified by primary-key or DB query instead of |
| | | // OID, a postmap -d might be neccessary |
| | | return createCreateProcessor(em, entity); |
| | | } |
| | | |
| | | |
| | | public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) { |
| | | CompoundProcessor cp = new CompoundProcessor(); |
| | | EMailAddress email = (EMailAddress) entity; |
| | | cp.appendProcessor( |
| | | new ShellProcessor( "postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/virtual" ) ); |
| | | if (emailAddressCount(em, email) == 0) { |
| | | // last email address removed |
| | | String fullDomain = email.getFullDomain(); |
| | | cp.appendProcessor(new ShellProcessor("postmap -d '" + fullDomain + "' /etc/postfix-mailin/virtual")); |
| | | } |
| | | cp.appendProcessor( |
| | | new ShellProcessor("postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/virtual")); |
| | | Config config = Config.getInstance(); |
| | | WaitingTasksProcessor waitingTasksProcessor = new WaitingTasksProcessor(cp); |
| | | for (String queueName : config.getProperty("queues.mail").split(",")) { |
| | | waitingTasksProcessor.appendProcessor(queueName, |
| | | new ShellProcessor( "postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/relayrecipients" ), |
| | | "Remove from relayrecipients" ); |
| | | } |
| | | if (emailAddressCount(em, email) == 0) { |
| | | // remove the domain from virtual.db |
| | | String fullDomain = email.getFullDomain(); |
| | | cp.appendProcessor( |
| | | new ShellProcessor( "postmap -d '" + fullDomain + "' /etc/postfix-mailin/virtual" ) ); |
| | | for (String queueName : config.getProperty("queues.mail").split(",")) { |
| | | waitingTasksProcessor.appendProcessor(queueName, createMailinDeleteProcessor(fullDomain), queueName + ".hostsharing.net"); |
| | | } |
| | | waitingTasksProcessor.appendProcessor(queueName, |
| | | new ShellProcessor( |
| | | "postmap -d '" + email.getEMailAddress() + "' /etc/postfix-mailin/relayrecipients"), |
| | | "Remove from relayrecipients"); |
| | | } |
| | | return waitingTasksProcessor; |
| | | return waitingTasksProcessor; |
| | | } |
| | | |
| | | private int emailAddressCount(EntityManager em, EMailAddress email) { |
| | | Query query; |
| | | if ( email.getSubdomain() != null ) { |
| | | if (email.getSubdomain() != null) { |
| | | query = em.createQuery("SELECT e FROM EMailAddresses e WHERE e.subdomain=:subdomain AND e.domain=:domain"); |
| | | query.setParameter("subdomain", email.getSubdomain()); |
| | | } |
| | | else { |
| | | query = em.createQuery("SELECT e FROM EMailAddresses e WHERE ( e.subdomain IS NULL OR e.subdomain = '' ) AND e.domain=:domain"); |
| | | } else { |
| | | query = em.createQuery( |
| | | "SELECT e FROM EMailAddresses e WHERE ( e.subdomain IS NULL OR e.subdomain = '' ) AND e.domain=:domain"); |
| | | } |
| | | query.setParameter("domain", email.getDomain()); |
| | | List<?> result = query.getResultList(); |
| | |
| | | return 0; |
| | | } |
| | | return result.size(); |
| | | } |
| | | |
| | | private Processor createMailinSetupProcessor(String domName, Pac pac) { |
| | | String inetAddr = pac.getCurINetAddr().getInetAddr(); |
| | | return |
| | | new ShellProcessor("postmap -r -i /etc/postfix-mailin/transport", |
| | | domName + " smtp:" + inetAddr + ":225\n" + |
| | | "." + domName + " smtp:" + inetAddr + ":225\n"); |
| | | } |
| | | |
| | | private Processor createMailinDeleteProcessor(String domName) { |
| | | return new ShellProcessor( |
| | | "postmap -d '" + domName + "' /etc/postfix-mailin/transport && " + |
| | | "postmap -d '." + domName + "' /etc/postfix-mailin/transport"); |
| | | } |
| | | |
| | | } |