bug 59786: fix NPE from winmail.dat files if message body is null
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1751180 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
227ae30154
commit
9e315cd89d
@ -34,8 +34,11 @@ import org.apache.poi.hsmf.datatypes.MAPIProperty;
|
|||||||
* from a HMEF/TNEF/winmail.dat file
|
* from a HMEF/TNEF/winmail.dat file
|
||||||
*/
|
*/
|
||||||
public final class HMEFContentsExtractor {
|
public final class HMEFContentsExtractor {
|
||||||
public static void main(String[] args) throws Exception {
|
/**
|
||||||
if (args.length < 2) {
|
* Usage: HMEFContentsExtractor <filename> <output dir>
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
if(args.length < 2) {
|
||||||
System.err.println("Use:");
|
System.err.println("Use:");
|
||||||
System.err.println(" HMEFContentsExtractor <filename> <output dir>");
|
System.err.println(" HMEFContentsExtractor <filename> <output dir>");
|
||||||
System.err.println("");
|
System.err.println("");
|
||||||
@ -45,11 +48,14 @@ public final class HMEFContentsExtractor {
|
|||||||
System.exit(2);
|
System.exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
HMEFContentsExtractor ext = new HMEFContentsExtractor(new File(args[0]));
|
final String filename = args[0];
|
||||||
|
final String outputDir = args[1];
|
||||||
|
|
||||||
File dir = new File(args[1]);
|
HMEFContentsExtractor ext = new HMEFContentsExtractor(new File(filename));
|
||||||
|
|
||||||
|
File dir = new File(outputDir);
|
||||||
File rtf = new File(dir, "message.rtf");
|
File rtf = new File(dir, "message.rtf");
|
||||||
if (! dir.exists()) {
|
if(! dir.exists()) {
|
||||||
throw new FileNotFoundException("Output directory " + dir.getName() + " not found");
|
throw new FileNotFoundException("Output directory " + dir.getName() + " not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +65,7 @@ public final class HMEFContentsExtractor {
|
|||||||
System.out.println("Extraction completed");
|
System.out.println("Extraction completed");
|
||||||
}
|
}
|
||||||
|
|
||||||
private HMEFMessage message;
|
private final HMEFMessage message;
|
||||||
public HMEFContentsExtractor(File filename) throws IOException {
|
public HMEFContentsExtractor(File filename) throws IOException {
|
||||||
this(new HMEFMessage(new FileInputStream(filename)));
|
this(new HMEFMessage(new FileInputStream(filename)));
|
||||||
}
|
}
|
||||||
@ -73,14 +79,23 @@ public final class HMEFContentsExtractor {
|
|||||||
public void extractMessageBody(File dest) throws IOException {
|
public void extractMessageBody(File dest) throws IOException {
|
||||||
OutputStream fout = new FileOutputStream(dest);
|
OutputStream fout = new FileOutputStream(dest);
|
||||||
try {
|
try {
|
||||||
MAPIRtfAttribute body = (MAPIRtfAttribute)
|
extractMessageBody(fout);
|
||||||
message.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
|
|
||||||
fout.write(body.getData());
|
|
||||||
} finally {
|
} finally {
|
||||||
fout.close();
|
fout.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the RTF message body to the supplied stream
|
||||||
|
*/
|
||||||
|
public void extractMessageBody(OutputStream out) throws IOException {
|
||||||
|
MAPIRtfAttribute body = (MAPIRtfAttribute)
|
||||||
|
message.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
|
||||||
|
if (body != null) {
|
||||||
|
out.write(body.getData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts all the message attachments to the supplied directory
|
* Extracts all the message attachments to the supplied directory
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,78 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.hmef.extractor;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.apache.poi.POIDataSamples;
|
||||||
|
import org.apache.poi.util.TempFile;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestHMEFContentsExtractor {
|
||||||
|
@Test
|
||||||
|
public void TestMain() throws IOException {
|
||||||
|
POIDataSamples samples = POIDataSamples.getHMEFInstance();
|
||||||
|
File message = samples.getFile("quick-winmail.dat");
|
||||||
|
File outputDirectory = TempFile.createTempDirectory("quick-winmail-main");
|
||||||
|
String[] args = new String[] { message.getAbsolutePath(), outputDirectory.getAbsolutePath() };
|
||||||
|
HMEFContentsExtractor.main(args);
|
||||||
|
|
||||||
|
String[] contents = new String[] {
|
||||||
|
"message.rtf", // from extractMessageBody
|
||||||
|
"quick.txt", "quick.pdf", "quick.xml", "quick.doc", "quick.html" // from extractAttachments
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String filename : contents) {
|
||||||
|
File f = new File(outputDirectory, filename);
|
||||||
|
assertTrue(f + " does not exist", f.exists());
|
||||||
|
}
|
||||||
|
|
||||||
|
outputDirectory.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void TestExtractMessageBody_OutputStream() throws IOException {
|
||||||
|
POIDataSamples samples = POIDataSamples.getHMEFInstance();
|
||||||
|
File winmailTNEFFile = samples.getFile("quick-winmail.dat");
|
||||||
|
HMEFContentsExtractor extractor = new HMEFContentsExtractor(winmailTNEFFile);
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
extractor.extractMessageBody(out);
|
||||||
|
assertTrue(out.size() > 0);
|
||||||
|
byte[] expectedMagic = new byte[] { '{', '\\', 'r', 't', 'f' };
|
||||||
|
byte[] magic = Arrays.copyOf(out.toByteArray(), 5);
|
||||||
|
assertArrayEquals("RTF magic number", expectedMagic, magic);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void TestExtractMessageBody_File() throws IOException {
|
||||||
|
POIDataSamples samples = POIDataSamples.getHMEFInstance();
|
||||||
|
File winmailTNEFFile = samples.getFile("quick-winmail.dat");
|
||||||
|
HMEFContentsExtractor extractor = new HMEFContentsExtractor(winmailTNEFFile);
|
||||||
|
File rtf = TempFile.createTempFile("quick-winmail-message-body", ".rtf");
|
||||||
|
assertTrue(rtf.delete());
|
||||||
|
extractor.extractMessageBody(rtf);
|
||||||
|
assertTrue("RTF message body is empty", rtf.length() > 0);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user