'', '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[] = [" 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 text to html conversion * * @dataProvider data_text2html */ function test_text2html($input, $output, $options) { $t2h = new rcube_text2html($input, false, $options); $html = $t2h->get_html(); $this->assertEquals($output, $html); } /** * Test XSS issue */ 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->assertEquals($expected, $html); } /** * Test XSS issue */ 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->assertEquals($expected, $html); } /** * Test bug #8021 */ 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->assertEquals($expected, $html); } }