From 6bb67b4f489bb28586deb42f8d30225430e07721 Mon Sep 17 00:00:00 2001 From: Jan Schneider Date: Wed, 23 Dec 2009 15:33:26 +0100 Subject: [PATCH] Re-add lost upgrade script. --- ingo/scripts/upgrades/convert_imp_filters.php | 272 ++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100755 ingo/scripts/upgrades/convert_imp_filters.php diff --git a/ingo/scripts/upgrades/convert_imp_filters.php b/ingo/scripts/upgrades/convert_imp_filters.php new file mode 100755 index 000000000..2497ac312 --- /dev/null +++ b/ingo/scripts/upgrades/convert_imp_filters.php @@ -0,0 +1,272 @@ +#!/usr/bin/php + + */ + +/* Do CLI checks and environment setup first. */ +require_once dirname(__FILE__) . '/../../../lib/core.php'; + +/* Make sure no one runs this from the web. */ +if (!Horde_Cli::runningFromCLI()) { + exit("Must be run from the command line\n"); +} + +/* Load the CLI environment - make sure there's no time limit, init some + * variables, etc. */ +Horde_Cli::init(); +$cli = Horde_Cli::singleton(); + +/* Initialize the needed libraries. */ +$ingo_authentication = 'none'; +require_once dirname(__FILE__) . '/../../lib/base.php'; + +/* Update each user. */ +while (!feof(STDIN)) { + $user = fgets(STDIN); + $count = 0; + $user = trim($user); + if (empty($user)) { + continue; + } + + echo "Converting filters for user: $user\n"; + + Horde_Auth::setAuth($user, array()); + $_SESSION['ingo']['current_share'] = ':' . $user; + + $userprefs = Horde_Prefs::singleton($conf['prefs']['driver'], + 'imp', $user, '', null, false); + $userprefs->retrieve(); + $oldfilters = @unserialize($userprefs->getValue('filters')); + + if (!is_array($oldfilters)) { + echo " Nothing to convert\n"; + continue; + } + + /* Load the user's preferences. */ + $prefs = Horde_Prefs::factory($conf['prefs']['driver'], 'ingo', $user, null, null, false); + $prefs->retrieve(); + + /* Merge with existing ingo filters. */ + $filters = $ingo_storage->retrieve(Ingo_Storage::ACTION_FILTERS, false); + + /* Make sure special rules exist */ + $rule_count = 0; + $located = array(); + $filterlist = $filters->getFilterList(); + if (!empty($filterlist)) { + foreach ($filters->getFilterList() as $rule) { + $located[$rule['action']] = true; + } + } + + if (!isset($located[Ingo_Storage::ACTION_BLACKLIST])) { + $filters->addRule(array('name' => "Blacklist", 'action' => Ingo_Storage::ACTION_BLACKLIST), false); + echo " Added Blacklist Rule\n"; + $rule_count++; + } + + if (!isset($located[Ingo_Storage::ACTION_WHITELIST])) { + $filters->addRule(array('name' => "Whitelist", 'action' => Ingo_Storage::ACTION_WHITELIST), false); + echo " Added Whitelist Rule\n"; + $rule_count++; + } + + if (!isset($located[Ingo_Storage::ACTION_VACATION])) { + $filters->addRule(array('name' => "Vacation", 'action' => Ingo_Storage::ACTION_VACATION), false); + echo " Added Vacation Rule\n"; + $rule_count++; + } + + if (!isset($located[Ingo_Storage::ACTION_FORWARD])) { + $filters->addRule(array('name' => "Forward", 'action' => Ingo_Storage::ACTION_FORWARD), false); + echo " Added Forward Rule\n"; + $rule_count++; + } + + if ($rule_count) { + echo " Importing " . $rule_count . " existing ingo filters\n"; + } + + /* IMP HEAD filter style + * Array + * ( + * [bl] => Array + * ( + * [BLACKLISTED ADDRESSES] + * ), + * + * [rule] => Array + * ( + * [*Filter number*] => Array + * ( + * [flt] => Array + * ( + * [] => Array + * ( + * [fld] => Array(*Field name(s)*) + * [txt] => Array(*Text to match*) + * ) + * ) + * [act] => *Action code* + * [fol] => *Folder name to move to* + * ) + * ) + * ) + */ + if (isset($oldfilters['bl'])) { + if (!empty($oldfilters['bl'])) { + $ob = new Ingo_Storage_blacklist(); + $ob->setBlacklist($oldfilters['bl']); + $ingo_storage->store($ob); + echo " Converted Blacklist\n"; + } + + if (!empty($oldfilters['rule'])) { + foreach ($oldfilters['rule'] as $val) { + $curr = array( + 'action' => 0, + 'name' => 'Converted IMP Filter', + 'combine' => Ingo_Storage::COMBINE_ALL, + 'stop' => false, + 'flags' => 0, + 'conditions' => array(), + 'action-value' => null + ); + + /* IMP_FILTER_DELETE = 1, IMP_FILTER_MOVE = 2, + IMP_FILTER_NUKE = 3 */ + if ($val['act'] == 1) { + $curr['action'] = Ingo_Storage::ACTION_MOVE; + $curr['combine'] .= ' - DELETE'; + } elseif ($val['act'] == 2) { + $curr['action'] = Ingo_Storage::ACTION_MOVE; + $curr['combine'] .= ' - MOVE'; + } elseif ($val['act'] == 3) { + $curr['action'] = Ingo_Storage::ACTION_DISCARD; + $curr['combine'] .= ' - NUKE'; + } + + foreach ($val['flt'] as $val2) { + foreach ($val2['fld'] as $key => $field) { + $curr['conditions'][] = Array( + 'field' => ucfirst($field), + 'match' => 'contains', + 'value' => $val2['txt'][$key], + 'case' => false, + 'type' => Ingo_Storage::TYPE_HEADER + ); + } + } + + if (isset($val['fol'])) { + $curr['action-value'] = $val['fol']; + } + + $count++; + $filters->addRule($curr); + } + } + + echo " Converted $count Filters\n"; + $ingo_storage->store($filters); + } + + /* IMP 3.x filter style + * Array + * ( + * [#] => Array + * ( + * [action] => 'move' -or- 'delete' + * [folder] => folder name (may not exist) + * [fields] => Array + * ( + * ) + * [text] => Array + * ( + * ) + * ) + * ) + */ + else { + $bl_array = array(); + + if (!empty($oldfilters)) { + foreach ($oldfilters as $rule) { + if (($rule['action'] == 'delete') && + (count($rule['fields']) == 1) && + ($rule['fields'][0] == 'from')) { + if (!in_array($rule['text'], $bl_array)) { + $bl_array[] = $rule['text']; + } + } else { + $curr = array( + 'action' => 0, + 'name' => 'Converted IMP Filter', + 'combine' => Ingo_Storage::COMBINE_ANY, + 'stop' => false, + 'flags' => 0, + 'conditions' => array(), + 'action-value' => null + ); + + if ($rule['action'] == 'move') { + $curr['action'] = Ingo_Storage::ACTION_MOVE; + $curr['name'] .= ' - MOVE'; + } elseif ($rule['action'] == 'delete') { + $curr['action'] = Ingo_Storage::ACTION_DISCARD; + $curr['name'] .= ' - DISCARD'; + } + + if (isset($rule['folder'])) { + $curr['action-value'] = $rule['folder']; + } + + foreach ($rule['fields'] as $key => $val) { + $curr['conditions'][] = Array( + 'field' => ucfirst($val), + 'match' => 'contains', + 'value' => $rule['text'], + 'case' => false, + 'type' => Ingo_Storage::TYPE_HEADER + ); + } + + $count++; + $filters->addRule($curr); + } + } + } + + $ob = new Ingo_Storage_blacklist(); + $ob->setBlacklist($bl_array); + $ingo_storage->store($ob); + echo " Converted " . count($bl_array) . " Blacklist Entries\n"; + + $ingo_storage->store($filters); + echo " Converted $count Filters\n"; + + $prefs->store(); + } +} -- 2.11.0