Author: fanningpj
Date: Mon Jul  1 21:36:31 2024
New Revision: 1918800

URL: http://svn.apache.org/viewvc?rev=1918800&view=rev
Log:
throw exception if xlsx contains duplicate file names

Added:
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/InvalidZipException.java
   (with props)
    poi/trunk/test-data/spreadsheet/duplicate-file.xlsx   (with props)
Modified:
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipSecureFile.java
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java?rev=1918800&r1=1918799&r2=1918800&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java 
(original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java 
Mon Jul  1 21:36:31 2024
@@ -187,6 +187,8 @@ public final class ZipPackage extends OP
         try {
             final ZipFile zipFile = ZipHelper.openZipFile(file); // NOSONAR
             ze = new ZipFileZipEntrySource(zipFile);
+        } catch (InvalidZipException e) {
+            throw new InvalidOperationException("Can't open the specified 
file: '" + file + "'", e);
         } catch (IOException e) {
             // probably not happening with write access - not sure how to 
handle the default read-write access ...
             if (access == PackageAccess.WRITE) {

Added: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/InvalidZipException.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/InvalidZipException.java?rev=1918800&view=auto
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/InvalidZipException.java
 (added)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/InvalidZipException.java
 Mon Jul  1 21:36:31 2024
@@ -0,0 +1,14 @@
+package org.apache.poi.openxml4j.opc.internal;
+
+import java.io.IOException;
+
+/**
+ * Thrown if the zip file is invalid.
+ *
+ * @since 5.3.1
+ */
+public class InvalidZipException extends IOException {
+    public InvalidZipException(String message) {
+        super(message);
+    }
+}

Propchange: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/InvalidZipException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipSecureFile.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipSecureFile.java?rev=1918800&r1=1918799&r2=1918800&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipSecureFile.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipSecureFile.java
 Mon Jul  1 21:36:31 2024
@@ -19,11 +19,15 @@ package org.apache.poi.openxml4j.util;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipFile;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.poi.openxml4j.opc.internal.InvalidZipException;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.Removal;
 
@@ -205,6 +209,7 @@ public class ZipSecureFile extends ZipFi
     public ZipSecureFile(File file) throws IOException {
         super(file);
         this.fileName = file.getAbsolutePath();
+        validateEntryNames();
     }
 
     /**
@@ -214,6 +219,7 @@ public class ZipSecureFile extends ZipFi
     public ZipSecureFile(String name) throws IOException {
         super(name);
         this.fileName = new File(name).getAbsolutePath();
+        validateEntryNames();
     }
 
     /**
@@ -246,4 +252,16 @@ public class ZipSecureFile extends ZipFi
     public String getName() {
         return fileName;
     }
+
+    private void validateEntryNames() throws IOException {
+        Enumeration<ZipArchiveEntry> en = getEntries();
+        Set<String> filenames = new HashSet<>();
+        while (en.hasMoreElements()) {
+            String name = en.nextElement().getName();
+            if (filenames.contains(name)) {
+                throw new InvalidZipException("Input file contains more than 1 
entry with the name " + name);
+            }
+            filenames.add(name);
+        }
+    }
 }

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java?rev=1918800&r1=1918799&r2=1918800&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
 Mon Jul  1 21:36:31 2024
@@ -27,6 +27,7 @@ import org.apache.poi.hssf.HSSFTestDataS
 import org.apache.poi.ooxml.POIXMLProperties;
 import org.apache.poi.ooxml.TrackingInputStream;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
 import org.apache.poi.openxml4j.opc.ContentTypes;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackageAccess;
@@ -1448,6 +1449,18 @@ public final class TestXSSFWorkbook exte
     }
 
     @Test
+    void testDuplicateFileReadAsFile() {
+        assertThrows(InvalidOperationException.class, () -> {
+            try (
+                    OPCPackage pkg = 
OPCPackage.open(getSampleFile("duplicate-file.xlsx"), PackageAccess.READ);
+                    XSSFWorkbook wb = new XSSFWorkbook(pkg)
+            ) {
+                // expect exception here
+            }
+        });
+    }
+
+    @Test
     void testWorkbookCloseClosesInputStream() throws Exception {
         try (TrackingInputStream stream = new TrackingInputStream(
                 HSSFTestDataSamples.openSampleFileStream("github-321.xlsx"))) {

Added: poi/trunk/test-data/spreadsheet/duplicate-file.xlsx
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/duplicate-file.xlsx?rev=1918800&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/duplicate-file.xlsx
------------------------------------------------------------------------------
--- svn:mime-type (added)
+++ svn:mime-type Mon Jul  1 21:36:31 2024
@@ -0,0 +1 @@
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to