~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/functions_convert.php

Merge setup-stuff.

phpBB is gone, configuration, setup and jail building are completely redone.

Please read doc/setup/install_proc.txt, or you'll not get far.

Show diffs side-by-side

added added

removed removed

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