[
https://issues.apache.org/jira/browse/CAMEL-12605?focusedWorklogId=174523&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-174523
]
ASF GitHub Bot logged work on CAMEL-12605:
------------------------------------------
Author: ASF GitHub Bot
Created on: 12/Dec/18 14:05
Start Date: 12/Dec/18 14:05
Worklog Time Spent: 10m
Work Description: oscerd closed pull request #2666: [CAMEL-12605]
Refactoring and fixed issue of receipt for compressed m…
URL: https://github.com/apache/camel/pull/2666
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 5f7ce3bfc90..e6d8a4b33ce 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
@@ -154,12 +154,6 @@
*/
public static final String ENCRYPTING_CERTIFICATE_CHAIN =
CAMEL_AS2_CLIENT_PREFIX + "encrypting-certificate-chain";
- /**
- * The HTTP Context Attribute containing the private key used to encrypt
EDI
- * message
- */
- 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
@@ -203,11 +197,11 @@ public AS2ClientManager(AS2ClientConnection
as2ClientConnection) {
* @param signingAlgorithm - the algorithm used to sign the message or
<code>null</code> if sending EDI message unsigned
* @param signingCertificateChain - the chain of certificates used to sign
the message or <code>null</code> if sending EDI message unsigned
* @param signingPrivateKey - the private key used to sign EDI message
+ * @param compressionAlgorithm - the algorithm used to compress the
message or <code>null</code> if sending EDI message uncompressed
* @param dispositionNotificationTo - an RFC2822 address to request a
receipt or <code>null</code> if no receipt requested
* @param signedReceiptMicAlgorithms - the senders list of signing
algorithms for signing receipt, in preferred order, or <code>null</code> if
requesting an unsigned receipt.
* @param encryptingAlgorithm - the algorithm used to encrypt the message
or <code>null</code> if sending EDI message unencrypted
* @param encryptingCertificateChain - the chain of certificates used to
encrypt the message or <code>null</code> if sending EDI message unencrypted
- * @param encryptingPrivateKey - the private key used to encrypt EDI
message
* @return {@link HttpCoreContext} containing request and response used to
send EDI message
* @throws HttpException when things go wrong.
*/
@@ -227,13 +221,16 @@ public HttpCoreContext send(String ediMessage,
String dispositionNotificationTo,
String[] signedReceiptMicAlgorithms,
AS2EncryptionAlgorithm encryptingAlgorithm,
- Certificate[] encryptingCertificateChain,
- PrivateKey encryptingPrivateKey)
+ Certificate[] encryptingCertificateChain)
throws HttpException {
Args.notNull(ediMessage, "EDI Message");
- Args.notNull(as2MessageStructure, "AS2 Message Structure");
Args.notNull(requestUri, "Request URI");
+ Args.notNull(subject, "Subject");
+ Args.notNull(from, "Subject");
+ Args.notNull(as2From, "Subject");
+ Args.notNull(as2To, "Subject");
+ Args.notNull(as2MessageStructure, "AS2 Message Structure");
Args.notNull(ediMessageContentType, "EDI Message Content Type");
// Add Context attributes
@@ -254,7 +251,6 @@ public HttpCoreContext send(String ediMessage,
httpContext.setAttribute(AS2ClientManager.SIGNED_RECEIPT_MIC_ALGORITHMS,
signedReceiptMicAlgorithms);
httpContext.setAttribute(AS2ClientManager.ENCRYPTING_ALGORITHM,
encryptingAlgorithm);
httpContext.setAttribute(AS2ClientManager.ENCRYPTING_CERTIFICATE_CHAIN,
encryptingCertificateChain);
- httpContext.setAttribute(AS2ClientManager.ENCRYPTING_PRIVATE_KEY,
encryptingPrivateKey);
BasicHttpEntityEnclosingRequest request = new
BasicHttpEntityEnclosingRequest("POST", requestUri);
httpContext.setAttribute(HTTP_REQUEST, request);
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 f97b0ae8656..eb4563919dc 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
@@ -38,6 +38,7 @@
import org.apache.camel.component.as2.api.util.HttpMessageUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
+import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpException;
import org.apache.http.HttpMessage;
import org.apache.http.NameValuePair;
@@ -58,19 +59,13 @@
import org.bouncycastle.cms.RecipientInformation;
import org.bouncycastle.cms.RecipientInformationStore;
import org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient;
+import org.bouncycastle.cms.jcajce.ZlibExpanderProvider;
import org.bouncycastle.operator.InputExpanderProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public final class EntityParser {
- private static final Logger LOG =
LoggerFactory.getLogger(EntityParser.class);
-
private static final int DEFAULT_BUFFER_SIZE = 8 * 1024;
- private static final String APPLICATION_EDI_CONTENT_TYPE_PREFIX =
"application/edi";
-
-
private EntityParser() {
}
@@ -185,8 +180,6 @@ public static MimeEntity parseCompressedEntity(byte[]
compressedData, InputExpan
byte[] uncompressedContent = uncompressData(compressedData,
expanderProvider);
- String uncompressedContentString = new String(uncompressedContent);
-
return parseEntity(uncompressedContent);
}
@@ -200,7 +193,6 @@ public static MimeEntity parseEnvelopedEntity(byte[]
envelopedContent, PrivateKe
public static MimeEntity parseEntity(byte[] content) throws HttpException {
try {
- String contentString = new String(content);
InputStream is = new ByteArrayInputStream(content);
AS2SessionInputBuffer inbuffer = new AS2SessionInputBuffer(new
HttpTransportMetricsImpl(), DEFAULT_BUFFER_SIZE);
inbuffer.bind(is);
@@ -274,55 +266,87 @@ public static MimeEntity parseEntity(byte[] content)
throws HttpException {
throw new HttpException("Failed to decrypt data: bno recipeint
information");
}
- public static void parseMultipartSignedEntity(HttpMessage message)
- throws HttpException {
- MultipartSignedEntity multipartSignedEntity = null;
+ private static void parseApplicationPkcs7MimeCompressedEntity(HttpMessage
message, AS2SessionInputBuffer inBuffer, ContentType contentType, String
contentTransferEncoding) throws HttpException {
+ ApplicationPkcs7MimeCompressedDataEntity
applicationPkcs7MimeCompressedDataEntity = null;
+
+ Args.notNull(message, "message");
+ Args.notNull(inBuffer, "inBuffer");
+
HttpEntity entity =
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
- if (entity instanceof MultipartSignedEntity) {
+ if (entity instanceof ApplicationPkcs7MimeCompressedDataEntity) {
+ // already parsed
return;
}
+
+ Args.check(entity.isStreaming(), "Message entity can not be parsed:
entity is not streaming");
+
+ try {
+
+ applicationPkcs7MimeCompressedDataEntity =
parseApplicationPkcs7MimeCompressedDataEntityBody(inBuffer, null, contentType,
contentTransferEncoding);
+ applicationPkcs7MimeCompressedDataEntity.setMainBody(true);
+
+ EntityUtils.setMessageEntity(message,
applicationPkcs7MimeCompressedDataEntity);
+
+ } catch (Exception e) {
+ throw new HttpException("Failed to parse entity content", e);
+ }
+ }
+
+ private static void parseApplicationPkcs7MimeEnvelopedEntity(HttpMessage
message, AS2SessionInputBuffer inBuffer, ContentType contentType, String
contentTransferEncoding) throws HttpException {
+ ApplicationPkcs7MimeEnvelopedDataEntity
applicationPkcs7MimeEnvelopedDataEntity = null;
+
+ Args.notNull(message, "message");
+ Args.notNull(inBuffer, "inBuffer");
+
+ HttpEntity entity =
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
- Args.check(entity.isStreaming(), "Entity is not streaming");
+ if (entity instanceof ApplicationPkcs7MimeCompressedDataEntity) {
+ // already parsed
+ return;
+ }
+
+ Args.check(entity.isStreaming(), "Message entity can not be parsed:
entity is not streaming");
try {
+
+ applicationPkcs7MimeEnvelopedDataEntity =
parseApplicationPkcs7MimeEnvelopedDataEntityBody(inBuffer, null, contentType,
contentTransferEncoding);
+ applicationPkcs7MimeEnvelopedDataEntity.setMainBody(true);
+
+ EntityUtils.setMessageEntity(message,
applicationPkcs7MimeEnvelopedDataEntity);
- // Determine and validate the Content Type
- Header contentTypeHeader = entity.getContentType();
- if (contentTypeHeader == null) {
- throw new HttpException("Content-Type header is missing");
- }
- ContentType contentType =
ContentType.parse(entity.getContentType().getValue());
- if
(!contentType.getMimeType().equals(AS2MimeType.MULTIPART_SIGNED)) {
- throw new HttpException("Entity has invalid MIME type '" +
contentType.getMimeType() + "'");
- }
+ } catch (Exception e) {
+ throw new HttpException("Failed to parse entity content", e);
+ }
+ }
+
+ private static void parseMultipartSignedEntity(HttpMessage message,
AS2SessionInputBuffer inBuffer, String boundary, String charsetName, String
contentTransferEncoding)
+ throws HttpException {
+ MultipartSignedEntity multipartSignedEntity = null;
+
+ Args.notNull(message, "message");
+ Args.notNull(inBuffer, "inBuffer");
+ Args.notNull(boundary, "boundary");
+ Args.notNull(charsetName, "charsetName");
+
+ HttpEntity entity =
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
- // Determine Charset
- String charsetName = AS2Charset.US_ASCII;
- Charset charset = contentType.getCharset();
- if (charset != null) {
- charsetName = charset.name();
- }
+ if (entity instanceof MultipartSignedEntity) {
+ // already parsed
+ return;
+ }
- // Determine content transfer encoding
- String contentTransferEncoding =
HttpMessageUtils.getHeaderValue(message, AS2Header.CONTENT_TRANSFER_ENCODING);
+ Args.check(entity.isStreaming(), "Message entity can not be parsed:
entity is not streaming");
- AS2SessionInputBuffer inbuffer = new AS2SessionInputBuffer(new
HttpTransportMetricsImpl(), DEFAULT_BUFFER_SIZE);
- inbuffer.bind(entity.getContent());
+ try {
- // Get Boundary Value
- String boundary = HttpMessageUtils.getParameterValue(message,
AS2Header.CONTENT_TYPE, "boundary");
- if (boundary == null) {
- throw new HttpException("Failed to retrieve 'boundary'
parameter from content type header");
- }
-
// Get Micalg Value
String micalg = HttpMessageUtils.getParameterValue(message,
AS2Header.CONTENT_TYPE, "micalg");
if (micalg == null) {
throw new HttpException("Failed to retrieve 'micalg' parameter
from content type header");
}
- multipartSignedEntity = parseMultipartSignedEntityBody(inbuffer,
boundary, micalg, charsetName, contentTransferEncoding);
+ multipartSignedEntity = parseMultipartSignedEntityBody(inBuffer,
boundary, micalg, charsetName, contentTransferEncoding);
multipartSignedEntity.setMainBody(true);
EntityUtils.setMessageEntity(message, multipartSignedEntity);
@@ -334,127 +358,123 @@ public static void
parseMultipartSignedEntity(HttpMessage message)
}
}
- public static void parseApplicationEDIEntity(HttpMessage message) throws
HttpException {
+ private static void parseApplicationEDIEntity(HttpMessage message,
AS2SessionInputBuffer inBuffer, ContentType contentType, String
contentTransferEncoding) throws HttpException {
ApplicationEDIEntity applicationEDIEntity = null;
+
+ Args.notNull(message, "message");
+ Args.notNull(inBuffer, "inBuffer");
+
HttpEntity entity =
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
if (entity instanceof ApplicationEDIEntity) {
+ // already parsed
return;
}
- Args.check(entity.isStreaming(), "Entity is not streaming");
+ Args.check(entity.isStreaming(), "Message entity can not be parsed:
entity is not streaming");
try {
- // Determine and validate the Content Type
- Header contentTypeHeader = entity.getContentType();
- if (contentTypeHeader == null) {
- throw new HttpException("Content-Type header is missing");
- }
- ContentType contentType =
ContentType.parse(entity.getContentType().getValue());
- if
(!contentType.getMimeType().startsWith(EntityParser.APPLICATION_EDI_CONTENT_TYPE_PREFIX))
{
- throw new HttpException("Entity has invalid MIME type '" +
contentType.getMimeType() + "'");
- }
-
- // Determine Transfer Encoding
- Header transferEncoding = entity.getContentEncoding();
- String contentTransferEncoding = transferEncoding == null ? null :
transferEncoding.getValue();
-
- AS2SessionInputBuffer inBuffer = new AS2SessionInputBuffer(new
HttpTransportMetricsImpl(), 8 * 1024);
- inBuffer.bind(entity.getContent());
-
applicationEDIEntity = parseEDIEntityBody(inBuffer, null,
contentType, contentTransferEncoding);
applicationEDIEntity.setMainBody(true);
EntityUtils.setMessageEntity(message, applicationEDIEntity);
- } catch (HttpException e) {
- throw e;
+
} catch (Exception e) {
throw new HttpException("Failed to parse entity content", e);
}
}
- public static void
parseMessageDispositionNotificationReportEntity(HttpMessage message)
+ private static void
parseMessageDispositionNotificationReportEntity(HttpMessage message,
AS2SessionInputBuffer inBuffer, String boundary, String charsetName, String
contentTransferEncoding)
throws HttpException {
DispositionNotificationMultipartReportEntity
dispositionNotificationMultipartReportEntity = null;
+
+ Args.notNull(message, "message");
+ Args.notNull(inBuffer, "inBuffer");
+ Args.notNull(boundary, "boundary");
+ Args.notNull(charsetName, "charsetName");
HttpEntity entity =
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
if (entity instanceof DispositionNotificationMultipartReportEntity) {
+ // already parsed
return;
}
- Args.check(entity.isStreaming(), "Entity is not streaming");
+ Args.check(entity.isStreaming(), "Message entity can not be parsed:
entity is not streaming");
try {
- // Determine and validate the Content Type
- Header contentTypeHeader = entity.getContentType();
- if (contentTypeHeader == null) {
- throw new HttpException("Content-Type header is missing");
- }
- ContentType contentType =
ContentType.parse(entity.getContentType().getValue());
- if
(!contentType.getMimeType().equals(AS2MimeType.MULTIPART_REPORT)) {
- throw new HttpException("Entity has invalid MIME type '" +
contentType.getMimeType() + "'");
- }
-
- // Determine Charset
- String charsetName = AS2Charset.US_ASCII;
- Charset charset = contentType.getCharset();
- if (charset != null) {
- charsetName = charset.name();
- }
-
- // Determine content transfer encoding
- String contentTransferEncoding =
HttpMessageUtils.getHeaderValue(message, AS2Header.CONTENT_TRANSFER_ENCODING);
-
- AS2SessionInputBuffer inbuffer = new AS2SessionInputBuffer(new
HttpTransportMetricsImpl(), 8 * 1024);
- inbuffer.bind(entity.getContent());
-
- // Get Boundary Value
- String boundary = HttpMessageUtils.getParameterValue(message,
AS2Header.CONTENT_TYPE, "boundary");
- if (boundary == null) {
- throw new HttpException("Failed to retrive boundary value");
- }
-
- dispositionNotificationMultipartReportEntity =
parseMultipartReportEntityBody(inbuffer, boundary, charsetName,
contentTransferEncoding);
+ dispositionNotificationMultipartReportEntity =
parseMultipartReportEntityBody(inBuffer, boundary, charsetName,
contentTransferEncoding);
EntityUtils.setMessageEntity(message,
dispositionNotificationMultipartReportEntity);
- } catch (HttpException e) {
- throw e;
} catch (Exception e) {
throw new HttpException("Failed to parse entity content", e);
}
}
+ /**
+ * Parses message's entity and replaces it with mime entity.
+ *
+ * @param message - message whose entity is parsed.
+ * @throws HttpException when things go wrong.
+ */
public static void parseAS2MessageEntity(HttpMessage message) throws
HttpException {
if (EntityUtils.hasEntity(message)) {
- String contentTypeStr = HttpMessageUtils.getHeaderValue(message,
AS2Header.CONTENT_TYPE);
- if (contentTypeStr != null) {
- ContentType contentType;
- try {
- contentType = ContentType.parse(contentTypeStr);
- } catch (Exception e) {
- LOG.debug("Failed to get content type of message", e);
- return;
+ HttpEntity entity =
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+
+ try {
+ // Determine Content Type of Message
+ String contentTypeStr =
HttpMessageUtils.getHeaderValue(message, AS2Header.CONTENT_TYPE);
+ ContentType contentType = ContentType.parse(contentTypeStr);
+
+
+ // Determine Charset
+ String charsetName = AS2Charset.US_ASCII;
+ Charset charset = contentType.getCharset();
+ if (charset != null) {
+ charsetName = charset.name();
}
+
+ // Get any Boundary Value
+ String boundary = HttpMessageUtils.getParameterValue(message,
AS2Header.CONTENT_TYPE, "boundary");
+
+ // Determine content transfer encoding
+ String contentTransferEncoding =
HttpMessageUtils.getHeaderValue(message, AS2Header.CONTENT_TRANSFER_ENCODING);
+
+ AS2SessionInputBuffer inBuffer = new AS2SessionInputBuffer(new
HttpTransportMetricsImpl(), 8 * 1024);
+ inBuffer.bind(entity.getContent());
+
switch (contentType.getMimeType().toLowerCase()) {
case AS2MimeType.APPLICATION_EDIFACT:
case AS2MimeType.APPLICATION_EDI_X12:
case AS2MimeType.APPLICATION_EDI_CONSENT:
- parseApplicationEDIEntity(message);
+ parseApplicationEDIEntity(message, inBuffer, contentType,
contentTransferEncoding);
break;
case AS2MimeType.MULTIPART_SIGNED:
- parseMultipartSignedEntity(message);
+ parseMultipartSignedEntity(message, inBuffer, boundary,
charsetName, contentTransferEncoding);
break;
case AS2MimeType.APPLICATION_PKCS7_MIME:
+ switch (contentType.getParameter("smime-type")) {
+ case "compressed-data":
+ parseApplicationPkcs7MimeCompressedEntity(message,
inBuffer, contentType, contentTransferEncoding);
+ break;
+ case "enveloped-data":
+ parseApplicationPkcs7MimeEnvelopedEntity(message,
inBuffer, contentType, contentTransferEncoding);
+ break;
+ default:
+ }
break;
case AS2MimeType.MULTIPART_REPORT:
- parseMessageDispositionNotificationReportEntity(message);
+ parseMessageDispositionNotificationReportEntity(message,
inBuffer, boundary, charsetName, contentTransferEncoding);
break;
default:
break;
}
+ } catch (HttpException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new HttpException("Failed to parse entity content", e);
}
}
}
@@ -1043,4 +1063,121 @@ public static String parseBodyPartText(final
AS2SessionInputBuffer inbuffer,
}
return fields;
}
+
+ public static HttpEntity extractEdiPayload(HttpEntityEnclosingRequest
request, PrivateKey privateKey) throws HttpException {
+
+ String contentTypeString = HttpMessageUtils.getHeaderValue(request,
AS2Header.CONTENT_TYPE);
+ if (contentTypeString == null) {
+ throw new HttpException("Failed to create MIC: content type
missing from request");
+ }
+ ContentType contentType = ContentType.parse(contentTypeString);
+
+ parseAS2MessageEntity(request);
+ MimeEntity ediEntity = null;
+ switch (contentType.getMimeType().toLowerCase()) {
+ case AS2MimeType.APPLICATION_EDIFACT:
+ case AS2MimeType.APPLICATION_EDI_X12:
+ case AS2MimeType.APPLICATION_EDI_CONSENT: {
+ ediEntity = HttpMessageUtils.getEntity(request,
ApplicationEDIEntity.class);
+ break;
+ }
+ case AS2MimeType.MULTIPART_SIGNED: {
+ MultipartSignedEntity multipartSignedEntity =
HttpMessageUtils.getEntity(request,
+ MultipartSignedEntity.class);
+ ediEntity = multipartSignedEntity.getSignedDataEntity();
+ break;
+ }
+ case AS2MimeType.APPLICATION_PKCS7_MIME: {
+ switch(contentType.getParameter("smime-type")) {
+ case "compressed-data": {
+ ApplicationPkcs7MimeCompressedDataEntity compressedDataEntity
= HttpMessageUtils.getEntity(request,
ApplicationPkcs7MimeCompressedDataEntity.class);
+ ediEntity =
extractEdiPayloadFromCompressedEntity(compressedDataEntity);
+ break;
+ }
+ case "enveloped-data": {
+ if (privateKey == null) {
+ throw new HttpException("Failed to get EDI message from
encrypted request: private key is null");
+ }
+ ApplicationPkcs7MimeEnvelopedDataEntity envelopedDataEntity =
HttpMessageUtils.getEntity(request,
ApplicationPkcs7MimeEnvelopedDataEntity.class);
+ ediEntity =
extractEdiPayloadFromEnvelopedEntity(envelopedDataEntity, privateKey);
+ break;
+ }
+ default:
+ throw new HttpException("Failed to create MIC: unknown " +
AS2MimeType.APPLICATION_PKCS7_MIME + " smime-type: " +
contentType.getParameter("smime-type"));
+ }
+ break;
+ }
+ default:
+ throw new HttpException("Failed to create MIC: invalid content
type '" + contentType.getMimeType() + "' for message integrity check");
+ }
+
+ return ediEntity;
+
+ }
+
+ private static MimeEntity
extractEdiPayloadFromEnvelopedEntity(ApplicationPkcs7MimeEnvelopedDataEntity
envelopedDataEntity, PrivateKey privateKey) throws HttpException {
+ MimeEntity ediEntity = null;
+
+ MimeEntity entity = envelopedDataEntity.getEncryptedEntity(privateKey);
+ String contentTypeString = entity.getContentTypeValue();
+ if (contentTypeString == null) {
+ throw new HttpException("Failed to create MIC: content type
missing from encrypted entity");
+ }
+ ContentType contentType = ContentType.parse(contentTypeString);
+
+ switch(contentType.getMimeType().toLowerCase()) {
+ case AS2MimeType.APPLICATION_EDIFACT:
+ case AS2MimeType.APPLICATION_EDI_X12:
+ case AS2MimeType.APPLICATION_EDI_CONSENT: {
+ ediEntity = entity;
+ break;
+ }
+ case AS2MimeType.MULTIPART_SIGNED: {
+ MultipartSignedEntity multipartSignedEntity =
(MultipartSignedEntity) entity;
+ ediEntity = multipartSignedEntity.getSignedDataEntity();
+ break;
+ }
+ case AS2MimeType.APPLICATION_PKCS7_MIME: {
+ if
(contentType.getParameter("mime-type").equals("compressed-data")) {
+ throw new HttpException("Failed to extract EDI payload:
invalid mime type '" + contentType.getParameter("mime-type") + "' for AS2
enveloped entity");
+ }
+ ApplicationPkcs7MimeCompressedDataEntity compressedDataEntity =
(ApplicationPkcs7MimeCompressedDataEntity) entity;
+ ediEntity =
extractEdiPayloadFromCompressedEntity(compressedDataEntity);
+ break;
+ }
+ default:
+ throw new HttpException("Failed to extract EDI payload: invalid
content type '" + contentType.getMimeType() + "' for AS2 enveloped entity");
+ }
+
+ return ediEntity;
+ }
+
+ private static MimeEntity
extractEdiPayloadFromCompressedEntity(ApplicationPkcs7MimeCompressedDataEntity
compressedDataEntity) throws HttpException {
+ MimeEntity ediEntity = null;
+
+ MimeEntity entity = compressedDataEntity.getCompressedEntity(new
ZlibExpanderProvider());
+ String contentTypeString = entity.getContentTypeValue();
+ if (contentTypeString == null) {
+ throw new HttpException("Failed to extract EDI payload: content
type missing from compressed entity");
+ }
+ ContentType contentType = ContentType.parse(contentTypeString);
+
+ switch(contentType.getMimeType().toLowerCase()) {
+ case AS2MimeType.APPLICATION_EDIFACT:
+ case AS2MimeType.APPLICATION_EDI_X12:
+ case AS2MimeType.APPLICATION_EDI_CONSENT: {
+ ediEntity = entity;
+ break;
+ }
+ case AS2MimeType.MULTIPART_SIGNED: {
+ MultipartSignedEntity multipartSignedEntity =
(MultipartSignedEntity) entity;
+ ediEntity = multipartSignedEntity.getSignedDataEntity();
+ break;
+ }
+ default:
+ throw new HttpException("Failed to extract EDI payload: invalid
content type '" + contentType.getMimeType() + "' for AS2 compressed entity");
+ }
+
+ return ediEntity;
+ }
}
diff --git
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
index 926d345d190..560eb1c93ad 100644
---
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
+++
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
@@ -32,6 +32,7 @@
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.ApplicationEDIX12Entity;
+import org.apache.camel.component.as2.api.entity.MimeEntity;
import org.apache.commons.codec.binary.Base64InputStream;
import org.apache.commons.codec.binary.Base64OutputStream;
import org.apache.commons.codec.net.QuotedPrintableCodec;
@@ -242,6 +243,12 @@ public static void setMessageEntity(HttpMessage message,
HttpEntity entity) {
if (contentTypeHeader != null) {
message.setHeader(contentTypeHeader);
}
+ if (entity instanceof MimeEntity) {
+ Header contentTransferEncodingHeader =
((MimeEntity)entity).getContentTransferEncoding();
+ if (contentTransferEncodingHeader != null) {
+ message.setHeader(contentTransferEncodingHeader);
+ }
+ }
long contentLength = entity.getContentLength();
message.setHeader(AS2Header.CONTENT_LENGTH,
Long.toString(contentLength));
}
diff --git
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/MicUtils.java
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/MicUtils.java
index 4aec7f665d9..8eb66b13d86 100644
---
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/MicUtils.java
+++
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/MicUtils.java
@@ -25,6 +25,7 @@
import org.apache.camel.component.as2.api.AS2MicAlgorithm;
import org.apache.camel.component.as2.api.AS2MimeType;
import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity;
+import
org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeCompressedDataEntity;
import
org.apache.camel.component.as2.api.entity.DispositionNotificationOptions;
import
org.apache.camel.component.as2.api.entity.DispositionNotificationOptionsParser;
import org.apache.camel.component.as2.api.entity.EntityParser;
@@ -96,33 +97,7 @@ public static ReceivedContentMic
createReceivedContentMic(HttpEntityEnclosingReq
return null;
}
- String contentTypeString = HttpMessageUtils.getHeaderValue(request,
AS2Header.CONTENT_TYPE);
- if (contentTypeString == null) {
- LOG.debug("can not create MIC: content type missing from request");
- return null;
- }
- ContentType contentType = ContentType.parse(contentTypeString);
-
- HttpEntity entity = null;
- switch (contentType.getMimeType().toLowerCase()) {
- case AS2MimeType.APPLICATION_EDIFACT:
- case AS2MimeType.APPLICATION_EDI_X12:
- case AS2MimeType.APPLICATION_EDI_CONSENT: {
- EntityParser.parseAS2MessageEntity(request);
- entity = HttpMessageUtils.getEntity(request,
ApplicationEDIEntity.class);
- break;
- }
- case AS2MimeType.MULTIPART_SIGNED: {
- EntityParser.parseAS2MessageEntity(request);
- MultipartSignedEntity multipartSignedEntity =
HttpMessageUtils.getEntity(request,
- MultipartSignedEntity.class);
- entity = multipartSignedEntity.getSignedDataEntity();
- break;
- }
- default:
- LOG.debug("can not create MIC: invalid content type '{}' for
message integrity check", contentType.getMimeType());
- return null;
- }
+ HttpEntity entity = EntityParser.extractEdiPayload(request, null);
byte[] content = EntityUtils.getContent(entity);
@@ -131,7 +106,7 @@ public static ReceivedContentMic
createReceivedContentMic(HttpEntityEnclosingReq
try {
return new ReceivedContentMic(micAS2AlgorithmName, mic);
} catch (Exception e) {
- throw new HttpException("failed to encode MIC", e);
+ throw new HttpException("Failed to encode MIC", e);
}
}
diff --git
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
index f4b530a019e..ffe26df4024 100644
---
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
+++
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
@@ -77,20 +77,6 @@ public static AS2SignedDataGenerator
createSigningGenerator(AS2SignatureAlgorith
} catch (Exception e) {
throw new HttpException("Failed to create signer info", e);
}
-// for (String signingAlgorithmName :
AS2SignedDataGenerator.getSupportedSignatureAlgorithmNamesForKey(privateKey)) {
-// try {
-// signerInfoGenerator = new
JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC")
-// .setSignedAttributeGenerator(new AttributeTable(attributes))
-// .build(signingAlgorithmName, privateKey, signingCert);
-// break;
-// } catch (Exception e) {
-// signerInfoGenerator = null;
-// continue;
-// }
-// }
-// if (signerInfoGenerator == null) {
-// throw new HttpException("Failed to create signer info");
-// }
gen.addSignerInfoGenerator(signerInfoGenerator);
// Create and populate certificate store.
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 b764d620bc4..b9d336ac030 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
@@ -272,7 +272,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, 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);
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -316,7 +316,7 @@ 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(),
- null, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null);
+ null, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS, null, null);
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -478,7 +478,7 @@ public void envelopedMessageTest(AS2EncryptionAlgorithm
encryptionAlgorithm) thr
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());
+ certList.toArray(new Certificate[0]));
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -539,7 +539,7 @@ public void
envelopedAndSignedMessageTest(AS2EncryptionAlgorithm encryptionAlgor
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());
+ certList.toArray(new Certificate[0]));
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -606,7 +606,7 @@ 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(),
- null, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null);
+ null, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS, null, null);
HttpRequest request = httpContext.getRequest();
assertTrue("Request does not contain entity", request instanceof
BasicHttpEntityEnclosingRequest);
@@ -634,8 +634,7 @@ 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, 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);
HttpResponse response = httpContext.getResponse();
assertEquals("Unexpected method value", HttpVersion.HTTP_1_1,
response.getStatusLine().getProtocolVersion());
@@ -751,7 +750,7 @@ public void compressedMessageTest() throws Exception {
ContentType.create(AS2MediaType.APPLICATION_EDIFACT,
AS2Charset.US_ASCII), null,
null, null, null, AS2CompressionAlgorithm.ZLIB,
DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS,
null,
- null, null);
+ null);
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -804,10 +803,10 @@ public void compressedAndSignedMessageTest() throws
Exception {
HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE,
REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME,
AS2MessageStructure.SIGNED_COMPRESSED,
- ContentType.create(AS2MediaType.APPLICATION_EDIFACT,
AS2Charset.US_ASCII), null,
+ ContentType.create(AS2MediaType.APPLICATION_EDIFACT,
AS2Charset.US_ASCII), "base64",
AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new
Certificate[0]), signingKP.getPrivate(), AS2CompressionAlgorithm.ZLIB,
DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS,
null,
- null, null);
+ null);
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -875,10 +874,10 @@ public void envelopedAndCompressedMessageTest() throws
Exception {
HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE,
REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME,
AS2MessageStructure.ENCRYPTED_COMPRESSED,
- ContentType.create(AS2MediaType.APPLICATION_EDIFACT,
AS2Charset.US_ASCII), null,
+ ContentType.create(AS2MediaType.APPLICATION_EDIFACT,
AS2Charset.US_ASCII), "base64",
null, null, null, AS2CompressionAlgorithm.ZLIB,
DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS,
AS2EncryptionAlgorithm.AES128_CBC,
- certList.toArray(new Certificate[0]), signingKP.getPrivate());
+ certList.toArray(new Certificate[0]));
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
@@ -942,7 +941,7 @@ public void envelopedCompressedAndSignedMessageTest()
throws Exception {
ContentType.create(AS2MediaType.APPLICATION_EDIFACT,
AS2Charset.US_ASCII), null,
AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new
Certificate[0]), signingKP.getPrivate(),
AS2CompressionAlgorithm.ZLIB, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS,
- AS2EncryptionAlgorithm.AES128_CBC, certList.toArray(new
Certificate[0]), signingKP.getPrivate());
+ AS2EncryptionAlgorithm.AES128_CBC, certList.toArray(new
Certificate[0]));
HttpRequest request = httpContext.getRequest();
assertEquals("Unexpected method value", METHOD,
request.getRequestLine().getMethod());
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 d5b3a0dd646..ead203705a9 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
@@ -204,7 +204,7 @@ public void
parseMessageDispositionNotificationReportMessageTest() throws Except
entity.setContent(is);
EntityUtils.setMessageEntity(response, entity);
- EntityParser.parseMessageDispositionNotificationReportEntity(response);
+ EntityParser.parseAS2MessageEntity(response);
HttpEntity parsedEntity = EntityUtils.getMessageEntity(response);
assertNotNull("Unexpected Null message disposition notification report
entity", parsedEntity);
assertTrue("Unexpected type for message disposition notification
report entity", parsedEntity instanceof
DispositionNotificationMultipartReportEntity);
diff --git a/components/camel-as2/camel-as2-component/pom.xml
b/components/camel-as2/camel-as2-component/pom.xml
index 8903e25dca7..d6ca3a7d6a6 100644
--- a/components/camel-as2/camel-as2-component/pom.xml
+++ b/components/camel-as2/camel-as2-component/pom.xml
@@ -156,7 +156,23 @@
<proxyClass>org.apache.camel.component.as2.api.AS2ClientManager</proxyClass>
<fromJavadoc>
<excludeMethods>createSigningGenerator</excludeMethods>
+
<excludeMethods>createEncryptingGenerator</excludeMethods>
+
<excludeMethods>createCompressorGenerator</excludeMethods>
+ <excludeMethods>createEncryptor</excludeMethods>
+ <excludeMethods>createCompressor</excludeMethods>
</fromJavadoc>
+ <nullableOptions>
+
<nullableOption>ediMessageTransferEncoding</nullableOption>
+ <nullableOption>signingAlgorithm</nullableOption>
+
<nullableOption>signingCertificateChain</nullableOption>
+ <nullableOption>signingPrivateKey</nullableOption>
+ <nullableOption>compressionAlgorithm</nullableOption>
+
<nullableOption>dispositionNotificationTo</nullableOption>
+
<nullableOption>signedReceiptMicAlgorithms</nullableOption>
+ <nullableOption>encryptingAlgorithm</nullableOption>
+
<nullableOption>encryptingCertificateChain</nullableOption>
+ <nullableOption>encryptingPrivateKey</nullableOption>
+ </nullableOptions>
</api>
<api>
<apiName>server</apiName>
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 36c03866316..9f83ea2747d 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
@@ -31,6 +31,7 @@
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.as2.api.AS2AsynchronousMDNManager;
import org.apache.camel.component.as2.api.AS2Charset;
+import org.apache.camel.component.as2.api.AS2CompressionAlgorithm;
import org.apache.camel.component.as2.api.AS2Constants;
import org.apache.camel.component.as2.api.AS2EncryptionAlgorithm;
import org.apache.camel.component.as2.api.AS2Header;
@@ -45,6 +46,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.ApplicationPkcs7MimeCompressedDataEntity;
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;
@@ -83,6 +85,7 @@
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.cert.jcajce.JcaCertStore;
import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder;
+import org.bouncycastle.cms.jcajce.ZlibExpanderProvider;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.AfterClass;
import org.junit.Before;
@@ -222,20 +225,8 @@ public void plainMessageSendTest() throws Exception {
headers.put("CamelAS2.ediMessageContentType",
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII));
// parameter type is String
headers.put("CamelAS2.ediMessageTransferEncoding",
EDI_MESSAGE_CONTENT_TRANSFER_ENCODING);
- // parameter type is java.security.cert.Certificate[]
- headers.put("CamelAS2.signingCertificateChain", null);
- // parameter type is java.security.PrivateKey
- headers.put("CamelAS2.signingPrivateKey", null);
// parameter type is String
headers.put("CamelAS2.dispositionNotificationTo", "[email protected]");
- // parameter type is String[]
- headers.put("CamelAS2.signedReceiptMicAlgorithms", null);
- // parameter type is
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm
- headers.put("CamelAS2.encryptingAlgorithm", null);
- // parameter type is java.security.cert.Certificate[]
- headers.put("CamelAS2.encryptingCertificateChain", null);
- // parameter type is java.security.PrivateKey
- headers.put("CamelAS2.encryptingPrivateKey", null);
final org.apache.http.protocol.HttpCoreContext result =
requestBodyAndHeaders("direct://SEND", EDI_MESSAGE, headers);
@@ -302,14 +293,8 @@ public void envelopedMessageSendTest() throws Exception {
headers.put("CamelAS2.ediMessageContentType",
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII));
// parameter type is String
headers.put("CamelAS2.ediMessageTransferEncoding",
EDI_MESSAGE_CONTENT_TRANSFER_ENCODING);
- // parameter type is java.security.cert.Certificate[]
- headers.put("CamelAS2.signingCertificateChain", null);
- // parameter type is java.security.PrivateKey
- headers.put("CamelAS2.signingPrivateKey", null);
// parameter type is String
headers.put("CamelAS2.dispositionNotificationTo", "[email protected]");
- // parameter type is String[]
- headers.put("CamelAS2.signedReceiptMicAlgorithms", null);
// parameter type is
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm
headers.put("CamelAS2.encryptingAlgorithm",
AS2EncryptionAlgorithm.AES128_CBC);
// parameter type is java.security.cert.Certificate[]
@@ -384,6 +369,8 @@ public void multipartSignedMessageTest() throws Exception {
headers.put("CamelAS2.ediMessageContentType",
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII));
// parameter type is String
headers.put("CamelAS2.ediMessageTransferEncoding",
EDI_MESSAGE_CONTENT_TRANSFER_ENCODING);
+ // parameter type is
org.apache.camel.component.as2.api.AS2SignatureAlgorithm
+ headers.put("CamelAS2.signingAlgorithm",
AS2SignatureAlgorithm.SHA512WITHRSA);
// parameter type is java.security.cert.Certificate[]
headers.put("CamelAS2.signingCertificateChain", certList.toArray(new
Certificate[0]));
// parameter type is java.security.PrivateKey
@@ -392,12 +379,6 @@ public void multipartSignedMessageTest() throws Exception {
headers.put("CamelAS2.dispositionNotificationTo", "[email protected]");
// parameter type is String[]
headers.put("CamelAS2.signedReceiptMicAlgorithms",
SIGNED_RECEIPT_MIC_ALGORITHMS);
- // parameter type is
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm
- headers.put("CamelAS2.encryptingAlgorithm", null);
- // parameter type is java.security.cert.Certificate[]
- headers.put("CamelAS2.encryptingCertificateChain", null);
- // parameter type is java.security.PrivateKey
- headers.put("CamelAS2.encryptingPrivateKey", null);
final org.apache.http.protocol.HttpCoreContext result =
requestBodyAndHeaders("direct://SEND", EDI_MESSAGE, headers);
@@ -460,6 +441,93 @@ public void multipartSignedMessageTest() throws Exception {
assertEquals("Received content MIC does not match computed",
computedContentMic.getEncodedMessageDigest(),
receivedContentMic.getEncodedMessageDigest());
}
+ @Test
+ public void compressedMessageTest() throws Exception {
+ final Map<String, Object> headers = new HashMap<>();
+ // parameter type is String
+ headers.put("CamelAS2.requestUri", REQUEST_URI);
+ // parameter type is String
+ headers.put("CamelAS2.subject", SUBJECT);
+ // parameter type is String
+ headers.put("CamelAS2.from", FROM);
+ // parameter type is String
+ headers.put("CamelAS2.as2From", AS2_NAME);
+ // parameter type is String
+ headers.put("CamelAS2.as2To", AS2_NAME);
+ // parameter type is
org.apache.camel.component.as2.api.AS2MessageStructure
+ headers.put("CamelAS2.as2MessageStructure",
AS2MessageStructure.PLAIN_COMPRESSED);
+ // parameter type is org.apache.http.entity.ContentType
+ headers.put("CamelAS2.ediMessageContentType",
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII));
+ // parameter type is String
+ headers.put("CamelAS2.ediMessageTransferEncoding",
EDI_MESSAGE_CONTENT_TRANSFER_ENCODING);
+ // parameter type is
org.apache.camel.component.as2.api.AS2CompressionAlgorithm
+ headers.put("CamelAS2.compressionAlgorithm",
AS2CompressionAlgorithm.ZLIB);
+ // parameter type is String
+ headers.put("CamelAS2.dispositionNotificationTo", "[email protected]");
+ // parameter type is String[]
+ headers.put("CamelAS2.signedReceiptMicAlgorithms",
SIGNED_RECEIPT_MIC_ALGORITHMS);
+
+ final org.apache.http.protocol.HttpCoreContext result =
requestBodyAndHeaders("direct://SEND", EDI_MESSAGE, headers);
+
+ assertNotNull("send result", result);
+ LOG.debug("send: " + result);
+ HttpRequest request = result.getRequest();
+ assertNotNull("Request", request);
+ assertTrue("Request does not contain body", request instanceof
HttpEntityEnclosingRequest);
+ HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity();
+ assertNotNull("Request body", entity);
+ assertTrue("Request body does not contain EDI entity", entity
instanceof ApplicationPkcs7MimeCompressedDataEntity);
+
+ MimeEntity compressedEntity =
((ApplicationPkcs7MimeCompressedDataEntity)entity).getCompressedEntity(new
ZlibExpanderProvider());
+ assertTrue("Signed entity wrong type", compressedEntity instanceof
ApplicationEDIEntity);
+ ApplicationEDIEntity ediMessageEntity = (ApplicationEDIEntity)
compressedEntity;
+ String ediMessage = ediMessageEntity.getEdiMessage();
+ assertEquals("EDI message is different",
EDI_MESSAGE.replaceAll("[\n\r]", ""), ediMessage.replaceAll("[\n\r]", ""));
+
+ HttpResponse response = result.getResponse();
+ assertNotNull("Response", response);
+ String contentTypeHeaderValue =
HttpMessageUtils.getHeaderValue(response, AS2Header.CONTENT_TYPE);
+ ContentType responseContentType =
ContentType.parse(contentTypeHeaderValue);
+ assertEquals("Unexpected response type", AS2MimeType.MULTIPART_SIGNED,
responseContentType.getMimeType());
+ assertEquals("Unexpected mime version", AS2Constants.MIME_VERSION,
HttpMessageUtils.getHeaderValue(response, AS2Header.MIME_VERSION));
+ assertEquals("Unexpected AS2 version", EXPECTED_AS2_VERSION,
HttpMessageUtils.getHeaderValue(response, AS2Header.AS2_VERSION));
+ assertEquals("Unexpected MDN subject", EXPECTED_MDN_SUBJECT,
HttpMessageUtils.getHeaderValue(response, AS2Header.SUBJECT));
+ assertEquals("Unexpected MDN from", MDN_FROM,
HttpMessageUtils.getHeaderValue(response, AS2Header.FROM));
+ assertEquals("Unexpected AS2 from", AS2_NAME,
HttpMessageUtils.getHeaderValue(response, AS2Header.AS2_FROM));
+ assertEquals("Unexpected AS2 to", AS2_NAME,
HttpMessageUtils.getHeaderValue(response, AS2Header.AS2_TO));
+ assertNotNull("Missing message id",
HttpMessageUtils.getHeaderValue(response, AS2Header.MESSAGE_ID));
+
+ HttpEntity responseEntity = response.getEntity();
+ assertNotNull("Response entity", responseEntity);
+ assertTrue("Unexpected response entity type", responseEntity
instanceof MultipartSignedEntity);
+ MultipartSignedEntity responseSignedEntity = (MultipartSignedEntity)
responseEntity;
+ assertTrue("Signature for response entity is invalid",
responseSignedEntity.isValid());
+ MimeEntity responseSignedDataEntity =
responseSignedEntity.getSignedDataEntity();
+ assertTrue("Signed entity wrong type", responseSignedDataEntity
instanceof DispositionNotificationMultipartReportEntity);
+ DispositionNotificationMultipartReportEntity reportEntity =
(DispositionNotificationMultipartReportEntity)responseSignedDataEntity;
+ assertEquals("Unexpected number of body parts in report", 2,
reportEntity.getPartCount());
+ MimeEntity firstPart = reportEntity.getPart(0);
+ assertEquals("Unexpected content type in first body part of report",
ContentType.create(AS2MimeType.TEXT_PLAIN, AS2Charset.US_ASCII).toString(),
firstPart.getContentTypeValue());
+ MimeEntity secondPart = reportEntity.getPart(1);
+ assertEquals("Unexpected content type in second body part of report",
+
ContentType.create(AS2MimeType.MESSAGE_DISPOSITION_NOTIFICATION,
AS2Charset.US_ASCII).toString(),
+ secondPart.getContentTypeValue());
+ ApplicationPkcs7SignatureEntity signatureEntity =
responseSignedEntity.getSignatureEntity();
+ assertNotNull("Signature Entity", signatureEntity);
+
+ assertTrue("", secondPart instanceof
AS2MessageDispositionNotificationEntity);
+ AS2MessageDispositionNotificationEntity
messageDispositionNotificationEntity =
(AS2MessageDispositionNotificationEntity) secondPart;
+ assertEquals("Unexpected value for reporting UA", ORIGIN_SERVER_NAME,
messageDispositionNotificationEntity.getReportingUA());
+ assertEquals("Unexpected value for final recipient", AS2_NAME,
messageDispositionNotificationEntity.getFinalRecipient());
+ assertEquals("Unexpected value for original message ID",
HttpMessageUtils.getHeaderValue(request, AS2Header.MESSAGE_ID),
messageDispositionNotificationEntity.getOriginalMessageId());
+ assertEquals("Unexpected value for disposition mode",
DispositionMode.AUTOMATIC_ACTION_MDN_SENT_AUTOMATICALLY,
messageDispositionNotificationEntity.getDispositionMode());
+ assertEquals("Unexpected value for disposition type",
AS2DispositionType.PROCESSED,
messageDispositionNotificationEntity.getDispositionType());
+
+ ReceivedContentMic receivedContentMic =
messageDispositionNotificationEntity.getReceivedContentMic();
+ ReceivedContentMic computedContentMic =
MicUtils.createReceivedContentMic((HttpEntityEnclosingRequest)request);
+ assertEquals("Received content MIC does not match computed",
computedContentMic.getEncodedMessageDigest(),
receivedContentMic.getEncodedMessageDigest());
+ }
+
@Test
public void asyncMDNTest() throws Exception {
AS2AsynchronousMDNManager mdnManager = new
AS2AsynchronousMDNManager(AS2_VERSION, ORIGIN_SERVER_NAME, SERVER_FQDN,
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 0f6b93125ca..cb58af7716e 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,
- null, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null);
+ null, DISPOSITION_NOTIFICATION_TO,
SIGNED_RECEIPT_MIC_ALGORITHMS, null, null);
MockEndpoint mockEndpoint = getMockEndpoint("mock:as2RcvMsgs");
mockEndpoint.expectedMinimumMessageCount(1);
@@ -186,7 +186,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(),
null, DISPOSITION_NOTIFICATION_TO,
- SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, null);
+ SIGNED_RECEIPT_MIC_ALGORITHMS, null, null);
MockEndpoint mockEndpoint = getMockEndpoint("mock:as2RcvMsgs");
mockEndpoint.expectedMinimumMessageCount(1);
----------------------------------------------------------------
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:
[email protected]
Issue Time Tracking
-------------------
Worklog Id: (was: 174523)
Time Spent: 10m
Remaining Estimate: 0h
> 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
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Enhance the AS2 Component to support encrypted AS2 messages per RFC4130
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)