![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-eav/Model/Attribute/Data/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Eav\Model\Attribute\Data; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\App\RequestInterface; use Magento\Framework\Filesystem\Io\File as FileIo; /** * EAV Entity Attribute File Data Model * * @api * @since 100.0.2 * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class File extends \Magento\Eav\Model\Attribute\Data\AbstractData { /** * Validator for check not protected extensions * * @var \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension */ protected $_validatorNotProtectedExtensions; /** * @var \Magento\Framework\Url\EncoderInterface */ protected $urlEncoder; /** * @var \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension */ protected $_fileValidator; /** * @var \Magento\Framework\Filesystem\Directory\Write */ protected $_directory; /** * @var FileIo */ private $fileIo; /** * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Locale\ResolverInterface $localeResolver * @param \Magento\Framework\Url\EncoderInterface $urlEncoder * @param \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension $fileValidator * @param \Magento\Framework\Filesystem $filesystem * @param FileIo $fileIo * @codeCoverageIgnore */ public function __construct( \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Psr\Log\LoggerInterface $logger, \Magento\Framework\Locale\ResolverInterface $localeResolver, \Magento\Framework\Url\EncoderInterface $urlEncoder, \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension $fileValidator, \Magento\Framework\Filesystem $filesystem, FileIo $fileIo ) { parent::__construct($localeDate, $logger, $localeResolver); $this->urlEncoder = $urlEncoder; $this->_fileValidator = $fileValidator; $this->_directory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA); $this->fileIo = $fileIo; } /** * Extract data from request and return value * * @param RequestInterface $request * @return array|string|bool * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function extractValue(RequestInterface $request) { if ($this->getIsAjaxRequest()) { return false; } $extend = $this->_getRequestValue($request); $attrCode = $this->getAttribute()->getAttributeCode(); if ($this->_requestScope) { $value = []; if (strpos($this->_requestScope, '/') !== false) { $scopes = explode('/', $this->_requestScope); $mainScope = array_shift($scopes); } else { $mainScope = $this->_requestScope; $scopes = []; } // phpcs:disable Magento2.Security.Superglobal if (!empty($_FILES[$mainScope])) { foreach ($_FILES[$mainScope] as $fileKey => $scopeData) { foreach ($scopes as $scopeName) { if (isset($scopeData[$scopeName])) { $scopeData = $scopeData[$scopeName]; } else { $scopeData[$scopeName] = []; } } if (isset($scopeData[$attrCode])) { $value[$fileKey] = $scopeData[$attrCode]; } } } else { $value = []; } // phpcs:enable Magento2.Security.Superglobal } else { // phpcs:disable Magento2.Security.Superglobal if (isset($_FILES[$attrCode])) { $value = $_FILES[$attrCode]; } else { $value = []; } // phpcs:enable Magento2.Security.Superglobal } if (!empty($extend['delete'])) { $value['delete'] = true; } return $value; } /** * Validate file by attribute validate rules and return array of errors * * @param array $value * @return string[] */ protected function _validateByRules($value) { $label = $this->getAttribute()->getStoreLabel(); $rules = $this->getAttribute()->getValidateRules(); $extension = $this->fileIo->getPathInfo($value['name'])['extension']; if (!empty($rules['file_extensions'])) { $extensions = explode(',', $rules['file_extensions']); $extensions = array_map('trim', $extensions); if (!in_array($extension, $extensions)) { return [__('"%1" is not a valid file extension.', $label)]; } } /** * Check protected file extension */ if (!$this->_fileValidator->isValid($extension)) { return $this->_fileValidator->getMessages(); } if (!empty($value['tmp_name']) && !$this->_directory->getDriver()->isExists($value['tmp_name']) ) { return [__('"%1" is not a valid file.', $label)]; } if (!empty($rules['max_file_size'])) { $size = $value['size']; if ($rules['max_file_size'] < $size) { return [__('"%1" exceeds the allowed file size.', $label)]; } } return []; } /** * Validate data * * @param array|string $value * @return bool * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function validateValue($value) { if ($this->getIsAjaxRequest()) { return true; } $fileData = $value; if (is_string($value) && !empty($value)) { $dir = $this->_directory->getAbsolutePath($this->getAttribute()->getEntityType()->getEntityTypeCode()); $stat = $this->_directory->getDriver()->stat($dir . $value); $fileData = [ 'size' => $stat['size'], 'name' => $value, 'tmp_name' => $dir . $value ]; } $errors = []; $attribute = $this->getAttribute(); $toDelete = !empty($value['delete']) ? true : false; $toUpload = !empty($value['tmp_name']) || is_string($value) && !empty($value) ? true : false; if (!$toUpload && !$toDelete && $this->getEntity()->getData($attribute->getAttributeCode())) { return true; } if (!$attribute->getIsRequired() && !$toUpload) { return true; } if ($attribute->getIsRequired() && !$toUpload) { $label = __($attribute->getStoreLabel()); $errors[] = __('"%1" is a required value.', $label); } if ($toUpload) { $errors = array_merge($errors, $this->_validateByRules($fileData)); } if (count($errors) == 0) { return true; } return $errors; } /** * Export attribute value to entity model * * @param array|string $value * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function compactValue($value) { if ($this->getIsAjaxRequest()) { return $this; } $attribute = $this->getAttribute(); $original = $this->getEntity()->getData($attribute->getAttributeCode()); $toDelete = false; if ($original) { if (!$attribute->getIsRequired() && !empty($value['delete'])) { $toDelete = true; } if (!empty($value['tmp_name'])) { $toDelete = true; } } $destinationFolder = $attribute->getEntityType()->getEntityTypeCode(); // unlink entity file if ($toDelete) { $this->getEntity()->setData($attribute->getAttributeCode(), ''); $file = $destinationFolder . $original; if ($this->_directory->isExist($file)) { $this->_directory->delete($file); } } if (!empty($value['tmp_name'])) { try { $uploader = new \Magento\Framework\File\Uploader($value); $uploader->setFilesDispersion(true); $uploader->setFilenamesCaseSensitivity(false); $uploader->setAllowRenameFiles(true); $uploader->save($this->_directory->getAbsolutePath($destinationFolder), $value['name']); $fileName = $uploader->getUploadedFileName(); $this->getEntity()->setData($attribute->getAttributeCode(), $fileName); } catch (\Exception $e) { $this->_logger->critical($e); } } return $this; } /** * Restore attribute value from SESSION to entity model * * @param array|string $value * @return $this * * @codeCoverageIgnore * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function restoreValue($value) { return $this; } /** * Return formatted attribute value from entity model * * @param string $format * @return string|array */ public function outputValue($format = \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_TEXT) { $output = ''; $value = $this->getEntity()->getData($this->getAttribute()->getAttributeCode()); if ($value) { switch ($format) { case \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON: $output = ['value' => $value, 'url_key' => $this->urlEncoder->encode($value)]; break; } } return $output; } }