mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-22 08:09:15 +00:00
Document Security - Coverage, Testing, and Bug-fixing (#2128)
Having a parallel project to complete cover Document Properties, I turned my attention to to Document Security. As happens, this particular change grew a bit over time. Coverage and Testing Changes: - Since the Security object has no members which are themselves objects, there is no need for a deep clone. The untested __clone method is removed. - Almost all of the coverage for the Security Object came about through samples 11 and 41, not through formal tests with assertions. Formal tests have been added. - All methods now use type-hinting via the function signature rather than doc block. - Coverage is now 100%. <!-- end of coverage and testing changes list --> Bug: - Xlsx Reader was not evaluating the Lock values correctly. This revelation came as a result of the new tests ... - Which showed that Xlsx Reader was testing SimpleXmlElement as a boolean rather than the stringified version of that ... - Which didn't matter all that much because Xlsx Writer was writing the values as 'true' or 'false' rather than '1' or '0', and (bool) 'false' is true. - Xlsx Reader clearly needed a change. I was trying to avoid that while awaiting the namespacing change. At least this is restricted to a very small self-contained piece of the code. - It is less clear whether Xlsx Writer should be changed. It is true that Excel itself uses 1/0 when writing; however it is equally true that it recognizes true/false as well as 1/0 when reading. For now, I have left Xlsx Writer alone to limit the change to what is absolutely needed. <!-- end of bug list --> Other Changes: - I was at a complete loss as to what "lock revisions" was supposed to do, and it took a while to find anything on the web that explained it. Thank you, openpyxl, for coming through. I have documented it for PhpSpreadsheet now. <!-- end of other changes list --> Miscellaneous Note: - There remains no support for Document Security in Xls Reader or Writer (nor in any of the other readers/writers except Xlsx). - No Phpstan baseline changes, possibly for the first time in any of my PRs since Phpstan was introduced. Co-authored-by: Mark Baker <mark@lange.demon.co.uk>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Document;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class SecurityTest extends AbstractFunctional
|
||||
{
|
||||
public function testSecurity(): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$spreadsheet->getActiveSheet()->getCell('A1')->setValue('Hello');
|
||||
$security = $spreadsheet->getSecurity();
|
||||
$security->setLockRevision(true);
|
||||
$revisionsPassword = 'revpasswd';
|
||||
$security->setRevisionsPassword($revisionsPassword);
|
||||
$hashedRevisionsPassword = $security->getRevisionsPassword();
|
||||
self::assertNotEquals($revisionsPassword, $hashedRevisionsPassword);
|
||||
$security->setLockWindows(true);
|
||||
$security->setLockStructure(true);
|
||||
$workbookPassword = 'wbpasswd';
|
||||
$security->setWorkbookPassword($workbookPassword);
|
||||
$hashedWorkbookPassword = $security->getWorkbookPassword();
|
||||
self::assertNotEquals($workbookPassword, $hashedWorkbookPassword);
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
$reloadedSecurity = $reloadedSpreadsheet->getSecurity();
|
||||
self::assertTrue($reloadedSecurity->getLockRevision());
|
||||
self::assertTrue($reloadedSecurity->getLockWindows());
|
||||
self::assertTrue($reloadedSecurity->getLockStructure());
|
||||
self::assertSame($hashedWorkbookPassword, $reloadedSecurity->getWorkbookPassword());
|
||||
self::assertSame($hashedRevisionsPassword, $reloadedSecurity->getRevisionsPassword());
|
||||
|
||||
$reloadedSecurity->setRevisionsPassword($hashedWorkbookPassword, true);
|
||||
self::assertSame($hashedWorkbookPassword, $reloadedSecurity->getRevisionsPassword());
|
||||
$reloadedSecurity->setWorkbookPassword($hashedRevisionsPassword, true);
|
||||
self::assertSame($hashedRevisionsPassword, $reloadedSecurity->getWorkbookPassword());
|
||||
}
|
||||
|
||||
public function providerLocks(): array
|
||||
{
|
||||
return [
|
||||
[false, false, false],
|
||||
[false, false, true],
|
||||
[false, true, false],
|
||||
[false, true, true],
|
||||
[true, false, false],
|
||||
[true, false, true],
|
||||
[true, true, false],
|
||||
[true, true, true],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providerLocks
|
||||
*/
|
||||
public function testLocks(bool $revision, bool $windows, bool $structure): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$spreadsheet->getActiveSheet()->getCell('A1')->setValue('Hello');
|
||||
$security = $spreadsheet->getSecurity();
|
||||
$security->setLockRevision($revision);
|
||||
$security->setLockWindows($windows);
|
||||
$security->setLockStructure($structure);
|
||||
$enabled = $security->isSecurityEnabled();
|
||||
self::assertSame($enabled, $revision || $windows || $structure);
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
$reloadedSecurity = $reloadedSpreadsheet->getSecurity();
|
||||
self::assertSame($revision, $reloadedSecurity->getLockRevision());
|
||||
self::assertSame($windows, $reloadedSecurity->getLockWindows());
|
||||
self::assertSame($structure, $reloadedSecurity->getLockStructure());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user