Skip to content

Commit

Permalink
Changed to preserve message ID
Browse files Browse the repository at this point in the history
  • Loading branch information
Graeme Pyle committed Oct 7, 2014
1 parent e3ed4d5 commit ea1bfd3
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 78 deletions.
190 changes: 117 additions & 73 deletions src/za/co/graemep/disclaimerinjector/DisclaimerInjectorMilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePartDataSource;
import javax.mail.internet.MimeMessage.RecipientType;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Category;
import org.apache.log4j.Logger;

Expand All @@ -32,14 +34,14 @@
import com.sendmail.jilter.JilterStatus;
import com.sun.mail.smtp.SMTPMessage;


public class DisclaimerInjectorMilter extends JilterHandlerAdapter {

static Logger cat = Logger.getLogger(DisclaimerInjectorMilter.class);
private static Logger log = Logger.getLogger(DisclaimerInjectorMilter.class);

private static final String X_HAS_DUOTRONIC_DISCLAIMER = "X-Has-Duotronic-Disclaimer";
private ByteArrayOutputStream body;
private InternetHeaders headers;
private Rebuilder rebuilder;
private static final String X_HAS_MY_DISCLAIMER = "X-Has-My-Disclaimer";
//private ByteArrayOutputStream body;
//private InternetHeaders headers;

private ByteArrayOutputStream rawHeaders;
private ByteArrayOutputStream rawBody;
Expand All @@ -49,19 +51,16 @@ public class DisclaimerInjectorMilter extends JilterHandlerAdapter {

private String from;


//private boolean hasDisclaimer;


public DisclaimerInjectorMilter() {

headers=new InternetHeaders();
body=new ByteArrayOutputStream();
//headers=new InternetHeaders();
//body=new ByteArrayOutputStream();

rawHeaders=new ByteArrayOutputStream();
rawBody=new ByteArrayOutputStream();

rebuilder=new Rebuilder();

//hasDisclaimer=false;

rcpt=new LinkedList<InternetAddress>();
Expand All @@ -80,43 +79,57 @@ public int getSupportedProcesses() {
return JilterHandler.PROCESS_BODY | JilterHandler.PROCESS_HEADER | JilterHandler.PROCESS_ENVFROM | JilterHandler.PROCESS_ENVRCPT;
}

private enum FromDomain {DUOTRONIC, STREAMLINECNC};
private FromDomain fromDomain;

@Override
public JilterStatus envfrom(String[] argv, Properties properties) {

try {

from = argv[0];
cat.info("From ["+from+"]");
log.info("Got message from ["+from+"]");

fromAddr=new InternetAddress(argv[0]);

if (fromAddr.getAddress().toLowerCase().contains("@duotronic.co.za"))
fromDomain=FromDomain.DUOTRONIC;

else if (fromAddr.getAddress().toLowerCase().contains("@streamlinecnc.co.za"))
fromDomain=FromDomain.STREAMLINECNC;

else
fromDomain=null;

if (!fromAddr.getAddress().toLowerCase().contains("@duotronic.co.za"))
// if (!(from.getAddress().equalsIgnoreCase("[email protected]") || from.getAddress().equalsIgnoreCase("[email protected]") || from.getAddress().equalsIgnoreCase("[email protected]")))
return JilterStatus.SMFIS_ACCEPT;

return JilterStatus.SMFIS_CONTINUE;
if (fromDomain==null || fromAddr.getAddress().toLowerCase().contains("root@"))
return JilterStatus.SMFIS_ACCEPT;
else
return JilterStatus.SMFIS_CONTINUE;

} catch (AddressException e) {
cat.error("Problem with address, accepting", e);

log.error("Problem with address, accepting", e);
return JilterStatus.SMFIS_ACCEPT;

}
}



@Override
public JilterStatus envrcpt(String[] argv, Properties properties) {

try {

rcpt.add(new InternetAddress(argv[0]));

return JilterStatus.SMFIS_CONTINUE;

} catch (AddressException e) {
throw new RuntimeException(e);

log.error("Problem with address, accepting", e);
return JilterStatus.SMFIS_ACCEPT;

}
}

Expand All @@ -125,7 +138,7 @@ public JilterStatus header(String headerf, String headerv) {
// TODO Auto-generated method stub

try {
headers.addHeader(headerf, headerv);
//headers.addHeader(headerf, headerv);

rawHeaders.write(headerf.getBytes());
rawHeaders.write(": ".getBytes());
Expand All @@ -134,109 +147,140 @@ public JilterStatus header(String headerf, String headerv) {

//System.out.println(headerf);


if (headerf.equals(X_HAS_DUOTRONIC_DISCLAIMER)) {
if (headerf.equals(X_HAS_MY_DISCLAIMER)) {
return JilterStatus.SMFIS_ACCEPT;

}

return JilterStatus.SMFIS_CONTINUE;

} catch (IOException e) {
throw new RuntimeException(e);

log.error("IO problem, accepting", e);
return JilterStatus.SMFIS_ACCEPT;

}


}



@Override
public JilterStatus body(ByteBuffer bodyp) {

try {
body.write(bodyp.array());

rawBody.write(bodyp.array());

return JilterStatus.SMFIS_CONTINUE;

} catch (IOException e) {
throw new RuntimeException(e);

log.error("IO problem, accepting", e);
return JilterStatus.SMFIS_ACCEPT;

}

}



@Override
public JilterStatus eom(JilterEOMActions eomActions, Properties properties) {


try {

Properties p=new Properties();
//p.put("mail.smtp.host", "smtp.afrihost.co.za");

//if (!hasDisclaimer) {

Properties p=new Properties();
//p.put("mail.smtp.host", "smtp.afrihost.co.za");


Session session = Session.getDefaultInstance(p);


ByteArrayOutputStream rawMessage=new ByteArrayOutputStream();
rawMessage.write(rawHeaders.toByteArray());
rawMessage.write("\n".getBytes());
rawMessage.write(rawBody.toByteArray());
Session session = Session.getDefaultInstance(p);

ByteArrayOutputStream rawMessage=new ByteArrayOutputStream();
rawMessage.write(rawHeaders.toByteArray());
rawMessage.write("\n".getBytes());
rawMessage.write(rawBody.toByteArray());

log.info("Size is ["+rawMessage.size()+"]");

MimeMessage oldMsg = new MimeMessage(session, new ByteArrayInputStream(rawMessage.toByteArray()));

Rebuilder rebuilder;

if (fromDomain==FromDomain.DUOTRONIC)
rebuilder=new Rebuilder("/etc/disclaimer-duotronic.html","/etc/disclaimer-duotronic.txt");

else if (fromDomain==FromDomain.STREAMLINECNC)
rebuilder=new Rebuilder("/etc/disclaimer-streamlinecnc.html","/etc/disclaimer-streamlinecnc.txt");

else
throw new RuntimeException("Can't rebuild message for unknown domain");

MyMimeMessage newMsg = (MyMimeMessage) rebuilder.rebuildMessage(oldMsg);

newMsg.setHeader(X_HAS_MY_DISCLAIMER, "Yes");


StringBuffer b=new StringBuffer();

for (InternetAddress ia: rcpt) {
b.append(ia);
b.append(" ");
}

log.info("Added disclaimer to message from ["+fromAddr+"] to ["+b.toString()+"]");

String fromStr = fromAddr.toString().toLowerCase();

if (fromStr.contains("[email protected]") || fromStr.contains("[email protected]")) {

// This doesn't work - replacement body is still the same as original body. WTF?

MimeMessage mm=new MimeMessage(session, new ByteArrayInputStream(rawMessage.toByteArray()));
// log.info("Sending is Joe Soap, using experimental body replacement stuff");
//
// mm.saveChanges();
//
// byte[] body = IOUtils.toByteArray( mm.getRawInputStream() );
//
// log.info("Replacement body is [" + new String(body) + "]");
//
// eomActions.replacebody( ByteBuffer.wrap( body ) );
//
// return JilterStatus.SMFIS_CONTINUE;
//

String messageID = oldMsg.getMessageID();
log.info("Old message ID is [" + messageID + "]");

mm=(MimeMessage) rebuilder.rebuildMessage(mm);
newMsg.setMessageID(messageID);

mm.setHeader(X_HAS_DUOTRONIC_DISCLAIMER, "Yes");
Transport.send(newMsg, rcpt.toArray(new InternetAddress[0]));

StringBuffer b=new StringBuffer();
messageID = newMsg.getMessageID();
log.info("New message ID is [" + messageID + "]");

for (InternetAddress ia: rcpt) {
b.append(ia);
b.append(" ");
}

//SMTPMessage smtpMsg=new SMTPMessage(mm);

//smtpMsg.setEnvelopeFrom(from);

return JilterStatus.SMFIS_DISCARD;

cat.info("["+fromAddr+"] to ["+b.toString()+"]");

Transport.send(mm, rcpt.toArray(new InternetAddress[0]));
//Transport.send(smtpMsg, rcpt.toArray(new InternetAddress[0]));
} else {

Transport.send(newMsg, rcpt.toArray(new InternetAddress[0]));

return JilterStatus.SMFIS_DISCARD;

}

//} else

// return JilterStatus.SMFIS_CONTINUE;

} catch (IOException e) {
throw new RuntimeException(e);


log.error("IO problem, accepting", e);
return JilterStatus.SMFIS_ACCEPT;

} catch (MessagingException e) {


if (e.getCause() instanceof UnsupportedDataTypeException) {
// if (e.getCause() instanceof UnsupportedDataTypeException) {

cat.error(e);
cat.info("Not adding disclaimer, allowing original message to pass");

return JilterStatus.SMFIS_ACCEPT;
log.error(e);
log.info("Not adding disclaimer, allowing original message to pass");

return JilterStatus.SMFIS_ACCEPT;

} else
throw new RuntimeException(e);

}
}

Expand Down
32 changes: 32 additions & 0 deletions src/za/co/graemep/disclaimerinjector/MyMimeMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package za.co.graemep.disclaimerinjector;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;

public class MyMimeMessage extends MimeMessage {

private String messageID;

public MyMimeMessage(Session session) {
super(session);
}

public MyMimeMessage(MimeMessage msg) throws MessagingException {
super(msg);
}

@Override
protected void updateMessageID() throws MessagingException {

setHeader("Message-ID", messageID);
}

public String getMessageID() {
return messageID;
}

public void setMessageID(String messageID) {
this.messageID = messageID;
}
}
Loading

0 comments on commit ea1bfd3

Please sign in to comment.