From 05da1577aaa51cef329849c495469903333c59f2 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 29 Aug 2013 09:20:33 +0200 Subject: Fix setting of Junk and NonJunk flags by markasjunk plugin (#1489285) Added possibility to register flag mappings by a plugin. --- CHANGELOG | 1 + plugins/markasjunk/markasjunk.php | 31 +++++++++++++----- plugins/markasjunk/package.xml | 7 ++-- program/lib/Roundcube/rcube_imap.php | 21 +++--------- program/lib/Roundcube/rcube_imap_generic.php | 49 +++++++++++++++++++--------- program/lib/Roundcube/rcube_storage.php | 2 +- 6 files changed, 65 insertions(+), 46 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 5965ee231..d5e5f906b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix setting of Junk and NonJunk flags by markasjunk plugin (#1489285) - Fix lack of Reply-To address in header of forwarded message body (#1489298) - Fix bugs when invoking contact creation form when read-only addressbook is selected (#1489296) - Fix identity selection on reply (#1489291) diff --git a/plugins/markasjunk/markasjunk.php b/plugins/markasjunk/markasjunk.php index 76b14c140..4448b506c 100644 --- a/plugins/markasjunk/markasjunk.php +++ b/plugins/markasjunk/markasjunk.php @@ -19,6 +19,7 @@ class markasjunk extends rcube_plugin $rcmail = rcmail::get_instance(); $this->register_action('plugin.markasjunk', array($this, 'request_action')); + $this->add_hook('storage_init', array($this, 'storage_init')); if ($rcmail->action == '' || $rcmail->action == 'show') { $skin_path = $this->local_skin_path(); @@ -38,24 +39,36 @@ class markasjunk extends rcube_plugin } } + function storage_init($args) + { + $flags = array( + 'JUNK' => 'Junk', + 'NONJUNK' => 'NonJunk', + ); + + // register message flags + $args['message_flags'] = array_merge((array)$args['message_flags'], $flags); + + return $args; + } + function request_action() { $this->add_texts('localization'); - $GLOBALS['IMAP_FLAGS']['JUNK'] = 'Junk'; - $GLOBALS['IMAP_FLAGS']['NONJUNK'] = 'NonJunk'; - $uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); - - $rcmail = rcmail::get_instance(); - $rcmail->storage->unset_flag($uids, 'NONJUNK'); - $rcmail->storage->set_flag($uids, 'JUNK'); - + + $rcmail = rcmail::get_instance(); + $storage = $rcmail->get_storage(); + + $storage->unset_flag($uids, 'NONJUNK'); + $storage->set_flag($uids, 'JUNK'); + if (($junk_mbox = $rcmail->config->get('junk_mbox')) && $mbox != $junk_mbox) { $rcmail->output->command('move_messages', $junk_mbox); } - + $rcmail->output->command('display_message', $this->gettext('reportedasjunk'), 'confirmation'); $rcmail->output->send(); } diff --git a/plugins/markasjunk/package.xml b/plugins/markasjunk/package.xml index a5b4bf92c..95597481a 100644 --- a/plugins/markasjunk/package.xml +++ b/plugins/markasjunk/package.xml @@ -13,11 +13,10 @@ roundcube@gmail.com yes - 2010-03-29 - + 2013-08-29 - 1.1 - 1.1 + 1.2 + 1.2 stable diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index c5346c8aa..689a6266d 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -70,7 +70,7 @@ class rcube_imap extends rcube_storage protected $search_sort_field = ''; protected $search_threads = false; protected $search_sorted = false; - protected $options = array('auth_method' => 'check'); + protected $options = array('auth_type' => 'check'); protected $caching = false; protected $messages_caching = false; protected $threading = false; @@ -391,10 +391,10 @@ class rcube_imap extends rcube_storage public function check_permflag($flag) { $flag = strtoupper($flag); - $imap_flag = $this->conn->flags[$flag]; $perm_flags = $this->get_permflags($this->folder); + $imap_flag = $this->conn->flags[$flag]; - return in_array_nocase($imap_flag, $perm_flags); + return $imap_flag && !empty($perm_flags) && in_array_nocase($imap_flag, $perm_flags); } @@ -410,17 +410,7 @@ class rcube_imap extends rcube_storage if (!strlen($folder)) { return array(); } -/* - Checking PERMANENTFLAGS is rather rare, so we disable caching of it - Re-think when we'll use it for more than only MDNSENT flag - $cache_key = 'mailboxes.permanentflags.' . $folder; - $permflags = $this->get_cache($cache_key); - - if ($permflags !== null) { - return explode(' ', $permflags); - } -*/ if (!$this->check_connection()) { return array(); } @@ -435,10 +425,7 @@ class rcube_imap extends rcube_storage if (!is_array($permflags)) { $permflags = array(); } -/* - // Store permflags as string to limit cached object size - $this->update_cache($cache_key, implode(' ', $permflags)); -*/ + return $permflags; } diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index e1193749b..bce4cd4e2 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -704,22 +704,11 @@ class rcube_imap_generic */ function connect($host, $user, $password, $options=null) { - // set options - if (is_array($options)) { - $this->prefs = $options; - } - // set auth method - if (!empty($this->prefs['auth_type'])) { - $auth_method = strtoupper($this->prefs['auth_type']); - } else { - $auth_method = 'CHECK'; - } + // configure + $this->set_prefs($options); - if (!empty($this->prefs['disabled_caps'])) { - $this->prefs['disabled_caps'] = array_map('strtoupper', (array)$this->prefs['disabled_caps']); - } - - $result = false; + $auth_method = $this->prefs['auth_type']; + $result = false; // initialize connection $this->error = ''; @@ -895,6 +884,36 @@ class rcube_imap_generic return false; } + /** + * Initializes environment + */ + protected function set_prefs($prefs) + { + // set preferences + if (is_array($prefs)) { + $this->prefs = $prefs; + } + + // set auth method + if (!empty($this->prefs['auth_type'])) { + $this->prefs['auth_type'] = strtoupper($this->prefs['auth_type']); + } + else { + $this->prefs['auth_type'] = 'CHECK'; + } + + // disabled capabilities + if (!empty($this->prefs['disabled_caps'])) { + $this->prefs['disabled_caps'] = array_map('strtoupper', (array)$this->prefs['disabled_caps']); + } + + // additional message flags + if (!empty($this->prefs['message_flags'])) { + $this->flags = array_merge($this->flags, $this->prefs['message_flags']); + unset($this->prefs['message_flags']); + } + } + /** * Checks connection status * diff --git a/program/lib/Roundcube/rcube_storage.php b/program/lib/Roundcube/rcube_storage.php index de8334551..e697b2c73 100644 --- a/program/lib/Roundcube/rcube_storage.php +++ b/program/lib/Roundcube/rcube_storage.php @@ -39,7 +39,7 @@ abstract class rcube_storage protected $default_charset = 'ISO-8859-1'; protected $default_folders = array('INBOX'); protected $search_set; - protected $options = array('auth_method' => 'check'); + protected $options = array('auth_type' => 'check'); protected $page_size = 10; protected $threading = false; -- cgit v1.2.3