]> source.dussan.org Git - poi.git/commitdiff
also handle wrapped OOXML "Package" nodes inside of OLE2 containers
authorAndreas Beeker <kiwiwings@apache.org>
Fri, 14 Aug 2020 20:26:21 +0000 (20:26 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Fri, 14 Aug 2020 20:26:21 +0000 (20:26 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1880861 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/extractor/ExtractorFactory.java
src/java/org/apache/poi/poifs/filesystem/DocumentFactoryHelper.java
src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java
src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java
src/ooxml/java/org/apache/poi/ooxml/extractor/POIXMLExtractorFactory.java

index fa57be7a8cf1b1eaae2108f3f273b49bd90e25fc..bdeb740e20c8dc09f172db253db94332106d5a00 100644 (file)
@@ -53,6 +53,13 @@ import org.apache.poi.util.POILogger;
  */
 @SuppressWarnings({"WeakerAccess", "JavadocReference"})
 public final class ExtractorFactory {
+    /**
+     * Some OPCPackages are packed in side an OLE2 container.
+     * If encrypted, the {@link DirectoryNode} is called {@link Decryptor#DEFAULT_POIFS_ENTRY "EncryptedPackage"},
+     * otherwise the node is called "Packge"
+     */
+    public static final String OOXML_PACKAGE = "Package";
+
     private static final POILogger LOGGER = POILogFactory.getLogger(ExtractorFactory.class);
 
     /** Should this thread prefer event based over usermodel based extractors? */
@@ -215,7 +222,7 @@ public final class ExtractorFactory {
 
     public static POITextExtractor createExtractor(final DirectoryNode root, String password) throws IOException {
         // Encrypted OOXML files go inside OLE2 containers, is this one?
-        if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY) || root.hasEntry("Package")) {
+        if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY) || root.hasEntry(OOXML_PACKAGE)) {
             return wp(FileMagic.OOXML, w -> w.create(root, password));
         } else {
             return wp(FileMagic.OLE2, w ->  w.create(root, password));
index 9ac5e94018cdafa709bb3423853a81a737804a5e..088b54928368fbdce4b4b60fecc83d74b19c1c76 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.poifs.filesystem;
 
+import static org.apache.poi.extractor.ExtractorFactory.OOXML_PACKAGE;
+
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -69,7 +71,12 @@ public final class DocumentFactoryHelper {
      * @throws IOException If an error occurs while decrypting or if the password does not match
      */
     public static InputStream getDecryptedStream(final DirectoryNode root, String password)
-            throws IOException {
+    throws IOException {
+        // first check if the node contains an plain package
+        if (root.hasEntry(OOXML_PACKAGE)) {
+            return root.createDocumentInputStream(OOXML_PACKAGE);
+        }
+
         EncryptionInfo info = new EncryptionInfo(root);
         Decryptor d = Decryptor.getInstance(info);
 
@@ -97,11 +104,11 @@ public final class DocumentFactoryHelper {
     /**
      * Checks that the supplied InputStream (which MUST
      *  support mark and reset) has a OOXML (zip) header at the start of it.<p>
-     *  
+     *
      * If unsure if your InputStream does support mark / reset,
      *  use {@link FileMagic#prepareToCheckMagic(InputStream)} to wrap it and make
      *  sure to always use that, and not the original!
-     *  
+     *
      * @param inp An InputStream which supports either mark/reset
      *
      * @deprecated in 3.17-beta2, use {@link FileMagic#valueOf(InputStream)} == FileMagic.OOXML instead
index 1424a70608bdb03e5e54ab37b30b17a7f1a401af..200120b2115297ce6e6b70cdfc207bdf917effd0 100644 (file)
@@ -16,6 +16,7 @@
 ==================================================================== */
 package org.apache.poi.sl.usermodel;
 
+import static org.apache.poi.extractor.ExtractorFactory.OOXML_PACKAGE;
 import static org.apache.poi.poifs.crypt.EncryptionInfo.ENCRYPTION_INFO_ENTRY;
 
 import java.io.BufferedInputStream;
@@ -123,7 +124,7 @@ public final class SlideShowFactory {
      */
     public static SlideShow<?,?> create(final DirectoryNode root, String password) throws IOException {
         // Encrypted OOXML files go inside OLE2 containers, is this one?
-        if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
+        if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY) || root.hasEntry(OOXML_PACKAGE)) {
             return wp(FileMagic.OOXML, w -> w.create(root, password));
         } else {
             return wp(FileMagic.OLE2, w ->  w.create(root, password));
@@ -269,7 +270,8 @@ public final class SlideShowFactory {
         } else if (fm == FileMagic.OLE2) {
             final boolean ooxmlEnc;
             try (POIFSFileSystem fs = new POIFSFileSystem(file, true)) {
-                ooxmlEnc = fs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY);
+                DirectoryNode root = fs.getRoot();
+                ooxmlEnc = root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY) || root.hasEntry(OOXML_PACKAGE);
             }
             return wp(ooxmlEnc ? FileMagic.OOXML : fm, w -> w.create(file, password, readOnly));
         }
index d9504fe63a30a84bce5ae7b924c23ae5dcb5e172..e755b09f5e97148d0331818a846cdaf7d9b28303 100644 (file)
@@ -16,6 +16,7 @@
 ==================================================================== */
 package org.apache.poi.ss.usermodel;
 
+import static org.apache.poi.extractor.ExtractorFactory.OOXML_PACKAGE;
 import static org.apache.poi.poifs.crypt.EncryptionInfo.ENCRYPTION_INFO_ENTRY;
 
 import java.io.BufferedInputStream;
@@ -130,7 +131,7 @@ public final class WorkbookFactory {
      */
     public static Workbook create(final DirectoryNode root, String password) throws IOException {
         // Encrypted OOXML files go inside OLE2 containers, is this one?
-        if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
+        if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY) || root.hasEntry(OOXML_PACKAGE)) {
             return wp(FileMagic.OOXML, w -> w.create(root, password));
         } else {
             return wp(FileMagic.OLE2, w ->  w.create(root, password));
@@ -276,7 +277,8 @@ public final class WorkbookFactory {
         } else if (fm == FileMagic.OLE2) {
             final boolean ooxmlEnc;
             try (POIFSFileSystem fs = new POIFSFileSystem(file, true)) {
-                ooxmlEnc = fs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY);
+                DirectoryNode root = fs.getRoot();
+                ooxmlEnc = root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY) || root.hasEntry(OOXML_PACKAGE);
             }
             return wp(ooxmlEnc ? FileMagic.OOXML : fm, w -> w.create(file, password, readOnly));
         }
index ed3067869fb1698753a569c95f9d715658917aad..088e09c3feb5e1732d0bf037f0e0dba6b12387aa 100644 (file)
@@ -16,6 +16,8 @@
 ==================================================================== */
 package org.apache.poi.ooxml.extractor;
 
+import static org.apache.poi.extractor.ExtractorFactory.OOXML_PACKAGE;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -253,8 +255,8 @@ public final class POIXMLExtractorFactory implements ExtractorProvider {
     @Override
     public POITextExtractor create(DirectoryNode poifsDir, String password) throws IOException {
         // First, check for plain OOXML package
-        if (poifsDir.hasEntry("Package")) {
-            try (InputStream is = poifsDir.createDocumentInputStream("Package")) {
+        if (poifsDir.hasEntry(OOXML_PACKAGE)) {
+            try (InputStream is = poifsDir.createDocumentInputStream(OOXML_PACKAGE)) {
                 return create(is, password);
             }
         }