From 8d54286df87e21673c05f091e38ca4de14aae326 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Thu, 15 Nov 2012 03:34:08 -0500
Subject: [PATCH] Merge branch 'keep-alive'

---
 CHANGELOG                               |    3 
 program/include/rcube_plugin_api.php    |    2 
 program/include/rcube_session.php       |   20 ---
 config/main.inc.php.dist                |   13 +-
 program/include/rcube_config.php        |    2 
 program/steps/settings/save_prefs.inc   |   28 +++--
 program/include/rcube.php               |   30 -----
 index.php                               |    7 +
 installer/rcube_install.php             |    3 
 program/steps/mail/check_recent.inc     |   10 +
 program/include/rcmail.php              |   16 +-
 program/localization/en_US/messages.inc |    1 
 program/steps/mail/func.inc             |    1 
 program/steps/settings/func.inc         |   35 +++---
 program/localization/en_US/labels.inc   |    2 
 program/js/app.js                       |  109 ++++++++++++++-------
 16 files changed, 141 insertions(+), 141 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 61caf00..8a105e7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Improved keep-alive action. Now the interval is based on session_lifetime (#1488507)
+- Added cross-task 'refresh' request for system state updates (#1488507)
+- Renamed config options: keep_alive to refresh_interval, min_keep_alive to min_refresh_interval
 - Fix handling of text/enriched content on message reply/forward/edit
 - Option to display attached images as thumbnails below message body
 - Upgraded to jQuery 1.8.3 and jQuery UI 1.9.1
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index dc76f18..3c7d8ed 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -241,7 +241,6 @@
 $rcmail_config['display_version'] = false;
 
 // Session lifetime in minutes
-// must be greater than 'keep_alive'/60
 $rcmail_config['session_lifetime'] = 10;
 
 // Session domain: .example.org
@@ -504,9 +503,8 @@
 // don't let users set pagesize to more than this value if set
 $rcmail_config['max_pagesize'] = 200;
 
-// Minimal value of user's 'keep_alive' setting (in seconds)
-// Must be less than 'session_lifetime'
-$rcmail_config['min_keep_alive'] = 60;
+// Minimal value of user's 'refresh_interval' setting (in seconds)
+$rcmail_config['min_refresh_interval'] = 60;
 
 // Enables files upload indicator. Requires APC installed and enabled apc.rfc1867 option.
 // By default refresh time is set to 1 second. You can set this value to true
@@ -790,9 +788,10 @@
 // Use 'Purge' to remove messages marked as deleted
 $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;
+// Default interval for auto-refresh requests (in seconds)
+// These are requests for system state updates e.g. checking for new messages, etc.
+// Setting it to 0 disables the feature.
+$rcmail_config['refresh_interval'] = 60;
 
 // If true all folders will be checked for recent messages
 $rcmail_config['check_all_folders'] = false;
diff --git a/index.php b/index.php
index 0ad371a..aee94e9 100644
--- a/index.php
+++ b/index.php
@@ -249,7 +249,6 @@
 $RCMAIL->set_task($plugin['task']);
 $RCMAIL->action = $plugin['action'];
 
-
 // handle special actions
 if ($RCMAIL->action == 'keep-alive') {
   $OUTPUT->reset();
@@ -282,7 +281,8 @@
   else if (($stepfile = $RCMAIL->get_action_file())
     && is_file($incfile = INSTALL_PATH . 'program/steps/'.$RCMAIL->task.'/'.$stepfile)
   ) {
-    include $incfile;
+    // include action file only once (in case it don't exit)
+    include_once $incfile;
     $redirects++;
   }
   else {
@@ -290,6 +290,9 @@
   }
 }
 
+if ($RCMAIL->action == 'refresh') {
+  $RCMAIL->plugins->exec_hook('refresh', array());
+}
 
 // parse main template (default)
 $OUTPUT->send($RCMAIL->task);
diff --git a/installer/rcube_install.php b/installer/rcube_install.php
index cbeb165..e120366 100644
--- a/installer/rcube_install.php
+++ b/installer/rcube_install.php
@@ -342,9 +342,6 @@
       }
     }
 
-    if ($current['keep_alive'] && $current['session_lifetime'] < $current['keep_alive'])
-      $current['session_lifetime'] = max(10, ceil($current['keep_alive'] / 60) * 2);
-
     $this->config  = array_merge($this->config, $current);
 
     foreach ((array)$current['ldap_public'] as $key => $values) {
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 3728e5d..99a68e8 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -94,9 +94,6 @@
     // create user object
     $this->set_user(new rcube_user($_SESSION['user_id']));
 
-    // configure session (after user config merge!)
-    $this->session_configure();
-
     // set task and action properties
     $this->set_task(rcube_utils::get_input_value('_task', rcube_utils::INPUT_GPC));
     $this->action = asciiwords(rcube_utils::get_input_value('_action', rcube_utils::INPUT_GPC));
@@ -320,10 +317,9 @@
     if (!($this->output instanceof rcube_output_html))
       $this->output = new rcube_output_html($this->task, $framed);
 
-    // set keep-alive/check-recent interval
-    if ($this->session && ($keep_alive = $this->session->get_keep_alive())) {
-      $this->output->set_env('keep_alive', $keep_alive);
-    }
+    // set refresh interval
+    $this->output->set_env('refresh_interval', $this->config->get('refresh_interval', 0));
+    $this->output->set_env('session_lifetime', $this->config->get('session_lifetime', 0) * 60);
 
     if ($framed) {
       $this->comm_path .= '&_framed=1';
@@ -336,7 +332,7 @@
     $this->output->set_charset(RCMAIL_CHARSET);
 
     // add some basic labels to client
-    $this->output->add_label('loading', 'servererror', 'requesttimedout');
+    $this->output->add_label('loading', 'servererror', 'requesttimedout', 'refreshing');
 
     return $this->output;
   }
@@ -522,7 +518,6 @@
       // Configure environment
       $this->set_user($user);
       $this->set_storage_prop();
-      $this->session_configure();
 
       // fix some old settings according to namespace prefix
       $this->fix_namespace_settings($user);
@@ -775,6 +770,7 @@
     }
   }
 
+
   /**
    * Registers action aliases for current task
    *
@@ -789,6 +785,7 @@
     }
   }
 
+
   /**
    * Returns current action filename
    *
@@ -803,6 +800,7 @@
     return strtr($this->action, '-', '_') . '.inc';
   }
 
+
   /**
    * Fixes some user preferences according to namespace handling change.
    * Old Roundcube versions were using folder names with removed namespace prefix.
diff --git a/program/include/rcube.php b/program/include/rcube.php
index 0e40b3c..9c1a6d8 100644
--- a/program/include/rcube.php
+++ b/program/include/rcube.php
@@ -434,37 +434,13 @@
         $this->session->register_gc_handler(array($this, 'temp_gc'));
         $this->session->register_gc_handler(array($this, 'cache_gc'));
 
+        $this->session->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME']));
+        $this->session->set_ip_check($this->config->get('ip_check'));
+
         // start PHP session (if not in CLI mode)
         if ($_SERVER['REMOTE_ADDR']) {
             session_start();
         }
-    }
-
-
-    /**
-     * Configure session object internals
-     */
-    public function session_configure()
-    {
-        if (!$this->session) {
-            return;
-        }
-
-        $lifetime   = $this->config->get('session_lifetime', 0) * 60;
-        $keep_alive = $this->config->get('keep_alive');
-
-        // set keep-alive/check-recent interval
-        if ($keep_alive) {
-            // be sure that it's less than session lifetime
-            if ($lifetime) {
-                $keep_alive = min($keep_alive, $lifetime - 30);
-            }
-            $keep_alive = max(60, $keep_alive);
-            $this->session->set_keep_alive($keep_alive);
-        }
-
-        $this->session->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME']));
-        $this->session->set_ip_check($this->config->get('ip_check'));
     }
 
 
diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php
index 1f165ba..bbc3e9c 100644
--- a/program/include/rcube_config.php
+++ b/program/include/rcube_config.php
@@ -43,6 +43,8 @@
         'mail_pagesize'        => 'pagesize',
         'addressbook_pagesize' => 'pagesize',
         'reply_mode'           => 'top_posting',
+        'refresh_interval'     => 'keep_alive',
+        'min_refresh_interval' => 'min_keep_alive',
     );
 
 
diff --git a/program/include/rcube_plugin_api.php b/program/include/rcube_plugin_api.php
index 107c810..c473b0b 100644
--- a/program/include/rcube_plugin_api.php
+++ b/program/include/rcube_plugin_api.php
@@ -327,7 +327,7 @@
     if (isset($this->actions[$action])) {
       call_user_func($this->actions[$action]);
     }
-    else {
+    else if (rcube::get_instance()->action != 'refresh') {
       rcube::raise_error(array('code' => 524, 'type' => 'php',
         'file' => __FILE__, 'line' => __LINE__,
         'message' => "No handler found for action $action"), true, true);
diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php
index 6192466..c71efa2 100644
--- a/program/include/rcube_session.php
+++ b/program/include/rcube_session.php
@@ -43,7 +43,6 @@
   private $secret = '';
   private $ip_check = false;
   private $logging = false;
-  private $keep_alive = 0;
   private $memcache;
 
   /**
@@ -525,24 +524,6 @@
       $this->now = $now - ($now % ($this->lifetime / 2));
   }
 
-  /**
-   * Setter for keep_alive interval
-   */
-  public function set_keep_alive($keep_alive)
-  {
-    $this->keep_alive = $keep_alive;
-
-    if ($this->lifetime < $keep_alive)
-        $this->set_lifetime($keep_alive + 30);
-  }
-
-  /**
-   * Getter for keep_alive interval
-   */
-  public function get_keep_alive()
-  {
-    return $this->keep_alive;
-  }
 
   /**
    * Getter for remote IP saved with this session
@@ -552,6 +533,7 @@
     return $this->ip;
   }
 
+
   /**
    * Setter for cookie encryption secret
    */
diff --git a/program/js/app.js b/program/js/app.js
index 1891977..88e4606 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -44,7 +44,6 @@
   this.identifier_expr = new RegExp('[^0-9a-z\-_]', 'gi');
 
   // default environment vars
-  this.env.keep_alive = 60;        // seconds
   this.env.request_timeout = 180;  // seconds
   this.env.draft_autosave = 0;     // seconds
   this.env.comm_path = './';
@@ -482,7 +481,8 @@
         this.onloads[i]();
       }
 
-    // start keep-alive interval
+    // start keep-alive and refresh intervals
+    this.start_refresh();
     this.start_keepalive();
   };
 
@@ -885,10 +885,6 @@
           this.show_message(this.env.first_uid);
         break;
 
-      case 'checkmail':
-        this.check_for_recent(true);
-        break;
-
       case 'compose':
         url = {};
 
@@ -956,9 +952,6 @@
           this.auto_save_start();
           break;
         }
-
-        // re-set keep-alive timeout
-        this.start_keepalive();
 
         this.submit_messageform(true);
         break;
@@ -2067,6 +2060,15 @@
       else if (this.task == 'mail')
         this.list_mailbox(this.env.mailbox, page);
     }
+  };
+
+  // sends request to check for recent messages
+  this.checkmail = function()
+  {
+    var lock = this.set_busy(true, 'checkingmail'),
+      params = this.check_recent_params();
+
+    this.http_request('check-recent', params, lock);
   };
 
   // list messages of a specific mailbox using filter
@@ -6086,6 +6088,9 @@
       $('<a>').attr('href', url).appendTo(document.body).get(0).click();
     else
       target.location.href = url;
+
+    // reset keep-alive interval
+    this.start_keepalive();
   };
 
   // send a http request to the server
@@ -6114,6 +6119,9 @@
       success: function(data){ ref.http_response(data); },
       error: function(o, status, err) { ref.http_error(o, status, err, lock, action); }
     });
+
+    // reset keep-alive interval
+    this.start_keepalive();
   };
 
   // send a http POST request to the server
@@ -6131,7 +6139,7 @@
     // trigger plugin hook
     var result = this.triggerEvent('request'+action, postdata);
     if (result !== undefined) {
-      // abort if one the handlers returned false
+      // abort if one of the handlers returned false
       if (result === false)
         return false;
       else
@@ -6146,6 +6154,9 @@
       success: function(data){ ref.http_response(data); },
       error: function(o, status, err) { ref.http_error(o, status, err, lock, action); }
     });
+
+    // reset keep-alive interval
+    this.start_keepalive();
   };
 
   // aborts ajax request
@@ -6240,6 +6251,7 @@
         }
         break;
 
+      case 'refresh':
       case 'check-recent':
       case 'getunread':
       case 'search':
@@ -6273,6 +6285,9 @@
 
     this.triggerEvent('responseafter', {response: response});
     this.triggerEvent('responseafter'+response.action, {response: response});
+
+    // reset keep-alive interval
+    this.start_keepalive();
   };
 
   // handle HTTP request errors
@@ -6297,8 +6312,6 @@
     // re-send keep-alive requests after 30 seconds
     if (action == 'keep-alive')
       setTimeout(function(){ ref.keep_alive(); ref.start_keepalive(); }, 30000);
-    else if (action == 'check-recent')
-      setTimeout(function(){ ref.check_for_recent(false); ref.start_keepalive(); }, 30000);
   };
 
   // post the given form to a hidden iframe
@@ -6468,20 +6481,28 @@
     }
   };
 
-
-  // starts interval for keep-alive/check-recent signal
+  // starts interval for keep-alive signal
   this.start_keepalive = function()
   {
-    if (!this.env.keep_alive || this.env.framed)
+    if (!this.env.session_lifetime || this.env.framed || this.env.extwin || this.task == 'login' || this.env.action == 'print')
       return;
 
-    if (this._int)
-      clearInterval(this._int);
+    if (this._keepalive)
+      clearInterval(this._keepalive);
 
-    if (this.task == 'mail' && this.gui_objects.mailboxlist)
-      this._int = setInterval(function(){ ref.check_for_recent(false); }, this.env.keep_alive * 1000);
-    else if (this.task != 'login' && this.env.action != 'print')
-      this._int = setInterval(function(){ ref.keep_alive(); }, this.env.keep_alive * 1000);
+    this._keepalive = setInterval(function(){ ref.keep_alive(); }, this.env.session_lifetime * 0.5 * 1000);
+  };
+
+  // starts interval for refresh signal
+  this.start_refresh = function()
+  {
+    if (!this.env.refresh_interval || this.env.framed || this.env.extwin || this.task == 'login' || this.env.action == 'print')
+      return;
+
+    if (this._refresh)
+      clearInterval(this._refresh);
+
+    this._refresh = setInterval(function(){ ref.refresh(); }, this.env.refresh_interval * 1000);
   };
 
   // sends keep-alive signal
@@ -6491,29 +6512,39 @@
       this.http_request('keep-alive');
   };
 
-  // sends request to check for recent messages
-  this.check_for_recent = function(refresh)
+  // sends refresh signal
+  this.refresh = function()
   {
-    if (this.busy)
+    if (this.busy) {
+      // try again after 10 seconds
+      setTimeout(function(){ ref.refresh(); ref.start_refresh(); }, 10000);
       return;
-
-    var lock, url = {_mbox: this.env.mailbox};
-
-    if (refresh) {
-      lock = this.set_busy(true, 'checkingmail');
-      url._refresh = 1;
-      // reset check-recent interval
-      this.start_keepalive();
     }
 
-    if (this.gui_objects.messagelist)
-      url._list = 1;
-    if (this.gui_objects.quotadisplay)
-      url._quota = 1;
-    if (this.env.search_request)
-      url._search = this.env.search_request;
+    var params = {}, lock = this.set_busy(true, 'refreshing');
 
-    this.http_request('check-recent', url, lock);
+    if (this.task == 'mail' && this.gui_objects.mailboxlist)
+      params = this.check_recent_params();
+
+    // plugins should bind to 'requestrefresh' event to add own params
+    this.http_request('refresh', params, lock);
+  };
+
+  // returns check-recent request parameters
+  this.check_recent_params = function()
+  {
+    var params = {_mbox: this.env.mailbox};
+
+    if (this.gui_objects.mailboxlist)
+      params._folderlist = 1;
+    if (this.gui_objects.messagelist)
+      params._list = 1;
+    if (this.gui_objects.quotadisplay)
+      params._quota = 1;
+    if (this.env.search_request)
+      params._search = this.env.search_request;
+
+    return params;
   };
 
 
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 2b1397f..1999bad 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -414,7 +414,7 @@
 $labels['showinlineimages'] = 'Display attached images below the message';
 $labels['autosavedraft']  = 'Automatically save draft';
 $labels['everynminutes']  = 'every $n minute(s)';
-$labels['keepalive']  = 'Check for new messages on';
+$labels['refreshinterval']  = 'Refresh (check for new messages, etc.)';
 $labels['never']  = 'never';
 $labels['immediately']  = 'immediately';
 $labels['messagesdisplaying'] = 'Displaying Messages';
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index cabc999..a858d0a 100644
--- a/program/localization/en_US/messages.inc
+++ b/program/localization/en_US/messages.inc
@@ -37,6 +37,7 @@
 $messages['nomessagesfound'] = 'No messages found in this mailbox.';
 $messages['loggedout'] = 'You have successfully terminated the session. Good bye!';
 $messages['mailboxempty'] = 'Mailbox is empty.';
+$messages['refreshing'] = 'Refreshing...';
 $messages['loading'] = 'Loading...';
 $messages['uploading'] = 'Uploading file...';
 $messages['uploadingmany'] = 'Uploading files...';
diff --git a/program/steps/mail/check_recent.inc b/program/steps/mail/check_recent.inc
index 1a1b08c..90d17c1 100644
--- a/program/steps/mail/check_recent.inc
+++ b/program/steps/mail/check_recent.inc
@@ -19,8 +19,14 @@
  +-----------------------------------------------------------------------+
 */
 
+// If there's no folder or messages list, there's nothing to update
+// This can happen on 'refresh' request
+if (empty($_REQUEST['_folderlist']) && empty($_REQUEST['_list'])) {
+    return;
+}
+
 $current = $RCMAIL->storage->get_folder();
-$check_all = !empty($_GET['_refresh']) || (bool)$RCMAIL->config->get('check_all_folders');
+$check_all = $RCMAIL->action != 'refresh' || (bool)$RCMAIL->config->get('check_all_folders');
 
 // list of folders to check
 if ($check_all) {
@@ -101,7 +107,5 @@
         }
     }
 }
-
-$RCMAIL->plugins->exec_hook('keep_alive', array());
 
 $OUTPUT->send();
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 961a604..df83b03 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1846,6 +1846,7 @@
 
 // register action aliases
 $RCMAIL->register_action_map(array(
+    'refresh' => 'check_recent.inc',
     'preview' => 'show.inc',
     'print'   => 'show.inc',
     'moveto'  => 'move_del.inc',
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index 8bef2ff..876e027 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -237,6 +237,24 @@
       );
     }
 
+    if (!isset($no_override['refresh_interval'])) {
+      $field_id = 'rcmfd_refresh_interval';
+      $select_refresh_interval = new html_select(array('name' => '_refresh_interval', 'id' => $field_id));
+
+      $select_refresh_interval->add(rcube_label('never'), 0);
+      foreach (array(1, 3, 5, 10, 15, 30, 60) as $min) {
+        if (!$config['min_refresh_interval'] || $config['min_refresh_interval'] <= $min * 60) {
+          $label = rcube_label(array('name' => 'everynminutes', 'vars' => array('n' => $min)));
+          $select_refresh_interval->add($label, $min);
+        }
+      }
+
+      $blocks['main']['options']['refresh_interval'] = array(
+        'title' => html::label($field_id, Q(rcube_label('refreshinterval'))),
+        'content' => $select_refresh_interval->show($config['refresh_interval']/60),
+      );
+    }
+
     // show drop-down for available skins
     if (!isset($no_override['skin'])) {
       $skins = rcmail_get_skins();
@@ -370,23 +388,6 @@
         'content' => $input_pagesize->show($size ? $size : 50),
       );
     }
-
-    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' => 'everynminutes', 'vars' => array('n' => $min))), $min);
-        }
-
-      $blocks['new_message']['options']['keep_alive'] = array(
-        'title' => html::label($field_id, Q(rcube_label('keepalive'))),
-        'content' => $select_keep_alive->show($config['keep_alive']/60),
-      );
-    }
-
     if (!isset($no_override['check_all_folders'])) {
       $field_id = 'rcmfd_check_all_folders';
       $input_check_all = new html_checkbox(array('name' => '_check_all_folders', 'id' => $field_id, 'value' => 1));
diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc
index db7b134..5daab0d 100644
--- a/program/steps/settings/save_prefs.inc
+++ b/program/steps/settings/save_prefs.inc
@@ -33,7 +33,8 @@
       'date_format'  => isset($_POST['_date_format']) ? get_input_value('_date_format', RCUBE_INPUT_POST) : $CONFIG['date_format'],
       'time_format'  => isset($_POST['_time_format']) ? get_input_value('_time_format', RCUBE_INPUT_POST) : ($CONFIG['time_format'] ? $CONFIG['time_format'] : 'H:i'),
       'prettydate'   => isset($_POST['_pretty_date']) ? TRUE : FALSE,
-      'skin' 	     => isset($_POST['_skin']) ? get_input_value('_skin', RCUBE_INPUT_POST) : $CONFIG['skin'],
+      'refresh_interval' => isset($_POST['_refresh_interval']) ? intval($_POST['_refresh_interval'])*60 : $CONFIG['refresh_interval'],
+      'skin'         => isset($_POST['_skin']) ? get_input_value('_skin', RCUBE_INPUT_POST) : $CONFIG['skin'],
     );
 
     // compose derived date/time format strings
@@ -50,7 +51,6 @@
       'preview_pane_mark_read' => isset($_POST['_preview_pane_mark_read']) ? intval($_POST['_preview_pane_mark_read']) : $CONFIG['preview_pane_mark_read'],
       'autoexpand_threads'   => isset($_POST['_autoexpand_threads']) ? intval($_POST['_autoexpand_threads']) : 0,
       'mdn_requests'         => isset($_POST['_mdn_requests']) ? intval($_POST['_mdn_requests']) : 0,
-      'keep_alive'           => isset($_POST['_keep_alive']) ? intval($_POST['_keep_alive'])*60 : $CONFIG['keep_alive'],
       'check_all_folders'    => isset($_POST['_check_all_folders']) ? TRUE : FALSE,
       'mail_pagesize'        => is_numeric($_POST['_mail_pagesize']) ? max(2, intval($_POST['_mail_pagesize'])) : $CONFIG['mail_pagesize'],
     );
@@ -157,15 +157,15 @@
 
     $a_user_prefs['timezone'] = (string) $a_user_prefs['timezone'];
 
-  break;
-  case 'mailbox':
-
-    // 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 (isset($a_user_prefs['refresh_interval']) && !empty($CONFIG['min_refresh_interval'])) {
+      if ($a_user_prefs['refresh_interval'] > $CONFIG['min_refresh_interval']) {
+        $a_user_prefs['refresh_interval'] = $CONFIG['min_refresh_interval'];
+      }
     }
+
+    break;
+
+  case 'mailbox':
 
     // force min size
     if ($a_user_prefs['mail_pagesize'] < 1)
@@ -174,7 +174,8 @@
     if (isset($CONFIG['max_pagesize']) && ($a_user_prefs['mail_pagesize'] > $CONFIG['max_pagesize']))
       $a_user_prefs['mail_pagesize'] = (int) $CONFIG['max_pagesize'];
 
-  break;
+    break;
+
   case 'addressbook':
 
     // force min size
@@ -184,7 +185,8 @@
     if (isset($CONFIG['max_pagesize']) && ($a_user_prefs['addressbook_pagesize'] > $CONFIG['max_pagesize']))
       $a_user_prefs['addressbook_pagesize'] = (int) $CONFIG['max_pagesize'];
 
-  break;
+    break;
+
   case 'folders':
 
     // special handling for 'default_folders'
@@ -199,7 +201,7 @@
       }
     }
 
-  break;
+    break;
 }
 
 // Save preferences

--
Gitblit v1.9.1