| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 |
- <?php
- namespace PhpOffice\PhpSpreadsheet\Worksheet;
- use PhpOffice\PhpSpreadsheet\Shared\PasswordHasher;
- class Protection
- {
- const ALGORITHM_MD2 = 'MD2';
- const ALGORITHM_MD4 = 'MD4';
- const ALGORITHM_MD5 = 'MD5';
- const ALGORITHM_SHA_1 = 'SHA-1';
- const ALGORITHM_SHA_256 = 'SHA-256';
- const ALGORITHM_SHA_384 = 'SHA-384';
- const ALGORITHM_SHA_512 = 'SHA-512';
- const ALGORITHM_RIPEMD_128 = 'RIPEMD-128';
- const ALGORITHM_RIPEMD_160 = 'RIPEMD-160';
- const ALGORITHM_WHIRLPOOL = 'WHIRLPOOL';
- /**
- * Autofilters are locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $autoFilter;
- /**
- * Deleting columns is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $deleteColumns;
- /**
- * Deleting rows is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $deleteRows;
- /**
- * Formatting cells is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $formatCells;
- /**
- * Formatting columns is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $formatColumns;
- /**
- * Formatting rows is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $formatRows;
- /**
- * Inserting columns is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $insertColumns;
- /**
- * Inserting hyperlinks is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $insertHyperlinks;
- /**
- * Inserting rows is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $insertRows;
- /**
- * Objects are locked when sheet is protected, default false.
- *
- * @var ?bool
- */
- private $objects;
- /**
- * Pivot tables are locked when the sheet is protected, default true.
- *
- * @var ?bool
- */
- private $pivotTables;
- /**
- * Scenarios are locked when sheet is protected, default false.
- *
- * @var ?bool
- */
- private $scenarios;
- /**
- * Selection of locked cells is locked when sheet is protected, default false.
- *
- * @var ?bool
- */
- private $selectLockedCells;
- /**
- * Selection of unlocked cells is locked when sheet is protected, default false.
- *
- * @var ?bool
- */
- private $selectUnlockedCells;
- /**
- * Sheet is locked when sheet is protected, default false.
- *
- * @var ?bool
- */
- private $sheet;
- /**
- * Sorting is locked when sheet is protected, default true.
- *
- * @var ?bool
- */
- private $sort;
- /**
- * Hashed password.
- *
- * @var string
- */
- private $password = '';
- /**
- * Algorithm name.
- *
- * @var string
- */
- private $algorithm = '';
- /**
- * Salt value.
- *
- * @var string
- */
- private $salt = '';
- /**
- * Spin count.
- *
- * @var int
- */
- private $spinCount = 10000;
- /**
- * Create a new Protection.
- */
- public function __construct()
- {
- }
- /**
- * Is some sort of protection enabled?
- */
- public function isProtectionEnabled(): bool
- {
- return
- $this->password !== '' ||
- isset($this->sheet) ||
- isset($this->objects) ||
- isset($this->scenarios) ||
- isset($this->formatCells) ||
- isset($this->formatColumns) ||
- isset($this->formatRows) ||
- isset($this->insertColumns) ||
- isset($this->insertRows) ||
- isset($this->insertHyperlinks) ||
- isset($this->deleteColumns) ||
- isset($this->deleteRows) ||
- isset($this->selectLockedCells) ||
- isset($this->sort) ||
- isset($this->autoFilter) ||
- isset($this->pivotTables) ||
- isset($this->selectUnlockedCells);
- }
- public function getSheet(): ?bool
- {
- return $this->sheet;
- }
- public function setSheet(?bool $sheet): self
- {
- $this->sheet = $sheet;
- return $this;
- }
- public function getObjects(): ?bool
- {
- return $this->objects;
- }
- public function setObjects(?bool $objects): self
- {
- $this->objects = $objects;
- return $this;
- }
- public function getScenarios(): ?bool
- {
- return $this->scenarios;
- }
- public function setScenarios(?bool $scenarios): self
- {
- $this->scenarios = $scenarios;
- return $this;
- }
- public function getFormatCells(): ?bool
- {
- return $this->formatCells;
- }
- public function setFormatCells(?bool $formatCells): self
- {
- $this->formatCells = $formatCells;
- return $this;
- }
- public function getFormatColumns(): ?bool
- {
- return $this->formatColumns;
- }
- public function setFormatColumns(?bool $formatColumns): self
- {
- $this->formatColumns = $formatColumns;
- return $this;
- }
- public function getFormatRows(): ?bool
- {
- return $this->formatRows;
- }
- public function setFormatRows(?bool $formatRows): self
- {
- $this->formatRows = $formatRows;
- return $this;
- }
- public function getInsertColumns(): ?bool
- {
- return $this->insertColumns;
- }
- public function setInsertColumns(?bool $insertColumns): self
- {
- $this->insertColumns = $insertColumns;
- return $this;
- }
- public function getInsertRows(): ?bool
- {
- return $this->insertRows;
- }
- public function setInsertRows(?bool $insertRows): self
- {
- $this->insertRows = $insertRows;
- return $this;
- }
- public function getInsertHyperlinks(): ?bool
- {
- return $this->insertHyperlinks;
- }
- public function setInsertHyperlinks(?bool $insertHyperLinks): self
- {
- $this->insertHyperlinks = $insertHyperLinks;
- return $this;
- }
- public function getDeleteColumns(): ?bool
- {
- return $this->deleteColumns;
- }
- public function setDeleteColumns(?bool $deleteColumns): self
- {
- $this->deleteColumns = $deleteColumns;
- return $this;
- }
- public function getDeleteRows(): ?bool
- {
- return $this->deleteRows;
- }
- public function setDeleteRows(?bool $deleteRows): self
- {
- $this->deleteRows = $deleteRows;
- return $this;
- }
- public function getSelectLockedCells(): ?bool
- {
- return $this->selectLockedCells;
- }
- public function setSelectLockedCells(?bool $selectLockedCells): self
- {
- $this->selectLockedCells = $selectLockedCells;
- return $this;
- }
- public function getSort(): ?bool
- {
- return $this->sort;
- }
- public function setSort(?bool $sort): self
- {
- $this->sort = $sort;
- return $this;
- }
- public function getAutoFilter(): ?bool
- {
- return $this->autoFilter;
- }
- public function setAutoFilter(?bool $autoFilter): self
- {
- $this->autoFilter = $autoFilter;
- return $this;
- }
- public function getPivotTables(): ?bool
- {
- return $this->pivotTables;
- }
- public function setPivotTables(?bool $pivotTables): self
- {
- $this->pivotTables = $pivotTables;
- return $this;
- }
- public function getSelectUnlockedCells(): ?bool
- {
- return $this->selectUnlockedCells;
- }
- public function setSelectUnlockedCells(?bool $selectUnlockedCells): self
- {
- $this->selectUnlockedCells = $selectUnlockedCells;
- return $this;
- }
- /**
- * Get hashed password.
- *
- * @return string
- */
- public function getPassword()
- {
- return $this->password;
- }
- /**
- * Set Password.
- *
- * @param string $password
- * @param bool $alreadyHashed If the password has already been hashed, set this to true
- *
- * @return $this
- */
- public function setPassword($password, $alreadyHashed = false)
- {
- if (!$alreadyHashed) {
- $salt = $this->generateSalt();
- $this->setSalt($salt);
- $password = PasswordHasher::hashPassword($password, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount());
- }
- $this->password = $password;
- return $this;
- }
- public function setHashValue(string $password): self
- {
- return $this->setPassword($password, true);
- }
- /**
- * Create a pseudorandom string.
- */
- private function generateSalt(): string
- {
- return base64_encode(random_bytes(16));
- }
- /**
- * Get algorithm name.
- */
- public function getAlgorithm(): string
- {
- return $this->algorithm;
- }
- /**
- * Set algorithm name.
- */
- public function setAlgorithm(string $algorithm): self
- {
- return $this->setAlgorithmName($algorithm);
- }
- /**
- * Set algorithm name.
- */
- public function setAlgorithmName(string $algorithm): self
- {
- $this->algorithm = $algorithm;
- return $this;
- }
- public function getSalt(): string
- {
- return $this->salt;
- }
- public function setSalt(string $salt): self
- {
- return $this->setSaltValue($salt);
- }
- public function setSaltValue(string $salt): self
- {
- $this->salt = $salt;
- return $this;
- }
- /**
- * Get spin count.
- */
- public function getSpinCount(): int
- {
- return $this->spinCount;
- }
- /**
- * Set spin count.
- */
- public function setSpinCount(int $spinCount): self
- {
- $this->spinCount = $spinCount;
- return $this;
- }
- /**
- * Verify that the given non-hashed password can "unlock" the protection.
- */
- public function verify(string $password): bool
- {
- if ($this->password === '') {
- return true;
- }
- $hash = PasswordHasher::hashPassword($password, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount());
- return $this->getPassword() === $hash;
- }
- /**
- * Implement PHP __clone to create a deep clone, not just a shallow copy.
- */
- public function __clone()
- {
- $vars = get_object_vars($this);
- foreach ($vars as $key => $value) {
- if (is_object($value)) {
- $this->$key = clone $value;
- } else {
- $this->$key = $value;
- }
- }
- }
- }
|