summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2010-06-08 12:46:05 +0000
committeralecpl <alec@alec.pl>2010-06-08 12:46:05 +0000
commit64e3e80743415e5fb121eb5c66416593c38ef288 (patch)
treefdf160e8eb9580deab6c4fc2cbdb3ceb63d3c76f
parentb93d00026aefbdccfabd6253f9cb184956617084 (diff)
- Fix some IMAP errors handling when opening the message (#1485443)
-rw-r--r--CHANGELOG1
-rw-r--r--program/include/rcube_imap.php4
-rw-r--r--program/include/rcube_imap_generic.php12
-rw-r--r--program/include/rcube_message.php9
-rw-r--r--program/js/app.js4
-rw-r--r--program/steps/mail/func.inc20
-rw-r--r--program/steps/mail/headers.inc43
-rw-r--r--program/steps/mail/show.inc20
-rw-r--r--skins/default/templates/messageerror.html52
9 files changed, 116 insertions, 49 deletions
diff --git a/CHANGELOG b/CHANGELOG
index bbeb6d9db..f01e08986 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG RoundCube Webmail
===========================
+- Fix some IMAP errors handling when opening the message (#1485443)
- Fix related parts aren't displayed when got mimetype other than image/* (#1486432)
- Multiple identity and database support for squirrelmail_usercopy plugin (#1486517)
- Support dynamic hostname (%d/%n) variables in configuration options (#1485438)
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index f48372ac7..6f3b40206 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2061,7 +2061,7 @@ class rcube_imap
return true;
// convert charset (if text or message part)
- if ($o_part->ctype_primary == 'text' || $o_part->ctype_primary == 'message') {
+ if ($body && ($o_part->ctype_primary == 'text' || $o_part->ctype_primary == 'message')) {
// assume default if no charset specified
if (empty($o_part->charset) || strtolower($o_part->charset) == 'us-ascii')
$o_part->charset = $this->default_charset;
@@ -2628,7 +2628,7 @@ class rcube_imap
// retrieve list of folders from IMAP server
$a_mboxes = $this->conn->listMailboxes($this->mod_mailbox($root), $filter);
}
-
+
$a_folders = array();
if (!is_array($a_mboxes))
$a_mboxes = array();
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index d5a5e3d4b..7669ceb32 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -1777,12 +1777,11 @@ class rcube_imap_generic
$mode = 0;
}
+ // format request
$reply_key = '* ' . $id;
- $result = false;
+ $key = 'ftch0';
+ $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])";
- // format request
- $key = 'ftch0';
- $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])";
// send request
if (!$this->putLine($request)) {
return false;
@@ -1794,7 +1793,8 @@ class rcube_imap_generic
$a = explode(' ', $line);
} while (!($end = $this->startsWith($line, $key, true)) && $a[2] != 'FETCH');
- $len = strlen($line);
+ $len = strlen($line);
+ $result = false;
// handle empty "* X FETCH ()" response
if ($line[$len-1] == ')' && $line[$len-2] != '(') {
@@ -1890,7 +1890,7 @@ class rcube_imap_generic
$line = $this->readLine(1024);
} while (!$this->startsWith($line, $key, true));
- if ($result) {
+ if ($result !== false) {
if ($file) {
fwrite($file, $result);
} else if ($print) {
diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php
index 35a8f4a88..e51ab26e0 100644
--- a/program/include/rcube_message.php
+++ b/program/include/rcube_message.php
@@ -5,7 +5,7 @@
| program/include/rcube_message.php |
| |
| This file is part of the RoundCube Webmail client |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland |
+ | Copyright (C) 2008-2010, RoundCube Dev. - Switzerland |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
@@ -63,14 +63,17 @@ class rcube_message
{
$this->app = rcmail::get_instance();
$this->imap = $this->app->imap;
-
+
$this->uid = $uid;
$this->headers = $this->imap->get_headers($uid, NULL, true, true);
+ if (!$this->headers)
+ return;
+
$this->subject = rcube_imap::decode_mime_string(
$this->headers->subject, $this->headers->charset);
list(, $this->sender) = each($this->imap->decode_address_list($this->headers->from));
-
+
$this->set_safe((intval($_GET['_safe']) || $_SESSION['safe_messages'][$uid]));
$this->opt = array(
'safe' => $this->is_safe,
diff --git a/program/js/app.js b/program/js/app.js
index 370bdd4c3..df512d06d 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -203,7 +203,7 @@ function rcube_webmail()
'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers'];
if (this.env.action=='show' || this.env.action=='preview') {
- this.enable_command(this.env.message_commands, true);
+ this.enable_command(this.env.message_commands, this.env.uid);
if (this.env.next_uid) {
this.enable_command('nextmessage', 'lastmessage', true);
@@ -243,7 +243,7 @@ function rcube_webmail()
this.init_messageform();
}
// show printing dialog
- else if (this.env.action == 'print')
+ else if (this.env.action == 'print' && this.env.uid)
window.print();
// get unread count for each mailbox
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index d1850d6cf..defb6f9cc 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -964,6 +964,11 @@ function rcmail_message_body($attrib)
if (!isset($part->body))
$part->body = $MESSAGE->get_part_content($part->mime_id);
+ // message is cached but not exists (#1485443), or other error
+ if ($part->body === false) {
+ rcmail_message_error($MESSAGE->uid);
+ }
+
// re-format format=flowed content
if ($part->ctype_secondary == "plain" && $part->ctype_parameters['format'] == "flowed")
$part->body = rcube_message::unfold_flowed($part->body);
@@ -1550,6 +1555,21 @@ function rcmail_search_filter($attrib)
return $out;
}
+function rcmail_message_error($uid=null)
+{
+ global $RCMAIL;
+
+ // Set env variables for messageerror.html template
+ if ($RCMAIL->action == 'show') {
+ $mbox_name = $RCMAIL->imap->get_mailbox_name();
+ $RCMAIL->output->set_env('mailbox', $mbox_name);
+ $RCMAIL->output->set_env('uid', null);
+ }
+ // display error message
+ $RCMAIL->output->show_message('messageopenerror', 'error');
+ // ... display message error page
+ $RCMAIL->output->send('messageerror');
+}
// register UI objects
$OUTPUT->add_handlers(array(
diff --git a/program/steps/mail/headers.inc b/program/steps/mail/headers.inc
index 946a688e9..aa1065531 100644
--- a/program/steps/mail/headers.inc
+++ b/program/steps/mail/headers.inc
@@ -20,28 +20,31 @@
if ($uid = get_input_value('_uid', RCUBE_INPUT_POST))
{
- $source = $IMAP->get_raw_headers($uid);
-
- if ($source)
- {
- $source = htmlspecialchars(trim($source));
- $source = preg_replace(
- array(
- '/\n[\t\s]+/',
- '/^([a-z0-9_:-]+)/im',
- '/\r?\n/'
- ),
- array(
- "\n&nbsp;&nbsp;&nbsp;&nbsp;",
- '<font class="bold">\1</font>',
- '<br />'
- ), $source);
-
- $OUTPUT->command('set_headers', $source);
- $OUTPUT->send();
+ $source = $IMAP->get_raw_headers($uid);
+
+ if ($source !== false) {
+ $source = htmlspecialchars(trim($source));
+ $source = preg_replace(
+ array(
+ '/\n[\t\s]+/',
+ '/^([a-z0-9_:-]+)/im',
+ '/\r?\n/'
+ ),
+ array(
+ "\n&nbsp;&nbsp;&nbsp;&nbsp;",
+ '<font class="bold">\1</font>',
+ '<br />'
+ ), $source);
+
+ $OUTPUT->command('set_headers', $source);
+ }
+ else {
+ $RCMAIL->output->show_message('messageopenerror', 'error');
}
+
+ $OUTPUT->send();
}
-
+
exit;
?>
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 82af4780f..e130ecb76 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -22,28 +22,18 @@
$PRINT_MODE = $RCMAIL->action=='print' ? TRUE : FALSE;
// similar code as in program/steps/mail/get.inc
-if ($_GET['_uid']) {
- $MESSAGE = new rcube_message(get_input_value('_uid', RCUBE_INPUT_GET));
+if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) {
+ $MESSAGE = new rcube_message($uid);
// if message not found (wrong UID)...
if (empty($MESSAGE->headers)) {
- $OUTPUT->show_message('messageopenerror', 'error');
- // ... display error or preview page
- if ($RCMAIL->action=='preview' && $OUTPUT->template_exists('messageerror'))
- $OUTPUT->send('messageerror');
- else if ($RCMAIL->action=='preview' && $OUTPUT->template_exists('messagepreview'))
- $OUTPUT->send('messagepreview');
- // ... go back to the list
- else {
- rcmail_overwrite_action('');
- return;
- }
+ rcmail_message_error($uid);
}
send_nocacheing_headers();
$mbox_name = $IMAP->get_mailbox_name();
-
+
// show images?
rcmail_check_safe($MESSAGE);
@@ -52,7 +42,7 @@ if ($_GET['_uid']) {
$IMAP->set_charset($MESSAGE->headers->charset);
$OUTPUT->set_pagetitle($MESSAGE->subject);
-
+
// give message uid to the client
$OUTPUT->set_env('uid', $MESSAGE->uid);
// set environement
diff --git a/skins/default/templates/messageerror.html b/skins/default/templates/messageerror.html
index d180e7435..0bd591a2a 100644
--- a/skins/default/templates/messageerror.html
+++ b/skins/default/templates/messageerror.html
@@ -1,8 +1,11 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title><roundcube:object name='productname' /> :: <roundcube:label name='servererror' /></title>
<roundcube:include file="/includes/links.html" />
+
+<roundcube:if condition="env:action!='show'" />
+
</head>
<body class="iframe" style="background-color:#F2F2F2;">
@@ -11,4 +14,51 @@
</div>
</body>
+
+<roundcube:else />
+
+<script type="text/javascript" src="/splitter.js"></script>
+<script type="text/javascript" src="/functions.js"></script>
+<style type="text/css">
+#mailboxlist-container { width: <roundcube:exp expression="!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv-5 : 170" />px; }
+#messageframe { left: <roundcube:exp expression="!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv+5 : 180" />px;
+<roundcube:exp expression="browser:ie ? ('width: expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv+5 : 180).')+\\'px\\');') : ''" />
+}
+</style>
+</head>
+
+<body onload="rcube_init_mail_ui()">
+
+<roundcube:include file="/includes/taskbar.html" />
+<roundcube:include file="/includes/header.html" />
+
+<div id="messagetoolbar">
+<roundcube:button command="list" type="link" class="button back" classAct="button back" classSel="button backSel" title="backtolist" content=" " />
+<roundcube:button command="compose" type="link" class="button compose" classAct="button compose" classSel="button composeSel" title="writenewmessage" content=" " />
+</div>
+
+<div id="mainscreen">
+<div id="mailleftcontainer">
+<div id="mailboxlist-container">
+<div class="boxtitle"><roundcube:label name="mailboxlist" /></div>
+<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="25" />
+</div>
+</div>
+
+<div id="messageframe" style="background-color:#F2F2F2;">
+<div style="margin:20px auto; text-align:center">
+<img src="/images/watermark.gif" width="260" height="228" alt="" />
+</div>
+</div>
+
+</div>
+
+<script type="text/javascript">
+ var mailviewsplitv = new rcube_splitter({id:'mailviewsplitterv', p1: 'mailboxlist-container', p2: 'messageframe', orientation: 'v', relative: true, start: 165});
+ rcmail.add_onload('mailviewsplitv.init()');
+</script>
+
+</body>
+<roundcube:endif />
+
</html>