-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Graeme Pyle
committed
Oct 7, 2014
1 parent
e3ed4d5
commit ea1bfd3
Showing
3 changed files
with
164 additions
and
78 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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; | ||
|
||
|
@@ -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; | ||
|
@@ -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>(); | ||
|
@@ -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; | ||
|
||
} | ||
} | ||
|
||
|
@@ -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()); | ||
|
@@ -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); | ||
|
||
} | ||
} | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
Oops, something went wrong.