From 9ff17ae20effa5d54fd8481c19518123590e3bd0 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 27 Feb 2017 19:45:55 +0100 Subject: Add markdown_escape setting This setting allows to escape HTML in markdown rendering or not. The goal behind it is to avoid XSS issue in shared instances. More info: * the setting is set to true by default * it is set to false for anyone who already have the plugin enabled (avoid breaking existing entries) * improve the HTML sanitization when the setting is set to false - but don't consider it XSS proof * mention the setting in the plugin README --- tests/plugins/PluginMarkdownTest.php | 57 ++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 6 deletions(-) (limited to 'tests/plugins/PluginMarkdownTest.php') diff --git a/tests/plugins/PluginMarkdownTest.php b/tests/plugins/PluginMarkdownTest.php index 17ef2280..f1e1acf8 100644 --- a/tests/plugins/PluginMarkdownTest.php +++ b/tests/plugins/PluginMarkdownTest.php @@ -13,12 +13,18 @@ require_once 'plugins/markdown/markdown.php'; */ class PluginMarkdownTest extends PHPUnit_Framework_TestCase { + /** + * @var ConfigManager instance. + */ + protected $conf; + /** * Reset plugin path */ function setUp() { PluginManager::$PLUGINS_PATH = 'plugins'; + $this->conf = new ConfigManager('tests/utils/config/configJson'); } /** @@ -36,7 +42,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase ), ); - $data = hook_markdown_render_linklist($data); + $data = hook_markdown_render_linklist($data, $this->conf); $this->assertNotFalse(strpos($data['links'][0]['description'], '

')); $this->assertNotFalse(strpos($data['links'][0]['description'], '

')); } @@ -61,7 +67,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase ), ); - $data = hook_markdown_render_daily($data); + $data = hook_markdown_render_daily($data, $this->conf); $this->assertNotFalse(strpos($data['cols'][0][0]['formatedDescription'], '

')); $this->assertNotFalse(strpos($data['cols'][0][0]['formatedDescription'], '

')); } @@ -110,6 +116,8 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase $output = escape($input); $input .= 'link'; $output .= 'link'; + $input .= 'link'; + $output .= 'link'; $this->assertEquals($output, sanitize_html($input)); // Do not touch escaped HTML. $input = escape($input); @@ -130,10 +138,10 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase )) ); - $processed = hook_markdown_render_linklist($data); + $processed = hook_markdown_render_linklist($data, $this->conf); $this->assertEquals($str, $processed['links'][0]['description']); - $processed = hook_markdown_render_feed($data); + $processed = hook_markdown_render_feed($data, $this->conf); $this->assertEquals($str, $processed['links'][0]['description']); $data = array( @@ -151,7 +159,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase ), ); - $data = hook_markdown_render_daily($data); + $data = hook_markdown_render_daily($data, $this->conf); $this->assertEquals($str, $data['cols'][0][0]['formatedDescription']); } @@ -169,7 +177,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase )) ); - $data = hook_markdown_render_feed($data); + $data = hook_markdown_render_feed($data, $this->conf); $this->assertContains('', $data['links'][0]['description']); } @@ -185,4 +193,41 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase $data = process_markdown($md); $this->assertEquals($html, $data); } + + /** + * Make sure that the HTML tags are escaped. + */ + public function testMarkdownWithHtmlEscape() + { + $md = '**strong** strong'; + $html = '

strong <strong>strong</strong>

'; + $data = array( + 'links' => array( + 0 => array( + 'description' => $md, + ), + ), + ); + $data = hook_markdown_render_linklist($data, $this->conf); + $this->assertEquals($html, $data['links'][0]['description']); + } + + /** + * Make sure that the HTML tags aren't escaped with the setting set to false. + */ + public function testMarkdownWithHtmlNoEscape() + { + $this->conf->set('security.markdown_escape', false); + $md = '**strong** strong'; + $html = '

strong strong

'; + $data = array( + 'links' => array( + 0 => array( + 'description' => $md, + ), + ), + ); + $data = hook_markdown_render_linklist($data, $this->conf); + $this->assertEquals($html, $data['links'][0]['description']); + } } -- cgit v1.2.3