From 7145e009e440ef4d6dcba2b4845656376c9d8ccd Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Mon, 30 Mar 2009 14:04:18 -0400
Subject: [PATCH] - Fix incorrect word wrapping in outgoing plaintext multibyte messages (#1485714) - Fix double footer in HTML message with embedded images

---
 CHANGELOG                        |    2 +
 program/include/rcube_shared.inc |   48 ++++++++++++++++++++++++
 program/steps/mail/compose.inc   |    2 
 program/steps/mail/func.inc      |    6 +-
 program/steps/mail/sendmail.inc  |   10 ++--
 5 files changed, 59 insertions(+), 9 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 0e9ccfd..efb8026 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Fix incorrect word wrapping in outgoing plaintext multibyte messages (#1485714)
+- Fix double footer in HTML message with embedded images
 - Fix TNEF implementation bug (#1485773)
 - Fix incorrect row id parsing for LDAP contacts list (#1485784) 
 - Fix 'mode' parameter in sqlite DSN (#1485772)
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index f1cbb19..a058158 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -405,6 +405,54 @@
     return strrpos($haystack, $needle, $offset);
 }
 
+/**
+ * Wrapper function for wordwrap
+ */
+function rc_wordwrap($string, $width=75, $break="\n", $cut=false)
+{
+  if (!function_exists('mb_substr') || !function_exists('mb_strlen'))
+    return wordwrap($string, $width, $break, $cut);
+    
+  $para = explode($break, $string);
+  $string = '';
+  while (count($para)) {
+    $list = explode(' ', array_shift($para));
+    $len = 0;
+    while (count($list)) {
+      $line = array_shift($list);
+      $l = mb_strlen($line);
+      $newlen = $len + $l + ($len ? 1 : 0);
+
+      if ($newlen <= $width) {
+        $string .= ($len ? ' ' : '').$line;
+        $len += ($len ? 1 : 0) + $l;
+      } else {
+	if ($l > $width) {
+	  if ($cut) {
+	    $start = 0;
+	    while ($l) {
+	      $str = mb_substr($line, $start, $width);
+	      $strlen = mb_strlen($str);
+	      $string .= ($len ? $break : '').$str;
+	      $start += $strlen;
+	      $l -= $strlen;
+	      $len = $strlen;
+	    }
+	  } else {
+            $string .= ($len ? $break : '').$line;
+	    if (count($list)) $string .= $break;
+	    $len = 0;
+	  }
+	} else {
+          $string .= $break.$line;
+	  $len = $l;
+        }
+      }
+    }
+    if (count($para)) $string .= $break;
+  }
+  return $string;
+}
 
 /**
  * Read a specific HTTP request header
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index ab25b1b..49c4c30 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -490,7 +490,7 @@
       }
 
     // add title line(s)
-    $prefix = wordwrap(sprintf("On %s, %s wrote:\n",
+    $prefix = rc_wordwrap(sprintf("On %s, %s wrote:\n",
       $MESSAGE->headers->date,
       $MESSAGE->get_header('from')), 76);
 
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 79e148d..a76532c 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1179,7 +1179,7 @@
         $prefix = substr($line, 0, $length);
 
         // Remove '> ' from the line, then wordwrap() the line
-        $line = wordwrap(substr($line, $length), $max - $length);
+        $line = rc_wordwrap(substr($line, $length), $max - $length);
 
         // Rebuild the line with '> ' at the beginning of each 'subline'
         $newline = '';
@@ -1191,7 +1191,7 @@
         $line = rtrim($newline);
       }
       else {
-        $line = wordwrap($line, $max);
+        $line = rc_wordwrap($line, $max);
       }
     }
 
@@ -1390,7 +1390,7 @@
                "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
     
     $compose->headers($headers);
-    $compose->setTXTBody(wordwrap($body, 75, "\r\n"));
+    $compose->setTXTBody(rc_wordwrap($body, 75, "\r\n"));
     $compose->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
 
     $sent = rcmail_deliver_message($compose, $identity['email'], $mailto);
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index eb81fc9..9607619 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -302,10 +302,10 @@
   $MAIL_MIME->setHTMLBody($message_body . ($footer ? "\r\n<pre>".$footer.'</pre>' : ''));
 
   // add a plain text version of the e-mail as an alternative part.
-  $h2t = new html2text($message_body);
-  $plainTextPart = $h2t->get_text() . ($footer ? "\r\n".$footer : '');
+  $h2t = new html2text($message_body, false, true, 0);
+  $plainTextPart = rc_wordwrap($h2t->get_text(), 75, "\r\n"). ($footer ? "\r\n".$footer : '');
   $plainTextPart = wordwrap($plainTextPart, 998, "\r\n", true);
-  if (!strlen($plainTextPart)) 
+  if (!strlen($plainTextPart))
     { 
     // empty message body breaks attachment handling in drafts 
     $plainTextPart = "\r\n"; 
@@ -317,7 +317,7 @@
   }
 else
   {
-  $message_body = wordwrap($message_body, 75, "\r\n");
+  $message_body = rc_wordwrap($message_body, 75, "\r\n");
   if ($footer)
     $message_body .= "\r\n" . $footer;
   $message_body = wordwrap($message_body, 998, "\r\n", true);
@@ -342,7 +342,7 @@
     if ($isHtml && ($match > 0))
     {
       $message_body = preg_replace($dispurl, ' src="'.$attachment['name'].'" ', $message_body);
-      $MAIL_MIME->setHTMLBody($message_body. ($footer ? "\r\n<pre>".$footer.'</pre>' : ''));
+      $MAIL_MIME->setHTMLBody($message_body);
       $MAIL_MIME->addHTMLImage($attachment['path'], $attachment['mimetype'], $attachment['name']);
     }
     else

--
Gitblit v1.9.1