%PDF- %PDF-
Server IP : 37.220.80.31 / Your IP : 3.129.194.180 Web Server : Apache/2.4.52 (Ubuntu) System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64 User : www-root ( 1010) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/sale/lib/discount/preset/ |
Upload File : |
<?php namespace Bitrix\Sale\Discount\Preset; use Bitrix\Main\HttpRequest; use Bitrix\Main\Type\Dictionary; use Bitrix\Main\Security\Sign\Signer; final class State extends Dictionary { private const STATE_NAME_VAR = '__state'; private const CHAIN_NAME_VAR = '__chain'; private const STATE_SIGNER_SALT = 'discount.preset.state'; /** @var Signer */ private $signer = null; /** * State constructor. * @param array $values */ public function __construct(array $values = null) { parent::__construct($values); $this->setDefaultValues(); $this->initSigner(); } private function setDefaultValues() { if(empty($this[self::CHAIN_NAME_VAR])) { $this[self::CHAIN_NAME_VAR] = array(); } } private function initSigner(): void { $this->signer = new Signer(); } private function sign(string $data): string { return $this->signer->sign($data, self::STATE_SIGNER_SALT); } public function unSign(string $data): string { try { $signedData = $this->signer->unsign($data, self::STATE_SIGNER_SALT); } catch(\Bitrix\Main\Security\Sign\BadSignatureException $e) { die('Bad signature.'); } return $signedData; } public function set($name, $value = null) { parent::set($name, $value); $this->setDefaultValues(); return $this; } public function append(array $values) { foreach($values as $name => $value) { $this[$name] = $value; } return $this; } /** * @param string $name * @param callable|null $defaultValue * * @return null|string|array */ public function get($name, $defaultValue = null) { $value = parent::get($name); if ($defaultValue && is_callable($defaultValue)) { return $defaultValue($value); } return $value !== null? $value : $defaultValue; } public static function createFromEncodedData($data) { $state = new State; if(empty($data)) { return $state; } $data = $state->unSign($data); $data = base64_decode($data); if($data === false) { return $state; } $data = unserialize($data, ['allowed_classes' => ['Bitrix\Main\Type\DateTime', 'DateTime']]); return $state->set($data?: array()); } public static function createFromRequest(HttpRequest $request) { $prevState = self::createFromEncodedData($request->getPost(self::STATE_NAME_VAR)); $postData = array(); foreach($request->getPostList()->toArray() as $name => $data) { if(is_array($data) && count($data) === 1 && ($data[0] !== '0' && empty($data[0]))) { //empty array unset($prevState[$name]); continue; } if(is_array($data) && ($data[0] !== '0' && empty($data[0]))) { unset($data[0]); } $postData[$name] = $data; } return new State(array_merge($prevState->toArray(), $postData)); } public function addStepChain($step) { $chain = $this[self::CHAIN_NAME_VAR]; $lastStep = end($chain); if($lastStep != $step) { $chain[] = $step; $this[self::CHAIN_NAME_VAR] = $chain; } return $this; } public function popStepChain() { $chain = $this[self::CHAIN_NAME_VAR]; $step = array_pop($chain); $this[self::CHAIN_NAME_VAR] = $chain; return $step; } public function getPrevStep() { return end($this[self::CHAIN_NAME_VAR]); } private function getStepChain(): array { return $this->get(self::CHAIN_NAME_VAR, array()); } public function __toString() { $data = $this->toArray(); $value = $this->sign(base64_encode(serialize($data))); return '<input type="hidden" name="' . self::STATE_NAME_VAR . '" value="' . $value . '">'; } public function toString() { return $this->__toString(); } public function toArray() { $toArray = parent::toArray(); unset( $toArray['sessid'], $toArray['lang'], $toArray['__next_step'] ); return $toArray; } public function getStepNumber() { $countPrevSteps = count($this->getStepChain()); return $countPrevSteps + 1; } }