From ee1075dc098f6512f34374b72a438c6a1ca534d2 Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Tue, 4 Apr 2023 00:03:16 +0200 Subject: [PATCH] Validate that OLE file contains a workbook object (ie. isn't a doc or a ppt file) --- src/PhpSpreadsheet/Reader/Xls.php | 7 +++-- src/PhpSpreadsheet/Shared/OLERead.php | 2 +- tests/PhpSpreadsheetTests/IOFactoryTest.php | 27 ++++++++++++++++++++ tests/data/Reader/NotASpreadsheetFile.doc | Bin 0 -> 28160 bytes 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 tests/data/Reader/NotASpreadsheetFile.doc diff --git a/src/PhpSpreadsheet/Reader/Xls.php b/src/PhpSpreadsheet/Reader/Xls.php index 90bd5db69..816e7698d 100644 --- a/src/PhpSpreadsheet/Reader/Xls.php +++ b/src/PhpSpreadsheet/Reader/Xls.php @@ -430,7 +430,7 @@ class Xls extends BaseReader */ public function canRead(string $filename): bool { - if (!File::testFileNoThrow($filename)) { + if (File::testFileNoThrow($filename) === false) { return false; } @@ -440,6 +440,9 @@ class Xls extends BaseReader // get excel data $ole->read($filename); + if ($ole->wrkbook === null) { + throw new Exception('The filename ' . $filename . ' is not recognised as a Spreadsheet file'); + } return true; } catch (PhpSpreadsheetException $e) { @@ -449,7 +452,7 @@ class Xls extends BaseReader public function setCodepage(string $codepage): void { - if (!CodePage::validate($codepage)) { + if (CodePage::validate($codepage) === false) { throw new PhpSpreadsheetException('Unknown codepage: ' . $codepage); } diff --git a/src/PhpSpreadsheet/Shared/OLERead.php b/src/PhpSpreadsheet/Shared/OLERead.php index 3d952a9c8..fcc963953 100644 --- a/src/PhpSpreadsheet/Shared/OLERead.php +++ b/src/PhpSpreadsheet/Shared/OLERead.php @@ -134,7 +134,7 @@ class OLERead $bbdBlocks = $this->numBigBlockDepotBlocks; - if ($this->numExtensionBlocks != 0) { + if ($this->numExtensionBlocks !== 0) { $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS) / 4; } diff --git a/tests/PhpSpreadsheetTests/IOFactoryTest.php b/tests/PhpSpreadsheetTests/IOFactoryTest.php index 19722dc7f..966a12629 100644 --- a/tests/PhpSpreadsheetTests/IOFactoryTest.php +++ b/tests/PhpSpreadsheetTests/IOFactoryTest.php @@ -108,6 +108,33 @@ class IOFactoryTest extends TestCase ]; } + public function testIdentifyInvalid(): void + { + $file = __DIR__ . '/../data/Reader/NotASpreadsheetFile.doc'; + + $this->expectException(ReaderException::class); + $this->expectExceptionMessage('Unable to identify a reader for this file'); + IOFactory::identify($file); + } + + public function testCreateInvalid(): void + { + $file = __DIR__ . '/../data/Reader/NotASpreadsheetFile.doc'; + + $this->expectException(ReaderException::class); + $this->expectExceptionMessage('Unable to identify a reader for this file'); + IOFactory::createReaderForFile($file); + } + + public function testLoadInvalid(): void + { + $file = __DIR__ . '/../data/Reader/NotASpreadsheetFile.doc'; + + $this->expectException(ReaderException::class); + $this->expectExceptionMessage('Unable to identify a reader for this file'); + IOFactory::load($file); + } + public function testFormatAsExpected(): void { $fileName = 'samples/templates/30template.xls'; diff --git a/tests/data/Reader/NotASpreadsheetFile.doc b/tests/data/Reader/NotASpreadsheetFile.doc new file mode 100644 index 0000000000000000000000000000000000000000..10bf907ae6679e1166f8dc13096995e0cb4b2cbf GIT binary patch literal 28160 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 Gfqwvlz*+JD literal 0 HcmV?d00001