]> source.dussan.org Git - poi.git/commitdiff
bug 60550: read ContentID chunks from mail attachments
authorJaven O'Neal <onealj@apache.org>
Thu, 5 Jan 2017 07:59:27 +0000 (07:59 +0000)
committerJaven O'Neal <onealj@apache.org>
Thu, 5 Jan 2017 07:59:27 +0000 (07:59 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1777428 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java
src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java
src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java
test-data/hsmf/attachment_msg_inlineImg.msg [new file with mode: 0644]

index 5b782b4389de3edcb0a3f9cf012a3fefe596ad58..043ef88c28e2b093c1f1eb0ba7295bd7c0d8bb1c 100644 (file)
@@ -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
index d4b333b64de04becdcbc19b55142fdde6e4cf836..5073771fc3295f24221f8f2440673d3544421be5 100644 (file)
@@ -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;
index 9b4bbbd54964cdcdb9e4b6948196bc8cb6952b3f..66f182df1ab30e6809dfb0e8ea2804c6d6840c8c 100644 (file)
@@ -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 (file)
index 0000000..ee7abdf
Binary files /dev/null and b/test-data/hsmf/attachment_msg_inlineImg.msg differ