Skip to content

Commit b7e9ed5

Browse files
authored
TIKA-4530 -- don't let body content slip into headers in mbox (#2376)
* TIKA-4530 -- don't let body content slip into headers
1 parent e15e9f2 commit b7e9ed5

3 files changed

Lines changed: 32 additions & 7 deletions

File tree

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mbox/MboxParser.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.apache.tika.parser.Parser;
5050
import org.apache.tika.parser.mailcommons.MailUtil;
5151
import org.apache.tika.sax.XHTMLContentHandler;
52+
import org.apache.tika.utils.StringUtils;
5253

5354
/**
5455
* Mbox (mailbox) parser. This version extracts each mail from Mbox and uses the
@@ -98,6 +99,7 @@ public void parse(InputStream stream, ContentHandler handler, Metadata metadata,
9899
try (BufferedReader reader = new BufferedReader(isr)) {
99100
String curLine = reader.readLine();
100101
int mailItem = 0;
102+
boolean inHeader = true;
101103
do {
102104
if (curLine.startsWith(MBOX_RECORD_DIVIDER)) {
103105
Metadata mailMetadata = new Metadata();
@@ -111,16 +113,21 @@ public void parse(InputStream stream, ContentHandler handler, Metadata metadata,
111113
if (curLine == null) {
112114
break;
113115
}
116+
114117
UnsynchronizedByteArrayOutputStream message = UnsynchronizedByteArrayOutputStream.builder().setBufferSize(100000).get();
115118
do {
116-
if (curLine.startsWith(" ") || curLine.startsWith("\t")) {
117-
String latestLine = multiline.poll();
118-
latestLine += " " + curLine.trim();
119-
multiline.add(latestLine);
120-
} else {
121-
multiline.add(curLine);
119+
if (inHeader && StringUtils.isBlank(curLine)) {
120+
inHeader = false;
121+
}
122+
if (inHeader) {
123+
if (curLine.startsWith(" ") || curLine.startsWith("\t")) {
124+
String latestLine = multiline.poll();
125+
latestLine += " " + curLine.trim();
126+
multiline.add(latestLine);
127+
} else {
128+
multiline.add(curLine);
129+
}
122130
}
123-
124131
message.write(curLine.getBytes(charsetName));
125132
message.write(0x0A);
126133
curLine = reader.readLine();

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/test/java/org/apache/tika/parser/mbox/MboxParserTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.apache.tika.parser.mbox;
1818

1919
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertFalse;
2021

2122
import java.io.InputStream;
2223
import java.util.List;
@@ -118,6 +119,16 @@ public void testMultilineHeader() throws Exception {
118119
assertEquals("from xxx by xxx with xxx; date", mailMetadata.get("MboxParser-received"));
119120
}
120121

122+
@Test
123+
public void testMultilineHeader2() throws Exception {
124+
//make sure that we aren't injecting body content into headers
125+
for (Metadata m : getRecursiveMetadata("multiline2.mbox")) {
126+
for (String mime : m.getValues(Metadata.CONTENT_TYPE)) {
127+
assertFalse("something".equals(mime));
128+
}
129+
}
130+
}
131+
121132
@Test
122133
public void testQuoted() throws Exception {
123134
ContentHandler handler = new BodyContentHandler();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
From envelope-sender-mailbox-name Mon Jun 01 10:00:00 2009
2+
Received: from xxx by xxx with xxx; date
3+
4+
Test content
5+
outside of header
6+
Content-type: something
7+
or other

0 commit comments

Comments
 (0)