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