*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Tests\HtmlSanitizer\Sanitizer;
use HtmlSanitizer\Extension\Image\Sanitizer\ImgSrcSanitizer;
use PHPUnit\Framework\TestCase;
class ImgSrcSanitizerTest extends TestCase
{
public function provideUrls()
{
// Simple cases
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'https://trusted.com/image.php',
'output' => 'https://trusted.com/image.php',
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => ['trusted.com'],
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'https://trusted.com/image.php',
'output' => 'https://trusted.com/image.php',
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => ['trusted.com'],
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'https://untrusted.com/image.php',
'output' => null,
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => '/image.php',
'output' => null,
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => true,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => '/image.php',
'output' => null,
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => false,
'allowRelativeLinks' => true,
'forceHttps' => false,
'input' => '/image.php',
'output' => '/image.php',
];
// Force HTTPS
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => ['trusted.com'],
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => true,
'input' => 'http://trusted.com/image.php',
'output' => 'https://trusted.com/image.php',
];
// Data-URI
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'output' => null,
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => true,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'output' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => ['trusted.com'],
'allowDataUri' => true,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'output' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => true,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'data://image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'output' => null,
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => true,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'data:',
'output' => null,
];
yield [
'allowedSchemes' => ['http', 'https'],
'allowedHosts' => null,
'allowDataUri' => true,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'data:text/plain;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'output' => null,
];
yield [
'allowedSchemes' => ['https'],
'allowedHosts' => null,
'allowDataUri' => false,
'allowRelativeLinks' => false,
'forceHttps' => false,
'input' => 'http://trusted.com/image.php',
'output' => null,
];
}
/**
* @dataProvider provideUrls
*/
public function testSanitize($allowedSchemes, $allowedHosts, $allowDataUri, $allowRelativeLinks, $forceHttps, $input, $expected)
{
$this->assertSame($expected, (new ImgSrcSanitizer($allowedSchemes, $allowedHosts, $allowDataUri, $allowRelativeLinks, $forceHttps))->sanitize($input));
}
}