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
This commit is contained in:
parent
5152cb9ada
commit
d10cc5eacd
@ -16,6 +16,7 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.hsmf.datatypes;
|
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_DATA;
|
||||||
import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_EXTENSION;
|
import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_EXTENSION;
|
||||||
import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_FILENAME;
|
import static org.apache.poi.hsmf.datatypes.MAPIProperty.ATTACH_FILENAME;
|
||||||
@ -47,6 +48,7 @@ public class AttachmentChunks implements ChunkGroup {
|
|||||||
private StringChunk attachLongFileName;
|
private StringChunk attachLongFileName;
|
||||||
private StringChunk attachMimeTag;
|
private StringChunk attachMimeTag;
|
||||||
private DirectoryChunk attachmentDirectory;
|
private DirectoryChunk attachmentDirectory;
|
||||||
|
private StringChunk attachContentId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is in WMF Format. You'll probably want to pass it to Apache Batik to
|
* 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 attachRenderingWMF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the attachment content ID
|
||||||
|
*/
|
||||||
|
public StringChunk getAttachContentId() {
|
||||||
|
return attachContentId;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the parser whenever a chunk is found.
|
* Called by the parser whenever a chunk is found.
|
||||||
*/
|
*/
|
||||||
@ -178,7 +187,7 @@ public class AttachmentChunks implements ChunkGroup {
|
|||||||
} else if (chunk instanceof DirectoryChunk) {
|
} else if (chunk instanceof DirectoryChunk) {
|
||||||
attachmentDirectory = (DirectoryChunk) chunk;
|
attachmentDirectory = (DirectoryChunk) chunk;
|
||||||
} else {
|
} 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) {
|
} else if (chunkId == ATTACH_EXTENSION.id) {
|
||||||
attachExtension = (StringChunk) chunk;
|
attachExtension = (StringChunk) chunk;
|
||||||
@ -190,6 +199,10 @@ public class AttachmentChunks implements ChunkGroup {
|
|||||||
attachMimeTag = (StringChunk) chunk;
|
attachMimeTag = (StringChunk) chunk;
|
||||||
} else if (chunkId == ATTACH_RENDERING.id) {
|
} else if (chunkId == ATTACH_RENDERING.id) {
|
||||||
attachRenderingWMF = (ByteChunk) chunk;
|
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
|
// And add to the main list
|
||||||
|
@ -27,9 +27,9 @@ import org.apache.poi.hsmf.datatypes.Types.MAPIType;
|
|||||||
public abstract class Chunk {
|
public abstract class Chunk {
|
||||||
public static final String DEFAULT_NAME_PREFIX = "__substg1.0_";
|
public static final String DEFAULT_NAME_PREFIX = "__substg1.0_";
|
||||||
|
|
||||||
private int chunkId;
|
private final int chunkId;
|
||||||
private MAPIType type;
|
private final MAPIType type;
|
||||||
private String namePrefix;
|
private final String namePrefix;
|
||||||
|
|
||||||
protected Chunk(String namePrefix, int chunkId, MAPIType type) {
|
protected Chunk(String namePrefix, int chunkId, MAPIType type) {
|
||||||
this.namePrefix = namePrefix;
|
this.namePrefix = namePrefix;
|
||||||
|
@ -31,6 +31,7 @@ import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
|
|||||||
public class TestFileWithAttachmentsRead extends TestCase {
|
public class TestFileWithAttachmentsRead extends TestCase {
|
||||||
private final MAPIMessage twoSimpleAttachments;
|
private final MAPIMessage twoSimpleAttachments;
|
||||||
private final MAPIMessage pdfMsgAttachments;
|
private final MAPIMessage pdfMsgAttachments;
|
||||||
|
private final MAPIMessage inlineImgMsgAttachments;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize this test, load up the attachment_test_msg.msg mapi message.
|
* 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();
|
POIDataSamples samples = POIDataSamples.getHSMFInstance();
|
||||||
this.twoSimpleAttachments = new MAPIMessage(samples.openResourceAsStream("attachment_test_msg.msg"));
|
this.twoSimpleAttachments = new MAPIMessage(samples.openResourceAsStream("attachment_test_msg.msg"));
|
||||||
this.pdfMsgAttachments = new MAPIMessage(samples.openResourceAsStream("attachment_msg_pdf.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);
|
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.
|
* 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("test-unicode.doc", attachment.getAttachLongFileName().getValue());
|
||||||
assertEquals(".doc", attachment.getAttachExtension().getValue());
|
assertEquals(".doc", attachment.getAttachExtension().getValue());
|
||||||
assertNull(attachment.getAttachMimeTag());
|
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];
|
attachment = twoSimpleAttachments.getAttachmentFiles()[1];
|
||||||
assertEquals("pj1.txt", attachment.getAttachFileName().getValue());
|
assertEquals("pj1.txt", attachment.getAttachFileName().getValue());
|
||||||
assertEquals("pj1.txt", attachment.getAttachLongFileName().getValue());
|
assertEquals("pj1.txt", attachment.getAttachLongFileName().getValue());
|
||||||
assertEquals(".txt", attachment.getAttachExtension().getValue());
|
assertEquals(".txt", attachment.getAttachExtension().getValue());
|
||||||
assertNull(attachment.getAttachMimeTag());
|
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());
|
assertEquals(".pdf", attachment.getAttachExtension().getValue());
|
||||||
assertNull(attachment.getAttachMimeTag());
|
assertNull(attachment.getAttachMimeTag());
|
||||||
assertNull(attachment.getAttachmentDirectory());
|
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
|
// First in a nested message
|
||||||
attachment = pdfMsgAttachments.getAttachmentFiles()[0];
|
attachment = pdfMsgAttachments.getAttachmentFiles()[0];
|
||||||
|
BIN
test-data/hsmf/attachment_msg_inlineImg.msg
Normal file
BIN
test-data/hsmf/attachment_msg_inlineImg.msg
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user