66
77namespace Magento \Catalog \Model \Product \Option \Type \File ;
88
9+ use Magento \Framework \App \Config \ScopeConfigInterface ;
10+ use Magento \Framework \Exception \InputException ;
11+ use Magento \Framework \Exception \LocalizedException ;
12+ use Magento \Framework \File \Size ;
13+ use Magento \Framework \Filesystem ;
14+ use Magento \Framework \Filesystem \Io \File as IoFile ;
15+ use Magento \MediaStorage \Helper \File \Storage \Database ;
16+ use Magento \MediaStorage \Model \File \Validator \NotProtectedExtension ;
17+
918/**
1019 * Validator for existing files.
1120 */
1221class ValidatorInfo extends Validator
1322{
1423 /**
15- * @var \Magento\MediaStorage\Helper\File\Storage\ Database
24+ * @var Database
1625 */
1726 protected $ coreFileStorageDatabase ;
1827
@@ -36,24 +45,39 @@ class ValidatorInfo extends Validator
3645 */
3746 protected $ fileRelativePath ;
3847
48+ /**
49+ * @var IoFile
50+ */
51+ private $ ioFile ;
52+ /**
53+ * @var NotProtectedExtension
54+ */
55+ private $ fileValidator ;
56+
3957 /**
4058 * Construct method
4159 *
42- * @param \Magento\Framework\App\Config\ ScopeConfigInterface $scopeConfig
43- * @param \Magento\Framework\ Filesystem $filesystem
44- * @param \Magento\Framework\File\ Size $fileSize
45- * @param \Magento\MediaStorage\Helper\File\Storage\ Database $coreFileStorageDatabase
60+ * @param ScopeConfigInterface $scopeConfig
61+ * @param Filesystem $filesystem
62+ * @param Size $fileSize
63+ * @param Database $coreFileStorageDatabase
4664 * @param ValidateFactory $validateFactory
65+ * @param NotProtectedExtension $fileValidator
66+ * @param IoFile $ioFile
4767 */
4868 public function __construct (
49- \Magento \Framework \App \Config \ScopeConfigInterface $ scopeConfig ,
50- \Magento \Framework \Filesystem $ filesystem ,
51- \Magento \Framework \File \Size $ fileSize ,
52- \Magento \MediaStorage \Helper \File \Storage \Database $ coreFileStorageDatabase ,
53- \Magento \Catalog \Model \Product \Option \Type \File \ValidateFactory $ validateFactory
69+ ScopeConfigInterface $ scopeConfig ,
70+ Filesystem $ filesystem ,
71+ Size $ fileSize ,
72+ Database $ coreFileStorageDatabase ,
73+ ValidateFactory $ validateFactory ,
74+ NotProtectedExtension $ fileValidator ,
75+ IoFile $ ioFile
5476 ) {
5577 $ this ->coreFileStorageDatabase = $ coreFileStorageDatabase ;
5678 $ this ->validateFactory = $ validateFactory ;
79+ $ this ->fileValidator = $ fileValidator ;
80+ $ this ->ioFile = $ ioFile ;
5781 parent ::__construct ($ scopeConfig , $ filesystem , $ fileSize );
5882 }
5983
@@ -94,27 +118,42 @@ public function validate($optionValue, $option)
94118 $ validatorChain = $ this ->validateFactory ->create ();
95119 try {
96120 $ validatorChain = $ this ->buildImageValidator ($ validatorChain , $ option , $ this ->fileFullPath );
97- } catch (\ Magento \ Framework \ Exception \ InputException $ notImage ) {
121+ } catch (InputException $ notImage ) {
98122 return false ;
99123 }
100124
101- $ result = false ;
102- if ($ validatorChain ->isValid ($ this ->fileFullPath , $ optionValue ['title ' ])) {
103- $ result = $ this ->rootDirectory ->isReadable ($ this ->fileRelativePath )
125+ if ($ this ->validatePath ($ optionValue ) && $ validatorChain ->isValid ($ this ->fileFullPath , $ optionValue ['title ' ])) {
126+ return $ this ->rootDirectory ->isReadable ($ this ->fileRelativePath )
104127 && isset ($ optionValue ['secret_key ' ])
105128 && $ this ->buildSecretKey ($ this ->fileRelativePath ) == $ optionValue ['secret_key ' ];
106- } elseif ( $ validatorChain -> getErrors ()) {
129+ } else {
107130 $ errors = $ this ->getValidatorErrors ($ validatorChain ->getErrors (), $ optionValue , $ option );
108-
109131 if (count ($ errors ) > 0 ) {
110- throw new \ Magento \ Framework \ Exception \ LocalizedException (__ (implode ("\n" , $ errors )));
132+ throw new LocalizedException (__ (implode ("\n" , $ errors )));
111133 }
112- } else {
113- throw new \Magento \Framework \Exception \LocalizedException (
134+ throw new LocalizedException (
114135 __ ("The product's required option(s) weren't entered. Make sure the options are entered and try again. " )
115136 );
116137 }
117- return $ result ;
138+ }
139+
140+ /**
141+ * Validate quote_path and order_path.
142+ *
143+ * @param array $optionValuePath
144+ * @return bool
145+ */
146+ private function validatePath (array $ optionValuePath ): bool
147+ {
148+ foreach ([$ optionValuePath ['quote_path ' ], $ optionValuePath ['order_path ' ]] as $ path ) {
149+ $ pathInfo = $ this ->ioFile ->getPathInfo ($ path );
150+ if (isset ($ pathInfo ['extension ' ])) {
151+ if (!$ this ->fileValidator ->isValid ($ pathInfo ['extension ' ])) {
152+ return false ;
153+ }
154+ }
155+ }
156+ return true ;
118157 }
119158
120159 /**
0 commit comments