From 95d90f86d9c5482b531092776181943c9bf57642 Mon Sep 17 00:00:00 2001 From: alecpl Date: Sun, 26 Oct 2008 17:06:23 +0000 Subject: [PATCH] - Added 'keep_alive' and 'min_keep_alive' options (#1485360) --- CHANGELOG | 1 + config/main.inc.php.dist | 17 +++++++++++++---- program/include/rcmail.php | 8 ++++++++ program/js/app.js | 2 +- program/localization/en_US/labels.inc | 2 ++ program/localization/pl_PL/labels.inc | 2 ++ program/steps/settings/func.inc | 14 ++++++++++++++ program/steps/settings/save_prefs.inc | 8 ++++++++ 8 files changed, 49 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 442bade0c..e08ace092 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ CHANGELOG RoundCube Webmail 2008/10/25 (alec) ---------- - Don't send disposition notification receipts for messages marked as 'read' (#1485523) +- Added 'keep_alive' and 'min_keep_alive' options (#1485360) 2008/10/24 (alec) ---------- diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 8a6c2966a..7d820c479 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -107,17 +107,18 @@ $rcmail_config['smtp_helo_host'] = ''; // Log sent messages $rcmail_config['smtp_log'] = TRUE; -// how many seconds must pass between emails sent by a user +// How many seconds must pass between emails sent by a user $rcmail_config['sendmail_delay'] = 0; -// these cols are shown in the message list +// These cols are shown in the message list // available cols are: subject, from, to, cc, replyto, date, size, encoding, flag $rcmail_config['list_cols'] = array('subject', 'from', 'date', 'size', 'flag'); -// includes should be interpreted as PHP files +// Includes should be interpreted as PHP files $rcmail_config['skin_include_php'] = FALSE; -// session lifetime in minutes +// Session lifetime in minutes +// must be greater than 'keep_alive'/60 $rcmail_config['session_lifetime'] = 10; // check client IP in session athorization @@ -327,6 +328,10 @@ $rcmail_config['log_logins'] = false; */ $rcmail_config['delete_always'] = false; +// Minimal value of user's 'keep_alive' setting (in seconds) +// Must be less than 'session_lifetime' +$rcmail_config['min_keep_alive'] = 60; + /***** these settings can be overwritten by user's preferences *****/ // skin name: folder from skins/ @@ -390,5 +395,9 @@ $rcmail_config['read_when_deleted'] = TRUE; // false causes deleted messages to be permanantly removed if there is no Trash folder $rcmail_config['flag_for_deletion'] = FALSE; +// Default interval for keep-alive/check-recent requests (in seconds) +// Must be greater than or equal to 'min_keep_alive' and less than 'session_lifetime' +$rcmail_config['keep_alive'] = 60; + // end of config file ?> diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 53b4765b9..7eade3223 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -289,6 +289,14 @@ class rcmail foreach (array('flag_for_deletion','read_when_deleted') as $js_config_var) { $this->output->set_env($js_config_var, $this->config->get($js_config_var)); } + + // set keep-alive/check-recent interval + if ($keep_alive = $this->config->get('keep_alive')) { + // be sure that it's less than session lifetime + if ($session_lifetime = $this->config->get('session_lifetime')) + $keep_alive = min($keep_alive, $session_lifetime * 60 - 30); + $this->output->set_env('keep_alive', max(60, $keep_alive)); + } if ($framed) { $this->comm_path .= '&_framed=1'; diff --git a/program/js/app.js b/program/js/app.js index 861c3d7cf..84e5aecde 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -366,7 +366,7 @@ function rcube_webmail() if (this.env.keep_alive && !this.env.framed && this.task=='mail' && this.gui_objects.mailboxlist) this._int = setInterval(function(){ ref.check_for_recent(); }, this.env.keep_alive * 1000); else if (this.env.keep_alive && !this.env.framed && this.task!='login') - this._int = setInterval(function(){ ref.send_keep_alive(); }, this.env.keep_alive * 1000); + this._int = setInterval(function(){ ref.send_keep_alive(); }, this.env.keep_alive * 1000); } this.init_message_row = function(row) diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 904450b44..3b17c0a00 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -282,6 +282,8 @@ $labels['skipdeleted'] = 'Do not show deleted messages'; $labels['showinlineimages'] = 'Display attached images below the message'; $labels['autosavedraft'] = 'Automatically save draft'; $labels['everynminutes'] = 'every $n minutes'; +$labels['keepaliveevery'] = 'every $n minute(s)'; +$labels['keepalive'] = 'Check for new messages on'; $labels['never'] = 'never'; $labels['messagesdisplaying'] = 'Displaying Messages'; $labels['messagescomposition'] = 'Composing Messages'; diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc index 106c63d0a..a32284d98 100644 --- a/program/localization/pl_PL/labels.inc +++ b/program/localization/pl_PL/labels.inc @@ -230,6 +230,8 @@ $labels['flagfordeletion'] = 'Oznacz wiadomość do usunięcia zamiast ją usuwa $labels['skipdeleted'] = 'Ukryj wiadomości oznaczone do usunięcia'; $labels['autosavedraft'] = 'Automatyczny zapis tworzonej wiadomości'; $labels['everynminutes'] = 'co $n minut(y)'; +$labels['keepalive'] = 'Sprawdzaj czy nadeszły nowe wiadomości'; +$labels['keepaliveevery'] = 'co $n minut(y)'; $labels['never'] = 'nigdy'; $labels['focusonnewmessage'] = 'Informuj przeglądarkę o nowej wiadomości'; $labels['folder'] = 'Folder'; diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index 6f378fd0e..980108ad9 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -175,6 +175,20 @@ function rcmail_user_prefs_form($attrib) $table->add(null, $select_mdn_requests->show($config['mdn_requests'])); } + if (!isset($no_override['keep_alive'])) { + $field_id = 'rcmfd_keep_alive'; + $select_keep_alive = new html_select(array('name' => '_keep_alive', 'id' => $field_id)); + + foreach(array(1, 3, 5, 10, 15, 30, 60) as $min) + if((!$config['min_keep_alive'] || $config['min_keep_alive'] <= $min * 60) + && (!$config['session_lifetime'] || $config['session_lifetime'] > $min)) { + $select_keep_alive->add(rcube_label(array('name' => 'keepaliveevery', 'vars' => array('n' => $min))), $min); + } + + $table->add('title', html::label($field_id, Q(rcube_label('keepalive')))); + $table->add(null, $select_keep_alive->show($config['keep_alive']/60)); + } + $out .= html::tag('fieldset', null, html::tag('legend', null, Q(rcube_label('mailboxview'))) . $table->show($attrib)); $table = new html_table(array('cols' => 2)); diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc index 3f6328d0d..debd345e3 100644 --- a/program/steps/settings/save_prefs.inc +++ b/program/steps/settings/save_prefs.inc @@ -37,6 +37,7 @@ $a_user_prefs = array( 'logout_purge' => isset($_POST['_logout_purge']) ? TRUE : FALSE, 'logout_expunge' => isset($_POST['_logout_expunge']) ? TRUE : FALSE, 'draft_autosave' => isset($_POST['_draft_autosave']) ? intval($_POST['_draft_autosave']) : 0, + 'keep_alive' => isset($_POST['_keep_alive']) ? intval($_POST['_keep_alive'])*60 : $CONFIG['keep_alive'], 'mime_param_folding' => isset($_POST['_mime_param_folding']) ? intval($_POST['_mime_param_folding']) : 0, 'mdn_requests' => isset($_POST['_mdn_requests']) ? intval($_POST['_mdn_requests']) : 0, 'skin' => isset($_POST['_skin']) ? get_input_value('_skin', RCUBE_INPUT_POST) : $CONFIG['skin'], @@ -78,6 +79,13 @@ if ($a_user_prefs['pagesize'] < 1) if (isset($CONFIG['max_pagesize']) && ($a_user_prefs['pagesize'] > $CONFIG['max_pagesize'])) $a_user_prefs['pagesize'] = (int) $CONFIG['max_pagesize']; +// force keep_alive +if (isset($a_user_prefs['keep_alive'])) { + $a_user_prefs['keep_alive'] = max(60, $CONFIG['min_keep_alive'], $a_user_prefs['keep_alive']); + if (!empty($CONFIG['session_lifetime'])) + $a_user_prefs['keep_alive'] = min($CONFIG['session_lifetime']*60, $a_user_prefs['keep_alive']); +} + if ($USER->save_prefs($a_user_prefs)) $OUTPUT->show_message('successfullysaved', 'confirmation');