Solved wrong caching of message preview (#1484153, #1484236)
| | |
| | | CHANGELOG RoundCube Webmail |
| | | --------------------------- |
| | | |
| | | 2007/03/01 (thomasb) |
| | | ---------- |
| | | - Solved page caching of message preview (closes #1484153) |
| | | - Only use gzip compression if configured (closes #1484236) |
| | | |
| | | |
| | | 2007/02/25 (estadtherr) |
| | | ---------- |
| | | - Fixed priority selector issue (#1484150) |
| | |
| | | /* |
| | | +-----------------------------------------------------------------------+ |
| | | | RoundCube Webmail IMAP Client | |
| | | | Version 0.1-20061206 | |
| | | | Version 0.1-20070301 | |
| | | | | |
| | | | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland | |
| | | | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | Redistribution and use in source and binary forms, with or without | |
| | |
| | | |
| | | */ |
| | | |
| | | define('RCMAIL_VERSION', '0.1-20061206'); |
| | | define('RCMAIL_VERSION', '0.1-20070301'); |
| | | |
| | | // define global vars |
| | | $CHARSET = 'UTF-8'; |
| | |
| | | if ($_action != 'get' && $_action != 'viewsource') |
| | | { |
| | | // use gzip compression if supported |
| | | if (function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) |
| | | if (function_exists('ob_gzhandler') && ini_get('zlib.output_compression')) |
| | | ob_start('ob_gzhandler'); |
| | | else |
| | | ob_start(); |
| | |
| | | setcookie('sessauth', rcmail_auth_hash(session_id(), $now)); |
| | | } |
| | | |
| | | if (!$valid) |
| | | write_log('timeouts', |
| | | "REQUEST: " . var_export($_REQUEST, true) . |
| | | "\nEXPECTED: " . rcmail_auth_hash(session_id(), $_SESSION['auth_time']) . |
| | | "\nOR LAST: " . rcmail_auth_hash(session_id(), $_SESSION['last_auth']) . |
| | | "\nSESSION: " . var_export($_SESSION, true)); |
| | | |
| | | return $valid; |
| | | } |
| | | |
| | |
| | | $_SESSION['username'] = $user; |
| | | $_SESSION['user_lang'] = $sess_user_lang; |
| | | $_SESSION['password'] = encrypt_passwd($pass); |
| | | $_SESSION['login_time'] = mktime(); |
| | | |
| | | // force reloading complete list of subscribed mailboxes |
| | | rcmail_set_imap_prop(); |
| | |
| | | |
| | | |
| | | // send header with expire date 30 days in future |
| | | function send_future_expire_header() |
| | | function send_future_expire_header($offset=2600000) |
| | | { |
| | | if (headers_sent()) |
| | | return; |
| | | |
| | | header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT"); |
| | | header("Cache-Control: "); |
| | | header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+$offset)." GMT"); |
| | | header("Cache-Control: max-age=$offset"); |
| | | header("Pragma: "); |
| | | } |
| | | |
| | | |
| | | // check request for If-Modified-Since and send an according response |
| | | function send_modified_header($mdate, $etag=null) |
| | | { |
| | | if (headers_sent()) |
| | | return; |
| | | |
| | | $iscached = false; |
| | | if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mdate) |
| | | $iscached = true; |
| | | |
| | | $etag = $etag ? "\"$etag\"" : null; |
| | | if ($etag && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) |
| | | $iscached = true; |
| | | |
| | | if ($iscached) |
| | | header("HTTP/1.x 304 Not Modified"); |
| | | else |
| | | header("Last-Modified: ".gmdate("D, d M Y H:i:s", $mdate)." GMT"); |
| | | |
| | | header("Cache-Control: max-age=0"); |
| | | header("Expires: "); |
| | | header("Pragma: "); |
| | | |
| | | if ($etag) |
| | | header("Etag: $etag"); |
| | | |
| | | if ($iscached) |
| | | exit; |
| | | } |
| | | |
| | | |
| | | // function to convert an array to a javascript array |
| | | function array2js($arr, $type='') |
| | | { |
| | |
| | | |
| | | $PRINT_MODE = $_action=='print' ? TRUE : FALSE; |
| | | |
| | | // allow caching, unless remote images are present |
| | | if ((bool)get_input_value('_safe', RCUBE_INPUT_GET)) |
| | | send_nocacheing_headers(); |
| | | else |
| | | send_future_expire_header(); |
| | | |
| | | // similar code as in program/steps/mail/get.inc |
| | | if ($_GET['_uid']) |
| | | { |
| | | $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET)); |
| | | $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']); |
| | | $MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']); |
| | | |
| | | // go back to list if message not found (wrong UID) |
| | | if (!$MESSAGE['headers'] || !$MESSAGE['structure']) |
| | | if (!$MESSAGE['headers']) |
| | | { |
| | | show_message('messageopenerror', 'error'); |
| | | if ($_action=='preview' && template_exists('messagepreview')) |
| | |
| | | } |
| | | } |
| | | |
| | | // calculate Etag for this request |
| | | $etag = md5($MESSAGE['UID'].$IMAP->get_mailbox_name().session_id().($PRINT_MODE?1:0)); |
| | | |
| | | // allow caching, unless remote images are present |
| | | if ((bool)get_input_value('_safe', RCUBE_INPUT_GET)) |
| | | send_nocacheing_headers(); |
| | | else |
| | | send_modified_header($_SESSION['login_time'], $etag); |
| | | |
| | | |
| | | $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject); |
| | | |
| | | if ($MESSAGE['structure']) |
| | | if ($MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID'])) |
| | | list($MESSAGE['parts'], $MESSAGE['attachments']) = rcmail_parse_message( |
| | | $MESSAGE['structure'], |
| | | array('safe' => (bool)$_GET['_safe'], |