From 17b5fb797f4bc142fee8cd72ade3890b4dfdbd82 Mon Sep 17 00:00:00 2001 From: thomascube Date: Fri, 21 Mar 2008 11:45:46 +0000 Subject: [PATCH] Add configurable default charset for message decoding --- CHANGELOG | 5 +++++ config/main.inc.php.dist | 3 +++ program/include/main.inc | 3 +++ program/include/rcube_imap.inc | 27 +++++++++++++++++++++------ program/steps/mail/compose.inc | 6 +++++- program/steps/mail/show.inc | 4 ++++ program/steps/mail/viewsource.inc | 26 ++++++++++++++------------ 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1a0f68729..6b620061d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,11 @@ CHANGELOG RoundCube Webmail --------------------------- +2008/03/21 (thomasb) +---------- +- Add configurable default charset for message decoding + + 2008/02/28 (thomasb) ---------- - Fix folder adding/renaming inspired by #1484800 diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 8475c816d..ab98da884 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -180,6 +180,9 @@ $rcmail_config['flag_for_deletion'] = TRUE; // 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask) $rcmail_config['mdn_requests'] = 0; +// Use this as charset as fallback for message decoding +$rcmail_config['default_charset'] = 'ISO-8859-1'; + // Make use of the built-in spell checker. It is based on GoogieSpell. // Since Google only accepts connections over https your PHP installatation // requires to be compiled with Open SSL support diff --git a/program/include/main.inc b/program/include/main.inc index 247cdf1a9..e2005e7f9 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -290,6 +290,9 @@ function rcmail_imap_init($connect=FALSE) function rcmail_set_imap_prop() { global $CONFIG, $IMAP; + + if (!empty($CONFIG['default_charset'])) + $IMAP->set_charset($CONFIG['default_charset']); // set root dir from config if (!empty($CONFIG['imap_root'])) diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc index dce778968..bec429ff5 100644 --- a/program/include/rcube_imap.inc +++ b/program/include/rcube_imap.inc @@ -51,6 +51,7 @@ class rcube_imap var $sort_order = 'DESC'; var $delimiter = NULL; var $caching_enabled = FALSE; + var $default_charset = 'ISO-8859-1'; var $default_folders = array('INBOX'); var $default_folders_lc = array('inbox'); var $cache = array(); @@ -203,6 +204,20 @@ class rcube_imap } + /** + * Set default message charset + * + * This will be used for message decoding if a charset specification is not available + * + * @param string Charset string + * @access public + */ + function set_charset($cs) + { + $this->default_charset = $ch; + } + + /** * This list of folders will be listed above all other folders * @@ -1146,7 +1161,7 @@ class rcube_imap // normalize filename property if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name']) - $struct->filename = $this->decode_mime_string($filename_mime); + $struct->filename = rcube_imap::decode_mime_string($filename_mime, $this->default_charset); else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*']) { // decode filename according to RFC 2231, Section 4 @@ -1154,7 +1169,7 @@ class rcube_imap $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset); } else if (!empty($struct->headers['content-description'])) - $struct->filename = $this->decode_mime_string($struct->headers['content-description']); + $struct->filename = rcube_imap::decode_mime_string($struct->headers['content-description'], $this->default_charset); return $struct; } @@ -1241,9 +1256,9 @@ class rcube_imap // convert charset (if text or message part) if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') { - // assume ISO-8859-1 if no charset specified + // assume default if no charset specified if (empty($o_part->charset)) - $o_part->charset = 'ISO-8859-1'; + $o_part->charset = $this->default_charset; $body = rcube_charset_convert($body, $o_part->charset); } @@ -2297,7 +2312,7 @@ class rcube_imap */ function decode_header($input, $remove_quotes=FALSE) { - $str = $this->decode_mime_string((string)$input); + $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset); if ($str{0}=='"' && $remove_quotes) $str = str_replace('"', '', $str); @@ -2414,7 +2429,7 @@ class rcube_imap return rcube_charset_convert($body, $ctype_param['charset']); // defaults to what is specified in the class header - return rcube_charset_convert($body, 'ISO-8859-1'); + return rcube_charset_convert($body, $this->default_charset); } diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 71d2197d8..6b08d85e4 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -90,7 +90,11 @@ if (!empty($msg_uid)) // similar as in program/steps/mail/show.inc $MESSAGE = array('UID' => $msg_uid); $MESSAGE['headers'] = &$IMAP->get_headers($msg_uid); - $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid); + $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid); + + if (!empty($MESSAGE['headers']->charset)) + $IMAP->set_charset($MESSAGE['headers']->charset); + $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject); $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']); diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index 5cd5e8360..27d26603f 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -30,6 +30,10 @@ if ($_GET['_uid']) $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET)); $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']); + // set message charset as default + if (!empty($MESSAGE['headers']->charset)) + $IMAP->set_charset($MESSAGE['headers']->charset); + // go back to list if message not found (wrong UID) if (!$MESSAGE['headers']) { diff --git a/program/steps/mail/viewsource.inc b/program/steps/mail/viewsource.inc index c88b165b6..7c32b89ca 100644 --- a/program/steps/mail/viewsource.inc +++ b/program/steps/mail/viewsource.inc @@ -5,7 +5,7 @@ | program/steps/mail/viewsource.inc | | | | This file is part of the RoundCube Webmail client | - | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland | + | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland | | Licensed under the GNU GPL | | | | PURPOSE: | @@ -22,19 +22,21 @@ // similar code as in program/steps/mail/get.inc if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) - { - header('Content-Type: text/plain'); - //@ob_end_clean(); +{ + $headers = $IMAP->get_headers($uid); + $charset = $headers->charset ? $headers->charset : $IMAP->default_charset; + header("Content-Type: text/plain; charset={$charset}"); $IMAP->print_raw_body($uid); - } +} else - { - raise_error(array('code' => 500, - 'type' => 'php', - 'message' => 'Message UID '.$uid.' not found'), - TRUE, - TRUE); - } +{ + raise_error(array( + 'code' => 500, + 'type' => 'php', + 'message' => 'Message UID '.$uid.' not found'), + true, + true); +} exit; ?>