mirror of
https://github.com/phpbb/phpbb.git
synced 2025-07-31 22:10:45 +02:00
Merge pull request #1813 from marc1706/ticket/11912
[ticket/11912] Add mimetype guesser for proper mimetype guessing
This commit is contained in:
BIN
tests/mimetype/fixtures/jpg
Normal file
BIN
tests/mimetype/fixtures/jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 519 B |
166
tests/mimetype/guesser_test.php
Normal file
166
tests/mimetype/guesser_test.php
Normal file
@@ -0,0 +1,166 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2013 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\mimetype;
|
||||
|
||||
require_once dirname(__FILE__) . '/null_guesser.php';
|
||||
require_once dirname(__FILE__) . '/incorrect_guesser.php';
|
||||
|
||||
function function_exists($name)
|
||||
{
|
||||
return guesser_test::$function_exists;
|
||||
}
|
||||
|
||||
class guesser_test extends \phpbb_test_case
|
||||
{
|
||||
public static $function_exists = true;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
global $phpbb_root_path;
|
||||
|
||||
$guessers = array(
|
||||
new \Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser(),
|
||||
new \Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser(),
|
||||
);
|
||||
$this->guesser = new \phpbb\mimetype\guesser($guessers);
|
||||
$this->path = dirname(__FILE__);
|
||||
$this->jpg_file = $this->path . '/fixtures/jpg';
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
}
|
||||
|
||||
public function data_guess_files()
|
||||
{
|
||||
return array(
|
||||
array('image/gif', 'gif'),
|
||||
array('image/png', 'png'),
|
||||
array('image/jpeg', 'jpg'),
|
||||
array('image/tiff', 'tif'),
|
||||
array('text/html', 'txt'),
|
||||
array(false, 'foobar'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider data_guess_files
|
||||
*/
|
||||
public function test_guess_files($expected, $file)
|
||||
{
|
||||
$this->assertEquals($expected, $this->guesser->guess($this->path . '/../upload/fixture/' . $file));
|
||||
}
|
||||
|
||||
public function test_file_not_readable()
|
||||
{
|
||||
@chmod($this->jpg_file, 0000);
|
||||
if (is_readable($this->jpg_file))
|
||||
{
|
||||
@chmod($this->jpg_file, 0644);
|
||||
$this->markTestSkipped('is_readable always returns true if user is superuser or chmod does not work');
|
||||
}
|
||||
$this->assertEquals(false, $this->guesser->guess($this->jpg_file));
|
||||
@chmod($this->jpg_file, 0644);
|
||||
$this->assertEquals('image/jpeg', $this->guesser->guess($this->jpg_file));
|
||||
}
|
||||
|
||||
public function test_null_guess()
|
||||
{
|
||||
$guesser = new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\null_guesser));
|
||||
$this->assertEquals('application/octet-stream', $guesser->guess($this->jpg_file));
|
||||
}
|
||||
|
||||
public function data_incorrect_guessers()
|
||||
{
|
||||
return array(
|
||||
array(array(new \phpbb\mimetype\incorrect_guesser)),
|
||||
array(array(new \phpbb\mimetype\null_guesser(false))),
|
||||
array(array()),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider data_incorrect_guessers
|
||||
*
|
||||
* @expectedException \LogicException
|
||||
*/
|
||||
public function test_incorrect_guesser($guessers)
|
||||
{
|
||||
$guesser = new \phpbb\mimetype\guesser($guessers);
|
||||
}
|
||||
|
||||
public function data_content_guesser()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
array(
|
||||
'image/jpeg',
|
||||
'image/jpeg',
|
||||
),
|
||||
array(new \phpbb\mimetype\content_guesser),
|
||||
false,
|
||||
),
|
||||
array(
|
||||
array(
|
||||
'application/octet-stream',
|
||||
'application/octet-stream',
|
||||
),
|
||||
array(new \phpbb\mimetype\content_guesser),
|
||||
true,
|
||||
),
|
||||
array(
|
||||
array(
|
||||
'application/octet-stream',
|
||||
'image/jpeg',
|
||||
),
|
||||
array(new \phpbb\mimetype\extension_guesser),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider data_content_guesser
|
||||
*/
|
||||
public function test_content_guesser($expected, $guessers, $overload = false)
|
||||
{
|
||||
$supported = false;
|
||||
self::$function_exists = !$overload;
|
||||
|
||||
// Cover possible LogicExceptions
|
||||
foreach ($guessers as $cur_guesser)
|
||||
{
|
||||
$supported += $cur_guesser->is_supported();
|
||||
}
|
||||
|
||||
if (!$supported)
|
||||
{
|
||||
$this->setExpectedException('\LogicException');
|
||||
}
|
||||
|
||||
$guesser = new \phpbb\mimetype\guesser($guessers);
|
||||
$this->assertEquals($expected[0], $guesser->guess($this->jpg_file));
|
||||
$this->assertEquals($expected[1], $guesser->guess($this->jpg_file, $this->jpg_file . '.jpg'));
|
||||
@copy($this->jpg_file, $this->jpg_file . '.jpg');
|
||||
$this->assertEquals($expected[1], $guesser->guess($this->jpg_file . '.jpg'));
|
||||
@unlink($this->jpg_file . '.jpg');
|
||||
}
|
||||
|
||||
public function test_sort_priority()
|
||||
{
|
||||
$guessers = array(
|
||||
'FileinfoMimeTypeGuesser' => new \Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser,
|
||||
'extension_guesser' => new \phpbb\mimetype\extension_guesser,
|
||||
'FileBinaryMimeTypeGuesser' => new \Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser,
|
||||
'content_guesser' => new \phpbb\mimetype\content_guesser,
|
||||
);
|
||||
$guessers['content_guesser']->set_priority(5);
|
||||
$guessers['extension_guesser']->set_priority(-5);
|
||||
usort($guessers, array($this->guesser, 'sort_priority'));
|
||||
$this->assertInstanceOf('\phpbb\mimetype\content_guesser', $guessers[0]);
|
||||
$this->assertInstanceOf('\phpbb\mimetype\extension_guesser', $guessers[3]);
|
||||
}
|
||||
}
|
18
tests/mimetype/incorrect_guesser.php
Normal file
18
tests/mimetype/incorrect_guesser.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2013 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\mimetype;
|
||||
|
||||
class incorrect_guesser
|
||||
{
|
||||
public function guess($file)
|
||||
{
|
||||
return 'image/jpeg';
|
||||
}
|
||||
}
|
30
tests/mimetype/null_guesser.php
Normal file
30
tests/mimetype/null_guesser.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2013 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\mimetype;
|
||||
|
||||
class null_guesser
|
||||
{
|
||||
protected $is_supported;
|
||||
|
||||
public function __construct($is_supported = true)
|
||||
{
|
||||
$this->is_supported = $is_supported;
|
||||
}
|
||||
|
||||
public function is_supported()
|
||||
{
|
||||
return $this->is_supported;
|
||||
}
|
||||
|
||||
public function guess($file)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user