Skip to content

Commit

Permalink
[CAMEL-11257] Fixed multipart parsing logic and updated tests (#2310)
Browse files Browse the repository at this point in the history
  • Loading branch information
William Collins authored and davsclaus committed May 2, 2018
1 parent be70141 commit e42f28d
Show file tree
Hide file tree
Showing 5 changed files with 261 additions and 30 deletions.
Expand Up @@ -446,7 +446,14 @@ public static MultipartSignedEntity parseMultipartSignedEntityBody(AS2SessionInp
applicationPkcs7SignatureEntity.setHeaders(headers); applicationPkcs7SignatureEntity.setHeaders(headers);
multipartSignedEntity.addPart(applicationPkcs7SignatureEntity); multipartSignedEntity.addPart(applicationPkcs7SignatureEntity);


//
// End Signature Body Part

ContentType contentType = ContentType.create(AS2MimeType.MULTIPART_SIGNED, charset);
multipartSignedEntity.setContentType(contentType);
multipartSignedEntity.setContentTransferEncoding(contentTransferEncoding);
return multipartSignedEntity; return multipartSignedEntity;

} catch (Exception e) { } catch (Exception e) {
ParseException parseException = new ParseException("failed to parse text entity"); ParseException parseException = new ParseException("failed to parse text entity");
parseException.initCause(e); parseException.initCause(e);
Expand Down Expand Up @@ -560,7 +567,10 @@ public static DispositionNotificationMultipartReportEntity parseMultipartReportE


// //
// End Disposition Notification Body Part // End Disposition Notification Body Part


ContentType contentType = ContentType.create(AS2MimeType.MULTIPART_REPORT, charset);
dispositionNotificationMultipartReportEntity.setContentType(contentType);
dispositionNotificationMultipartReportEntity.setContentTransferEncoding(contentTransferEncoding);
return dispositionNotificationMultipartReportEntity; return dispositionNotificationMultipartReportEntity;
} catch (Exception e) { } catch (Exception e) {
ParseException parseException = new ParseException("failed to parse text entity"); ParseException parseException = new ParseException("failed to parse text entity");
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.apache.http.entity.ContentType; import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.HeaderGroup; import org.apache.http.message.HeaderGroup;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.Args; import org.apache.http.util.Args;


public abstract class MimeEntity extends AbstractHttpEntity { public abstract class MimeEntity extends AbstractHttpEntity {
Expand Down Expand Up @@ -92,7 +93,11 @@ public void setContentType(ContentType contentType) {
@Override @Override
public void setContentType(Header contentType) { public void setContentType(Header contentType) {
super.setContentType(contentType); super.setContentType(contentType);
addHeader(contentType); if (contentType != null) {
addHeader(contentType);
} else {
removeHeaders(AS2Header.CONTENT_TYPE);
}
} }


public String getContentEncodingValue() { public String getContentEncodingValue() {
Expand All @@ -106,7 +111,11 @@ public String getContentEncodingValue() {
@Override @Override
public void setContentEncoding(Header contentEncoding) { public void setContentEncoding(Header contentEncoding) {
super.setContentEncoding(contentEncoding); super.setContentEncoding(contentEncoding);
addHeader(contentEncoding); if (contentEncoding != null) {
addHeader(contentEncoding);
} else {
removeHeaders(HTTP.CONTENT_ENCODING);
}
} }


public String getContentTransferEncodingValue() { public String getContentTransferEncodingValue() {
Expand All @@ -133,12 +142,16 @@ public Header getContentTransferEncoding() {
* The default implementation sets the value of the * The default implementation sets the value of the
* {@link #contentTranferEncoding contentTransferEncoding} attribute. * {@link #contentTranferEncoding contentTransferEncoding} attribute.
* *
* @param contentEncoding the new Content-Transfer-Encoding header, or * @param contentTransferEncoding the new Content-Transfer-Encoding header, or
* {@code null} to unset * {@code null} to unset
*/ */
public void setContentTranserEncoding(final Header contentEncoding) { public void setContentTranserEncoding(final Header contentTransferEncoding) {
this.contentTransferEncoding = contentEncoding; this.contentTransferEncoding = contentTransferEncoding;
addHeader(contentTransferEncoding); if (contentTransferEncoding != null) {
addHeader(contentTransferEncoding);
} else {
removeHeaders(AS2Header.CONTENT_TRANSFER_ENCODING);
}
} }


/** /**
Expand Down
Expand Up @@ -53,16 +53,16 @@ protected MultipartSignedEntity(String boundary, boolean isMainBody) {
} }


public boolean isValid() { public boolean isValid() {
ApplicationEDIEntity applicationEDIEntity = getSignedDataEntity(); MimeEntity signedEntity = getSignedDataEntity();
ApplicationPkcs7SignatureEntity applicationPkcs7SignatureEntity = getSignatureEntity(); ApplicationPkcs7SignatureEntity applicationPkcs7SignatureEntity = getSignatureEntity();


if (applicationEDIEntity == null || applicationPkcs7SignatureEntity == null) { if (signedEntity == null || applicationPkcs7SignatureEntity == null) {
return false; return false;
} }


try { try {
ByteArrayOutputStream outstream = new ByteArrayOutputStream(); ByteArrayOutputStream outstream = new ByteArrayOutputStream();
applicationEDIEntity.writeTo(outstream); signedEntity.writeTo(outstream);
CMSProcessable signedContent = new CMSProcessableByteArray(outstream.toByteArray()); CMSProcessable signedContent = new CMSProcessableByteArray(outstream.toByteArray());


byte[] signature = applicationPkcs7SignatureEntity.getSignature(); byte[] signature = applicationPkcs7SignatureEntity.getSignature();
Expand Down Expand Up @@ -90,9 +90,9 @@ public boolean isValid() {
return true; return true;
} }


public ApplicationEDIEntity getSignedDataEntity() { public MimeEntity getSignedDataEntity() {
if (getPartCount() > 0 && getPart(0) instanceof ApplicationEDIEntity) { if (getPartCount() > 0) {
return (ApplicationEDIEntity) getPart(0); return getPart(0);
} }


return null; return null;
Expand Down
Expand Up @@ -16,6 +16,11 @@
*/ */
package org.apache.camel.component.as2.api; package org.apache.camel.component.as2.api;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException; import java.io.IOException;
import java.security.KeyPair; import java.security.KeyPair;
import java.security.KeyPairGenerator; import java.security.KeyPairGenerator;
Expand All @@ -29,6 +34,7 @@
import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; 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.ApplicationEDIFACTEntity;
import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity; import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity;
import org.apache.camel.component.as2.api.entity.MimeEntity;
import org.apache.camel.component.as2.api.entity.MultipartSignedEntity; import org.apache.camel.component.as2.api.entity.MultipartSignedEntity;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpException; import org.apache.http.HttpException;
Expand Down Expand Up @@ -58,11 +64,6 @@
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class AS2MessageTest { public class AS2MessageTest {


public static final String EDI_MESSAGE = "UNB+UNOA:1+005435656:1+006415160:1+060515:1434+00000000000778'\n" public static final String EDI_MESSAGE = "UNB+UNOA:1+005435656:1+006415160:1+060515:1434+00000000000778'\n"
Expand Down Expand Up @@ -340,14 +341,16 @@ public void signatureVerificationTest() throws Exception {
HttpEntity entity = ((BasicHttpEntityEnclosingRequest)request).getEntity(); HttpEntity entity = ((BasicHttpEntityEnclosingRequest)request).getEntity();
assertNotNull("Request does not contain entity", entity); assertNotNull("Request does not contain entity", entity);
assertTrue("Unexpected request entity type", entity instanceof MultipartSignedEntity); assertTrue("Unexpected request entity type", entity instanceof MultipartSignedEntity);
MultipartSignedEntity signedEntity = (MultipartSignedEntity)entity; MultipartSignedEntity multipartSignedEntity = (MultipartSignedEntity)entity;
ApplicationEDIEntity ediMessageEntity = signedEntity.getSignedDataEntity(); MimeEntity signedEntity = multipartSignedEntity.getSignedDataEntity();
assertTrue("Signed entity wrong type", signedEntity instanceof ApplicationEDIEntity);
ApplicationEDIEntity ediMessageEntity = (ApplicationEDIEntity) signedEntity;
assertNotNull("Multipart signed entity does not contain EDI message entity", ediMessageEntity); assertNotNull("Multipart signed entity does not contain EDI message entity", ediMessageEntity);
ApplicationPkcs7SignatureEntity signatureEntity = signedEntity.getSignatureEntity(); ApplicationPkcs7SignatureEntity signatureEntity = multipartSignedEntity.getSignatureEntity();
assertNotNull("Multipart signed entity does not contain signature entity", signatureEntity); assertNotNull("Multipart signed entity does not contain signature entity", signatureEntity);


// Validate Signature // Validate Signature
assertTrue("Signature is invalid", signedEntity.isValid()); assertTrue("Signature is invalid", multipartSignedEntity.isValid());


} }


Expand Down

0 comments on commit e42f28d

Please sign in to comment.