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
}
-
+
};
}