Have HSSFWorkbook check for an encrypted .xlsx file when opening, and give a helpful error if found, plus tests. Fixes #55692
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1534967 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5ac455fd72
commit
b646166b6c
@ -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 {
|
||||
|
@ -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) {}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user