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