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/ilovecveti.ru/bitrix/modules/translate/lib/controller/asset/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/translate/lib/controller/asset/applypublic.php
<?php
namespace Bitrix\Translate\Controller\Asset;

use Bitrix\Main;
use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Translate;


/**
 * Harvester of the lang folder disposition.
 */
class ApplyPublic
	extends Translate\Controller\Action
	implements Translate\Controller\ITimeLimit, Translate\Controller\IProcessParameters
{
	use Translate\Controller\Stepper;
	use Translate\Controller\ProcessParams;

	/** @var string */
	private $languageId;

	/** @var string */
	private $tmpFolderPath;

	/** @var string */
	private $sourceFolderPath;

	/** @var int */
	private $totalFileCount;

	/** @var string */
	public static $documentRoot;
	/** @var boolean */
	public static $useTranslationRepository;
	/** @var string[] */
	public static $enabledLanguages;
	/** @var string */
	public static $translationRepositoryRoot;

	/** @var string */
	private $seekPath;
	/** @var string */
	private $seekModule;
	/** @var string */
	private $seekType;
	/** @var string[] */
	private $seekAncestors;


	const TARGET_FOLDERS = [
		'component' => '#BX_ROOT#/components/bitrix',
		'activities' => '#BX_ROOT#/activities/bitrix',
		'gadgets' => '#BX_ROOT#/gadgets/bitrix',
		'wizards' => '#BX_ROOT#/wizards/bitrix',
		'blocks' => '#BX_ROOT#/blocks/bitrix',
		'template' => '#BX_ROOT#/templates',
		'mobileapp' => '#BX_ROOT#/mobileapp',
		'js' => '#BX_ROOT#/js',
	];
	const SOURCE_FOLDERS = [
		'component' => '/install/components/bitrix',
		'activities' => '/install/activities/bitrix',
		'gadgets' => '/install/gadgets/bitrix',
		'wizards' => '/install/wizards/bitrix',
		'blocks' => '/install/blocks/bitrix',
		'template' => '/install/templates',
		'mobileapp' => '/install/mobileapp',
		'js' => '/install/js',
	];



	/**
	 * \Bitrix\Main\Engine\Action constructor.
	 *
	 * @param string $name Action name.
	 * @param Main\Engine\Controller $controller Parent controller object.
	 * @param array $config Additional configuration.
	 */
	public function __construct($name, Main\Engine\Controller $controller, array $config = [])
	{
		$this->keepField([
			'languageId', 'tmpFolderPath', 'totalFileCount', 'sourceFolderPath',
			'seekPath', 'seekModule', 'seekType'
		]);

		parent::__construct($name, $controller, $config);

		self::$useTranslationRepository = Main\Localization\Translation::useTranslationRepository();
		self::$enabledLanguages = Translate\Config::getEnabledLanguages();
		if (self::$useTranslationRepository)
		{
			self::$translationRepositoryRoot = Main\Localization\Translation::getTranslationRepositoryPath();
		}
		self::$documentRoot = rtrim(Translate\IO\Path::tidy(Main\Application::getDocumentRoot()), '/');
	}

	/**
	 * Runs controller action.
	 *
	 * @return array
	 */
	public function run()
	{
		// continue previous process
		$progressParams = $this->getProgressParameters();

		$updatePublic = $this->controller->getRequest()->get('updatePublic');
		if ($updatePublic === null || $updatePublic !== 'Y')
		{
			// finish it
			return [
				'STATUS' => Translate\Controller\STATUS_COMPLETED,
				'PROCESSED_ITEMS' => $progressParams['totalFileCount'],
				'TOTAL_ITEMS' => $progressParams['totalItems'],
			];
		}


		$this->languageId = $progressParams['languageId'];
		$this->tmpFolderPath = $progressParams['tmpFolderPath'];
		$this->totalFileCount = $progressParams['totalFileCount'];


		if ($this->isNewProcess)
		{
			$this->totalItems = $this->totalFileCount;
			$this->processedItems = 0;

			// language
			$languageId = $this->controller->getRequest()->get('languageId');
			if (empty($languageId))
			{
				$this->addError(new Main\Error(Loc::getMessage('TR_ERROR_SELECT_LANGUAGE')));
			}
			if (!in_array($languageId, self::$enabledLanguages))
			{
				$this->addError(new Main\Error(Loc::getMessage('TR_ERROR_LANGUAGE_ID')));
			}
			else
			{
				$this->languageId = $languageId;
			}

			$this->sourceFolderPath = Translate\IO\Path::tidy($this->tmpFolderPath .'/'. $this->languageId. '/');

			$sourceDirectory = new Translate\IO\Directory($this->sourceFolderPath);
			if (!$sourceDirectory->isExists())
			{
				$this->addError(
					new Error(Loc::getMessage('TR_ERROR_CREATE_TARGET_FOLDER', ['#PATH#' => $this->sourceFolderPath]))
				);
			}

			$this->saveProgressParameters();

			return [
				'STATUS' => ($this->totalItems > 0 ? Translate\Controller\STATUS_PROGRESS : Translate\Controller\STATUS_COMPLETED),
				'PROCESSED_ITEMS' => 0,
				'TOTAL_ITEMS' => $this->totalItems,
			];
		}

		$this->targetFolderPath = $progressParams['targetFolderPath'];
		$this->seekPath = $progressParams['seekPath'];
		$this->seekModule = $progressParams['seekModule'];
		$this->seekType = $progressParams['seekType'];

		return $this->performStep('runApplying');
	}


	/**
	 * Copying lang files.
	 *
	 * @return array
	 */
	private function runApplying(): array
	{
		$processedItemCount = 0;

		if (!empty($this->seekPath))
		{
			$this->seekAncestors = [];
			$arr = \explode('/', \str_replace($this->sourceFolderPath, '', $this->seekPath));
			\array_pop($arr);//last file
			$parts = [];
			foreach ($arr as $part)
			{
				$parts[] = $part;
				$this->seekAncestors[] = $this->sourceFolderPath. \implode('/', $parts);
			}
		}

		$sourceDirectory = new Translate\IO\Directory($this->sourceFolderPath);
		foreach ($sourceDirectory->getChildren() as $entry)
		{
			$moduleName = $entry->getName();
			if (\in_array($moduleName, Translate\IGNORE_FS_NAMES) || !$entry->isDirectory())
			{
				continue;
			}
			if (!empty($this->seekModule))
			{
				if ($this->seekModule !== $moduleName)
				{
					continue;
				}
				$this->seekModule = null;
			}

			foreach (self::SOURCE_FOLDERS as $type => $typeSourcePath)
			{
				if (!empty($this->seekType))
				{
					if ($this->seekType !== $type)
					{
						continue;
					}
					$this->seekType = null;
				}

				$sourceFolder = new Main\IO\Directory($entry->getPhysicalPath(). $typeSourcePath);
				if ($sourceFolder->isExists())
				{
					$targetFolderPath = \str_replace('#BX_ROOT#', self::$documentRoot. ''. \BX_ROOT, self::TARGET_FOLDERS[$type]);

					foreach ($this->lookThroughTmpFolder($sourceFolder->getPhysicalPath()) as $filePaths)
					{
						foreach ($filePaths as $langFilePath => $sourceFullPath)
						{
							$targetPath =
								$targetFolderPath .'/'.
								\str_replace($moduleName. $typeSourcePath .'/', '', \dirname($langFilePath));

							$targetFolder = new Main\IO\Directory($targetPath);
							if (!$targetFolder->isExists())
							{
								$targetFolder->create();
							}

							$moduleSourcePath = self::$documentRoot. ''. \BX_ROOT. '/modules/'. $langFilePath;
							$source = new Main\IO\File($moduleSourcePath);
							if (!$source->isExists())
							{
								continue;
							}

							$target = new Main\IO\File($targetFolder->getPhysicalPath(). '/'. \basename($langFilePath));
							if ($target->isExists())
							{
								$target->markWritable();
							}

							try
							{
								if (\function_exists('error_clear_last'))
								{
									\error_clear_last();
								}
								if (\copy($source->getPhysicalPath(), $target->getPhysicalPath()) !== true)
								{
									$error = \error_get_last();
									$this->addError(new Main\Error($error['message'], $error['type']));
									continue;
								}

								$processedItemCount ++;
							}
							catch (Main\IO\IoException $exception)
							{
								$this->addError(new Main\Error($exception->getMessage()));
							}
						}
					}

					if ($this->instanceTimer()->hasTimeLimitReached())
					{
						$this->seekPath = $sourceFullPath;
						$this->seekModule = $moduleName;
						$this->seekType = $type;
						break 2;
					}
				}

				// check user abortion
				if (\connection_status() !== \CONNECTION_NORMAL)
				{
					throw new Main\SystemException('Process has been broken course user aborted connection.');
				}
			}
		}

		$this->processedItems += $processedItemCount;

		$result = [
			'PROCESSED_ITEMS' => $this->processedItems,
			'TOTAL_ITEMS' => $this->totalItems,
		];

		if ($this->instanceTimer()->hasTimeLimitReached() !== true)
		{
			$this->declareAccomplishment();
			$this->clearProgressParameters();

			$result['SUMMARY'] = Loc::getMessage('TR_LANGUAGE_DOWNLOADED');
		}

		return $result;
	}


	/**
	 * Runs through tmp folder and copy files into lang folders.
	 *
	 * @param string $tmpFolderFullPath Full path of the temp folder to look through.
	 *
	 * @return \Generator|array|iterable
	 */
	private function lookThroughTmpFolder($tmpFolderFullPath): iterable
	{
		$files = [];
		$folders = [];

		$tmpFolderFullPath = Translate\IO\Path::tidy(\rtrim($tmpFolderFullPath, '/'));
		$langFolderRelPath = \str_replace($this->sourceFolderPath, '', $tmpFolderFullPath);

		$childrenList = Translate\IO\FileSystemHelper::getFileList($tmpFolderFullPath);
		if (!empty($childrenList))
		{
			foreach ($childrenList as $fullPath)
			{
				if (!empty($this->seekPath))
				{
					if ($this->seekPath != $fullPath)
					{
						continue;
					}

					$this->seekPath = null;
					$this->seekAncestors = null;
				}

				$name = \basename($fullPath);
				if (\in_array($name, Translate\IGNORE_FS_NAMES))
				{
					continue;
				}

				if (Translate\IO\Path::isPhpFile($fullPath, true))
				{
					$files[$langFolderRelPath.'/'.$name] = $fullPath;
				}
			}
		}

		// dir only
		$childrenList = Translate\IO\FileSystemHelper::getFolderList($tmpFolderFullPath);
		if (!empty($childrenList))
		{
			foreach ($childrenList as $fullPath)
			{
				$name = \basename($fullPath);
				if (\in_array($name, Translate\IGNORE_FS_NAMES))
				{
					continue;
				}

				if (!empty($this->seekPath))
				{
					if (\in_array($fullPath, $this->seekAncestors))
					{
						foreach ($this->lookThroughTmpFolder($fullPath) as $subFiles)// go deeper
						{
							yield $subFiles;
						}
					}
					continue;
				}

				if (!\is_dir($fullPath))
				{
					continue;
				}

				$relPath = $langFolderRelPath.'/'.$name;

				if (\in_array($relPath, Translate\IGNORE_BX_NAMES))
				{
					continue;
				}

				$folders[$relPath] = $fullPath;
			}
		}

		if (\count($files) > 0)
		{
			yield $files;
		}

		if (\count($folders) > 0)
		{
			foreach ($folders as $subFolderPath)
			{
				foreach ($this->lookThroughTmpFolder($subFolderPath) as $subFiles)// go deeper
				{
					yield $subFiles;
				}
			}
		}
	}

	/**
	 * Returns progress option name
	 *
	 * @return string
	 */
	public function getProgressParameterOptionName()
	{
		$controller = $this->getController();
		return $controller::SETTING_ID;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit