Author: bago
Date: Sun Oct 11 10:19:13 2009
New Revision: 824049

URL: http://svn.apache.org/viewvc?rev=824049&view=rev
Log:
jDKIM refactoring: just looking for a better architecture/organization.

Added:
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java 
  (with props)
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java   
(contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Headers.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java
   (contents, props changed)
      - copied, changed from r823845, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecord.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java
   (contents, props changed)
      - copied, changed from r822477, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecordRetriever.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java
   (contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/SignatureRecord.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java
   (contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/FailException.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java
   (contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PermFailException.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java
   (contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/TempFailException.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java
   (contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/BodyHashJob.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java
   (contents, props changed)
      - copied, changed from r823215, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DNSPublicKeyRecordRetriever.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java   
(contents, props changed)
      - copied, changed from r822477, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Message.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java
   (contents, props changed)
      - copied, changed from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetriever.java
Removed:
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/BodyHashJob.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/CodecUtil.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DNSPublicKeyRecordRetriever.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/FailException.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Headers.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Message.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetriever.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PermFailException.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecord.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecordRetriever.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/SignatureRecord.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/TempFailException.java
    james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/QPTest.java
Modified:
    
james/jdkim/trunk/mailets/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java
    
james/jdkim/trunk/mailets/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMCommon.java
    james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
    
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/DKIMVerifierTest.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/FileBasedTest.java
    james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MessageTest.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MockPublicKeyRecordRetriever.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetrieverTest.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/PublicKeyRecordTest.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
    
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordTest.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=824049&r1=824048&r2=824049&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
 Sun Oct 11 10:19:13 2009
@@ -34,12 +34,11 @@
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.jdkim.BodyHashJob;
-import org.apache.james.jdkim.DKIMCommon;
 import org.apache.james.jdkim.DKIMSigner;
-import org.apache.james.jdkim.Headers;
-import org.apache.james.jdkim.PermFailException;
-import org.apache.james.jdkim.SignatureRecord;
+import org.apache.james.jdkim.api.BodyHasher;
+import org.apache.james.jdkim.api.Headers;
+import org.apache.james.jdkim.api.SignatureRecord;
+import org.apache.james.jdkim.exceptions.PermFailException;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
 
@@ -114,7 +113,7 @@
                DKIMSigner signer = new DKIMSigner(signatureTemplate, 
privateKey);
                SignatureRecord signRecord = 
signer.newSignatureRecord(signatureTemplate);
                try {
-                       BodyHashJob bhj = 
DKIMCommon.prepareBodyHashJob(signRecord, signatureTemplate);
+                       BodyHasher bhj = signer.newBodyHasher(signRecord);
                        MimeMessage message = mail.getMessage();
                        Headers headers = new MimeMessageHeaders(message);
                        try {

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=824049&r1=824048&r2=824049&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
 Sun Oct 11 10:19:13 2009
@@ -34,9 +34,9 @@
 import junit.framework.TestCase;
 
 import org.apache.james.jdkim.DKIMVerifier;
-import org.apache.james.jdkim.FailException;
 import org.apache.james.jdkim.MockPublicKeyRecordRetriever;
-import org.apache.james.jdkim.PermFailException;
+import org.apache.james.jdkim.exceptions.FailException;
+import org.apache.james.jdkim.exceptions.PermFailException;
 import org.apache.mailet.Mail;
 import org.apache.mailet.Mailet;
 import org.apache.mailet.base.test.FakeMail;

Modified: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMCommon.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMCommon.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMCommon.java 
(original)
+++ james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMCommon.java 
Sun Oct 11 10:19:13 2009
@@ -22,8 +22,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.security.Signature;
 import java.security.SignatureException;
 import java.util.HashMap;
@@ -31,18 +29,14 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.james.jdkim.canon.DebugOutputStream;
-import org.apache.james.jdkim.canon.DigestOutputStream;
-import org.apache.james.jdkim.canon.LimitedOutputStream;
-import org.apache.james.jdkim.canon.RelaxedBodyCanonicalizer;
-import org.apache.james.jdkim.canon.SimpleBodyCanonicalizer;
-import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
+import org.apache.james.jdkim.api.Headers;
+import org.apache.james.jdkim.api.SignatureRecord;
 
-public class DKIMCommon {
+public abstract class DKIMCommon {
 
        private static final boolean DEEP_DEBUG = false;
 
-       public static void updateSignature(Signature signature, boolean relaxed,
+       protected static void updateSignature(Signature signature, boolean 
relaxed,
                        CharSequence header, String fv) throws 
SignatureException {
                if (relaxed) {
                        if (DEEP_DEBUG)
@@ -99,22 +93,6 @@
                                signatureStub);
        }
 
-       public SignatureRecord newSignatureRecord(String record) {
-               return new SignatureRecordImpl(record);
-       }
-
-       static OutputStream prepareCanonicalizerOutputStream(int limit,
-                       boolean relaxedBody, OutputStream dout) {
-               OutputStream out = dout;
-               if (limit != -1)
-                       out = new LimitedOutputStream(out, limit);
-               if (relaxedBody)
-                       out = new RelaxedBodyCanonicalizer(out);
-               else
-                       out = new SimpleBodyCanonicalizer(out);
-               return out;
-       }
-
        public static void streamCopy(InputStream bodyIs, OutputStream out)
                        throws IOException {
                byte[] buffer = new byte[2048];
@@ -126,34 +104,4 @@
                out.close();
        }
 
-       public static BodyHashJob prepareBodyHashJob(SignatureRecord sign,
-                       String f) throws NoSuchAlgorithmException {
-               MessageDigest md = 
MessageDigest.getInstance(sign.getHashAlgo().toString());
-               
-               BodyHashJob bhj = new BodyHashJob();
-
-               int limit = sign.getBodyHashLimit();
-
-               // TODO enhance this to use a lookup service.
-               boolean relaxedBody = "relaxed".equals(sign
-                               .getBodyCanonicalisationMethod());
-
-               DigestOutputStream dout = new DigestOutputStream(md);
-               
-               OutputStream out = dout;
-               if (DEEP_DEBUG) out = new DebugOutputStream(out);
-               out = DKIMCommon.prepareCanonicalizerOutputStream(limit,
-                               relaxedBody, out);
-
-               bhj.setSignatureRecord(sign);
-               bhj.setDigestOutputStream(dout);
-               bhj.setOutputStream(out);
-               bhj.setField(f);
-               return bhj;
-       }
-
-       public DKIMCommon() {
-               super();
-       }
-
 }
\ No newline at end of file

Modified: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java 
(original)
+++ james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java 
Sun Oct 11 10:19:13 2009
@@ -32,6 +32,14 @@
 import java.util.List;
 
 import org.apache.commons.codec.binary.Base64;
+import org.apache.james.jdkim.api.BodyHasher;
+import org.apache.james.jdkim.api.Headers;
+import org.apache.james.jdkim.api.SignatureRecord;
+import org.apache.james.jdkim.exceptions.FailException;
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.impl.BodyHasherImpl;
+import org.apache.james.jdkim.impl.Message;
+import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
 import org.apache.james.mime4j.MimeException;
 
 public class DKIMSigner extends DKIMCommon {
@@ -43,7 +51,15 @@
                this.privateKey = privateKey;
                this.signatureRecordTemplate = signatureRecordTemplate;
        }
-       
+
+       public SignatureRecord newSignatureRecord(String record) {
+               return new SignatureRecordImpl(record);
+       }
+
+       public BodyHasher newBodyHasher(SignatureRecord signRecord) throws 
NoSuchAlgorithmException {
+               return new BodyHasherImpl(signRecord);
+       }
+
        public String sign(InputStream is)
                        throws IOException, FailException {
                Message message;
@@ -64,7 +80,7 @@
                        */
                        SignatureRecord srt = 
newSignatureRecord(signatureRecordTemplate);
                        try {
-                               BodyHashJob bhj = 
DKIMCommon.prepareBodyHashJob(srt, "DKIM-Signature: "+signatureRecordTemplate);
+                               BodyHasher bhj = newBodyHasher(srt);
 
                                // simultaneous computation of all the hashes.
                                
DKIMCommon.streamCopy(message.getBodyInputStream(), bhj.getOutputStream());
@@ -79,9 +95,9 @@
                }
        }
 
-       public String sign(Headers message, BodyHashJob bhj)
+       public String sign(Headers message, BodyHasher bhj)
                        throws PermFailException {
-               byte[] computedHash = bhj.getDigesterOutputStream().getDigest();
+               byte[] computedHash = bhj.getDigest();
                String newField = "DKIM-Signature: 
"+signatureRecordTemplate.replaceAll("bh=[^;]*", "bh="+new 
String(Base64.encodeBase64(computedHash)));
 
                List headers = bhj.getSignatureRecord().getHeaders();

Modified: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java 
(original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java 
Sun Oct 11 10:19:13 2009
@@ -27,14 +27,28 @@
 import java.security.Signature;
 import java.security.SignatureException;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.jdkim.api.BodyHasher;
+import org.apache.james.jdkim.api.Headers;
+import org.apache.james.jdkim.api.PublicKeyRecord;
+import org.apache.james.jdkim.api.PublicKeyRecordRetriever;
+import org.apache.james.jdkim.api.SignatureRecord;
 import org.apache.james.jdkim.canon.CompoundOutputStream;
+import org.apache.james.jdkim.exceptions.FailException;
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.exceptions.TempFailException;
+import org.apache.james.jdkim.impl.BodyHasherImpl;
+import org.apache.james.jdkim.impl.DNSPublicKeyRecordRetriever;
+import org.apache.james.jdkim.impl.Message;
+import org.apache.james.jdkim.impl.MultiplexingPublicKeyRecordRetriever;
 import org.apache.james.jdkim.tagvalue.PublicKeyRecordImpl;
+import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
 import org.apache.james.mime4j.MimeException;
 
 public class DKIMVerifier extends DKIMCommon {
@@ -49,11 +63,18 @@
                this.publicKeyRecordRetriever = publicKeyRecordRetriever;
        }
 
-
        protected PublicKeyRecord newPublicKeyRecord(String record) {
                return new PublicKeyRecordImpl(record);
        }
 
+       public SignatureRecord newSignatureRecord(String record) {
+               return new SignatureRecordImpl(record);
+       }
+
+       public BodyHasher newBodyHasher(SignatureRecord signRecord) throws 
NoSuchAlgorithmException {
+               return new BodyHasherImpl(signRecord);
+       }
+
        protected PublicKeyRecordRetriever getPublicKeyRecordRetriever() throws 
PermFailException {
                return publicKeyRecordRetriever;
        }
@@ -83,7 +104,7 @@
        }
 
        /**
-        * @see 
org.apache.james.jdkim.PublicKeyRecord#apply(org.apache.james.jdkim.SignatureRecord)
+        * @see 
org.apache.james.jdkim.api.PublicKeyRecord#apply(org.apache.james.jdkim.api.SignatureRecord)
         */
        public static void apply(PublicKeyRecord pkr, SignatureRecord sign) {
                if 
(!pkr.getGranularityPattern().matcher(sign.getIdentityLocalPart()).matches()) {
@@ -162,7 +183,7 @@
                        // For each DKIM-signature we prepare an hashjob.
                        // We calculate all hashes concurrently so to read
                        // the inputstream only once.
-                       List/* BodyHashJob */ bodyHashJobs = new LinkedList();
+                       Map/* String, BodyHashJob */ bodyHashJobs = new 
HashMap();
                        List/* OutputStream */ outputStreams = new LinkedList();
                        Map/* String, Exception */ signatureExceptions = new 
Hashtable();
                        for (Iterator i = fields.iterator(); i.hasNext(); ) {
@@ -195,9 +216,9 @@
                        
                                                // we track all 
canonicalizations+limit+bodyHash we
                                                // see so to be able to check 
all of them in a single stream run.
-                                               BodyHashJob bhj = 
DKIMCommon.prepareBodyHashJob(sign, fval);
+                                               BodyHasher bhj = 
newBodyHasher(sign);
                                                
-                                               bodyHashJobs.add(bhj);
+                                               bodyHashJobs.put(fval, bhj);
                                                
outputStreams.add(bhj.getOutputStream());
                        
                                        } else {
@@ -235,14 +256,15 @@
                        DKIMCommon.streamCopy(message.getBodyInputStream(), o);
 
                        List/* BodyHashJob */ verifiedSignatures = new 
LinkedList();
-                       for (Iterator i = bodyHashJobs.iterator(); i.hasNext(); 
) {
-                               BodyHashJob bhj = (BodyHashJob) i.next();
+                       for (Iterator i = bodyHashJobs.keySet().iterator(); 
i.hasNext(); ) {
+                               String fval = (String) i.next();
+                               BodyHasher bhj = (BodyHasher) 
bodyHashJobs.get(fval);
        
-                               byte[] computedHash = 
bhj.getDigesterOutputStream().getDigest();
+                               byte[] computedHash = bhj.getDigest();
                                byte[] expectedBodyHash = 
bhj.getSignatureRecord().getBodyHash();
                                
                                if (!Arrays.equals(expectedBodyHash, 
computedHash)) {
-                                       
signatureExceptions.put(bhj.getField().toString(), new 
PermFailException("Computed bodyhash is different from the expected one"));
+                                       signatureExceptions.put(fval, new 
PermFailException("Computed bodyhash is different from the expected one"));
                                } else {
                                        verifiedSignatures.add(bhj);
                                }
@@ -261,7 +283,7 @@
                                        System.out.println("DKIM-Error: 
"+((FailException) signatureExceptions.get(f)).getMessage()+" FIELD: "+f);
                                }
                                for (Iterator i = 
verifiedSignatures.iterator(); i.hasNext(); ) {
-                                       BodyHashJob bhj = (BodyHashJob) 
i.next();
+                                       BodyHasher bhj = (BodyHasher) i.next();
                                        System.out.println("DKIM-Pass: 
"+bhj.getSignatureRecord());
                                }
                        }

Added: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java?rev=824049&view=auto
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java 
(added)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java 
Sun Oct 11 10:19:13 2009
@@ -0,0 +1,33 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jdkim.api;
+
+import java.io.OutputStream;
+
+
+public interface BodyHasher {
+
+       public abstract OutputStream getOutputStream();
+
+       public abstract SignatureRecord getSignatureRecord();
+
+       public abstract byte[] getDigest();
+
+}
\ No newline at end of file

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/BodyHasher.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java 
(from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Headers.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Headers.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Headers.java 
(original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java 
Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.api;
 
 import java.util.List;
 

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/Headers.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java
 (from r823845, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecord.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecord.java&r1=823845&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecord.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java
 Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.api;
 
 import java.security.PublicKey;
 import java.util.List;

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecord.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java
 (from r822477, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecordRetriever.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecordRetriever.java&r1=822477&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PublicKeyRecordRetriever.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java
 Sun Oct 11 10:19:13 2009
@@ -17,10 +17,13 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.api;
 
 import java.util.List;
 
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.exceptions.TempFailException;
+
 public interface PublicKeyRecordRetriever {
        
        /**

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/PublicKeyRecordRetriever.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java
 (from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/SignatureRecord.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/SignatureRecord.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/SignatureRecord.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java
 Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.api;
 
 import java.util.List;
 

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/api/SignatureRecord.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java
 (from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/FailException.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/FailException.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/FailException.java 
(original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java
 Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.exceptions;
 
 public class FailException extends Exception {
 

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/FailException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java
 (from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PermFailException.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PermFailException.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/PermFailException.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java
 Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.exceptions;
 
 public class PermFailException extends FailException {
 

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/PermFailException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java
 (from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/TempFailException.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/TempFailException.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/TempFailException.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java
 Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.exceptions;
 
 public class TempFailException extends FailException {
 

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/exceptions/TempFailException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java
 (from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/BodyHashJob.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/BodyHashJob.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/BodyHashJob.java 
(original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java
 Sun Oct 11 10:19:13 2009
@@ -17,30 +17,84 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.impl;
 
 import java.io.OutputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 
+import org.apache.james.jdkim.api.BodyHasher;
+import org.apache.james.jdkim.api.SignatureRecord;
+import org.apache.james.jdkim.canon.DebugOutputStream;
 import org.apache.james.jdkim.canon.DigestOutputStream;
+import org.apache.james.jdkim.canon.LimitedOutputStream;
+import org.apache.james.jdkim.canon.RelaxedBodyCanonicalizer;
+import org.apache.james.jdkim.canon.SimpleBodyCanonicalizer;
 
-public class BodyHashJob {
+public class BodyHasherImpl implements BodyHasher {
 
+       private static final boolean DEEP_DEBUG = false;
        private SignatureRecord sign;
        private DigestOutputStream digesterOS;
        private OutputStream out;
-       private String field;
 
+       public BodyHasherImpl(SignatureRecord sign) throws 
NoSuchAlgorithmException {
+               MessageDigest md = 
MessageDigest.getInstance(sign.getHashAlgo().toString());
+               
+               int limit = sign.getBodyHashLimit();
+
+               // TODO enhance this to use a lookup service.
+               boolean relaxedBody = "relaxed".equals(sign
+                               .getBodyCanonicalisationMethod());
+
+               DigestOutputStream dout = new DigestOutputStream(md);
+               
+               OutputStream out = dout;
+               if (DEEP_DEBUG) out = new DebugOutputStream(out);
+               out = prepareCanonicalizerOutputStream(limit,
+                               relaxedBody, out);
+
+               setSignatureRecord(sign);
+               setDigestOutputStream(dout);
+               setOutputStream(out);
+       }
+
+       static OutputStream prepareCanonicalizerOutputStream(int limit,
+                       boolean relaxedBody, OutputStream dout) {
+               OutputStream out = dout;
+               if (limit != -1)
+                       out = new LimitedOutputStream(out, limit);
+               if (relaxedBody)
+                       out = new RelaxedBodyCanonicalizer(out);
+               else
+                       out = new SimpleBodyCanonicalizer(out);
+               return out;
+       }
+
+       /**
+        * @see org.apache.james.jdkim.api.BodyHasher#getOutputStream()
+        */
        public OutputStream getOutputStream() {
                return out;
        }
 
+       /**
+        * @see org.apache.james.jdkim.api.BodyHasher#getSignatureRecord()
+        */
        public SignatureRecord getSignatureRecord() {
                return sign;
        }
 
-       public DigestOutputStream getDigesterOutputStream() {
+       private DigestOutputStream getDigesterOutputStream() {
                return digesterOS;
        }
+       
+       /**
+        * @see org.apache.james.jdkim.api.BodyHasher#getDigest()
+        */
+       public byte[] getDigest() {
+               return getDigesterOutputStream().getDigest();
+       }
 
        public void setSignatureRecord(SignatureRecord sign) {
                this.sign = sign;
@@ -54,12 +108,4 @@
                this.out = out;
        }
 
-       public void setField(String f) {
-               this.field = f;
-       }
-       
-       public String getField() {
-               return this.field;
-       }
-
 }

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/BodyHasherImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java
 (from r823215, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DNSPublicKeyRecordRetriever.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DNSPublicKeyRecordRetriever.java&r1=823215&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/DNSPublicKeyRecordRetriever.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java
 Sun Oct 11 10:19:13 2009
@@ -17,12 +17,15 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.impl;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.james.jdkim.api.PublicKeyRecordRetriever;
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.exceptions.TempFailException;
 import org.xbill.DNS.Lookup;
 import org.xbill.DNS.Record;
 import org.xbill.DNS.Resolver;

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/DNSPublicKeyRecordRetriever.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java 
(from r822477, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Message.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Message.java&r1=822477&r2=824049&rev=824049&view=diff
==============================================================================
--- james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/Message.java 
(original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java 
Sun Oct 11 10:19:13 2009
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.impl;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -28,6 +28,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.jdkim.api.Headers;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.io.EOLConvertingInputStream;
 import org.apache.james.mime4j.parser.MimeEntityConfig;

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/Message.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java
 (from r822372, 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetriever.java)
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java?p2=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java&p1=james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetriever.java&r1=822372&r2=824049&rev=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetriever.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java
 Sun Oct 11 10:19:13 2009
@@ -17,12 +17,16 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim;
+package org.apache.james.jdkim.impl;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.jdkim.api.PublicKeyRecordRetriever;
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.exceptions.TempFailException;
+
 public class MultiplexingPublicKeyRecordRetriever implements 
PublicKeyRecordRetriever {
        
        private Map/* String, PublicKeyRecordRetriever */ retrievers;

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/impl/MultiplexingPublicKeyRecordRetriever.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
 Sun Oct 11 10:19:13 2009
@@ -31,7 +31,7 @@
 import java.util.regex.Pattern;
 
 import org.apache.commons.codec.binary.Base64;
-import org.apache.james.jdkim.PublicKeyRecord;
+import org.apache.james.jdkim.api.PublicKeyRecord;
 
 public class PublicKeyRecordImpl extends TagValue implements PublicKeyRecord {
        
@@ -73,7 +73,7 @@
        }
 
        /**
-        * @see 
org.apache.james.jdkim.PublicKeyRecord#isHashMethodSupported(java.lang.CharSequence)
+        * @see 
org.apache.james.jdkim.api.PublicKeyRecord#isHashMethodSupported(java.lang.CharSequence)
         */
        public boolean isHashMethodSupported(CharSequence hash) {
                List hashes = getAcceptableHashMethods();
@@ -82,7 +82,7 @@
        }
 
        /**
-        * @see 
org.apache.james.jdkim.PublicKeyRecord#isKeyTypeSupported(java.lang.CharSequence)
+        * @see 
org.apache.james.jdkim.api.PublicKeyRecord#isKeyTypeSupported(java.lang.CharSequence)
         */
        public boolean isKeyTypeSupported(CharSequence hash) {
                List hashes = getAcceptableKeyTypes();
@@ -90,14 +90,14 @@
        }
        
        /**
-        * @see 
org.apache.james.jdkim.PublicKeyRecord#getAcceptableHashMethods()
+        * @see 
org.apache.james.jdkim.api.PublicKeyRecord#getAcceptableHashMethods()
         */
        public List/* String */ getAcceptableHashMethods() {
                if (ANY.equals(getValue("h"))) return null;
                return stringToColonSeparatedList(getValue("h").toString(), 
hyphenatedWordPattern);
        }
        /**
-        * @see org.apache.james.jdkim.PublicKeyRecord#getAcceptableKeyTypes()
+        * @see 
org.apache.james.jdkim.api.PublicKeyRecord#getAcceptableKeyTypes()
         */
        public List/* String */ getAcceptableKeyTypes() {
                return stringToColonSeparatedList(getValue("k").toString(), 
hyphenatedWordPattern);
@@ -105,7 +105,7 @@
 
 
        /**
-        * @see org.apache.james.jdkim.PublicKeyRecord#getGranularityPattern()
+        * @see 
org.apache.james.jdkim.api.PublicKeyRecord#getGranularityPattern()
         */
        public Pattern getGranularityPattern() {
                String g = getValue("g").toString();
@@ -148,7 +148,7 @@
 
 
        /**
-        * @see org.apache.james.jdkim.PublicKeyRecord#getPublicKey()
+        * @see org.apache.james.jdkim.api.PublicKeyRecord#getPublicKey()
         */
        public PublicKey getPublicKey() {
                try {

Modified: 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
 (original)
+++ 
james/jdkim/trunk/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
 Sun Oct 11 10:19:13 2009
@@ -19,13 +19,13 @@
 
 package org.apache.james.jdkim.tagvalue;
 
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.regex.Pattern;
 
 import org.apache.commons.codec.binary.Base64;
-import org.apache.james.jdkim.CodecUtil;
-import org.apache.james.jdkim.SignatureRecord;
+import org.apache.james.jdkim.api.SignatureRecord;
 
 
 public class SignatureRecordImpl extends TagValue implements SignatureRecord {
@@ -54,7 +54,7 @@
        }
        
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#validate()
+        * @see org.apache.james.jdkim.api.SignatureRecord#validate()
         */
        public void validate() throws IllegalStateException {
                super.validate();
@@ -102,7 +102,7 @@
        }
        
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getHeaders()
+        * @see org.apache.james.jdkim.api.SignatureRecord#getHeaders()
         */
        public List/* CharSequence */ getHeaders() {
                return stringToColonSeparatedList(getValue("h").toString(), 
hdrNamePattern);
@@ -116,7 +116,7 @@
        }
 
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getIdentityLocalPart()
+        * @see 
org.apache.james.jdkim.api.SignatureRecord#getIdentityLocalPart()
         */
        public CharSequence getIdentityLocalPart() {
                String identity = getIdentity().toString();
@@ -125,11 +125,69 @@
        }
        
        public CharSequence getIdentity() {
-               return CodecUtil.dkimQuotedPrintableDecode(getValue("i"));
+               return dkimQuotedPrintableDecode(getValue("i"));
        }
        
+
+       public static String dkimQuotedPrintableDecode(CharSequence input) 
throws IllegalArgumentException {
+               StringBuffer sb = new StringBuffer(input.length());
+               // TODO should we fail on WSP that is not part of FWS?
+               // the specification in 2.6 DKIM-Quoted-Printable is not
+               // clear
+               int state = 0;
+               int start = 0;
+               int d = 0;
+               boolean lastWasNL = false;
+               for (int i = 0; i < input.length(); i++) {
+                       if (lastWasNL && input.charAt(i) != ' ' && 
input.charAt(i) != '\t' ) {
+                               throw new IllegalArgumentException("Unexpected 
LF not part of an FWS");
+                       }
+                       lastWasNL = false;
+                       switch (state) {
+                       case 0:
+                               switch (input.charAt(i)) {
+                               case ' ':
+                               case '\t':
+                               case '\r':
+                               case '\n':
+                                               if ('\n' == input.charAt(i)) 
lastWasNL = true;
+                                       sb.append(input.subSequence(start, i));
+                                       start = i+1;
+                                       // ignoring whitespace by now.
+                                       break;
+                               case '=':
+                                       sb.append(input.subSequence(start, i));
+                                       state = 1;
+                                       break;
+                               }
+                               break;
+                       case 1:
+                       case 2:
+                               if (input.charAt(i) >= '0' && input.charAt(i) 
<= '9' || input.charAt(i) >= 'A' && input.charAt(i) <= 'F') {
+                                       int v = 
Arrays.binarySearch("0123456789ABCDEF".getBytes(), (byte) input.charAt(i));
+                                       if (state == 1) {
+                                               state = 2;
+                                               d = v;
+                                       } else {
+                                               d = d*16+v;
+                                               sb.append((char) d);
+                                               state = 0;
+                                               start = i+1;
+                                       }
+                               } else {
+                                       throw new 
IllegalArgumentException("Invalid input sequence at "+i);
+                               }
+                       }
+               }
+               if (state != 0) {
+                       throw new IllegalArgumentException("Invalid quoted 
printable termination");
+               }
+               sb.append(input.subSequence(start, input.length()));
+               return sb.toString();
+       }
+
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getHashKeyType()
+        * @see org.apache.james.jdkim.api.SignatureRecord#getHashKeyType()
         */
        public CharSequence getHashKeyType() {
                String a = getValue("a").toString();
@@ -140,7 +198,7 @@
        }
        
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getHashMethod()
+        * @see org.apache.james.jdkim.api.SignatureRecord#getHashMethod()
         */
        public CharSequence getHashMethod() {
                String a = getValue("a").toString();
@@ -151,7 +209,7 @@
        }
        
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getHashAlgo()
+        * @see org.apache.james.jdkim.api.SignatureRecord#getHashAlgo()
         */
        public CharSequence getHashAlgo() {
                String a = getValue("a").toString();
@@ -163,14 +221,14 @@
        }
        
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getSelector()
+        * @see org.apache.james.jdkim.api.SignatureRecord#getSelector()
         */
        public CharSequence getSelector() {
                return getValue("s");
        }
 
        /**
-        * @see org.apache.james.jdkim.SignatureRecord#getDToken()
+        * @see org.apache.james.jdkim.api.SignatureRecord#getDToken()
         */
        public CharSequence getDToken() {
                return getValue("d");

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/DKIMVerifierTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/DKIMVerifierTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/DKIMVerifierTest.java
 (original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/DKIMVerifierTest.java
 Sun Oct 11 10:19:13 2009
@@ -19,6 +19,7 @@
 
 package org.apache.james.jdkim;
 
+import org.apache.james.jdkim.api.PublicKeyRecord;
 import org.apache.james.jdkim.tagvalue.PublicKeyRecordImpl;
 import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
 

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/FileBasedTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/FileBasedTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/FileBasedTest.java 
(original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/FileBasedTest.java 
Sun Oct 11 10:19:13 2009
@@ -19,6 +19,7 @@
 
 package org.apache.james.jdkim;
 
+import org.apache.james.jdkim.exceptions.PermFailException;
 import org.apache.james.mime4j.parser.MimeTokenStream;
 
 import java.io.File;

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MessageTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MessageTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MessageTest.java 
(original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MessageTest.java 
Sun Oct 11 10:19:13 2009
@@ -29,6 +29,7 @@
 
 import junit.framework.TestCase;
 
+import org.apache.james.jdkim.impl.Message;
 import org.apache.james.mime4j.MimeException;
 
 public class MessageTest extends TestCase {

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MockPublicKeyRecordRetriever.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MockPublicKeyRecordRetriever.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MockPublicKeyRecordRetriever.java
 (original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MockPublicKeyRecordRetriever.java
 Sun Oct 11 10:19:13 2009
@@ -24,6 +24,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.jdkim.api.PublicKeyRecordRetriever;
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.exceptions.TempFailException;
+
 /**
  * This is a mock public key record retriever that store the "registry" in a 
local map.
  */

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetrieverTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetrieverTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetrieverTest.java
 (original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/MultiplexingPublicKeyRecordRetrieverTest.java
 Sun Oct 11 10:19:13 2009
@@ -23,6 +23,12 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.james.jdkim.api.PublicKeyRecordRetriever;
+import org.apache.james.jdkim.exceptions.FailException;
+import org.apache.james.jdkim.exceptions.PermFailException;
+import org.apache.james.jdkim.exceptions.TempFailException;
+import org.apache.james.jdkim.impl.MultiplexingPublicKeyRecordRetriever;
+
 import junit.framework.TestCase;
 
 public class MultiplexingPublicKeyRecordRetrieverTest extends TestCase {

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/PublicKeyRecordTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/PublicKeyRecordTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/PublicKeyRecordTest.java
 (original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/PublicKeyRecordTest.java
 Sun Oct 11 10:19:13 2009
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.regex.Pattern;
 
+import org.apache.james.jdkim.api.PublicKeyRecord;
 import org.apache.james.jdkim.tagvalue.PublicKeyRecordImpl;
 
 import junit.framework.TestCase;

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
 (original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
 Sun Oct 11 10:19:13 2009
@@ -19,12 +19,82 @@
 
 package org.apache.james.jdkim;
 
+import org.apache.james.jdkim.api.SignatureRecord;
 import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
 
 import junit.framework.TestCase;
 
 public class SignatureRecordImplTest extends TestCase {
 
+       public void testQPDecode() {
+               
assertEquals("",SignatureRecordImpl.dkimQuotedPrintableDecode(""));
+               
assertEquals("@",SignatureRecordImpl.dkimQuotedPrintableDecode("=40"));
+               
assertEquals("\r\n",SignatureRecordImpl.dkimQuotedPrintableDecode("=0D=0A"));
+               
assertEquals("\0CIAO\0",SignatureRecordImpl.dkimQuotedPrintableDecode("=00CIAO=00"));
+               
assertEquals("thisisatest",SignatureRecordImpl.dkimQuotedPrintableDecode("this\r\n\tis\r\n
 a\r\n  \t test"));
+       }
+       
+       public void testQPWhiteSpaces() {
+               
assertEquals("thisisatest",SignatureRecordImpl.dkimQuotedPrintableDecode("this 
is a test"));
+               
assertEquals("thisisatest",SignatureRecordImpl.dkimQuotedPrintableDecode("this\r\n
 is a test"));
+       }
+       
+       public void testQPInvalid() {
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("=");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("==");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("=2 3");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("=3");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("=3a");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("==20");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("=20=");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       SignatureRecordImpl.dkimQuotedPrintableDecode("=3x");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+               try {
+                       
SignatureRecordImpl.dkimQuotedPrintableDecode("this\r\nis a test");
+                       fail("invalid sequence parsed.");
+               } catch (IllegalArgumentException e) {
+               }
+       }
+       
+       // TODO check bytes > 128
+       /*
+       public void test8bit() {
+               
assertEquals("PROVA\144CIAO\144",Main.dkimQuotedPrintableDecode("PROVA=90CIAO=90"));
+       }
+       */
+
+
        /* when we moved from Sun's Base64 to CommonsCodec the decoding changed 
behaviour.
         * it does no more fail on bad encoded data.
        public void testWrongBase64Encoding() {

Modified: 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordTest.java
URL: 
http://svn.apache.org/viewvc/james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordTest.java?rev=824049&r1=824048&r2=824049&view=diff
==============================================================================
--- 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordTest.java
 (original)
+++ 
james/jdkim/trunk/main/src/test/java/org/apache/james/jdkim/SignatureRecordTest.java
 Sun Oct 11 10:19:13 2009
@@ -19,6 +19,7 @@
 
 package org.apache.james.jdkim;
 
+import org.apache.james.jdkim.api.SignatureRecord;
 import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
 
 import junit.framework.TestCase;



---------------------------------------------------------------------
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