Merge branch 'keep-alive'
Conflicts:
CHANGELOG
| | |
| | | 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 |
| | |
| | | $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 |
| | |
| | | // 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 |
| | |
| | | // 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; |
| | |
| | | $RCMAIL->set_task($plugin['task']); |
| | | $RCMAIL->action = $plugin['action']; |
| | | |
| | | |
| | | // handle special actions |
| | | if ($RCMAIL->action == 'keep-alive') { |
| | | $OUTPUT->reset(); |
| | |
| | | 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 { |
| | |
| | | } |
| | | } |
| | | |
| | | if ($RCMAIL->action == 'refresh') { |
| | | $RCMAIL->plugins->exec_hook('refresh', array()); |
| | | } |
| | | |
| | | // parse main template (default) |
| | | $OUTPUT->send($RCMAIL->task); |
| | |
| | | } |
| | | } |
| | | |
| | | 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) { |
| | |
| | | // 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)); |
| | |
| | | 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'; |
| | |
| | | $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; |
| | | } |
| | |
| | | // 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); |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Registers action aliases for current task |
| | | * |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Returns current action filename |
| | | * |
| | |
| | | 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. |
| | |
| | | $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')); |
| | | } |
| | | |
| | | |
| | |
| | | 'mail_pagesize' => 'pagesize', |
| | | 'addressbook_pagesize' => 'pagesize', |
| | | 'reply_mode' => 'top_posting', |
| | | 'refresh_interval' => 'keep_alive', |
| | | 'min_refresh_interval' => 'min_keep_alive', |
| | | ); |
| | | |
| | | |
| | |
| | | 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); |
| | |
| | | private $secret = ''; |
| | | private $ip_check = false; |
| | | private $logging = false; |
| | | private $keep_alive = 0; |
| | | private $memcache; |
| | | |
| | | /** |
| | |
| | | $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 |
| | |
| | | return $this->ip; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Setter for cookie encryption secret |
| | | */ |
| | |
| | | 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 = './'; |
| | |
| | | this.onloads[i](); |
| | | } |
| | | |
| | | // start keep-alive interval |
| | | // start keep-alive and refresh intervals |
| | | this.start_refresh(); |
| | | this.start_keepalive(); |
| | | }; |
| | | |
| | |
| | | this.show_message(this.env.first_uid); |
| | | break; |
| | | |
| | | case 'checkmail': |
| | | this.check_for_recent(true); |
| | | break; |
| | | |
| | | case 'compose': |
| | | url = {}; |
| | | |
| | |
| | | this.auto_save_start(); |
| | | break; |
| | | } |
| | | |
| | | // re-set keep-alive timeout |
| | | this.start_keepalive(); |
| | | |
| | | this.submit_messageform(true); |
| | | break; |
| | |
| | | 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 |
| | |
| | | $('<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 |
| | |
| | | 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 |
| | |
| | | // 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 |
| | |
| | | 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 |
| | |
| | | } |
| | | break; |
| | | |
| | | case 'refresh': |
| | | case 'check-recent': |
| | | case 'getunread': |
| | | case 'search': |
| | |
| | | |
| | | this.triggerEvent('responseafter', {response: response}); |
| | | this.triggerEvent('responseafter'+response.action, {response: response}); |
| | | |
| | | // reset keep-alive interval |
| | | this.start_keepalive(); |
| | | }; |
| | | |
| | | // handle HTTP request errors |
| | |
| | | // 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 |
| | |
| | | } |
| | | }; |
| | | |
| | | |
| | | // 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 |
| | |
| | | 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; |
| | | }; |
| | | |
| | | |
| | |
| | | $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'; |
| | |
| | | $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...'; |
| | |
| | | +-----------------------------------------------------------------------+ |
| | | */ |
| | | |
| | | // 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) { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | $RCMAIL->plugins->exec_hook('keep_alive', array()); |
| | | |
| | | $OUTPUT->send(); |
| | |
| | | |
| | | // register action aliases |
| | | $RCMAIL->register_action_map(array( |
| | | 'refresh' => 'check_recent.inc', |
| | | 'preview' => 'show.inc', |
| | | 'print' => 'show.inc', |
| | | 'moveto' => 'move_del.inc', |
| | |
| | | ); |
| | | } |
| | | |
| | | 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(); |
| | |
| | | '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)); |
| | |
| | | '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 |
| | |
| | | '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'], |
| | | ); |
| | |
| | | |
| | | $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) |
| | |
| | | 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 |
| | |
| | | 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' |
| | |
| | | } |
| | | } |
| | | |
| | | break; |
| | | break; |
| | | } |
| | | |
| | | // Save preferences |