summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
Diffstat (limited to 'program')
-rw-r--r--program/include/rcube_message.php26
-rw-r--r--program/include/rcube_session.php14
-rw-r--r--program/js/app.js6
-rw-r--r--program/steps/mail/compose.inc3
4 files changed, 44 insertions, 5 deletions
diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php
index 8f1432fb8..745019e18 100644
--- a/program/include/rcube_message.php
+++ b/program/include/rcube_message.php
@@ -278,6 +278,32 @@ class rcube_message
/**
+ * Checks if part of the message is an attachment (or part of it)
+ *
+ * @param rcube_message_part $part Message part
+ *
+ * @return bool True if the part is an attachment part
+ */
+ public function is_attachment($part)
+ {
+ foreach ($this->attachments as $att_part) {
+ if ($att_part->mime_id == $part->mime_id) {
+ return true;
+ }
+
+ // check if the part is a subpart of another attachment part (message/rfc822)
+ if ($att_part->mimetype == 'message/rfc822') {
+ if (in_array($part, (array)$att_part->parts)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+
+ /**
* Read the message structure returend by the IMAP server
* and build flat lists of content parts and attachments
*
diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php
index 4ac395472..6916e2ba8 100644
--- a/program/include/rcube_session.php
+++ b/program/include/rcube_session.php
@@ -221,13 +221,14 @@ class rcube_session
* Handler for session_destroy()
*
* @param string Session ID
+ *
* @return boolean True on success
*/
public function db_destroy($key)
{
- $this->db->query(
- sprintf("DELETE FROM %s WHERE sess_id = ?", get_table_name('session')),
- $key);
+ if ($key) {
+ $this->db->query(sprintf("DELETE FROM %s WHERE sess_id = ?", get_table_name('session')), $key);
+ }
return true;
}
@@ -308,11 +309,16 @@ class rcube_session
* Handler for session_destroy() with memcache backend
*
* @param string Session ID
+ *
* @return boolean True on success
*/
public function mc_destroy($key)
{
- return $this->memcache->delete($key);
+ if ($key) {
+ $this->memcache->delete($key);
+ }
+
+ return true;
}
diff --git a/program/js/app.js b/program/js/app.js
index 8d02f6f39..ae9f4e972 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -60,6 +60,8 @@ function rcube_webmail()
beforeSend: function(xmlhttp){ xmlhttp.setRequestHeader('X-Roundcube-Request', ref.env.request_token); }
});
+ $(window).bind('beforeunload', function() { rcmail.unload = true; });
+
// set environment variable(s)
this.set_env = function(p, value)
{
@@ -6129,6 +6131,10 @@ function rcube_webmail()
this.set_busy(false, null, lock);
request.abort();
+ // don't display error message on page unload (#1488547)
+ if (this.unload)
+ return;
+
if (request.status && errmsg)
this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error');
else if (status == 'timeout')
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 8152f5dca..8a4715715 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -632,7 +632,8 @@ function rcmail_prepare_message_body()
if (!empty($MESSAGE->parts)) {
foreach ($MESSAGE->parts as $part) {
- if ($part->type != 'content' || !$part->size) {
+ // skip no-content and attachment parts (#1488557)
+ if ($part->type != 'content' || !$part->size || $MESSAGE->is_attachment($part)) {
continue;
}