Added cross-task 'refresh' request for system state updates

pull/45/merge
Aleksander Machniak 12 years ago
parent aa83596b0b
commit 77de23fa93

@ -1,6 +1,8 @@
CHANGELOG Roundcube Webmail
===========================
- Improved keep-alive action. Now the interval is based on session_lifetime
- Added cross-task 'refresh' request for system state updates
- Fix AREA links handling (#1488792)
- Better client-side timezone detection using the jsTimezoneDetect library (#1488725)
- Fix possible HTTP DoS on error in keep-alive requests (#1488782)

@ -249,7 +249,6 @@ $plugin = $RCMAIL->plugins->exec_hook('ready', array('task' => $RCMAIL->task, 'a
$RCMAIL->set_task($plugin['task']);
$RCMAIL->action = $plugin['action'];
// handle special actions
if ($RCMAIL->action == 'keep-alive') {
$OUTPUT->reset();
@ -282,7 +281,8 @@ while ($redirects < 5) {
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 {

@ -332,7 +332,7 @@ class rcmail extends rcube
$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;
}
@ -770,6 +770,7 @@ class rcmail extends rcube
}
}
/**
* Registers action aliases for current task
*
@ -784,6 +785,7 @@ class rcmail extends rcube
}
}
/**
* Returns current action filename
*
@ -798,6 +800,7 @@ class rcmail extends rcube
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.

@ -482,7 +482,8 @@ function rcube_webmail()
this.onloads[i]();
}
// start keep-alive interval
// start keep-alive and refresh intervals
this.start_refresh();
this.start_keepalive();
};
@ -880,10 +881,6 @@ function rcube_webmail()
this.show_message(this.env.first_uid);
break;
case 'checkmail':
this.check_for_recent(true);
break;
case 'compose':
url = {};
@ -2061,6 +2058,15 @@ function rcube_webmail()
}
};
// 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
this.filter_mailbox = function(filter)
{
@ -6125,7 +6131,7 @@ function rcube_webmail()
// 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
@ -6237,6 +6243,7 @@ function rcube_webmail()
}
break;
case 'refresh':
case 'check-recent':
case 'getunread':
case 'search':
@ -6469,13 +6476,25 @@ function rcube_webmail()
// starts interval for keep-alive signal
this.start_keepalive = function()
{
if (!this.env.session_lifetime || this.env.framed || this.task == 'login' || this.env.action == 'print')
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);
this._int = setInterval(function(){ ref.keep_alive(); }, this.env.session_lifetime * 0.5 * 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.keep_alive || 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.keep_alive * 1000);
};
// sends keep-alive signal
@ -6485,27 +6504,39 @@ function rcube_webmail()
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};
var params = {}, lock = this.set_busy(true, 'refreshing');
if (refresh) {
lock = this.set_busy(true, 'checkingmail');
url._refresh = 1;
}
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)
url._list = 1;
params._list = 1;
if (this.gui_objects.quotadisplay)
url._quota = 1;
params._quota = 1;
if (this.env.search_request)
url._search = this.env.search_request;
params._search = this.env.search_request;
this.http_request('check-recent', url, lock);
return params;
};

@ -37,6 +37,7 @@ $messages['invalidhost'] = 'Invalid server name.';
$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...';

@ -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) {
@ -102,6 +108,4 @@ foreach ($a_mailboxes as $mbox_name) {
}
}
$RCMAIL->plugins->exec_hook('keep_alive', array());
$OUTPUT->send();

@ -1810,6 +1810,7 @@ $OUTPUT->add_handlers(array(
// register action aliases
$RCMAIL->register_action_map(array(
'refresh' => 'check_recent.inc',
'preview' => 'show.inc',
'print' => 'show.inc',
'moveto' => 'move_del.inc',

Loading…
Cancel
Save