This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 64f050bc294174e680f4f3f32beedf1d75bc62bd Author: William Collins <punkhor...@gmail.com> AuthorDate: Thu Sep 20 13:45:59 2018 -0400 [CAMEL-12605] Fixed parsing issue with MultipartSignedEntityBody --- .../component/as2/api/entity/EntityParser.java | 34 +++++++++++++++------- .../component/as2/api/util/AS2HeaderUtils.java | 4 +-- .../component/as2/api/util/HttpMessageUtils.java | 5 ++-- 3 files changed, 29 insertions(+), 14 deletions(-) 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 b2c3f46..60cee06 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 @@ -40,11 +40,13 @@ import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpException; import org.apache.http.HttpMessage; +import org.apache.http.NameValuePair; import org.apache.http.ParseException; import org.apache.http.entity.ContentType; import org.apache.http.impl.io.AbstractMessageParser; import org.apache.http.impl.io.HttpTransportMetricsImpl; import org.apache.http.message.BasicLineParser; +import org.apache.http.message.BasicNameValuePair; import org.apache.http.message.LineParser; import org.apache.http.message.ParserCursor; import org.apache.http.util.Args; @@ -276,12 +278,18 @@ public final class EntityParser { inbuffer.bind(entity.getContent()); // Get Boundary Value - String boundary = HttpMessageUtils.getBoundaryParameterValue(message, AS2Header.CONTENT_TYPE); + String boundary = HttpMessageUtils.getParameterValue(message, AS2Header.CONTENT_TYPE, "boundary"); if (boundary == null) { - throw new HttpException("Failed to retrive boundary value"); + 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, charsetName, contentTransferEncoding); + multipartSignedEntity = parseMultipartSignedEntityBody(inbuffer, boundary, micalg, charsetName, contentTransferEncoding); multipartSignedEntity.setMainBody(true); EntityUtils.setMessageEntity(message, multipartSignedEntity); @@ -370,7 +378,7 @@ public final class EntityParser { inbuffer.bind(entity.getContent()); // Get Boundary Value - String boundary = HttpMessageUtils.getBoundaryParameterValue(message, AS2Header.CONTENT_TYPE); + String boundary = HttpMessageUtils.getParameterValue(message, AS2Header.CONTENT_TYPE, "boundary"); if (boundary == null) { throw new HttpException("Failed to retrive boundary value"); } @@ -420,6 +428,7 @@ public final class EntityParser { public static MultipartSignedEntity parseMultipartSignedEntityBody(AS2SessionInputBuffer inbuffer, String boundary, + String micalg, String charsetName, String contentTransferEncoding) throws ParseException { @@ -514,7 +523,11 @@ public final class EntityParser { // // End Signature Body Part - ContentType contentType = ContentType.create(AS2MimeType.MULTIPART_SIGNED, charset); + NameValuePair[] parameters = new NameValuePair[] { + new BasicNameValuePair("protocol", AS2MimeType.APPLICATION_PKCS7_SIGNATURE), + new BasicNameValuePair("boundary", boundary), new BasicNameValuePair("micalg", micalg), + new BasicNameValuePair("charset", charsetName)}; + ContentType contentType = ContentType.create(AS2MimeType.MULTIPART_SIGNED, parameters); multipartSignedEntity.setContentType(contentType); multipartSignedEntity.setContentTransferEncoding(contentTransferEncoding); return multipartSignedEntity; @@ -731,9 +744,10 @@ public final class EntityParser { entity = parseEDIEntityBody(inbuffer, boundary, entityContentType, contentTransferEncoding); break; case AS2MimeType.MULTIPART_SIGNED: - String multipartSignedBoundary = AS2HeaderUtils.getBoundaryParameterValue(headers, - AS2Header.CONTENT_TYPE); - entity = parseMultipartSignedEntityBody(inbuffer, multipartSignedBoundary, charset.name(), + String multipartSignedBoundary = AS2HeaderUtils.getParameterValue(headers, + AS2Header.CONTENT_TYPE, "boundary"); + String micalg = AS2HeaderUtils.getParameterValue(headers, AS2Header.CONTENT_TYPE, "micalg"); + entity = parseMultipartSignedEntityBody(inbuffer, multipartSignedBoundary, micalg, charset.name(), contentTransferEncoding); skipToBoundary(inbuffer, boundary); break; @@ -742,8 +756,8 @@ public final class EntityParser { contentTransferEncoding); break; case AS2MimeType.MULTIPART_REPORT: - String multipartReportBoundary = AS2HeaderUtils.getBoundaryParameterValue(headers, - AS2Header.CONTENT_TYPE); + String multipartReportBoundary = AS2HeaderUtils.getParameterValue(headers, + AS2Header.CONTENT_TYPE, "boundary"); entity = parseMultipartReportEntityBody(inbuffer, multipartReportBoundary, charset.name(), contentTransferEncoding); skipToBoundary(inbuffer, boundary); diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java index 213183b..db589d5 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java @@ -145,14 +145,14 @@ public final class AS2HeaderUtils { return new Parameter(name, importance, values.toArray(new String[values.size()])); } - public static String getBoundaryParameterValue(Header[] headers, String headerName) { + public static String getParameterValue(Header[] headers, String headerName, String parameterName) { Args.notNull(headers, "headers"); Args.notNull(headerName, "headerName"); for (Header header : headers) { if (header.getName().equalsIgnoreCase(headerName)) { for (HeaderElement headerElement : header.getElements()) { for (NameValuePair nameValuePair : headerElement.getParameters()) { - if (nameValuePair.getName().equalsIgnoreCase("boundary")) { + if (nameValuePair.getName().equalsIgnoreCase(parameterName)) { return nameValuePair.getValue(); } } diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java index 1563c7a..0bf4962 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java @@ -96,16 +96,17 @@ public final class HttpMessageUtils { } } - public static String getBoundaryParameterValue(HttpMessage message, String headerName) { + public static String getParameterValue(HttpMessage message, String headerName, String parameterName) { Args.notNull(message, "message"); Args.notNull(headerName, "headerName"); + Args.notNull(parameterName, "parameterName"); Header header = message.getFirstHeader(headerName); if (header == null) { return null; } for (HeaderElement headerElement : header.getElements()) { for (NameValuePair nameValuePair : headerElement.getParameters()) { - if (nameValuePair.getName().equalsIgnoreCase("boundary")) { + if (nameValuePair.getName().equalsIgnoreCase(parameterName)) { return nameValuePair.getValue(); } }