From 4b72a1f49843aa64cdf90301ae71035c3e6cf30a Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 31 Jul 2015 12:48:17 -0400
Subject: [PATCH] Fix error when using back button after sending an email (#1490009)

---
 CHANGELOG                               |    1 +
 index.php                               |    2 +-
 program/steps/utils/error.inc           |    9 +++++++++
 program/steps/mail/compose.inc          |    8 +++++---
 program/localization/en_US/messages.inc |    5 +++--
 program/steps/mail/func.inc             |   14 --------------
 program/steps/mail/sendmail.inc         |   16 ++++++++++++++++
 7 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index c458648..ebc7e85 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -33,6 +33,7 @@
 - Fix bug where new messages weren't added to the list in search mode
 - Fix wrong positioning of message list header on page scroll in Webkit browsers (#1490035)
 - Fix some javascript errors in rare situations (#1490441)
+- Fix error when using back button after sending an email (#1490009)
 
 RELEASE 1.1.2
 -------------
diff --git a/index.php b/index.php
index 5cfd8df..c029b5a 100644
--- a/index.php
+++ b/index.php
@@ -131,7 +131,7 @@
 
             // prevent redirect to compose with specified ID (#1488226)
             if ($query['_action'] == 'compose' && !empty($query['_id'])) {
-                $query = array();
+                $query = array('_action' => 'compose');
             }
         }
 
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index a23bfd6..621b7ea 100644
--- a/program/localization/en_US/messages.inc
+++ b/program/localization/en_US/messages.inc
@@ -189,5 +189,6 @@
 $messages['errcsrfprotectionexplain'] = "For your protection, access to this resource is secured against CSRF.\nIf you see this, you probably didn't log out before leaving the web application.\n\nHuman interaction is now required to continue.";
 $messages['errcontactserveradmin'] = 'Please contact your server-administrator.';
 $messages['clicktoresumesession'] = 'Click here to resume your previous session';
-
-?>
+$messages['errcomposesession'] = 'Compose session error';
+$messages['errcomposesessionexplain'] = 'Requested compose session not found.';
+$messages['clicktocompose'] = 'Click here to compose a new message';
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 8fffbd4..84ec3c3 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -47,9 +47,11 @@
 if (!is_array($COMPOSE)) {
     // Infinite redirect prevention in case of broken session (#1487028)
     if ($COMPOSE_ID) {
-        rcube::raise_error(array('code' => 500, 'type' => 'php',
-            'file' => __FILE__, 'line' => __LINE__,
-            'message' => "Invalid compose ID"), true, true);
+        // if we know the message with specified ID was already sent
+        // we can ignore the error and compose a new message (#1490009)
+        if ($COMPOSE_ID != $_SESSION['last_compose_session']) {
+            rcube::raise_error(array('code' => 450), false, true);
+        }
     }
 
     $COMPOSE_ID = uniqid(mt_rand());
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 9a73432..6e2f982 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1754,20 +1754,6 @@
 }
 
 /**
- * clear message composing settings
- */
-function rcmail_compose_cleanup($id)
-{
-    if (!isset($_SESSION['compose_data_'.$id])) {
-        return;
-    }
-
-    $rcmail = rcmail::get_instance();
-    $rcmail->plugins->exec_hook('attachments_cleanup', array('group' => $id));
-    $rcmail->session->remove('compose_data_'.$id);
-}
-
-/**
  * Send the MDN response
  *
  * @param mixed $message    Original message object (rcube_message) or UID
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index bb1b602..d83f26e 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -958,3 +958,19 @@
 
     return false;
 }
+
+/**
+ * clear message composing settings
+ */
+function rcmail_compose_cleanup($id)
+{
+    if (!isset($_SESSION['compose_data_'.$id])) {
+        return;
+    }
+
+    $rcmail = rcmail::get_instance();
+    $rcmail->plugins->exec_hook('attachments_cleanup', array('group' => $id));
+    $rcmail->session->remove('compose_data_'.$id);
+
+    $_SESSION['last_compose_session'] = $id;
+}
diff --git a/program/steps/utils/error.inc b/program/steps/utils/error.inc
index 3b1d926..7ca933e 100644
--- a/program/steps/utils/error.inc
+++ b/program/steps/utils/error.inc
@@ -72,6 +72,15 @@
     $__error_text .= '<p><i>' . $rcmail->gettext('errfailedrequest') . ":</i><br />\n<tt>//$request_url</tt></p>";
 }
 
+// invalid compose ID
+else if ($ERROR_CODE == 450 && $_SERVER['REQUEST_METHOD'] == 'GET' && $rcmail->action == 'compose') {
+    $url = $rcmail->url('compose');
+
+    $__error_title = strtoupper($rcmail->gettext('errcomposesession'));
+    $__error_text  = nl2br($rcmail->gettext('errcomposesessionexplain'))
+        . '<p>' . html::a($url, $rcmail->gettext('clicktocompose')) . '</p>';
+}
+
 // database connection error
 else if ($ERROR_CODE == 601) {
     $__error_title = "CONFIGURATION ERROR";

--
Gitblit v1.9.1