From: Javen O'Neal Date: Thu, 5 Jan 2017 07:59:27 +0000 (+0000) Subject: bug 60550: read ContentID chunks from mail attachments X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d10cc5eacdbb4fb297e2c5b08728bcf145f80174;p=poi.git bug 60550: read ContentID chunks from mail attachments git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1777428 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java index 5b782b4389..043ef88c28 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java @@ -16,6 +16,7 @@ ==================================================================== */ package org.apache.poi.hsmf.datatypes; +import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_CONTENT_ID; import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_DATA; import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_EXTENSION; import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_FILENAME; @@ -47,6 +48,7 @@ public class AttachmentChunks implements ChunkGroup { private StringChunk attachLongFileName; private StringChunk attachMimeTag; private DirectoryChunk attachmentDirectory; + private StringChunk attachContentId; /** * This is in WMF Format. You'll probably want to pass it to Apache Batik to @@ -157,6 +159,13 @@ public class AttachmentChunks implements ChunkGroup { return attachRenderingWMF; } + /** + * @return the attachment content ID + */ + public StringChunk getAttachContentId() { + return attachContentId; + } + /** * Called by the parser whenever a chunk is found. */ @@ -178,7 +187,7 @@ public class AttachmentChunks implements ChunkGroup { } else if (chunk instanceof DirectoryChunk) { attachmentDirectory = (DirectoryChunk) chunk; } else { - LOG.log(POILogger.ERROR, "Unexpected data chunk of type " + chunk); + LOG.log(POILogger.ERROR, "Unexpected data chunk of type " + chunk.getEntryName()); } } else if (chunkId == ATTACH_EXTENSION.id) { attachExtension = (StringChunk) chunk; @@ -190,6 +199,10 @@ public class AttachmentChunks implements ChunkGroup { attachMimeTag = (StringChunk) chunk; } else if (chunkId == ATTACH_RENDERING.id) { attachRenderingWMF = (ByteChunk) chunk; + } else if (chunkId == ATTACH_CONTENT_ID.id) { + attachContentId = (StringChunk) chunk; + } else { + LOG.log(POILogger.WARN, "Currently unsupported attachment chunk property will be ignored. " + chunk.getEntryName()); } // And add to the main list diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java index d4b333b64d..5073771fc3 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java @@ -27,9 +27,9 @@ import org.apache.poi.hsmf.datatypes.Types.MAPIType; public abstract class Chunk { public static final String DEFAULT_NAME_PREFIX = "__substg1.0_"; - private int chunkId; - private MAPIType type; - private String namePrefix; + private final int chunkId; + private final MAPIType type; + private final String namePrefix; protected Chunk(String namePrefix, int chunkId, MAPIType type) { this.namePrefix = namePrefix; diff --git a/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java b/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java index 9b4bbbd549..66f182df1a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java +++ b/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java @@ -31,6 +31,7 @@ import org.apache.poi.hsmf.exceptions.ChunkNotFoundException; public class TestFileWithAttachmentsRead extends TestCase { private final MAPIMessage twoSimpleAttachments; private final MAPIMessage pdfMsgAttachments; + private final MAPIMessage inlineImgMsgAttachments; /** * Initialize this test, load up the attachment_test_msg.msg mapi message. @@ -41,6 +42,7 @@ public class TestFileWithAttachmentsRead extends TestCase { POIDataSamples samples = POIDataSamples.getHSMFInstance(); this.twoSimpleAttachments = new MAPIMessage(samples.openResourceAsStream("attachment_test_msg.msg")); this.pdfMsgAttachments = new MAPIMessage(samples.openResourceAsStream("attachment_msg_pdf.msg")); + this.inlineImgMsgAttachments = new MAPIMessage(samples.openResourceAsStream("attachment_msg_inlineImg.msg")); } /** @@ -59,6 +61,37 @@ public class TestFileWithAttachmentsRead extends TestCase { assertEquals(2, attachments.length); } + /** + * Test to see if we get the correct Content-IDs of inline images. + */ + public void testReadContentIDField() throws IOException { + AttachmentChunks[] attachments = inlineImgMsgAttachments.getAttachmentFiles(); + + AttachmentChunks attachment; + + // Check in Content-ID field + attachment = inlineImgMsgAttachments.getAttachmentFiles()[0]; + assertEquals("image001.png", attachment.getAttachFileName().getValue()); + assertEquals(".png", attachment.getAttachExtension().getValue()); + assertEquals("image001.png@01D0A524.96D40F30", attachment.getAttachContentId().getValue()); + + attachment = inlineImgMsgAttachments.getAttachmentFiles()[1]; + assertEquals("image002.png", attachment.getAttachFileName().getValue()); + assertEquals(".png", attachment.getAttachExtension().getValue()); + assertEquals("image002.png@01D0A524.96D40F30", attachment.getAttachContentId().getValue()); + + attachment = inlineImgMsgAttachments.getAttachmentFiles()[2]; + assertEquals("image003.png", attachment.getAttachFileName().getValue()); + assertEquals(".png", attachment.getAttachExtension().getValue()); + assertEquals("image003.png@01D0A526.B4C739C0", attachment.getAttachContentId().getValue()); + + attachment = inlineImgMsgAttachments.getAttachmentFiles()[3]; + assertEquals("image006.jpg", attachment.getAttachFileName().getValue()); + assertEquals(".jpg", attachment.getAttachExtension().getValue()); + assertEquals("image006.jpg@01D0A526.B649E220", attachment.getAttachContentId().getValue()); + } + + /** * Test to see if attachments are not empty. */ @@ -83,14 +116,14 @@ public class TestFileWithAttachmentsRead extends TestCase { assertEquals("test-unicode.doc", attachment.getAttachLongFileName().getValue()); assertEquals(".doc", attachment.getAttachExtension().getValue()); assertNull(attachment.getAttachMimeTag()); - assertEquals(24064, attachment.getAttachData().getValue().length); + assertEquals(24064, attachment.getAttachData().getValue().length); // or compare the hashes of the attachment data attachment = twoSimpleAttachments.getAttachmentFiles()[1]; assertEquals("pj1.txt", attachment.getAttachFileName().getValue()); assertEquals("pj1.txt", attachment.getAttachLongFileName().getValue()); assertEquals(".txt", attachment.getAttachExtension().getValue()); assertNull(attachment.getAttachMimeTag()); - assertEquals(89, attachment.getAttachData().getValue().length); + assertEquals(89, attachment.getAttachData().getValue().length); // or compare the hashes of the attachment data } /** @@ -109,7 +142,7 @@ public class TestFileWithAttachmentsRead extends TestCase { assertEquals(".pdf", attachment.getAttachExtension().getValue()); assertNull(attachment.getAttachMimeTag()); assertNull(attachment.getAttachmentDirectory()); - assertEquals(13539, attachment.getAttachData().getValue().length); + assertEquals(13539, attachment.getAttachData().getValue().length); //or compare the hashes of the attachment data // First in a nested message attachment = pdfMsgAttachments.getAttachmentFiles()[0]; diff --git a/test-data/hsmf/attachment_msg_inlineImg.msg b/test-data/hsmf/attachment_msg_inlineImg.msg new file mode 100644 index 0000000000..ee7abdfc0b Binary files /dev/null and b/test-data/hsmf/attachment_msg_inlineImg.msg differ