From d233f7c348abe1b87300e16d345fda835b69488d Mon Sep 17 00:00:00 2001 From: Tim Allison Date: Thu, 20 Oct 2016 15:13:16 +0000 Subject: [PATCH] BUG-60284 -- throw EncryptedDocumentException for password protected OldExcel files git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1765829 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/extractor/OldExcelExtractor.java | 8 +++++++- .../hssf/extractor/TestOldExcelExtractor.java | 18 +++++++++++++++++- test-data/spreadsheet/60284.xls | Bin 0 -> 40448 bytes 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 test-data/spreadsheet/60284.xls diff --git a/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java b/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java index 605e328a0..c62a3c226 100644 --- a/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java +++ b/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java @@ -28,6 +28,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import org.apache.poi.EncryptedDocumentException; import org.apache.poi.hssf.OldExcelFormatException; import org.apache.poi.hssf.record.BOFRecord; import org.apache.poi.hssf.record.CodepageRecord; @@ -57,6 +58,9 @@ import org.apache.poi.util.IOUtils; *

*/ public class OldExcelExtractor implements Closeable { + + private final static int FILE_PASS_RECORD_SID = 0x2f; + private RecordInputStream ris; // sometimes we hold the stream here and thus need to ensure it is closed at some point @@ -232,7 +236,9 @@ public class OldExcelExtractor implements Closeable { ris.nextRecord(); switch (sid) { - // Biff 5+ only, no sheet names in older formats + case FILE_PASS_RECORD_SID: + throw new EncryptedDocumentException("Encryption not supported for Old Excel files"); + case OldSheetRecord.sid: OldSheetRecord shr = new OldSheetRecord(ris); shr.setCodePage(codepage); diff --git a/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java b/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java index 4de860d98..73222ed01 100644 --- a/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java +++ b/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java @@ -32,6 +32,7 @@ import java.io.InputStream; import java.io.PrintStream; import org.apache.poi.EmptyFileException; +import org.apache.poi.EncryptedDocumentException; import org.apache.poi.POIDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; @@ -345,10 +346,25 @@ public final class TestOldExcelExtractor { out.close(); } String string = new String(out.toByteArray(), "UTF-8"); - assertTrue("Had: " + string, + assertTrue("Had: " + string, string.contains("Table C-13--Lemons")); } finally { System.setOut(save); } } + + @Test + public void testEncryptionException() throws Exception { + //test file derives from Common Crawl + File file = HSSFTestDataSamples.getSampleFile("60284.xls"); + OldExcelExtractor ex = new OldExcelExtractor(file); + assertEquals(5, ex.getBiffVersion()); + assertEquals(5, ex.getFileType()); + try { + ex.getText(); + fail(); + } catch (EncryptedDocumentException e) { + assertTrue("correct exception thrown", true); + } + } } diff --git a/test-data/spreadsheet/60284.xls b/test-data/spreadsheet/60284.xls new file mode 100644 index 0000000000000000000000000000000000000000..7e0f9fb8332abfbffa58a554cc650c29786cb0ab GIT binary patch literal 40448 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