From b0a8e3693090bd96fc31c4c5f42b77f8fddf9b90 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Wed, 24 Feb 2016 05:18:09 -0500
Subject: [PATCH] Fix handling of body parameter in mail compose request

---
 CHANGELOG                      |    1 +
 program/steps/mail/compose.inc |   12 ++++++++++--
 program/js/editor.js           |   16 +++++++++-------
 program/js/app.js              |    2 +-
 4 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 44ada7c..b221ce5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -24,6 +24,7 @@
 - Plugin API: Added addressbook_export hook
 - Fix additional_message_headers plugin compatibility with Mail_Mime >= 1.9 (#1490657)
 - Hide DSN option in Preferences when smtp_server is not used (#1490666)
+- Fix handling of body parameter in mail compose request
 
 RELEASE 1.2-beta
 ----------------
diff --git a/program/js/app.js b/program/js/app.js
index 3199ee4..36b6d1d 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3967,7 +3967,7 @@
     }
 
     if (!html_mode) {
-      pos = this.env.top_posting ? 0 : input_message.value.length;
+      pos = this.env.top_posting && this.env.compose_mode ? 0 : input_message.value.length;
 
       // add signature according to selected identity
       // if we have HTML editor, signature is added in a callback
diff --git a/program/js/editor.js b/program/js/editor.js
index 200d8c8..17eee6b 100644
--- a/program/js/editor.js
+++ b/program/js/editor.js
@@ -513,10 +513,10 @@
           message = message.substring(0, p) + sig + message.substring(p, message.length);
           cursor_pos = p - 1;
         }
-        // empty message
-        else if (!message) {
-          message = '\n\n' + sig;
-          cursor_pos = 0;
+        // empty message or new-message mode
+        else if (!message || !rcmail.env.compose_mode) {
+          cursor_pos = message.length;
+          message += '\n\n' + sig;
         }
         else if (rcmail.env.top_posting && !rcmail.env.sig_below) {
           // at cursor position
@@ -555,8 +555,10 @@
         sigElem = $('<div id="_rc_sig"></div>').get(0);
 
         // insert at start or at cursor position in top-posting mode
-        // (but not if the content is empty)
-        if (rcmail.env.top_posting && !rcmail.env.sig_below && (body.childNodes.length > 1 || $(body).text())) {
+        // (but not if the content is empty and not in new-message mode)
+        if (rcmail.env.top_posting && !rcmail.env.sig_below
+          && rcmail.env.compose_mode && (body.childNodes.length > 1 || $(body).text())
+        ) {
           this.editor.getWin().focus(); // correct focus in IE & Chrome
 
           var node = this.editor.selection.getNode();
@@ -566,7 +568,7 @@
         }
         else {
           body.appendChild(sigElem);
-          position_element = rcmail.env.top_posting ? body.firstChild : $(sigElem).prev();
+          position_element = rcmail.env.top_posting && rcmail.env.compose_mode ? body.firstChild : $(sigElem).prev();
         }
       }
 
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 48aef76..0fb6140 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -359,7 +359,12 @@
 
     // clean HTML message body which can be submitted by URL
     if (!empty($COMPOSE['param']['body'])) {
-        $COMPOSE['param']['body'] = rcmail_wash_html($COMPOSE['param']['body'], array('safe' => false, 'inline_html' => true), array());
+        if ($COMPOSE['param']['html'] = strpos($COMPOSE['param']['body'], '<') !== false) {
+            $wash_params = array('safe' => false, 'inline_html' => true);
+            $COMPOSE['param']['body'] = rcmail_wash_html($COMPOSE['param']['body'], $wash_params, array());
+            $COMPOSE['param']['body'] = preg_replace('/<!--[^>\n]+>/', '', $COMPOSE['param']['body']);
+            $COMPOSE['param']['body'] = preg_replace('/<\/?body>/', '', $COMPOSE['param']['body']);
+        }
     }
 
     $RCMAIL = rcmail::get_instance();
@@ -718,7 +723,10 @@
     $html_editor  = intval($RCMAIL->config->get('htmleditor'));
     $compose_mode = $COMPOSE['mode'];
 
-    if (isset($_POST['_is_html'])) {
+    if (is_bool($COMPOSE['param']['html'])) {
+        $useHtml = $COMPOSE['param']['html'];
+    }
+    else if (isset($_POST['_is_html'])) {
         $useHtml = !empty($_POST['_is_html']);
     }
     else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) {

--
Gitblit v1.9.1