%PDF- %PDF-
Server IP : 37.220.80.31 / Your IP : 13.59.114.228 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/components/bitrix/rest.configuration.install/ |
Upload File : |
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) { die(); } use Bitrix\Main\Engine\Contract\Controllerable; use Bitrix\Main\Engine\ActionFilter; use Bitrix\Main\ArgumentException; use Bitrix\Main\Localization\Loc; use Bitrix\Main\ErrorCollection; use Bitrix\Main\Config\Option; use Bitrix\Main\Application; use Bitrix\Main\Web\Json; use Bitrix\Main\Loader; use Bitrix\Main\Error; use Bitrix\Rest\Configuration\Controller; use Bitrix\Rest\Configuration\Structure; use Bitrix\Rest\Configuration\Manifest; use Bitrix\Rest\Configuration\Setting; use Bitrix\Rest\Configuration\Helper; use Bitrix\Rest\Configuration\DataProvider; use Bitrix\Disk\Internals\FolderTable; use Bitrix\Disk\SystemUser; use Bitrix\Rest\Configuration\Action\Import; use Bitrix\Rest\Configuration\Notification; Loc::loadMessages(__FILE__); class CRestConfigurationInstallComponent extends CBitrixComponent implements Controllerable { /** @var ErrorCollection $errors */ protected $errors; protected $actionError; protected $diskFolder = false; protected $savedActionUserContextPostfix = 'saved'; protected function checkRequiredParams() { $this->errors = new ErrorCollection(); $manifestCode = ''; if (!empty($this->arParams['IMPORT_MANIFEST']['CODE'])) { $manifestCode = $this->arParams['IMPORT_MANIFEST']['CODE']; } elseif ($this->arParams['MANIFEST_CODE']) { $manifestCode = $this->arParams['MANIFEST_CODE']; } $access = Manifest::checkAccess(Manifest::ACCESS_TYPE_IMPORT, $manifestCode); if ($access['result'] !== true) { $this->errors->setError( new Error( $access['message'] !== '' ? htmlspecialcharsbx($access['message']) : Loc::getMessage('REST_CONFIGURATION_INSTALL_ACCESS_DENIED') ) ); return false; } if($this->arParams['IMPORT_DISK_FOLDER_ID']) { $this->diskFolder = $this->getDiskFolder(); if($this->diskFolder === false) { $this->errors->setError(new Error(Loc::getMessage("REST_CONFIGURATION_INSTALL_DISK_FOLDER_NOT_FOUND"))); return false; } } return true; } protected function listKeysSignedParameters() { return [ 'IMPORT_PATH', 'IMPORT_CONTEXT', 'IMPORT_MANIFEST', 'IMPORT_DISK_FOLDER_ID', 'IMPORT_DISK_STORAGE_PARAMS', 'APP', 'MODE', 'MANIFEST_CODE', 'UNINSTALL_APP_ON_FINISH', 'PROCESS_ID', ]; } protected function isPreInstallAppMode() { return $this->request->getQuery('create_install') === 'Y'; } protected function isImportByProcessId() { return (int)$this->arParams['PROCESS_ID'] > 0; } protected function prepareResult() { $result = [ 'MANIFEST' => [], 'NEED_CLEAR_FULL' => true, 'PRE_INSTALL_APP_MODE' => false, 'NEED_START_BTN' => true, 'NEED_CLEAR_FULL_CONFIRM' => true, 'IMPORT_BY_PROCESS_ID' => $this->isImportByProcessId(), ]; $manifest = null; if(!empty($this->arParams['IMPORT_MANIFEST']['CODE'])) { $manifest = Manifest::get($this->arParams['IMPORT_MANIFEST']['CODE']); if(!is_null($manifest)) { if(intval($manifest['VERSION']) < intval($this->arParams['IMPORT_MANIFEST']['VERSION'])) { $result['NOTIFY'][] = Loc::getMessage("REST_CONFIGURATION_INSTALL_ERROR_MANIFEST_OLD"); } } else { $result['NOTIFY'][] = Loc::getMessage("REST_CONFIGURATION_INSTALL_ERROR_MANIFEST_NOT_FOUND"); } } elseif($this->arParams['MANIFEST_CODE']) { $manifest = Manifest::get($this->arParams['MANIFEST_CODE']); } if(!is_null($manifest)) { $result['MANIFEST'] = $manifest; $result['NEED_CLEAR_FULL_CONFIRM'] = $manifest['DISABLE_CLEAR_FULL'] == 'Y' ? false : true; $result['NEED_CLEAR_FULL'] = $result['NEED_CLEAR_FULL_CONFIRM']; $result['NEED_START_BTN'] = $manifest['DISABLE_NEED_START_BTN'] == 'Y' && !$manifest['NEED_CLEAR_FULL_CONFIRM'] ? false : true; } if($this->isPreInstallAppMode()) { $result['NEED_START_BTN'] = true; $result['NEED_CLEAR_FULL_CONFIRM'] = false; $result['PRE_INSTALL_APP_MODE'] = true; } $this->arResult = $result; return true; } protected function setActionError($message) { if(is_array($message)) { if(!$this->actionError) { $this->actionError = []; } $this->actionError = array_merge($this->actionError, $message); } else { $this->actionError[] = $message; } return true; } protected function getActionError() { return $this->actionError; } protected function printErrors() { foreach ($this->errors as $error) { ShowError($error); } } public function executeComponent() { if (!$this->checkRequiredParams()) { $this->printErrors(); return; } if (!$this->prepareResult()) { $this->printErrors(); return; } $this->includeComponentTemplate(); } protected function getItemContent($type, $step): array { $result = []; $count = 0; $path = ''; $providerCode = ''; if ($this->diskFolder) { $providerCode = DataProvider\Controller::CODE_DISK; $path = $type; } else { if (!empty($this->arParams['IMPORT_PATH'])) { $folder = $this->arParams['IMPORT_PATH']; } else { $structure = new \Bitrix\Rest\Configuration\Structure($this->getUserContext()); $folder = $structure->getFolder(); } if (is_dir($folder . $type)) { $fileList = array_values(array_diff(scandir($folder . $type), ['.', '..'])); $count = count($fileList); if (isset($fileList[$step])) { $providerCode = DataProvider\Controller::CODE_IO; $path = $folder . $type . '/' . $fileList[$step]; } } } if ($providerCode) { /** @var DataProvider\ProviderBase $disk */ $provider = DataProvider\Controller::getInstance()->get( $providerCode, [ 'CONTEXT' => $this->getImportContext(), 'CONTEXT_USER' => $this->getUserContext(), ] ); if ($provider) { $result = $provider->getContent($path, (int)$step); if ($result['COUNT'] === 0) { $result['COUNT'] = $count; } if ($result['ERROR_CODE'] === $provider::ERROR_DECODE_DATA) { $this->setActionError( Loc::getMessage( "REST_CONFIGURATION_INSTALL_FILE_CONTENT_ERROR_DECODE", [ '#STEP#' => $step ] ) ); } if ($result['SANITIZE']) { $this->setActionError( Loc::getMessage( "REST_CONFIGURATION_INSTALL_FILE_CONTENT_ERROR_SANITIZE_SHORT", [ '#STEP#' => $step ] ) ); } } } return $result; } protected function getImportContext() { $id = !empty($this->arParams['APP']['ID']) ? $this->arParams['APP']['ID'] : 0; return Helper::getInstance()->getContextAction($id); } protected function getUserContext($postfix = false) { return $this->arParams['IMPORT_CONTEXT'].(($postfix !== false) ? $postfix : ''); } public function startAction() { $result = []; if ($this->checkRequiredParams()) { $import = new Import(); $import->setContext($this->getUserContext()); $import->getNotificationInstance()->clean(); $result = $import->doStart( $this->arParams['APP'], $this->arParams['MODE'] ?? Helper::MODE_IMPORT, [ 'UNINSTALL_APP_ON_FINISH' => $this->arParams['UNINSTALL_APP_ON_FINISH'], ] ); if (Helper::getInstance()->isBasicManifest($this->arParams['MANIFEST_CODE'])) { $usesApp = Helper::getInstance()->getBasicApp($this->arParams['MANIFEST_CODE']); if ( $usesApp === false && $this->arParams['MODE'] !== Helper::MODE_ROLLBACK && Loader::includeModule('disk') ) { $result['next'] = 'save'; $setting = new Setting( $this->getUserContext( $this->savedActionUserContextPostfix ) ); $setting->deleteFull(); $this->deleteBackupFolder(); } } if ($this->arParams['IMPORT_DISK_FOLDER_ID'] && $this->arParams['IMPORT_DISK_STORAGE_PARAMS']) { $structure = new Structure($this->getUserContext()); $structure->setUnpackFilesFromDisk($this->arParams['IMPORT_DISK_FOLDER_ID'], $this->arParams['IMPORT_DISK_STORAGE_PARAMS']); } } $result['notice'] = $this->getActionError(); return $result; } private function deleteBackupFolder() { $result = false; /** @var DataProvider\Disk\Base $disk */ $disk = DataProvider\Controller::getInstance()->get( DataProvider\Controller::CODE_DISK, [ 'CONTEXT' => $this->getImportContext(), 'CONTEXT_USER' => $this->getUserContext(), ] ); if ($disk) { $result = $disk->deleteFolder(); if (!$result) { $this->setActionError($disk->listError()); } } return $result; } private function addDiskBackupFiles($files) { $result = [ 'success' => false, ]; if (is_array($files)) { /** @var DataProvider\Disk\Base $disk */ $disk = DataProvider\Controller::getInstance()->get( DataProvider\Controller::CODE_DISK, [ 'CONTEXT' => $this->getImportContext(), 'CONTEXT_USER' => $this->getUserContext(), ] ); if ($disk) { $result = $disk->addFiles($files); } } return $result; } private function addDiskBackupContent($type, $code, $content) { $result = false; /** @var DataProvider\Disk\Base $disk */ $disk = DataProvider\Controller::getInstance()->get( DataProvider\Controller::CODE_DISK, [ 'CONTEXT' => $this->getImportContext(), 'CONTEXT_USER' => $this->getUserContext(), ] ); if ($disk) { $result = $disk->addContent($type, $code, $content); } return $result; } private function getDiskFolder() { $folder = false; if( !empty($this->arParams['IMPORT_DISK_FOLDER_ID']) && !empty($this->arParams['IMPORT_DISK_STORAGE_PARAMS']) && Loader::includeModule('disk') ) { /** @var DataProvider\Disk\Base $disk */ $disk = DataProvider\Controller::getInstance()->get( DataProvider\Controller::CODE_DISK, [ 'CONTEXT' => $this->getImportContext(), 'CONTEXT_USER' => $this->getUserContext(), ] ); $disk->setFolderFilter( [ '=ID' => $this->arParams['IMPORT_DISK_FOLDER_ID'], ] ); $folder = $disk->getFolder(); } return $folder; } public function finishAction() { $result = [ 'result' => false, 'createItemList' => [] ]; if ($this->checkRequiredParams()) { $import = new Import(); $import->setContext($this->getUserContext()); $import->setManifestCode($this->arParams['MANIFEST_CODE']); $result = $import->doFinish( $this->arParams['MODE'] ?? Helper::MODE_IMPORT ); } $result['notice'] = $this->getActionError(); return $result; } public function clearAction() { $result = []; if($this->checkRequiredParams()) { $request = Application::getInstance()->getContext()->getRequest(); $code = preg_replace('/[^a-zA-Z0-9_]/', '', $request->getPost('code')); $step = (int) $request->getPost('step'); $next = htmlspecialcharsbx($request->getPost('next')); $clearFull = $request->getPost('clear') == 'true' ? : false; if ($code) { $import = new Import(); $import->setContext($this->getUserContext()); $import->setManifestCode($this->arParams['MANIFEST_CODE']); $result = $import->doClean( $code, $step, $next, $clearFull ); $result = array_merge( $result, $this->getNotification( $import->getNotificationInstance() ) ); } } $result['notice'] = $this->getActionError(); return $result; } public function importAction() { $result = [ 'result' => true ]; $import = new Import(); $import->setContext($this->getUserContext()); if ($this->checkRequiredParams()) { $request = Application::getInstance()->getContext()->getRequest(); $code = preg_replace('/[^a-zA-Z0-9_]/', '', $request->getPost("code")); $step = (int) $request->getPost("step"); if ($code) { $content = $this->getItemContent($code, $step); $import->setManifestCode($this->arParams['MANIFEST_CODE']); $result = $import->doLoad( $step, $code, $content ); } } return array_merge( $result, $this->getNotification( $import->getNotificationInstance() ) ); } public function saveAction() { $result = []; if($this->checkRequiredParams()) { $request = Application::getInstance()->getContext()->getRequest(); $code = preg_replace('/[^a-zA-Z0-9_]/', '', $request->getPost("code")); $step = intval($request->getPost("step")); $next = htmlspecialcharsbx($request->getPost("next")); if($code) { $manifest = $this->arParams['MANIFEST_CODE'] != '' ? $this->arParams['MANIFEST_CODE'] : Helper::TYPE_SECTION_TOTAL; $items = Controller::callEventExport($manifest, $code, $step, $next); foreach ($items as $item) { if($item['FILE_NAME'] != '') { $this->addDiskBackupContent($code, $item['FILE_NAME'], $item['CONTENT']); if($item['FILES']) { $this->addDiskBackupFiles($item['FILES']); } } $result['next'] = $item['NEXT']; } } } if(!isset($result['next'])) { $result['next'] = false; } $result['notice'] = $this->getActionError(); return $result; } public function loadManifestAction() { $result = [ 'next' => false ]; if($this->checkRequiredParams()) { $request = Application::getInstance()->getContext()->getRequest(); $step = intval($request->getPost("step")); $next = htmlspecialcharsbx($request->getPost("next")); $type = $request->getPost("type"); if($type !== 'import') { $type = 'EXPORT'; $contextUser = $this->getUserContext($this->savedActionUserContextPostfix); } else { $type = 'IMPORT'; $contextUser = $this->getUserContext(); } $import = new Import(); $import->setContext($contextUser); $import->setManifestCode($this->arParams['MANIFEST_CODE']); $result = $import->doInitManifest( $next, $step, $type, ); $result = array_merge( $result, $this->getNotification( $import->getNotificationInstance() ) ); } return $result; } private function getNotification(Notification $notification): array { $result = []; $result['errors'] = $notification->list( [ 'type' => Notification::TYPE_ERROR, ] ); $result['notice'] = $notification->list( [ 'type' => Notification::TYPE_NOTICE, ] ); $result['exception'] = $notification->list( [ 'type' => Notification::TYPE_EXCEPTION, ] ); return array_filter( $result, function ($value) { return !empty($value); } ); } public function finishSaveAction() { $structure = new Structure($this->getUserContext($this->savedActionUserContextPostfix)); $manifest = Manifest::get($this->arParams['MANIFEST_CODE']); if(!is_null($manifest)) { $manifest = [ 'CODE' => $manifest['CODE'], 'VERSION' => $manifest['VERSION'], 'USES' => $manifest['USES'] ]; $this->addDiskBackupContent(false, 'manifest', $manifest); } $this->addDiskBackupContent(false, Helper::STRUCTURE_FILES_NAME, $structure->getFileList()); return [ 'result' => true ]; } public function preInstallOffAction() { Option::set("rest", "import_configuration_app", ''); return [ 'result' => true ]; } /** * Does all steps by process id. * * @return array */ public function runAction(): array { $result = [ 'finish' => true, ]; if ((int)$this->arParams['PROCESS_ID'] > 0) { $import = new Import((int)$this->arParams['PROCESS_ID']); $isRun = $import->run(); $result = $import->get(); $result['step'] = $result['progress']['action'] ?? 'finish'; if ($isRun && in_array($result['status'], [Import::STATUS_START, Import::STATUS_PROCESS])) { $result['finish'] = false; } else { $result['finish'] = true; } $import->getNotificationInstance()->clean(); } return $result; } public function configureActions() { return [ 'run' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ ActionFilter\HttpMethod::METHOD_POST, ] ), new ActionFilter\Csrf(), ], ], 'start' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf(), ], 'postfilters' => [ ] ], 'finish' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf(), ], 'postfilters' => [ ] ], 'clear' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf(), ], 'postfilters' => [ ] ], 'import' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf(), ], 'postfilters' => [ ] ], 'save' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf() ], 'postfilters' => [ ] ], 'finishSave' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf() ], 'postfilters' => [ ] ], 'loadManifest' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf() ] ], 'preInstallOff' => [ 'prefilters' => [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_POST] ), new ActionFilter\Csrf() ] ], ]; } }