]> source.dussan.org Git - poi.git/commitdiff
Have HSSFWorkbook check for an encrypted .xlsx file when opening, and give a helpful...
authorNick Burch <nick@apache.org>
Wed, 23 Oct 2013 09:43:28 +0000 (09:43 +0000)
committerNick Burch <nick@apache.org>
Wed, 23 Oct 2013 09:43:28 +0000 (09:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1534967 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index 2ab0f6b2c5c1f4d22073c1e2782aa079911b2489..9434dbb90b03fe249dd1b96ca7b4cd205c4f0292 100644 (file)
@@ -34,6 +34,7 @@ import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.POIDocument;
 import org.apache.poi.ddf.EscherBSERecord;
 import org.apache.poi.ddf.EscherBitmapBlip;
@@ -47,7 +48,19 @@ import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.model.InternalSheet;
 import org.apache.poi.hssf.model.InternalWorkbook;
 import org.apache.poi.hssf.model.RecordStream;
-import org.apache.poi.hssf.record.*;
+import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
+import org.apache.poi.hssf.record.BackupRecord;
+import org.apache.poi.hssf.record.DrawingGroupRecord;
+import org.apache.poi.hssf.record.ExtendedFormatRecord;
+import org.apache.poi.hssf.record.FontRecord;
+import org.apache.poi.hssf.record.LabelRecord;
+import org.apache.poi.hssf.record.LabelSSTRecord;
+import org.apache.poi.hssf.record.NameRecord;
+import org.apache.poi.hssf.record.RecalcIdRecord;
+import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordFactory;
+import org.apache.poi.hssf.record.SSTRecord;
+import org.apache.poi.hssf.record.UnknownRecord;
 import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
 import org.apache.poi.hssf.record.common.UnicodeString;
 import org.apache.poi.hssf.util.CellReference;
@@ -66,7 +79,11 @@ import org.apache.poi.ss.formula.udf.UDFFinder;
 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.WorkbookUtil;
-import org.apache.poi.util.*;
+import org.apache.poi.util.Configurator;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 
 /**
@@ -217,6 +234,15 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
                 // continue - to try other options
             }
         }
+        
+        // check for an encrypted .xlsx file - they get OLE2 wrapped
+        try {
+               directory.getEntry("EncryptedPackage");
+               throw new EncryptedDocumentException("The supplied spreadsheet seems to be an Encrypted .xlsx file. " +
+                               "It must be decrypted before use by XSSF, it cannot be used by HSSF");
+        } catch (FileNotFoundException e) {
+            // fall through
+        }
 
         // check for previous version of file format
         try {
index 76e7a36e9839c5ef987a1362565ca7ae13d7d5bd..7a7cbe01e357192dc1ff1521badb369bbfcf9ee7 100644 (file)
@@ -19,13 +19,18 @@ package org.apache.poi.xssf.usermodel;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 import java.util.List;
 
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackagingURIHelper;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.ss.formula.WorkbookEvaluator;
 import org.apache.poi.ss.formula.eval.ErrorEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
@@ -47,6 +52,7 @@ import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.xssf.XSSFITestDataProvider;
@@ -1356,4 +1362,35 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
         }
         workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
     }
+    
+    /**
+     * Password Protected .xlsx files should give a helpful
+     *  error message when called via WorkbookFactory.
+     * (You need to supply a password explicitly for them)
+     */
+    public void test55692() throws Exception {
+       InputStream inpA = POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx");
+       InputStream inpB = POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx");
+       InputStream inpC = POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx");
+
+       // Directly on a Stream
+       try {
+               WorkbookFactory.create(inpA);
+               fail("Should've raised a EncryptedDocumentException error");
+       } catch (EncryptedDocumentException e) {}
+       
+       // Via a POIFSFileSystem
+       POIFSFileSystem fsP = new POIFSFileSystem(inpB);
+       try {
+               WorkbookFactory.create(fsP);
+               fail("Should've raised a EncryptedDocumentException error");
+       } catch (EncryptedDocumentException e) {}
+
+       // Via a NPOIFSFileSystem
+       NPOIFSFileSystem fsNP = new NPOIFSFileSystem(inpC);
+       try {
+               WorkbookFactory.create(fsNP);
+               fail("Should've raised a EncryptedDocumentException error");
+       } catch (EncryptedDocumentException e) {}
+    }
 }