From dd0ae6297be8cd9bcf8d91dd8a3fab34048c3612 Mon Sep 17 00:00:00 2001 From: alecpl Date: Fri, 8 Apr 2011 07:08:30 +0000 Subject: [PATCH] - Improve space-stuffing handling in format=flowed messages (#1487861) --- CHANGELOG | 1 + program/include/rcube_message.php | 4 +- program/steps/mail/func.inc | 63 ++++++++++++++++--------------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a38bbd6f1..b47b1d4b2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Improve space-stuffing handling in format=flowed messages (#1487861) - Fixed bug where some dates would produce SQL error in MySQL (#1487856) - Added workaround for some IMAP server with broken STATUS response (#1487859) - Fix bug where default_charset was not used for text messages (#1487836) diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php index a8c51cc4e..4f9a2f230 100644 --- a/program/include/rcube_message.php +++ b/program/include/rcube_message.php @@ -726,7 +726,9 @@ class rcube_message $line = $prefix . rc_wordwrap($line, $length - $level - 2, " \r\n$prefix "); } else if ($line) { - $line = ' ' . rc_wordwrap(rtrim($line), $length - 2, " \r\n "); + $line = rc_wordwrap(rtrim($line), $length - 2, " \r\n"); + // space-stuffing + $line = preg_replace('/(^|\r\n)(From| |>)/', '\\1 \\2', $line); } $text[$idx] = $line; diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 18ef2de68..33e29a799 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -726,71 +726,74 @@ function rcmail_plain_body($body, $flowed=false) $body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body); // split body into single lines - $a_lines = preg_split('/\r?\n/', $body); + $body = preg_split('/\r?\n/', $body); $quote_level = 0; $last = -1; // find/mark quoted lines... - for ($n=0, $cnt=count($a_lines); $n < $cnt; $n++) { - if ($a_lines[$n][0] == '>' && preg_match('/^(>+\s*)+/', $a_lines[$n], $regs)) { + for ($n=0, $cnt=count($body); $n < $cnt; $n++) { + if ($body[$n][0] == '>' && preg_match('/^(>+\s*)+/', $body[$n], $regs)) { $q = strlen(preg_replace('/\s/', '', $regs[0])); - $a_lines[$n] = substr($a_lines[$n], strlen($regs[0])); - - if ($q > $quote_level) - $a_lines[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $q - $quote_level))) . $a_lines[$n]; - else if ($q < $quote_level) - $a_lines[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $quote_level - $q))) . $a_lines[$n]; + $body[$n] = substr($body[$n], strlen($regs[0])); + + if ($q > $quote_level) { + $body[$n] = $replacer->get_replacement($replacer->add( + str_repeat('
', $q - $quote_level))) . $body[$n]; + } + else if ($q < $quote_level) { + $body[$n] = $replacer->get_replacement($replacer->add( + str_repeat('
', $quote_level - $q))) . $body[$n]; + } else if ($flowed) { // previous line is flowed - if (isset($a_lines[$last]) && $a_lines[$n] - && $a_lines[$last][strlen($a_lines[$last])-1] == ' ') { + if (isset($body[$last]) && $body[$n] + && $body[$last][strlen($body[$last])-1] == ' ') { // merge lines - $a_lines[$last] .= $a_lines[$n]; - unset($a_lines[$n]); + $body[$last] .= $body[$n]; + unset($body[$n]); } - else + else { $last = $n; + } } } else { $q = 0; if ($flowed) { // sig separator - line is fixed - if ($a_lines[$n] == '-- ') { - $last = $n; + if ($body[$n] == '-- ') { + $last = $last_sig = $n; } else { // remove space-stuffing - if ($a_lines[$n][0] == ' ') - $a_lines[$n] = substr($a_lines[$n], 1); + if ($body[$n][0] == ' ') + $body[$n] = substr($body[$n], 1); // previous line is flowed? - if (isset($a_lines[$last]) && $a_lines[$n] - && $a_lines[$last] != '-- ' - && $a_lines[$last][strlen($a_lines[$last])-1] == ' ' + if (isset($body[$last]) && $body[$n] + && $last != $last_sig + && $body[$last][strlen($body[$last])-1] == ' ' ) { - $a_lines[$last] .= $a_lines[$n]; - unset($a_lines[$n]); + $body[$last] .= $body[$n]; + unset($body[$n]); } else { $last = $n; } } if ($quote_level > 0) - $a_lines[$last] = $replacer->get_replacement($replacer->add( - str_repeat('', $quote_level))) . $a_lines[$last]; + $body[$last] = $replacer->get_replacement($replacer->add( + str_repeat('', $quote_level))) . $body[$last]; } else if ($quote_level > 0) - $a_lines[$n] = $replacer->get_replacement($replacer->add( - str_repeat('', $quote_level))) . $a_lines[$n]; + $body[$n] = $replacer->get_replacement($replacer->add( + str_repeat('', $quote_level))) . $body[$n]; } $quote_level = $q; } - $body = join("\n", $a_lines); + $body = join("\n", $body); // quote plain text (don't use Q() here, to display entities "as is") $table = get_html_translation_table(HTML_SPECIALCHARS);