From ac8edbed3542fb62cf23b49a0dfd6f4692898be5 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 29 May 2010 13:01:15 -0400
Subject: [PATCH] - Fix use RFC-compliant line-delimiter when saving messages on IMAP (#1486712)

---
 CHANGELOG                       |    1 +
 program/steps/mail/func.inc     |   25 +++++++++++++++++++------
 config/main.inc.php.dist        |    4 ++--
 program/steps/mail/sendmail.inc |   24 ++++++++++++++++++------
 4 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 73e7483..00fb61a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Fix use RFC-compliant line-delimiter when saving messages on IMAP (#1486712)
 - Add 'imap_timeout' option (#1486760)
 - Fix forwarding of messages with winmail attachments
 - Fix handling of uuencoded attachments in message body (#1485839)
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index b1da159..0b39d76 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -216,8 +216,8 @@
 // when tracking down issues.
 $rcmail_config['http_received_header_encrypt'] = false;
 
-// this string is used as a delimiter for message headers when sending
-// leave empty for auto-detection
+// This string is used as a delimiter for message headers when sending
+// a message via mail() function. Leave empty for auto-detection
 $rcmail_config['mail_header_delimiter'] = NULL;
 
 // number of chars allowed for line when wrapping text.
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 93eb97f..b07e3a6 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1366,8 +1366,8 @@
     if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
       if (preg_match_all('/<([^@]+@[^>]+)>/', $headers_enc['To'], $m)) {
         $headers_enc['To'] = implode(', ', $m[1]);
-        }
       }
+    }
 
     $msg_body = $message->get();
 
@@ -1376,10 +1376,23 @@
             'file' => __FILE__, 'line' => __LINE__,
             'message' => "Could not create message: ".$msg_body->getMessage()),
             TRUE, FALSE);
-    else if (ini_get('safe_mode'))
-      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str);
-    else
-      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str, "-f$from");
+    else {
+      $delim   = $RCMAIL->config->header_delimiter();
+      $to      = $headers_enc['To'];
+      $subject = $headers_enc['Subject'];
+
+      if ($delim != "\r\n") {
+        $header_str = str_replace("\r\n", $delim, $header_str);
+        $msg_body   = str_replace("\r\n", $delim, $msg_body);
+        $to         = str_replace("\r\n", $delim, $to);
+        $subject    = str_replace("\r\n", $delim, $subject);
+      }
+
+      if (ini_get('safe_mode'))
+        $sent = mail($to, $subject, $msg_body, $header_str);
+      else
+        $sent = mail($to, $subject, $msg_body, $header_str, "-f$from");
+    }
   }
 
   if ($sent) {
@@ -1418,7 +1431,7 @@
     $recipient = array_shift($IMAP->decode_address_list($message->headers->mdn_to));
     $mailto = $recipient['mailto'];
 
-    $compose = new Mail_mime($RCMAIL->config->header_delimiter());
+    $compose = new Mail_mime("\r\n");
 
     $compose->setParam('text_encoding', 'quoted-printable');
     $compose->setParam('html_encoding', 'quoted-printable');
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index 4229e7d..3c32530 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -249,7 +249,7 @@
 // if configured, the Received headers goes to top, for good measure
 if ($CONFIG['http_received_header'])
 {
-  $nldlm = $RCMAIL->config->header_delimiter() . "\t";
+  $nldlm = "\r\n\t";
   // FROM/VIA
   $http_header = 'from ';
   if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
@@ -398,7 +398,7 @@
 @set_time_limit(0);
 
 // create PEAR::Mail_mime instance
-$MAIL_MIME = new Mail_mime($RCMAIL->config->header_delimiter());
+$MAIL_MIME = new Mail_mime("\r\n");
 
 // Check if we have enough memory to handle the message in it
 // It's faster than using files, so we'll do this if we only can
@@ -419,7 +419,9 @@
 // the HTML part and the plain-text part
 
 if ($isHtml) {
-  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $message_body, 'type' => 'html', 'message' => $MAIL_MIME));
+  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body',
+    array('body' => $message_body, 'type' => 'html', 'message' => $MAIL_MIME));
+
   $MAIL_MIME->setHTMLBody($plugin['body'] . ($footer ? "\r\n<pre>".$footer.'</pre>' : ''));
 
   // add a plain text version of the e-mail as an alternative part.
@@ -430,7 +432,14 @@
     // empty message body breaks attachment handling in drafts 
     $plainTextPart = "\r\n"; 
   }
-  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $plainTextPart, 'type' => 'alternative', 'message' => $MAIL_MIME));
+  else {
+    // make sure all line endings are CRLF (#1486712)
+    $plainTextPart = preg_replace('/\r?\n/', "\r\n", $plainTextPart);
+  }
+
+  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body',
+    array('body' => $plainTextPart, 'type' => 'alternative', 'message' => $MAIL_MIME));
+
   $MAIL_MIME->setTXTBody($plugin['body']);
 
   // look for "emoticon" images from TinyMCE and change their src paths to
@@ -452,7 +461,10 @@
     // empty message body breaks attachment handling in drafts 
     $message_body = "\r\n"; 
   }
-  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $message_body, 'type' => 'plain', 'message' => $MAIL_MIME));
+
+  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body',
+    array('body' => $message_body, 'type' => 'plain', 'message' => $MAIL_MIME));
+
   $MAIL_MIME->setTXTBody($plugin['body'], false, true);
 }
 
@@ -512,7 +524,7 @@
 {
   mb_internal_encoding($message_charset);
   $headers['Subject'] = mb_encode_mimeheader($headers['Subject'],
-    $message_charset, 'Q', $RCMAIL->config->header_delimiter(), 8);
+    $message_charset, 'Q', "\r\n", 8);
   mb_internal_encoding(RCMAIL_CHARSET);
 }
 

--
Gitblit v1.9.1