Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
<?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;