From 50b04366ee7472272e2576d17c609e1d26345221 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Thu, 19 Feb 2015 04:25:38 -0500 Subject: [PATCH] Merge branch 'master' of github.com:roundcube/roundcubemail --- CHANGELOG | 2 program/include/rcmail.php | 8 +- plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php | 6 +- plugins/managesieve/Changelog | 2 program/lib/Roundcube/rcube_plugin_api.php | 47 +++++++++++++-- plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php | 98 ++++++++++++++++++-------------- program/steps/mail/sendmail.inc | 14 +++- 7 files changed, 115 insertions(+), 62 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6b67e4f..c53ab10 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,8 @@ - Plugin API: Add special onload() method to execute plugin actions before startup (session and GUI initialization) - Add possibility to print contact information (of a single contact) - Fix refreshing of drafts list when sending a message which was saved in meantime (#1490238) +- Fix saving/sending emoticon images when assets_dir is set +- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet - Fix setting max packet size for DB caches and check packet size also in shared cache RELEASE 1.1.0 diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog index 5255d5b..8ce63c8 100644 --- a/plugins/managesieve/Changelog +++ b/plugins/managesieve/Changelog @@ -1,3 +1,5 @@ +- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet + * version 8.2 [2015-01-14] ----------------------------------------------------------- - Fix bug where actions without if/elseif/else in sieve scripts were skipped diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php index d412e17..69ae4b8 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php @@ -2344,12 +2344,12 @@ */ protected function init_script() { - $this->script = $this->sieve->script->as_array(); - - if (!$this->script) { + if (!$this->sieve->script) { return; } + $this->script = $this->sieve->script->as_array(); + $headers = array(); $exceptions = array('date', 'currentdate', 'size', 'body'); diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php index 28fd801..8d86500 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php @@ -562,60 +562,72 @@ $this->script_name = 'roundcube'; } - $this->script = array($rule); - $script_active = false; + // use default script contents + if (!$this->rc->config->get('managesieve_kolab_master')) { + $script_file = $this->rc->config->get('managesieve_default'); + if ($script_file && is_readable($script_file)) { + $content = file_get_contents($script_file); + } + } + + // create and load script + if ($this->sieve->save_script($this->script_name, $content)) { + $this->sieve->load($this->script_name); + } } - // if script exists - else { - $script_active = in_array($this->script_name, $this->active); - // re-order rules if needed - if (isset($rule['after']) && $rule['after'] !== '') { - // reset original vacation rule - if (isset($this->vacation['idx'])) { - $this->script[$this->vacation['idx']] = null; - } + $script_active = in_array($this->script_name, $this->active); - // add at target position - if ($rule['after'] >= count($this->script) - 1) { - $this->script[] = $rule; - } - else { - $script = array(); - - foreach ($this->script as $idx => $r) { - if ($r) { - $script[] = $r; - } - - if ($idx == $rule['after']) { - $script[] = $rule; - } - } - - $this->script = $script; - } - - $this->script = array_values(array_filter($this->script)); + // re-order rules if needed + if (isset($rule['after']) && $rule['after'] !== '') { + // reset original vacation rule + if (isset($this->vacation['idx'])) { + $this->script[$this->vacation['idx']] = null; } - // update original vacation rule if it exists - else if (isset($this->vacation['idx'])) { - $this->script[$this->vacation['idx']] = $rule; + + // add at target position + if ($rule['after'] >= count($this->script) - 1) { + $this->script[] = $rule; } - // otherwise put vacation rule on top else { - array_unshift($this->script, $rule); - } + $script = array(); - // if the script was not active, we need to de-activate - // all rules except the vacation rule, but only if it is not disabled - if (!$script_active && !$rule['disabled']) { foreach ($this->script as $idx => $r) { - if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') { - $this->script[$idx]['disabled'] = true; + if ($r) { + $script[] = $r; + } + + if ($idx == $rule['after']) { + $script[] = $rule; } } + + $this->script = $script; } + + $this->script = array_values(array_filter($this->script)); + } + // update original vacation rule if it exists + else if (isset($this->vacation['idx'])) { + $this->script[$this->vacation['idx']] = $rule; + } + // otherwise put vacation rule on top + else { + array_unshift($this->script, $rule); + } + + // if the script was not active, we need to de-activate + // all rules except the vacation rule, but only if it is not disabled + if (!$script_active && !$rule['disabled']) { + foreach ($this->script as $idx => $r) { + if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') { + $this->script[$idx]['disabled'] = true; + } + } + } + + if (!$this->sieve->script) { + return false; } $this->sieve->script->content = $this->script; diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 2327109..6e74560 100644 --- a/program/include/rcmail.php +++ b/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')); } /** diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index 6b0fe2f..8fd3253 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/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(); @@ -85,12 +87,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; } /** @@ -171,13 +181,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); @@ -203,6 +221,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 * diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 715ee32..5843de4 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -765,8 +765,10 @@ // remove any null-byte characters before parsing $body = preg_replace('/\x00/', '', $body); - $searchstr = 'program/js/tinymce/plugins/emoticons/img/'; - $offset = 0; + $searchstr = 'program/js/tinymce/plugins/emoticons/img/'; + $assets_dir = $RCMAIL->config->get('assets_dir'); + $path = ($assets_dir ?: INSTALL_PATH) . '/' . $searchstr; + $offset = 0; // keep track of added images, so they're only added once $included_images = array(); @@ -779,12 +781,14 @@ // sanitize image name so resulting attachment doesn't leave images dir $image_name = preg_replace('/[^a-zA-Z0-9_\.\-]/i', '', $image_name); - $img_file = INSTALL_PATH . '/' . $searchstr . $image_name; + $img_file = $path . $image_name; - if (! in_array($image_name, $included_images)) { + if (!in_array($image_name, $included_images)) { // add the image to the MIME message - if (!$mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name)) { + $res = $mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name); + if (PEAR::isError($res)) { $RCMAIL->output->show_message("emoticonerror", 'error'); + continue; } array_push($included_images, $image_name); -- Gitblit v1.9.1