File: upgradelists.php

package info (click to toggle)
turba2 2.2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 7,332 kB
  • ctags: 2,927
  • sloc: php: 11,046; xml: 1,690; sql: 507; makefile: 62; perl: 17; sh: 1
file content (142 lines) | stat: -rw-r--r-- 4,907 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
/**
 * Maintenance task for upgrading contact lists after upgrading to Turba 2.2
 *
 * $Horde: turba/lib/Maintenance/Task/upgradelists.php,v 1.6.2.3 2008/06/09 03:28:08 chuck Exp $
 *
 * @author Michael J. Rubinsky <mrubinsk@horde.org>
 * @package Turba
 * @since Turba 2.2
 */

class Maintenance_Task_Turba_upgradelists {

    /**
     * Holds an array of Horde_Share_Object objects.
     *
     * @var array
     */
    var $_shares;

    /**
     * Perform all functions for this task.
     *
     * @return mixed True | PEAR_Error
     */
    function doMaintenance()
    {
        if (!empty($_SESSION['turba']['has_share'])) {
            $criteria = array('__type' => 'Group');
            $sources = array_keys($GLOBALS['cfgSources']);
            foreach ($sources as $sourcekey) {
                $driver = &Turba_Driver::singleton($sourcekey);
                $lists = $driver->search($criteria);
                if (is_a($lists, 'PEAR_Error')) {
                    return $lists;
                }
                $cnt = $lists->count();
                for ($j = 0; $j < $cnt; ++$j) {
                    $list = $lists->next();
                    $attributes = $list->getAttributes();
                    $members = @unserialize($attributes['__members']);
                    if (is_array($members) && !empty($members[0])) {
                        $c = count($members);
                        for ($i = 0; $i < $c; ++$i) {
                            if (substr_count($members[$i], ':') == 2) {
                                preg_match('/^([a-zA-Z0-9]+:[a-zA-Z0-9]+)(:[a-zA-Z0-9]+)$/', $members[$i], $matches);
                                $source = $matches[1];
                                $contact_key = substr($matches[2], 1);
                            } elseif (substr_count($members[$i], ':') == 1) {
                                list($source, $contact_key) = explode(':', $members[$i]);
                            } else {
                                break;
                            }
                            $source = $this->_updateShareName($source);
                            $members[$i] = $source . ':' . $contact_key;
                        }
                        $list->setValue('__members', serialize($members));
                        $list->store();
                    }
                }
            }
        }
        return true;

    }

    /**
     * Helper function to update a 'legacy' share name
     * to the new flattened share style.
     */
    function _updateShareName($book)
    {
        static $cache = array();

        // No sense going through all the logic if we know we're empty.
        if (empty($book)) {
            return $book;
        }

        if (empty($this->_shares)) {
            $this->_shares = Turba::listShares();
        }

        // Have we seen this one yet?
        if (!empty($cache[$book])) {
            return $cache[$book];
        }

        // Is it an unmodified share key already?
        if (strpos($book, ':') !== false) {
            list($source, $key) = explode(':', $book, 2);
            $source = trim($source);
            $key = trim($key);
            if (isset($this->_shares[$key])) {
                $params = @unserialize($this->_shares[$key]->get('params'));
                // I'm not sure if this would ever be not true, but...
                if ($params['source'] == $source) {
                    $cache[$book] = $key;
                    return $key;
                }
            } else {
                // Maybe a key the upgrade script modified?
                foreach ($this->_shares as $skey => $share) {
                    $params = @unserialize($share->get('params'));
                    if ($params['name'] == $key &&
                        $params['source'] == $source) {

                       $cache[$book] = $skey;
                       return $skey;
                    }
                }
            }
        } else {
            // Need to check if this is a default address book for
            // one of our sources that is share enabled.
            foreach ($this->_shares as $skey => $share) {
                $params = @unserialize($share->get('params'));
                if ($params['source'] == $book &&
                    !empty($params['default'])) {
                    $cache[$book] = $skey;
                    return $skey;
                }
            }
        }

        // Special case for contacts from an IMSP source. The cfgSource
        // keys changed from 2.1 to 2.2 due to needs of the share code.
        if (strpos($book, 'IMSP_')) {
            // @TODO: Perform magical matching of IMSP-# to username.bookname.
        }

        // Must be a normal, non-shared source, just pass it back.
        $cache[$book] = $book;
        return $book;
    }

    function describeMaintenance()
    {

    }

}