You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/10/29 04:39:31 UTC

git commit: CAMEL-6906 PGPDataFormat: Enable Streaming during Unmarshaling with thanks to Franz

Updated Branches:
  refs/heads/master 5d06437e5 -> f138f4564


CAMEL-6906 PGPDataFormat: Enable Streaming during Unmarshaling with thanks to Franz


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f138f456
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f138f456
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f138f456

Branch: refs/heads/master
Commit: f138f4564d588c7b65f10c04181a70858cea3f6f
Parents: 5d06437
Author: Willem Jiang <ni...@apache.org>
Authored: Tue Oct 29 11:39:10 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Tue Oct 29 11:39:10 2013 +0800

----------------------------------------------------------------------
 .../camel/converter/crypto/PGPDataFormat.java   | 61 ++++++++++++--------
 .../converter/crypto/PGPDataFormatTest.java     |  7 +--
 2 files changed, 39 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/f138f456/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java b/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
index c14c5c8..db3deb0 100644
--- a/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
+++ b/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
@@ -17,7 +17,7 @@
 package org.apache.camel.converter.crypto;
 
 import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -29,12 +29,12 @@ import java.security.SignatureException;
 import java.util.Date;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.converter.stream.CachedOutputStream;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
-import org.apache.commons.io.IOUtils;
 import org.bouncycastle.bcpg.ArmoredOutputStream;
 import org.bouncycastle.bcpg.CompressionAlgorithmTags;
 import org.bouncycastle.bcpg.HashAlgorithmTags;
@@ -65,7 +65,6 @@ import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
 import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
 import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
 import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
-import org.bouncycastle.util.io.Streams;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -125,7 +124,7 @@ public class PGPDataFormat extends ServiceSupport implements DataFormat {
     private int algorithm = SymmetricKeyAlgorithmTags.CAST5;
 
     /**
-     * If no passpharase can be found from the parameter <tt>password</tt> or
+     * If no passphrase can be found from the parameter <tt>password</tt> or
      * <tt>signaturePassword</tt> or from the header
      * {@link #SIGNATURE_KEY_PASSWORD} or {@link #KEY_PASSWORD} then we try to
      * get the password from the passphrase accessor. This is especially useful
@@ -281,32 +280,21 @@ public class PGPDataFormat extends ServiceSupport implements DataFormat {
         return sigGen;
     }
 
+    @SuppressWarnings("resource")
     public Object unmarshal(Exchange exchange, InputStream encryptedStream) throws Exception {
         if (encryptedStream == null) {
             return null;
         }
-
-        InputStream in;
-        try {
-            byte[] encryptedData = IOUtils.toByteArray(encryptedStream);
-            //TODO why do we need a byte array input stream? --> streaming not possible?
-            InputStream byteStream = new ByteArrayInputStream(encryptedData);
-            in = PGPUtil.getDecoderStream(byteStream);
-        } finally {
-            IOUtils.closeQuietly(encryptedStream);
-        }
-
+        InputStream in = PGPUtil.getDecoderStream(encryptedStream);
         PGPObjectFactory pgpFactory = new PGPObjectFactory(in);
         Object o = pgpFactory.nextObject();
-
-        // the first object might be a PGP marker packet
+        // the first object might be a PGP marker packet 
         PGPEncryptedDataList enc;
         if (o instanceof PGPEncryptedDataList) {
             enc = (PGPEncryptedDataList) o;
         } else {
             enc = (PGPEncryptedDataList) pgpFactory.nextObject();
         }
-        IOHelper.close(in);
 
         PGPPublicKeyEncryptedData pbe = null;
         PGPPrivateKey key = null;
@@ -337,23 +325,46 @@ public class PGPDataFormat extends ServiceSupport implements DataFormat {
         PGPLiteralData ld = (PGPLiteralData) object;
         InputStream litData = ld.getInputStream();
 
-        //TODO we should enable streaming here with CashedOutputStream!!
-        byte[] answer;
+        // enable streaming via OutputStreamCache
+        CachedOutputStream cos;
+        ByteArrayOutputStream bos;
+        OutputStream os;
+        if (exchange.getContext().getStreamCachingStrategy().isEnabled()) {
+            cos = new CachedOutputStream(exchange);
+            bos = null;
+            os = cos;
+        } else {
+            cos = null;
+            bos = new ByteArrayOutputStream();
+            os = bos;
+        }
+         
         try {
-            answer = Streams.readAll(litData);
+            byte[] buffer = new byte[BUFFER_SIZE];
+            int bytesRead;
+            while ((bytesRead = litData.read(buffer)) != -1) {
+                os.write(buffer, 0, bytesRead);
+                if (signature != null) {
+                    signature.update(buffer, 0, bytesRead);
+                }
+                os.flush();
+            }
         } finally {
-            IOHelper.close(litData, encData, in);
+            IOHelper.close(os, litData, encData, in);
         }
 
         if (signature != null) {
-            signature.update(answer);
             PGPSignatureList sigList = (PGPSignatureList) pgpFactory.nextObject();
             if (!signature.verify(getSignatureWithKeyId(signature.getKeyID(), sigList))) {
                 throw new SignatureException("Cannot verify PGP signature");
             }
         }
-
-        return answer;
+        
+        if (cos != null) {
+            return cos.newStreamCache();
+        } else {
+            return bos.toByteArray();
+        }
     }
 
     protected PGPSignature getSignatureWithKeyId(long keyID, PGPSignatureList sigList) {

http://git-wip-us.apache.org/repos/asf/camel/blob/f138f456/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
----------------------------------------------------------------------
diff --git a/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java b/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
index a739a42..20413c8 100644
--- a/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
+++ b/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
@@ -121,7 +121,6 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest {
 
                 PGPDataFormat pgpDecrypt = new PGPDataFormat();
                 pgpDecrypt.setKeyFileName(keyFileNameSec);
-               // pgpDecrypt.setKeyUserid(keyUserid);
                 pgpDecrypt.setPassword(keyPassword);
                 pgpDecrypt.setProvider(getProvider());
 
@@ -176,7 +175,7 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest {
                 pgpDecryptByteArray.setPassphraseAccessor(passphraseAccessor);
                 pgpDecryptByteArray.setProvider(getProvider());
 
-                from("direct:key-ring-byte-array").marshal(pgpEncryptByteArray).to("mock:encrypted").unmarshal(pgpDecryptByteArray)
+                from("direct:key-ring-byte-array").streamCaching().marshal(pgpEncryptByteArray).to("mock:encrypted").unmarshal(pgpDecryptByteArray)
                         .to("mock:unencrypted");
                 // END SNIPPET: pgp-format-key-ring-byte-array
 
@@ -195,7 +194,7 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest {
                 pgpVerifyAndDecryptByteArray.setEncryptionKeyRing(getSecKeyRing());
                 pgpVerifyAndDecryptByteArray.setProvider(getProvider());
 
-                from("direct:sign-key-ring-byte-array")
+                from("direct:sign-key-ring-byte-array").streamCaching()
                 // encryption key ring can also be set as header
                         .setHeader(PGPDataFormat.ENCRYPTION_KEY_RING).constant(getPublicKeyRing()).marshal(pgpSignAndEncryptByteArray)
                         // it is recommended to remove the header immediately when it is no longer needed
@@ -207,7 +206,7 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest {
                 // END SNIPPET: pgp-format-signature-key-ring-byte-array
             }
 
-           
+         
         };
     }