[ https://issues.apache.org/jira/browse/CAMEL-12605?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16704536#comment-16704536 ]
ASF GitHub Bot commented on CAMEL-12605: ---------------------------------------- oscerd closed pull request #2645: [CAMEL-12605] Refactoring for compression support. URL: https://github.com/apache/camel/pull/2645 This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java index ecd1f7a9cd5..8e1905cabd9 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java @@ -21,9 +21,11 @@ import java.security.cert.Certificate; import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; -import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEntity; +import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeCompressedDataEntity; +import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEnvelopedDataEntity; import org.apache.camel.component.as2.api.entity.EntityParser; import org.apache.camel.component.as2.api.entity.MultipartSignedEntity; +import org.apache.camel.component.as2.api.util.CompressionUtils; import org.apache.camel.component.as2.api.util.EncryptingUtils; import org.apache.camel.component.as2.api.util.EntityUtils; import org.apache.camel.component.as2.api.util.SigningUtils; @@ -33,7 +35,9 @@ import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.protocol.HttpCoreContext; import org.apache.http.util.Args; +import org.bouncycastle.cms.CMSCompressedDataGenerator; import org.bouncycastle.cms.CMSEnvelopedDataGenerator; +import org.bouncycastle.operator.OutputCompressor; import org.bouncycastle.operator.OutputEncryptor; /** @@ -156,6 +160,12 @@ */ public static final String ENCRYPTING_PRIVATE_KEY = CAMEL_AS2_CLIENT_PREFIX + "encrypting-private-key"; + /** + * The HTTP Context Attribute containing the algorithm used to compress EDI + * message + */ + public static final String COMPRESSION_ALGORITHM = CAMEL_AS2_CLIENT_PREFIX + "compression-algorithm-name"; + /** * The HTTP Context Attribute containing the internet e-mail address of * sending system requesting a message disposition notification. @@ -213,6 +223,7 @@ public HttpCoreContext send(String ediMessage, AS2SignatureAlgorithm signingAlgorithm, Certificate[] signingCertificateChain, PrivateKey signingPrivateKey, + AS2CompressionAlgorithm compressionAlgorithm, String dispositionNotificationTo, String[] signedReceiptMicAlgorithms, AS2EncryptionAlgorithm encryptingAlgorithm, @@ -238,6 +249,7 @@ public HttpCoreContext send(String ediMessage, httpContext.setAttribute(AS2ClientManager.SIGNING_ALGORITHM, signingAlgorithm); httpContext.setAttribute(AS2ClientManager.SIGNING_CERTIFICATE_CHAIN, signingCertificateChain); httpContext.setAttribute(AS2ClientManager.SIGNING_PRIVATE_KEY, signingPrivateKey); + httpContext.setAttribute(AS2ClientManager.COMPRESSION_ALGORITHM, compressionAlgorithm); httpContext.setAttribute(AS2ClientManager.DISPOSITION_NOTIFICATION_TO, dispositionNotificationTo); httpContext.setAttribute(AS2ClientManager.SIGNED_RECEIPT_MIC_ALGORITHMS, signedReceiptMicAlgorithms); httpContext.setAttribute(AS2ClientManager.ENCRYPTING_ALGORITHM, encryptingAlgorithm); @@ -256,35 +268,112 @@ public HttpCoreContext send(String ediMessage, } switch (as2MessageStructure) { case PLAIN: { + // Add EDI Entity to main body of request. applicationEDIEntity.setMainBody(true); EntityUtils.setMessageEntity(request, applicationEDIEntity); break; } case SIGNED: { - AS2SignedDataGenerator gen = createSigningGenerator(httpContext); - // Create Multipart Signed Entity - MultipartSignedEntity multipartSignedEntity = new MultipartSignedEntity(applicationEDIEntity, gen, + // Create Multipart Signed Entity containing EDI Entity + AS2SignedDataGenerator signingGenrator = createSigningGenerator(httpContext); + MultipartSignedEntity multipartSignedEntity = new MultipartSignedEntity(applicationEDIEntity, signingGenrator, AS2Charset.US_ASCII, AS2TransferEncoding.BASE64, true, null); - multipartSignedEntity.setMainBody(true); + + // Add Multipart Signed Entity to main body of request. EntityUtils.setMessageEntity(request, multipartSignedEntity); break; } case ENCRYPTED: { + // Create Enveloped Entity containing EDI Entity CMSEnvelopedDataGenerator envelopedDataGenerator = createEncryptingGenerator(httpContext); OutputEncryptor encryptor = createEncryptor(httpContext); - ApplicationPkcs7MimeEntity pkcs7MimeEntity = new ApplicationPkcs7MimeEntity(applicationEDIEntity, envelopedDataGenerator, encryptor, AS2TransferEncoding.BASE64, true); - EntityUtils.setMessageEntity(request, pkcs7MimeEntity); + ApplicationPkcs7MimeEnvelopedDataEntity pkcs7MimeEnvelopedDataEntity = new ApplicationPkcs7MimeEnvelopedDataEntity( + applicationEDIEntity, envelopedDataGenerator, encryptor, AS2TransferEncoding.BASE64, true); + + // Add Multipart Enveloped Entity to main body of request. + EntityUtils.setMessageEntity(request, pkcs7MimeEnvelopedDataEntity); break; } - case ENCRYPTED_SIGNED: { + case SIGNED_ENCRYPTED: { + // Create Multipart Signed Entity containing EDI Entity AS2SignedDataGenerator signingGenrator = createSigningGenerator(httpContext); MultipartSignedEntity multipartSignedEntity = new MultipartSignedEntity(applicationEDIEntity, signingGenrator, AS2Charset.US_ASCII, AS2TransferEncoding.BASE64, false, null); + // Create Enveloped Entity containing Multipart Signed Entity + CMSEnvelopedDataGenerator envelopedDataGenerator = createEncryptingGenerator(httpContext); + OutputEncryptor encryptor = createEncryptor(httpContext); + ApplicationPkcs7MimeEnvelopedDataEntity pkcs7MimeEnvelopedDataEntity = new ApplicationPkcs7MimeEnvelopedDataEntity( + multipartSignedEntity, envelopedDataGenerator, encryptor, AS2TransferEncoding.BASE64, true); + + // Add Multipart Enveloped Entity to main body of request. + EntityUtils.setMessageEntity(request, pkcs7MimeEnvelopedDataEntity); + break; + } + case PLAIN_COMPRESSED: { + // Create Compressed Entity containing EDI Entity + CMSCompressedDataGenerator compressedDataGenerator = createCompressorGenerator(httpContext); + OutputCompressor compressor = createCompressor(httpContext); + ApplicationPkcs7MimeCompressedDataEntity pkcs7MimeCompressedDataEntity = new ApplicationPkcs7MimeCompressedDataEntity( + applicationEDIEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, false); + + // Add Compressed Entity to main body of request. + EntityUtils.setMessageEntity(request, pkcs7MimeCompressedDataEntity); + break; + } + case SIGNED_COMPRESSED: { + // Create Multipart Signed Entity containing EDI Entity + AS2SignedDataGenerator signingGenrator = createSigningGenerator(httpContext); + MultipartSignedEntity multipartSignedEntity = new MultipartSignedEntity(applicationEDIEntity, + signingGenrator, AS2Charset.US_ASCII, AS2TransferEncoding.BASE64, false, null); + + // Create Compressed Entity containing Multipart Signed Entity + CMSCompressedDataGenerator compressedDataGenerator = createCompressorGenerator(httpContext); + OutputCompressor compressor = createCompressor(httpContext); + ApplicationPkcs7MimeCompressedDataEntity pkcs7MimeCompressedDataEntity = new ApplicationPkcs7MimeCompressedDataEntity( + multipartSignedEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, false); + + // Add Compressed Entity to main body of request. + EntityUtils.setMessageEntity(request, pkcs7MimeCompressedDataEntity); + break; + } + case ENCRYPTED_COMPRESSED: { + // Create Compressed Entity containing EDI Entity + CMSCompressedDataGenerator compressedDataGenerator = createCompressorGenerator(httpContext); + OutputCompressor compressor = createCompressor(httpContext); + ApplicationPkcs7MimeCompressedDataEntity pkcs7MimeCompressedDataEntity = new ApplicationPkcs7MimeCompressedDataEntity( + applicationEDIEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, false); + + // Create Enveloped Entity containing Compressed Entity CMSEnvelopedDataGenerator envelopedDataGenerator = createEncryptingGenerator(httpContext); OutputEncryptor encryptor = createEncryptor(httpContext); - ApplicationPkcs7MimeEntity pkcs7MimeEntity = new ApplicationPkcs7MimeEntity(multipartSignedEntity, envelopedDataGenerator, encryptor, AS2TransferEncoding.BASE64, true); - EntityUtils.setMessageEntity(request, pkcs7MimeEntity); + ApplicationPkcs7MimeEnvelopedDataEntity pkcs7MimeEnvelopedDataEntity = new ApplicationPkcs7MimeEnvelopedDataEntity( + pkcs7MimeCompressedDataEntity, envelopedDataGenerator, encryptor, AS2TransferEncoding.BASE64, true); + + // Add Enveloped Entity to main body of request + EntityUtils.setMessageEntity(request, pkcs7MimeEnvelopedDataEntity); + break; + } + case SIGNED_ENCRYPTED_COMPRESSED: { + // Create Multipart Signed Entity containing EDI Entity + AS2SignedDataGenerator signingGenrator = createSigningGenerator(httpContext); + MultipartSignedEntity multipartSignedEntity = new MultipartSignedEntity(applicationEDIEntity, signingGenrator, + AS2Charset.US_ASCII, AS2TransferEncoding.BASE64, true, null); + + // Create Compressed Entity containing Multipart Signed Entity + CMSCompressedDataGenerator compressedDataGenerator = createCompressorGenerator(httpContext); + OutputCompressor compressor = createCompressor(httpContext); + ApplicationPkcs7MimeCompressedDataEntity pkcs7MimeCompressedDataEntity = new ApplicationPkcs7MimeCompressedDataEntity( + multipartSignedEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, false); + + // Create Enveloped Entity containing Compressed Entity + CMSEnvelopedDataGenerator envelopedDataGenerator = createEncryptingGenerator(httpContext); + OutputEncryptor encryptor = createEncryptor(httpContext); + ApplicationPkcs7MimeEnvelopedDataEntity pkcs7MimeEnvelopedDataEntity = new ApplicationPkcs7MimeEnvelopedDataEntity( + pkcs7MimeCompressedDataEntity, envelopedDataGenerator, encryptor, AS2TransferEncoding.BASE64, true); + + // Add Enveloped Entity to main body of request + EntityUtils.setMessageEntity(request, pkcs7MimeEnvelopedDataEntity); break; } default: @@ -335,6 +424,10 @@ public CMSEnvelopedDataGenerator createEncryptingGenerator(HttpCoreContext httpC } + public CMSCompressedDataGenerator createCompressorGenerator(HttpCoreContext httpContext) { + return CompressionUtils.createCompressedDataGenerator(); + } + public OutputEncryptor createEncryptor(HttpCoreContext httpContext) throws HttpException { AS2EncryptionAlgorithm encryptionAlgorithm = httpContext.getAttribute(ENCRYPTING_ALGORITHM, AS2EncryptionAlgorithm.class); @@ -344,5 +437,14 @@ public OutputEncryptor createEncryptor(HttpCoreContext httpContext) throws HttpE return EncryptingUtils.createEncryptor(encryptionAlgorithm); } + + public OutputCompressor createCompressor(HttpCoreContext httpContext) throws HttpException { + AS2CompressionAlgorithm compressionAlgorithm = httpContext.getAttribute(COMPRESSION_ALGORITHM, AS2CompressionAlgorithm.class); + if (compressionAlgorithm == null) { + throw new HttpException("Compression algorithm missing"); + } + + return CompressionUtils.createCompressor(compressionAlgorithm); + } } diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2CompressionAlgorithm.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2CompressionAlgorithm.java new file mode 100644 index 00000000000..b08b5ca6f08 --- /dev/null +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2CompressionAlgorithm.java @@ -0,0 +1,44 @@ +/** + * 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.camel.component.as2.api; + +import org.bouncycastle.asn1.ASN1ObjectIdentifier; +import org.bouncycastle.cms.jcajce.ZlibCompressor; +import org.bouncycastle.operator.OutputCompressor; + +public enum AS2CompressionAlgorithm { + ZLIB(new ZlibCompressor()); + + private OutputCompressor outputCompressor; + + private AS2CompressionAlgorithm(OutputCompressor outputCompressor) { + this.outputCompressor = outputCompressor; + } + + public String getAlgorithmName() { + return this.name(); + } + + public ASN1ObjectIdentifier getAlgorithmOID() { + return outputCompressor.getAlgorithmIdentifier().getAlgorithm(); + } + + public OutputCompressor getOutputCompressor() { + return outputCompressor; + } + +} diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MessageStructure.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MessageStructure.java index 3c8210aa787..760d9f06949 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MessageStructure.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MessageStructure.java @@ -18,9 +18,13 @@ public enum AS2MessageStructure { PLAIN(false, false, false), - SIGNED(false, false, false), - ENCRYPTED(false, false, false), - ENCRYPTED_SIGNED(false, false, false); + SIGNED(true, false, false), + ENCRYPTED(false, true, false), + SIGNED_ENCRYPTED(true, true, false), + PLAIN_COMPRESSED(false, false, true), + SIGNED_COMPRESSED(true, false, true), + ENCRYPTED_COMPRESSED(false, true, true), + SIGNED_ENCRYPTED_COMPRESSED(true, true, true); private final boolean isSigned; private final boolean isEncrypted; diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEntity.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java similarity index 94% rename from components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEntity.java rename to components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java index 548705503f0..4bb986686a8 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEntity.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java @@ -37,13 +37,13 @@ import org.bouncycastle.cms.CMSTypedData; import org.bouncycastle.operator.OutputEncryptor; -public class ApplicationPkcs7MimeEntity extends MimeEntity { +public class ApplicationPkcs7MimeEnvelopedDataEntity extends MimeEntity { private static final String CONTENT_DISPOSITION = "attachment; filename=\"smime.p7m\""; private byte[] encryptedData; - public ApplicationPkcs7MimeEntity(MimeEntity entity2Encrypt, + public ApplicationPkcs7MimeEnvelopedDataEntity(MimeEntity entity2Encrypt, CMSEnvelopedDataGenerator dataGenerator, OutputEncryptor encryptor, String encryptedContentTransferEncoding, @@ -61,7 +61,7 @@ public ApplicationPkcs7MimeEntity(MimeEntity entity2Encrypt, } } - public ApplicationPkcs7MimeEntity(byte[] encryptedData, String encryptedContentTransferEncoding, boolean isMainBody) { + public ApplicationPkcs7MimeEnvelopedDataEntity(byte[] encryptedData, String encryptedContentTransferEncoding, boolean isMainBody) { this.encryptedData = Args.notNull(encryptedData, "encryptedData"); setContentType(ContentType.create("application/pkcs7-mime", new BasicNameValuePair("smime-type", "enveloped-datat"), @@ -101,10 +101,7 @@ public void writeTo(OutputStream outstream) throws IOException { } public MimeEntity getEncryptedEntity(PrivateKey privateKey) throws HttpException { - return EntityParser.parseEnvelopedEntity(encryptedData, privateKey); - - } private byte[] createEncryptedData(MimeEntity entity2Encrypt, CMSEnvelopedDataGenerator envelopedDataGenerator, OutputEncryptor encryptor) throws Exception { diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java index 4d8a2b20913..5fb23f41c29 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java @@ -882,7 +882,7 @@ public static ApplicationPkcs7SignatureEntity parseApplicationPkcs7SignatureEnti } } - public static ApplicationPkcs7MimeEntity parseApplicationPkcs7MimeEntityBody(AS2SessionInputBuffer inbuffer, + public static ApplicationPkcs7MimeEnvelopedDataEntity parseApplicationPkcs7MimeEntityBody(AS2SessionInputBuffer inbuffer, String boundary, ContentType contentType, String contentTransferEncoding) @@ -903,7 +903,7 @@ public static ApplicationPkcs7MimeEntity parseApplicationPkcs7MimeEntityBody(AS2 byte[] encryptedContent = EntityUtils.decode(pkcs7EncryptedBodyContent.getBytes(charset), contentTransferEncoding); - ApplicationPkcs7MimeEntity applicationPkcs7MimeEntity = new ApplicationPkcs7MimeEntity( + ApplicationPkcs7MimeEnvelopedDataEntity applicationPkcs7MimeEntity = new ApplicationPkcs7MimeEnvelopedDataEntity( encryptedContent, contentTransferEncoding, false); return applicationPkcs7MimeEntity; } catch (Exception e) { diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/CompressionUtils.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/CompressionUtils.java new file mode 100644 index 00000000000..89e243f4c13 --- /dev/null +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/CompressionUtils.java @@ -0,0 +1,36 @@ +/** + * 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.camel.component.as2.api.util; + +import org.apache.camel.component.as2.api.AS2CompressionAlgorithm; +import org.bouncycastle.cms.CMSCompressedDataGenerator; +import org.bouncycastle.operator.OutputCompressor; + +public final class CompressionUtils { + + private CompressionUtils() { + } + + public static CMSCompressedDataGenerator createCompressedDataGenerator() { + return new CMSCompressedDataGenerator(); + } + + public static OutputCompressor createCompressor(AS2CompressionAlgorithm compressionAlgorithm) { + return compressionAlgorithm.getOutputCompressor(); + } + +} diff --git a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java index 3cdd384f9d5..9a43f10dd62 100644 --- a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java +++ b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java @@ -32,7 +32,7 @@ import org.apache.camel.component.as2.api.entity.AS2MessageDispositionNotificationEntity; import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; import org.apache.camel.component.as2.api.entity.ApplicationEDIFACTEntity; -import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEntity; +import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEnvelopedDataEntity; import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity; import org.apache.camel.component.as2.api.entity.DispositionMode; import org.apache.camel.component.as2.api.entity.DispositionNotificationMultipartReportEntity; @@ -270,7 +270,7 @@ public void plainEDIMessageTest() throws Exception { HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.PLAIN, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), - null, null, null, null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); + null, null, null, null, null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); HttpRequest request = httpContext.getRequest(); assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); @@ -313,8 +313,8 @@ public void multipartSignedMessageTest() throws Exception { HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.SIGNED, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), - null, AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), DISPOSITION_NOTIFICATION_TO, - SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); + null, AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), + null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); HttpRequest request = httpContext.getRequest(); assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); @@ -472,10 +472,11 @@ public void envelopedMessageTest(AS2EncryptionAlgorithm encryptionAlgorithm) thr LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm()); HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, - AS2MessageStructure.ENCRYPTED, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), - null, AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), DISPOSITION_NOTIFICATION_TO, - SIGNED_RECEIPT_MIC_ALGORITHMS, encryptionAlgorithm, certList.toArray(new Certificate[0]), - signingKP.getPrivate()); + AS2MessageStructure.ENCRYPTED, + ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, + AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), null, + DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, encryptionAlgorithm, + certList.toArray(new Certificate[0]), signingKP.getPrivate()); HttpRequest request = httpContext.getRequest(); assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); @@ -503,8 +504,8 @@ public void envelopedMessageTest(AS2EncryptionAlgorithm encryptionAlgorithm) thr assertTrue("Request does not contain entity", request instanceof BasicHttpEntityEnclosingRequest); HttpEntity entity = ((BasicHttpEntityEnclosingRequest) request).getEntity(); assertNotNull("Request does not contain entity", entity); - assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeEntity); - ApplicationPkcs7MimeEntity envelopedEntity = (ApplicationPkcs7MimeEntity) entity; + assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeEnvelopedDataEntity); + ApplicationPkcs7MimeEnvelopedDataEntity envelopedEntity = (ApplicationPkcs7MimeEnvelopedDataEntity) entity; assertTrue("Entity not set as main body of request", envelopedEntity.isMainBody()); // Validated enveloped part. @@ -532,10 +533,11 @@ public void envelopedAndSignedMessageTest(AS2EncryptionAlgorithm encryptionAlgor LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm()); HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, - AS2MessageStructure.ENCRYPTED_SIGNED, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), - null, AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), DISPOSITION_NOTIFICATION_TO, - SIGNED_RECEIPT_MIC_ALGORITHMS, encryptionAlgorithm, certList.toArray(new Certificate[0]), - signingKP.getPrivate()); + AS2MessageStructure.SIGNED_ENCRYPTED, + ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, + AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), null, + DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, encryptionAlgorithm, + certList.toArray(new Certificate[0]), signingKP.getPrivate()); HttpRequest request = httpContext.getRequest(); assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); @@ -563,8 +565,8 @@ public void envelopedAndSignedMessageTest(AS2EncryptionAlgorithm encryptionAlgor assertTrue("Request does not contain entity", request instanceof BasicHttpEntityEnclosingRequest); HttpEntity entity = ((BasicHttpEntityEnclosingRequest) request).getEntity(); assertNotNull("Request does not contain entity", entity); - assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeEntity); - ApplicationPkcs7MimeEntity envelopedEntity = (ApplicationPkcs7MimeEntity) entity; + assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeEnvelopedDataEntity); + ApplicationPkcs7MimeEnvelopedDataEntity envelopedEntity = (ApplicationPkcs7MimeEnvelopedDataEntity) entity; assertTrue("Entity not set as main body of request", envelopedEntity.isMainBody()); // Validated enveloped part. @@ -601,8 +603,8 @@ public void signatureVerificationTest() throws Exception { HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.SIGNED, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), - null, AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), DISPOSITION_NOTIFICATION_TO, - SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); + null, AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), + null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); HttpRequest request = httpContext.getRequest(); assertTrue("Request does not contain entity", request instanceof BasicHttpEntityEnclosingRequest); @@ -630,7 +632,8 @@ public void mdnMessageTest() throws Exception { HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.PLAIN, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), - null, null, null, null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); + null, null, null, null, null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, + null); HttpResponse response = httpContext.getResponse(); assertEquals("Unexpected method value", HttpVersion.HTTP_1_1, response.getStatusLine().getProtocolVersion()); diff --git a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java index cd47c82d9e0..d5b3a0dd646 100644 --- a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java +++ b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java @@ -317,7 +317,7 @@ public void parseEnvelopedBodyTest() throws Exception { // Build Enveloped Entity // TextPlainEntity textEntity = new TextPlainEntity("This is a super secret messatge!", "US-ASCII", "7bit", false); - ApplicationPkcs7MimeEntity applicationPkcs7MimeEntity = new ApplicationPkcs7MimeEntity(textEntity, cmsEnvelopeDataGenerator, contentEncryptor, "binary", true); + ApplicationPkcs7MimeEnvelopedDataEntity applicationPkcs7MimeEntity = new ApplicationPkcs7MimeEnvelopedDataEntity(textEntity, cmsEnvelopeDataGenerator, contentEncryptor, "binary", true); MimeEntity decryptedMimeEntity = applicationPkcs7MimeEntity.getEncryptedEntity(encryptKP.getPrivate()); assertEquals("Decrypted entity has unexpected content type", "text/plain; charset=US-ASCII", decryptedMimeEntity.getContentTypeValue()); diff --git a/components/camel-as2/camel-as2-component/src/main/docs/as2-component.adoc b/components/camel-as2/camel-as2-component/src/main/docs/as2-component.adoc index aef14ca7444..11bfb22c8b0 100644 --- a/components/camel-as2/camel-as2-component/src/main/docs/as2-component.adoc +++ b/components/camel-as2/camel-as2-component/src/main/docs/as2-component.adoc @@ -70,7 +70,7 @@ with the following path and query parameters: |=== -==== Query Parameters (30 parameters): +==== Query Parameters (31 parameters): [width="100%",cols="2,5,^1,2",options="header"] @@ -81,6 +81,7 @@ with the following path and query parameters: | *as2To* (common) | The value of the AS2To header of AS2 message. | | String | *as2Version* (common) | The version of the AS2 protocol. | 1.1 | String | *clientFqdn* (common) | The Client Fully Qualified Domain Name (FQDN). Used in message ids sent by endpoint. | camel.apache.org | String +| *compressionAlgorithm* (common) | The algorithm used to compress EDI message. | | AS2Compression Algorithm | *dispositionNotificationTo* (common) | The value of the Disposition-Notification-To header. Assigning a value to this parameter requests a message disposition notification (MDN) for the AS2 message. | | String | *ediMessageTransferEncoding* (common) | The transfer encoding of EDI message. | | String | *ediMessageType* (common) | The content type of EDI message. One of application/edifact, application/edi-x12, application/edi-consent | | ContentType diff --git a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java index bd5a34746a9..c92b50e2a9f 100644 --- a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java +++ b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java @@ -20,6 +20,7 @@ import java.security.cert.Certificate; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.component.as2.api.AS2CompressionAlgorithm; import org.apache.camel.component.as2.api.AS2EncryptionAlgorithm; import org.apache.camel.component.as2.api.AS2MessageStructure; import org.apache.camel.component.as2.api.AS2SignatureAlgorithm; @@ -101,6 +102,9 @@ @UriParam private PrivateKey signingPrivateKey; + @UriParam + private AS2CompressionAlgorithm compressionAlgorithm; + @UriParam private String dispositionNotificationTo; @@ -388,6 +392,17 @@ public void setSigningPrivateKey(PrivateKey signingPrivateKey) { this.signingPrivateKey = signingPrivateKey; } + public AS2CompressionAlgorithm getCompressionAlgorithm() { + return compressionAlgorithm; + } + + /** + * The algorithm used to compress EDI message. + */ + public void setCompressionAlgorithm(AS2CompressionAlgorithm compressionAlgorithm) { + this.compressionAlgorithm = compressionAlgorithm; + } + public String getDispositionNotificationTo() { return dispositionNotificationTo; } @@ -415,7 +430,7 @@ public void setSignedReceiptMicAlgorithms(String[] signedReceiptMicAlgorithms) { this.signedReceiptMicAlgorithms = signedReceiptMicAlgorithms; } - public AS2EncryptionAlgorithm getEncryptingingAlgorithm() { + public AS2EncryptionAlgorithm getEncryptingAlgorithm() { return encryptingAlgorithm; } diff --git a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java index ca14bf6f8f4..36c03866316 100644 --- a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java +++ b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java @@ -45,7 +45,7 @@ import org.apache.camel.component.as2.api.entity.AS2DispositionType; import org.apache.camel.component.as2.api.entity.AS2MessageDispositionNotificationEntity; import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; -import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEntity; +import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEnvelopedDataEntity; import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity; import org.apache.camel.component.as2.api.entity.DispositionMode; import org.apache.camel.component.as2.api.entity.DispositionNotificationMultipartReportEntity; @@ -326,8 +326,8 @@ public void envelopedMessageSendTest() throws Exception { assertTrue("Request does not contain body", request instanceof HttpEntityEnclosingRequest); HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity(); assertNotNull("Request body", entity); - assertTrue("Request body does not contain ApplicationPkcs7Mime entity", entity instanceof ApplicationPkcs7MimeEntity); - MimeEntity envelopeEntity = ((ApplicationPkcs7MimeEntity)entity).getEncryptedEntity(signingKP.getPrivate()); + assertTrue("Request body does not contain ApplicationPkcs7Mime entity", entity instanceof ApplicationPkcs7MimeEnvelopedDataEntity); + MimeEntity envelopeEntity = ((ApplicationPkcs7MimeEnvelopedDataEntity)entity).getEncryptedEntity(signingKP.getPrivate()); assertTrue("Enveloped entity is not an EDI entity", envelopeEntity instanceof ApplicationEDIEntity); String ediMessage = ((ApplicationEDIEntity)envelopeEntity).getEdiMessage(); assertEquals("EDI message is different", EDI_MESSAGE.replaceAll("[\n\r]", ""), ediMessage.replaceAll("[\n\r]", "")); diff --git a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java index 9cb635fcbb8..0f6b93125ca 100644 --- a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java +++ b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java @@ -128,7 +128,7 @@ public void receivePlainEDIMessageTest() throws Exception { clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.PLAIN, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, null, null, null, - DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); + null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); MockEndpoint mockEndpoint = getMockEndpoint("mock:as2RcvMsgs"); mockEndpoint.expectedMinimumMessageCount(1); @@ -185,7 +185,7 @@ public void receiveMultipartSignedMessageTest() throws Exception { clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.SIGNED, ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, AS2SignatureAlgorithm.SHA256WITHRSA, - certList.toArray(new Certificate[0]), signingKP.getPrivate(), DISPOSITION_NOTIFICATION_TO, + certList.toArray(new Certificate[0]), signingKP.getPrivate(), null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null); MockEndpoint mockEndpoint = getMockEndpoint("mock:as2RcvMsgs"); diff --git a/platforms/spring-boot/components-starter/camel-as2-starter/src/main/java/org/apache/camel/component/as2/springboot/AS2ComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-as2-starter/src/main/java/org/apache/camel/component/as2/springboot/AS2ComponentConfiguration.java index d5d84d5e9d7..eda444f3b43 100644 --- a/platforms/spring-boot/components-starter/camel-as2-starter/src/main/java/org/apache/camel/component/as2/springboot/AS2ComponentConfiguration.java +++ b/platforms/spring-boot/components-starter/camel-as2-starter/src/main/java/org/apache/camel/component/as2/springboot/AS2ComponentConfiguration.java @@ -19,6 +19,7 @@ import java.security.PrivateKey; import java.security.cert.Certificate; import javax.annotation.Generated; +import org.apache.camel.component.as2.api.AS2CompressionAlgorithm; import org.apache.camel.component.as2.api.AS2EncryptionAlgorithm; import org.apache.camel.component.as2.api.AS2MessageStructure; import org.apache.camel.component.as2.api.AS2SignatureAlgorithm; @@ -166,6 +167,10 @@ public void setResolvePropertyPlaceholders( * The key used to sign the EDI message. */ private PrivateKey signingPrivateKey; + /** + * The algorithm used to compress EDI message. + */ + private AS2CompressionAlgorithm compressionAlgorithm; /** * The value of the Disposition-Notification-To header. Assigning a * value to this parameter requests a message disposition notification @@ -362,6 +367,15 @@ public void setSigningPrivateKey(PrivateKey signingPrivateKey) { this.signingPrivateKey = signingPrivateKey; } + public AS2CompressionAlgorithm getCompressionAlgorithm() { + return compressionAlgorithm; + } + + public void setCompressionAlgorithm( + AS2CompressionAlgorithm compressionAlgorithm) { + this.compressionAlgorithm = compressionAlgorithm; + } + public String getDispositionNotificationTo() { return dispositionNotificationTo; } ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > Enhance the AS2 Component to send and receive encrypted AS2 messages > -------------------------------------------------------------------- > > Key: CAMEL-12605 > URL: https://issues.apache.org/jira/browse/CAMEL-12605 > Project: Camel > Issue Type: Improvement > Affects Versions: 2.23.0 > Reporter: William Collins > Assignee: William Collins > Priority: Major > > Enhance the AS2 Component to support encrypted AS2 messages per RFC4130 -- This message was sent by Atlassian JIRA (v7.6.3#76005)