From d00be6e7db6fc1557e0ab2f28d0b57db81c3c4ba Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 30 Aug 2022 19:46:32 +0000 Subject: [PATCH] [TIKA-3388] issue with non-ascii chars in file name of embedded OLE object git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1903780 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/xwpf/TestXWPFBugs.java | 22 ++++++++++++++++++ .../poi/poifs/filesystem/Ole10Native.java | 8 +++---- .../java/org/apache/poi/util/StringUtil.java | 4 ++-- test-data/document/tika-3388.docx | Bin 0 -> 16665 bytes 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 test-data/document/tika-3388.docx diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java index 7048bc13fe..cad6cd12f8 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java @@ -32,10 +32,14 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.poi.POIDataSamples; import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackagePartName; +import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.poifs.crypt.CipherAlgorithm; import org.apache.poi.poifs.crypt.Decryptor; import org.apache.poi.poifs.crypt.EncryptionInfo; import org.apache.poi.poifs.crypt.HashAlgorithm; +import org.apache.poi.poifs.filesystem.Ole10Native; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -159,4 +163,22 @@ class TestXWPFBugs { assertEquals(731, document.getParagraphs().size()); } } + + @Test + void tika3388() throws Exception { + try (XWPFDocument document = new XWPFDocument(samples.openResourceAsStream("tika-3388.docx"))) { + assertEquals(1, document.getParagraphs().size()); + PackagePartName partName = PackagingURIHelper.createPartName("/word/embeddings/oleObject1.bin"); + PackagePart part = document.getPackage().getPart(partName); + assertNotNull(part); + try ( + InputStream partStream = part.getInputStream(); + POIFSFileSystem poifs = new POIFSFileSystem(partStream) + ) { + Ole10Native ole = Ole10Native.createFromEmbeddedOleObject(poifs); + assertEquals("C:\\Users\\ross\\AppData\\Local\\Microsoft\\Windows\\INetCache\\Content.Word\\約翰的測試文件\uD83D\uDD96.msg", + ole.getFileName()); + } + } + } } diff --git a/poi/src/main/java/org/apache/poi/poifs/filesystem/Ole10Native.java b/poi/src/main/java/org/apache/poi/poifs/filesystem/Ole10Native.java index 9b1545e3b0..681f4bd8ff 100644 --- a/poi/src/main/java/org/apache/poi/poifs/filesystem/Ole10Native.java +++ b/poi/src/main/java/org/apache/poi/poifs/filesystem/Ole10Native.java @@ -48,7 +48,7 @@ public class Ole10Native { public static final String OLE10_NATIVE = "\u0001Ole10Native"; - private static final Charset ISO1 = StandardCharsets.ISO_8859_1; + private static final Charset UTF8 = StandardCharsets.UTF_8; // arbitrarily selected; may need to increase private static final int DEFAULT_MAX_RECORD_LENGTH = 100_000_000; private static int MAX_RECORD_LENGTH = DEFAULT_MAX_RECORD_LENGTH; @@ -407,14 +407,14 @@ public class Ole10Native { // total size, will be determined later .. leos.writeShort(getFlags1()); - leos.write(getLabel().getBytes(ISO1)); + leos.write(getLabel().getBytes(UTF8)); leos.write(0); - leos.write(getFileName().getBytes(ISO1)); + leos.write(getFileName().getBytes(UTF8)); leos.write(0); leos.writeShort(getFlags2()); leos.writeShort(getUnknown1()); leos.writeInt(getCommand().length() + 1); - leos.write(getCommand().getBytes(ISO1)); + leos.write(getCommand().getBytes(UTF8)); leos.write(0); leos.writeInt(getDataSize()); leos.write(getDataBuffer()); diff --git a/poi/src/main/java/org/apache/poi/util/StringUtil.java b/poi/src/main/java/org/apache/poi/util/StringUtil.java index 190d8dc99c..69e45c7d50 100644 --- a/poi/src/main/java/org/apache/poi/util/StringUtil.java +++ b/poi/src/main/java/org/apache/poi/util/StringUtil.java @@ -135,13 +135,13 @@ public final class StringUtil { final int offset, final int len) { int len_to_use = Math.min(len, string.length - offset); - return new String(string, offset, len_to_use, ISO_8859_1); + return new String(string, offset, len_to_use, UTF8); } public static String readCompressedUnicode(LittleEndianInput in, int nChars) { byte[] buf = IOUtils.safelyAllocate(nChars, MAX_RECORD_LENGTH); in.readFully(buf); - return new String(buf, ISO_8859_1); + return new String(buf, UTF8); } /** diff --git a/test-data/document/tika-3388.docx b/test-data/document/tika-3388.docx new file mode 100644 index 0000000000000000000000000000000000000000..b884ea1ac6da53ab2003dddde4c166412e28f3f1 GIT binary patch literal 16665 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 S1p`BTdnvsMd;|X