%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Controls/ |
Current File : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Controls/CsrfProtection.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Forms\Controls; use Nette; use Nette\Application\UI\Presenter; /** * CSRF protection field. */ class CsrfProtection extends HiddenField { public const Protection = 'Nette\Forms\Controls\CsrfProtection::validateCsrf'; public const PROTECTION = self::Protection; /** @var Nette\Http\Session|null */ public $session; /** * @param string|object $errorMessage */ public function __construct($errorMessage) { parent::__construct(); $this->setOmitted() ->setRequired() ->addRule(self::Protection, $errorMessage); $this->monitor(Presenter::class, function (Presenter $presenter): void { if (!$this->session) { $this->session = $presenter->getSession(); $this->session->start(); } }); $this->monitor(Nette\Forms\Form::class, function (Nette\Forms\Form $form): void { if (!$this->session && !$form instanceof Nette\Application\UI\Form) { $this->session = new Nette\Http\Session($form->httpRequest, new Nette\Http\Response); $this->session->start(); } }); } /** * @return static * @internal */ public function setValue($value) { return $this; } public function loadHttpData(): void { $this->value = $this->getHttpData(Nette\Forms\Form::DataText); } public function getToken(): string { if (!$this->session) { throw new Nette\InvalidStateException('Session initialization error'); } $session = $this->session->getSection(self::class); if (!isset($session->token)) { $session->token = Nette\Utils\Random::generate(); } return $session->token ^ $this->session->getId(); } private function generateToken(?string $random = null): string { if ($random === null) { $random = Nette\Utils\Random::generate(10); } return $random . base64_encode(sha1($this->getToken() . $random, true)); } public function getControl(): Nette\Utils\Html { return parent::getControl()->value($this->generateToken()); } /** @internal */ public static function validateCsrf(self $control): bool { $value = (string) $control->getValue(); return $control->generateToken(substr($value, 0, 10)) === $value; } }