From d2957984b46a317aaa13bd521ea80b2434e6e622 Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Thu, 31 Aug 2017 11:58:16 -0400 Subject: [PATCH] NIFI-4339: Fix NPE in ExtractEmailHeaders --- .../processors/email/ExtractEmailHeaders.java | 3 +- .../processors/email/GenerateAttachment.java | 28 ++++++----- .../email/TestExtractEmailAttachments.java | 2 +- .../email/TestExtractEmailHeaders.java | 47 ++++++++++++++++++- 4 files changed, 65 insertions(+), 15 deletions(-) diff --git a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ExtractEmailHeaders.java b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ExtractEmailHeaders.java index 2018349d5905..c4cc7577fcee 100644 --- a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ExtractEmailHeaders.java +++ b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ExtractEmailHeaders.java @@ -168,7 +168,8 @@ public void process(final InputStream rawIn) throws IOException { } } } - if (Array.getLength(originalMessage.getAllRecipients()) > 0) { + Address[] allRecipients = originalMessage.getAllRecipients(); + if (allRecipients != null && Array.getLength(allRecipients) > 0) { for (int toCount = 0; toCount < ArrayUtils.getLength(originalMessage.getRecipients(Message.RecipientType.TO)); toCount++) { attributes.put(EMAIL_HEADER_TO + "." + toCount, originalMessage.getRecipients(Message.RecipientType.TO)[toCount].toString()); } diff --git a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/GenerateAttachment.java b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/GenerateAttachment.java index ef100b2cc3ea..6942d88a7444 100644 --- a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/GenerateAttachment.java +++ b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/GenerateAttachment.java @@ -43,7 +43,21 @@ public GenerateAttachment(String from, String to, String subject, String message this.hostName = hostName; } - public byte[] SimpleEmail() { + public byte[] SimpleEmailBytes() { + MimeMessage mimeMessage = SimpleEmailMimeMessage(); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try { + mimeMessage.writeTo(output); + } catch (IOException e) { + e.printStackTrace(); + } catch (MessagingException e) { + e.printStackTrace(); + } + + return output.toByteArray(); + } + + public MimeMessage SimpleEmailMimeMessage() { Email email = new SimpleEmail(); try { email.setFrom(from); @@ -56,17 +70,7 @@ public byte[] SimpleEmail() { e.printStackTrace(); } - ByteArrayOutputStream output = new ByteArrayOutputStream(); - MimeMessage mimeMessage = email.getMimeMessage(); - try { - mimeMessage.writeTo(output); - } catch (IOException e) { - e.printStackTrace(); - } catch (MessagingException e) { - e.printStackTrace(); - } - - return output.toByteArray(); + return email.getMimeMessage(); } public byte[] WithAttachments(int amount) { diff --git a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailAttachments.java b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailAttachments.java index ee629a6c9dce..5086bf1b8ce5 100644 --- a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailAttachments.java +++ b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailAttachments.java @@ -89,7 +89,7 @@ public void testValidEmailWithoutAttachments() throws Exception { final TestRunner runner = TestRunners.newTestRunner(new ExtractEmailAttachments()); // Create the message dynamically - byte [] simpleEmail = attachmentGenerator.SimpleEmail(); + byte [] simpleEmail = attachmentGenerator.SimpleEmailBytes(); runner.enqueue(simpleEmail); runner.run(); diff --git a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailHeaders.java b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailHeaders.java index aed2292c25be..e9b0b251358a 100644 --- a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailHeaders.java +++ b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/test/java/org/apache/nifi/processors/email/TestExtractEmailHeaders.java @@ -17,11 +17,16 @@ package org.apache.nifi.processors.email; +import org.apache.nifi.stream.io.ByteArrayOutputStream; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; import org.junit.Test; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; import java.util.List; public class TestExtractEmailHeaders { @@ -62,7 +67,7 @@ public void testValidEmailWithoutAttachments() throws Exception { runner.setProperty(ExtractEmailHeaders.CAPTURED_HEADERS, "MIME-Version"); // Create the message dynamically - byte [] simpleEmail = attachmentGenerator.SimpleEmail(); + byte [] simpleEmail = attachmentGenerator.SimpleEmailBytes(); runner.enqueue(simpleEmail); runner.run(); @@ -79,6 +84,46 @@ public void testValidEmailWithoutAttachments() throws Exception { splits.get(0).assertAttributeExists("email.headers.mime-version"); } + /** + * Test case added for NIFI-4339, which is a potential NPE bug + * if the email message contains no recipient header fields, ie, + * TO, CC, BCC. + * + * @throws Exception + */ + @Test + public void testValidEmailWithNoRecipients() throws Exception { + final TestRunner runner = TestRunners.newTestRunner(new ExtractEmailHeaders()); + runner.setProperty(ExtractEmailHeaders.CAPTURED_HEADERS, "MIME-Version"); + + // Create the message dynamically + MimeMessage simpleEmailMimeMessage = attachmentGenerator.SimpleEmailMimeMessage(); + + simpleEmailMimeMessage.removeHeader("To"); + simpleEmailMimeMessage.removeHeader("Cc"); + simpleEmailMimeMessage.removeHeader("Bcc"); + + ByteArrayOutputStream messageBytes = new ByteArrayOutputStream(); + try { + simpleEmailMimeMessage.writeTo(messageBytes); + } catch (IOException | MessagingException e) { + e.printStackTrace(); + } + + runner.enqueue(messageBytes.toByteArray()); + runner.run(); + + runner.assertTransferCount(ExtractEmailHeaders.REL_SUCCESS, 1); + runner.assertTransferCount(ExtractEmailHeaders.REL_FAILURE, 0); + + runner.assertQueueEmpty(); + final List splits = runner.getFlowFilesForRelationship(ExtractEmailHeaders.REL_SUCCESS); + splits.get(0).assertAttributeEquals("email.headers.from.0", from); + splits.get(0).assertAttributeExists("email.headers.mime-version"); + splits.get(0).assertAttributeNotExists("email.headers.to"); + splits.get(0).assertAttributeNotExists("email.headers.cc"); + splits.get(0).assertAttributeNotExists("email.headers.bcc"); + } @Test public void testInvalidEmail() throws Exception {