Skip to content

Commit 52f39a4

Browse files
committed
Directory and filename must be no more than 255 characters in length
1 parent b9c13fd commit 52f39a4

File tree

4 files changed

+73
-10
lines changed

4 files changed

+73
-10
lines changed

app/code/Magento/CatalogImportExport/Model/Import/Uploader.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ class Uploader extends \Magento\MediaStorage\Model\File\Uploader
111111
*/
112112
private $fileSystem;
113113

114+
/**
115+
* Directory and filename must be no more than 255 characters in length
116+
*/
117+
private $maxFilenameLength = 255;
118+
114119
/**
115120
* @param \Magento\MediaStorage\Helper\File\Storage\Database $coreFileStorageDb
116121
* @param \Magento\MediaStorage\Helper\File\Storage $coreFileStorage
@@ -188,6 +193,13 @@ public function move($fileName, $renameFileOff = false)
188193
unset($result['path']);
189194
$result['name'] = self::getCorrectFileName($result['name']);
190195

196+
// Directory and filename must be no more than 255 characters in length
197+
if (strlen($result['file']) > $this->maxFilenameLength) {
198+
throw new \LengthException(
199+
__('Filename is too long; must be %1 characters or less', $this->maxFilenameLength)
200+
);
201+
}
202+
191203
return $result;
192204
}
193205

app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/UploaderTest.php

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\CatalogImportExport\Model\Import\Uploader;
1010
use Magento\Framework\Exception\LocalizedException;
1111
use Magento\Framework\Filesystem;
12+
use Magento\Framework\Filesystem\Directory\Write;
1213
use Magento\Framework\Filesystem\Driver\Http;
1314
use Magento\Framework\Filesystem\Driver\Https;
1415
use Magento\Framework\Filesystem\DriverPool;
@@ -58,7 +59,7 @@ class UploaderTest extends TestCase
5859
protected $readFactory;
5960

6061
/**
61-
* @var \Magento\Framework\Filesystem\Directory\Writer|MockObject
62+
* @var WriteInterface|MockObject
6263
*/
6364
protected $directoryMock;
6465

@@ -96,7 +97,7 @@ protected function setUp(): void
9697
->setMethods(['create'])
9798
->getMock();
9899

99-
$this->directoryMock = $this->getMockBuilder(\Magento\Framework\Filesystem\Directory\Writer::class)
100+
$this->directoryMock = $this->getMockBuilder(Write::class)
100101
->setMethods(['writeFile', 'getRelativePath', 'isWritable', 'getAbsolutePath'])
101102
->disableOriginalConstructor()
102103
->getMock();
@@ -186,14 +187,21 @@ public function testMoveFileUrl($fileUrl, $expectedHost, $expectedFileName, $che
186187
->willReturn($destDir . '/' . $expectedFileName);
187188
$this->uploader->expects($this->once())->method('_setUploadFile')
188189
->willReturnSelf();
190+
191+
$returnFile = $destDir . DIRECTORY_SEPARATOR . $expectedFileName;
192+
189193
$this->uploader->expects($this->once())->method('save')
190194
->with($destDir . '/' . $expectedFileName)
191-
->willReturn(['name' => $expectedFileName, 'path' => 'absPath']);
195+
->willReturn([
196+
'name' => $expectedFileName,
197+
'path' => 'absPath',
198+
'file' => $returnFile
199+
]);
192200

193201
$this->uploader->setDestDir($destDir);
194202
$result = $this->uploader->move($fileUrl);
195203

196-
$this->assertEquals(['name' => $expectedFileName], $result);
204+
$this->assertEquals(['name' => $expectedFileName, 'file' => $returnFile], $result);
197205
$this->assertArrayNotHasKey('path', $result);
198206
}
199207

@@ -209,11 +217,50 @@ public function testMoveFileName()
209217
//Check invoking of getTmpDir(), _setUploadFile(), save() methods.
210218
$this->uploader->expects($this->once())->method('getTmpDir')->willReturn('');
211219
$this->uploader->expects($this->once())->method('_setUploadFile')->willReturnSelf();
220+
221+
$returnFile = $destDir . DIRECTORY_SEPARATOR . $fileName;
222+
212223
$this->uploader->expects($this->once())->method('save')->with($destDir . '/' . $fileName)
213-
->willReturn(['name' => $fileName]);
224+
->willReturn(['name' => $fileName, 'file' => $returnFile]);
225+
226+
$this->uploader->setDestDir($destDir);
227+
$this->assertEquals(['name' => $fileName, 'file' => $returnFile], $this->uploader->move($fileName));
228+
}
229+
230+
public function testFilenameLength()
231+
{
232+
$destDir = 'var/tmp/' . str_repeat('testFilenameLength', 13); // 242 characters
233+
234+
$fileName = \uniqid(); // 13 characters
235+
236+
$this->directoryMock->expects($this->once())
237+
->method('isWritable')
238+
->with($destDir)
239+
->willReturn(true);
240+
241+
$this->directoryMock->expects($this->once())
242+
->method('getRelativePath')
243+
->with($fileName)
244+
->willReturn(null);
245+
246+
$this->directoryMock->expects($this->once())
247+
->method('getAbsolutePath')
248+
->with($destDir)
249+
->willReturn($destDir);
250+
251+
$this->uploader->expects($this->once())
252+
->method('save')
253+
->with($destDir)
254+
->willReturn([
255+
'name' => $fileName,
256+
'file' => $destDir . DIRECTORY_SEPARATOR . $fileName // 256 characters
257+
]);
214258

215259
$this->uploader->setDestDir($destDir);
216-
$this->assertEquals(['name' => $fileName], $this->uploader->move($fileName));
260+
261+
$this->expectException(\LengthException::class);
262+
263+
$this->uploader->move($fileName);
217264
}
218265

219266
/**

lib/internal/Magento/Framework/File/Test/Unit/UploaderTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function testGetCorrectFileName($fileName, $expectedCorrectedFileName)
2626
$isExceptionExpected = $expectedCorrectedFileName === true;
2727

2828
if ($isExceptionExpected) {
29-
$this->expectException(\InvalidArgumentException::class);
29+
$this->expectException(\LengthException::class);
3030
}
3131

3232
$this->assertEquals(
@@ -62,7 +62,7 @@ public function getCorrectFileNameProvider()
6262
'a.' . str_repeat('b', 88)
6363
],
6464
[
65-
'a.' . str_repeat('b', 89),
65+
'a.' . str_repeat('b', 199), // 201 characters
6666
true
6767
]
6868
];

lib/internal/Magento/Framework/File/Uploader.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,12 @@ public static function getCorrectFileName($fileName)
407407
$fileInfo['extension'] = $fileInfo['extension'] ?? '';
408408

409409
// account for excessively long filenames that cannot be stored completely in database
410-
if (strlen($fileInfo['basename']) > 90) {
411-
throw new \InvalidArgumentException('Filename is too long; must be 90 characters or less');
410+
$maxFilenameLength = 200;
411+
412+
if (strlen($fileInfo['basename']) > $maxFilenameLength) {
413+
throw new \LengthException(
414+
__('Filename is too long; must be %1 characters or less', $maxFilenameLength)
415+
);
412416
}
413417

414418
if (preg_match('/^_+$/', $fileInfo['filename'])) {

0 commit comments

Comments
 (0)