get_html(); $this->assertSame($output, $html); } /** * Data for test_text2html() */ public static function provide_text2html_cases(): iterable { $options = [ 'begin' => '', 'end' => '', 'break' => '
', 'links' => false, 'flowed' => false, 'delsp' => false, 'wrap' => false, 'space' => '_', // replace UTF-8 non-breaking space for simpler testing 'nobr_start' => '>', 'nobr_end' => '<', ]; $data = []; $data[] = [' aaaa', '>_aaaa<', $options]; $data[] = ['aa>aa', '>aa>aa<', $options]; $data[] = ['aaaa aaaa', '>aaaa_aaaa<', $options]; $data[] = ['aaaa aaaa', '>aaaa__aaaa<', $options]; $data[] = ['aaaa aaaa', '>aaaa___aaaa<', $options]; $data[] = ["aaaa\taaaa", '>aaaa____aaaa<', $options]; $data[] = ["aaaa\naaaa", 'aaaa
aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
>_aaaa<', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
>__aaaa<', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
>___aaaa<', $options]; $data[] = ["\n", '
', $options]; $data[] = ["\taaaa", '>____aaaa<', $options]; $data[] = ["\naaaa", '
aaaa', $options]; $data[] = ["\n aaaa", '
>_aaaa<', $options]; $data[] = ["\n aaaa", '
>__aaaa<', $options]; $data[] = ["\n aaaa", '
>___aaaa<', $options]; $data[] = ["aaaa\n\nbbbb", 'aaaa

bbbb', $options]; $data[] = [">aaaa \n>aaaa", '
>aaaa_<
aaaa
', $options]; $data[] = [">aaaa\n>aaaa", '
aaaa
aaaa
', $options]; $data[] = [">aaaa \n>bbbb\ncccc dddd", '
>aaaa_<
bbbb
>cccc_dddd<', $options]; $data[] = ['aaaa-bbbb/cccc', '>aaaa-bbbb/cccc<', $options]; $data[] = ["aaaa-bbbb\r\tcccc", '>aaaa-bbbb____cccc<', $options]; $options['flowed'] = true; $data[] = [' aaaa', 'aaaa', $options]; $data[] = ['aaaa aaaa', 'aaaa aaaa', $options]; $data[] = ['aaaa aaaa', 'aaaa _aaaa', $options]; $data[] = ['aaaa aaaa', 'aaaa _ aaaa', $options]; $data[] = ["aaaa\taaaa", 'aaaa _ _aaaa', $options]; $data[] = ["aaaa\naaaa", 'aaaa
aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
_aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
_ aaaa', $options]; $data[] = ["\taaaa", '_ _ aaaa', $options]; $data[] = ["\naaaa", '
aaaa', $options]; $data[] = ["\n aaaa", '
aaaa', $options]; $data[] = ["\n aaaa", '
_aaaa', $options]; $data[] = ["\n aaaa", '
_ aaaa', $options]; $data[] = ["aaaa\n\nbbbb", 'aaaa

bbbb', $options]; $data[] = [">aaaa \n>aaaa", '
aaaa aaaa
', $options]; $data[] = [">aaaa\n>aaaa", '
aaaa
aaaa
', $options]; $data[] = [">aaaa \n>bbbb\ncccc dddd", '
aaaa bbbb
cccc dddd', $options]; $data[] = ["\x02\x03", "\x02\x03", $options]; $options['flowed'] = true; $options['delsp'] = true; $data[] = [' aaaa', 'aaaa', $options]; $data[] = ['aaaa aaaa', 'aaaa aaaa', $options]; $data[] = ['aaaa aaaa', 'aaaa _aaaa', $options]; $data[] = ['aaaa aaaa', 'aaaa _ aaaa', $options]; $data[] = ["aaaa\taaaa", 'aaaa _ _aaaa', $options]; $data[] = ["aaaa\naaaa", 'aaaa
aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
_aaaa', $options]; $data[] = ["aaaa\n aaaa", 'aaaa
_ aaaa', $options]; $data[] = ["\taaaa", '_ _ aaaa', $options]; $data[] = ["\naaaa", '
aaaa', $options]; $data[] = ["\n aaaa", '
aaaa', $options]; $data[] = ["\n aaaa", '
_aaaa', $options]; $data[] = ["\n aaaa", '
_ aaaa', $options]; $data[] = ["aaaa\n\nbbbb", 'aaaa

bbbb', $options]; $data[] = [">aaaa \n>aaaa", '
aaaaaaaa
', $options]; $data[] = [">aaaa\n>aaaa", '
aaaa
aaaa
', $options]; $data[] = [">aaaa \n>bbbb\ncccc dddd", '
aaaabbbb
cccc dddd', $options]; $options['flowed'] = false; $options['delsp'] = false; $options['wrap'] = true; $data[] = [">>aaaa bbbb\n>>\n>>>\n>cccc\n\ndddd eeee", '
aaaa bbbb


cccc

dddd eeee', $options]; $data[] = ["\n>>aaaa\n\ndddd", '
aaaa

dddd', $options]; $data[] = ["aaaa\n>bbbb\n>cccc\n\ndddd\n>>test", 'aaaa
bbbb
cccc

dddd
test
', $options]; return $data; } /** * Test XSS issue */ public function test_text2html_xss() { $input = "\n[]:##str_replacement_0##\n"; $t2h = new \rcube_text2html($input); $html = $t2h->get_html(); $expected = "

\n" . "[<script>evil</script>]:##str_replacement_0##
\n" . '
'; $this->assertSame($expected, $html); } /** * Test XSS issue */ public function test_text2html_xss2() { $input = "\n[] https://google.com\n"; $t2h = new \rcube_text2html($input); $html = $t2h->get_html(); $expected = "

\n[<script>evil</script>] " . "https://google.com
\n" . '
'; $this->assertSame($expected, $html); } /** * Test bug #8021 */ public function test_text2html_8021() { $input = "Test1 [1]\n\n[1] http://d1.tld\n\nyou wrote:\n> Test2 [1]\n>\n> [1] http://d2.tld"; $expected = '
Test1 [1]' . "
\n
\n" . '[1] http://d1.tld' . "
\n
\n" . 'you wrote:
Test2 [1]' . "
\n
\n" . '[1] http://d2.tld
'; $t2h = new \rcube_text2html($input); $html = $t2h->get_html(); $html = preg_replace('/ (rel|target)="(noreferrer|_blank)"/', '', $html); $this->assertSame($expected, $html); } /** * Test patches/diffs handling */ public function test_text2html_patches_handling() { $input = "Start\n" . "diff --git a/test.txt b/test.txt\n" . "index 7642f44b9..6ce0170aa 100644\n" . "--- a/test.txt\n" . "+++ b/test.txt\n" . "@@ -1982,7 +1982,7 @@ class test\n" . " test1\n" . " test2\n" . " test3\n" . "-test4\n" . "+test5\n" . " \n" . 'End'; $expected = "
Start
\n" . "diff --git a/test.txt b/test.txt
\n" . "index 7642f44b9..6ce0170aa 100644
\n" . "---_a/test.txt
\n" . "+++_b/test.txt
\n" . "@@_-1982,7_+1982,7_@@_class_test
\n" . "_test1
\n" . "_test2
\n" . "_test3
\n" . "-test4
\n" . "+test5
\n" . "_
\n" . 'End
'; $t2h = new \rcube_text2html($input, false, ['space' => '_']); $html = $t2h->get_html(); $this->assertSame($expected, $html); } }