phpBB
Statistics
| Revision:

root / trunk / phpBB / includes / functions_convert.php

History | View | Annotate | Download (60.7 kB)

1 6847 acydburn
<?php
2 7736 acydburn
/**
3 6847 acydburn
*
4 6847 acydburn
* @package install
5 7736 acydburn
* @copyright (c) 2006 phpBB Group
6 11653 git-gate
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7 6847 acydburn
*
8 6847 acydburn
*/
9 6847 acydburn
10 6939 acydburn
/**
11 8133 acydburn
* @ignore
12 8133 acydburn
*/
13 8133 acydburn
if (!defined('IN_PHPBB'))
14 8133 acydburn
{
15 8133 acydburn
        exit;
16 8133 acydburn
}
17 8133 acydburn
18 8133 acydburn
/**
19 6939 acydburn
* Default avatar width/height
20 6939 acydburn
* @ignore
21 6847 acydburn
*/
22 6847 acydburn
define('DEFAULT_AVATAR_X', 80);
23 6847 acydburn
define('DEFAULT_AVATAR_Y', 80);
24 6847 acydburn
25 6939 acydburn
// Global functions - all functions can be used by convertors
26 6847 acydburn
27 6847 acydburn
// SIMPLE FUNCTIONS
28 6847 acydburn
29 6847 acydburn
/**
30 6847 acydburn
* Return the preceding value
31 6847 acydburn
*/
32 6847 acydburn
function dec($var)
33 6847 acydburn
{
34 6847 acydburn
        return --$var;
35 6847 acydburn
}
36 6847 acydburn
37 6847 acydburn
/**
38 6847 acydburn
* Return the next value
39 6847 acydburn
*/
40 6847 acydburn
function inc($var)
41 6847 acydburn
{
42 6847 acydburn
        return ++$var;
43 6847 acydburn
}
44 6847 acydburn
45 6847 acydburn
/**
46 6847 acydburn
* Return whether the value is positive
47 6847 acydburn
*/
48 6847 acydburn
function is_positive($n)
49 6847 acydburn
{
50 6847 acydburn
        return ($n > 0) ? 1 : 0;
51 6847 acydburn
}
52 6847 acydburn
53 6847 acydburn
/**
54 6847 acydburn
* Boolean inverse of the value
55 6847 acydburn
*/
56 6847 acydburn
function not($var)
57 6847 acydburn
{
58 6847 acydburn
        return ($var) ? 0 : 1;
59 6847 acydburn
}
60 6847 acydburn
61 6847 acydburn
/**
62 6847 acydburn
* Convert a textual value to it's equivalent boolean value
63 6847 acydburn
*
64 6847 acydburn
* @param string $str String to convert (converts yes, on, y, 1 and true to boolean true)
65 6847 acydburn
* @return boolean The equivalent value
66 6847 acydburn
*/
67 6847 acydburn
function str_to_bool($str)
68 6847 acydburn
{
69 6847 acydburn
        $str = strtolower($str);
70 6847 acydburn
        return ($str == 'yes' || $str == 'on' || $str == 'y' || $str == 'true' || $str == '1') ? true : false;
71 6847 acydburn
}
72 6847 acydburn
73 6847 acydburn
/**
74 6847 acydburn
* Function to mimic php's empty() function (it is the same)
75 6847 acydburn
*/
76 6847 acydburn
function is_empty($mixed)
77 6847 acydburn
{
78 6847 acydburn
        return empty($mixed);
79 6847 acydburn
}
80 6847 acydburn
81 6847 acydburn
/**
82 6847 acydburn
* Convert the name of a user's primary group to the appropriate equivalent phpBB group id
83 6847 acydburn
*
84 6847 acydburn
* @param string $status The name of the group
85 6847 acydburn
* @return int The group_id corresponding to the equivalent group
86 6847 acydburn
*/
87 6847 acydburn
function str_to_primary_group($status)
88 6847 acydburn
{
89 6847 acydburn
        switch (ucfirst(strtolower($status)))
90 6847 acydburn
        {
91 6847 acydburn
                case 'Administrator':
92 6847 acydburn
                        return get_group_id('administrators');
93 6847 acydburn
                break;
94 6847 acydburn
95 6847 acydburn
                case 'Super moderator':
96 6847 acydburn
                case 'Global moderator':
97 6847 acydburn
                case 'Moderator':
98 6847 acydburn
                        return get_group_id('global_moderators');
99 6847 acydburn
                break;
100 6847 acydburn
101 6847 acydburn
                case 'Guest':
102 6847 acydburn
                case 'Anonymous':
103 6847 acydburn
                        return get_group_id('guests');
104 6847 acydburn
                break;
105 6847 acydburn
106 6847 acydburn
                default:
107 6847 acydburn
                        return get_group_id('registered');
108 6847 acydburn
                break;
109 6847 acydburn
        }
110 6847 acydburn
}
111 6847 acydburn
112 6847 acydburn
/**
113 6847 acydburn
* Convert a boolean into the appropriate phpBB constant indicating whether the item is locked
114 6847 acydburn
*/
115 6847 acydburn
function is_item_locked($bool)
116 6847 acydburn
{
117 6847 acydburn
        return ($bool) ? ITEM_LOCKED : ITEM_UNLOCKED;
118 6847 acydburn
}
119 6847 acydburn
120 6847 acydburn
/**
121 6847 acydburn
* Convert a value from days to seconds
122 6847 acydburn
*/
123 6847 acydburn
function days_to_seconds($days)
124 6847 acydburn
{
125 6847 acydburn
        return ($days * 86400);
126 6847 acydburn
}
127 6847 acydburn
128 6847 acydburn
/**
129 6847 acydburn
* Determine whether a user is anonymous and return the appropriate new user_id
130 6847 acydburn
*/
131 6847 acydburn
function is_user_anonymous($user_id)
132 6847 acydburn
{
133 6847 acydburn
        return ($user_id > ANONYMOUS) ? $user_id : ANONYMOUS;
134 6847 acydburn
}
135 6847 acydburn
136 6847 acydburn
/**
137 6847 acydburn
* Generate a key value based on existing values
138 6847 acydburn
*
139 6847 acydburn
* @param int $pad Amount to add to the maximum value
140 6847 acydburn
* @return int Key value
141 6847 acydburn
*/
142 6847 acydburn
function auto_id($pad = 0)
143 6847 acydburn
{
144 6847 acydburn
        global $auto_id, $convert_row;
145 6847 acydburn
146 6847 acydburn
        if (!empty($convert_row['max_id']))
147 6847 acydburn
        {
148 6847 acydburn
                return $convert_row['max_id'] + $pad;
149 6847 acydburn
        }
150 8667 acydburn
151 6847 acydburn
        return $auto_id + $pad;
152 6847 acydburn
}
153 6847 acydburn
154 6847 acydburn
/**
155 6847 acydburn
* Convert a boolean into the appropriate phpBB constant indicating whether the user is active
156 6847 acydburn
*/
157 6847 acydburn
function set_user_type($user_active)
158 6847 acydburn
{
159 6847 acydburn
        return ($user_active) ? USER_NORMAL : USER_INACTIVE;
160 6847 acydburn
}
161 6847 acydburn
162 6847 acydburn
/**
163 6847 acydburn
* Convert a value from minutes to hours
164 6847 acydburn
*/
165 6847 acydburn
function minutes_to_hours($minutes)
166 6847 acydburn
{
167 6847 acydburn
        return ($minutes / 3600);
168 6847 acydburn
}
169 6847 acydburn
170 6847 acydburn
/**
171 6847 acydburn
* Return the group_id for a given group name
172 6847 acydburn
*/
173 6847 acydburn
function get_group_id($group_name)
174 6847 acydburn
{
175 6847 acydburn
        global $db, $group_mapping;
176 6847 acydburn
177 6847 acydburn
        if (empty($group_mapping))
178 6847 acydburn
        {
179 6847 acydburn
                $sql = 'SELECT group_name, group_id
180 6847 acydburn
                        FROM ' . GROUPS_TABLE;
181 6847 acydburn
                $result = $db->sql_query($sql);
182 6847 acydburn
183 6847 acydburn
                $group_mapping = array();
184 6847 acydburn
                while ($row = $db->sql_fetchrow($result))
185 6847 acydburn
                {
186 6847 acydburn
                        $group_mapping[strtoupper($row['group_name'])] = (int) $row['group_id'];
187 6847 acydburn
                }
188 6847 acydburn
                $db->sql_freeresult($result);
189 6847 acydburn
        }
190 6847 acydburn
191 6847 acydburn
        if (!sizeof($group_mapping))
192 6847 acydburn
        {
193 6847 acydburn
                add_default_groups();
194 6847 acydburn
                return get_group_id($group_name);
195 6847 acydburn
        }
196 6847 acydburn
197 6847 acydburn
        if (isset($group_mapping[strtoupper($group_name)]))
198 6847 acydburn
        {
199 6847 acydburn
                return $group_mapping[strtoupper($group_name)];
200 6847 acydburn
        }
201 6847 acydburn
202 6847 acydburn
        return $group_mapping['REGISTERED'];
203 6847 acydburn
}
204 6847 acydburn
205 6847 acydburn
/**
206 6847 acydburn
* Generate the email hash stored in the users table
207 10558 git-gate
*
208 10558 git-gate
* Note: Deprecated, calls should directly go to phpbb_email_hash()
209 6847 acydburn
*/
210 6847 acydburn
function gen_email_hash($email)
211 6847 acydburn
{
212 10558 git-gate
        return phpbb_email_hash($email);
213 6847 acydburn
}
214 6847 acydburn
215 6847 acydburn
/**
216 6847 acydburn
* Convert a boolean into the appropriate phpBB constant indicating whether the topic is locked
217 6847 acydburn
*/
218 6847 acydburn
function is_topic_locked($bool)
219 6847 acydburn
{
220 6847 acydburn
        return (!empty($bool)) ? ITEM_LOCKED : ITEM_UNLOCKED;
221 6847 acydburn
}
222 6847 acydburn
223 6847 acydburn
/**
224 6847 acydburn
* Generate a bbcode_uid value
225 6847 acydburn
*/
226 6847 acydburn
function make_uid($timestamp)
227 6847 acydburn
{
228 8179 kellanved
        static $last_timestamp, $last_uid;
229 8179 kellanved
230 8179 kellanved
        if (empty($last_timestamp) || $timestamp != $last_timestamp)
231 8179 kellanved
        {
232 8179 kellanved
                $last_uid = substr(base_convert(unique_id(), 16, 36), 0, BBCODE_UID_LEN);
233 8179 kellanved
        }
234 8179 kellanved
        $last_timestamp = $timestamp;
235 8179 kellanved
        return $last_uid;
236 6847 acydburn
}
237 6847 acydburn
238 8179 kellanved
239 6847 acydburn
/**
240 6847 acydburn
* Validate a website address
241 6847 acydburn
*/
242 6847 acydburn
function validate_website($url)
243 6847 acydburn
{
244 7882 kellanved
        if ($url === 'http://')
245 7882 kellanved
        {
246 7807 kellanved
                return '';
247 7807 kellanved
        }
248 8033 acydburn
        else if (!preg_match('#^[a-z0-9]+://#i', $url) && strlen($url) > 0)
249 7807 kellanved
        {
250 7807 kellanved
                return 'http://' . $url;
251 7807 kellanved
        }
252 7882 kellanved
        return $url;
253 6847 acydburn
}
254 6847 acydburn
255 6847 acydburn
/**
256 6847 acydburn
* Convert nulls to zeros for fields which allowed a NULL value in the source but not the destination
257 6847 acydburn
*/
258 6847 acydburn
function null_to_zero($value)
259 6847 acydburn
{
260 6847 acydburn
        return ($value === NULL) ? 0 : $value;
261 6847 acydburn
}
262 6847 acydburn
263 6847 acydburn
/**
264 6847 acydburn
* Convert nulls to empty strings for fields which allowed a NULL value in the source but not the destination
265 6847 acydburn
*/
266 6847 acydburn
function null_to_str($value)
267 6847 acydburn
{
268 6847 acydburn
        return ($value === NULL) ? '' : $value;
269 6847 acydburn
}
270 6847 acydburn
271 6847 acydburn
// EXTENDED FUNCTIONS
272 6847 acydburn
273 6847 acydburn
/**
274 6847 acydburn
* Get old config value
275 6847 acydburn
*/
276 6847 acydburn
function get_config_value($config_name)
277 6847 acydburn
{
278 6847 acydburn
        static $convert_config;
279 6847 acydburn
280 6847 acydburn
        if (!isset($convert_config))
281 6847 acydburn
        {
282 6847 acydburn
                $convert_config = get_config();
283 6847 acydburn
        }
284 8667 acydburn
285 6847 acydburn
        if (!isset($convert_config[$config_name]))
286 6847 acydburn
        {
287 6847 acydburn
                return false;
288 6847 acydburn
        }
289 6847 acydburn
290 6847 acydburn
        return (empty($convert_config[$config_name])) ? '' : $convert_config[$config_name];
291 6847 acydburn
}
292 6847 acydburn
293 6847 acydburn
/**
294 6915 acydburn
* Convert an IP address from the hexadecimal notation to normal dotted-quad notation
295 6847 acydburn
*/
296 6847 acydburn
function decode_ip($int_ip)
297 6847 acydburn
{
298 6847 acydburn
        if (!$int_ip)
299 6847 acydburn
        {
300 7063 acydburn
                return $int_ip;
301 6847 acydburn
        }
302 6847 acydburn
303 6847 acydburn
        $hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
304 6970 acydburn
305 7063 acydburn
        // Any mod changing the way ips are stored? Then we are not able to convert and enter the ip "as is" to not "destroy" anything...
306 7034 acydburn
        if (sizeof($hexipbang) < 4)
307 6970 acydburn
        {
308 7063 acydburn
                return $int_ip;
309 6970 acydburn
        }
310 6970 acydburn
311 7007 acydburn
        return hexdec($hexipbang[0]) . '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
312 6847 acydburn
}
313 6847 acydburn
314 6847 acydburn
/**
315 6847 acydburn
* Reverse the encoding of wild-carded bans
316 6847 acydburn
*/
317 6847 acydburn
function decode_ban_ip($int_ip)
318 6847 acydburn
{
319 6847 acydburn
        return str_replace('255', '*', decode_ip($int_ip));
320 6847 acydburn
}
321 6847 acydburn
322 6847 acydburn
/**
323 6847 acydburn
* Determine the MIME-type of a specified filename
324 6847 acydburn
* This does not actually inspect the file, but simply uses the file extension
325 6847 acydburn
*/
326 6847 acydburn
function mimetype($filename)
327 6847 acydburn
{
328 6847 acydburn
        if (!preg_match('/\.([a-z0-9]+)$/i', $filename, $m))
329 6847 acydburn
        {
330 6847 acydburn
                return 'application/octet-stream';
331 6847 acydburn
        }
332 6847 acydburn
333 6847 acydburn
        switch (strtolower($m[1]))
334 6847 acydburn
        {
335 6847 acydburn
                case 'zip':                return 'application/zip';
336 6847 acydburn
                case 'jpeg':        return 'image/jpeg';
337 6847 acydburn
                case 'jpg':                return 'image/jpeg';
338 6847 acydburn
                case 'jpe':                return 'image/jpeg';
339 6847 acydburn
                case 'png':                return 'image/png';
340 6847 acydburn
                case 'gif':                return 'image/gif';
341 6847 acydburn
                case 'htm':
342 6847 acydburn
                case 'html':        return 'text/html';
343 6847 acydburn
                case 'tif':                return 'image/tiff';
344 6847 acydburn
                case 'tiff':        return 'image/tiff';
345 6847 acydburn
                case 'ras':                return 'image/x-cmu-raster';
346 6847 acydburn
                case 'pnm':                return 'image/x-portable-anymap';
347 6847 acydburn
                case 'pbm':                return 'image/x-portable-bitmap';
348 6847 acydburn
                case 'pgm':                return 'image/x-portable-graymap';
349 6847 acydburn
                case 'ppm':                return 'image/x-portable-pixmap';
350 6847 acydburn
                case 'rgb':                return 'image/x-rgb';
351 6847 acydburn
                case 'xbm':                return 'image/x-xbitmap';
352 6847 acydburn
                case 'xpm':                return 'image/x-xpixmap';
353 6847 acydburn
                case 'xwd':                return 'image/x-xwindowdump';
354 6847 acydburn
                case 'z':                return 'application/x-compress';
355 6847 acydburn
                case 'gtar':        return 'application/x-gtar';
356 6847 acydburn
                case 'tgz':                return 'application/x-gtar';
357 6847 acydburn
                case 'gz':                return 'application/x-gzip';
358 6847 acydburn
                case 'tar':                return 'application/x-tar';
359 6847 acydburn
                case 'xls':                return 'application/excel';
360 6847 acydburn
                case 'pdf':                return 'application/pdf';
361 6847 acydburn
                case 'ppt':                return 'application/powerpoint';
362 6847 acydburn
                case 'rm':                return 'application/vnd.rn-realmedia';
363 6847 acydburn
                case 'wma':                return 'audio/x-ms-wma';
364 6847 acydburn
                case 'swf':                return 'application/x-shockwave-flash';
365 6847 acydburn
                case 'ief':                return 'image/ief';
366 6847 acydburn
                case 'doc':
367 6847 acydburn
                case 'dot':
368 6847 acydburn
                case 'wrd':                return 'application/msword';
369 6847 acydburn
                case 'ai':
370 6847 acydburn
                case 'eps':
371 6847 acydburn
                case 'ps':                return 'application/postscript';
372 6847 acydburn
                case 'asc':
373 6847 acydburn
                case 'txt':
374 6847 acydburn
                case 'c':
375 6847 acydburn
                case 'cc':
376 6847 acydburn
                case 'h':
377 6847 acydburn
                case 'hh':
378 6847 acydburn
                case 'cpp':
379 6847 acydburn
                case 'hpp':
380 6847 acydburn
                case 'php':
381 6847 acydburn
                case 'php3':        return 'text/plain';
382 6847 acydburn
                default:                 return 'application/octet-stream';
383 6847 acydburn
        }
384 6847 acydburn
}
385 6847 acydburn
386 6847 acydburn
/**
387 6847 acydburn
* Obtain the dimensions of all remotely hosted avatars
388 6847 acydburn
* This should only be called from execute_last
389 6847 acydburn
* There can be significant network overhead if there are a large number of remote avatars
390 6847 acydburn
* @todo Look at the option of allowing the user to decide whether this is called or to force the dimensions
391 6847 acydburn
*/
392 8133 acydburn
function remote_avatar_dims()
393 6847 acydburn
{
394 6847 acydburn
        global $db;
395 6847 acydburn
396 6847 acydburn
        $sql = 'SELECT user_id, user_avatar
397 6847 acydburn
                FROM ' . USERS_TABLE . '
398 6847 acydburn
                WHERE user_avatar_type = ' . AVATAR_REMOTE;
399 6847 acydburn
        $result = $db->sql_query($sql);
400 6847 acydburn
401 6847 acydburn
        $remote_avatars = array();
402 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
403 6847 acydburn
        {
404 6847 acydburn
                $remote_avatars[(int) $row['user_id']] = $row['user_avatar'];
405 6847 acydburn
        }
406 6847 acydburn
        $db->sql_freeresult($result);
407 6847 acydburn
408 6847 acydburn
        foreach ($remote_avatars as $user_id => $avatar)
409 6847 acydburn
        {
410 6847 acydburn
                $width = (int) get_remote_avatar_dim($avatar, 0);
411 6847 acydburn
                $height = (int) get_remote_avatar_dim($avatar, 1);
412 6847 acydburn
413 6847 acydburn
                $sql = 'UPDATE ' . USERS_TABLE . '
414 6847 acydburn
                        SET user_avatar_width = ' . (int) $width . ', user_avatar_height = ' . (int) $height . '
415 6847 acydburn
                        WHERE user_id = ' . $user_id;
416 6847 acydburn
                $db->sql_query($sql);
417 6847 acydburn
        }
418 6847 acydburn
}
419 6847 acydburn
420 6847 acydburn
function import_avatar_gallery($gallery_name = '', $subdirs_as_galleries = false)
421 6847 acydburn
{
422 6847 acydburn
        global $config, $convert, $phpbb_root_path, $user;
423 6847 acydburn
424 6847 acydburn
        $relative_path = empty($convert->convertor['source_path_absolute']);
425 6847 acydburn
426 11655 git-gate
        // check for trailing slash
427 11655 git-gate
        if (rtrim($convert->convertor['avatar_gallery_path'], '/') === '')
428 6847 acydburn
        {
429 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_GALLERY_PATH'], 'import_avatar_gallery()'), __LINE__, __FILE__);
430 6847 acydburn
        }
431 6847 acydburn
432 6847 acydburn
        $src_path = relative_base(path($convert->convertor['avatar_gallery_path'], $relative_path), $relative_path);
433 6847 acydburn
434 6847 acydburn
        if (is_dir($src_path))
435 6847 acydburn
        {
436 6975 acydburn
                // Do not die on failure... safe mode restrictions may be in effect.
437 6975 acydburn
                copy_dir($convert->convertor['avatar_gallery_path'], path($config['avatar_gallery_path']) . $gallery_name, !$subdirs_as_galleries, false, false, $relative_path);
438 6847 acydburn
439 6847 acydburn
                // only doing 1 level deep. (ibf 1.x)
440 6847 acydburn
                // notes: ibf has 2 tiers: directly in the avatar directory for base gallery (handled in the above statement), plus subdirs(handled below).
441 6847 acydburn
                // recursive subdirs ignored. -- i don't know if other forums support recursive galleries. if they do, this following code could be upgraded to be recursive.
442 6847 acydburn
                if ($subdirs_as_galleries)
443 6847 acydburn
                {
444 6847 acydburn
                        $dirlist = array();
445 6847 acydburn
                        if ($handle = @opendir($src_path))
446 6847 acydburn
                        {
447 6847 acydburn
                                while ($entry = readdir($handle))
448 6847 acydburn
                                {
449 6851 acydburn
                                        if ($entry[0] == '.' || $entry == 'CVS' || $entry == 'index.htm')
450 6847 acydburn
                                        {
451 6847 acydburn
                                                continue;
452 6847 acydburn
                                        }
453 6847 acydburn
454 6847 acydburn
                                        if (is_dir($src_path . $entry))
455 6847 acydburn
                                        {
456 6847 acydburn
                                                $dirlist[] = $entry;
457 6847 acydburn
                                        }
458 6847 acydburn
                                }
459 6847 acydburn
                                closedir($handle);
460 6847 acydburn
                        }
461 6847 acydburn
                        else if ($dir = @dir($src_path))
462 6847 acydburn
                        {
463 6847 acydburn
                                while ($entry = $dir->read())
464 6847 acydburn
                                {
465 6851 acydburn
                                        if ($entry[0] == '.' || $entry == 'CVS' || $entry == 'index.htm')
466 6847 acydburn
                                        {
467 6847 acydburn
                                                continue;
468 6847 acydburn
                                        }
469 6847 acydburn
470 6847 acydburn
                                        if (is_dir($src_path . $entry))
471 6847 acydburn
                                        {
472 6847 acydburn
                                                $dirlist[] = $entry;
473 6847 acydburn
                                        }
474 6847 acydburn
                                }
475 6847 acydburn
                                $dir->close();
476 6847 acydburn
                        }
477 6847 acydburn
478 6847 acydburn
                        for ($i = 0; $i < sizeof($dirlist); ++$i)
479 6847 acydburn
                        {
480 6847 acydburn
                                $dir = $dirlist[$i];
481 6975 acydburn
482 6975 acydburn
                                // Do not die on failure... safe mode restrictions may be in effect.
483 6975 acydburn
                                copy_dir(path($convert->convertor['avatar_gallery_path'], $relative_path) . $dir, path($config['avatar_gallery_path']) . $dir, true, false, false, $relative_path);
484 6847 acydburn
                        }
485 6847 acydburn
                }
486 6847 acydburn
        }
487 6847 acydburn
}
488 6847 acydburn
489 6847 acydburn
function import_attachment_files($category_name = '')
490 6847 acydburn
{
491 6847 acydburn
        global $config, $convert, $phpbb_root_path, $db, $user;
492 6847 acydburn
493 6847 acydburn
        $sql = 'SELECT config_value AS upload_path
494 6847 acydburn
                FROM ' . CONFIG_TABLE . "
495 6847 acydburn
                WHERE config_name = 'upload_path'";
496 6847 acydburn
        $result = $db->sql_query($sql);
497 6847 acydburn
        $config['upload_path'] = $db->sql_fetchfield('upload_path');
498 6847 acydburn
        $db->sql_freeresult($result);
499 6847 acydburn
500 6847 acydburn
        $relative_path = empty($convert->convertor['source_path_absolute']);
501 6847 acydburn
502 6847 acydburn
        if (empty($convert->convertor['upload_path']))
503 6847 acydburn
        {
504 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_UPLOAD_DIR'], 'import_attachment_files()'), __LINE__, __FILE__);
505 6847 acydburn
        }
506 6847 acydburn
507 6847 acydburn
        if (is_dir(relative_base(path($convert->convertor['upload_path'], $relative_path), $relative_path)))
508 6847 acydburn
        {
509 6847 acydburn
                copy_dir($convert->convertor['upload_path'], path($config['upload_path']) . $category_name, true, false, true, $relative_path);
510 6847 acydburn
        }
511 6847 acydburn
}
512 6847 acydburn
513 6847 acydburn
function attachment_forum_perms($forum_id)
514 6847 acydburn
{
515 6847 acydburn
        if (!is_array($forum_id))
516 6847 acydburn
        {
517 6847 acydburn
                $forum_id = array($forum_id);
518 6847 acydburn
        }
519 6847 acydburn
520 6847 acydburn
        return serialize($forum_id);
521 6847 acydburn
}
522 6847 acydburn
523 6847 acydburn
// base64todec function
524 6847 acydburn
// -> from php manual?
525 6847 acydburn
function base64_unpack($string)
526 6847 acydburn
{
527 6847 acydburn
        $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-';
528 6847 acydburn
        $base = strlen($chars);
529 6847 acydburn
530 6847 acydburn
        $length = strlen($string);
531 6847 acydburn
        $number = 0;
532 6847 acydburn
533 6847 acydburn
        for ($i = 1; $i <= $length; $i++)
534 6847 acydburn
        {
535 8133 acydburn
                $pos = $length - $i;
536 6847 acydburn
                $operand = strpos($chars, substr($string, $pos, 1));
537 8133 acydburn
                $exponent = pow($base, $i-1);
538 6847 acydburn
                $dec_value = $operand * $exponent;
539 8133 acydburn
                $number += $dec_value;
540 6847 acydburn
        }
541 6847 acydburn
542 8133 acydburn
        return $number;
543 6847 acydburn
}
544 6847 acydburn
545 6905 acydburn
function _import_check($config_var, $source, $use_target)
546 6847 acydburn
{
547 6905 acydburn
        global $convert, $config;
548 6847 acydburn
549 6905 acydburn
        $result = array(
550 6905 acydburn
                'orig_source'        => $source,
551 6907 acydburn
                'copied'                => false,
552 6905 acydburn
                'relative_path'        => (empty($convert->convertor['source_path_absolute'])) ? true : false,
553 6905 acydburn
        );
554 6847 acydburn
555 7392 kellanved
        // copy file will prepend $phpBB_root_path
556 9905 acydburn
        $target = $config[$config_var] . '/' . utf8_basename(($use_target === false) ? $source : $use_target);
557 6847 acydburn
558 6905 acydburn
        if (!empty($convert->convertor[$config_var]) && strpos($source, $convert->convertor[$config_var]) !== 0)
559 6847 acydburn
        {
560 6905 acydburn
                $source = $convert->convertor[$config_var] . $source;
561 6847 acydburn
        }
562 6847 acydburn
563 6905 acydburn
        $result['source'] = $source;
564 6847 acydburn
565 6905 acydburn
        if (file_exists(relative_base($source, $result['relative_path'], __LINE__, __FILE__)))
566 6847 acydburn
        {
567 6905 acydburn
                $result['copied'] = copy_file($source, $target, false, false, $result['relative_path']);
568 6847 acydburn
        }
569 6847 acydburn
570 6905 acydburn
        if ($result['copied'])
571 6847 acydburn
        {
572 9905 acydburn
                $result['target'] = utf8_basename($target);
573 6847 acydburn
        }
574 6905 acydburn
        else
575 6905 acydburn
        {
576 9905 acydburn
                $result['target'] = ($use_target !== false) ? $result['orig_source'] : utf8_basename($target);
577 6905 acydburn
        }
578 6847 acydburn
579 6905 acydburn
        return $result;
580 6847 acydburn
}
581 6847 acydburn
582 6905 acydburn
function import_attachment($source, $use_target = false)
583 6847 acydburn
{
584 6847 acydburn
        if (empty($source))
585 6847 acydburn
        {
586 6847 acydburn
                return '';
587 6847 acydburn
        }
588 6847 acydburn
589 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user;
590 6847 acydburn
591 11655 git-gate
        // check for trailing slash
592 11655 git-gate
        if (rtrim($convert->convertor['upload_path'], '/') === '')
593 6847 acydburn
        {
594 6905 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_UPLOAD_DIR'], 'import_attachment()'), __LINE__, __FILE__);
595 6847 acydburn
        }
596 6847 acydburn
597 6905 acydburn
        $result = _import_check('upload_path', $source, $use_target);
598 6847 acydburn
599 6905 acydburn
        if ($result['copied'])
600 6847 acydburn
        {
601 6905 acydburn
                // Thumbnails?
602 6905 acydburn
                if (is_array($convert->convertor['thumbnails']))
603 6847 acydburn
                {
604 6905 acydburn
                        $thumb_dir = $convert->convertor['thumbnails'][0];
605 6905 acydburn
                        $thumb_prefix = $convert->convertor['thumbnails'][1];
606 9905 acydburn
                        $thumb_source = $thumb_dir . $thumb_prefix . utf8_basename($result['source']);
607 6905 acydburn
608 6905 acydburn
                        if (strpos($thumb_source, $convert->convertor['upload_path']) !== 0)
609 6905 acydburn
                        {
610 6905 acydburn
                                $thumb_source = $convert->convertor['upload_path'] . $thumb_source;
611 6905 acydburn
                        }
612 6905 acydburn
                        $thumb_target = $config['upload_path'] . '/thumb_' . $result['target'];
613 6905 acydburn
614 6905 acydburn
                        if (file_exists(relative_base($thumb_source, $result['relative_path'], __LINE__, __FILE__)))
615 6905 acydburn
                        {
616 6905 acydburn
                                copy_file($thumb_source, $thumb_target, false, false, $result['relative_path']);
617 6905 acydburn
                        }
618 6847 acydburn
                }
619 6847 acydburn
        }
620 6847 acydburn
621 6905 acydburn
        return $result['target'];
622 6847 acydburn
}
623 6847 acydburn
624 6905 acydburn
function import_rank($source, $use_target = false)
625 6847 acydburn
{
626 6847 acydburn
        if (empty($source))
627 6847 acydburn
        {
628 6847 acydburn
                return '';
629 6847 acydburn
        }
630 6847 acydburn
631 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user;
632 6847 acydburn
633 6905 acydburn
        if (!isset($convert->convertor['ranks_path']))
634 6847 acydburn
        {
635 6905 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_RANKS_PATH'], 'import_rank()'), __LINE__, __FILE__);
636 6847 acydburn
        }
637 6847 acydburn
638 6905 acydburn
        $result = _import_check('ranks_path', $source, $use_target);
639 6905 acydburn
        return $result['target'];
640 6905 acydburn
}
641 6847 acydburn
642 6905 acydburn
function import_smiley($source, $use_target = false)
643 6905 acydburn
{
644 6905 acydburn
        if (empty($source))
645 6847 acydburn
        {
646 6905 acydburn
                return '';
647 6847 acydburn
        }
648 6847 acydburn
649 6905 acydburn
        global $convert, $phpbb_root_path, $config, $user;
650 6905 acydburn
651 11655 git-gate
        // check for trailing slash
652 11655 git-gate
        if (rtrim($convert->convertor['smilies_path'], '/') === '')
653 6847 acydburn
        {
654 6905 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_SMILIES_PATH'], 'import_smiley()'), __LINE__, __FILE__);
655 6847 acydburn
        }
656 6847 acydburn
657 6905 acydburn
        $result = _import_check('smilies_path', $source, $use_target);
658 6905 acydburn
        return $result['target'];
659 6847 acydburn
}
660 6847 acydburn
661 7429 kellanved
/*
662 7429 kellanved
*/
663 7429 kellanved
function import_avatar($source, $use_target = false, $user_id = false)
664 6847 acydburn
{
665 6847 acydburn
        if (empty($source) || preg_match('#^https?:#i', $source) || preg_match('#blank\.(gif|png)$#i', $source))
666 6847 acydburn
        {
667 6847 acydburn
                return;
668 6847 acydburn
        }
669 6847 acydburn
670 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user;
671 6847 acydburn
672 11655 git-gate
        // check for trailing slash
673 11655 git-gate
        if (rtrim($convert->convertor['avatar_path'], '/') === '')
674 6847 acydburn
        {
675 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_AVATAR_PATH'], 'import_avatar()'), __LINE__, __FILE__);
676 6847 acydburn
        }
677 8667 acydburn
678 7429 kellanved
        if ($use_target === false && $user_id !== false)
679 7429 kellanved
        {
680 7429 kellanved
                $use_target = $config['avatar_salt'] . '_' . $user_id . '.' . substr(strrchr($source, '.'), 1);
681 7429 kellanved
        }
682 8667 acydburn
683 7429 kellanved
        $result = _import_check('avatar_path', $source, $use_target);
684 6847 acydburn
685 7429 kellanved
        return ((!empty($user_id)) ? $user_id : $use_target) . '.' . substr(strrchr($source, '.'), 1);
686 6847 acydburn
}
687 6847 acydburn
688 6847 acydburn
/**
689 6847 acydburn
* @todo all image dimension functions below (there are a *lot*) should get revisited and converted to one or two functions (no more needed, really).
690 6847 acydburn
*/
691 6847 acydburn
692 6847 acydburn
/**
693 6847 acydburn
* Calculate the size of the specified image
694 6847 acydburn
* Called from the following functions for calculating the size of specific image types
695 6847 acydburn
*/
696 6847 acydburn
function get_image_dim($source)
697 6847 acydburn
{
698 6847 acydburn
        if (empty($source))
699 6847 acydburn
        {
700 6847 acydburn
                return array(0, 0);
701 6847 acydburn
        }
702 6847 acydburn
703 6847 acydburn
        global $convert;
704 6847 acydburn
705 6847 acydburn
        $relative_path = empty($convert->convertor['source_path_absolute']);
706 6847 acydburn
707 6847 acydburn
        if (file_exists(relative_base($source, $relative_path)))
708 6847 acydburn
        {
709 6847 acydburn
                $image = relative_base($source, $relative_path);
710 7646 acydburn
                return @getimagesize($image);
711 6847 acydburn
        }
712 6847 acydburn
713 6847 acydburn
        return false;
714 6847 acydburn
}
715 6847 acydburn
716 6847 acydburn
/**
717 6847 acydburn
* Obtain the width of the specified smilie
718 6847 acydburn
*/
719 6847 acydburn
function get_smiley_width($src)
720 6847 acydburn
{
721 6847 acydburn
        return get_smiley_dim($src, 0);
722 6847 acydburn
}
723 6847 acydburn
724 6847 acydburn
/**
725 6847 acydburn
* Obtain the height of the specified smilie
726 6847 acydburn
*/
727 6847 acydburn
function get_smiley_height($src)
728 6847 acydburn
{
729 6847 acydburn
        return get_smiley_dim($src, 1);
730 6847 acydburn
}
731 6847 acydburn
732 6847 acydburn
/**
733 6847 acydburn
* Obtain the size of the specified smilie (using the cache if possible) and cache the value
734 6847 acydburn
*/
735 6847 acydburn
function get_smiley_dim($source, $axis)
736 6847 acydburn
{
737 6847 acydburn
        if (empty($source))
738 6847 acydburn
        {
739 6847 acydburn
                return 15;
740 6847 acydburn
        }
741 6847 acydburn
742 6847 acydburn
        static $smiley_cache = array();
743 6847 acydburn
744 6847 acydburn
        if (isset($smiley_cache[$source]))
745 6847 acydburn
        {
746 6847 acydburn
                return $smiley_cache[$source][$axis];
747 6847 acydburn
        }
748 6847 acydburn
749 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user;
750 6847 acydburn
751 6847 acydburn
        $orig_source = $source;
752 6847 acydburn
753 6847 acydburn
        if (!isset($convert->convertor['smilies_path']))
754 6847 acydburn
        {
755 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_SMILIES_PATH'], 'get_smiley_dim()'), __LINE__, __FILE__);
756 6847 acydburn
        }
757 6847 acydburn
758 6847 acydburn
        if (!empty($convert->convertor['smilies_path']) && strpos($source, $convert->convertor['smilies_path']) !== 0)
759 6847 acydburn
        {
760 6847 acydburn
                $source = $convert->convertor['smilies_path'] . $source;
761 6847 acydburn
        }
762 6847 acydburn
763 6847 acydburn
        $smiley_cache[$orig_source] = get_image_dim($source);
764 6847 acydburn
765 6847 acydburn
        if (empty($smiley_cache[$orig_source]) || empty($smiley_cache[$orig_source][0]) || empty($smiley_cache[$orig_source][1]))
766 6847 acydburn
        {
767 6847 acydburn
                $smiley_cache[$orig_source] = array(15, 15);
768 6847 acydburn
                return 15;
769 6847 acydburn
        }
770 6847 acydburn
771 6847 acydburn
        return $smiley_cache[$orig_source][$axis];
772 6847 acydburn
}
773 6847 acydburn
774 6847 acydburn
/**
775 6847 acydburn
* Obtain the width of the specified avatar
776 6847 acydburn
*/
777 6847 acydburn
function get_avatar_width($src, $func = false, $arg1 = false, $arg2 = false)
778 6847 acydburn
{
779 6847 acydburn
        return get_avatar_dim($src, 0, $func, $arg1, $arg2);
780 6847 acydburn
}
781 6847 acydburn
782 6847 acydburn
/**
783 6847 acydburn
* Obtain the height of the specified avatar
784 6847 acydburn
*/
785 6847 acydburn
function get_avatar_height($src, $func = false, $arg1 = false, $arg2 = false)
786 6847 acydburn
{
787 6847 acydburn
        return get_avatar_dim($src, 1, $func, $arg1, $arg2);
788 6847 acydburn
}
789 6847 acydburn
790 6847 acydburn
/**
791 6847 acydburn
*/
792 6847 acydburn
function get_avatar_dim($src, $axis, $func = false, $arg1 = false, $arg2 = false)
793 6847 acydburn
{
794 6847 acydburn
        $avatar_type = AVATAR_UPLOAD;
795 6847 acydburn
796 6847 acydburn
        if ($func)
797 6847 acydburn
        {
798 6847 acydburn
                if ($arg1 || $arg2)
799 6847 acydburn
                {
800 6847 acydburn
                        $ary = array($arg1);
801 6847 acydburn
802 6847 acydburn
                        if ($arg2)
803 6847 acydburn
                        {
804 6847 acydburn
                                $ary[] = $arg2;
805 6847 acydburn
                        }
806 6847 acydburn
807 6847 acydburn
                        $avatar_type = call_user_func_array($func, $ary);
808 6847 acydburn
                }
809 6847 acydburn
                else
810 6847 acydburn
                {
811 6847 acydburn
                        $avatar_type = call_user_func($func);
812 6847 acydburn
                }
813 6847 acydburn
        }
814 6847 acydburn
815 6847 acydburn
        switch ($avatar_type)
816 6847 acydburn
        {
817 6847 acydburn
                case AVATAR_UPLOAD:
818 6847 acydburn
                        return get_upload_avatar_dim($src, $axis);
819 6847 acydburn
                break;
820 6847 acydburn
821 6847 acydburn
                case AVATAR_GALLERY:
822 6847 acydburn
                        return get_gallery_avatar_dim($src, $axis);
823 6847 acydburn
                break;
824 6847 acydburn
825 6847 acydburn
                case AVATAR_REMOTE:
826 6847 acydburn
                         // see notes on this functions usage and (hopefully) model $func to avoid this accordingly
827 6847 acydburn
                        return get_remote_avatar_dim($src, $axis);
828 6847 acydburn
                break;
829 6847 acydburn
830 6847 acydburn
                default:
831 7040 acydburn
                        $default_x = (defined('DEFAULT_AVATAR_X_CUSTOM')) ? DEFAULT_AVATAR_X_CUSTOM : DEFAULT_AVATAR_X;
832 7040 acydburn
                        $default_y = (defined('DEFAULT_AVATAR_Y_CUSTOM')) ? DEFAULT_AVATAR_Y_CUSTOM : DEFAULT_AVATAR_Y;
833 7040 acydburn
834 7040 acydburn
                        return $axis ? $default_y : $default_x;
835 6847 acydburn
                break;
836 6847 acydburn
        }
837 6847 acydburn
}
838 6847 acydburn
839 6847 acydburn
/**
840 6847 acydburn
* Obtain the size of the specified uploaded avatar (using the cache if possible) and cache the value
841 6847 acydburn
*/
842 6847 acydburn
function get_upload_avatar_dim($source, $axis)
843 6847 acydburn
{
844 6847 acydburn
        static $cachedims = false;
845 6847 acydburn
        static $cachekey = false;
846 6847 acydburn
847 6847 acydburn
        if (empty($source))
848 6847 acydburn
        {
849 6847 acydburn
                return 0;
850 6847 acydburn
        }
851 6847 acydburn
852 6847 acydburn
        if ($cachekey == $source)
853 6847 acydburn
        {
854 6847 acydburn
                return $cachedims[$axis];
855 6847 acydburn
        }
856 6847 acydburn
857 6847 acydburn
        $orig_source = $source;
858 6847 acydburn
859 6847 acydburn
        if (substr($source, 0, 7) == 'upload:')
860 6847 acydburn
        {
861 6847 acydburn
                $source = substr($source, 7);
862 6847 acydburn
        }
863 6847 acydburn
864 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user;
865 6847 acydburn
866 6847 acydburn
        if (!isset($convert->convertor['avatar_path']))
867 6847 acydburn
        {
868 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_AVATAR_PATH'], 'get_upload_avatar_dim()'), __LINE__, __FILE__);
869 6847 acydburn
        }
870 6847 acydburn
871 6847 acydburn
        if (!empty($convert->convertor['avatar_path']) && strpos($source, $convert->convertor['avatar_path']) !== 0)
872 6847 acydburn
        {
873 6847 acydburn
                $source = path($convert->convertor['avatar_path'], empty($convert->convertor['source_path_absolute'])) . $source;
874 6847 acydburn
        }
875 6847 acydburn
876 6847 acydburn
        $cachedims = get_image_dim($source);
877 6847 acydburn
878 6847 acydburn
        if (empty($cachedims) || empty($cachedims[0]) || empty($cachedims[1]))
879 6847 acydburn
        {
880 7040 acydburn
                $default_x = (defined('DEFAULT_AVATAR_X_CUSTOM')) ? DEFAULT_AVATAR_X_CUSTOM : DEFAULT_AVATAR_X;
881 7040 acydburn
                $default_y = (defined('DEFAULT_AVATAR_Y_CUSTOM')) ? DEFAULT_AVATAR_Y_CUSTOM : DEFAULT_AVATAR_Y;
882 7040 acydburn
883 7040 acydburn
                $cachedims = array($default_x, $default_y);
884 6847 acydburn
        }
885 6847 acydburn
886 6847 acydburn
        return $cachedims[$axis];
887 6847 acydburn
}
888 6847 acydburn
889 6847 acydburn
/**
890 6847 acydburn
* Obtain the size of the specified gallery avatar (using the cache if possible) and cache the value
891 6847 acydburn
*/
892 6847 acydburn
function get_gallery_avatar_dim($source, $axis)
893 6847 acydburn
{
894 6847 acydburn
        if (empty($source))
895 6847 acydburn
        {
896 6847 acydburn
                return 0;
897 6847 acydburn
        }
898 6847 acydburn
899 6847 acydburn
        static $avatar_cache = array();
900 6847 acydburn
901 6847 acydburn
        if (isset($avatar_cache[$source]))
902 6847 acydburn
        {
903 6847 acydburn
                return $avatar_cache[$source][$axis];
904 6847 acydburn
        }
905 6847 acydburn
906 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user;
907 6847 acydburn
908 6847 acydburn
        $orig_source = $source;
909 6847 acydburn
910 6847 acydburn
        if (!isset($convert->convertor['avatar_gallery_path']))
911 6847 acydburn
        {
912 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_GALLERY_PATH'], 'get_gallery_avatar_dim()'), __LINE__, __FILE__);
913 6847 acydburn
        }
914 6847 acydburn
915 6847 acydburn
        if (!empty($convert->convertor['avatar_gallery_path']) && strpos($source, $convert->convertor['avatar_gallery_path']) !== 0)
916 6847 acydburn
        {
917 6847 acydburn
                $source = path($convert->convertor['avatar_gallery_path'], empty($convert->convertor['source_path_absolute'])) . $source;
918 6847 acydburn
        }
919 6847 acydburn
920 6847 acydburn
        $avatar_cache[$orig_source] = get_image_dim($source);
921 6847 acydburn
922 6847 acydburn
        if (empty($avatar_cache[$orig_source]) || empty($avatar_cache[$orig_source][0]) || empty($avatar_cache[$orig_source][1]))
923 6847 acydburn
        {
924 7040 acydburn
                $default_x = (defined('DEFAULT_AVATAR_X_CUSTOM')) ? DEFAULT_AVATAR_X_CUSTOM : DEFAULT_AVATAR_X;
925 7040 acydburn
                $default_y = (defined('DEFAULT_AVATAR_Y_CUSTOM')) ? DEFAULT_AVATAR_Y_CUSTOM : DEFAULT_AVATAR_Y;
926 7040 acydburn
927 7040 acydburn
                $avatar_cache[$orig_source] = array($default_x, $default_y);
928 6847 acydburn
        }
929 6847 acydburn
930 6847 acydburn
        return $avatar_cache[$orig_source][$axis];
931 6847 acydburn
}
932 6847 acydburn
933 6847 acydburn
/**
934 6847 acydburn
* Obtain the size of the specified remote avatar (using the cache if possible) and cache the value
935 6847 acydburn
* Whilst it's unlikely that remote avatars will be duplicated, it is possible so caching seems the best option
936 6847 acydburn
* This should only be called from a post processing step due to the possibility of network timeouts
937 6847 acydburn
*/
938 7529 kellanved
function get_remote_avatar_dim($src, $axis)
939 6847 acydburn
{
940 6847 acydburn
        if (empty($src))
941 6847 acydburn
        {
942 6847 acydburn
                return 0;
943 6847 acydburn
        }
944 6847 acydburn
945 7529 kellanved
        static $remote_avatar_cache = array();
946 6847 acydburn
947 7529 kellanved
        // an ugly hack: we assume that the dimensions of each remote avatar are accessed exactly twice (x and y)
948 7529 kellanved
        if (isset($remote_avatar_cache[$src]))
949 6847 acydburn
        {
950 7529 kellanved
                $retval = $remote_avatar_cache[$src][$axis];
951 7529 kellanved
                unset($remote_avatar_cache);
952 7529 kellanved
                return $retval;
953 6847 acydburn
        }
954 8667 acydburn
955 7545 kellanved
        $url_info = @parse_url($src);
956 7549 kellanved
        if (empty($url_info['host']))
957 7545 kellanved
        {
958 7545 kellanved
                return 0;
959 7545 kellanved
        }
960 7401 kellanved
        $host = $url_info['host'];
961 7401 kellanved
        $port = (isset($url_info['port'])) ? $url_info['port'] : 0;
962 7545 kellanved
        $protocol = (isset($url_info['scheme'])) ? $url_info['scheme'] : 'http';
963 7401 kellanved
        if (empty($port))
964 7401 kellanved
        {
965 7401 kellanved
                switch(strtolower($protocol))
966 7401 kellanved
                {
967 7401 kellanved
                        case 'ftp':
968 7401 kellanved
                                $port = 21;
969 7401 kellanved
                                break;
970 8667 acydburn
971 7401 kellanved
                        case 'https':
972 7401 kellanved
                                $port = 443;
973 7401 kellanved
                                break;
974 8667 acydburn
975 7401 kellanved
                        default:
976 7401 kellanved
                                $port = 80;
977 7401 kellanved
                }
978 7401 kellanved
        }
979 8667 acydburn
980 7400 kellanved
        $timeout = @ini_get('default_socket_timeout');
981 7529 kellanved
        @ini_set('default_socket_timeout', 2);
982 8667 acydburn
983 7401 kellanved
        // We're just trying to reach the server to avoid timeouts
984 7529 kellanved
        $fp = @fsockopen($host, $port, $errno, $errstr, 1);
985 7401 kellanved
        if ($fp)
986 7401 kellanved
        {
987 7529 kellanved
                $remote_avatar_cache[$src] = @getimagesize($src);
988 7401 kellanved
                fclose($fp);
989 7401 kellanved
        }
990 8667 acydburn
991 7399 kellanved
        $default_x         = (defined('DEFAULT_AVATAR_X_CUSTOM')) ? DEFAULT_AVATAR_X_CUSTOM : DEFAULT_AVATAR_X;
992 7399 kellanved
        $default_y         = (defined('DEFAULT_AVATAR_Y_CUSTOM')) ? DEFAULT_AVATAR_Y_CUSTOM : DEFAULT_AVATAR_Y;
993 7399 kellanved
        $default         = array($default_x, $default_y);
994 8667 acydburn
995 7529 kellanved
        if (empty($remote_avatar_cache[$src]) || empty($remote_avatar_cache[$src][0]) || empty($remote_avatar_cache[$src][1]))
996 6847 acydburn
        {
997 7529 kellanved
                $remote_avatar_cache[$src] = $default;
998 6847 acydburn
        }
999 7399 kellanved
        else
1000 7399 kellanved
        {
1001 7399 kellanved
                // We trust gallery and uploaded avatars to conform to the size settings; we might have to adjust here
1002 7529 kellanved
                if ($remote_avatar_cache[$src][0] > $default_x || $remote_avatar_cache[$src][1] > $default_y)
1003 7399 kellanved
                {
1004 7529 kellanved
                        $bigger = ($remote_avatar_cache[$src][0] > $remote_avatar_cache[$src][1]) ? 0 : 1;
1005 7529 kellanved
                        $ratio = $default[$bigger] / $remote_avatar_cache[$src][$bigger];
1006 7529 kellanved
                        $remote_avatar_cache[$src][0] = (int)($remote_avatar_cache[$src][0] * $ratio);
1007 7529 kellanved
                        $remote_avatar_cache[$src][1] = (int)($remote_avatar_cache[$src][1] * $ratio);
1008 7399 kellanved
                }
1009 7399 kellanved
        }
1010 8667 acydburn
1011 7400 kellanved
        @ini_set('default_socket_timeout', $timeout);
1012 7529 kellanved
        return $remote_avatar_cache[$src][$axis];
1013 6847 acydburn
}
1014 6847 acydburn
1015 6847 acydburn
function set_user_options()
1016 6847 acydburn
{
1017 6847 acydburn
        global $convert_row;
1018 6847 acydburn
1019 6847 acydburn
        // Key need to be set in row, else default value is chosen
1020 6847 acydburn
        $keyoptions = array(
1021 8133 acydburn
                'viewimg'                => array('bit' => 0, 'default' => 1),
1022 6847 acydburn
                'viewflash'                => array('bit' => 1, 'default' => 1),
1023 6847 acydburn
                'viewsmilies'        => array('bit' => 2, 'default' => 1),
1024 6847 acydburn
                'viewsigs'                => array('bit' => 3, 'default' => 1),
1025 8133 acydburn
                'viewavatars'        => array('bit' => 4, 'default' => 1),
1026 8133 acydburn
                'viewcensors'        => array('bit' => 5, 'default' => 1),
1027 8133 acydburn
                'attachsig'                => array('bit' => 6, 'default' => 0),
1028 8133 acydburn
                'bbcode'                => array('bit' => 8, 'default' => 1),
1029 8133 acydburn
                'smilies'                => array('bit' => 9, 'default' => 1),
1030 6847 acydburn
                'popuppm'                => array('bit' => 10, 'default' => 0),
1031 10651 git-gate
                'sig_bbcode'        => array('bit' => 15, 'default' => 1),
1032 10651 git-gate
                'sig_smilies'        => array('bit' => 16, 'default' => 1),
1033 10651 git-gate
                'sig_links'                => array('bit' => 17, 'default' => 1),
1034 6847 acydburn
        );
1035 6847 acydburn
1036 6847 acydburn
        $option_field = 0;
1037 6847 acydburn
1038 6847 acydburn
        foreach ($keyoptions as $key => $key_ary)
1039 6847 acydburn
        {
1040 6872 acydburn
                $value = (isset($convert_row[$key])) ? (int) $convert_row[$key] : $key_ary['default'];
1041 6847 acydburn
1042 6847 acydburn
                if ($value && !($option_field & 1 << $key_ary['bit']))
1043 6847 acydburn
                {
1044 6847 acydburn
                        $option_field += 1 << $key_ary['bit'];
1045 6847 acydburn
                }
1046 6847 acydburn
        }
1047 6847 acydburn
1048 6847 acydburn
        return $option_field;
1049 6847 acydburn
}
1050 6847 acydburn
1051 6847 acydburn
/**
1052 6847 acydburn
* Index messages on the fly as we convert them
1053 6847 acydburn
* @todo naderman, can you check that this works with the new search plugins as it's use is currently disabled (and thus untested)
1054 6847 acydburn
function search_indexing($message = '')
1055 6847 acydburn
{
1056 6847 acydburn
        global $fulltext_search, $convert_row;
1057 6847 acydburn
1058 6847 acydburn
        if (!isset($convert_row['post_id']))
1059 6847 acydburn
        {
1060 6847 acydburn
                return;
1061 6847 acydburn
        }
1062 6847 acydburn
1063 6847 acydburn
        if (!$message)
1064 6847 acydburn
        {
1065 6847 acydburn
                if (!isset($convert_row['message']))
1066 6847 acydburn
                {
1067 6847 acydburn
                        return;
1068 6847 acydburn
                }
1069 6847 acydburn
1070 6847 acydburn
                $message = $convert_row['message'];
1071 6847 acydburn
        }
1072 6847 acydburn
1073 6847 acydburn
        $title = (isset($convert_row['title'])) ? $convert_row['title'] : '';
1074 6847 acydburn
1075 6847 acydburn
        $fulltext_search->index('post', $convert_row['post_id'], $message, $title, $convert_row['poster_id'], $convert_row['forum_id']);
1076 6847 acydburn
}
1077 6847 acydburn
*/
1078 6847 acydburn
1079 6847 acydburn
function make_unique_filename($filename)
1080 6847 acydburn
{
1081 6847 acydburn
        if (!strlen($filename))
1082 6847 acydburn
        {
1083 6847 acydburn
                $filename = md5(unique_id()) . '.dat';
1084 6847 acydburn
        }
1085 6847 acydburn
        else if ($filename[0] == '.')
1086 6847 acydburn
        {
1087 6847 acydburn
                $filename = md5(unique_id()) . $filename;
1088 6847 acydburn
        }
1089 6847 acydburn
        else if (preg_match('/\.([a-z]+)$/i', $filename, $m))
1090 6847 acydburn
        {
1091 6847 acydburn
                $filename = preg_replace('/\.([a-z]+)$/i', '_' . md5(unique_id()) . '.\1', $filename);
1092 6847 acydburn
        }
1093 6847 acydburn
        else
1094 6847 acydburn
        {
1095 6847 acydburn
                $filename .= '_' . md5(unique_id()) . '.dat';
1096 6847 acydburn
        }
1097 6847 acydburn
1098 6847 acydburn
        return $filename;
1099 6847 acydburn
}
1100 6847 acydburn
1101 6847 acydburn
function words_unique(&$words)
1102 6847 acydburn
{
1103 6847 acydburn
        reset($words);
1104 6847 acydburn
        $return_array = array();
1105 6847 acydburn
1106 6847 acydburn
        $word = current($words);
1107 6847 acydburn
        do
1108 6847 acydburn
        {
1109 6847 acydburn
                $return_array[$word] = $word;
1110 6847 acydburn
        }
1111 6847 acydburn
        while ($word = next($words));
1112 6847 acydburn
1113 6847 acydburn
        return $return_array;
1114 6847 acydburn
}
1115 6847 acydburn
1116 6847 acydburn
/**
1117 6847 acydburn
* Adds a user to the specified group and optionally makes them a group leader
1118 6847 acydburn
* This function does not create the group if it does not exist and so should only be called after the groups have been created
1119 6847 acydburn
*/
1120 6847 acydburn
function add_user_group($group_id, $user_id, $group_leader=false)
1121 6847 acydburn
{
1122 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user, $db;
1123 8667 acydburn
1124 6847 acydburn
        $sql = 'INSERT INTO ' . USER_GROUP_TABLE . ' ' . $db->sql_build_array('INSERT', array(
1125 6847 acydburn
                'group_id'                => $group_id,
1126 6847 acydburn
                'user_id'                => $user_id,
1127 6847 acydburn
                'group_leader'        => ($group_leader) ? 1 : 0,
1128 6847 acydburn
                'user_pending'        => 0));
1129 6847 acydburn
        $db->sql_query($sql);
1130 6847 acydburn
}
1131 6847 acydburn
1132 6847 acydburn
// STANDALONE FUNCTIONS
1133 6847 acydburn
1134 6847 acydburn
/**
1135 6847 acydburn
* Add users to the pre-defined "special" groups
1136 6939 acydburn
*
1137 6847 acydburn
* @param string $group The name of the special group to add to
1138 6847 acydburn
* @param string $select_query An SQL query to retrieve the user(s) to add to the group
1139 6847 acydburn
*/
1140 7002 naderman
function user_group_auth($group, $select_query, $use_src_db)
1141 6847 acydburn
{
1142 6995 naderman
        global $convert, $phpbb_root_path, $config, $user, $db, $src_db, $same_db;
1143 6847 acydburn
1144 6847 acydburn
        if (!in_array($group, array('guests', 'registered', 'registered_coppa', 'global_moderators', 'administrators', 'bots')))
1145 6847 acydburn
        {
1146 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_WRONG_GROUP'], $group, 'user_group_auth()'), __LINE__, __FILE__, true);
1147 6847 acydburn
                return;
1148 6847 acydburn
        }
1149 6847 acydburn
1150 6847 acydburn
        $sql = 'SELECT group_id
1151 6847 acydburn
                FROM ' . GROUPS_TABLE . "
1152 6847 acydburn
                WHERE group_name = '" . $db->sql_escape(strtoupper($group)) . "'";
1153 6847 acydburn
        $result = $db->sql_query($sql);
1154 6847 acydburn
        $group_id = (int) $db->sql_fetchfield('group_id');
1155 6847 acydburn
        $db->sql_freeresult($result);
1156 6847 acydburn
1157 6847 acydburn
        if (!$group_id)
1158 6847 acydburn
        {
1159 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_NO_GROUP'], $group, 'user_group_auth()'), __LINE__, __FILE__, true);
1160 6847 acydburn
                return;
1161 6847 acydburn
        }
1162 6847 acydburn
1163 7002 naderman
        if ($same_db || !$use_src_db)
1164 6995 naderman
        {
1165 6995 naderman
                $sql = 'INSERT INTO ' . USER_GROUP_TABLE . ' (user_id, group_id, user_pending)
1166 6995 naderman
                        ' . str_replace('{' . strtoupper($group) . '}', $group_id . ', 0', $select_query);
1167 6995 naderman
                $db->sql_query($sql);
1168 6995 naderman
        }
1169 6995 naderman
        else
1170 6995 naderman
        {
1171 7662 kellanved
                $result = $src_db->sql_query(str_replace('{' . strtoupper($group) . '}', $group_id . ' ', $select_query));
1172 6995 naderman
                while ($row = $src_db->sql_fetchrow($result))
1173 6995 naderman
                {
1174 6995 naderman
                        // this might become quite a lot of INSERTS unfortunately
1175 7662 kellanved
                        $sql = 'INSERT INTO ' . USER_GROUP_TABLE . " (user_id, group_id, user_pending)
1176 7662 kellanved
                                VALUES ({$row['user_id']}, $group_id, 0)";
1177 6995 naderman
                        $db->sql_query($sql);
1178 6995 naderman
                }
1179 6995 naderman
                $src_db->sql_freeresult($result);
1180 6995 naderman
        }
1181 6847 acydburn
}
1182 6847 acydburn
1183 6847 acydburn
/**
1184 6847 acydburn
* Retrieves configuration information from the source forum and caches it as an array
1185 6847 acydburn
* Both database and file driven configuration formats can be handled
1186 6847 acydburn
* (the type used is specified in $config_schema, see convert_phpbb20.php for more details)
1187 6847 acydburn
*/
1188 6847 acydburn
function get_config()
1189 6847 acydburn
{
1190 6847 acydburn
        static $convert_config;
1191 6847 acydburn
        global $user;
1192 6847 acydburn
1193 6847 acydburn
        if (isset($convert_config))
1194 6847 acydburn
        {
1195 6847 acydburn
                return $convert_config;
1196 6847 acydburn
        }
1197 6847 acydburn
1198 6995 naderman
        global $src_db, $same_db, $phpbb_root_path, $config;
1199 6847 acydburn
        global $convert;
1200 6847 acydburn
1201 6847 acydburn
        if ($convert->config_schema['table_format'] != 'file')
1202 6847 acydburn
        {
1203 6995 naderman
                if ($convert->mysql_convert && $same_db)
1204 6995 naderman
                {
1205 6995 naderman
                        $src_db->sql_query("SET NAMES 'binary'");
1206 6995 naderman
                }
1207 6995 naderman
1208 6847 acydburn
                $sql = 'SELECT * FROM ' . $convert->src_table_prefix . $convert->config_schema['table_name'];
1209 6995 naderman
                $result = $src_db->sql_query($sql);
1210 6995 naderman
                $row = $src_db->sql_fetchrow($result);
1211 6847 acydburn
1212 6847 acydburn
                if (!$row)
1213 6847 acydburn
                {
1214 6847 acydburn
                        $convert->p_master->error($user->lang['CONV_ERROR_GET_CONFIG'], __LINE__, __FILE__);
1215 6847 acydburn
                }
1216 6847 acydburn
        }
1217 6847 acydburn
1218 6847 acydburn
        if (is_array($convert->config_schema['table_format']))
1219 6847 acydburn
        {
1220 6847 acydburn
                $convert_config = array();
1221 6847 acydburn
                list($key, $val) = each($convert->config_schema['table_format']);
1222 6847 acydburn
1223 6847 acydburn
                do
1224 6847 acydburn
                {
1225 6847 acydburn
                        $convert_config[$row[$key]] = $row[$val];
1226 6847 acydburn
                }
1227 6995 naderman
                while ($row = $src_db->sql_fetchrow($result));
1228 6995 naderman
                $src_db->sql_freeresult($result);
1229 6995 naderman
1230 6995 naderman
                if ($convert->mysql_convert && $same_db)
1231 6995 naderman
                {
1232 6995 naderman
                        $src_db->sql_query("SET NAMES 'utf8'");
1233 6995 naderman
                }
1234 6847 acydburn
        }
1235 6847 acydburn
        else if ($convert->config_schema['table_format'] == 'file')
1236 6847 acydburn
        {
1237 6872 acydburn
                $filename = $convert->options['forum_path'] . '/' . $convert->config_schema['filename'];
1238 6847 acydburn
                if (!file_exists($filename))
1239 6847 acydburn
                {
1240 6847 acydburn
                        $convert->p_master->error($user->lang['FILE_NOT_FOUND'] . ': ' . $filename, __LINE__, __FILE__);
1241 6847 acydburn
                }
1242 6847 acydburn
1243 10558 git-gate
                if (isset($convert->config_schema['array_name']))
1244 10558 git-gate
                {
1245 10558 git-gate
                        unset($convert->config_schema['array_name']);
1246 10558 git-gate
                }
1247 10558 git-gate
1248 6847 acydburn
                $convert_config = extract_variables_from_file($filename);
1249 6847 acydburn
                if (!empty($convert->config_schema['array_name']))
1250 6847 acydburn
                {
1251 6847 acydburn
                        $convert_config = $convert_config[$convert->config_schema['array_name']];
1252 6847 acydburn
                }
1253 6847 acydburn
        }
1254 6847 acydburn
        else
1255 6847 acydburn
        {
1256 6847 acydburn
                $convert_config = $row;
1257 6995 naderman
                if ($convert->mysql_convert && $same_db)
1258 6995 naderman
                {
1259 6995 naderman
                        $src_db->sql_query("SET NAMES 'utf8'");
1260 6995 naderman
                }
1261 6847 acydburn
        }
1262 6847 acydburn
1263 6847 acydburn
        if (!sizeof($convert_config))
1264 6847 acydburn
        {
1265 7760 kellanved
                $convert->p_master->error($user->lang['CONV_ERROR_CONFIG_EMPTY'], __LINE__, __FILE__);
1266 6847 acydburn
        }
1267 6847 acydburn
1268 6847 acydburn
        return $convert_config;
1269 6847 acydburn
}
1270 6847 acydburn
1271 6847 acydburn
/**
1272 6847 acydburn
* Transfers the relevant configuration information from the source forum
1273 6847 acydburn
* The mapping of fields is specified in $config_schema, see convert_phpbb20.php for more details
1274 6847 acydburn
*/
1275 6847 acydburn
function restore_config($schema)
1276 6847 acydburn
{
1277 6847 acydburn
        global $db, $config;
1278 6847 acydburn
1279 6847 acydburn
        $convert_config = get_config();
1280 10558 git-gate
1281 6847 acydburn
        foreach ($schema['settings'] as $config_name => $src)
1282 6847 acydburn
        {
1283 6847 acydburn
                if (preg_match('/(.*)\((.*)\)/', $src, $m))
1284 6847 acydburn
                {
1285 7322 acydburn
                        $var = (empty($m[2]) || empty($convert_config[$m[2]])) ? "''" : "'" . addslashes($convert_config[$m[2]]) . "'";
1286 6847 acydburn
                        $exec = '$config_value = ' . $m[1] . '(' . $var . ');';
1287 6847 acydburn
                        eval($exec);
1288 6847 acydburn
                }
1289 6847 acydburn
                else
1290 6847 acydburn
                {
1291 10558 git-gate
                        if ($schema['table_format'] != 'file' || empty($schema['array_name']))
1292 10558 git-gate
                        {
1293 10558 git-gate
                                $config_value = (isset($convert_config[$src])) ? $convert_config[$src] : '';
1294 10558 git-gate
                        }
1295 10558 git-gate
                        else if (!empty($schema['array_name']))
1296 10558 git-gate
                        {
1297 10558 git-gate
                                $src_ary = $schema['array_name'];
1298 10558 git-gate
                                $config_value = (isset($convert_config[$src_ary][$src])) ? $convert_config[$src_ary][$src] : '';
1299 10558 git-gate
                        }
1300 10558 git-gate
                   }
1301 6847 acydburn
1302 6847 acydburn
                if ($config_value !== '')
1303 6847 acydburn
                {
1304 6927 acydburn
                        // Most are...
1305 6927 acydburn
                        if (is_string($config_value))
1306 6927 acydburn
                        {
1307 8667 acydburn
                                $config_value = truncate_string(utf8_htmlspecialchars($config_value), 255, 255, false);
1308 6927 acydburn
                        }
1309 6927 acydburn
1310 6847 acydburn
                        set_config($config_name, $config_value);
1311 6847 acydburn
                }
1312 6847 acydburn
        }
1313 6847 acydburn
}
1314 6847 acydburn
1315 6847 acydburn
/**
1316 6847 acydburn
* Update the count of PM's in custom folders for all users
1317 6847 acydburn
*/
1318 6847 acydburn
function update_folder_pm_count()
1319 6847 acydburn
{
1320 6847 acydburn
        global $db, $convert, $user;
1321 6847 acydburn
1322 6847 acydburn
        $sql = 'SELECT user_id, folder_id, COUNT(msg_id) as num_messages
1323 6847 acydburn
                FROM ' . PRIVMSGS_TO_TABLE . '
1324 6847 acydburn
                WHERE folder_id NOT IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ', ' . PRIVMSGS_INBOX . ', ' . PRIVMSGS_OUTBOX . ', ' . PRIVMSGS_SENTBOX . ')
1325 6971 davidmj
                GROUP BY folder_id, user_id';
1326 6847 acydburn
        $result = $db->sql_query($sql);
1327 6847 acydburn
1328 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
1329 6847 acydburn
        {
1330 6847 acydburn
                $db->sql_query('UPDATE ' . PRIVMSGS_FOLDER_TABLE . ' SET pm_count = ' . $row['num_messages'] . '
1331 6847 acydburn
                        WHERE user_id = ' . $row['user_id'] . ' AND folder_id = ' . $row['folder_id']);
1332 6847 acydburn
        }
1333 6847 acydburn
        $db->sql_freeresult($result);
1334 6847 acydburn
}
1335 6847 acydburn
1336 6915 acydburn
// Functions mainly used by the main convertor script
1337 6847 acydburn
1338 6847 acydburn
function path($path, $path_relative = true)
1339 6847 acydburn
{
1340 7198 acydburn
        if ($path === false)
1341 7198 acydburn
        {
1342 7198 acydburn
                return '';
1343 7198 acydburn
        }
1344 7198 acydburn
1345 6847 acydburn
        if (substr($path, -1) != '/')
1346 6847 acydburn
        {
1347 6847 acydburn
                $path .= '/';
1348 6847 acydburn
        }
1349 6847 acydburn
1350 6847 acydburn
        if (!$path_relative)
1351 6847 acydburn
        {
1352 6847 acydburn
                return $path;
1353 6847 acydburn
        }
1354 6847 acydburn
1355 6847 acydburn
        if (substr($path, 0, 1) == '/')
1356 6847 acydburn
        {
1357 6847 acydburn
                $path = substr($path, 1);
1358 6847 acydburn
        }
1359 6847 acydburn
1360 6847 acydburn
        return $path;
1361 6847 acydburn
}
1362 6847 acydburn
1363 6847 acydburn
/**
1364 6847 acydburn
* Extract the variables defined in a configuration file
1365 6847 acydburn
* @todo As noted by Xore we need to look at this from a security perspective
1366 6847 acydburn
*/
1367 6847 acydburn
function extract_variables_from_file($_filename)
1368 6847 acydburn
{
1369 6847 acydburn
        include($_filename);
1370 6847 acydburn
1371 6847 acydburn
        $vars = get_defined_vars();
1372 6847 acydburn
        unset($vars['_filename']);
1373 6847 acydburn
1374 6847 acydburn
        return $vars;
1375 6847 acydburn
}
1376 6847 acydburn
1377 6847 acydburn
function get_path($src_path, $src_url, $test_file)
1378 6847 acydburn
{
1379 6847 acydburn
        global $config, $phpbb_root_path, $phpEx;
1380 6847 acydburn
1381 6847 acydburn
        $board_config = get_config();
1382 6847 acydburn
1383 6847 acydburn
        $test_file = preg_replace('/\.php$/i', ".$phpEx", $test_file);
1384 6847 acydburn
        $src_path = path($src_path);
1385 6847 acydburn
1386 6847 acydburn
        if (@file_exists($phpbb_root_path . $src_path . $test_file))
1387 6847 acydburn
        {
1388 6847 acydburn
                return $src_path;
1389 6847 acydburn
        }
1390 6847 acydburn
1391 6847 acydburn
        if (!empty($src_url) && !empty($board_config['server_name']))
1392 6847 acydburn
        {
1393 6847 acydburn
                if (!preg_match('#https?://([^/]+)(.*)#i', $src_url, $m))
1394 6847 acydburn
                {
1395 6847 acydburn
                        return false;
1396 6847 acydburn
                }
1397 6847 acydburn
1398 6847 acydburn
                if ($m[1] != $board_config['server_name'])
1399 6847 acydburn
                {
1400 6847 acydburn
                        return false;
1401 6847 acydburn
                }
1402 6847 acydburn
1403 6847 acydburn
                $url_parts = explode('/', $m[2]);
1404 6847 acydburn
                if (substr($src_url, -1) != '/')
1405 6847 acydburn
                {
1406 7211 davidmj
                        if (preg_match('/.*\.([a-z0-9]{3,4})$/i', $url_parts[sizeof($url_parts) - 1]))
1407 6847 acydburn
                        {
1408 6847 acydburn
                                $url_parts[sizeof($url_parts) - 1] = '';
1409 6847 acydburn
                        }
1410 6847 acydburn
                        else
1411 6847 acydburn
                        {
1412 6847 acydburn
                                $url_parts[] = '';
1413 6847 acydburn
                        }
1414 6847 acydburn
                }
1415 6847 acydburn
1416 6847 acydburn
                $script_path = $board_config['script_path'];
1417 6847 acydburn
                if (substr($script_path, -1) == '/')
1418 6847 acydburn
                {
1419 6847 acydburn
                        $script_path = substr($script_path, 0, -1);
1420 6847 acydburn
                }
1421 6847 acydburn
1422 6847 acydburn
                $path_array = array();
1423 6847 acydburn
1424 6847 acydburn
                $phpbb_parts = explode('/', $script_path);
1425 6847 acydburn
                for ($i = 0; $i < sizeof($url_parts); ++$i)
1426 6847 acydburn
                {
1427 6847 acydburn
                        if ($i < sizeof($phpbb_parts[$i]) && $url_parts[$i] == $phpbb_parts[$i])
1428 6847 acydburn
                        {
1429 6847 acydburn
                                $path_array[] = $url_parts[$i];
1430 6847 acydburn
                                unset($url_parts[$i]);
1431 6847 acydburn
                        }
1432 6847 acydburn
                        else
1433 6847 acydburn
                        {
1434 6847 acydburn
                                $path = '';
1435 6847 acydburn
                                for ($j = $i; $j < sizeof($phpbb_parts); ++$j)
1436 6847 acydburn
                                {
1437 6847 acydburn
                                        $path .= '../';
1438 6847 acydburn
                                }
1439 6847 acydburn
                                $path .= implode('/', $url_parts);
1440 6847 acydburn
                                break;
1441 6847 acydburn
                        }
1442 6847 acydburn
                }
1443 6847 acydburn
1444 6847 acydburn
                if (!empty($path))
1445 6847 acydburn
                {
1446 6847 acydburn
                        if (@file_exists($phpbb_root_path . $path . $test_file))
1447 6847 acydburn
                        {
1448 6847 acydburn
                                return $path;
1449 6847 acydburn
                        }
1450 6847 acydburn
                }
1451 6847 acydburn
        }
1452 6847 acydburn
1453 6847 acydburn
        return false;
1454 6847 acydburn
}
1455 6847 acydburn
1456 6847 acydburn
function compare_table($tables, $tablename, &$prefixes)
1457 6847 acydburn
{
1458 7015 davidmj
        for ($i = 0, $table_size = sizeof($tables); $i < $table_size; ++$i)
1459 6847 acydburn
        {
1460 6847 acydburn
                if (preg_match('/(.*)' . $tables[$i] . '$/', $tablename, $m))
1461 6847 acydburn
                {
1462 6847 acydburn
                        if (empty($m[1]))
1463 6847 acydburn
                        {
1464 6847 acydburn
                                $m[1] = '*';
1465 6847 acydburn
                        }
1466 6847 acydburn
1467 6847 acydburn
                        if (isset($prefixes[$m[1]]))
1468 6847 acydburn
                        {
1469 6847 acydburn
                                $prefixes[$m[1]]++;
1470 6847 acydburn
                        }
1471 6847 acydburn
                        else
1472 6847 acydburn
                        {
1473 6847 acydburn
                                $prefixes[$m[1]] = 1;
1474 6847 acydburn
                        }
1475 6847 acydburn
                }
1476 6847 acydburn
        }
1477 6847 acydburn
}
1478 6847 acydburn
1479 6847 acydburn
/**
1480 6847 acydburn
* Grant permissions to a specified user or group
1481 6847 acydburn
*
1482 6847 acydburn
* @param string $ug_type user|group|user_role|group_role
1483 6847 acydburn
* @param mixed $forum_id forum ids (array|int|0) -> 0 == all forums
1484 6847 acydburn
* @param mixed $ug_id [int] user_id|group_id : [string] usergroup name
1485 6847 acydburn
* @param mixed $acl_list [string] acl entry : [array] acl entries : [string] role entry
1486 6847 acydburn
* @param int $setting ACL_YES|ACL_NO|ACL_NEVER
1487 6847 acydburn
*/
1488 6847 acydburn
function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
1489 6847 acydburn
{
1490 6847 acydburn
        global $db, $convert, $user, $config;
1491 6847 acydburn
        static $acl_option_ids, $group_ids;
1492 6847 acydburn
1493 6847 acydburn
        if (($ug_type == 'group' || $ug_type == 'group_role') && is_string($ug_id))
1494 6847 acydburn
        {
1495 6847 acydburn
                if (!isset($group_ids[$ug_id]))
1496 6847 acydburn
                {
1497 6847 acydburn
                        $sql = 'SELECT group_id
1498 8133 acydburn
                                FROM ' . GROUPS_TABLE . "
1499 6847 acydburn
                                WHERE group_name = '" . $db->sql_escape(strtoupper($ug_id)) . "'";
1500 6847 acydburn
                        $result = $db->sql_query_limit($sql, 1);
1501 6847 acydburn
                        $id = (int) $db->sql_fetchfield('group_id');
1502 6847 acydburn
                        $db->sql_freeresult($result);
1503 6847 acydburn
1504 6847 acydburn
                        if (!$id)
1505 6847 acydburn
                        {
1506 6847 acydburn
                                return;
1507 6847 acydburn
                        }
1508 6847 acydburn
1509 6847 acydburn
                        $group_ids[$ug_id] = $id;
1510 6847 acydburn
                }
1511 6847 acydburn
1512 6847 acydburn
                $ug_id = (int) $group_ids[$ug_id];
1513 6847 acydburn
        }
1514 6847 acydburn
1515 6847 acydburn
        $table = ($ug_type == 'user' || $ug_type == 'user_role') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE;
1516 6930 acydburn
        $id_field = ($ug_type == 'user' || $ug_type == 'user_role') ? 'user_id' : 'group_id';
1517 6847 acydburn
1518 6847 acydburn
        // Role based permissions are the simplest to handle so check for them first
1519 6847 acydburn
        if ($ug_type == 'user_role' || $ug_type == 'group_role')
1520 6847 acydburn
        {
1521 7952 kellanved
                if (is_numeric($forum_id))
1522 7952 kellanved
                {
1523 7952 kellanved
                        $sql = 'SELECT role_id
1524 7952 kellanved
                                FROM ' . ACL_ROLES_TABLE . "
1525 7952 kellanved
                                WHERE role_name = 'ROLE_" . $db->sql_escape($acl_list) . "'";
1526 7952 kellanved
                        $result = $db->sql_query_limit($sql, 1);
1527 7952 kellanved
                        $row = $db->sql_fetchrow($result);
1528 7952 kellanved
                        $db->sql_freeresult($result);
1529 6847 acydburn
1530 7952 kellanved
                        // If we have no role id there is something wrong here
1531 7952 kellanved
                        if ($row)
1532 7952 kellanved
                        {
1533 7952 kellanved
                                $sql = "INSERT INTO $table ($id_field, forum_id, auth_role_id) VALUES ($ug_id, $forum_id, " . $row['role_id'] . ')';
1534 7952 kellanved
                                $db->sql_query($sql);
1535 7952 kellanved
                        }
1536 6865 acydburn
                }
1537 6847 acydburn
1538 6847 acydburn
                return;
1539 6847 acydburn
        }
1540 6847 acydburn
1541 6847 acydburn
        // Build correct parameters
1542 6847 acydburn
        $auth = array();
1543 6847 acydburn
1544 6847 acydburn
        if (!is_array($acl_list))
1545 6847 acydburn
        {
1546 6847 acydburn
                $auth = array($acl_list => $setting);
1547 6847 acydburn
        }
1548 6847 acydburn
        else
1549 6847 acydburn
        {
1550 6847 acydburn
                foreach ($acl_list as $auth_option)
1551 6847 acydburn
                {
1552 6847 acydburn
                        $auth[$auth_option] = $setting;
1553 6847 acydburn
                }
1554 6847 acydburn
        }
1555 6847 acydburn
        unset($acl_list);
1556 6847 acydburn
1557 6847 acydburn
        if (!is_array($forum_id))
1558 6847 acydburn
        {
1559 6847 acydburn
                $forum_id = array($forum_id);
1560 6847 acydburn
        }
1561 6847 acydburn
1562 6847 acydburn
        // Set any flags as required
1563 6847 acydburn
        foreach ($auth as $auth_option => $acl_setting)
1564 6847 acydburn
        {
1565 6847 acydburn
                $flag = substr($auth_option, 0, strpos($auth_option, '_') + 1);
1566 6847 acydburn
                if (empty($auth[$flag]))
1567 6847 acydburn
                {
1568 6847 acydburn
                        $auth[$flag] = $acl_setting;
1569 6847 acydburn
                }
1570 6847 acydburn
        }
1571 6847 acydburn
1572 6847 acydburn
        if (!is_array($acl_option_ids) || empty($acl_option_ids))
1573 6847 acydburn
        {
1574 6847 acydburn
                $sql = 'SELECT auth_option_id, auth_option
1575 6847 acydburn
                        FROM ' . ACL_OPTIONS_TABLE;
1576 6847 acydburn
                $result = $db->sql_query($sql);
1577 6847 acydburn
1578 6847 acydburn
                while ($row = $db->sql_fetchrow($result))
1579 6847 acydburn
                {
1580 6847 acydburn
                        $acl_option_ids[$row['auth_option']] = $row['auth_option_id'];
1581 6847 acydburn
                }
1582 6847 acydburn
                $db->sql_freeresult($result);
1583 6847 acydburn
        }
1584 6847 acydburn
1585 7952 kellanved
        $sql_forum = 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id), false, true);
1586 6847 acydburn
1587 6847 acydburn
        $sql = ($ug_type == 'user') ? 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.user_id = $ug_id" : 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.group_id = $ug_id";
1588 6847 acydburn
        $result = $db->sql_query($sql);
1589 6847 acydburn
1590 6847 acydburn
        $cur_auth = array();
1591 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
1592 6847 acydburn
        {
1593 6847 acydburn
                $cur_auth[$row['forum_id']][$row['auth_option_id']] = $row['auth_setting'];
1594 6847 acydburn
        }
1595 6847 acydburn
        $db->sql_freeresult($result);
1596 6847 acydburn
1597 6847 acydburn
        $sql_ary = array();
1598 6847 acydburn
        foreach ($forum_id as $forum)
1599 6847 acydburn
        {
1600 6847 acydburn
                foreach ($auth as $auth_option => $setting)
1601 6847 acydburn
                {
1602 6847 acydburn
                        $auth_option_id = $acl_option_ids[$auth_option];
1603 6847 acydburn
1604 6847 acydburn
                        if (!$auth_option_id)
1605 6847 acydburn
                        {
1606 6847 acydburn
                                continue;
1607 6847 acydburn
                        }
1608 6847 acydburn
1609 6847 acydburn
                        switch ($setting)
1610 6847 acydburn
                        {
1611 6847 acydburn
                                case ACL_NO:
1612 6847 acydburn
                                        if (isset($cur_auth[$forum][$auth_option_id]))
1613 6847 acydburn
                                        {
1614 8133 acydburn
                                                $sql_ary['delete'][] = "DELETE FROM $table
1615 6847 acydburn
                                                        WHERE forum_id = $forum
1616 6847 acydburn
                                                                AND auth_option_id = $auth_option_id
1617 6847 acydburn
                                                                AND $id_field = $ug_id";
1618 6847 acydburn
                                        }
1619 6847 acydburn
                                break;
1620 6847 acydburn
1621 6847 acydburn
                                default:
1622 6847 acydburn
                                        if (!isset($cur_auth[$forum][$auth_option_id]))
1623 6847 acydburn
                                        {
1624 6847 acydburn
                                                $sql_ary['insert'][] = "$ug_id, $forum, $auth_option_id, $setting";
1625 6847 acydburn
                                        }
1626 6847 acydburn
                                        else if ($cur_auth[$forum][$auth_option_id] != $setting)
1627 6847 acydburn
                                        {
1628 8133 acydburn
                                                $sql_ary['update'][] = "UPDATE " . $table . "
1629 8133 acydburn
                                                        SET auth_setting = $setting
1630 8133 acydburn
                                                        WHERE $id_field = $ug_id
1631 8133 acydburn
                                                                AND forum_id = $forum
1632 6847 acydburn
                                                                AND auth_option_id = $auth_option_id";
1633 6847 acydburn
                                        }
1634 6847 acydburn
                        }
1635 6847 acydburn
                }
1636 6847 acydburn
        }
1637 6847 acydburn
        unset($cur_auth);
1638 6847 acydburn
1639 6847 acydburn
        $sql = '';
1640 6847 acydburn
        foreach ($sql_ary as $sql_type => $sql_subary)
1641 6847 acydburn
        {
1642 6847 acydburn
                switch ($sql_type)
1643 6847 acydburn
                {
1644 6847 acydburn
                        case 'insert':
1645 6847 acydburn
                                switch ($db->sql_layer)
1646 6847 acydburn
                                {
1647 6847 acydburn
                                        case 'mysql':
1648 6847 acydburn
                                        case 'mysql4':
1649 6847 acydburn
                                                $sql = 'VALUES ' . implode(', ', preg_replace('#^(.*?)$#', '(\1)', $sql_subary));
1650 6847 acydburn
                                        break;
1651 6847 acydburn
1652 6847 acydburn
                                        case 'mssql':
1653 6847 acydburn
                                        case 'sqlite':
1654 10558 git-gate
                                        case 'mssqlnative':
1655 6847 acydburn
                                                $sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary));
1656 6847 acydburn
                                        break;
1657 6847 acydburn
1658 6847 acydburn
                                        default:
1659 6847 acydburn
                                                foreach ($sql_subary as $sql)
1660 6847 acydburn
                                                {
1661 6847 acydburn
                                                        $sql = "INSERT INTO $table ($id_field, forum_id, auth_option_id, auth_setting) VALUES ($sql)";
1662 6847 acydburn
                                                        $db->sql_query($sql);
1663 6847 acydburn
                                                        $sql = '';
1664 6847 acydburn
                                                }
1665 6847 acydburn
                                }
1666 6847 acydburn
1667 6847 acydburn
                                if ($sql != '')
1668 6847 acydburn
                                {
1669 6847 acydburn
                                        $sql = "INSERT INTO $table ($id_field, forum_id, auth_option_id, auth_setting) $sql";
1670 6847 acydburn
                                        $db->sql_query($sql);
1671 6847 acydburn
                                }
1672 6847 acydburn
                        break;
1673 6847 acydburn
1674 6847 acydburn
                        case 'update':
1675 6847 acydburn
                        case 'delete':
1676 6847 acydburn
                                foreach ($sql_subary as $sql)
1677 6847 acydburn
                                {
1678 6847 acydburn
                                        $db->sql_query($sql);
1679 6847 acydburn
                                        $sql = '';
1680 6847 acydburn
                                }
1681 6847 acydburn
                        break;
1682 6847 acydburn
                }
1683 6847 acydburn
                unset($sql_ary[$sql_type]);
1684 6847 acydburn
        }
1685 6847 acydburn
        unset($sql_ary);
1686 6847 acydburn
1687 6847 acydburn
}
1688 6847 acydburn
1689 6847 acydburn
/**
1690 6847 acydburn
* Update the count of unread private messages for all users
1691 6847 acydburn
*/
1692 6847 acydburn
function update_unread_count()
1693 6847 acydburn
{
1694 6847 acydburn
        global $db;
1695 6847 acydburn
1696 6847 acydburn
        $sql = 'SELECT user_id, COUNT(msg_id) as num_messages
1697 6847 acydburn
                FROM ' . PRIVMSGS_TO_TABLE . '
1698 6847 acydburn
                WHERE pm_unread = 1
1699 6847 acydburn
                        AND folder_id <> ' . PRIVMSGS_OUTBOX . '
1700 6847 acydburn
                GROUP BY user_id';
1701 6847 acydburn
        $result = $db->sql_query($sql);
1702 6847 acydburn
1703 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
1704 6847 acydburn
        {
1705 6847 acydburn
                $db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_unread_privmsg = ' . $row['num_messages'] . '
1706 6847 acydburn
                        WHERE user_id = ' . $row['user_id']);
1707 6847 acydburn
        }
1708 6847 acydburn
        $db->sql_freeresult($result);
1709 6847 acydburn
}
1710 6847 acydburn
1711 6847 acydburn
/**
1712 6847 acydburn
* Add any of the pre-defined "special" groups which are missing from the database
1713 6847 acydburn
*/
1714 6847 acydburn
function add_default_groups()
1715 6847 acydburn
{
1716 6847 acydburn
        global $db;
1717 6847 acydburn
1718 6847 acydburn
        $default_groups = array(
1719 7744 kellanved
                'GUESTS'                        => array('', 0, 0),
1720 7744 kellanved
                'REGISTERED'                => array('', 0, 0),
1721 7744 kellanved
                'REGISTERED_COPPA'        => array('', 0, 0),
1722 7744 kellanved
                'GLOBAL_MODERATORS'        => array('00AA00', 1, 0),
1723 7744 kellanved
                'ADMINISTRATORS'        => array('AA0000', 1, 1),
1724 9636 acydburn
                'BOTS'                                => array('9E8DA7', 0, 0),
1725 9636 acydburn
                'NEWLY_REGISTERED'                => array('', 0, 0),
1726 6847 acydburn
        );
1727 6847 acydburn
1728 6847 acydburn
        $sql = 'SELECT *
1729 7952 kellanved
                FROM ' . GROUPS_TABLE . '
1730 7952 kellanved
                WHERE ' . $db->sql_in_set('group_name', array_keys($default_groups));
1731 6847 acydburn
        $result = $db->sql_query($sql);
1732 6847 acydburn
1733 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
1734 6847 acydburn
        {
1735 6847 acydburn
                unset($default_groups[strtoupper($row['group_name'])]);
1736 6847 acydburn
        }
1737 6847 acydburn
        $db->sql_freeresult($result);
1738 6847 acydburn
1739 6847 acydburn
        $sql_ary = array();
1740 6847 acydburn
1741 6847 acydburn
        foreach ($default_groups as $name => $data)
1742 6847 acydburn
        {
1743 6847 acydburn
                $sql_ary[] = array(
1744 6847 acydburn
                        'group_name'                        => (string) $name,
1745 6847 acydburn
                        'group_desc'                        => '',
1746 6847 acydburn
                        'group_desc_uid'                => '',
1747 6847 acydburn
                        'group_desc_bitfield'        => '',
1748 6847 acydburn
                        'group_type'                        => GROUP_SPECIAL,
1749 7961 acydburn
                        'group_colour'                        => (string) $data[0],
1750 7961 acydburn
                        'group_legend'                        => (int) $data[1],
1751 7961 acydburn
                        'group_founder_manage'        => (int) $data[2]
1752 6847 acydburn
                );
1753 6847 acydburn
        }
1754 6847 acydburn
1755 6847 acydburn
        if (sizeof($sql_ary))
1756 6847 acydburn
        {
1757 6847 acydburn
                $db->sql_multi_insert(GROUPS_TABLE, $sql_ary);
1758 6847 acydburn
        }
1759 6847 acydburn
}
1760 6847 acydburn
1761 7666 kellanved
1762 8133 acydburn
/**
1763 7666 kellanved
* Sync post count. We might need to do this in batches.
1764 7666 kellanved
*/
1765 7666 kellanved
function sync_post_count($offset, $limit)
1766 7666 kellanved
{
1767 7666 kellanved
        global $db;
1768 7666 kellanved
        $sql = 'SELECT COUNT(post_id) AS num_posts, poster_id
1769 7666 kellanved
                        FROM ' . POSTS_TABLE . '
1770 7666 kellanved
                        WHERE post_postcount = 1
1771 8805 acydburn
                                AND post_approved = 1
1772 7666 kellanved
                        GROUP BY poster_id
1773 7666 kellanved
                        ORDER BY poster_id';
1774 7666 kellanved
        $result = $db->sql_query_limit($sql, $limit, $offset);
1775 7666 kellanved
1776 7666 kellanved
        while ($row = $db->sql_fetchrow($result))
1777 7666 kellanved
        {
1778 7666 kellanved
                $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_posts = {$row['num_posts']} WHERE user_id = {$row['poster_id']}");
1779 7666 kellanved
        }
1780 7666 kellanved
        $db->sql_freeresult($result);
1781 7666 kellanved
}
1782 7666 kellanved
1783 6847 acydburn
/**
1784 6847 acydburn
* Add the search bots into the database
1785 6847 acydburn
* This code should be used in execute_last if the source database did not have bots
1786 6847 acydburn
* If you are converting bots this function should not be called
1787 6847 acydburn
* @todo We might want to look at sharing the bot list between the install code and this code for consistancy
1788 6847 acydburn
*/
1789 6847 acydburn
function add_bots()
1790 6847 acydburn
{
1791 6855 acydburn
        global $db, $convert, $user, $config, $phpbb_root_path, $phpEx;
1792 6847 acydburn
1793 6905 acydburn
        $db->sql_query($convert->truncate_statement . BOTS_TABLE);
1794 6905 acydburn
1795 6847 acydburn
        $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . " WHERE group_name = 'BOTS'";
1796 6847 acydburn
        $result = $db->sql_query($sql);
1797 6984 davidmj
        $group_id = (int) $db->sql_fetchfield('group_id', false, $result);
1798 6847 acydburn
        $db->sql_freeresult($result);
1799 6847 acydburn
1800 6847 acydburn
        if (!$group_id)
1801 6847 acydburn
        {
1802 6847 acydburn
                add_default_groups();
1803 6847 acydburn
1804 6847 acydburn
                $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . " WHERE group_name = 'BOTS'";
1805 6847 acydburn
                $result = $db->sql_query($sql);
1806 6984 davidmj
                $group_id = (int) $db->sql_fetchfield('group_id', false, $result);
1807 6847 acydburn
                $db->sql_freeresult($result);
1808 6847 acydburn
1809 6847 acydburn
                if (!$group_id)
1810 6847 acydburn
                {
1811 6984 davidmj
                        global $install;
1812 6847 acydburn
                        $install->error($user->lang['CONV_ERROR_INCONSISTENT_GROUPS'], __LINE__, __FILE__);
1813 6847 acydburn
                }
1814 6847 acydburn
        }
1815 6847 acydburn
1816 6847 acydburn
        $bots = array(
1817 6847 acydburn
                'AdsBot [Google]'                        => array('AdsBot-Google', ''),
1818 6847 acydburn
                'Alexa [Bot]'                                => array('ia_archiver', ''),
1819 6847 acydburn
                'Alta Vista [Bot]'                        => array('Scooter/', ''),
1820 6847 acydburn
                'Ask Jeeves [Bot]'                        => array('Ask Jeeves', ''),
1821 6847 acydburn
                'Baidu [Spider]'                        => array('Baiduspider+(', ''),
1822 10889 git-gate
                'Bing [Bot]'                                => array('bingbot/', ''),
1823 6847 acydburn
                'Exabot [Bot]'                                => array('Exabot/', ''),
1824 6847 acydburn
                'FAST Enterprise [Crawler]'        => array('FAST Enterprise Crawler', ''),
1825 6847 acydburn
                'FAST WebCrawler [Crawler]'        => array('FAST-WebCrawler/', ''),
1826 6847 acydburn
                'Francis [Bot]'                                => array('http://www.neomo.de/', ''),
1827 6847 acydburn
                'Gigabot [Bot]'                                => array('Gigabot/', ''),
1828 8072 acydburn
                'Google Adsense [Bot]'                => array('Mediapartners-Google', ''),
1829 6847 acydburn
                'Google Desktop'                        => array('Google Desktop', ''),
1830 6847 acydburn
                'Google Feedfetcher'                => array('Feedfetcher-Google', ''),
1831 6847 acydburn
                'Google [Bot]'                                => array('Googlebot', ''),
1832 6847 acydburn
                'Heise IT-Markt [Crawler]'        => array('heise-IT-Markt-Crawler', ''),
1833 6847 acydburn
                'Heritrix [Crawler]'                => array('heritrix/1.', ''),
1834 6847 acydburn
                'IBM Research [Bot]'                => array('ibm.com/cs/crawler', ''),
1835 6847 acydburn
                'ICCrawler - ICjobs'                => array('ICCrawler - ICjobs', ''),
1836 6847 acydburn
                'ichiro [Crawler]'                        => array('ichiro/2', ''),
1837 6847 acydburn
                'Majestic-12 [Bot]'                        => array('MJ12bot/', ''),
1838 6847 acydburn
                'Metager [Bot]'                                => array('MetagerBot/', ''),
1839 6847 acydburn
                'MSN NewsBlogs'                                => array('msnbot-NewsBlogs/', ''),
1840 6847 acydburn
                'MSN [Bot]'                                        => array('msnbot/', ''),
1841 6847 acydburn
                'MSNbot Media'                                => array('msnbot-media/', ''),
1842 6847 acydburn
                'NG-Search [Bot]'                        => array('NG-Search/', ''),
1843 6847 acydburn
                'Nutch [Bot]'                                => array('http://lucene.apache.org/nutch/', ''),
1844 6847 acydburn
                'Nutch/CVS [Bot]'                        => array('NutchCVS/', ''),
1845 6847 acydburn
                'OmniExplorer [Bot]'                => array('OmniExplorer_Bot/', ''),
1846 6847 acydburn
                'Online link [Validator]'        => array('online link validator', ''),
1847 6847 acydburn
                'psbot [Picsearch]'                        => array('psbot/0', ''),
1848 6847 acydburn
                'Seekport [Bot]'                        => array('Seekbot/', ''),
1849 6847 acydburn
                'Sensis [Crawler]'                        => array('Sensis Web Crawler', ''),
1850 6847 acydburn
                'SEO Crawler'                                => array('SEO search Crawler/', ''),
1851 6847 acydburn
                'Seoma [Crawler]'                        => array('Seoma [SEO Crawler]', ''),
1852 6847 acydburn
                'SEOSearch [Crawler]'                => array('SEOsearch/', ''),
1853 6847 acydburn
                'Snappy [Bot]'                                => array('Snappy/1.1 ( http://www.urltrends.com/ )', ''),
1854 6847 acydburn
                'Steeler [Crawler]'                        => array('http://www.tkl.iis.u-tokyo.ac.jp/~crawler/', ''),
1855 6847 acydburn
                'Synoo [Bot]'                                => array('SynooBot/', ''),
1856 6847 acydburn
                'Telekom [Bot]'                                => array('crawleradmin.t-info@telekom.de', ''),
1857 6847 acydburn
                'TurnitinBot [Bot]'                        => array('TurnitinBot/', ''),
1858 6847 acydburn
                'Voyager [Bot]'                                => array('voyager/1.0', ''),
1859 6847 acydburn
                'W3 [Sitesearch]'                        => array('W3 SiteSearch Crawler', ''),
1860 6847 acydburn
                'W3C [Linkcheck]'                        => array('W3C-checklink/', ''),
1861 6847 acydburn
                'W3C [Validator]'                        => array('W3C_*Validator', ''),
1862 6847 acydburn
                'WiseNut [Bot]'                                => array('http://www.WISEnutbot.com', ''),
1863 6956 acydburn
                'YaCy [Bot]'                                => array('yacybot', ''),
1864 6847 acydburn
                'Yahoo MMCrawler [Bot]'                => array('Yahoo-MMCrawler/', ''),
1865 6847 acydburn
                'Yahoo Slurp [Bot]'                        => array('Yahoo! DE Slurp', ''),
1866 6847 acydburn
                'Yahoo [Bot]'                                => array('Yahoo! Slurp', ''),
1867 6847 acydburn
                'YahooSeeker [Bot]'                        => array('YahooSeeker/', ''),
1868 6847 acydburn
        );
1869 6847 acydburn
1870 6855 acydburn
        if (!function_exists('user_add'))
1871 6855 acydburn
        {
1872 6855 acydburn
                include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
1873 6855 acydburn
        }
1874 6855 acydburn
1875 6847 acydburn
        foreach ($bots as $bot_name => $bot_ary)
1876 6847 acydburn
        {
1877 6854 acydburn
                $user_row = array(
1878 6854 acydburn
                        'user_type'                                => USER_IGNORE,
1879 6854 acydburn
                        'group_id'                                => $group_id,
1880 6854 acydburn
                        'username'                                => $bot_name,
1881 6854 acydburn
                        'user_regdate'                        => time(),
1882 6854 acydburn
                        'user_password'                        => '',
1883 6854 acydburn
                        'user_colour'                        => '9E8DA7',
1884 6854 acydburn
                        'user_email'                        => '',
1885 6854 acydburn
                        'user_lang'                                => $config['default_lang'],
1886 6854 acydburn
                        'user_style'                        => 1,
1887 6854 acydburn
                        'user_timezone'                        => 0,
1888 6854 acydburn
                        'user_allow_massemail'        => 0,
1889 6847 acydburn
                );
1890 6847 acydburn
1891 6855 acydburn
                $user_id = user_add($user_row);
1892 6847 acydburn
1893 6855 acydburn
                if ($user_id)
1894 6855 acydburn
                {
1895 6855 acydburn
                        $sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
1896 6855 acydburn
                                'bot_active'        => 1,
1897 6855 acydburn
                                'bot_name'                => $bot_name,
1898 6855 acydburn
                                'user_id'                => $user_id,
1899 6855 acydburn
                                'bot_agent'                => $bot_ary[0],
1900 6855 acydburn
                                'bot_ip'                => $bot_ary[1])
1901 6855 acydburn
                        );
1902 6855 acydburn
                        $db->sql_query($sql);
1903 6855 acydburn
                }
1904 6847 acydburn
        }
1905 6847 acydburn
}
1906 6847 acydburn
1907 6847 acydburn
/**
1908 6847 acydburn
* Update any dynamic configuration variables after the conversion is finished
1909 6847 acydburn
* @todo Confirm that this updates all relevant values since it has not necessarily been kept in sync with all changes
1910 6847 acydburn
*/
1911 6847 acydburn
function update_dynamic_config()
1912 6847 acydburn
{
1913 6847 acydburn
        global $db, $config;
1914 6847 acydburn
1915 6847 acydburn
        // Get latest username
1916 6847 acydburn
        $sql = 'SELECT user_id, username, user_colour
1917 6847 acydburn
                FROM ' . USERS_TABLE . '
1918 7040 acydburn
                WHERE user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')';
1919 7040 acydburn
1920 7040 acydburn
        if (!empty($config['increment_user_id']))
1921 7040 acydburn
        {
1922 7040 acydburn
                $sql .= ' AND user_id <> ' . $config['increment_user_id'];
1923 7040 acydburn
        }
1924 7040 acydburn
1925 7040 acydburn
        $sql .= ' ORDER BY user_id DESC';
1926 7040 acydburn
1927 6847 acydburn
        $result = $db->sql_query_limit($sql, 1);
1928 6847 acydburn
        $row = $db->sql_fetchrow($result);
1929 6847 acydburn
        $db->sql_freeresult($result);
1930 6847 acydburn
1931 6847 acydburn
        if ($row)
1932 6847 acydburn
        {
1933 6847 acydburn
                set_config('newest_user_id', $row['user_id'], true);
1934 6847 acydburn
                set_config('newest_username', $row['username'], true);
1935 6847 acydburn
                set_config('newest_user_colour', $row['user_colour'], true);
1936 6847 acydburn
        }
1937 6847 acydburn
1938 7608 acydburn
//        Also do not reset record online user/date. There will be old data or the fresh data from the schema.
1939 7608 acydburn
//        set_config('record_online_users', 1, true);
1940 7608 acydburn
//        set_config('record_online_date', time(), true);
1941 6847 acydburn
1942 8133 acydburn
        $sql = 'SELECT COUNT(post_id) AS stat
1943 6847 acydburn
                FROM ' . POSTS_TABLE . '
1944 6847 acydburn
                WHERE post_approved = 1';
1945 6847 acydburn
        $result = $db->sql_query($sql);
1946 6847 acydburn
        $row = $db->sql_fetchrow($result);
1947 6847 acydburn
        $db->sql_freeresult($result);
1948 6847 acydburn
1949 6847 acydburn
        set_config('num_posts', (int) $row['stat'], true);
1950 6847 acydburn
1951 6847 acydburn
        $sql = 'SELECT COUNT(topic_id) AS stat
1952 6847 acydburn
                FROM ' . TOPICS_TABLE . '
1953 6847 acydburn
                WHERE topic_approved = 1';
1954 6847 acydburn
        $result = $db->sql_query($sql);
1955 6847 acydburn
        $row = $db->sql_fetchrow($result);
1956 6847 acydburn
        $db->sql_freeresult($result);
1957 6847 acydburn
1958 6847 acydburn
        set_config('num_topics', (int) $row['stat'], true);
1959 6847 acydburn
1960 6847 acydburn
        $sql = 'SELECT COUNT(user_id) AS stat
1961 6847 acydburn
                FROM ' . USERS_TABLE . '
1962 6847 acydburn
                WHERE user_type IN (' . USER_NORMAL . ',' . USER_FOUNDER . ')';
1963 6847 acydburn
        $result = $db->sql_query($sql);
1964 6847 acydburn
        $row = $db->sql_fetchrow($result);
1965 6847 acydburn
        $db->sql_freeresult($result);
1966 6847 acydburn
1967 6847 acydburn
        set_config('num_users', (int) $row['stat'], true);
1968 6847 acydburn
1969 6847 acydburn
        $sql = 'SELECT COUNT(attach_id) as stat
1970 6847 acydburn
                FROM ' . ATTACHMENTS_TABLE . '
1971 6847 acydburn
                WHERE is_orphan = 0';
1972 6847 acydburn
        $result = $db->sql_query($sql);
1973 6847 acydburn
        set_config('num_files', (int) $db->sql_fetchfield('stat'), true);
1974 6847 acydburn
        $db->sql_freeresult($result);
1975 6847 acydburn
1976 6847 acydburn
        $sql = 'SELECT SUM(filesize) as stat
1977 6847 acydburn
                FROM ' . ATTACHMENTS_TABLE . '
1978 6847 acydburn
                WHERE is_orphan = 0';
1979 6847 acydburn
        $result = $db->sql_query($sql);
1980 8876 acydburn
        set_config('upload_dir_size', (float) $db->sql_fetchfield('stat'), true);
1981 6847 acydburn
        $db->sql_freeresult($result);
1982 6847 acydburn
1983 7516 acydburn
        /**
1984 7516 acydburn
        * We do not resync users post counts - this can be done by the admin after conversion if wanted.
1985 6847 acydburn
        $sql = 'SELECT COUNT(post_id) AS num_posts, poster_id
1986 6847 acydburn
                FROM ' . POSTS_TABLE . '
1987 6847 acydburn
                WHERE post_postcount = 1
1988 6847 acydburn
                GROUP BY poster_id';
1989 6847 acydburn
        $result = $db->sql_query($sql);
1990 6847 acydburn
1991 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
1992 6847 acydburn
        {
1993 6847 acydburn
                $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_posts = {$row['num_posts']} WHERE user_id = {$row['poster_id']}");
1994 6847 acydburn
        }
1995 6847 acydburn
        $db->sql_freeresult($result);
1996 7516 acydburn
        */
1997 6847 acydburn
}
1998 6847 acydburn
1999 6847 acydburn
/**
2000 6847 acydburn
* Updates topics_posted entries
2001 6847 acydburn
*/
2002 6847 acydburn
function update_topics_posted()
2003 6847 acydburn
{
2004 6847 acydburn
        global $db, $config;
2005 6847 acydburn
2006 6954 davidmj
        switch ($db->sql_layer)
2007 6954 davidmj
        {
2008 6954 davidmj
                case 'sqlite':
2009 6954 davidmj
                case 'firebird':
2010 6954 davidmj
                        $db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
2011 6954 davidmj
                break;
2012 6847 acydburn
2013 6954 davidmj
                default:
2014 6954 davidmj
                        $db->sql_query('TRUNCATE TABLE ' . TOPICS_POSTED_TABLE);
2015 6954 davidmj
                break;
2016 6954 davidmj
        }
2017 6954 davidmj
2018 6847 acydburn
        // This can get really nasty... therefore we only do the last six months
2019 6847 acydburn
        $get_from_time = time() - (6 * 4 * 7 * 24 * 60 * 60);
2020 6847 acydburn
2021 6847 acydburn
        // Select forum ids, do not include categories
2022 6847 acydburn
        $sql = 'SELECT forum_id
2023 6847 acydburn
                FROM ' . FORUMS_TABLE . '
2024 6847 acydburn
                WHERE forum_type <> ' . FORUM_CAT;
2025 6847 acydburn
        $result = $db->sql_query($sql);
2026 6847 acydburn
2027 6847 acydburn
        $forum_ids = array();
2028 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
2029 6847 acydburn
        {
2030 6847 acydburn
                $forum_ids[] = $row['forum_id'];
2031 6847 acydburn
        }
2032 6847 acydburn
        $db->sql_freeresult($result);
2033 6847 acydburn
2034 6847 acydburn
        // Any global announcements? ;)
2035 6847 acydburn
        $forum_ids[] = 0;
2036 6847 acydburn
2037 6847 acydburn
        // Now go through the forums and get us some topics...
2038 6847 acydburn
        foreach ($forum_ids as $forum_id)
2039 6847 acydburn
        {
2040 6847 acydburn
                $sql = 'SELECT p.poster_id, p.topic_id
2041 6847 acydburn
                        FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t
2042 6847 acydburn
                        WHERE t.forum_id = ' . $forum_id . '
2043 6847 acydburn
                                AND t.topic_moved_id = 0
2044 6847 acydburn
                                AND t.topic_last_post_time > ' . $get_from_time . '
2045 6847 acydburn
                                AND t.topic_id = p.topic_id
2046 6847 acydburn
                                AND p.poster_id <> ' . ANONYMOUS . '
2047 6847 acydburn
                        GROUP BY p.poster_id, p.topic_id';
2048 6847 acydburn
                $result = $db->sql_query($sql);
2049 6847 acydburn
2050 6847 acydburn
                $posted = array();
2051 6847 acydburn
                while ($row = $db->sql_fetchrow($result))
2052 6847 acydburn
                {
2053 6847 acydburn
                        $posted[$row['poster_id']][] = $row['topic_id'];
2054 6847 acydburn
                }
2055 6847 acydburn
                $db->sql_freeresult($result);
2056 6847 acydburn
2057 6847 acydburn
                $sql_ary = array();
2058 6847 acydburn
                foreach ($posted as $user_id => $topic_row)
2059 6847 acydburn
                {
2060 6847 acydburn
                        foreach ($topic_row as $topic_id)
2061 6847 acydburn
                        {
2062 6847 acydburn
                                $sql_ary[] = array(
2063 7608 acydburn
                                        'user_id'                => (int) $user_id,
2064 7608 acydburn
                                        'topic_id'                => (int) $topic_id,
2065 6847 acydburn
                                        'topic_posted'        => 1,
2066 6847 acydburn
                                );
2067 6847 acydburn
                        }
2068 6847 acydburn
                }
2069 6847 acydburn
                unset($posted);
2070 6847 acydburn
2071 7118 acydburn
                if (sizeof($sql_ary))
2072 7118 acydburn
                {
2073 7118 acydburn
                        $db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary);
2074 7118 acydburn
                }
2075 6847 acydburn
        }
2076 6847 acydburn
}
2077 6847 acydburn
2078 6847 acydburn
/**
2079 6847 acydburn
* Ensure that all users have a default group specified and update related information such as their colour
2080 6847 acydburn
*/
2081 6847 acydburn
function fix_empty_primary_groups()
2082 6847 acydburn
{
2083 6847 acydburn
        global $db;
2084 6847 acydburn
2085 6847 acydburn
        // Set group ids for users not already having it
2086 6847 acydburn
        $sql = 'UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('registered') . '
2087 6847 acydburn
                WHERE group_id = 0 AND user_type = ' . USER_INACTIVE;
2088 6847 acydburn
        $db->sql_query($sql);
2089 6847 acydburn
2090 6847 acydburn
        $sql = 'UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('registered') . '
2091 6847 acydburn
                WHERE group_id = 0 AND user_type = ' . USER_NORMAL;
2092 6847 acydburn
        $db->sql_query($sql);
2093 6847 acydburn
2094 6847 acydburn
        $db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('guests') . ' WHERE user_id = ' . ANONYMOUS);
2095 6847 acydburn
2096 6847 acydburn
        $sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . ' WHERE group_id = ' . get_group_id('administrators');
2097 6847 acydburn
        $result = $db->sql_query($sql);
2098 6847 acydburn
2099 6847 acydburn
        $user_ids = array();
2100 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
2101 6847 acydburn
        {
2102 6847 acydburn
                $user_ids[] = $row['user_id'];
2103 6847 acydburn
        }
2104 6847 acydburn
        $db->sql_freeresult($result);
2105 6847 acydburn
2106 6847 acydburn
        if (sizeof($user_ids))
2107 6847 acydburn
        {
2108 6847 acydburn
                $db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('administrators') . '
2109 7952 kellanved
                        WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
2110 6847 acydburn
        }
2111 6847 acydburn
2112 6847 acydburn
        $sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . ' WHERE group_id = ' . get_group_id('global_moderators');
2113 6847 acydburn
2114 6847 acydburn
        $user_ids = array();
2115 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
2116 6847 acydburn
        {
2117 6847 acydburn
                $user_ids[] = $row['user_id'];
2118 6847 acydburn
        }
2119 6847 acydburn
        $db->sql_freeresult($result);
2120 6847 acydburn
2121 6847 acydburn
        if (sizeof($user_ids))
2122 6847 acydburn
        {
2123 6847 acydburn
                $db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('global_moderators') . '
2124 7952 kellanved
                        WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
2125 6847 acydburn
        }
2126 6847 acydburn
2127 6847 acydburn
        // Set user colour
2128 6847 acydburn
        $sql = 'SELECT group_id, group_colour FROM ' . GROUPS_TABLE . "
2129 6847 acydburn
                WHERE group_colour <> ''";
2130 6847 acydburn
        $result = $db->sql_query($sql);
2131 6847 acydburn
2132 6847 acydburn
        while ($row = $db->sql_fetchrow($result))
2133 6847 acydburn
        {
2134 6847 acydburn
                $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_colour = '{$row['group_colour']}' WHERE group_id = {$row['group_id']}");
2135 6847 acydburn
        }
2136 6847 acydburn
        $db->sql_freeresult($result);
2137 6847 acydburn
}
2138 6847 acydburn
2139 7180 acydburn
/**
2140 7180 acydburn
* Cleanly remove invalid user entries after converting the users table...
2141 7180 acydburn
*/
2142 7180 acydburn
function remove_invalid_users()
2143 7180 acydburn
{
2144 7772 kellanved
        global $convert, $db, $phpEx, $phpbb_root_path;
2145 7180 acydburn
2146 7180 acydburn
        // username_clean is UNIQUE
2147 7180 acydburn
        $sql = 'SELECT user_id
2148 7180 acydburn
                FROM ' . USERS_TABLE . "
2149 7180 acydburn
                WHERE username_clean = ''";
2150 7180 acydburn
        $result = $db->sql_query($sql);
2151 7180 acydburn
        $row = $db->sql_fetchrow($result);
2152 7180 acydburn
        $db->sql_freeresult($result);
2153 7180 acydburn
2154 7180 acydburn
        if ($row)
2155 7180 acydburn
        {
2156 7180 acydburn
                if (!function_exists('user_delete'))
2157 7180 acydburn
                {
2158 7180 acydburn
                        include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
2159 7180 acydburn
                }
2160 7180 acydburn
2161 7180 acydburn
                user_delete('remove', $row['user_id']);
2162 7180 acydburn
        }
2163 7180 acydburn
}
2164 7180 acydburn
2165 6847 acydburn
function convert_bbcode($message, $convert_size = true, $extended_bbcodes = false)
2166 6847 acydburn
{
2167 6847 acydburn
        static $orig, $repl, $origx, $replx, $str_from, $str_to;
2168 6847 acydburn
2169 6847 acydburn
        if (empty($orig))
2170 6847 acydburn
        {
2171 6847 acydburn
                $orig = $repl = array();
2172 6847 acydburn
2173 6847 acydburn
                $orig[] = '#\[(php|sql)\](.*?)\[/(php|sql)\]#is';
2174 6847 acydburn
                $repl[] = '[code]\2[/code]';
2175 6847 acydburn
2176 6847 acydburn
                $orig[] = '#\[font=[^\]]+\](.*?)\[/font\]#is';
2177 6847 acydburn
                $repl[] = '\1';
2178 6847 acydburn
2179 6847 acydburn
                $orig[] = '#\[align=[a-z]+\](.*?)\[/align\]#is';
2180 6847 acydburn
                $repl[] = '\1';
2181 6847 acydburn
2182 6847 acydburn
                $orig[] = '#\[/list=.*?\]#is';
2183 6847 acydburn
                $repl[] = '[/list]';
2184 6847 acydburn
2185 6847 acydburn
                $origx = array(
2186 6847 acydburn
                        '#\[glow[^\]]+\](.*?)\[/glow\]#is',
2187 6847 acydburn
                        '#\[shadow[^\]]+\](.*?)\[/shadow\]#is',
2188 6847 acydburn
                        '#\[flash[^\]]+\](.*?)\[/flash\]#is'
2189 6847 acydburn
                );
2190 6847 acydburn
2191 6847 acydburn
                $replx = array(
2192 6847 acydburn
                        '\1',
2193 6847 acydburn
                        '\1',
2194 6847 acydburn
                        '[url=\1]Flash[/url]'
2195 6847 acydburn
                );
2196 6847 acydburn
2197 6847 acydburn
                $str_from = array(
2198 6847 acydburn
                        '[ftp]',        '[/ftp]',
2199 6847 acydburn
                        '[ftp=',        '[/ftp]',
2200 6847 acydburn
                        '[pre]',        '[/pre]',
2201 6847 acydburn
                        '[table]',        '[/table]',
2202 6847 acydburn
                        '[td]',                '[/td]',
2203 6847 acydburn
                        '[tr]',                '[/tr]',
2204 6847 acydburn
                        '[s]',                '[/s]',
2205 6847 acydburn
                        '[left]',        '[/left]',
2206 6847 acydburn
                        '[right]',        '[/right]',
2207 6847 acydburn
                        '[center]',        '[/center]',
2208 6847 acydburn
                        '[sub]',        '[/sub]',
2209 6847 acydburn
                        '[sup]',        '[/sup]',
2210 6847 acydburn
                        '[tt]',                '[/tt]',
2211 6847 acydburn
                        '[move]',        '[/move]',
2212 6847 acydburn
                        '[hr]'
2213 6847 acydburn
                );
2214 6847 acydburn
2215 6847 acydburn
                $str_to = array(
2216 6847 acydburn
                        '[url]',        '[/url]',
2217 6847 acydburn
                        '[url=',        '[/url]',
2218 6847 acydburn
                        '[code]',        '[/code]',
2219 6847 acydburn
                        "\n",                '',
2220 6847 acydburn
                        '',                        '',
2221 6847 acydburn
                        "\n",                '',
2222 6847 acydburn
                        '',                        '',
2223 6847 acydburn
                        '',                        '',
2224 6847 acydburn
                        '',                        '',
2225 6847 acydburn
                        '',                        '',
2226 6847 acydburn
                        '',                        '',
2227 6847 acydburn
                        '',                        '',
2228 6847 acydburn
                        '',                        '',
2229 6847 acydburn
                        '',                        '',
2230 6847 acydburn
                        "\n\n"
2231 6847 acydburn
                );
2232 6847 acydburn
2233 6847 acydburn
                for ($i = 0; $i < sizeof($str_from); ++$i)
2234 6847 acydburn
                {
2235 6847 acydburn
                        $origx[] = '#\\' . str_replace(']', '\\]', $str_from[$i]) . '#is';
2236 6847 acydburn
                        $replx[] = $str_to[$i];
2237 6847 acydburn
                }
2238 6847 acydburn
        }
2239 6847 acydburn
2240 6847 acydburn
        if (preg_match_all('#\[email=([^\]]+)\](.*?)\[/email\]#i', $message, $m))
2241 6847 acydburn
        {
2242 6847 acydburn
                for ($i = 0; $i < sizeof($m[1]); ++$i)
2243 6847 acydburn
                {
2244 6847 acydburn
                        if ($m[1][$i] == $m[2][$i])
2245 6847 acydburn
                        {
2246 6847 acydburn
                                $message = str_replace($m[0][$i], '[email]' . $m[1][$i] . '[/email]', $message);
2247 6847 acydburn
                        }
2248 6847 acydburn
                        else
2249 6847 acydburn
                        {
2250 6847 acydburn
                                $message = str_replace($m[0][$i], $m[2][$i] . ' ([email]' . $m[1][$i] . '[/email])', $message);
2251 6847 acydburn
                        }
2252 6847 acydburn
                }
2253 6847 acydburn
        }
2254 6847 acydburn
2255 6847 acydburn
        if ($convert_size && preg_match('#\[size=[0-9]+\].*?\[/size\]#i', $message))
2256 6847 acydburn
        {
2257 6847 acydburn
                $size = array(9, 9, 12, 15, 18, 24, 29, 29, 29, 29);
2258 6847 acydburn
                $message = preg_replace('#\[size=([0-9]+)\](.*?)\[/size\]#i', '[size=\1]\2[/size]', $message);
2259 6847 acydburn
                $message = preg_replace('#\[size=[0-9]{2,}\](.*?)\[/size\]#i', '[size=29]\1[/size]', $message);
2260 6847 acydburn
2261 6847 acydburn
                for ($i = sizeof($size); $i; )
2262 6847 acydburn
                {
2263 6847 acydburn
                        $i--;
2264 6847 acydburn
                        $message = str_replace('[size=' . $i . ']', '[size=' . $size[$i] . ']', $message);
2265 6847 acydburn
                }
2266 6847 acydburn
        }
2267 6847 acydburn
2268 6847 acydburn
        if ($extended_bbcodes)
2269 6847 acydburn
        {
2270 6847 acydburn
                $message = preg_replace($origx, $replx, $message);
2271 6847 acydburn
        }
2272 6847 acydburn
2273 6847 acydburn
        $message = preg_replace($orig, $repl, $message);
2274 6847 acydburn
        return $message;
2275 6847 acydburn
}
2276 6847 acydburn
2277 6847 acydburn
2278 6847 acydburn
function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $source_relative_path = true)
2279 6847 acydburn
{
2280 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user, $db;
2281 7393 kellanved
2282 6847 acydburn
        if (substr($trg, -1) == '/')
2283 6847 acydburn
        {
2284 9905 acydburn
                $trg .= utf8_basename($src);
2285 6847 acydburn
        }
2286 6847 acydburn
        $src_path = relative_base($src, $source_relative_path, __LINE__, __FILE__);
2287 6847 acydburn
        $trg_path = $trg;
2288 6847 acydburn
2289 6847 acydburn
        if (!$overwrite && @file_exists($trg_path))
2290 6847 acydburn
        {
2291 6847 acydburn
                return true;
2292 6847 acydburn
        }
2293 7393 kellanved
2294 6847 acydburn
        if (!@file_exists($src_path))
2295 6847 acydburn
        {
2296 6847 acydburn
                return;
2297 6847 acydburn
        }
2298 6847 acydburn
2299 6847 acydburn
        $path = $phpbb_root_path;
2300 6847 acydburn
        $parts = explode('/', $trg);
2301 6847 acydburn
        unset($parts[sizeof($parts) - 1]);
2302 6847 acydburn
2303 6847 acydburn
        for ($i = 0; $i < sizeof($parts); ++$i)
2304 6847 acydburn
        {
2305 6847 acydburn
                $path .= $parts[$i] . '/';
2306 6847 acydburn
2307 6847 acydburn
                if (!is_dir($path))
2308 6847 acydburn
                {
2309 6847 acydburn
                        @mkdir($path, 0777);
2310 6847 acydburn
                }
2311 6847 acydburn
        }
2312 6847 acydburn
2313 10761 git-gate
        if (!phpbb_is_writable($path))
2314 6847 acydburn
        {
2315 6847 acydburn
                @chmod($path, 0777);
2316 6847 acydburn
        }
2317 6847 acydburn
2318 6847 acydburn
        if (!@copy($src_path, $phpbb_root_path . $trg_path))
2319 6847 acydburn
        {
2320 7392 kellanved
                $convert->p_master->error(sprintf($user->lang['COULD_NOT_COPY'], $src_path, $phpbb_root_path . $trg_path), __LINE__, __FILE__, !$die_on_failure);
2321 6847 acydburn
                return;
2322 6847 acydburn
        }
2323 6847 acydburn
2324 6847 acydburn
        if ($perm = @fileperms($src_path))
2325 6847 acydburn
        {
2326 6847 acydburn
                @chmod($phpbb_root_path . $trg_path, $perm);
2327 6847 acydburn
        }
2328 6847 acydburn
2329 6847 acydburn
        return true;
2330 6847 acydburn
}
2331 6847 acydburn
2332 6847 acydburn
function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_failure = true, $source_relative_path = true)
2333 6847 acydburn
{
2334 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user, $db;
2335 6847 acydburn
2336 6847 acydburn
        $dirlist = $filelist = $bad_dirs = array();
2337 6847 acydburn
        $src = path($src, $source_relative_path);
2338 6847 acydburn
        $trg = path($trg);
2339 6847 acydburn
        $src_path = relative_base($src, $source_relative_path, __LINE__, __FILE__);
2340 6847 acydburn
        $trg_path = $phpbb_root_path . $trg;
2341 6847 acydburn
2342 6847 acydburn
        if (!is_dir($trg_path))
2343 6847 acydburn
        {
2344 6847 acydburn
                @mkdir($trg_path, 0777);
2345 6847 acydburn
                @chmod($trg_path, 0777);
2346 6847 acydburn
        }
2347 6847 acydburn
2348 10761 git-gate
        if (!phpbb_is_writable($trg_path))
2349 6847 acydburn
        {
2350 6847 acydburn
                $bad_dirs[] = path($config['script_path']) . $trg;
2351 6847 acydburn
        }
2352 6847 acydburn
2353 6847 acydburn
        if ($handle = @opendir($src_path))
2354 6847 acydburn
        {
2355 6847 acydburn
                while ($entry = readdir($handle))
2356 6847 acydburn
                {
2357 6851 acydburn
                        if ($entry[0] == '.' || $entry == 'CVS' || $entry == 'index.htm')
2358 6847 acydburn
                        {
2359 6847 acydburn
                                continue;
2360 6847 acydburn
                        }
2361 6847 acydburn
2362 6847 acydburn
                        if (is_dir($src_path . $entry))
2363 6847 acydburn
                        {
2364 6847 acydburn
                                $dirlist[] = $entry;
2365 6847 acydburn
                        }
2366 6847 acydburn
                        else
2367 6847 acydburn
                        {
2368 6847 acydburn
                                $filelist[] = $entry;
2369 6847 acydburn
                        }
2370 6847 acydburn
                }
2371 6847 acydburn
                closedir($handle);
2372 6847 acydburn
        }
2373 6847 acydburn
        else if ($dir = @dir($src_path))
2374 6847 acydburn
        {
2375 6847 acydburn
                while ($entry = $dir->read())
2376 6847 acydburn
                {
2377 6851 acydburn
                        if ($entry[0] == '.' || $entry == 'CVS' || $entry == 'index.htm')
2378 6847 acydburn
                        {
2379 6847 acydburn
                                continue;
2380 6847 acydburn
                        }
2381 6847 acydburn
2382 6847 acydburn
                        if (is_dir($src_path . $entry))
2383 6847 acydburn
                        {
2384 6847 acydburn
                                $dirlist[] = $entry;
2385 6847 acydburn
                        }
2386 6847 acydburn
                        else
2387 6847 acydburn
                        {
2388 6847 acydburn
                                $filelist[] = $entry;
2389 6847 acydburn
                        }
2390 6847 acydburn
                }
2391 6847 acydburn
                $dir->close();
2392 6847 acydburn
        }
2393 6847 acydburn
        else
2394 6847 acydburn
        {
2395 6847 acydburn
                $convert->p_master->error(sprintf($user->lang['CONV_ERROR_COULD_NOT_READ'], relative_base($src, $source_relative_path)), __LINE__, __FILE__);
2396 6847 acydburn
        }
2397 6847 acydburn
2398 6847 acydburn
        if ($copy_subdirs)
2399 6847 acydburn
        {
2400 6847 acydburn
                for ($i = 0; $i < sizeof($dirlist); ++$i)
2401 6847 acydburn
                {
2402 6847 acydburn
                        $dir = $dirlist[$i];
2403 6847 acydburn
2404 6847 acydburn
                        if ($dir == 'CVS')
2405 6847 acydburn
                        {
2406 6847 acydburn
                                continue;
2407 6847 acydburn
                        }
2408 6847 acydburn
2409 6847 acydburn
                        if (!is_dir($trg_path . $dir))
2410 6847 acydburn
                        {
2411 6847 acydburn
                                @mkdir($trg_path . $dir, 0777);
2412 6847 acydburn
                                @chmod($trg_path . $dir, 0777);
2413 6847 acydburn
                        }
2414 6847 acydburn
2415 10761 git-gate
                        if (!phpbb_is_writable($trg_path . $dir))
2416 6847 acydburn
                        {
2417 6847 acydburn
                                $bad_dirs[] = $trg . $dir;
2418 6847 acydburn
                                $bad_dirs[] = $trg_path . $dir;
2419 6847 acydburn
                        }
2420 6847 acydburn
2421 6847 acydburn
                        if (!sizeof($bad_dirs))
2422 6847 acydburn
                        {
2423 6847 acydburn
                                copy_dir($src . $dir, $trg . $dir, true, $overwrite, $die_on_failure, $source_relative_path);
2424 6847 acydburn
                        }
2425 6847 acydburn
                }
2426 6847 acydburn
        }
2427 6847 acydburn
2428 6847 acydburn
        if (sizeof($bad_dirs))
2429 6847 acydburn
        {
2430 6847 acydburn
                $str = (sizeof($bad_dirs) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE'];
2431 6847 acydburn
                sort($bad_dirs);
2432 6847 acydburn
                $convert->p_master->error(sprintf($str, implode('<br />', $bad_dirs)), __LINE__, __FILE__);
2433 6847 acydburn
        }
2434 6847 acydburn
2435 6847 acydburn
        for ($i = 0; $i < sizeof($filelist); ++$i)
2436 6847 acydburn
        {
2437 6847 acydburn
                copy_file($src . $filelist[$i], $trg . $filelist[$i], $overwrite, $die_on_failure, $source_relative_path);
2438 6847 acydburn
        }
2439 6847 acydburn
}
2440 6847 acydburn
2441 6847 acydburn
function relative_base($path, $is_relative = true, $line = false, $file = false)
2442 6847 acydburn
{
2443 6847 acydburn
        global $convert, $phpbb_root_path, $config, $user, $db;
2444 6847 acydburn
2445 6847 acydburn
        if (!$is_relative)
2446 6847 acydburn
        {
2447 6847 acydburn
                return $path;
2448 6847 acydburn
        }
2449 6847 acydburn
2450 6872 acydburn
        if (empty($convert->options['forum_path']) && $is_relative)
2451 6847 acydburn
        {
2452 6847 acydburn
                $line = $line ? $line : __LINE__;
2453 6847 acydburn
                $file = $file ? $file : __FILE__;
2454 6847 acydburn
2455 6847 acydburn
                $convert->p_master->error($user->lang['CONV_ERROR_NO_FORUM_PATH'], $line, $file);
2456 6847 acydburn
        }
2457 6847 acydburn
2458 6872 acydburn
        return $convert->options['forum_path'] . '/' . $path;
2459 6847 acydburn
}
2460 6847 acydburn
2461 7692 kellanved
function get_smiley_display()
2462 7692 kellanved
{
2463 7692 kellanved
        static $smiley_count = 0;
2464 7692 kellanved
        $smiley_count++;
2465 7692 kellanved
        return ($smiley_count < 50) ? 1 : 0;
2466 7692 kellanved
}
2467 7692 kellanved
2468 7806 kellanved
2469 7806 kellanved
function fill_dateformat($user_dateformat)
2470 7806 kellanved
{
2471 7806 kellanved
        global $config;
2472 8667 acydburn
2473 7806 kellanved
        return ((empty($user_dateformat)) ? $config['default_dateformat'] : $user_dateformat);
2474 7806 kellanved
}