Your IP : 3.16.136.129


Current Path : /var/www/axolotl/data/www/msk.axolotls.ru/bitrix/modules/rpa/lib/engine/
Upload File :
Current File : /var/www/axolotl/data/www/msk.axolotls.ru/bitrix/modules/rpa/lib/engine/checkpermissions.php

<?php

namespace Bitrix\Rpa\Engine;

use Bitrix\Main\Engine\ActionFilter\Base;
use Bitrix\Main\Error;
use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Main\Localization\Loc;
use Bitrix\Rpa\Driver;
use Bitrix\Rpa\Model\Stage;
use Bitrix\Rpa\Model\Type;
use Bitrix\Rpa\UserPermissions;

class CheckPermissions extends Base
{
	protected $entity;
	protected $actionType;
	protected $userPermissions;

	public function __construct($entity, $actionType = null)
	{
		parent::__construct();
		$this->entity = $entity;
		$this->actionType = $actionType;
		$this->userPermissions = Driver::getInstance()->getUserPermissions();
	}

	public function onBeforeAction(Event $event)
	{
		if($this->entity === UserPermissions::ENTITY_TYPE)
		{
			if($this->actionType === UserPermissions::ACTION_CREATE)
			{
				if(!$this->userPermissions->canCreateType())
				{
					$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_TYPE_CREATE_DENIED')));
				}
			}
			else
			{
				/** @var Type $type */
				$type = $this->getObjectFromArguments(Type::class);
				if(!$type)
				{
					$this->addError(new Error(Loc::getMessage('RPA_NOT_FOUND_ERROR')));
				}
				else
				{
					if($this->actionType === UserPermissions::ACTION_VIEW && !$this->userPermissions->canViewType($type->getId()))
					{
						$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_TYPE_VIEW_DENIED')));
					}
					if($this->actionType === UserPermissions::ACTION_MODIFY && !$this->userPermissions->canModifyType($type->getId()))
					{
						$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_TYPE_MODIFY_DENIED')));
					}
					if($this->actionType === UserPermissions::ACTION_DELETE && !$this->userPermissions->canDeleteType($type->getId()))
					{
						$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_TYPE_MODIFY_DENIED')));
					}
				}
			}
		}
		elseif($this->entity === UserPermissions::ENTITY_STAGE)
		{
			$typeId = null;
			if($this->actionType === UserPermissions::ACTION_CREATE)
			{
				$fields = $this->getFieldsFromArguments();
				if($fields)
				{
					$typeId = $fields['typeId'];
				}
			}
			else
			{
				/** @var Stage $stage */
				$stage = $this->getObjectFromArguments(Stage::class);
				if($stage)
				{
					$typeId = $stage->getTypeId();
					if(!$typeId)
					{
						$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_TYPE_NOT_FOUND')));
					}
					elseif($this->actionType === UserPermissions::ACTION_VIEW && !$this->userPermissions->canViewType($typeId))
					{
						$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_STAGE_VIEW_DENIED')));
					}
					elseif($this->actionType === UserPermissions::ACTION_MODIFY && !$this->userPermissions->canModifyType($typeId))
					{
						$this->addError(new Error(Loc::getMessage('RPA_PERMISSION_STAGE_MODIFY_DENIED')));
					}
				}
				else
				{
					$this->addError(new Error(Loc::getMessage('RPA_STAGE_NOT_FOUND_ERROR')));
				}
			}
		}

		if(!$this->errorCollection->isEmpty())
		{
			return new EventResult(EventResult::ERROR, null, null, $this);
		}

		return null;
	}

	protected function getObjectFromArguments(string $className)
	{
		$result = null;
		foreach($this->action->getArguments() as $argument)
		{
			if($argument instanceof $className)
			{
				$result = $argument;
				break;
			}
		}

		return $result;
	}

	protected function getFieldsFromArguments(): ?array
	{
		$arguments = $this->action->getArguments();
		if(isset($arguments['fields']))
		{
			return $arguments['fields'];
		}

		return null;
	}
}