Author: bago
Date: Thu Mar 31 15:12:10 2011
New Revision: 1087332

URL: http://svn.apache.org/viewvc?rev=1087332&view=rev
Log:
Added forceCRLF parameter (default to true) to DKIMSign and DKIMVerify mailets 
(JDKIM-28)

Modified:
    
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java
    
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMVerify.java
    
james/jdkim/trunk/mailets/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java

Modified: 
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java?rev=1087332&r1=1087331&r2=1087332&view=diff
==============================================================================
--- 
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java
 (original)
+++ 
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java
 Thu Mar 31 15:12:10 2011
@@ -21,6 +21,7 @@ package org.apache.james.jdkim.mailets;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.security.GeneralSecurityException;
 import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
@@ -43,6 +44,8 @@ import org.apache.james.jdkim.exceptions
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
 
+import com.sun.mail.util.CRLFOutputStream;
+
 /**
  * This mailet sign a message using the DKIM protocol
  * If the privateKey is encoded using a password then you can pass
@@ -73,14 +76,15 @@ import org.apache.mailet.base.GenericMai
  * </mailet>
  * </code></pre>
  * 
- * @version CVS $Revision: 713949 $ $Date: 2008-11-14 08:40:21 +0100 (ven, 14
- *          nov 2008) $
- * @since 2.2.0
+ * By default the mailet assume that Javamail will convert LF to CRLF when 
sending 
+ * so will compute the hash using converted newlines. If you don't want this 
+ * behaviout then set forceCRLF attribute to false. 
  */
 public class DKIMSign extends GenericMailet {
 
     private String signatureTemplate;
     private PrivateKey privateKey;
+    private boolean forceCRLF;
 
        /**
         * @return the signatureTemplate
@@ -100,6 +104,7 @@ public class DKIMSign extends GenericMai
         signatureTemplate = getInitParameter("signatureTemplate");
         String privateKeyString = getInitParameter("privateKey");
         String privateKeyPassword = getInitParameter("privateKeyPassword", 
null);
+        forceCRLF = getInitParameter("forceCRLF", true);
         try {
             PKCS8Key pkcs8 = new PKCS8Key(new ByteArrayInputStream(
                     privateKeyString.getBytes()),
@@ -129,8 +134,9 @@ public class DKIMSign extends GenericMai
             MimeMessage message = mail.getMessage();
             Headers headers = new MimeMessageHeaders(message);
             try {
-                message.writeTo(new HeaderSkippingOutputStream(bhj
-                        .getOutputStream()));
+               OutputStream os = new 
HeaderSkippingOutputStream(bhj.getOutputStream());
+               if (forceCRLF) os = new CRLFOutputStream(os);
+                message.writeTo(os);
                 bhj.getOutputStream().close();
             } catch (IOException e) {
                 throw new MessagingException("Exception calculating bodyhash: "

Modified: 
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMVerify.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMVerify.java?rev=1087332&r1=1087331&r2=1087332&view=diff
==============================================================================
--- 
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMVerify.java
 (original)
+++ 
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMVerify.java
 Thu Mar 31 15:12:10 2011
@@ -20,6 +20,7 @@
 package org.apache.james.jdkim.mailets;
 
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.List;
 
 import javax.mail.MessagingException;
@@ -33,6 +34,8 @@ import org.apache.james.jdkim.exceptions
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
 
+import com.sun.mail.util.CRLFOutputStream;
+
 /**
  * This mailet verify a message using the DKIM protocol
  * 
@@ -41,22 +44,28 @@ import org.apache.mailet.base.GenericMai
  * &lt;mailet match=&quot;All&quot; class=&quot;DKIMVerify&quot;&gt;
  * &lt;/mailet&gt;
  * </code></pre>
+ * 
+ * By default the mailet assume that Javamail will use LF instead of CRLF 
+ * so it will verify the hash using converted newlines. If you don't want this 
+ * behaviout then set forceCRLF attribute to false. 
  */
 public class DKIMVerify extends GenericMailet {
 
     public static final String DKIM_AUTH_RESULT_ATTRIBUTE = "jDKIM.AUTHRESULT";
     
     protected DKIMVerifier verifier = null;
+    private boolean forceCRLF;
 
     @Override
     public void init() throws MessagingException {
         verifier = new DKIMVerifier();
+        forceCRLF = getInitParameter("forceCRLF", true);
     }
     
     public void service(Mail mail) throws MessagingException {
         try {
             MimeMessage message = mail.getMessage();
-            List<SignatureRecord> res = verify(verifier, message);
+            List<SignatureRecord> res = verify(verifier, message, forceCRLF);
             if (res == null || res.isEmpty()) {
                 // neutral
                 mail.setAttribute(DKIM_AUTH_RESULT_ATTRIBUTE, "neutral (no 
signatures)");
@@ -79,14 +88,16 @@ public class DKIMVerify extends GenericM
         
     }
 
-       protected static List<SignatureRecord> verify(DKIMVerifier verifier, 
MimeMessage message)
+       protected static List<SignatureRecord> verify(DKIMVerifier verifier, 
MimeMessage message, boolean forceCRLF)
                        throws MessagingException, FailException {
                Headers headers = new MimeMessageHeaders(message);
                BodyHasher bh = verifier.newBodyHasher(headers);
                try {
                    if (bh != null) {
-                       message.writeTo(new HeaderSkippingOutputStream(bh
-                               .getOutputStream()));
+                       OutputStream os = new HeaderSkippingOutputStream(bh
+                               .getOutputStream());
+                       if (forceCRLF) os = new CRLFOutputStream(os);
+                       message.writeTo(os);
                        bh.getOutputStream().close();
                    }
                    

Modified: 
james/jdkim/trunk/mailets/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/mailets/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java?rev=1087332&r1=1087331&r2=1087332&view=diff
==============================================================================
--- 
james/jdkim/trunk/mailets/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java
 (original)
+++ 
james/jdkim/trunk/mailets/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java
 Thu Mar 31 15:12:10 2011
@@ -103,7 +103,7 @@ public class DKIMSignTest extends TestCa
        private List<SignatureRecord> verify(ByteArrayOutputStream rawMessage,
                        MockPublicKeyRecordRetriever 
mockPublicKeyRecordRetriever)
                        throws MessagingException, FailException {
-               List<SignatureRecord> signs = DKIMVerify.verify(new 
DKIMVerifier(mockPublicKeyRecordRetriever), new 
MimeMessage(Session.getDefaultInstance(new Properties()), new 
ByteArrayInputStream(rawMessage.toByteArray())));
+               List<SignatureRecord> signs = DKIMVerify.verify(new 
DKIMVerifier(mockPublicKeyRecordRetriever), new 
MimeMessage(Session.getDefaultInstance(new Properties()), new 
ByteArrayInputStream(rawMessage.toByteArray())), true);
         assertNotNull(signs);
         assertEquals(1, signs.size());
         return signs;



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to