From f88d417c96119b8e50297b930b14fe6ff9a1c5ed Mon Sep 17 00:00:00 2001 From: thomascube Date: Sun, 19 Feb 2006 18:34:34 +0000 Subject: Applied several patches --- CHANGELOG | 35 ++++++++++++++++---- SQL/postgres.initial.sql | 2 +- config/main.inc.php.dist | 5 +++ index.php | 21 ++++++++++-- program/include/main.inc | 71 +++++++++++++++++++++++++++++++++++----- program/include/rcube_imap.inc | 23 ++++++++----- program/include/rcube_shared.inc | 10 +++++- program/lib/imap.inc | 14 ++++---- program/steps/mail/compose.inc | 3 ++ program/steps/mail/sendmail.inc | 15 +++++++-- 10 files changed, 161 insertions(+), 38 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c3ba47b1f..10ca155d7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,16 +1,32 @@ CHANGELOG RoundCube Webmail --------------------------- -2006/02/04 +2006/02/19 +---------- +- Updated localizations +- Applied patch of Anders Karlsson +- Applied patch of Jacob Brunson +- Applied patch for virtuser_query by Robin Elfrink +- Added support for References header (patch by Auke) +- Added support for mbstring module by Tadashi Jokagi +- Added function for automatic remove of slashes on GET and POST vars + if magic_quotes is enabled + + + +2006/02/05 ---------- - Added Slovak, Hungarian, Bosnian and Croation translation - Fixed bug when inserting signatures with !?& -- Chopping message headers before inserting into the message cache table (to avoid bugs in Postgres) +- Chopping message headers before inserting into the message cache table + (to avoid bugs in Postgres) - Allow one-char domains in e-mail addresses - Make product name in page title configurable - Make username available as skin object -- Added session_write_close() in rcube_db class destructor to avoid problems in PHP 5.0.5 -- Use move_uploaded_file() instead of copy() for a more secure handling of uploaded attachments +- Added session_write_close() in rcube_db class destructor to avoid problems + in PHP 5.0.5 +- Use move_uploaded_file() instead of copy() for a more secure handling of + uploaded attachments - Additional config parameter to show/hide deleted messages - Added periodic request for checking new mails (Request #1307821) - Added EXPUNGE command @@ -23,18 +39,22 @@ CHANGELOG RoundCube Webmail - Skip sender-address as recipient when Reply-to-all - Fixes in utf8-class - Added patch for Quota display by Aury Fink Filho +- Added garbage collector for message cache +- Added patches for BCC headers 2005/12/16 ---------- - Added Turkish and Simplified Chinese translation - Use virtusertable to resolve e-mail addresses at login -- Configurable mail_domain used to compose correct e-mail addresses on first login +- Configurable mail_domain used to compose correct e-mail addresses + on first login 2005/12/03 ---------- -- Added Finnish, Romanian, Polish, Czech, British, Norwegian, Greek, Russian, Estonian and Chinese translation +- Added Finnish, Romanian, Polish, Czech, British, Norwegian, Greek, Russian, + Estonian and Chinese translation - Get IMAP server capabilities in array - Check for NAMESPACE capability before sending command - Set default user language from config 'locale_string' @@ -68,7 +88,8 @@ CHANGELOG RoundCube Webmail ---------- - Write list header to client even if list is empty - Add functions "select all", "select none" to message list -- Improved filter for HTML messages to remove potentially malicious tags (script, iframe, object) and event handlers. +- Improved filter for HTML messages to remove potentially malicious tags + (script, iframe, object) and event handlers. - Buttons for next/previous message in view mode - Add new created contact to list and show confirmation status - Added folder management (subscribe/create/delete) diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql index 771df74bc..55e139603 100755 --- a/SQL/postgres.initial.sql +++ b/SQL/postgres.initial.sql @@ -124,7 +124,7 @@ CREATE SEQUENCE cache_ids CREATE TABLE "cache" ( cache_id integer DEFAULT nextval('cache_ids'::text) PRIMARY KEY, user_id integer NOT NULL REFERENCES users (user_id), - session_id character varying(40) REFERENCES "session" (session_id), + session_id character varying(40) REFERENCES "session" (sess_id), cache_key character varying(128) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now() NOT NULL, data text NOT NULL diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 3b6e4435e..28abcb652 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -47,6 +47,11 @@ $rcmail_config['mail_domain'] = 'roundcube.net'; // Path to a virtuser table file to resolve user names and e-mail addresses $rcmail_config['virtuser_file'] = ''; +// Query to resolve user names and e-mail addresses from the database +// %u will be replaced with the current username for login. +// The query should select the user's e-mail address as first col +$rcmail_config['virtuser_query'] = ''; + // use this host for sending mails. // to use SSL connection, set ssl://smtp.host.com // if left blank, the PHP mail() function is used diff --git a/index.php b/index.php index fd356c8ba..b3c372ebd 100644 --- a/index.php +++ b/index.php @@ -2,7 +2,7 @@ /* +-----------------------------------------------------------------------+ | RoundCube Webmail IMAP Client | - | Version 0.1-20060104 | + | Version 0.1b-20060219 | | | | Copyright (C) 2005, RoundCube Dev. - Switzerland | | Licensed under the GNU GPL | @@ -40,7 +40,7 @@ */ -define('RCMAIL_VERSION', '0.1-20060104'); +define('RCMAIL_VERSION', '0.1b-20060219'); // define global vars @@ -83,6 +83,23 @@ require_once('PEAR.php'); // PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_NOTICE); +// strip magic quotes from Superglobals... +if ((bool)get_magic_quotes_gpc()) // by "php Pest" + { + // Really EGPCSR - Environment $_ENV, GET $_GET , POST $_POST, Cookie $_COOKIE, Server $_SERVER + // and their HTTP_*_VARS cousins (separate arrays, not references) and $_REQUEST + $fnStripMagicQuotes = create_function( + '&$mData, $fnSelf', + 'if (is_array($mData)) { foreach ($mData as $mKey=>$mValue) $fnSelf($mData[$mKey], $fnSelf); return; } '. + '$mData = stripslashes($mData);' + ); + + // do each set of EGPCSR as you find necessary + $fnStripMagicQuotes($_POST, $fnStripMagicQuotes); + $fnStripMagicQuotes($_GET, $fnStripMagicQuotes); + } + + // catch some url/post parameters $_auth = !empty($_POST['_auth']) ? $_POST['_auth'] : $_GET['_auth']; $_task = !empty($_POST['_task']) ? $_POST['_task'] : (!empty($_GET['_task']) ? $_GET['_task'] : 'mail'); diff --git a/program/include/main.inc b/program/include/main.inc index aa6a60790..06d4d7b80 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -79,6 +79,7 @@ function rcmail_startup($task='mail') session_start(); $sess_id = session_id(); + $_SESSION['user_lang'] = rcube_language_prop($CONFIG['locale_string']); // create session and set session vars if (!$_SESSION['client_id']) { @@ -265,7 +266,7 @@ function rcube_language_prop($lang, $prop='lang') $lang = $rcube_language_aliases[$lang]; // try the first two chars - if (!isset($rcube_languages[$lang]) && strlen($lang>2)) + if (!isset($rcube_languages[$lang]) && strlen($lang)>2) { $lang = substr($lang, 0, 2); $lang = rcube_language_prop($lang); @@ -280,6 +281,7 @@ function rcube_language_prop($lang, $prop='lang') else $charset = 'UTF-8'; + if ($prop=='charset') return $charset; else @@ -320,7 +322,39 @@ function load_gui() // set localization charset based on the given language function rcmail_set_locale($lang) { - global $OUTPUT; + global $OUTPUT, $MBSTRING, $MBSTRING_ENCODING; + static $s_mbstring_loaded = NULL; + + // settings for mbstring module (by Tadashi Jokagi) + if ($s_mbstring_loaded===NULL) + { + if ($s_mbstring_loaded = extension_loaded("mbstring")) + { + $MBSTRING = TRUE; + if (function_exists("mb_mbstring_encodings")) + $MBSTRING_ENCODING = mb_mbstring_encodings(); + else + $MBSTRING_ENCODING = array("ISO-8859-1", "UTF-7", "UTF7-IMAP", "UTF-8", + "ISO-2022-JP", "EUC-JP", "EUCJP-WIN", + "SJIS", "SJIS-WIN"); + + $MBSTRING_ENCODING = array_map("strtoupper", $MBSTRING_ENCODING); + if (in_array("SJIS", $MBSTRING_ENCODING)) + $MBSTRING_ENCODING[] = "SHIFT_JIS"; + } + else + { + $MBSTRING = FALSE; + $MBSTRING_ENCODING = array(); + } + } + + if ($MBSTRING && function_exists("mb_language")) + { + if (!mb_language(strtok($lang, "_"))) + $MBSTRING = FALSE; // unsupport language + } + $OUTPUT->set_charset(rcube_language_prop($lang, 'charset')); } @@ -448,13 +482,22 @@ function rcmail_create_user($user, $host) $user_name = $user!=$user_email ? $user : ''; - // also create a new identity record + // try to resolve the e-mail address from the virtuser table + if (!empty($CONFIG['virtuser_query'])) + { + $sql_result = $DB->query(preg_replace('/%u/', $user, $CONFIG['virtuser_query'])); + if ($sql_arr = $DB->fetch_array($sql_result)) + $user_email = $sql_arr[0]; + } + + // also create new identity records $DB->query("INSERT INTO ".get_table_name('identities')." (user_id, del, standard, name, email) VALUES (?, 0, 1, ?, ?)", $user_id, $user_name, $user_email); + // get existing mailboxes $a_mailboxes = $IMAP->list_mailboxes(); @@ -662,7 +705,6 @@ function rcube_list_languages() closedir($dh); } } - return $sa_languages; } @@ -718,16 +760,27 @@ function rcmail_message_cache_gc() // this function is not complete and not tested well function rcube_charset_convert($str, $from, $to=NULL) { + global $MBSTRING, $MBSTRING_ENCODING; + $from = strtoupper($from); $to = $to==NULL ? strtoupper($GLOBALS['CHARSET']) : strtoupper($to); - + if ($from==$to) return $str; + // convert charset using mbstring module + if ($MBSTRING) + { + $to = $to=="UTF-7" ? "UTF7-IMAP" : $to; + $from = $from=="UTF-7" ? "UTF7-IMAP": $from; + + if (in_array($to, $MBSTRING_ENCODING) && in_array($from, $MBSTRING_ENCODING)) + return mb_convert_encoding($str, $to, $from); + } + // convert charset using iconv module - if (function_exists('iconv') && $from!='UTF-7' && $to!='UTF-7') { + if (function_exists('iconv') && $from!='UTF-7' && $to!='UTF-7') return iconv($from, $to, $str); - } $conv = new utf8(); @@ -1488,7 +1541,6 @@ EOF; } - function rcmail_charset_selector($attrib) { // pass the following attributes to the form class @@ -1499,10 +1551,11 @@ function rcmail_charset_selector($attrib) $charsets = array( 'US-ASCII' => 'ASCII (English)', - 'X-EUC-JP' => 'EUC-JP (Japanese)', + 'EUC-JP' => 'EUC-JP (Japanese)', 'EUC-KR' => 'EUC-KR (Korean)', 'BIG5' => 'BIG5 (Chinese)', 'GB2312' => 'GB2312 (Chinese)', + 'ISO-2022-JP' => 'ISO-2022-JP (Japanese)', 'ISO-8859-1' => 'ISO-8859-1 (Latin-1)', 'ISO-8859-2' => 'ISO-8895-2 (Central European)', 'ISO-8859-7' => 'ISO-8859-7 (Greek)', diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc index 400d0c0d7..50264acf0 100644 --- a/program/include/rcube_imap.inc +++ b/program/include/rcube_imap.inc @@ -865,7 +865,7 @@ class rcube_imap { $mailbox = $this->_mod_mailbox($mbox); - // make shure mailbox exists + // make sure mailbox exists if (in_array($mailbox, $this->_list_mailboxes())) $saved = iil_C_Append($this->conn, $mailbox, $message); @@ -885,10 +885,15 @@ class rcube_imap $to_mbox = $this->_mod_mailbox($to_mbox); $from_mbox = $from_mbox ? $this->_mod_mailbox($from_mbox) : $this->mailbox; - // make shure mailbox exists + // make sure mailbox exists if (!in_array($to_mbox, $this->_list_mailboxes())) - return FALSE; - + { + if (in_array(strtolower($to_mbox), $this->default_folders)) + $this->create_mailbox($to_mbox, TRUE); + else + return FALSE; + } + // convert the list of uids to array $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL); @@ -1473,10 +1478,10 @@ class rcube_imap $key, $index, $headers->uid, - substr($this->decode_header((string)$headers->subject, TRUE), 0, 128), - substr($this->decode_header((string)$headers->from, TRUE), 0, 128), - substr($this->decode_header((string)$headers->to, TRUE), 0, 128), - substr($this->decode_header((string)$headers->cc, TRUE), 0, 128), + substr((string)$this->decode_header($headers->subject, TRUE), 0, 128), + substr((string)$this->decode_header($headers->from, TRUE), 0, 128), + substr((string)$this->decode_header($headers->to, TRUE), 0, 128), + substr((string)$this->decode_header($headers->cc, TRUE), 0, 128), (int)$headers->size, serialize($headers)); } @@ -1931,4 +1936,4 @@ function quoted_printable_encode($input="", $line_max=76, $space_conv=false) return trim($output); } -?> +?> \ No newline at end of file diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index fb200de57..79428fa16 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -85,7 +85,15 @@ class rcube_html_page function set_charset($charset) { + global $MBSTRING; $this->charset = $charset; + if ($MBSTRING&&function_exists( "mb_internal_encoding")) + { + if(!@mb_internal_encoding( $charset)) + { + $MBSTRING = FALSE; + } + } } function get_charset() @@ -1386,4 +1394,4 @@ function get_offset_time($offset_str, $factor=1) } -?> \ No newline at end of file +?> diff --git a/program/lib/imap.inc b/program/lib/imap.inc index 48b2cd181..285022247 100644 --- a/program/lib/imap.inc +++ b/program/lib/imap.inc @@ -36,7 +36,9 @@ - Parse charset from content-type in iil_C_FetchHeaders() - Enhanced heaer sorting - Pass message as reference in iil_C_Append (to save memory) - - Added BCC to the list of headers to fetch in iil_C_FetchHeaders() + - Added BCC and REFERENCE to the list of headers to fetch in iil_C_FetchHeaders() + - Leave messageID unchanged in iil_C_FetchHeaders() + - Avoid stripslahes in iil_Connect() - Removed some debuggers (echo ...) ********************************************************/ @@ -303,8 +305,8 @@ function iil_Connect($host, $user, $password){ $iil_errornum = 0; //strip slashes - $user = stripslashes($user); - $password = stripslashes($password); + // $user = stripslashes($user); + // $password = stripslashes($password); //set auth method $auth_method = "plain"; @@ -1208,7 +1210,7 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set){ /* FETCH date,from,subject headers */ $key="fh".($c++); - $request=$key." FETCH $message_set (BODY.PEEK[HEADER.FIELDS (DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID)])\r\n"; + $request=$key." FETCH $message_set (BODY.PEEK[HEADER.FIELDS (DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID REFERENCE)])\r\n"; if (!fputs($fp, $request)) return false; do{ @@ -1263,6 +1265,7 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set){ $result[$id]->encoding = str_replace("\n", " ", $headers["content-transfer-encoding"]); $result[$id]->ctype = str_replace("\n", " ", $headers["content-type"]); $result[$id]->in_reply_to = ereg_replace("[\n<>]",'', $headers['in-reply-to']); + $result[$id]->reference = $headers["reference"]; list($result[$id]->ctype, $ctype_add) = explode(";", $headers["content-type"]); @@ -1270,8 +1273,7 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set){ $result[$id]->charset = $regs[1]; $messageID = $headers["message-id"]; - if ($messageID) $messageID = substr(substr($messageID, 1), 0, strlen($messageID)-2); - else $messageID = "mid:".$id; + if (!$messageID) "mid:".$id; $result[$id]->messageID = $messageID; } else { diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 80f69b596..98e0a0a2a 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -59,6 +59,9 @@ if ($_GET['_reply_uid'] || $_GET['_forward_uid']) $REPLY_MESSAGE = &$MESSAGE; $_SESSION['compose']['reply_uid'] = $_GET['_reply_uid']; $_SESSION['compose']['reply_msgid'] = $REPLY_MESSAGE['headers']->messageID; + $_SESSION['compose']['reference'] = $REPLY_MESSAGE['headers']->reference; + $_SESSION['compose']['references'] .= !empty($REPLY_MESSAGE['headers']->reference) ? ' ' : ''; + $_SESSION['compose']['references'] .= $REPLY_MESSAGE['headers']->messageID; if ($_GET['_all']) $REPLY_MESSAGE['reply_all'] = 1; diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 0ec19a9e4..a520a5043 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -123,9 +123,11 @@ if (strlen($identity_arr['organization'])) if (strlen($identity_arr['reply-to'])) $headers['Reply-To'] = $identity_arr['reply-to']; -if ($_SESSION['compose']['reply_msgid']) +if (!empty($_SESSION['compose']['reply_msgid'])) $headers['In-Reply-To'] = $_SESSION['compose']['reply_msgid']; +if (!empty($_SESSION['compose']['references'])) + $headers['References'] = $_SESSION['compose']['references']; if ($_POST['_priority']) { @@ -180,8 +182,12 @@ if (is_array($_FILES['_attachments']['tmp_name'])) $MAIL_MIME->addAttachment($filepath, $files['type'][$i], $files['name'][$i], TRUE); +// chose transfer encoding +$charset_7bit = array('ASCII', 'ISO-2022-JP', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-15'); +$transfer_encoding = in_array(strtoupper($message_charset), $charset_7bit) ? '7bit' : '8bit'; + // encoding settings for mail composing -$message_param = array('text_encoding' => '8bit', +$message_param = array('text_encoding' => $transfer_encoding, 'html_encoding' => 'quoted-printable', 'head_encoding' => 'quoted-printable', 'head_charset' => $message_charset, @@ -190,8 +196,11 @@ $message_param = array('text_encoding' => '8bit', // compose message body and get headers $msg_body = $MAIL_MIME->get($message_param); -$msg_subject = $headers['Subject']; +$msg_subject = $headers['Subject']; +global $MBSTRING; +if ($MBSTRING&&function_exists( "mb_encode_mimeheader")) + $headers['Subject'] = mb_encode_mimeheader( $headers['Subject'],$message_charset); // send thru SMTP server using cusotm SMTP library if ($CONFIG['smtp_server']) -- cgit v1.2.3