You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2015/04/29 22:36:13 UTC

svn commit: r1676853 - in /poi/trunk/src/ooxml: java/org/apache/poi/ss/usermodel/WorkbookFactory.java testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

Author: nick
Date: Wed Apr 29 20:36:13 2015
New Revision: 1676853

URL: http://svn.apache.org/r1676853
Log:
Allow WorkbookFactory.create to open xlsx files protected with the default password

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/ss/usermodel/WorkbookFactory.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/ss/usermodel/WorkbookFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/ss/usermodel/WorkbookFactory.java?rev=1676853&r1=1676852&r2=1676853&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/ss/usermodel/WorkbookFactory.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/ss/usermodel/WorkbookFactory.java Wed Apr 29 20:36:13 2015
@@ -72,30 +72,41 @@ public class WorkbookFactory {
      */
     private static Workbook create(NPOIFSFileSystem fs, String password) throws IOException, InvalidFormatException {
         DirectoryNode root = fs.getRoot();
+        
+        // Encrypted OOXML files go inside OLE2 containers, is this one?
         if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
-            if (password == null) {
-                throw new EncryptedDocumentException("The supplied spreadsheet is protected, but no password was supplied");
-            } else {
-                EncryptionInfo info = new EncryptionInfo(fs);
-                Decryptor d = Decryptor.getInstance(info);
-                
-                boolean passwordCorrect = false;
-                InputStream stream = null;
-                try {
-                    if (d.verifyPassword(password)) {
-                        passwordCorrect = true;
-                        stream = d.getDataStream(root);
-                    }
-                } catch (GeneralSecurityException e) {}
-                
-                if (! passwordCorrect) 
+            EncryptionInfo info = new EncryptionInfo(fs);
+            Decryptor d = Decryptor.getInstance(info);
+            
+            boolean passwordCorrect = false;
+            InputStream stream = null;
+            try {
+                if (password != null && d.verifyPassword(password)) {
+                    passwordCorrect = true;
+                }
+                if (!passwordCorrect && d.verifyPassword(Decryptor.DEFAULT_PASSWORD)) {
+                    passwordCorrect = true;
+                }
+                if (passwordCorrect) {
+                    stream = d.getDataStream(root);
+                }
+            } catch (GeneralSecurityException e) {
+                throw new IOException(e);
+            }
+            
+            if (! passwordCorrect) {
+                if (password != null)
                     throw new EncryptedDocumentException("Password incorrect");
-                
-                OPCPackage pkg = OPCPackage.open(stream);
-                return create(pkg);
+                else
+                    throw new EncryptedDocumentException("The supplied spreadsheet is protected, but no password was supplied");
             }
+            
+            OPCPackage pkg = OPCPackage.open(stream);
+            return create(pkg);
         }
         
+        // If we get here, it isn't an encrypted XLSX file
+        // So, treat it as a regular HSSF XLS one
         if (password != null) {
             Biff8EncryptionKey.setCurrentUserPassword(password);
         }

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1676853&r1=1676852&r2=1676853&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Wed Apr 29 20:36:13 2015
@@ -1488,27 +1488,33 @@ public final class TestXSSFBugs extends
     
     /**
      * Password Protected .xlsx files should give a helpful
-     *  error message when called via WorkbookFactory.
-     * (You need to supply a password explicitly for them)
+     *  error message when called via WorkbookFactory with no password
      */
     @Test(expected=EncryptedDocumentException.class)
-    public void bug55692_stream() throws Exception {
-        // Directly on a Stream
-        WorkbookFactory.create(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
-    }
-    
-    @Test(expected=EncryptedDocumentException.class)
     public void bug55692_poifs() throws Exception {
         // Via a POIFSFileSystem
-        POIFSFileSystem fsP = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
+        POIFSFileSystem fsP = new POIFSFileSystem(
+                POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
         WorkbookFactory.create(fsP);
     }
     
-    @Test(expected=EncryptedDocumentException.class)
+    public void bug55692_stream() throws Exception {
+        // Directly on a Stream, will go via NPOIFS and spot it's
+        //  actually a .xlsx file encrypted with the default password, and open
+        Workbook wb = WorkbookFactory.create(
+                POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
+        assertNotNull(wb);
+        assertEquals(3, wb.getNumberOfSheets());
+    }
+    
     public void bug55692_npoifs() throws Exception {
-        // Via a NPOIFSFileSystem
-        NPOIFSFileSystem fsNP = new NPOIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
-        WorkbookFactory.create(fsNP);
+        // Via a NPOIFSFileSystem, will spot it's actually a .xlsx file
+        //  encrypted with the default password, and open
+        NPOIFSFileSystem fsNP = new NPOIFSFileSystem(
+                POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
+        Workbook wb = WorkbookFactory.create(fsNP);
+        assertNotNull(wb);
+        assertEquals(3, wb.getNumberOfSheets());
     }
 
     @Test



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org