From de89d46be24f6b3454a0c0e62973af947b22ff29 Mon Sep 17 00:00:00 2001 From: corbosman Date: Tue, 6 Jan 2015 21:48:39 +0100 Subject: 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. --- program/lib/Roundcube/rcube_plugin_api.php | 45 +++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index c74162619..ba5dffefd 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -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 -- cgit v1.2.3