mirror of https://github.com/apache/poi.git
Allow WorkbookFactory.create to open xlsx files protected with the default password
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1676853 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
37f045dc02
commit
2e6d113c55
|
@ -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)
|
||||
throw new EncryptedDocumentException("Password incorrect");
|
||||
|
||||
OPCPackage pkg = OPCPackage.open(stream);
|
||||
return create(pkg);
|
||||
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");
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -1488,27 +1488,33 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
|||
|
||||
/**
|
||||
* 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
|
||||
|
|
Loading…
Reference in New Issue