X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/c429cf78187e80deb63982a282a1c6889f30291a..refs/pull/3032/head:/tests/Entity/PageContentTest.php
diff --git a/tests/Entity/PageContentTest.php b/tests/Entity/PageContentTest.php
index 602198725..049b47f0e 100644
--- a/tests/Entity/PageContentTest.php
+++ b/tests/Entity/PageContentTest.php
@@ -135,14 +135,26 @@ class PageContentTest extends TestCase
}
}
- public function test_iframe_js_and_base64_urls_are_removed()
+ public function test_js_and_base64_src_urls_are_removed()
{
$checks = [
'',
+ '',
+ '',
'',
'',
+ '',
'',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
'',
+ '',
+ '
',
];
$this->asEditor();
@@ -155,6 +167,7 @@ class PageContentTest extends TestCase
$pageView = $this->get($page->getUrl());
$pageView->assertStatus(200);
$pageView->assertElementNotContains('.page-content', '');
$pageView->assertElementNotContains('.page-content', 'src=');
$pageView->assertElementNotContains('.page-content', 'javascript:');
@@ -168,6 +181,8 @@ class PageContentTest extends TestCase
$checks = [
'');
+ $pageView->assertElementNotContains('.page-content', 'assertElementNotContains('.page-content', 'href=javascript:');
}
}
@@ -188,8 +203,10 @@ class PageContentTest extends TestCase
{
$checks = [
'',
+ '',
'',
'',
+ '',
];
$this->asEditor();
@@ -213,6 +230,8 @@ class PageContentTest extends TestCase
{
$checks = [
'',
+ '',
+ '',
];
$this->asEditor();
@@ -249,11 +268,13 @@ class PageContentTest extends TestCase
{
$checks = [
'Hello
',
+ 'Hello
',
'Lorem ipsum dolor sit amet.
Hello
',
'Lorem ipsum dolor sit amet.
Hello
',
'Lorem ipsum dolor sit amet.
Hello
',
'Lorem ipsum dolor sit amet.
Hello
',
'xss link\',
];
$this->asEditor();
@@ -284,6 +305,28 @@ class PageContentTest extends TestCase
$pageView->assertDontSee('abc123abc123');
}
+ public function test_svg_xlink_hrefs_are_removed()
+ {
+ $checks = [
+ '',
+ '',
+ ];
+
+ $this->asEditor();
+ $page = Page::query()->first();
+
+ foreach ($checks as $check) {
+ $page->html = $check;
+ $page->save();
+
+ $pageView = $this->get($page->getUrl());
+ $pageView->assertStatus(200);
+ $pageView->assertElementNotContains('.page-content', 'alert');
+ $pageView->assertElementNotContains('.page-content', 'xlink:href');
+ $pageView->assertElementNotContains('.page-content', 'application/xml');
+ }
+ }
+
public function test_page_inline_on_attributes_show_if_configured()
{
$this->asEditor();
@@ -464,7 +507,8 @@ class PageContentTest extends TestCase
$this->assertStringContainsString('type="checkbox"', $page->html);
$pageView = $this->get($page->getUrl());
- $pageView->assertElementExists('.page-content input[type=checkbox]');
+ $pageView->assertElementExists('.page-content li.task-list-item input[type=checkbox]');
+ $pageView->assertElementExists('.page-content li.task-list-item input[type=checkbox][checked=checked]');
}
public function test_page_markdown_strikethrough_rendering()
@@ -550,14 +594,59 @@ class PageContentTest extends TestCase
$this->deleteImage($imagePath);
}
- public function test_base64_images_blanked_if_not_supported_extension_for_extract()
+ public function test_base64_images_within_html_blanked_if_not_supported_extension_for_extract()
+ {
+ // Relevant to https://github.com/BookStackApp/BookStack/issues/3010 and other cases
+ $extensions = [
+ 'jiff', 'pngr', 'png ', ' png', '.png', 'png.', 'p.ng', ',png',
+ 'data:image/png', ',data:image/png',
+ ];
+
+ foreach ($extensions as $extension) {
+ $this->asEditor();
+ $page = Page::query()->first();
+
+ $this->put($page->getUrl(), [
+ 'name' => $page->name, 'summary' => '',
+ 'html' => '
test
',
+ ]);
+
+ $page->refresh();
+ $this->assertStringContainsString('
html);
+ }
+
+ }
+
+ public function test_base64_images_get_extracted_from_markdown_page_content()
{
$this->asEditor();
$page = Page::query()->first();
$this->put($page->getUrl(), [
- 'name' => $page->name, 'summary' => '',
- 'html' => 'test
',
+ 'name' => $page->name, 'summary' => '',
+ 'markdown' => 'test ',
+ ]);
+
+ $page->refresh();
+ $this->assertStringMatchesFormat('%Atest
%A
%A', $page->html);
+
+ $matches = [];
+ preg_match('/src="https:\/\/p.rizon.top:443\/http\/localhost(.*?)"/', $page->html, $matches);
+ $imagePath = $matches[1];
+ $imageFile = public_path($imagePath);
+ $this->assertEquals(base64_decode($this->base64Jpeg), file_get_contents($imageFile));
+
+ $this->deleteImage($imagePath);
+ }
+
+ public function test_base64_images_within_markdown_blanked_if_not_supported_extension_for_extract()
+ {
+ $this->asEditor();
+ $page = Page::query()->first();
+
+ $this->put($page->getUrl(), [
+ 'name' => $page->name, 'summary' => '',
+ 'markdown' => 'test ',
]);
$page->refresh();