Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is 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 *
< * @return Protection
> * @return $this
*/ public function setSheet($pValue) { $this->sheet = $pValue; return $this; } /** * Get Objects. * * @return bool */ public function getObjects() { return $this->objects; } /** * Set Objects. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setObjects($pValue) { $this->objects = $pValue; return $this; } /** * Get Scenarios. * * @return bool */ public function getScenarios() { return $this->scenarios; } /** * Set Scenarios. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setScenarios($pValue) { $this->scenarios = $pValue; return $this; } /** * Get FormatCells. * * @return bool */ public function getFormatCells() { return $this->formatCells; } /** * Set FormatCells. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setFormatCells($pValue) { $this->formatCells = $pValue; return $this; } /** * Get FormatColumns. * * @return bool */ public function getFormatColumns() { return $this->formatColumns; } /** * Set FormatColumns. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setFormatColumns($pValue) { $this->formatColumns = $pValue; return $this; } /** * Get FormatRows. * * @return bool */ public function getFormatRows() { return $this->formatRows; } /** * Set FormatRows. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setFormatRows($pValue) { $this->formatRows = $pValue; return $this; } /** * Get InsertColumns. * * @return bool */ public function getInsertColumns() { return $this->insertColumns; } /** * Set InsertColumns. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setInsertColumns($pValue) { $this->insertColumns = $pValue; return $this; } /** * Get InsertRows. * * @return bool */ public function getInsertRows() { return $this->insertRows; } /** * Set InsertRows. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setInsertRows($pValue) { $this->insertRows = $pValue; return $this; } /** * Get InsertHyperlinks. * * @return bool */ public function getInsertHyperlinks() { return $this->insertHyperlinks; } /** * Set InsertHyperlinks. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setInsertHyperlinks($pValue) { $this->insertHyperlinks = $pValue; return $this; } /** * Get DeleteColumns. * * @return bool */ public function getDeleteColumns() { return $this->deleteColumns; } /** * Set DeleteColumns. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setDeleteColumns($pValue) { $this->deleteColumns = $pValue; return $this; } /** * Get DeleteRows. * * @return bool */ public function getDeleteRows() { return $this->deleteRows; } /** * Set DeleteRows. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setDeleteRows($pValue) { $this->deleteRows = $pValue; return $this; } /** * Get SelectLockedCells. * * @return bool */ public function getSelectLockedCells() { return $this->selectLockedCells; } /** * Set SelectLockedCells. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setSelectLockedCells($pValue) { $this->selectLockedCells = $pValue; return $this; } /** * Get Sort. * * @return bool */ public function getSort() { return $this->sort; } /** * Set Sort. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setSort($pValue) { $this->sort = $pValue; return $this; } /** * Get AutoFilter. * * @return bool */ public function getAutoFilter() { return $this->autoFilter; } /** * Set AutoFilter. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setAutoFilter($pValue) { $this->autoFilter = $pValue; return $this; } /** * Get PivotTables. * * @return bool */ public function getPivotTables() { return $this->pivotTables; } /** * Set PivotTables. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setPivotTables($pValue) { $this->pivotTables = $pValue; return $this; } /** * Get SelectUnlockedCells. * * @return bool */ public function getSelectUnlockedCells() { return $this->selectUnlockedCells; } /** * Set SelectUnlockedCells. * * @param bool $pValue *
< * @return Protection
> * @return $this
*/ public function setSelectUnlockedCells($pValue) { $this->selectUnlockedCells = $pValue; 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 *
< * @return Protection
> * @return $this
*/ public function setPassword($pValue, $pAlreadyHashed = false) { if (!$pAlreadyHashed) {
< $pValue = PasswordHasher::hashPassword($pValue);
> $salt = $this->generateSalt(); > $this->setSalt($salt); > $pValue = PasswordHasher::hashPassword($pValue, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount());
}
>
$this->password = $pValue; 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;