1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-11 03:04:09 +02:00

Merge pull request #3727 from marc1706/ticket/13904

[ticket/13904] Refactor attachments functions into service

* marc1706/ticket/13904: (66 commits)
  [ticket/13904] Use filespec's get_filesize instead of calling filesize()
  [ticket/13904] Set properties to protected where possible in filespec
  [ticket/13904] Fix tests after changes to factory
  [ticket/13904] Minor coding style fixes
  [ticket/13904] Add language entries for error messages in upload class
  [ticket/13904] Modify files for updated fast-image-size library
  [ticket/13904] Update composer.lock
  [ticket/13904] Improve code coverage
  [ticket/13904] Add unit tests for local upload type
  [ticket/13904] Minor coding style fixes
  [ticket/13904] Improve test coverage of base upload type class
  [ticket/13904] Improve test coverage of remote upload type
  [ticket/13904] Improve test coverage of form upload type
  [ticket/13904] Improve test coverage of filespec class
  [ticket/13904] Add back tests for retrieving floats
  [ticket/13904] Use ini_get() wrapper in file upload types
  [ticket/13904] Modify files for changes in ini wrapper
  [ticket/13904] Add bantu/ini-get-wrapper to composer.json
  [ticket/13904] Switch around constructor arguments
  [ticket/13904] Use \phpbb\php\ini class for ini_get()
  ...
This commit is contained in:
Tristan Darricau
2015-09-16 11:55:13 +02:00
39 changed files with 2986 additions and 1270 deletions

View File

@@ -73,6 +73,8 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
->will($this->returnValue('avatar.driver.barfoo'));
$avatar_drivers = array($this->avatar_foobar, $this->avatar_barfoo);
$files_factory = new \phpbb\files\factory($phpbb_container);
foreach ($this->avatar_drivers() as $driver)
{
if ($driver !== 'upload')
@@ -81,7 +83,7 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
}
else
{
$cur_avatar = $this->getMock('\phpbb\avatar\driver\\' . $driver, array('get_name'), array($this->config, $phpbb_root_path, $phpEx, $filesystem, $path_helper, $guesser, $dispatcher, $cache));
$cur_avatar = $this->getMock('\phpbb\avatar\driver\\' . $driver, array('get_name'), array($this->config, $phpbb_root_path, $phpEx, $filesystem, $path_helper, $dispatcher, $files_factory, $cache));
}
$cur_avatar->expects($this->any())
->method('get_name')

View File

@@ -34,14 +34,14 @@ class phpbb_cache_apc_driver_test extends phpbb_cache_common_test_case
self::markTestSkipped('APC extension is not loaded');
}
$php_ini = new \phpbb\php\ini;
$php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
if (!$php_ini->get_bool('apc.enabled'))
if (!$php_ini->getBool('apc.enabled'))
{
self::markTestSkipped('APC is not enabled. Make sure apc.enabled=1 in php.ini');
}
if (PHP_SAPI == 'cli' && !$php_ini->get_bool('apc.enable_cli'))
if (PHP_SAPI == 'cli' && !$php_ini->getBool('apc.enable_cli'))
{
self::markTestSkipped('APC is not enabled for CLI. Set apc.enable_cli=1 in php.ini');
}

31
tests/files/type_foo.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\files\types;
class foo extends \phpbb\files\types\remote
{
static public $tempnam_path;
}
function tempnam($one, $two)
{
if (empty(foo::$tempnam_path))
{
return \tempnam($one, $two);
}
else
{
return foo::$tempnam_path;
}
}

View File

@@ -0,0 +1,93 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_files_types_base_test extends phpbb_test_case
{
private $path;
private $filesystem;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
protected $container;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
global $phpbb_root_path, $phpEx;
$this->request = $this->getMock('\phpbb\request\request');
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$this->container = new phpbb_mock_container_builder($phpbb_root_path, $phpEx);
$this->container->set('files.filespec', new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
))));
$this->factory = new \phpbb\files\factory($this->container);
$this->path = __DIR__ . '/fixture/';
$this->phpbb_root_path = $phpbb_root_path;
}
public function data_check_upload_size()
{
return array(
array('foo', '500KB', array()),
array('none', '500KB', array('PHP_SIZE_OVERRUN')),
array('none', '', array('PHP_SIZE_NA')),
);
}
/**
* @dataProvider data_check_upload_size
*/
public function test_check_upload_size($filename, $max_filesize, $expected)
{
$php_ini = $this->getMock('\bantu\IniGetWrapper\IniGetWrapper');
$php_ini->expects($this->any())
->method('getString')
->willReturn($max_filesize);
$type_form = new \phpbb\files\types\local($this->factory, $this->language, $php_ini, $this->request);
$file = $this->getMockBuilder('\phpbb\files\filespec')
->disableOriginalConstructor()
->getMock();
$file->expects($this->any())
->method('get')
->willReturn($filename);
$type_form->check_upload_size($file);
$this->assertSame($expected, $file->error);
}
}

View File

@@ -0,0 +1,174 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_files_types_form_test extends phpbb_test_case
{
private $path;
private $filesystem;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
protected $container;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var \phpbb\plupload\plupload */
protected $plupload;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
global $phpbb_root_path, $phpEx;
$this->request = $this->getMock('\phpbb\request\request');
$this->request->expects($this->any())
->method('file')
->willReturn(array());
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$this->container = new phpbb_mock_container_builder($phpbb_root_path, $phpEx);
$this->container->set('files.filespec', new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
))));
$this->factory = new \phpbb\files\factory($this->container);
$this->plupload = $this->getMockBuilder('\phpbb\plupload\plupload')
->disableOriginalConstructor()
->getMock();
$this->plupload->expects($this->any())
->method('handle_upload')
->willReturn(array());
$this->path = __DIR__ . '/fixture/';
$this->phpbb_root_path = $phpbb_root_path;
}
public function data_upload_form()
{
return array(
array(
array(),
array(''),
),
array(
array(
'tmp_name' => 'foo',
'name' => 'foo',
'size' => 500,
'type' => 'image/png',
'error' => UPLOAD_ERR_PARTIAL,
),
array('PARTIAL_UPLOAD'),
),
array(
array(
'tmp_name' => 'foo',
'name' => 'foo',
'size' => 500,
'type' => 'image/png',
'error' => -9,
),
array('NOT_UPLOADED'),
),
array(
array(
'tmp_name' => 'foo',
'name' => 'foo',
'size' => 0,
'type' => 'image/png',
),
array('EMPTY_FILEUPLOAD'),
),
array(
array(
'tmp_name' => 'none',
'name' => 'none',
'size' => 50,
'type' => 'image/png',
),
array('PHP_SIZE_OVERRUN'),
),
array(
array(
'tmp_name' => 'tests/upload/fixture/png',
'name' => 'foo.png',
'size' => 500,
'type' => 'image/png',
'local_mode' => true,
),
array(),
array('local_mode' => true),
),
);
}
/**
* @dataProvider data_upload_form
*/
public function test_upload_form($upload, $expected, $plupload = array())
{
$this->request = $this->getMock('\phpbb\request\request');
$this->request->expects($this->any())
->method('file')
->willReturn($upload);
$filespec = new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$this->phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
)));
$this->container->set('files.filespec', $filespec);
$this->factory = new \phpbb\files\factory($this->container);
$this->plupload = $this->getMockBuilder('\phpbb\plupload\plupload')
->disableOriginalConstructor()
->getMock();
$this->plupload->expects($this->any())
->method('handle_upload')
->willReturn($plupload);
$type_form = new \phpbb\files\types\form($this->factory, $this->language, $this->php_ini, $this->plupload, $this->request);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'));
$type_form->set_upload($upload);
$file = $type_form->upload('foobar');
$this->assertSame($expected, $file->error);
$this->assertInstanceOf('\phpbb\files\filespec', $file);
}
}

View File

@@ -0,0 +1,163 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_files_types_local_test extends phpbb_test_case
{
private $path;
private $filesystem;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
protected $container;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var \phpbb\plupload\plupload */
protected $plupload;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
global $phpbb_root_path, $phpEx;
$this->request = $this->getMock('\phpbb\request\request');
$this->request->expects($this->any())
->method('file')
->willReturn(array());
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$this->container = new phpbb_mock_container_builder($phpbb_root_path, $phpEx);
$this->container->set('files.filespec', new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
))));
$this->factory = new \phpbb\files\factory($this->container);
$this->plupload = $this->getMockBuilder('\phpbb\plupload\plupload')
->disableOriginalConstructor()
->getMock();
$this->plupload->expects($this->any())
->method('handle_upload')
->willReturn(array());
$this->path = __DIR__ . '/fixture/';
$this->phpbb_root_path = $phpbb_root_path;
}
public function test_upload_init_error()
{
$filespec = $this->getMockBuilder('\phpbb\files\filespec')
->disableOriginalConstructor()
->getMock();
$filespec->expects($this->any())
->method('init_error')
->willReturn(true);
$filespec->expects($this->any())
->method('set_upload_ary')
->willReturnSelf();
$filespec->expects($this->any())
->method('set_upload_namespace')
->willReturnSelf();
$this->container->set('files.filespec', $filespec);
$this->factory = new \phpbb\files\factory($this->container);
$type_local = new \phpbb\files\types\local($this->factory, $this->language, $this->php_ini, $this->request);
$file = $type_local->upload('foo', false);
$this->assertSame(array(''), $file->error);
$this->assertInstanceOf('\phpbb\files\filespec', $file);
}
public function data_upload_form()
{
return array(
array(
'foo',
array(
'tmp_name' => 'foo',
'size' => 500,
'type' => 'image/png',
),
array('NOT_UPLOADED'),
),
array(
'none',
false,
array('PHP_SIZE_OVERRUN'),
),
array(
'tests/upload/fixture/png',
array(
'realname' => 'foo.png',
'size' => 500,
'type' => 'image/png',
'local_mode' => true,
),
array(),
),
);
}
/**
* @dataProvider data_upload_form
*/
public function test_upload_form($filename, $upload_ary, $expected)
{
$filespec = new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$this->phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
)));
$filespec_local = new ReflectionProperty($filespec, 'local');
$filespec_local->setAccessible(true);
$filespec_local->setValue($filespec, true);
$this->container->set('files.filespec', $filespec);
$this->factory = new \phpbb\files\factory($this->container);
$type_local = new \phpbb\files\types\local($this->factory, $this->language, $this->php_ini, $this->request);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'));
$type_local->set_upload($upload);
$file = $type_local->upload($filename, $upload_ary);
$this->assertSame($expected, $file->error);
$this->assertInstanceOf('\phpbb\files\filespec', $file);
}
}

View File

@@ -0,0 +1,141 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
require_once dirname(__FILE__) . '/type_foo.php';
class phpbb_files_types_remote_test extends phpbb_test_case
{
private $path;
private $filesystem;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
protected $container;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
global $config, $phpbb_root_path, $phpEx;
$config = new \phpbb\config\config(array());
$this->request = $this->getMock('\phpbb\request\request');
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$this->container = new phpbb_mock_container_builder($phpbb_root_path, $phpEx);
$this->container->set('files.filespec', new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
))));
$this->factory = new \phpbb\files\factory($this->container);
$this->path = __DIR__ . '/fixture/';
$this->phpbb_root_path = $phpbb_root_path;
}
public function test_upload_fsock_fail()
{
$type_remote = new \phpbb\files\types\remote($this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'));
$type_remote->set_upload($upload);
$file = $type_remote->upload('https://bärföö.com/foo.png');
$this->assertSame(array('NOT_UPLOADED'), $file->error);
}
public function data_get_max_file_size()
{
return array(
array('', 'http://example.com/foo/bar.png'),
array('2k', 'http://example.com/foo/bar.png'),
array('500k', 'http://example.com/foo/bar.png'),
array('500M', 'http://example.com/foo/bar.png'),
array('500m', 'http://example.com/foo/bar.png'),
array('500k', 'http://google.com/.png', 'DISALLOWED_CONTENT'),
array('1', 'http://google.com/.png', 'WRONG_FILESIZE'),
array('500g', 'http://example.com/foo/bar.png'),
array('foobar', 'http://example.com/foo/bar.png'),
array('-5k', 'http://example.com/foo/bar.png'),
);
}
/**
* @dataProvider data_get_max_file_size
*/
public function test_get_max_file_size($max_file_size, $link, $expected = 'URL_NOT_FOUND')
{
$php_ini = $this->getMock('\bantu\IniGetWrapper\IniGetWrapper', array('getString'));
$php_ini->expects($this->any())
->method('getString')
->willReturn($max_file_size);
$type_remote = new \phpbb\files\types\remote($this->factory, $this->language, $php_ini, $this->request, $this->phpbb_root_path);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'));
$type_remote->set_upload($upload);
$file = $type_remote->upload($link);
$this->assertSame(array($expected), $file->error);
}
public function test_upload_timeout()
{
$type_remote = new \phpbb\files\types\remote($this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'));
$type_remote->set_upload($upload);
$upload->upload_timeout = -5;
$file = $type_remote->upload('http://google.com/.png');
$this->assertSame(array('REMOTE_UPLOAD_TIMEOUT'), $file->error);
}
public function test_upload_wrong_path()
{
$type_remote = new \phpbb\files\types\foo($this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'));
$type_remote->set_upload($upload);
$type_remote::$tempnam_path = $this->phpbb_root_path . 'cache/wrong/path';
$file = $type_remote->upload('http://google.com/.png');
$this->assertSame(array('NOT_UPLOADED'), $file->error);
$type_remote::$tempnam_path = '';
}
}

128
tests/files/upload_test.php Normal file
View File

@@ -0,0 +1,128 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_files_upload_test extends phpbb_test_case
{
private $path;
private $filesystem;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
protected $container;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
// Global $config required by unique_id
global $config, $phpbb_root_path, $phpEx;
if (!is_array($config))
{
$config = array();
}
$config['rand_seed'] = '';
$config['rand_seed_last_update'] = time() + 600;
$this->request = $this->getMock('\phpbb\request\request');
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$this->container = new phpbb_mock_container_builder($phpbb_root_path, $phpEx);
$this->container->set('files.filespec', new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
))));
$this->factory = new \phpbb\files\factory($this->container);
$this->path = __DIR__ . '/fixture/';
$this->phpbb_root_path = $phpbb_root_path;
}
public function test_reset_vars()
{
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_max_filesize(500);
$this->assertEquals(500, $upload->max_filesize);
$upload->reset_vars();
$this->assertEquals(0, $upload->max_filesize);
}
public function test_set_disallowed_content()
{
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$disallowed_content = new ReflectionProperty($upload, 'disallowed_content');
$disallowed_content->setAccessible(true);
$upload->set_disallowed_content(array('foo'));
$this->assertEquals(array('foo'), $disallowed_content->getValue($upload));
$upload->set_disallowed_content(array('foo', 'bar', 'meh'));
$this->assertEquals(array('foo', 'bar', 'meh'), $disallowed_content->getValue($upload));
$upload->set_disallowed_content('');
$this->assertEquals(array('foo', 'bar', 'meh'), $disallowed_content->getValue($upload));
$this->assertINstanceOf('\phpbb\files\upload', $upload->set_disallowed_content(array()));
$this->assertEquals(array(), $disallowed_content->getValue($upload));
$upload->reset_vars();
$this->assertEquals(array(), $disallowed_content->getValue($upload));
}
public function test_is_valid()
{
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$this->assertFalse($upload->is_valid('foobar'));
}
public function data_internal_error()
{
return array(
array(UPLOAD_ERR_INI_SIZE, 'PHP_SIZE_OVERRUN'),
array(UPLOAD_ERR_FORM_SIZE, 'WRONG_FILESIZE'),
array(UPLOAD_ERR_PARTIAL, 'PARTIAL_UPLOAD'),
array(UPLOAD_ERR_NO_FILE, 'NOT_UPLOADED'),
array(UPLOAD_ERR_NO_TMP_DIR, 'NO_TEMP_DIR'),
array(UPLOAD_ERR_CANT_WRITE, 'NO_TEMP_DIR'),
array(UPLOAD_ERR_EXTENSION, 'PHP_UPLOAD_STOPPED'),
array(9, false),
);
}
/**
* @dataProvider data_internal_error
*/
public function test_assign_internal_error($error_code, $expected)
{
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$this->assertSame($expected, $upload->assign_internal_error($error_code));
}
}

View File

@@ -11,15 +11,29 @@
*
*/
require_once __DIR__ . '/../../phpBB/includes/functions_upload.php';
/**
* @group functional
*/
class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
{
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var string phpBB root path */
protected $phpbb_root_path;
public function setUp()
{
parent::setUp();
@@ -27,8 +41,7 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
// URL
// Global $config required by unique_id
// Global $user required by fileupload::remote_upload
global $config, $user;
global $config, $phpbb_root_path, $phpEx;
if (!is_array($config))
{
@@ -38,9 +51,17 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
$config['rand_seed'] = '';
$config['rand_seed_last_update'] = time() + 600;
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->request = $this->getMock('\phpbb\request\request');
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$container = new phpbb_mock_container_builder();
$container->set('files.filespec', new \phpbb\files\filespec($this->filesystem, $this->language, $this->php_ini, new \FastImageSize\FastImageSize(), $this->phpbb_root_path));
$this->factory = new \phpbb\files\factory($container);
$container->set('files.factory', $this->factory);
$container->set('files.types.remote', new \phpbb\files\types\remote($this->factory, $this->language, $this->php_ini, $this->request, $phpbb_root_path));
$this->phpbb_root_path = $phpbb_root_path;
}
public function tearDown()
@@ -52,30 +73,47 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
public function test_invalid_extension()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$file = $upload->remote_upload(self::$root_url . 'develop/blank.gif');
/** @var \phpbb\files\upload $upload */
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_error_prefix('')
->set_allowed_extensions(array('jpg'))
->set_max_filesize(100);
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/blank.gif');
$this->assertEquals('URL_INVALID', $file->error[0]);
}
public function test_empty_file()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$file = $upload->remote_upload(self::$root_url . 'develop/blank.jpg');
/** @var \phpbb\files\upload $upload */
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_error_prefix('')
->set_allowed_extensions(array('jpg'))
->set_max_filesize(100);
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/blank.jpg');
$this->assertEquals('EMPTY_REMOTE_DATA', $file->error[0]);
}
public function test_successful_upload()
{
$upload = new fileupload($this->filesystem, '', array('gif'), 1000);
$file = $upload->remote_upload(self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
/** @var \phpbb\files\upload $upload */
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_error_prefix('')
->set_allowed_extensions(array('gif'))
->set_max_filesize(1000);
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
$this->assertEquals(0, sizeof($file->error));
$this->assertTrue(file_exists($file->filename));
$this->assertTrue(file_exists($file->get('filename')));
$this->assertTrue($file->is_uploaded());
}
public function test_too_large()
{
$upload = new fileupload($this->filesystem, '', array('gif'), 100);
$file = $upload->remote_upload(self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
/** @var \phpbb\files\upload $upload */
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_error_prefix('')
->set_allowed_extensions(array('gif'))
->set_max_filesize(100);
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
$this->assertEquals(1, sizeof($file->error));
$this->assertEquals('WRONG_FILESIZE', $file->error[0]);
}

View File

@@ -24,11 +24,11 @@ class phpbb_installer_config_test extends phpbb_test_case
{
$phpbb_root_path = __DIR__ . './../../phpBB/';
$filesystem = $this->getMock('\phpbb\filesystem\filesystem');
$php_ini = $this->getMockBuilder('\phpbb\php\ini')
$php_ini = $this->getMockBuilder('\bantu\IniGetWrapper\IniGetWrapper')
->getMock();
$php_ini->method('get_int')
$php_ini->method('getInt')
->willReturn(-1);
$php_ini->method('get_bytes')
$php_ini->method('getBytes')
->willReturn(-1);
$this->config = new config($filesystem, $php_ini, $phpbb_root_path);

View File

@@ -43,7 +43,7 @@ class module_base_test extends phpbb_test_case
$this->module = new test_installer_module($module_collection, true, false);
$iohandler = $this->getMock('\phpbb\install\helper\iohandler\iohandler_interface');
$config = new \phpbb\install\helper\config(new \phpbb\filesystem\filesystem(), new \phpbb\php\ini(), '', 'php');
$config = new \phpbb\install\helper\config(new \phpbb\filesystem\filesystem(), new \bantu\IniGetWrapper\IniGetWrapper(), '', 'php');
$this->module->setup($config, $iohandler);
}

View File

@@ -19,9 +19,10 @@ class phpbb_mock_fileupload
{
public $max_filesize = 100;
public $error_prefix = '';
public $valid_dimensions = true;
public function valid_dimensions($filespec)
{
return true;
return $this->valid_dimensions;
}
}

View File

@@ -48,7 +48,7 @@ class phpbb_plupload_test extends phpbb_test_case
$config,
new phpbb_mock_request,
new \phpbb\user($lang, '\phpbb\datetime'),
new \phpbb\php\ini,
new \bantu\IniGetWrapper\IniGetWrapper,
new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser))
);

View File

@@ -13,7 +13,6 @@
require_once __DIR__ . '/../../phpBB/includes/functions.php';
require_once __DIR__ . '/../../phpBB/includes/utf/utf_tools.php';
require_once __DIR__ . '/../../phpBB/includes/functions_upload.php';
class phpbb_filespec_test extends phpbb_test_case
{
@@ -26,12 +25,16 @@ class phpbb_filespec_test extends phpbb_test_case
private $filesystem;
public $path;
/** @var \phpbb\language\language */
protected $language;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
// Global $config required by unique_id
// Global $user required by filespec::additional_checks and
// filespec::move_file
global $config, $user, $phpbb_filesystem;
global $config, $phpbb_root_path, $phpEx;
if (!is_array($config))
{
@@ -45,9 +48,6 @@ class phpbb_filespec_test extends phpbb_test_case
// See: phpBB/install/schemas/schema_data.sql
$config['mime_triggers'] = 'body|head|html|img|plaintext|a href|pre|script|table|title';
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->config = &$config;
$this->path = __DIR__ . '/fixture/';
@@ -76,8 +76,17 @@ class phpbb_filespec_test extends phpbb_test_case
$guessers[2]->set_priority(-2);
$guessers[3]->set_priority(-2);
$this->mimetype_guesser = new \phpbb\mimetype\guesser($guessers);
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$this->filesystem = $phpbb_filesystem = new \phpbb\filesystem\filesystem();
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->phpbb_root_path = $phpbb_root_path;
}
private function set_reflection_property(&$class, $property_name, $value)
{
$property = new ReflectionProperty($class, $property_name);
$property->setAccessible(true);
$property->setValue($class, $value);
}
private function get_filespec($override = array())
@@ -91,14 +100,13 @@ class phpbb_filespec_test extends phpbb_test_case
'error' => '',
);
return new filespec(array_merge($upload_ary, $override), null, $this->filesystem, $this->mimetype_guesser);
$filespec = new \phpbb\files\filespec($this->filesystem, $this->language, new \bantu\IniGetWrapper\IniGetWrapper, new \FastImageSize\FastImageSize(), $this->phpbb_root_path, $this->mimetype_guesser);
return $filespec->set_upload_ary(array_merge($upload_ary, $override));
}
protected function tearDown()
{
global $user;
$this->config = array();
$user = null;
$iterator = new DirectoryIterator($this->path . 'copies');
foreach ($iterator as $fileinfo)
@@ -111,6 +119,13 @@ class phpbb_filespec_test extends phpbb_test_case
}
}
public function test_empty_upload_ary()
{
$filespec = new \phpbb\files\filespec($this->filesystem, $this->language, new \bantu\IniGetWrapper\IniGetWrapper, new \FastImageSize\FastImageSize(), $this->phpbb_root_path, $this->mimetype_guesser);
$this->assertInstanceOf('\phpbb\files\filespec', $filespec->set_upload_ary(array()));
$this->assertTrue($filespec->init_error());
}
public function additional_checks_variables()
{
// False here just indicates the file is too large and fails the
@@ -132,13 +147,26 @@ class phpbb_filespec_test extends phpbb_test_case
{
$upload = new phpbb_mock_fileupload();
$filespec = $this->get_filespec();
$filespec->upload = $upload;
$filespec->file_moved = true;
$filespec->filesize = $filespec->get_filesize($this->path . $filename);
$filespec->set_upload_namespace($upload);
$this->set_reflection_property($filespec, 'file_moved', true);
$this->set_reflection_property($filespec, 'filesize', $filespec->get_filesize($this->path . $filename));
$this->assertEquals($expected, $filespec->additional_checks());
}
public function test_additional_checks_dimensions()
{
$upload = new phpbb_mock_fileupload();
$filespec = $this->get_filespec();
$filespec->set_upload_namespace($upload);
$upload->valid_dimensions = false;
$this->set_reflection_property($filespec, 'file_moved', true);
$upload->max_filesize = 0;
$this->assertEquals(false, $filespec->additional_checks());
$this->assertSame(array('WRONG_SIZE'), $filespec->error);
}
public function check_content_variables()
{
// False here indicates that a file is non-binary and contains
@@ -173,6 +201,7 @@ class phpbb_filespec_test extends phpbb_test_case
array($chunks[2] . $chunks[9]),
array($chunks[3] . $chunks[4]),
array($chunks[5] . $chunks[6]),
array('foobar.png'),
);
}
@@ -184,7 +213,7 @@ class phpbb_filespec_test extends phpbb_test_case
$bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|');
$filespec = $this->get_filespec(array('name' => $filename));
$filespec->clean_filename('real', self::PREFIX);
$name = $filespec->realname;
$name = $filespec->get('realname');
$this->assertEquals(0, preg_match('/%(\w{2})/', $name));
foreach ($bad_chars as $char)
@@ -200,7 +229,7 @@ class phpbb_filespec_test extends phpbb_test_case
{
$filespec = $this->get_filespec();
$filespec->clean_filename('unique', self::PREFIX);
$name = $filespec->realname;
$name = $filespec->get('realname');
$this->assertEquals(strlen($name), 32 + strlen(self::PREFIX));
$this->assertRegExp('#^[A-Za-z0-9]+$#', substr($name, strlen(self::PREFIX)));
@@ -209,6 +238,55 @@ class phpbb_filespec_test extends phpbb_test_case
}
}
public function test_clean_filename_unique_ext()
{
$filenames = array();
for ($tests = 0; $tests < self::TEST_COUNT; $tests++)
{
$filespec = $this->get_filespec(array('name' => 'foobar.jpg'));
$filespec->clean_filename('unique_ext', self::PREFIX);
$name = $filespec->get('realname');
$this->assertEquals(strlen($name), 32 + strlen(self::PREFIX) + strlen('.jpg'));
$this->assertRegExp('#^[A-Za-z0-9]+\.jpg$#', substr($name, strlen(self::PREFIX)));
$this->assertFalse(isset($filenames[$name]));
$filenames[$name] = true;
}
}
public function data_clean_filename_avatar()
{
return array(
array(false, false, ''),
array('foobar.png', 'u5.png', 'avatar', 'u', 5),
array('foobar.png', 'g9.png', 'avatar', 'g', 9),
);
}
/**
* @dataProvider data_clean_filename_avatar
*/
public function test_clean_filename_avatar($filename, $expected, $mode, $prefix = '', $user_id = '')
{
$filespec = new \phpbb\files\filespec($this->filesystem, $this->language, new \bantu\IniGetWrapper\IniGetWrapper, new \FastImageSize\FastImageSize(), $this->phpbb_root_path, $this->mimetype_guesser);
if ($filename)
{
$upload_ary = array(
'name' => $filename,
'type' => '',
'size' => '',
'tmp_name' => '',
'error' => '',
);
$filespec->set_upload_ary($upload_ary);
}
$filespec->clean_filename($mode, $prefix, $user_id);
$this->assertSame($expected, $filespec->get('realname'));
}
public function get_extension_variables()
{
return array(
@@ -226,7 +304,7 @@ class phpbb_filespec_test extends phpbb_test_case
*/
public function test_get_extension($filename, $expected)
{
$this->assertEquals($expected, filespec::get_extension($filename));
$this->assertEquals($expected, \phpbb\files\filespec::get_extension($filename));
}
public function is_image_variables()
@@ -289,7 +367,7 @@ class phpbb_filespec_test extends phpbb_test_case
array('txt_copy', 'txt_as_img', 'image/jpg', 'txt', false, true),
array('txt_copy_2', 'txt_moved', 'text/plain', 'txt', false, true),
array('jpg_copy', 'jpg_moved', 'image/png', 'jpg', false, true),
array('png_copy', 'png_moved', 'image/png', 'jpg', 'IMAGE_FILETYPE_MISMATCH png jpg', true),
array('png_copy', 'png_moved', 'image/png', 'jpg', 'Image file type mismatch: expected extension png but extension jpg given.', true),
);
}
@@ -300,8 +378,7 @@ class phpbb_filespec_test extends phpbb_test_case
{
// Global $phpbb_root_path and $phpEx are required by phpbb_chmod
global $phpbb_root_path, $phpEx;
$phpbb_root_path = '';
$phpEx = 'php';
$this->phpbb_root_path = '';
$upload = new phpbb_mock_fileupload();
$upload->max_filesize = self::UPLOAD_MAX_FILESIZE;
@@ -311,18 +388,137 @@ class phpbb_filespec_test extends phpbb_test_case
'name' => $realname,
'type' => $mime_type,
));
$filespec->extension = $extension;
$filespec->upload = $upload;
$filespec->local = true;
$this->set_reflection_property($filespec, 'extension', $extension);
$filespec->set_upload_namespace($upload);
$this->set_reflection_property($filespec, 'local', true);
$this->assertEquals($expected, $filespec->move_file($this->path . 'copies'));
$this->assertEquals($filespec->file_moved, file_exists($this->path . 'copies/' . $realname));
$this->assertEquals($filespec->get('file_moved'), file_exists($this->path . 'copies/' . $realname));
if ($error)
{
$this->assertEquals($error, $filespec->error[0]);
}
$phpEx = '';
$this->phpbb_root_path = $phpbb_root_path;
}
public function test_move_file_error()
{
$filespec = $this->get_filespec();
$this->assertFalse($filespec->move_file('foobar'));
$filespec->error[] = 'foo';
$this->assertFalse($filespec->move_file('foo'));
}
public function data_move_file_copy()
{
return array(
array('gif_copy', true, false, array()),
array('gif_copy', true, true, array()),
array('foo_bar', false, false, array('GENERAL_UPLOAD_ERROR')),
array('foo_bar', false, true, array('GENERAL_UPLOAD_ERROR')),
);
}
/**
* @dataProvider data_move_file_copy
*/
public function test_move_file_copy($tmp_name, $move_success, $safe_mode_on, $expected_error)
{
// Initialise a blank filespec object for use with trivial methods
$upload_ary = array(
'name' => 'gif_moved',
'type' => 'image/gif',
'size' => '',
'tmp_name' => $this->path . 'copies/' . $tmp_name,
'error' => '',
);
$php_ini = $this->getMockBuilder('\bantu\IniGetWrapper\IniGetWrapper')
->getMock();
$php_ini->expects($this->any())
->method('getBool')
->with($this->anything())
->willReturn($safe_mode_on);
$upload = new phpbb_mock_fileupload();
$upload->max_filesize = self::UPLOAD_MAX_FILESIZE;
$filespec = new \phpbb\files\filespec($this->filesystem, $this->language, $php_ini, new \FastImageSize\FastImagesize, '', $this->mimetype_guesser);
$filespec->set_upload_ary($upload_ary);
$this->set_reflection_property($filespec, 'local', false);
$this->set_reflection_property($filespec, 'extension', 'gif');
$filespec->set_upload_namespace($upload);
$this->assertEquals($move_success, $filespec->move_file($this->path . 'copies'));
$this->assertEquals($filespec->get('file_moved'), file_exists($this->path . 'copies/gif_moved'));
$this->assertSame($expected_error, $filespec->error);
}
public function data_move_file_imagesize()
{
return array(
array(
array(
'width' => 2,
'height' => 2,
'type' => IMAGETYPE_GIF,
),
array()
),
array(
array(
'width' => 2,
'height' => 2,
'type' => -1,
),
array('Image file type -1 for mimetype image/gif not supported.')
),
array(
array(
'width' => 0,
'height' => 0,
'type' => IMAGETYPE_GIF,
),
array('The image file you tried to attach is invalid.')
),
array(
false,
array('It was not possible to determine the dimensions of the image. Please verify that the URL you entered is correct.')
)
);
}
/**
* @dataProvider data_move_file_imagesize
*/
public function test_move_file_imagesize($imagesize_return, $expected_error)
{
// Initialise a blank filespec object for use with trivial methods
$upload_ary = array(
'name' => 'gif_moved',
'type' => 'image/gif',
'size' => '',
'tmp_name' => $this->path . 'copies/gif_copy',
'error' => '',
);
$imagesize = $this->getMockBuilder('\FastImageSize\FastImageSize')
->getMock();
$imagesize->expects($this->any())
->method('getImageSize')
->with($this->anything())
->willReturn($imagesize_return);
$upload = new phpbb_mock_fileupload();
$upload->max_filesize = self::UPLOAD_MAX_FILESIZE;
$filespec = new \phpbb\files\filespec($this->filesystem, $this->language, new \bantu\IniGetWrapper\IniGetWrapper, $imagesize, '', $this->mimetype_guesser);
$filespec->set_upload_ary($upload_ary);
$this->set_reflection_property($filespec, 'local', false);
$this->set_reflection_property($filespec, 'extension', 'gif');
$filespec->set_upload_namespace($upload);
$this->assertEquals(true, $filespec->move_file($this->path . 'copies'));
$this->assertEquals($filespec->get('file_moved'), file_exists($this->path . 'copies/gif_moved'));
$this->assertSame($expected_error, $filespec->error);
}
/**
@@ -336,6 +532,29 @@ class phpbb_filespec_test extends phpbb_test_case
$type_cast_helper->set_var($upload_name, $filename, 'string', true, true);
$filespec = $this->get_filespec(array('name'=> $upload_name));
$this->assertSame(trim(utf8_basename(htmlspecialchars($filename))), $filespec->uploadname);
$this->assertSame(trim(utf8_basename(htmlspecialchars($filename))), $filespec->get('uploadname'));
}
public function test_is_uploaded()
{
$filespec = new \phpbb\files\filespec($this->filesystem, $this->language, new \bantu\IniGetWrapper\IniGetWrapper, new \FastImageSize\FastImageSize(), $this->phpbb_root_path, null);
$reflection_filespec = new ReflectionClass($filespec);
$plupload_property = $reflection_filespec->getProperty('plupload');
$plupload_property->setAccessible(true);
$plupload_mock = $this->getMockBuilder('\phpbb\plupload\plupload')
->disableOriginalConstructor()
->getMock();
$plupload_mock->expects($this->any())
->method('is_active')
->will($this->returnValue(true));
$plupload_property->setValue($filespec, $plupload_mock);
$is_uploaded = $reflection_filespec->getMethod('is_uploaded');
// Plupload is active and file does not exist
$this->assertFalse($is_uploaded->invoke($filespec));
// Plupload is not active and file was not uploaded
$plupload_property->setValue($filespec, null);
$this->assertFalse($is_uploaded->invoke($filespec));
}
}

View File

@@ -13,7 +13,6 @@
require_once __DIR__ . '/../../phpBB/includes/functions.php';
require_once __DIR__ . '/../../phpBB/includes/utf/utf_tools.php';
require_once __DIR__ . '/../../phpBB/includes/functions_upload.php';
require_once __DIR__ . '/../mock/filespec.php';
class phpbb_fileupload_test extends phpbb_test_case
@@ -22,29 +21,80 @@ class phpbb_fileupload_test extends phpbb_test_case
private $filesystem;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
protected $container;
/** @var \phpbb\files\factory */
protected $factory;
/** @var \bantu\IniGetWrapper\IniGetWrapper */
protected $php_ini;
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\request\request_interface */
protected $request;
/** @var string phpBB root path */
protected $phpbb_root_path;
protected function setUp()
{
// Global $config required by unique_id
// Global $user required by several functions dealing with translations
// Global $request required by form_upload, local_upload and is_valid
global $config, $user, $request, $phpbb_filesystem;
global $config, $phpbb_root_path, $phpEx;
if (!is_array($config))
{
$config = array();
$config = new \phpbb\config\config(array());
}
$config['rand_seed'] = '';
$config['rand_seed_last_update'] = time() + 600;
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->request = $this->getMock('\phpbb\request\request');
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
$request = new phpbb_mock_request();
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
$guessers = array(
new \Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser(),
new \Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser(),
new \phpbb\mimetype\content_guesser(),
new \phpbb\mimetype\extension_guesser(),
);
$guessers[2]->set_priority(-2);
$guessers[3]->set_priority(-2);
$this->mimetype_guesser = new \phpbb\mimetype\guesser($guessers);
$this->filesystem = $phpbb_filesystem = new \phpbb\filesystem\filesystem();
$this->container = new phpbb_mock_container_builder($phpbb_root_path, $phpEx);
$this->container->set('files.filespec', new \phpbb\files\filespec(
$this->filesystem,
$this->language,
$this->php_ini,
new \FastImageSize\FastImageSize(),
$phpbb_root_path,
new \phpbb\mimetype\guesser(array(
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
))));
$this->factory = new \phpbb\files\factory($this->container);
$plupload = new \phpbb\plupload\plupload($phpbb_root_path, $config, $this->request, new \phpbb\user($this->language, '\phpbb\datetime'), $this->php_ini, $this->mimetype_guesser);
$this->container->set('files.types.form', new \phpbb\files\types\form(
$this->factory,
$this->language,
$this->php_ini,
$plupload,
$this->request
), phpbb_mock_container_builder::SCOPE_PROTOTYPE);
$this->container->set('files.types.local', new \phpbb\files\types\local(
$this->factory,
$this->language,
$this->php_ini,
$this->request
), phpbb_mock_container_builder::SCOPE_PROTOTYPE);
$this->path = __DIR__ . '/fixture/';
$this->phpbb_root_path = $phpbb_root_path;
}
private function gen_valid_filespec()
@@ -69,15 +119,38 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_invalid_extension()
{
$upload = new fileupload($this->filesystem, '', array('png'), 100);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('png'))
->set_max_filesize(100);
$file = $this->gen_valid_filespec();
$upload->common_checks($file);
$this->assertEquals('DISALLOWED_EXTENSION', $file->error[0]);
}
public function test_common_checks_disallowed_content()
{
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(1000);
$file = new \phpbb\files\filespec($this->filesystem, $this->language, $this->php_ini, new \FastImageSize\FastImageSize(), $this->phpbb_root_path);
$file->set_upload_ary(array(
'size' => 50,
'tmp_name' => dirname(__FILE__) . '/fixture/disallowed',
'name' => 'disallowed.jpg',
'type' => 'image/jpg'
))
->set_upload_namespace($upload);
file_put_contents(dirname(__FILE__) . '/fixture/disallowed', '<body>' . file_get_contents(dirname(__FILE__) . '/fixture/jpg'));
$upload->common_checks($file);
$this->assertEquals('DISALLOWED_CONTENT', $file->error[0]);
unlink(dirname(__FILE__) . '/fixture/disallowed');
}
public function test_common_checks_invalid_filename()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(100);
$file = $this->gen_valid_filespec();
$file->realname = 'invalid?';
$upload->common_checks($file);
@@ -86,7 +159,9 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_too_large()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(100);
$file = $this->gen_valid_filespec();
$file->filesize = 1000;
$upload->common_checks($file);
@@ -95,7 +170,9 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_valid_file()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(1000);
$file = $this->gen_valid_filespec();
$upload->common_checks($file);
$this->assertEquals(0, sizeof($file->error));
@@ -103,33 +180,41 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_local_upload()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(1000);
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
$file = $upload->local_upload($this->path . 'jpg.jpg');
$file = $upload->handle_upload('files.types.local', $this->path . 'jpg.jpg');
$this->assertEquals(0, sizeof($file->error));
unlink($this->path . 'jpg.jpg');
$this->assertFalse($file->additional_checks());
$this->assertTrue($file->move_file('../tests/upload/fixture/copies', true));
$file->remove();
}
public function test_move_existent_file()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(1000);
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
$file = $upload->local_upload($this->path . 'jpg.jpg');
$file = $upload->handle_upload('files.types.local', $this->path . 'jpg.jpg');
$this->assertEquals(0, sizeof($file->error));
$this->assertFalse($file->move_file('../tests/upload/fixture'));
$this->assertFalse($file->file_moved);
$this->assertFalse($file->get('file_moved'));
$this->assertEquals(1, sizeof($file->error));
}
public function test_move_existent_file_overwrite()
{
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(array('jpg'))
->set_max_filesize(1000);
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
copy($this->path . 'jpg', $this->path . 'copies/jpg.jpg');
$file = $upload->local_upload($this->path . 'jpg.jpg');
$file = $upload->handle_upload('files.types.local', $this->path . 'jpg.jpg');
$this->assertEquals(0, sizeof($file->error));
$file->move_file('../tests/upload/fixture/copies', true);
$this->assertEquals(0, sizeof($file->error));
@@ -138,7 +223,10 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_valid_dimensions()
{
$upload = new fileupload($this->filesystem, '', false, false, 1, 1, 100, 100);
$upload = new \phpbb\files\upload($this->filesystem, $this->factory, $this->language, $this->php_ini, $this->request, $this->phpbb_root_path);
$upload->set_allowed_extensions(false)
->set_max_filesize(false)
->set_allowed_dimensions(1, 1, 100, 100);
$file1 = $this->gen_valid_filespec();
$file2 = $this->gen_valid_filespec();

View File

@@ -11,7 +11,7 @@
*
*/
class phpbb_php_ini_fake extends \phpbb\php\ini
class phpbb_php_ini_fake extends \bantu\IniGetWrapper\IniGetWrapper
{
function get($varname)
{

View File

@@ -16,6 +16,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case
{
/** @var \phpbb_php_ini_fake php_ini */
protected $php_ini;
public function setUp()
@@ -25,44 +26,44 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case
public function test_get_string()
{
$this->assertSame(false, $this->php_ini->get_string(false));
$this->assertSame('phpbb', $this->php_ini->get_string(' phpbb '));
$this->assertSame('', $this->php_ini->getString(false));
$this->assertSame('phpbb', $this->php_ini->getString(' phpbb '));
}
public function test_get_bool()
{
$this->assertSame(true, $this->php_ini->get_bool('ON'));
$this->assertSame(true, $this->php_ini->get_bool('on'));
$this->assertSame(true, $this->php_ini->get_bool('1'));
$this->assertSame(true, $this->php_ini->getBool('ON'));
$this->assertSame(true, $this->php_ini->getBool('on'));
$this->assertSame(true, $this->php_ini->getBool('1'));
$this->assertSame(false, $this->php_ini->get_bool('OFF'));
$this->assertSame(false, $this->php_ini->get_bool('off'));
$this->assertSame(false, $this->php_ini->get_bool('0'));
$this->assertSame(false, $this->php_ini->get_bool(''));
$this->assertSame(false, $this->php_ini->getBool('OFF'));
$this->assertSame(false, $this->php_ini->getBool('off'));
$this->assertSame(false, $this->php_ini->getBool('0'));
$this->assertSame(false, $this->php_ini->getBool(''));
}
public function test_get_int()
{
$this->assertSame(1234, $this->php_ini->get_int('1234'));
$this->assertSame(-12345, $this->php_ini->get_int('-12345'));
$this->assertSame(false, $this->php_ini->get_int('phpBB'));
$this->assertSame(1234, $this->php_ini->getNumeric('1234'));
$this->assertSame(-12345, $this->php_ini->getNumeric('-12345'));
$this->assertSame(null, $this->php_ini->getNumeric('phpBB'));
}
public function test_get_float()
{
$this->assertSame(1234.0, $this->php_ini->get_float('1234'));
$this->assertSame(-12345.0, $this->php_ini->get_float('-12345'));
$this->assertSame(false, $this->php_ini->get_float('phpBB'));
$this->assertSame(1234.0, $this->php_ini->getNumeric('1234.0'));
$this->assertSame(-12345.0, $this->php_ini->getNumeric('-12345.0'));
$this->assertSame(null, $this->php_ini->getNumeric('phpBB'));
}
public function test_get_bytes_invalid()
{
$this->assertSame(false, $this->php_ini->get_bytes(false));
$this->assertSame(false, $this->php_ini->get_bytes('phpBB'));
$this->assertSame(false, $this->php_ini->get_bytes('k'));
$this->assertSame(false, $this->php_ini->get_bytes('-k'));
$this->assertSame(false, $this->php_ini->get_bytes('M'));
$this->assertSame(false, $this->php_ini->get_bytes('-M'));
$this->assertSame(null, $this->php_ini->getBytes(false));
$this->assertSame(null, $this->php_ini->getBytes('phpBB'));
$this->assertSame(null, $this->php_ini->getBytes('k'));
$this->assertSame(null, $this->php_ini->getBytes('-k'));
$this->assertSame(null, $this->php_ini->getBytes('M'));
$this->assertSame(null, $this->php_ini->getBytes('-M'));
}
/**
@@ -70,7 +71,7 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case
*/
public function test_get_bytes($expected, $value)
{
$actual = $this->php_ini->get_bytes($value);
$actual = $this->php_ini->getBytes($value);
$this->assertTrue(is_float($actual) || is_int($actual));
$this->assertEquals($expected, $actual);