Mercurial > hg > rc1
comparison plugins/squirrelmail_usercopy/squirrelmail_usercopy.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 <?php | |
2 | |
3 /** | |
4 * Copy a new users identities and contacts from a nearby Squirrelmail installation | |
5 * | |
6 * @version 1.6 | |
7 * @author Thomas Bruederli, Johannes Hessellund, pommi, Thomas Lueder | |
8 */ | |
9 class squirrelmail_usercopy extends rcube_plugin | |
10 { | |
11 public $task = 'login'; | |
12 | |
13 private $prefs = null; | |
14 private $identities_level = 0; | |
15 private $abook = array(); | |
16 | |
17 public function init() | |
18 { | |
19 $this->add_hook('user_create', array($this, 'create_user')); | |
20 $this->add_hook('identity_create', array($this, 'create_identity')); | |
21 } | |
22 | |
23 public function create_user($p) | |
24 { | |
25 $rcmail = rcmail::get_instance(); | |
26 | |
27 // Read plugin's config | |
28 $this->initialize(); | |
29 | |
30 // read prefs and add email address | |
31 $this->read_squirrel_prefs($p['user']); | |
32 if (($this->identities_level == 0 || $this->identities_level == 2) | |
33 && $rcmail->config->get('squirrelmail_set_alias') | |
34 && $this->prefs['email_address'] | |
35 ) { | |
36 $p['user_email'] = $this->prefs['email_address']; | |
37 } | |
38 | |
39 return $p; | |
40 } | |
41 | |
42 public function create_identity($p) | |
43 { | |
44 $rcmail = rcmail::get_instance(); | |
45 | |
46 // prefs are set in create_user() | |
47 if ($this->prefs) { | |
48 if ($this->prefs['full_name']) { | |
49 $p['record']['name'] = $this->prefs['full_name']; | |
50 } | |
51 | |
52 if (($this->identities_level == 0 || $this->identities_level == 2) && $this->prefs['email_address']) { | |
53 $p['record']['email'] = $this->prefs['email_address']; | |
54 } | |
55 | |
56 if ($this->prefs['___signature___']) { | |
57 $p['record']['signature'] = $this->prefs['___signature___']; | |
58 } | |
59 | |
60 if ($this->prefs['reply_to']) { | |
61 $p['record']['reply-to'] = $this->prefs['reply_to']; | |
62 } | |
63 | |
64 if (($this->identities_level == 0 || $this->identities_level == 1) | |
65 && isset($this->prefs['identities']) && $this->prefs['identities'] > 1 | |
66 ) { | |
67 for ($i = 1; $i < $this->prefs['identities']; $i++) { | |
68 unset($ident_data); | |
69 $ident_data = array('name' => '', 'email' => ''); // required data | |
70 | |
71 if ($this->prefs['full_name'.$i]) { | |
72 $ident_data['name'] = $this->prefs['full_name'.$i]; | |
73 } | |
74 | |
75 if ($this->identities_level == 0 && $this->prefs['email_address'.$i]) { | |
76 $ident_data['email'] = $this->prefs['email_address'.$i]; | |
77 } | |
78 else { | |
79 $ident_data['email'] = $p['record']['email']; | |
80 } | |
81 | |
82 if ($this->prefs['reply_to'.$i]) { | |
83 $ident_data['reply-to'] = $this->prefs['reply_to'.$i]; | |
84 } | |
85 | |
86 if ($this->prefs['___sig'.$i.'___']) { | |
87 $ident_data['signature'] = $this->prefs['___sig'.$i.'___']; | |
88 } | |
89 | |
90 // insert identity | |
91 $rcmail->user->insert_identity($ident_data); | |
92 } | |
93 } | |
94 | |
95 // copy address book | |
96 $contacts = $rcmail->get_address_book(null, true); | |
97 $addresses = array(); | |
98 $groups = array(); | |
99 | |
100 if ($contacts && !empty($this->abook)) { | |
101 foreach ($this->abook as $rec) { | |
102 // #1487096: handle multi-address and/or too long items | |
103 // #1487858: convert multi-address contacts into groups | |
104 $emails = preg_split('/[;,]/', $rec['email'], -1, PREG_SPLIT_NO_EMPTY); | |
105 $group_id = null; | |
106 | |
107 // create group for addresses | |
108 if (count($emails) > 1) { | |
109 if (!($group_id = $groups[$rec['name']])) { | |
110 if ($group = $contacts->create_group($rec['name'])) { | |
111 $group_id = $group['id']; | |
112 $groups[$rec['name']] = $group_id; | |
113 } | |
114 } | |
115 } | |
116 | |
117 // create contacts | |
118 foreach ($emails as $email) { | |
119 if (!($contact_id = $addresses[$email]) && rcube_utils::check_email(rcube_utils::idn_to_ascii($email))) { | |
120 $rec['email'] = rcube_utils::idn_to_utf8($email); | |
121 if ($contact_id = $contacts->insert($rec, true)) { | |
122 $addresses[$email] = $contact_id; | |
123 } | |
124 } | |
125 | |
126 if ($group_id && $contact_id) { | |
127 $contacts->add_to_group($group_id, array($contact_id)); | |
128 } | |
129 } | |
130 } | |
131 } | |
132 | |
133 // mark identity as complete for following hooks | |
134 $p['complete'] = true; | |
135 } | |
136 | |
137 return $p; | |
138 } | |
139 | |
140 private function initialize() | |
141 { | |
142 $rcmail = rcmail::get_instance(); | |
143 | |
144 // Load plugin's config file | |
145 $this->load_config(); | |
146 | |
147 // Set identities_level for operations of this plugin | |
148 $ilevel = $rcmail->config->get('squirrelmail_identities_level'); | |
149 if ($ilevel === null) { | |
150 $ilevel = $rcmail->config->get('identities_level', 0); | |
151 } | |
152 | |
153 $this->identities_level = intval($ilevel); | |
154 } | |
155 | |
156 private function read_squirrel_prefs($uname) | |
157 { | |
158 $rcmail = rcmail::get_instance(); | |
159 | |
160 /**** File based backend ****/ | |
161 if ($rcmail->config->get('squirrelmail_driver') == 'file' && ($srcdir = $rcmail->config->get('squirrelmail_data_dir'))) { | |
162 if (($hash_level = $rcmail->config->get('squirrelmail_data_dir_hash_level')) > 0) { | |
163 $srcdir = slashify($srcdir).chunk_split(substr(base_convert(crc32($uname), 10, 16), 0, $hash_level), 1, '/'); | |
164 } | |
165 $file_charset = $rcmail->config->get('squirrelmail_file_charset'); | |
166 | |
167 $prefsfile = slashify($srcdir) . $uname . '.pref'; | |
168 $abookfile = slashify($srcdir) . $uname . '.abook'; | |
169 $sigfile = slashify($srcdir) . $uname . '.sig'; | |
170 $sigbase = slashify($srcdir) . $uname . '.si'; | |
171 | |
172 if (is_readable($prefsfile)) { | |
173 $this->prefs = array(); | |
174 foreach (file($prefsfile) as $line) { | |
175 list($key, $value) = explode('=', $line); | |
176 $this->prefs[$key] = $this->convert_charset(rtrim($value), $file_charset); | |
177 } | |
178 | |
179 // also read signature file if exists | |
180 if (is_readable($sigfile)) { | |
181 $sig = file_get_contents($sigfile); | |
182 $this->prefs['___signature___'] = $this->convert_charset($sig, $file_charset); | |
183 } | |
184 | |
185 if (isset($this->prefs['identities']) && $this->prefs['identities'] > 1) { | |
186 for ($i=1; $i < $this->prefs['identities']; $i++) { | |
187 // read signature file if exists | |
188 if (is_readable($sigbase.$i)) { | |
189 $sig = file_get_contents($sigbase.$i); | |
190 $this->prefs['___sig'.$i.'___'] = $this->convert_charset($sig, $file_charset); | |
191 } | |
192 } | |
193 } | |
194 | |
195 // parse address book file | |
196 if (filesize($abookfile)) { | |
197 foreach (file($abookfile) as $line) { | |
198 $line = $this->convert_charset(rtrim($line), $file_charset); | |
199 list($rec['name'], $rec['firstname'], $rec['surname'], $rec['email']) = explode('|', $line); | |
200 if ($rec['name'] && $rec['email']) { | |
201 $this->abook[] = $rec; | |
202 } | |
203 } | |
204 } | |
205 } | |
206 } | |
207 // Database backend | |
208 else if ($rcmail->config->get('squirrelmail_driver') == 'sql') { | |
209 $this->prefs = array(); | |
210 | |
211 // connect to squirrelmail database | |
212 $db = rcube_db::factory($rcmail->config->get('squirrelmail_dsn')); | |
213 | |
214 $db->set_debug($rcmail->config->get('sql_debug')); | |
215 $db->db_connect('r'); // connect in read mode | |
216 | |
217 // retrieve prefs | |
218 $userprefs_table = $rcmail->config->get('squirrelmail_userprefs_table'); | |
219 $address_table = $rcmail->config->get('squirrelmail_address_table'); | |
220 $db_charset = $rcmail->config->get('squirrelmail_db_charset'); | |
221 | |
222 if ($db_charset) { | |
223 $db->query('SET NAMES '.$db_charset); | |
224 } | |
225 | |
226 $sql_result = $db->query('SELECT * FROM ' . $db->quote_identifier($userprefs_table) | |
227 .' WHERE `user` = ?', $uname); // ? is replaced with emailaddress | |
228 | |
229 while ($sql_array = $db->fetch_assoc($sql_result) ) { // fetch one row from result | |
230 $this->prefs[$sql_array['prefkey']] = rcube_charset::convert(rtrim($sql_array['prefval']), $db_charset); | |
231 } | |
232 | |
233 // retrieve address table data | |
234 $sql_result = $db->query('SELECT * FROM ' . $db->quote_identifier($address_table) | |
235 .' WHERE `owner` = ?', $uname); // ? is replaced with emailaddress | |
236 | |
237 // parse address book | |
238 while ($sql_array = $db->fetch_assoc($sql_result) ) { // fetch one row from result | |
239 $rec['name'] = rcube_charset::convert(rtrim($sql_array['nickname']), $db_charset); | |
240 $rec['firstname'] = rcube_charset::convert(rtrim($sql_array['firstname']), $db_charset); | |
241 $rec['surname'] = rcube_charset::convert(rtrim($sql_array['lastname']), $db_charset); | |
242 $rec['email'] = rcube_charset::convert(rtrim($sql_array['email']), $db_charset); | |
243 $rec['notes'] = rcube_charset::convert(rtrim($sql_array['label']), $db_charset); | |
244 | |
245 if ($rec['name'] && $rec['email']) { | |
246 $this->abook[] = $rec; | |
247 } | |
248 } | |
249 } // end if 'sql'-driver | |
250 } | |
251 | |
252 private function convert_charset($str, $charset = null) | |
253 { | |
254 if (!$charset) { | |
255 return utf8_encode($sig); | |
256 } | |
257 | |
258 return rcube_charset::convert($str, $charset, RCMAIL_CHARSET); | |
259 } | |
260 } |