CHANGELOG | ●●●●● patch | view | raw | blame | history | |
index.php | ●●●●● patch | view | raw | blame | history | |
program/include/main.inc | ●●●●● patch | view | raw | blame | history | |
program/include/session.inc | ●●●●● patch | view | raw | blame | history | |
program/js/app.js | ●●●●● patch | view | raw | blame | history | |
program/steps/error.inc | ●●●●● patch | view | raw | blame | history | |
program/steps/mail/func.inc | ●●●●● patch | view | raw | blame | history | |
program/steps/settings/manage_folders.inc | ●●●●● patch | view | raw | blame | history |
CHANGELOG
@@ -1,6 +1,15 @@ CHANGELOG RoundCube Webmail --------------------------- 2006/09/07 (thomasb) ---------- - Made automatic draft saving configurable - Fixed JS bug when renaming folders (Bug #1483989) - Don't wait for complete page load when calling JavaScript init() - Some improvements to prevent session expiration - Prevent from double submit of spell check requests 2006/09/01 (thomasb) ---------- - Imporoved message parsing and HTML validation index.php
@@ -2,7 +2,7 @@ /* +-----------------------------------------------------------------------+ | RoundCube Webmail IMAP Client | | Version 0.1-20060904 | | Version 0.1-20060907 | | | | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland | | Licensed under the GNU GPL | @@ -40,7 +40,7 @@ */ define('RCMAIL_VERSION', '0.1-20060904'); define('RCMAIL_VERSION', '0.1-20060907'); // define global vars $CHARSET = 'UTF-8'; @@ -181,7 +181,7 @@ else if ($_action!='login' && $_SESSION['user_id']) { if (!rcmail_authenticate_session() || ($CONFIG['session_lifetime'] && isset($SESS_CHANGED) && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < mktime())) (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED) && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < mktime())) { $message = show_message('sessionerror', 'error'); rcmail_kill_session(); program/include/main.inc
@@ -39,40 +39,12 @@ // check client $BROWSER = rcube_browser(); // load config file include_once('config/main.inc.php'); $CONFIG = is_array($rcmail_config) ? $rcmail_config : array(); // load host-specific configuration rcmail_load_host_config($CONFIG); $CONFIG['skin_path'] = $CONFIG['skin_path'] ? unslashify($CONFIG['skin_path']) : 'skins/default'; // load db conf include_once('config/db.inc.php'); $CONFIG = array_merge($CONFIG, $rcmail_config); if (empty($CONFIG['log_dir'])) $CONFIG['log_dir'] = $INSTALL_PATH.'logs'; else $CONFIG['log_dir'] = unslashify($CONFIG['log_dir']); // set PHP error logging according to config if ($CONFIG['debug_level'] & 1) { ini_set('log_errors', 1); ini_set('error_log', $CONFIG['log_dir'].'/errors'); } if ($CONFIG['debug_level'] & 4) ini_set('display_errors', 1); else ini_set('display_errors', 0); // load configuration $CONFIG = rcmail_load_config(); // set session garbage collecting time according to session_lifetime if (!empty($CONFIG['session_lifetime'])) ini_set('session.gc_maxlifetime', ($CONFIG['session_lifetime']+2)*60); ini_set('session.gc_maxlifetime', ($CONFIG['session_lifetime']) * 120); // prepare DB connection require_once('include/rcube_'.(empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend']).'.inc'); @@ -80,7 +52,7 @@ $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']); $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql'; $DB->db_connect('w'); // we can use the database for storing session data if (!$DB->is_error()) include_once('include/session.inc'); @@ -129,6 +101,44 @@ } // load roundcube configuration into global var function rcmail_load_config() { global $INSTALL_PATH; // load config file include_once('config/main.inc.php'); $conf = is_array($rcmail_config) ? $rcmail_config : array(); // load host-specific configuration rcmail_load_host_config($conf); $conf['skin_path'] = $conf['skin_path'] ? unslashify($conf['skin_path']) : 'skins/default'; // load db conf include_once('config/db.inc.php'); $conf = array_merge($conf, $rcmail_config); if (empty($conf['log_dir'])) $conf['log_dir'] = $INSTALL_PATH.'logs'; else $conf['log_dir'] = unslashify($conf['log_dir']); // set PHP error logging according to config if ($conf['debug_level'] & 1) { ini_set('log_errors', 1); ini_set('error_log', $conf['log_dir'].'/errors'); } if ($conf['debug_level'] & 4) ini_set('display_errors', 1); else ini_set('display_errors', 0); return $conf; } // load a host-specific config file if configured function rcmail_load_host_config(&$config) { @@ -169,15 +179,24 @@ function rcmail_authenticate_session() { $now = mktime(); $valid = ($_COOKIE['sessauth'] == rcmail_auth_hash(session_id(), $_SESSION['auth_time'])); $valid = ($_COOKIE['sessauth'] == rcmail_auth_hash(session_id(), $_SESSION['auth_time']) || $_COOKIE['sessauth'] == rcmail_auth_hash(session_id(), $_SESSION['last_auth'])); // renew auth cookie every 5 minutes (only for GET requests) if (!$valid || ($_SERVER['REQUEST_METHOD']!='POST' && $now-$_SESSION['auth_time'] > 300)) { $_SESSION['last_auth'] = $_SESSION['auth_time']; $_SESSION['auth_time'] = $now; 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; } @@ -353,11 +372,15 @@ $javascript .= "$JS_OBJECT_NAME.set_env('$js_config_var', '" . $CONFIG[$js_config_var] . "');\n"; } } // don't wait for page onload. Call init at the bottom of the page (delayed) $javascript_foot = "if (window.call_init)\n call_init('$JS_OBJECT_NAME');"; if (!empty($GLOBALS['_framed'])) $javascript .= "$JS_OBJECT_NAME.set_env('framed', true);\n"; $OUTPUT->add_script($javascript); $OUTPUT->add_script($javascript, 'head'); $OUTPUT->add_script($javascript_foot, 'foot'); $OUTPUT->include_script('common.js'); $OUTPUT->include_script('app.js'); $OUTPUT->scripts_path = 'program/js/'; @@ -1802,6 +1825,9 @@ function write_log($name, $line) { global $CONFIG; if (!is_string($line)) $line = var_export($line, true); $log_entry = sprintf("[%s]: %s\n", date("d-M-Y H:i:s O", mktime()), program/include/session.inc
@@ -45,7 +45,7 @@ if ($sql_arr = $DB->fetch_assoc($sql_result)) { $SESS_CHANGED = mktime(); //$sql_arr['changed']; $SESS_CHANGED = $sql_arr['changed']; if (strlen($sql_arr['vars'])) return $sql_arr['vars']; program/js/app.js
@@ -49,9 +49,9 @@ 'application/x-shockwave-flash'); // default environment vars this.env.keep_alive = 60; // seconds this.env.keep_alive = 50; // seconds this.env.request_timeout = 180; // seconds this.env.draft_autosave = 300; // seconds this.env.draft_autosave = 0; // seconds // set environment variable @@ -148,7 +148,10 @@ { this.enable_command('add-attachment', 'send-attachment', 'remove-attachment', 'send', true); if (this.env.spellcheck) this.enable_command('spellcheck', true); { this.env.spellcheck.spelling_state_observer = function(s){ rcube_webmail_client.set_spellcheck_state(s); }; this.set_spellcheck_state('ready'); } if (this.env.drafts_mailbox) this.enable_command('savedraft', true); } @@ -930,8 +933,11 @@ break; case 'spellcheck': if (this.env.spellcheck && this.env.spellcheck.spellCheck) if (this.env.spellcheck && this.env.spellcheck.spellCheck && this.spellcheck_ready) { this.env.spellcheck.spellCheck(this.env.spellcheck.check_link); this.set_spellcheck_state('checking'); } break; case 'savedraft': @@ -942,7 +948,8 @@ break; // if saving Drafts is disabled in main.inc.php if (!this.env.drafts_mailbox) // or if compose form did not change if (!this.env.drafts_mailbox || this.cmp_hash == this.compose_field_hash()) break; this.set_busy(true, 'savingmessage'); @@ -2025,6 +2032,13 @@ }; this.set_spellcheck_state = function(s) { this.spellcheck_ready = (s=='check_spelling' || s=='ready'); this.enable_command('spellcheck', this.spellcheck_ready); }; this.auto_save_start = function() { if (this.env.draft_autosave) @@ -2783,7 +2797,7 @@ this.reset_folder_rename = function() { var cell = this.name_input ? this.name_input.parentNode : null; if (cell && this.edit_folder) if (cell && this.edit_folder && this.env.subscriptionrows[this.edit_folder]) cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1]; this.edit_folder = null; @@ -3568,7 +3582,7 @@ case 'expunge': this.enable_command('select-all', 'select-none', 'expunge', this.env.messagecount ? true : false); break; break; } request_obj.reset(); @@ -3886,6 +3900,12 @@ } // end class rcube_http_request // helper function to call the init method with a delay function call_init(o) { if (window[o] && window[o].init) setTimeout(o+'.init()', 200); } function console(str) { @@ -3893,10 +3913,3 @@ document.debugform.console.value += str+'\n--------------------------------------\n'; } // set onload handler window.onload = function(e) { if (window.rcube_webmail_client) rcube_webmail_client.init(); }; program/steps/error.inc
@@ -69,11 +69,11 @@ { $__error_title = "SERVICE CURRENTLY NOT AVAILABLE!"; $__error_text = "Please contact your server-administrator."; if (($CONFIG['debug_level'] & 4) && $ERROR_MESSAGE) $__error_text = $ERROR_MESSAGE; else $__error_text = 'Error No. '.dechex($ERROR_CODE).')'; $__error_text = 'Error No. ['.dechex($ERROR_CODE).']'; } program/steps/mail/func.inc
@@ -1245,9 +1245,9 @@ { global $IMAP; if (!is_array($message_struct['parts'])) return FALSE; if (empty($message_struct['parts'])) return $message_struct['UID'] ? $IMAP->get_body($message_struct['UID']) : false; // check all message parts foreach ($message_struct['parts'] as $pid => $part) { program/steps/settings/manage_folders.inc
@@ -73,10 +73,12 @@ if ($rename && $REMOTE_REQUEST) { $commands = sprintf("this.replace_folder_row('%s','%s','%s');", $commands = sprintf("this.replace_folder_row('%s','%s','%s');\n", rep_specialchars_output(get_input_value('_folder_oldname', RCUBE_INPUT_GET), 'js'), rep_specialchars_output($rename, 'js'), rep_specialchars_output(rcube_charset_convert($rename, 'UTF-7'), 'js')); $commands .= "this.reset_folder_rename();\n"; rcube_remote_response($commands); }