3
* Converts a user's preferences from the "old" IMP 3.x or IMP HEAD
4
* (pre 4.x) filter data structure to the "new" Ingo 2.x structure.
6
* This script is untested so use at your own risk.
8
* Usage: php convert_filters.php < filename
9
* Filename is a file that contains a list of users, one username per line.
10
* The username should be the same as how the preferences are stored in
11
* the preferences backend (e.g. usernames may have to be in the form
14
* This script is written to convert SQL databases ONLY.
15
* There is no guarantee it will work on other preference backends (e.g. LDAP).
17
* $Horde: ingo/scripts/convert_imp_filters.php,v 1.18.10.7 2006/01/31 20:00:36 jan Exp $
19
* Copyright 2003-2006 Michael Slusarz <slusarz@bigworm.colorado.edu>
21
* See the enclosed file LICENSE for license information (ASL). If you
22
* did not receive this file, see http://www.horde.org/licenses/asl.php.
25
@define('AUTH_HANDLER', true);
26
@define('HORDE_BASE', dirname(__FILE__) . '/../..');
27
@define('INGO_BASE', dirname(__FILE__) . '/..');
29
// Do CLI checks and environment setup first.
30
require_once HORDE_BASE . '/lib/core.php';
31
require_once 'Horde/CLI.php';
33
// Make sure no one runs this from the web.
34
if (!Horde_CLI::runningFromCLI()) {
35
exit("Must be run from the command line\n");
38
// Load the CLI environment - make sure there's no time limit, init
39
// some variables, etc.
42
/* Initialize the needed libraries. */
43
require_once INGO_BASE . '/lib/base.php';
45
/* Update each user. */
46
while (!feof(STDIN)) {
51
echo "Converting filters for user: $user\n";
53
$userprefs = &Prefs::singleton($conf['prefs']['driver'],
54
'imp', $user, '', null, false);
55
$userprefs->retrieve();
56
$oldfilters = @unserialize($userprefs->getValue('filters'));
58
if (!is_array($oldfilters)) {
59
echo " Nothing to convert\n";
63
/* Load the user's preferences. */
64
$prefs = &Prefs::factory($conf['prefs']['driver'], 'ingo', $user, null, null, false);
67
/* Merge with existing ingo filters. */
68
$filters = &$ingo_storage->retrieve(INGO_STORAGE_ACTION_FILTERS, false);
70
/* Make sure special rules exist */
73
$filterlist = $filters->getFilterList();
74
if (!empty($filterlist)) {
75
foreach ($filters->getFilterList() as $rule) {
76
$located[$rule['action']] = true;
80
if (!isset($located[INGO_STORAGE_ACTION_BLACKLIST])) {
81
$filters->addRule(array('name' => "Blacklist", 'action' => INGO_STORAGE_ACTION_BLACKLIST), false);
82
echo " Added Blacklist Rule\n";
86
if (!isset($located[INGO_STORAGE_ACTION_WHITELIST])) {
87
$filters->addRule(array('name' => "Whitelist", 'action' => INGO_STORAGE_ACTION_WHITELIST), false);
88
echo " Added Whitelist Rule\n";
92
if (!isset($located[INGO_STORAGE_ACTION_VACATION])) {
93
$filters->addRule(array('name' => "Vacation", 'action' => INGO_STORAGE_ACTION_VACATION), false);
94
echo " Added Vacation Rule\n";
98
if (!isset($located[INGO_STORAGE_ACTION_FORWARD])) {
99
$filters->addRule(array('name' => "Forward", 'action' => INGO_STORAGE_ACTION_FORWARD), false);
100
echo " Added Forward Rule\n";
105
echo " Importing " . $rule_count . " existing ingo filters\n";
108
/* IMP HEAD filter style
113
* [BLACKLISTED ADDRESSES]
118
* [*Filter number*] => Array
124
* [fld] => Array(*Field name(s)*)
125
* [txt] => Array(*Text to match*)
128
* [act] => *Action code*
129
* [fol] => *Folder name to move to*
134
if (isset($oldfilters['bl'])) {
135
if (!empty($oldfilters['bl'])) {
136
$ob = &new Ingo_Storage_blacklist();
137
$ob->setBlacklist($oldfilters['bl']);
138
$ingo_storage->store($ob);
139
echo " Converted Blacklist\n";
142
if (!empty($oldfilters['rule'])) {
143
foreach ($oldfilters['rule'] as $val) {
146
'name' => 'Converted IMP Filter',
147
'combine' => INGO_STORAGE_COMBINE_ALL,
150
'conditions' => array(),
151
'action-value' => null
154
/* IMP_FILTER_DELETE = 1, IMP_FILTER_MOVE = 2,
155
IMP_FILTER_NUKE = 3 */
156
if ($val['act'] == 1) {
157
$curr['action'] = INGO_STORAGE_ACTION_MOVE;
158
$curr['combine'] .= ' - DELETE';
159
} elseif ($val['act'] == 2) {
160
$curr['action'] = INGO_STORAGE_ACTION_MOVE;
161
$curr['combine'] .= ' - MOVE';
162
} elseif ($val['act'] == 3) {
163
$curr['action'] = INGO_STORAGE_ACTION_DISCARD;
164
$curr['combine'] .= ' - NUKE';
167
foreach ($val['flt'] as $val2) {
168
foreach ($val2['fld'] as $key => $field) {
169
$curr['conditions'][] = Array(
170
'field' => ucfirst($field),
171
'match' => 'contains',
172
'value' => $val2['txt'][$key],
174
'type' => INGO_STORAGE_TYPE_HEADER
179
if (isset($val['fol'])) {
180
$curr['action-value'] = $val['fol'];
184
$filters->addRule($curr);
188
echo " Converted $count Filters\n";
189
$ingo_storage->store($filters);
192
/* IMP 3.x filter style
197
* [action] => 'move' -or- 'delete'
198
* [folder] => folder name (may not exist)
211
if (!empty($oldfilters)) {
212
foreach ($oldfilters as $rule) {
213
if (($rule['action'] == 'delete') &&
214
(count($rule['fields']) == 1) &&
215
($rule['fields'][0] == 'from')) {
216
if (!in_array($rule['text'], $bl_array)) {
217
$bl_array[] = $rule['text'];
222
'name' => 'Converted IMP Filter',
223
'combine' => INGO_STORAGE_COMBINE_ANY,
226
'conditions' => array(),
227
'action-value' => null
230
if ($rule['action'] == 'move') {
231
$curr['action'] = INGO_STORAGE_ACTION_MOVE;
232
$curr['name'] .= ' - MOVE';
233
} elseif ($rule['action'] == 'delete') {
234
$curr['action'] = INGO_STORAGE_ACTION_DISCARD;
235
$curr['name'] .= ' - DISCARD';
238
if (isset($rule['folder'])) {
239
$curr['action-value'] = $rule['folder'];
242
foreach ($rule['fields'] as $key => $val) {
243
$curr['conditions'][] = Array(
244
'field' => ucfirst($val),
245
'match' => 'contains',
246
'value' => $rule['text'],
248
'type' => INGO_STORAGE_TYPE_HEADER
253
$filters->addRule($curr);
258
$ob = &new Ingo_Storage_blacklist();
259
$ob->setBlacklist($bl_array);
260
$ingo_storage->store($ob);
261
echo " Converted " . count($bl_array) . " Blacklist Entries\n";
263
$ingo_storage->store($filters);
264
echo " Converted $count Filters\n";