2008-04-06 10:20:13 +02:00
|
|
|
<?php
|
2008-06-15 15:33:53 +02:00
|
|
|
/**
|
|
|
|
* @package sapphire
|
|
|
|
* @subpackage tests
|
|
|
|
*/
|
2008-04-06 10:20:13 +02:00
|
|
|
class UploadTest extends SapphireTest {
|
2008-04-08 08:08:31 +02:00
|
|
|
static $fixture_file = 'sapphire/tests/filesystem/UploadTest.yml';
|
|
|
|
|
2008-04-06 10:20:13 +02:00
|
|
|
function testUpload() {
|
|
|
|
// create tmp file
|
|
|
|
$tmpFileName = 'UploadTest_testUpload.txt';
|
|
|
|
$tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName;
|
|
|
|
$tmpFileContent = '';
|
|
|
|
for($i=0; $i<10000; $i++) $tmpFileContent .= '0';
|
|
|
|
file_put_contents($tmpFilePath, $tmpFileContent);
|
|
|
|
|
|
|
|
// emulates the $_FILES array
|
|
|
|
$tmpFile = array(
|
|
|
|
'name' => $tmpFileName,
|
|
|
|
'type' => 'text/plaintext',
|
|
|
|
'size' => filesize($tmpFilePath),
|
|
|
|
'tmp_name' => $tmpFilePath,
|
|
|
|
'extension' => 'txt',
|
|
|
|
'error' => UPLOAD_ERR_OK,
|
|
|
|
);
|
|
|
|
|
2010-03-01 02:17:00 +01:00
|
|
|
$v = new UploadTest_Validator();
|
|
|
|
|
2008-04-06 10:20:13 +02:00
|
|
|
// test upload into default folder
|
|
|
|
$u1 = new Upload();
|
2010-03-01 02:17:00 +01:00
|
|
|
$u1->setValidator($v);
|
2008-04-06 10:20:13 +02:00
|
|
|
$u1->load($tmpFile);
|
|
|
|
$file1 = $u1->getFile();
|
|
|
|
$this->assertTrue(
|
|
|
|
file_exists($file1->getFullPath()),
|
|
|
|
'File upload to standard directory in /assets'
|
|
|
|
);
|
|
|
|
$this->assertTrue(
|
2010-03-14 09:33:36 +01:00
|
|
|
(strpos($file1->getFullPath(), Director::baseFolder() . '/assets/' . Upload::$uploads_folder) !== false),
|
2008-04-06 10:20:13 +02:00
|
|
|
'File upload to standard directory in /assets'
|
|
|
|
);
|
|
|
|
$file1->delete();
|
|
|
|
|
|
|
|
// test upload into custom folder
|
|
|
|
$customFolder = 'UploadTest_testUpload';
|
|
|
|
$u2 = new Upload();
|
|
|
|
$u2->load($tmpFile, $customFolder);
|
|
|
|
$file2 = $u2->getFile();
|
|
|
|
$this->assertTrue(
|
|
|
|
file_exists($file2->getFullPath()),
|
|
|
|
'File upload to custom directory in /assets'
|
|
|
|
);
|
|
|
|
$this->assertTrue(
|
2010-03-14 09:33:36 +01:00
|
|
|
(strpos($file2->getFullPath(), Director::baseFolder() . '/assets/' . $customFolder) !== false),
|
2008-04-06 10:20:13 +02:00
|
|
|
'File upload to custom directory in /assets'
|
|
|
|
);
|
|
|
|
$file2->delete();
|
|
|
|
|
|
|
|
unlink($tmpFilePath);
|
2010-03-14 10:13:33 +01:00
|
|
|
rmdir(Director::baseFolder() . '/assets/' . $customFolder);
|
2008-04-06 10:20:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function testAllowedFilesize() {
|
|
|
|
// @todo
|
|
|
|
}
|
|
|
|
|
2010-03-14 09:33:36 +01:00
|
|
|
function testUploadDoesNotAllowUnknownExtension() {
|
|
|
|
// create tmp file
|
|
|
|
$tmpFileName = 'UploadTest_testUpload.php';
|
|
|
|
$tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName;
|
|
|
|
$tmpFileContent = '';
|
|
|
|
for($i=0; $i<10000; $i++) $tmpFileContent .= '0';
|
|
|
|
file_put_contents($tmpFilePath, $tmpFileContent);
|
|
|
|
|
|
|
|
// emulates the $_FILES array
|
|
|
|
$tmpFile = array(
|
|
|
|
'name' => $tmpFileName,
|
|
|
|
'type' => 'text/plaintext',
|
|
|
|
'size' => filesize($tmpFilePath),
|
|
|
|
'tmp_name' => $tmpFilePath,
|
|
|
|
'extension' => 'txt',
|
|
|
|
'error' => UPLOAD_ERR_OK,
|
|
|
|
);
|
|
|
|
|
|
|
|
$v = new UploadTest_Validator();
|
|
|
|
$v->setAllowedExtensions(array('txt'));
|
|
|
|
|
|
|
|
// test upload into default folder
|
|
|
|
$u = new Upload();
|
|
|
|
$u->setValidator($v);
|
|
|
|
$result = $u->load($tmpFile);
|
|
|
|
|
|
|
|
$this->assertFalse($result, 'Load failed because extension was not accepted');
|
|
|
|
$this->assertEquals(1, count($u->getErrors()), 'There is a single error of the file extension');
|
|
|
|
}
|
|
|
|
|
|
|
|
function testUploadAcceptsAllowedExtension() {
|
|
|
|
// create tmp file
|
|
|
|
$tmpFileName = 'UploadTest_testUpload.txt';
|
|
|
|
$tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName;
|
|
|
|
$tmpFileContent = '';
|
|
|
|
for($i=0; $i<10000; $i++) $tmpFileContent .= '0';
|
|
|
|
file_put_contents($tmpFilePath, $tmpFileContent);
|
|
|
|
|
|
|
|
// emulates the $_FILES array
|
|
|
|
$tmpFile = array(
|
|
|
|
'name' => $tmpFileName,
|
|
|
|
'type' => 'text/plaintext',
|
|
|
|
'size' => filesize($tmpFilePath),
|
|
|
|
'tmp_name' => $tmpFilePath,
|
|
|
|
'extension' => 'txt',
|
|
|
|
'error' => UPLOAD_ERR_OK,
|
|
|
|
);
|
|
|
|
|
|
|
|
$v = new UploadTest_Validator();
|
|
|
|
$v->setAllowedExtensions(array('txt'));
|
|
|
|
|
|
|
|
// test upload into default folder
|
|
|
|
$u = new Upload();
|
|
|
|
$u->setValidator($v);
|
|
|
|
$u->load($tmpFile);
|
|
|
|
$file = $u->getFile();
|
|
|
|
$this->assertTrue(
|
|
|
|
file_exists($file->getFullPath()),
|
|
|
|
'File upload to custom directory in /assets'
|
|
|
|
);
|
|
|
|
$file->delete();
|
2008-04-06 10:20:13 +02:00
|
|
|
}
|
|
|
|
|
2010-03-15 07:31:40 +01:00
|
|
|
function testUploadDeniesNoExtensionFilesIfNoEmptyStringSetForValidatorExtensions() {
|
|
|
|
// create tmp file
|
|
|
|
$tmpFileName = 'UploadTest_testUpload';
|
|
|
|
$tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName;
|
|
|
|
$tmpFileContent = '';
|
|
|
|
for($i=0; $i<10000; $i++) $tmpFileContent .= '0';
|
|
|
|
file_put_contents($tmpFilePath, $tmpFileContent);
|
|
|
|
|
|
|
|
// emulates the $_FILES array
|
|
|
|
$tmpFile = array(
|
|
|
|
'name' => $tmpFileName,
|
|
|
|
'type' => 'text/plaintext',
|
|
|
|
'size' => filesize($tmpFilePath),
|
|
|
|
'tmp_name' => $tmpFilePath,
|
|
|
|
'extension' => 'txt',
|
|
|
|
'error' => UPLOAD_ERR_OK,
|
|
|
|
);
|
|
|
|
|
|
|
|
$v = new UploadTest_Validator();
|
|
|
|
$v->setAllowedExtensions(array('txt'));
|
|
|
|
|
|
|
|
// test upload into default folder
|
|
|
|
$u = new Upload();
|
|
|
|
$result = $u->load($tmpFile);
|
|
|
|
|
|
|
|
$this->assertFalse($result, 'Load failed because extension was not accepted');
|
|
|
|
$this->assertEquals(1, count($u->getErrors()), 'There is a single error of the file extension');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function testUploadTarGzFileTwiceAppendsNumber() {
|
|
|
|
// create tmp file
|
|
|
|
$tmpFileName = 'UploadTest_testUpload.tar.gz';
|
|
|
|
$tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName;
|
|
|
|
$tmpFileContent = '';
|
|
|
|
for($i=0; $i<10000; $i++) $tmpFileContent .= '0';
|
|
|
|
file_put_contents($tmpFilePath, $tmpFileContent);
|
|
|
|
|
|
|
|
// emulates the $_FILES array
|
|
|
|
$tmpFile = array(
|
|
|
|
'name' => $tmpFileName,
|
|
|
|
'type' => 'text/plaintext',
|
|
|
|
'size' => filesize($tmpFilePath),
|
|
|
|
'tmp_name' => $tmpFilePath,
|
|
|
|
'extension' => 'txt',
|
|
|
|
'error' => UPLOAD_ERR_OK,
|
|
|
|
);
|
|
|
|
|
|
|
|
// test upload into default folder
|
|
|
|
$u = new Upload();
|
|
|
|
$u->load($tmpFile);
|
|
|
|
$file = $u->getFile();
|
|
|
|
$this->assertEquals(
|
|
|
|
'UploadTesttestUpload.tar.gz',
|
|
|
|
$file->Name,
|
|
|
|
'File has a name without a number because it\'s not a duplicate'
|
|
|
|
);
|
|
|
|
|
|
|
|
$u = new Upload();
|
|
|
|
$u->load($tmpFile);
|
|
|
|
$file2 = $u->getFile();
|
|
|
|
$this->assertEquals(
|
|
|
|
'UploadTesttestUpload2.tar.gz',
|
|
|
|
$file2->Name,
|
|
|
|
'File receives a number attached to the end before the extension'
|
|
|
|
);
|
|
|
|
|
|
|
|
$file->delete();
|
|
|
|
$file2->delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
function testUploadFileWithNoExtensionTwiceAppendsNumber() {
|
|
|
|
// create tmp file
|
|
|
|
$tmpFileName = 'UploadTest_testUpload';
|
|
|
|
$tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName;
|
|
|
|
$tmpFileContent = '';
|
|
|
|
for($i=0; $i<10000; $i++) $tmpFileContent .= '0';
|
|
|
|
file_put_contents($tmpFilePath, $tmpFileContent);
|
|
|
|
|
|
|
|
// emulates the $_FILES array
|
|
|
|
$tmpFile = array(
|
|
|
|
'name' => $tmpFileName,
|
|
|
|
'type' => 'text/plaintext',
|
|
|
|
'size' => filesize($tmpFilePath),
|
|
|
|
'tmp_name' => $tmpFilePath,
|
|
|
|
'extension' => 'txt',
|
|
|
|
'error' => UPLOAD_ERR_OK,
|
|
|
|
);
|
|
|
|
|
|
|
|
$v = new UploadTest_Validator();
|
|
|
|
$v->setAllowedExtensions(array(''));
|
|
|
|
|
|
|
|
// test upload into default folder
|
|
|
|
$u = new Upload();
|
|
|
|
$u->setValidator($v);
|
|
|
|
$u->load($tmpFile);
|
|
|
|
$file = $u->getFile();
|
|
|
|
|
|
|
|
$this->assertEquals(
|
|
|
|
'UploadTesttestUpload',
|
|
|
|
$file->Name,
|
|
|
|
'File is uploaded without extension'
|
|
|
|
);
|
|
|
|
|
|
|
|
$u = new Upload();
|
|
|
|
$u->setValidator($v);
|
|
|
|
$u->load($tmpFile);
|
|
|
|
$file2 = $u->getFile();
|
|
|
|
$this->assertEquals(
|
|
|
|
'UploadTesttestUpload_2',
|
|
|
|
$file2->Name,
|
|
|
|
'File receives a number attached to the end'
|
|
|
|
);
|
|
|
|
|
|
|
|
$file->delete();
|
|
|
|
$file2->delete();
|
|
|
|
}
|
|
|
|
|
2008-04-06 10:20:13 +02:00
|
|
|
}
|
2010-03-01 02:17:00 +01:00
|
|
|
class UploadTest_Validator extends Upload_Validator implements TestOnly {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Looser check validation that doesn't do is_upload_file()
|
|
|
|
* checks as we're faking a POST request that PHP didn't generate
|
|
|
|
* itself.
|
|
|
|
*
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function validate() {
|
|
|
|
$pathInfo = pathinfo($this->tmpFile['name']);
|
|
|
|
// filesize validation
|
|
|
|
|
|
|
|
if(!$this->isValidSize()) {
|
|
|
|
$this->errors[] = sprintf(
|
|
|
|
_t(
|
|
|
|
'File.TOOLARGE',
|
|
|
|
'Filesize is too large, maximum %s allowed.',
|
|
|
|
PR_MEDIUM,
|
|
|
|
'Argument 1: Filesize (e.g. 1MB)'
|
|
|
|
),
|
|
|
|
File::format_size($this->getAllowedMaxFileSize($pathInfo['extension']))
|
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// extension validation
|
|
|
|
if(!$this->isValidExtension()) {
|
|
|
|
$this->errors[] = sprintf(
|
|
|
|
_t(
|
|
|
|
'File.INVALIDEXTENSION',
|
|
|
|
'Extension is not allowed (valid: %s)',
|
|
|
|
PR_MEDIUM,
|
|
|
|
'Argument 1: Comma-separated list of valid extensions'
|
|
|
|
),
|
|
|
|
implode(',', $this->allowedExtensions)
|
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|