Your IP : 52.15.110.37


Current Path : /var/www/admin_ftp_12/data/www/httpdocs/bitrix/components/bitrix/photogallery.upload/
Upload File :
Current File : /var/www/admin_ftp_12/data/www/httpdocs/bitrix/components/bitrix/photogallery.upload/class.php

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main;
use Bitrix\Main\Localization\Loc;

Loc::loadMessages(__FILE__);

require_once(__DIR__.'/functions.php');

class CPhotogalleryUpload extends \CBitrixComponent implements Main\Engine\Contract\Controllerable, Main\Errorable
{
	/*@var Main\ErrorCollection */
	protected $errors;
	protected $iblockId = null;
	protected $gallery = null;
	protected $section = null;
	protected $uploader = null;
	public function __construct($component = null)
	{
		parent::__construct($component);
		$this->errors = new Main\ErrorCollection();
	}

	public function onPrepareComponentParams($params)
	{
		if (!CModule::IncludeModule('photogallery'))
		{
			$this->errors[] = new Main\Error(Loc::getMessage('P_MODULE_IS_NOT_INSTALLED'));
		}
		if (!CModule::IncludeModule('iblock'))
		{
			$this->errors[] = new Main\Error(Loc::getMessage('IBLOCK_MODULE_NOT_INSTALLED'));
		}
		if ($params['BEHAVIOUR'] == 'USER' && empty($params['USER_ALIAS']))
		{
			$this->errors->setError(new Main\Error(Loc::getMessage('P_GALLERY_EMPTY')));
		}

		$params['IBLOCK_TYPE'] = trim($params['IBLOCK_TYPE']);
		$params['IBLOCK_ID'] = intval($params['IBLOCK_ID']);
		$params['SECTION_ID'] = intval($params['SECTION_ID']);
		$params['USER_ALIAS'] = trim($params['USER_ALIAS']);
		$params['BEHAVIOUR'] = ($params['BEHAVIOUR'] == 'USER' ? 'USER' : 'SIMPLE');
		$params['GALLERY_SIZE'] = intval($params['GALLERY_SIZE']) * 1024 * 1024;

		$params['PERMISSION_EXTERNAL'] = trim($params['PERMISSION']);

		if ($this->errors->count() <= 0)
		{
			$gallery = new CPGalleryInterface(
				array(
					'IBlockID' => $params['IBLOCK_ID'],
					'GalleryID' => $params['BEHAVIOUR'] == 'USER' ? $params['USER_ALIAS'] : null,
					'Permission' => $params['PERMISSION_EXTERNAL']),
				array(
					'cache_time' => $params['CACHE_TIME'],
					'set_404' => $params['SET_STATUS_404'] ?? null
				)
			);

			$this->iblockId = $params['IBLOCK_ID'];
			$this->gallery = $gallery->Gallery;
			if ($params['BEHAVIOUR'] == 'USER' && !$this->gallery)
			{
				$this->errors->setError(new Main\Error('Gallery was not found.'));
			}

			$params['PERMISSION'] = $gallery->User['Permission'];
			if ($params['SECTION_ID'] > 0)
			{
				$res = $gallery->GetSection($params['SECTION_ID'], $this->section);
				if ($res > 400)
				{
					$this->errors->setError(new Main\Error('Album was not found.'));
				}
				elseif ($res == 301)
				{
					$this->errors->setError(new Main\Error('Album has moved.', 301));
				}
			}
		}

		if ($params['PERMISSION'] < 'W')
		{
			$this->errors->setError(new Main\Error(Loc::getMessage('P_DENIED_ACCESS')));
		}

		$params['ABS_PERMISSION'] = CIBlock::GetPermission($params['IBLOCK_ID']);
		if ($params['ABS_PERMISSION'] < 'W'
			&& 0 < $params['GALLERY_SIZE']
			&& $this->gallery
			&& $params['GALLERY_SIZE'] < intval($this->gallery['UF_GALLERY_SIZE']))
		{
			$this->errors->setError(new Main\Error(Loc::getMessage('P_GALLERY_NOT_SIZE')));
		}
		if ($this->errors->isEmpty())
		{
			$this->prepareActionParams($params);
			$this->prepareWatermarkParams($params);
		}
		return $params;
	}

	private function prepareActionParams(&$params)
	{
		$params['NEW_ALBUM_NAME'] = GetMessage('P_NEW_ALBUM') <> '' ? GetMessage('P_NEW_ALBUM') : 'New album';
		$params['ALBUM_PHOTO_THUMBS_WIDTH'] = intval($params['ALBUM_PHOTO_THUMBS_WIDTH'] ?: 120);

		$params['UPLOAD_MAX_FILE_SIZE'] =  min(
				[
					_get_size(ini_get('post_max_size')),
					_get_size(ini_get('upload_max_filesize')),
				] + ($params['UPLOAD_MAX_FILE_SIZE'] > 0 ? [intval($params['UPLOAD_MAX_FILE_SIZE'])] : [])
			) * 1024 * 1024;

		// Sizes
		$params['SIZES'] = array(1280, 1024, 800);
		$params['ORIGINAL_SIZE'] = intval($params['ORIGINAL_SIZE']);
		if ($params['ORIGINAL_SIZE'] > 0 && !in_array($params['ORIGINAL_SIZE'], $params['SIZES']))
		{
			$params['SIZES'][] = $params['ORIGINAL_SIZE'];
		}
		$params['THUMBNAIL_SIZE'] = max(($params['THUMBNAIL_SIZE'] ?? 90), 50);

		// Additional sights
		$params['ADDITIONAL_SIGHTS'] = is_array($params['ADDITIONAL_SIGHTS']) ? $params['ADDITIONAL_SIGHTS'] : [];
		$params['PICTURES'] = [];
		if (!empty($params['ADDITIONAL_SIGHTS']) &&
			Main\Config\Option::get('photogallery', 'pictures') <> '' &&
			($additionalCopies = @unserialize(Main\Config\Option::get('photogallery', 'pictures'), ['allowed_classes' => false])))
		{
			foreach ($additionalCopies as $key => $val)
			{
				if (in_array(str_pad($key, 5, '_').$val['code'], $params['ADDITIONAL_SIGHTS']))
				{
					$params['PICTURES'][$val['code']] = array(
						'size' => $additionalCopies[$key]['size'],
						'quality' => $additionalCopies[$key]['quality']
					);
				}
			}
		}
		$params['MODERATION'] = ($params['MODERATION'] == 'Y' ? 'Y' : 'N');
		$params['PUBLIC_BY_DEFAULT'] = (
			($params['SHOW_PUBLIC'] ?? null) == 'N'
			|| $params['PUBLIC_BY_DEFAULT'] != 'N' ? 'Y' : 'N'
		);
		$params['APPROVE_BY_DEFAULT'] = ($params['APPROVE_BY_DEFAULT'] == 'N' ? 'N' : 'Y');
	}

	private function prepareWatermarkParams(&$params)
	{
		if ($params['USE_WATERMARK'] !== 'Y' || !function_exists('gd_info'))
		{
			$params['USE_WATERMARK'] = 'N';
			return;
		}
		$params['WATERMARK_RULES'] = ($params['WATERMARK_RULES'] == 'ALL' ? 'ALL' : 'USER');
		$params['WATERMARK_TYPE'] = ($params['WATERMARK_TYPE'] == 'TEXT' ? 'TEXT' : 'PICTURE');
		$params['WATERMARK_TEXT'] = trim($params['WATERMARK_TEXT'] ?? '');

		$params['SHOW_WATERMARK'] = $params['WATERMARK_RULES'] == 'ALL' ? 'N' : 'Y';

		// We have ugly default font but it's better than no font at all
		if (trim($params['PATH_TO_FONT']) === '')
		{
			$params['PATH_TO_FONT'] = 'default.ttf';
		}
		$params['WATERMARK_COLOR'] = '#'.trim($params['WATERMARK_COLOR'] ?? '', ' #');
		$params['WATERMARK_SIZE'] = intval($params['WATERMARK_SIZE']);
		$params['WATERMARK_FILE'] = trim($params['WATERMARK_FILE'] ?? '');

		$params['WATERMARK_FILE_ORDER'] = in_array($params['WATERMARK_FILE_ORDER'], ['usual', 'resize', 'repeat']) ? : 'usual';
		$params['WATERMARK_POSITION'] = trim($params['WATERMARK_POSITION'] ?? '');

		$arPositions = array('TopLeft', 'TopCenter', 'TopRight', 'CenterLeft', 'Center', 'CenterRight', 'BottomLeft', 'BottomCenter', 'BottomRight');
		$arPositions2 = array('tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br');

		if (in_array($params['WATERMARK_POSITION'], $arPositions2))
			$params['WATERMARK_POSITION'] = str_replace($arPositions2, $arPositions, $params['WATERMARK_POSITION']);
		else
			$params['WATERMARK_POSITION'] = 'BottomRight';

		$params['WATERMARK_TRANSPARENCY'] = trim($params['WATERMARK_TRANSPARENCY'] ?? '');
		$params['WATERMARK_MIN_PICTURE_SIZE'] = intval($params['WATERMARK_MIN_PICTURE_SIZE'] ?: 800);
	}

	private function prepareTemplateParams(&$params)
	{
		foreach ([
			'INDEX' => [],
			'GALLERY' => ['PAGE_NAME' => 'gallery'],
			'SECTION' => ['PAGE_NAME' => 'section', 'SECTION_ID' => '#SECTION_ID#'],
			'SECTION_EDIT' => ['PAGE_NAME' => 'section_edit', 'SECTION_ID' => '#SECTION_ID#'],
		] as $page => $pageParams)
		{
			if (empty($params[$page.'_URL']))
			{
				$uri = new Main\Web\Uri($this->request->getRequestUri());
				$uri->addParams(($pageParams + ($params['BEHAVIOUR'] == 'USER' ? ['USER_ALIAS' => '#USER_ALIAS#'] : [])));
				$params[$page.'_URL'] = $uri->getUri();
			}
			$params['~'.$page.'_URL'] = trim($params[$page.'_URL']);
			$params[$page.'_URL'] = htmlspecialcharsbx($params['~'.$page.'_URL']);
		}

		$test_str = '/bitrix/urlrewrite.php?SEF_APPLICATION_CUR_PAGE_URL=';
		if (strncmp(POST_FORM_ACTION_URI, $test_str, 52) === 0)
		{
			$sUrlPath = urldecode(mb_substr(POST_FORM_ACTION_URI, 52));
			$sUrlPath = CHTTP::urlDeleteParams($sUrlPath, array('view_mode', 'sessid', 'uploader_redirect'), true);
			$params['ACTION_URL'] = htmlspecialcharsbx('/bitrix/urlrewrite.php?SEF_APPLICATION_CUR_PAGE_URL='.urlencode($sUrlPath));
		}
		else
		{
			$params['ACTION_URL'] = CHTTP::urlDeleteParams(htmlspecialcharsback(POST_FORM_ACTION_URI), array('view_mode', 'sessid', 'uploader_redirect'), true);
		}

		$params["ACTION_URL"] = CHTTP::urlAddParams(
			$params["ACTION_URL"],
			[
				'analyticsLabel[action]' => 'uploadPhoto'
			]
		);

		$params['SUCCESS_URL'] = CHTTP::urlDeleteParams(CComponentEngine::MakePathFromTemplate($params['~SECTION_URL'],
			array('USER_ALIAS' => $params['USER_ALIAS'], 'SECTION_ID' => $params['SECTION_ID'])), array('sessid', 'uploader_redirect'), true);
		$params['REDIRECT_URL'] = $params['ACTION_URL'];
		$params['REDIRECT_URL'] = CHTTP::urlDeleteParams($params['REDIRECT_URL'], array('clear_cache', 'bitrix_include_areas', 'bitrix_show_mode', 'back_url_admin', 'bx_photo_ajax', 'change_view_mode_data', 'sessid', 'uploader_redirect'));
		$params['REDIRECT_URL'] .= (mb_strpos($params['REDIRECT_URL'], '?') === false ? '?' : '&').'uploader_redirect=Y&sessid='.bitrix_sessid();
	}

	public function executeComponent()
	{
		$this->arResult['GALLERY'] = $this->gallery;
		$this->arResult['SECTION'] = $this->section;
		if (!$this->errors->isEmpty())
		{
			if ($this->errors->getErrorByCode(303) !== null)
			{
				$url = CComponentEngine::MakePathFromTemplate(
					$this->arParams['~SECTION_URL'],
					[
						'USER_ALIAS' => $this->gallery ? $this->gallery['CODE'] : '',
						'SECTION_ID' => $this->arParams['SECTION_ID']
					]);
				LocalRedirect($url, false, '301 Moved Permanently');
			}
			ShowError($this->errors->getValues()[0]->getMessage());
			return false;
		}

		$this->prepareTemplateParams($this->arParams);
		$this->arParams['bxu'] = $this->getUploader();
		if ($this->request->isPost()
			&& check_bitrix_sessid()
			&& $this->request->getPost('save_upload') === 'Y')
		{
			$this->uploadAction();
		}

		return $this->__includeComponent();
	}

	public function configureActions()
	{
		return [];
	}

	protected function listKeysSignedParameters()
	{
		return [
			'BEHAVIOUR',
			'USER_ALIAS',
			'IBLOCK_TYPE',
			'IBLOCK_ID',
			'SECTION_ID',
			'USER_ALIAS',
			'BEHAVIOUR',
			'PERMISSION',
			'GALLERY_SIZE',

			'UPLOAD_MAX_FILE_SIZE',
			'ADDITIONAL_SIGHTS',
			'PATH_TO_FONT',
			'WATERMARK_MIN_PICTURE_SIZE',

			'MODERATION',
			'SHOW_PUBLIC',
			'PUBLIC_BY_DEFAULT',
			'APPROVE_BY_DEFAULT',
		];
	}

	public function getUploader()
	{
		if ($this->uploader !== null)
		{
			return $this->uploader;
		}
		// We use only square thumbnails, so we increase thumbnail size for better quality
		$thumbSize = round($this->arParams['THUMBNAIL_SIZE'] * 1.8);

		$copies = array(
			'real_picture' => array(
				'code' => 'real_picture',
				'width' => ($this->arParams['ORIGINAL_SIZE'] > 0 ? $this->arParams['ORIGINAL_SIZE'] : false),
				'height' => ($this->arParams['ORIGINAL_SIZE'] > 0 ? $this->arParams['ORIGINAL_SIZE'] : false)
			),
			'thumbnail' => array(
				'code' => 'thumbnail',
				'width' => $thumbSize,
				'height' => $thumbSize
			)
		);
		if (is_array($this->arParams['PICTURES']) && !empty($this->arParams['PICTURES']))
		{
			foreach ($this->arParams['PICTURES'] as $key => $val)
			{
				$copies[$key] = array(
					'code' => $key,
					'width' => $val['size'],
					'height' => $val['size']
				);
			}
		}

		$this->arParams['converters'] = $copies;
		$res = new CPhotoUploader(
			$this->arParams,
			$this->gallery,
			$this->arResult
		);

		$params = array(
			'copies' => array_diff_key($this->arParams['converters'], array('real_picture' => true)),
			'allowUpload' => 'I',
			'uploadFileWidth' => $this->arParams['ORIGINAL_SIZE'],
			'uploadFileHeight' => $this->arParams['ORIGINAL_SIZE'],
			'uploadMaxFilesize' => $this->arParams['UPLOAD_MAX_FILE_SIZE'],
			'events' => array(
				'onPackageIsStarted' => array($res, 'onBeforeUpload'),
				'onPackageIsContinued' => array($res, 'onBeforeUpload'),
				'onPackageIsFinished' => array($res, 'onAfterUpload'),
				'onFileIsUploaded' => array($res, 'handleFile')
			),
			'storage' => array(
				'moduleId' => 'photogallery'
			)
		);

		$this->uploader = new Main\UI\Uploader\Uploader($params);

		return $this->uploader;
	}

	public function uploadAction()
	{
		$this->getUploader()->checkPost();
	}

	public function uploadWatermarkFileAction()
	{
		if (isset($_REQUEST['watermark_iframe']) && $_REQUEST['watermark_iframe'] == 'Y' && check_bitrix_sessid())
		{
			$UploadError = false;
			$pathto = '';
			if ($_SERVER['REQUEST_METHOD'] == 'POST')
			{
				$file = $_FILES['watermark_img'];
				$checkImgMsg = CFile::CheckImageFile($file);
				if ($file['error'] != 0)
				{
					$UploadError = '[IU_WM01] '.GetMessage('P_WM_IMG_ERROR01');
				}
				elseif($checkImgMsg <> '' || $checkImgMsg === '')
				{
					$UploadError = '[IU_WM02] '.($checkImgMsg === '' ? GetMessage('P_WM_IMG_ERROR02') : $checkImgMsg);
				}
				else
				{
					$imgArray = CFile::GetImageSize($file['tmp_name']);
					if(is_array($imgArray))
					{
						$width = $imgArray[0];
						$height = $imgArray[1];
					}

					$pathto = CTempFile::GetDirectoryName(1).'/'.'watermark_'.md5($file['name']).GetFileExtension($file['name']);
					CheckDirPath($pathto);

					$pathtoRel = mb_substr($pathto, mb_strlen($_SERVER['DOCUMENT_ROOT']));

					if(!move_uploaded_file($file['tmp_name'], $pathto))
						$UploadError = '[IU_WM03] '.GetMessage('P_WM_IMG_ERROR03');
				}
			}
			$APPLICATION->RestartBuffer();
			?>
			<script>
				<?if ($UploadError === false && $pathto != ''):?>
				top.bxiu_wm_img_res = {path: '<?= CUtil::JSEscape($pathtoRel)?>', width: '<?= $width?>', height: '<?= $height?>'};
				<?elseif($UploadError !== false):?>
				top.bxiu_wm_img_res = {error: '<?= $UploadError?>'};
				<?endif;?>
			</script>
			<?
			die();
		}
	}

	public function getErrors()
	{

	}

	public function getErrorByCode($code)
	{

	}
}