corbosman
2015-01-06 de89d46be24f6b3454a0c0e62973af947b22ff29
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.
2 files modified
55 ■■■■ changed files
program/include/rcmail.php 8 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_plugin_api.php 47 ●●●● patch | view | raw | blame | history
program/include/rcmail.php
@@ -93,6 +93,10 @@
            $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 @@
            $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'));
    }
    /**
program/lib/Roundcube/rcube_plugin_api.php
@@ -34,6 +34,8 @@
    public $dir;
    public $url = 'plugins/';
    public $task = '';
    public $initialized = false;
    public $output;
    public $handlers              = array();
    public $allowed_prefs         = array();
@@ -117,12 +119,20 @@
    {
        $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,13 +213,21 @@
                // 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']))
                    ) {
                        $plugin->init();
                        $this->plugins[$plugin_name] = $plugin;
                    // 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;
                    if (!empty($plugin->allowed_prefs)) {
                        $this->allowed_prefs = array_merge($this->allowed_prefs, $plugin->allowed_prefs);
@@ -235,6 +253,19 @@
    }
    /**
     * 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
     *