Load plugins before sessions have started

Move the plugin loading phase to before sessions have started allowing plugins to add session drivers.  Plugins that want to use this should define an "onload" method in their plugins. This method does not have access to variables like $task as they are not yet initialised at that time.
pull/259/head
corbosman 10 years ago
parent fe653e3122
commit de89d46be2

@ -93,6 +93,10 @@ class rcmail extends rcube
$this->filename = $basename;
}
// load all configured plugins
$this->plugins->load_plugins((array)$this->config->get('plugins', array()),
array('filesystem_attachments', 'jqueryui'));
// start session
$this->session_init();
@ -124,10 +128,8 @@ class rcmail extends rcube
$GLOBALS['OUTPUT'] = $this->load_gui(!empty($_REQUEST['_framed']));
}
// load plugins
// run init method on all the plugins
$this->plugins->init($this, $this->task);
$this->plugins->load_plugins((array)$this->config->get('plugins', array()),
array('filesystem_attachments', 'jqueryui'));
}
/**

@ -34,6 +34,8 @@ class rcube_plugin_api
public $dir;
public $url = 'plugins/';
public $task = '';
public $initialized = false;
public $output;
public $handlers = array();
public $allowed_prefs = array();
@ -117,12 +119,20 @@ class rcube_plugin_api
{
$this->task = $task;
$this->output = $app->output;
// register an internal hook
$this->register_hook('template_container', array($this, 'template_container_hook'));
// maybe also register a shudown function which triggers
// shutdown functions of all plugin objects
foreach ($this->plugins as $plugin) {
// ... task, request type and framed mode
if (!$this->filter($plugin)) {
$plugin->init();
}
}
// we have finished initializing all plugins
$this->initialized = true;
}
/**
@ -203,14 +213,22 @@ class rcube_plugin_api
// check inheritance...
if (is_subclass_of($plugin, 'rcube_plugin')) {
// ... task, request type and framed mode
if (($force || !$plugin->task || preg_match('/^('.$plugin->task.')$/i', $this->task))
&& (!$plugin->noajax || (is_object($this->output) && $this->output->type == 'html'))
&& (!$plugin->noframe || empty($_REQUEST['_framed']))
) {
// call onload method on plugin if it exists.
// this is useful if you want to be called early in the boot process
if (method_exists($plugin, 'onload')) {
$plugin->onload();
}
// init a plugin only if $force is set or if we're called after initialization
if (($force || $this->initialized)
&& !$this->filter($plugin))
{
$plugin->init();
$this->plugins[$plugin_name] = $plugin;
}
$this->plugins[$plugin_name] = $plugin;
if (!empty($plugin->allowed_prefs)) {
$this->allowed_prefs = array_merge($this->allowed_prefs, $plugin->allowed_prefs);
}
@ -234,6 +252,19 @@ class rcube_plugin_api
return false;
}
/**
* check if we should prevent this plugin from initialising
*
* @param $plugin
* @return bool
*/
private function filter($plugin)
{
return (($plugin->noajax && !(is_object($this->output) && $this->output->type == 'html') )
|| ($plugin->task && !preg_match('/^('.$plugin->task.')$/i', $this->task))
|| ($plugin->noframe && !empty($_REQUEST['_framed']))) ? true : false;
}
/**
* Get information about a specific plugin.
* This is either provided my a plugin's info() method or extracted from a package.xml or a composer.json file

Loading…
Cancel
Save