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