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

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/functions_posting.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 phpBB3
5
 
* @version $Id: functions_posting.php,v 1.274 2007/11/27 15:13:49 kellanved Exp $
6
 
* @copyright (c) 2005 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
 
* Fill smiley templates (or just the variables) with smilies, either in a window or inline
21
 
*/
22
 
function generate_smilies($mode, $forum_id)
23
 
{
24
 
        global $auth, $db, $user, $config, $template;
25
 
        global $phpEx, $phpbb_root_path;
26
 
 
27
 
        if ($mode == 'window')
28
 
        {
29
 
                if ($forum_id)
30
 
                {
31
 
                        $sql = 'SELECT forum_style
32
 
                                FROM ' . FORUMS_TABLE . "
33
 
                                WHERE forum_id = $forum_id";
34
 
                        $result = $db->sql_query_limit($sql, 1);
35
 
                        $row = $db->sql_fetchrow($result);
36
 
                        $db->sql_freeresult($result);
37
 
 
38
 
                        $user->setup('posting', (int) $row['forum_style']);
39
 
                }
40
 
                else
41
 
                {
42
 
                        $user->setup('posting');
43
 
                }
44
 
 
45
 
                page_header($user->lang['SMILIES']);
46
 
 
47
 
                $template->set_filenames(array(
48
 
                        'body' => 'posting_smilies.html')
49
 
                );
50
 
        }
51
 
 
52
 
        $display_link = false;
53
 
        if ($mode == 'inline')
54
 
        {
55
 
                $sql = 'SELECT smiley_id
56
 
                        FROM ' . SMILIES_TABLE . '
57
 
                        WHERE display_on_posting = 0';
58
 
                $result = $db->sql_query_limit($sql, 1, 0, 3600);
59
 
 
60
 
                if ($row = $db->sql_fetchrow($result))
61
 
                {
62
 
                        $display_link = true;
63
 
                }
64
 
                $db->sql_freeresult($result);
65
 
        }
66
 
 
67
 
        $last_url = '';
68
 
 
69
 
        $sql = 'SELECT *
70
 
                FROM ' . SMILIES_TABLE .
71
 
                (($mode == 'inline') ? ' WHERE display_on_posting = 1 ' : '') . '
72
 
                ORDER BY smiley_order';
73
 
        $result = $db->sql_query($sql, 3600);
74
 
 
75
 
        $smilies = array();
76
 
        while ($row = $db->sql_fetchrow($result))
77
 
        {
78
 
                if (empty($smilies[$row['smiley_url']]))
79
 
                {
80
 
                        $smilies[$row['smiley_url']] = $row;
81
 
                }
82
 
        }
83
 
        $db->sql_freeresult($result);
84
 
 
85
 
        if (sizeof($smilies))
86
 
        {
87
 
                foreach ($smilies as $row)
88
 
                {
89
 
                        $template->assign_block_vars('smiley', array(
90
 
                                'SMILEY_CODE'   => $row['code'],
91
 
                                'A_SMILEY_CODE' => addslashes($row['code']),
92
 
                                'SMILEY_IMG'    => $phpbb_root_path . $config['smilies_path'] . '/' . $row['smiley_url'],
93
 
                                'SMILEY_WIDTH'  => $row['smiley_width'],
94
 
                                'SMILEY_HEIGHT' => $row['smiley_height'],
95
 
                                'SMILEY_DESC'   => $row['emotion'])
96
 
                        );
97
 
                }
98
 
        }
99
 
 
100
 
        if ($mode == 'inline' && $display_link)
101
 
        {
102
 
                $template->assign_vars(array(
103
 
                        'S_SHOW_SMILEY_LINK'    => true,
104
 
                        'U_MORE_SMILIES'                => append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id))
105
 
                );
106
 
        }
107
 
 
108
 
        if ($mode == 'window')
109
 
        {
110
 
                page_footer();
111
 
        }
112
 
}
113
 
 
114
 
/**
115
 
* Update last post information
116
 
* Should be used instead of sync() if only the last post information are out of sync... faster
117
 
*
118
 
* @param        string  $type                           Can be forum|topic
119
 
* @param        mixed   $ids                            topic/forum ids
120
 
* @param        bool    $return_update_sql      true: SQL query shall be returned, false: execute SQL
121
 
*/
122
 
function update_post_information($type, $ids, $return_update_sql = false)
123
 
{
124
 
        global $db;
125
 
 
126
 
        if (empty($ids))
127
 
        {
128
 
                return;
129
 
        }
130
 
        if (!is_array($ids))
131
 
        {
132
 
                $ids = array($ids);
133
 
        }
134
 
 
135
 
 
136
 
        $update_sql = $empty_forums = $not_empty_forums = array();
137
 
 
138
 
        if ($type != 'topic')
139
 
        {
140
 
                $topic_join = ', ' . TOPICS_TABLE . ' t';
141
 
                $topic_condition = 'AND t.topic_id = p.topic_id AND t.topic_approved = 1';
142
 
        }
143
 
        else
144
 
        {
145
 
                $topic_join = '';
146
 
                $topic_condition = '';
147
 
        }
148
 
 
149
 
        if (sizeof($ids) == 1)
150
 
        {
151
 
                $sql = 'SELECT MAX(p.post_id) as last_post_id
152
 
                        FROM ' . POSTS_TABLE . " p $topic_join
153
 
                        WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . "
154
 
                                $topic_condition
155
 
                                AND p.post_approved = 1";
156
 
        }
157
 
        else
158
 
        {
159
 
                $sql = 'SELECT p.' . $type . '_id, MAX(p.post_id) as last_post_id
160
 
                        FROM ' . POSTS_TABLE . " p $topic_join
161
 
                        WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . "
162
 
                                $topic_condition
163
 
                                AND p.post_approved = 1
164
 
                        GROUP BY p.{$type}_id";
165
 
        }
166
 
        $result = $db->sql_query($sql);
167
 
 
168
 
        $last_post_ids = array();
169
 
        while ($row = $db->sql_fetchrow($result))
170
 
        {
171
 
                if (sizeof($ids) == 1)
172
 
                {
173
 
                        $row[$type . '_id'] = $ids[0];
174
 
                }
175
 
 
176
 
                if ($type == 'forum')
177
 
                {
178
 
                        $not_empty_forums[] = $row['forum_id'];
179
 
 
180
 
                        if (empty($row['last_post_id']))
181
 
                        {
182
 
                                $empty_forums[] = $row['forum_id'];
183
 
                        }
184
 
                }
185
 
 
186
 
                $last_post_ids[] = $row['last_post_id'];
187
 
        }
188
 
        $db->sql_freeresult($result);
189
 
 
190
 
        if ($type == 'forum')
191
 
        {
192
 
                $empty_forums = array_merge($empty_forums, array_diff($ids, $not_empty_forums));
193
 
 
194
 
                foreach ($empty_forums as $void => $forum_id)
195
 
                {
196
 
                        $update_sql[$forum_id][] = 'forum_last_post_id = 0';
197
 
                        $update_sql[$forum_id][] = "forum_last_post_subject = ''";
198
 
                        $update_sql[$forum_id][] = 'forum_last_post_time = 0';
199
 
                        $update_sql[$forum_id][] = 'forum_last_poster_id = 0';
200
 
                        $update_sql[$forum_id][] = "forum_last_poster_name = ''";
201
 
                        $update_sql[$forum_id][] = "forum_last_poster_colour = ''";
202
 
                }
203
 
        }
204
 
 
205
 
        if (sizeof($last_post_ids))
206
 
        {
207
 
                $sql = 'SELECT p.' . $type . '_id, p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
208
 
                        FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
209
 
                        WHERE p.poster_id = u.user_id
210
 
                                AND ' . $db->sql_in_set('p.post_id', $last_post_ids);
211
 
                $result = $db->sql_query($sql);
212
 
 
213
 
                while ($row = $db->sql_fetchrow($result))
214
 
                {
215
 
                        $update_sql[$row["{$type}_id"]][] = $type . '_last_post_id = ' . (int) $row['post_id'];
216
 
                        $update_sql[$row["{$type}_id"]][] = "{$type}_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
217
 
                        $update_sql[$row["{$type}_id"]][] = $type . '_last_post_time = ' . (int) $row['post_time'];
218
 
                        $update_sql[$row["{$type}_id"]][] = $type . '_last_poster_id = ' . (int) $row['poster_id'];
219
 
                        $update_sql[$row["{$type}_id"]][] = "{$type}_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
220
 
                        $update_sql[$row["{$type}_id"]][] = "{$type}_last_poster_name = '" . (($row['poster_id'] == ANONYMOUS) ? $db->sql_escape($row['post_username']) : $db->sql_escape($row['username'])) . "'";
221
 
                }
222
 
                $db->sql_freeresult($result);
223
 
        }
224
 
        unset($empty_forums, $ids, $last_post_ids);
225
 
 
226
 
        if ($return_update_sql || !sizeof($update_sql))
227
 
        {
228
 
                return $update_sql;
229
 
        }
230
 
 
231
 
        $table = ($type == 'forum') ? FORUMS_TABLE : TOPICS_TABLE;
232
 
 
233
 
        foreach ($update_sql as $update_id => $update_sql_ary)
234
 
        {
235
 
                $sql = "UPDATE $table
236
 
                        SET " . implode(', ', $update_sql_ary) . "
237
 
                        WHERE {$type}_id = $update_id";
238
 
                $db->sql_query($sql);
239
 
        }
240
 
 
241
 
        return;
242
 
}
243
 
 
244
 
/**
245
 
* Generate Topic Icons for display
246
 
*/
247
 
function posting_gen_topic_icons($mode, $icon_id)
248
 
{
249
 
        global $phpbb_root_path, $config, $template, $cache;
250
 
 
251
 
        // Grab icons
252
 
        $icons = $cache->obtain_icons();
253
 
 
254
 
        if (!$icon_id)
255
 
        {
256
 
                $template->assign_var('S_NO_ICON_CHECKED', ' checked="checked"');
257
 
        }
258
 
 
259
 
        if (sizeof($icons))
260
 
        {
261
 
                foreach ($icons as $id => $data)
262
 
                {
263
 
                        if ($data['display'])
264
 
                        {
265
 
                                $template->assign_block_vars('topic_icon', array(
266
 
                                        'ICON_ID'               => $id,
267
 
                                        'ICON_IMG'              => $phpbb_root_path . $config['icons_path'] . '/' . $data['img'],
268
 
                                        'ICON_WIDTH'    => $data['width'],
269
 
                                        'ICON_HEIGHT'   => $data['height'],
270
 
        
271
 
                                        'S_CHECKED'                     => ($id == $icon_id) ? true : false,
272
 
                                        'S_ICON_CHECKED'        => ($id == $icon_id) ? ' checked="checked"' : '')
273
 
                                );
274
 
                        }
275
 
                }
276
 
 
277
 
                return true;
278
 
        }
279
 
 
280
 
        return false;
281
 
}
282
 
 
283
 
/**
284
 
* Build topic types able to be selected
285
 
*/
286
 
function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
287
 
{
288
 
        global $auth, $user, $template, $topic_type;
289
 
 
290
 
        $toggle = false;
291
 
 
292
 
        $topic_types = array(
293
 
                'sticky'        => array('const' => POST_STICKY, 'lang' => 'POST_STICKY'),
294
 
                'announce'      => array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'),
295
 
                'global'        => array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL')
296
 
        );
297
 
 
298
 
        $topic_type_array = array();
299
 
 
300
 
        foreach ($topic_types as $auth_key => $topic_value)
301
 
        {
302
 
                // We do not have a special post global announcement permission
303
 
                $auth_key = ($auth_key == 'global') ? 'announce' : $auth_key;
304
 
 
305
 
                if ($auth->acl_get('f_' . $auth_key, $forum_id))
306
 
                {
307
 
                        $toggle = true;
308
 
 
309
 
                        $topic_type_array[] = array(
310
 
                                'VALUE'                 => $topic_value['const'],
311
 
                                'S_CHECKED'             => ($cur_topic_type == $topic_value['const'] || ($forum_id == 0 && $topic_value['const'] == POST_GLOBAL)) ? ' checked="checked"' : '',
312
 
                                'L_TOPIC_TYPE'  => $user->lang[$topic_value['lang']]
313
 
                        );
314
 
                }
315
 
        }
316
 
 
317
 
        if ($toggle)
318
 
        {
319
 
                $topic_type_array = array_merge(array(0 => array(
320
 
                        'VALUE'                 => POST_NORMAL,
321
 
                        'S_CHECKED'             => ($topic_type == POST_NORMAL) ? ' checked="checked"' : '',
322
 
                        'L_TOPIC_TYPE'  => $user->lang['POST_NORMAL'])),
323
 
 
324
 
                        $topic_type_array
325
 
                );
326
 
                
327
 
                foreach ($topic_type_array as $array)
328
 
                {
329
 
                        $template->assign_block_vars('topic_type', $array);
330
 
                }
331
 
 
332
 
                $template->assign_vars(array(
333
 
                        'S_TOPIC_TYPE_STICKY'   => ($auth->acl_get('f_sticky', $forum_id)),
334
 
                        'S_TOPIC_TYPE_ANNOUNCE' => ($auth->acl_get('f_announce', $forum_id)))
335
 
                );
336
 
        }
337
 
 
338
 
        return $toggle;
339
 
}
340
 
 
341
 
//
342
 
// Attachment related functions
343
 
//
344
 
 
345
 
/**
346
 
* Upload Attachment - filedata is generated here
347
 
* Uses upload class
348
 
*/
349
 
function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false)
350
 
{
351
 
        global $auth, $user, $config, $db, $cache;
352
 
        global $phpbb_root_path, $phpEx;
353
 
 
354
 
        $filedata = array(
355
 
                'error' => array()
356
 
        );
357
 
 
358
 
        include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx);
359
 
        $upload = new fileupload();
360
 
 
361
 
        if (!$local)
362
 
        {
363
 
                $filedata['post_attach'] = ($upload->is_valid($form_name)) ? true : false;
364
 
        }
365
 
        else
366
 
        {
367
 
                $filedata['post_attach'] = true;
368
 
        }
369
 
 
370
 
        if (!$filedata['post_attach'])
371
 
        {
372
 
                $filedata['error'][] = $user->lang['NO_UPLOAD_FORM_FOUND'];
373
 
                return $filedata;
374
 
        }
375
 
 
376
 
        $extensions = $cache->obtain_attach_extensions((($is_message) ? false : (int) $forum_id));
377
 
        $upload->set_allowed_extensions(array_keys($extensions['_allowed_']));
378
 
 
379
 
        $file = ($local) ? $upload->local_upload($local_storage, $local_filedata) : $upload->form_upload($form_name);
380
 
 
381
 
        if ($file->init_error)
382
 
        {
383
 
                $filedata['post_attach'] = false;
384
 
                return $filedata;
385
 
        }
386
 
 
387
 
        $cat_id = (isset($extensions[$file->get('extension')]['display_cat'])) ? $extensions[$file->get('extension')]['display_cat'] : ATTACHMENT_CATEGORY_NONE;
388
 
 
389
 
        // Make sure the image category only holds valid images...
390
 
        if ($cat_id == ATTACHMENT_CATEGORY_IMAGE && !$file->is_image())
391
 
        {
392
 
                $file->remove();
393
 
 
394
 
                // If this error occurs a user tried to exploit an IE Bug by renaming extensions
395
 
                // Since the image category is displaying content inline we need to catch this.
396
 
                trigger_error($user->lang['ATTACHED_IMAGE_NOT_IMAGE']);
397
 
        }
398
 
 
399
 
        // Do we have to create a thumbnail?
400
 
        $filedata['thumbnail'] = ($cat_id == ATTACHMENT_CATEGORY_IMAGE && $config['img_create_thumbnail']) ? 1 : 0;
401
 
 
402
 
        // Check Image Size, if it is an image
403
 
        if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id) && $cat_id == ATTACHMENT_CATEGORY_IMAGE)
404
 
        {
405
 
                $file->upload->set_allowed_dimensions(0, 0, $config['img_max_width'], $config['img_max_height']);
406
 
        }
407
 
 
408
 
        // Admins and mods are allowed to exceed the allowed filesize
409
 
        if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id))
410
 
        {
411
 
                if (!empty($extensions[$file->get('extension')]['max_filesize']))
412
 
                {
413
 
                        $allowed_filesize = $extensions[$file->get('extension')]['max_filesize'];
414
 
                }
415
 
                else
416
 
                {
417
 
                        $allowed_filesize = ($is_message) ? $config['max_filesize_pm'] : $config['max_filesize'];
418
 
                }
419
 
 
420
 
                $file->upload->set_max_filesize($allowed_filesize);
421
 
        }
422
 
 
423
 
        $file->clean_filename('unique', $user->data['user_id'] . '_');
424
 
 
425
 
        // Are we uploading an image *and* this image being within the image category? Only then perform additional image checks.
426
 
        $no_image = ($cat_id == ATTACHMENT_CATEGORY_IMAGE) ? false : true;
427
 
 
428
 
        $file->move_file($config['upload_path'], false, $no_image);
429
 
 
430
 
        if (sizeof($file->error))
431
 
        {
432
 
                $file->remove();
433
 
                $filedata['error'] = array_merge($filedata['error'], $file->error);
434
 
                $filedata['post_attach'] = false;
435
 
 
436
 
                return $filedata;
437
 
        }
438
 
 
439
 
        $filedata['filesize'] = $file->get('filesize');
440
 
        $filedata['mimetype'] = $file->get('mimetype');
441
 
        $filedata['extension'] = $file->get('extension');
442
 
        $filedata['physical_filename'] = $file->get('realname');
443
 
        $filedata['real_filename'] = $file->get('uploadname');
444
 
        $filedata['filetime'] = time();
445
 
 
446
 
        // Check our complete quota
447
 
        if ($config['attachment_quota'])
448
 
        {
449
 
                if ($config['upload_dir_size'] + $file->get('filesize') > $config['attachment_quota'])
450
 
                {
451
 
                        $filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED'];
452
 
                        $filedata['post_attach'] = false;
453
 
 
454
 
                        $file->remove();
455
 
 
456
 
                        return $filedata;
457
 
                }
458
 
        }
459
 
 
460
 
        // Check free disk space
461
 
        if ($free_space = @disk_free_space($phpbb_root_path . $config['upload_path']))
462
 
        {
463
 
                if ($free_space <= $file->get('filesize'))
464
 
                {
465
 
                        $filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED'];
466
 
                        $filedata['post_attach'] = false;
467
 
 
468
 
                        $file->remove();
469
 
 
470
 
                        return $filedata;
471
 
                }
472
 
        }
473
 
 
474
 
        // Create Thumbnail
475
 
        if ($filedata['thumbnail'])
476
 
        {
477
 
                $source = $file->get('destination_file');
478
 
                $destination = $file->get('destination_path') . '/thumb_' . $file->get('realname');
479
 
 
480
 
                if (!create_thumbnail($source, $destination, $file->get('mimetype')))
481
 
                {
482
 
                        $filedata['thumbnail'] = 0;
483
 
                }
484
 
        }
485
 
 
486
 
        return $filedata;
487
 
}
488
 
 
489
 
/**
490
 
* Calculate the needed size for Thumbnail
491
 
*/
492
 
function get_img_size_format($width, $height)
493
 
{
494
 
        global $config;
495
 
 
496
 
        // Maximum Width the Image can take
497
 
        $max_width = ($config['img_max_thumb_width']) ? $config['img_max_thumb_width'] : 400;
498
 
 
499
 
        if ($width > $height)
500
 
        {
501
 
                return array(
502
 
                        round($width * ($max_width / $width)),
503
 
                        round($height * ($max_width / $width))
504
 
                );
505
 
        }
506
 
        else
507
 
        {
508
 
                return array(
509
 
                        round($width * ($max_width / $height)),
510
 
                        round($height * ($max_width / $height))
511
 
                );
512
 
        }
513
 
}
514
 
 
515
 
/**
516
 
* Return supported image types
517
 
*/
518
 
function get_supported_image_types($type = false)
519
 
{
520
 
        if (@extension_loaded('gd'))
521
 
        {
522
 
                $format = imagetypes();
523
 
                $new_type = 0;
524
 
 
525
 
                if ($type !== false)
526
 
                {
527
 
                        switch ($type)
528
 
                        {
529
 
                                // GIF
530
 
                                case 1:
531
 
                                        $new_type = ($format & IMG_GIF) ? IMG_GIF : false;
532
 
                                break;
533
 
 
534
 
                                // JPG, JPC, JP2
535
 
                                case 2:
536
 
                                case 9:
537
 
                                case 10:
538
 
                                case 11:
539
 
                                case 12:
540
 
                                        $new_type = ($format & IMG_JPG) ? IMG_JPG : false;
541
 
                                break;
542
 
 
543
 
                                // PNG
544
 
                                case 3:
545
 
                                        $new_type = ($format & IMG_PNG) ? IMG_PNG : false;
546
 
                                break;
547
 
 
548
 
                                // BMP, WBMP
549
 
                                case 6:
550
 
                                case 15:
551
 
                                        $new_type = ($format & IMG_WBMP) ? IMG_WBMP : false;
552
 
                                break;
553
 
                        }
554
 
                }
555
 
                else
556
 
                {
557
 
                        $new_type = array();
558
 
                        $go_through_types = array(IMG_GIF, IMG_JPG, IMG_PNG, IMG_WBMP);
559
 
 
560
 
                        foreach ($go_through_types as $check_type)
561
 
                        {
562
 
                                if ($format & $check_type)
563
 
                                {
564
 
                                        $new_type[] = $check_type;
565
 
                                }
566
 
                        }
567
 
                }
568
 
 
569
 
                return array(
570
 
                        'gd'            => ($new_type) ? true : false,
571
 
                        'format'        => $new_type,
572
 
                        'version'       => (function_exists('imagecreatetruecolor')) ? 2 : 1
573
 
                );
574
 
        }
575
 
 
576
 
        return array('gd' => false);
577
 
}
578
 
 
579
 
/**
580
 
* Create Thumbnail
581
 
*/
582
 
function create_thumbnail($source, $destination, $mimetype)
583
 
{
584
 
        global $config;
585
 
 
586
 
        $min_filesize = (int) $config['img_min_thumb_filesize'];
587
 
        $img_filesize = (file_exists($source)) ? @filesize($source) : false;
588
 
 
589
 
        if (!$img_filesize || $img_filesize <= $min_filesize)
590
 
        {
591
 
                return false;
592
 
        }
593
 
 
594
 
        $dimension = @getimagesize($source);
595
 
 
596
 
        if ($dimension === false)
597
 
        {
598
 
                return false;
599
 
        }
600
 
 
601
 
        list($width, $height, $type, ) = $dimension;
602
 
 
603
 
        if (empty($width) || empty($height))
604
 
        {
605
 
                return false;
606
 
        }
607
 
 
608
 
        list($new_width, $new_height) = get_img_size_format($width, $height);
609
 
 
610
 
        // Do not create a thumbnail if the resulting width/height is bigger than the original one
611
 
        if ($new_width > $width && $new_height > $height)
612
 
        {
613
 
                return false;
614
 
        }
615
 
 
616
 
        $used_imagick = false;
617
 
 
618
 
        // Only use imagemagick if defined and the passthru function not disabled
619
 
        if ($config['img_imagick'] && function_exists('passthru'))
620
 
        {
621
 
                @passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -sample ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');
622
 
 
623
 
                if (file_exists($destination))
624
 
                {
625
 
                        $used_imagick = true;
626
 
                }
627
 
        }
628
 
 
629
 
        if (!$used_imagick)
630
 
        {
631
 
                $type = get_supported_image_types($type);
632
 
 
633
 
                if ($type['gd'])
634
 
                {
635
 
                        // If the type is not supported, we are not able to create a thumbnail
636
 
                        if ($type['format'] === false)
637
 
                        {
638
 
                                return false;
639
 
                        }
640
 
 
641
 
                        switch ($type['format'])
642
 
                        {
643
 
                                case IMG_GIF:
644
 
                                        $image = @imagecreatefromgif($source);
645
 
                                break;
646
 
 
647
 
                                case IMG_JPG:
648
 
                                        $image = @imagecreatefromjpeg($source);
649
 
                                break;
650
 
 
651
 
                                case IMG_PNG:
652
 
                                        $image = @imagecreatefrompng($source);
653
 
                                break;
654
 
 
655
 
                                case IMG_WBMP:
656
 
                                        $image = @imagecreatefromwbmp($source);
657
 
                                break;
658
 
                        }
659
 
 
660
 
                        if ($type['version'] == 1)
661
 
                        {
662
 
                                $new_image = imagecreate($new_width, $new_height);
663
 
 
664
 
                                if ($new_image === false)
665
 
                                {
666
 
                                        return false;
667
 
                                }
668
 
 
669
 
                                imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
670
 
                        }
671
 
                        else
672
 
                        {
673
 
                                $new_image = imagecreatetruecolor($new_width, $new_height);
674
 
 
675
 
                                if ($new_image === false)
676
 
                                {
677
 
                                        return false;
678
 
                                }
679
 
 
680
 
                                imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
681
 
                        }
682
 
 
683
 
                        // If we are in safe mode create the destination file prior to using the gd functions to circumvent a PHP bug
684
 
                        if (@ini_get('safe_mode') || @strtolower(ini_get('safe_mode')) == 'on')
685
 
                        {
686
 
                                @touch($destination);
687
 
                        }
688
 
 
689
 
                        switch ($type['format'])
690
 
                        {
691
 
                                case IMG_GIF:
692
 
                                        imagegif($new_image, $destination);
693
 
                                break;
694
 
 
695
 
                                case IMG_JPG:
696
 
                                        imagejpeg($new_image, $destination, 90);
697
 
                                break;
698
 
 
699
 
                                case IMG_PNG:
700
 
                                        imagepng($new_image, $destination);
701
 
                                break;
702
 
 
703
 
                                case IMG_WBMP:
704
 
                                        imagewbmp($new_image, $destination);
705
 
                                break;
706
 
                        }
707
 
 
708
 
                        imagedestroy($new_image);
709
 
                }
710
 
                else
711
 
                {
712
 
                        return false;
713
 
                }
714
 
        }
715
 
 
716
 
        if (!file_exists($destination))
717
 
        {
718
 
                return false;
719
 
        }
720
 
 
721
 
        @chmod($destination, 0666);
722
 
 
723
 
        return true;
724
 
}
725
 
 
726
 
/**
727
 
* Assign Inline attachments (build option fields)
728
 
*/
729
 
function posting_gen_inline_attachments(&$attachment_data)
730
 
{
731
 
        global $template;
732
 
 
733
 
        if (sizeof($attachment_data))
734
 
        {
735
 
                $s_inline_attachment_options = '';
736
 
 
737
 
                foreach ($attachment_data as $i => $attachment)
738
 
                {
739
 
                        $s_inline_attachment_options .= '<option value="' . $i . '">' . basename($attachment['real_filename']) . '</option>';
740
 
                }
741
 
 
742
 
                $template->assign_var('S_INLINE_ATTACHMENT_OPTIONS', $s_inline_attachment_options);
743
 
 
744
 
                return true;
745
 
        }
746
 
 
747
 
        return false;
748
 
}
749
 
 
750
 
/**
751
 
* Generate inline attachment entry
752
 
*/
753
 
function posting_gen_attachment_entry($attachment_data, &$filename_data)
754
 
{
755
 
        global $template, $config, $phpbb_root_path, $phpEx, $user;
756
 
 
757
 
        $template->assign_vars(array(
758
 
                'S_SHOW_ATTACH_BOX'     => true)
759
 
        );
760
 
 
761
 
        if (sizeof($attachment_data))
762
 
        {
763
 
                $template->assign_vars(array(
764
 
                        'S_HAS_ATTACHMENTS'     => true)
765
 
                );
766
 
 
767
 
                // We display the posted attachments within the desired order.
768
 
                ($config['display_order']) ? krsort($attachment_data) : ksort($attachment_data);
769
 
 
770
 
                foreach ($attachment_data as $count => $attach_row)
771
 
                {
772
 
                        $hidden = '';
773
 
                        $attach_row['real_filename'] = basename($attach_row['real_filename']);
774
 
 
775
 
                        foreach ($attach_row as $key => $value)
776
 
                        {
777
 
                                $hidden .= '<input type="hidden" name="attachment_data[' . $count . '][' . $key . ']" value="' . $value . '" />';
778
 
                        }
779
 
 
780
 
                        $download_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'mode=view&amp;id=' . (int) $attach_row['attach_id'], true, ($attach_row['is_orphan']) ? $user->session_id : false);
781
 
 
782
 
                        $template->assign_block_vars('attach_row', array(
783
 
                                'FILENAME'                      => basename($attach_row['real_filename']),
784
 
                                'A_FILENAME'            => addslashes(basename($attach_row['real_filename'])),
785
 
                                'FILE_COMMENT'          => $attach_row['attach_comment'],
786
 
                                'ATTACH_ID'                     => $attach_row['attach_id'],
787
 
                                'S_IS_ORPHAN'           => $attach_row['is_orphan'],
788
 
                                'ASSOC_INDEX'           => $count,
789
 
 
790
 
                                'U_VIEW_ATTACHMENT'     => $download_link,
791
 
                                'S_HIDDEN'                      => $hidden)
792
 
                        );
793
 
                }
794
 
        }
795
 
 
796
 
        $template->assign_vars(array(
797
 
                'FILE_COMMENT'  => $filename_data['filecomment'],
798
 
                'FILESIZE'              => $config['max_filesize'])
799
 
        );
800
 
 
801
 
        return sizeof($attachment_data);
802
 
}
803
 
 
804
 
//
805
 
// General Post functions
806
 
//
807
 
 
808
 
/**
809
 
* Load Drafts
810
 
*/
811
 
function load_drafts($topic_id = 0, $forum_id = 0, $id = 0)
812
 
{
813
 
        global $user, $db, $template, $auth;
814
 
        global $phpbb_root_path, $phpEx;
815
 
 
816
 
        $topic_ids = $forum_ids = $draft_rows = array();
817
 
 
818
 
        // Load those drafts not connected to forums/topics
819
 
        // If forum_id == 0 AND topic_id == 0 then this is a PM draft
820
 
        if (!$topic_id && !$forum_id)
821
 
        {
822
 
                $sql_and = ' AND d.forum_id = 0 AND d.topic_id = 0';
823
 
        }
824
 
        else
825
 
        {
826
 
                $sql_and = '';
827
 
                $sql_and .= ($forum_id) ? ' AND d.forum_id = ' . (int) $forum_id : '';
828
 
                $sql_and .= ($topic_id) ? ' AND d.topic_id = ' . (int) $topic_id : '';
829
 
        }
830
 
 
831
 
        $sql = 'SELECT d.*, f.forum_id, f.forum_name
832
 
                FROM ' . DRAFTS_TABLE . ' d
833
 
                LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = d.forum_id)
834
 
                        WHERE d.user_id = ' . $user->data['user_id'] . "
835
 
                        $sql_and
836
 
                ORDER BY d.save_time DESC";
837
 
        $result = $db->sql_query($sql);
838
 
 
839
 
        while ($row = $db->sql_fetchrow($result))
840
 
        {
841
 
                if ($row['topic_id'])
842
 
                {
843
 
                        $topic_ids[] = (int) $row['topic_id'];
844
 
                }
845
 
                $draft_rows[] = $row;
846
 
        }
847
 
        $db->sql_freeresult($result);
848
 
 
849
 
        if (!sizeof($draft_rows))
850
 
        {
851
 
                return;
852
 
        }
853
 
 
854
 
        $topic_rows = array();
855
 
        if (sizeof($topic_ids))
856
 
        {
857
 
                $sql = 'SELECT topic_id, forum_id, topic_title
858
 
                        FROM ' . TOPICS_TABLE . '
859
 
                        WHERE ' . $db->sql_in_set('topic_id', array_unique($topic_ids));
860
 
                $result = $db->sql_query($sql);
861
 
 
862
 
                while ($row = $db->sql_fetchrow($result))
863
 
                {
864
 
                        $topic_rows[$row['topic_id']] = $row;
865
 
                }
866
 
                $db->sql_freeresult($result);
867
 
        }
868
 
        unset($topic_ids);
869
 
 
870
 
        $template->assign_var('S_SHOW_DRAFTS', true);
871
 
 
872
 
        foreach ($draft_rows as $draft)
873
 
        {
874
 
                $link_topic = $link_forum = $link_pm = false;
875
 
                $insert_url = $view_url = $title = '';
876
 
 
877
 
                if (isset($topic_rows[$draft['topic_id']])
878
 
                        && (
879
 
                                ($topic_rows[$draft['topic_id']]['forum_id'] && $auth->acl_get('f_read', $topic_rows[$draft['topic_id']]['forum_id']))
880
 
                                ||
881
 
                                (!$topic_rows[$draft['topic_id']]['forum_id'] && $auth->acl_getf_global('f_read'))
882
 
                        ))
883
 
                {
884
 
                        $topic_forum_id = ($topic_rows[$draft['topic_id']]['forum_id']) ? $topic_rows[$draft['topic_id']]['forum_id'] : $forum_id;
885
 
 
886
 
                        $link_topic = true;
887
 
                        $view_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $topic_forum_id . '&amp;t=' . $draft['topic_id']);
888
 
                        $title = $topic_rows[$draft['topic_id']]['topic_title'];
889
 
 
890
 
                        $insert_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'f=' . $topic_forum_id . '&amp;t=' . $draft['topic_id'] . '&amp;mode=reply&amp;d=' . $draft['draft_id']);
891
 
                }
892
 
                else if ($draft['forum_id'] && $auth->acl_get('f_read', $draft['forum_id']))
893
 
                {
894
 
                        $link_forum = true;
895
 
                        $view_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $draft['forum_id']);
896
 
                        $title = $draft['forum_name'];
897
 
 
898
 
                        $insert_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'f=' . $draft['forum_id'] . '&amp;mode=post&amp;d=' . $draft['draft_id']);
899
 
                }
900
 
                else
901
 
                {
902
 
                        // Either display as PM draft if forum_id and topic_id are empty or if access to the forums has been denied afterwards...
903
 
                        $link_pm = true;
904
 
                        $insert_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=$id&amp;mode=compose&amp;d={$draft['draft_id']}");
905
 
                }
906
 
 
907
 
                $template->assign_block_vars('draftrow', array(
908
 
                        'DRAFT_ID'              => $draft['draft_id'],
909
 
                        'DATE'                  => $user->format_date($draft['save_time']),
910
 
                        'DRAFT_SUBJECT' => $draft['draft_subject'],
911
 
 
912
 
                        'TITLE'                 => $title,
913
 
                        'U_VIEW'                => $view_url,
914
 
                        'U_INSERT'              => $insert_url,
915
 
 
916
 
                        'S_LINK_PM'             => $link_pm,
917
 
                        'S_LINK_TOPIC'  => $link_topic,
918
 
                        'S_LINK_FORUM'  => $link_forum)
919
 
                );
920
 
        }
921
 
}
922
 
 
923
 
/**
924
 
* Topic Review
925
 
*/
926
 
function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true)
927
 
{
928
 
        global $user, $auth, $db, $template, $bbcode, $cache;
929
 
        global $config, $phpbb_root_path, $phpEx;
930
 
 
931
 
        // Go ahead and pull all data for this topic
932
 
        $sql = 'SELECT p.post_id
933
 
                FROM ' . POSTS_TABLE . ' p' . "
934
 
                WHERE p.topic_id = $topic_id
935
 
                        " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . '
936
 
                        ' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . '
937
 
                ORDER BY p.post_time DESC';
938
 
        $result = $db->sql_query_limit($sql, $config['posts_per_page']);
939
 
 
940
 
        $post_list = array();
941
 
 
942
 
        while ($row = $db->sql_fetchrow($result))
943
 
        {
944
 
                $post_list[] = $row['post_id'];
945
 
        }
946
 
 
947
 
        $db->sql_freeresult($result);
948
 
 
949
 
        if (!sizeof($post_list))
950
 
        {
951
 
                return false;
952
 
        }
953
 
 
954
 
        $sql = $db->sql_build_query('SELECT', array(
955
 
                'SELECT'        => 'u.username, u.user_id, u.user_colour, p.*',
956
 
 
957
 
                'FROM'          => array(
958
 
                        USERS_TABLE             => 'u',
959
 
                        POSTS_TABLE             => 'p',
960
 
                ),
961
 
 
962
 
                'WHERE'         => $db->sql_in_set('p.post_id', $post_list) . '
963
 
                        AND u.user_id = p.poster_id'
964
 
        ));
965
 
 
966
 
        $result = $db->sql_query($sql);
967
 
 
968
 
        $bbcode_bitfield = '';
969
 
        $rowset = array();
970
 
        $has_attachments = false;
971
 
        while ($row = $db->sql_fetchrow($result))
972
 
        {
973
 
                $rowset[$row['post_id']] = $row;
974
 
                $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);
975
 
 
976
 
                if ($row['post_attachment'])
977
 
                {
978
 
                        $has_attachments = true;
979
 
                }
980
 
        }
981
 
        $db->sql_freeresult($result);
982
 
 
983
 
        // Instantiate BBCode class
984
 
        if (!isset($bbcode) && $bbcode_bitfield !== '')
985
 
        {
986
 
                include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
987
 
                $bbcode = new bbcode(base64_encode($bbcode_bitfield));
988
 
        }
989
 
 
990
 
        // Grab extensions
991
 
        $extensions = $attachments = array();
992
 
        if ($has_attachments && $auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
993
 
        {
994
 
                $extensions = $cache->obtain_attach_extensions($forum_id);
995
 
 
996
 
                // Get attachments...
997
 
                $sql = 'SELECT *
998
 
                        FROM ' . ATTACHMENTS_TABLE . '
999
 
                        WHERE ' . $db->sql_in_set('post_msg_id', $post_list) . '
1000
 
                                AND in_message = 0
1001
 
                        ORDER BY filetime DESC, post_msg_id ASC';
1002
 
                $result = $db->sql_query($sql);
1003
 
 
1004
 
                while ($row = $db->sql_fetchrow($result))
1005
 
                {
1006
 
                        $attachments[$row['post_msg_id']][] = $row;
1007
 
                }
1008
 
                $db->sql_freeresult($result);
1009
 
        }
1010
 
 
1011
 
        for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
1012
 
        {
1013
 
                // A non-existing rowset only happens if there was no user present for the entered poster_id
1014
 
                // This could be a broken posts table.
1015
 
                if (!isset($rowset[$post_list[$i]]))
1016
 
                {
1017
 
                        continue;
1018
 
                }
1019
 
 
1020
 
                $row =& $rowset[$post_list[$i]];
1021
 
 
1022
 
                $poster_id              = $row['user_id'];
1023
 
                $post_subject   = $row['post_subject'];
1024
 
                $message                = censor_text($row['post_text']);
1025
 
 
1026
 
                $decoded_message = false;
1027
 
 
1028
 
                if ($show_quote_button && $auth->acl_get('f_reply', $forum_id))
1029
 
                {
1030
 
                        $decoded_message = $message;
1031
 
                        decode_message($decoded_message, $row['bbcode_uid']);
1032
 
 
1033
 
                        $decoded_message = bbcode_nl2br($decoded_message);
1034
 
                }
1035
 
 
1036
 
                if ($row['bbcode_bitfield'])
1037
 
                {
1038
 
                        $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
1039
 
                }
1040
 
 
1041
 
                $message = bbcode_nl2br($message);
1042
 
                $message = smiley_text($message, !$row['enable_smilies']);
1043
 
 
1044
 
                if (!empty($attachments[$row['post_id']]))
1045
 
                {
1046
 
                        $update_count = array();
1047
 
                        parse_attachments($forum_id, $message, $attachments[$row['post_id']], $update_count);
1048
 
                }
1049
 
 
1050
 
                $post_subject = censor_text($post_subject);
1051
 
 
1052
 
                $template->assign_block_vars($mode . '_row', array(
1053
 
                        'POST_AUTHOR_FULL'              => get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1054
 
                        'POST_AUTHOR_COLOUR'    => get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1055
 
                        'POST_AUTHOR'                   => get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1056
 
                        'U_POST_AUTHOR'                 => get_username_string('profile', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1057
 
 
1058
 
                        'S_HAS_ATTACHMENTS'     => (!empty($attachments[$row['post_id']])) ? true : false,
1059
 
 
1060
 
                        'POST_SUBJECT'          => $post_subject,
1061
 
                        'MINI_POST_IMG'         => $user->img('icon_post_target', $user->lang['POST']),
1062
 
                        'POST_DATE'                     => $user->format_date($row['post_time']),
1063
 
                        'MESSAGE'                       => $message,
1064
 
                        'DECODED_MESSAGE'       => $decoded_message,
1065
 
                        'POST_ID'                       => $row['post_id'],
1066
 
                        'U_MINI_POST'           => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],
1067
 
                        'U_MCP_DETAILS'         => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=post_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
1068
 
                        'POSTER_QUOTE'          => ($show_quote_button && $auth->acl_get('f_reply', $forum_id)) ? addslashes(get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '')
1069
 
                );
1070
 
 
1071
 
                // Display not already displayed Attachments for this post, we already parsed them. ;)
1072
 
                if (!empty($attachments[$row['post_id']]))
1073
 
                {
1074
 
                        foreach ($attachments[$row['post_id']] as $attachment)
1075
 
                        {
1076
 
                                $template->assign_block_vars($mode . '_row.attachment', array(
1077
 
                                        'DISPLAY_ATTACHMENT'    => $attachment)
1078
 
                                );
1079
 
                        }
1080
 
                }
1081
 
 
1082
 
                unset($rowset[$i]);
1083
 
        }
1084
 
 
1085
 
        if ($mode == 'topic_review')
1086
 
        {
1087
 
                $template->assign_var('QUOTE_IMG', $user->img('icon_post_quote', $user->lang['REPLY_WITH_QUOTE']));
1088
 
        }
1089
 
 
1090
 
        return true;
1091
 
}
1092
 
 
1093
 
/**
1094
 
* User Notification
1095
 
*/
1096
 
function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id, $topic_id, $post_id)
1097
 
{
1098
 
        global $db, $user, $config, $phpbb_root_path, $phpEx, $auth;
1099
 
 
1100
 
        $topic_notification = ($mode == 'reply' || $mode == 'quote') ? true : false;
1101
 
        $forum_notification = ($mode == 'post') ? true : false;
1102
 
 
1103
 
        if (!$topic_notification && !$forum_notification)
1104
 
        {
1105
 
                trigger_error('WRONG_NOTIFICATION_MODE');
1106
 
        }
1107
 
 
1108
 
        if (!$config['allow_topic_notify'])
1109
 
        {
1110
 
                return;
1111
 
        }
1112
 
 
1113
 
        $topic_title = ($topic_notification) ? $topic_title : $subject;
1114
 
        $topic_title = censor_text($topic_title);
1115
 
 
1116
 
        // Get banned User ID's
1117
 
        $sql = 'SELECT ban_userid
1118
 
                FROM ' . BANLIST_TABLE;
1119
 
        $result = $db->sql_query($sql);
1120
 
 
1121
 
        $sql_ignore_users = ANONYMOUS . ', ' . $user->data['user_id'];
1122
 
        while ($row = $db->sql_fetchrow($result))
1123
 
        {
1124
 
                if (isset($row['ban_userid']))
1125
 
                {
1126
 
                        $sql_ignore_users .= ', ' . $row['ban_userid'];
1127
 
                }
1128
 
        }
1129
 
        $db->sql_freeresult($result);
1130
 
 
1131
 
        $notify_rows = array();
1132
 
 
1133
 
        // -- get forum_userids || topic_userids
1134
 
        $sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber
1135
 
                FROM ' . (($topic_notification) ? TOPICS_WATCH_TABLE : FORUMS_WATCH_TABLE) . ' w, ' . USERS_TABLE . ' u
1136
 
                WHERE w.' . (($topic_notification) ? 'topic_id' : 'forum_id') . ' = ' . (($topic_notification) ? $topic_id : $forum_id) . "
1137
 
                        AND w.user_id NOT IN ($sql_ignore_users)
1138
 
                        AND w.notify_status = 0
1139
 
                        AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')
1140
 
                        AND u.user_id = w.user_id';
1141
 
        $result = $db->sql_query($sql);
1142
 
 
1143
 
        while ($row = $db->sql_fetchrow($result))
1144
 
        {
1145
 
                $notify_rows[$row['user_id']] = array(
1146
 
                        'user_id'               => $row['user_id'],
1147
 
                        'username'              => $row['username'],
1148
 
                        'user_email'    => $row['user_email'],
1149
 
                        'user_jabber'   => $row['user_jabber'],
1150
 
                        'user_lang'             => $row['user_lang'],
1151
 
                        'notify_type'   => ($topic_notification) ? 'topic' : 'forum',
1152
 
                        'template'              => ($topic_notification) ? 'topic_notify' : 'newtopic_notify',
1153
 
                        'method'                => $row['user_notify_type'],
1154
 
                        'allowed'               => false
1155
 
                );
1156
 
        }
1157
 
        $db->sql_freeresult($result);
1158
 
 
1159
 
        // forum notification is sent to those not already receiving topic notifications
1160
 
        if ($topic_notification)
1161
 
        {
1162
 
                if (sizeof($notify_rows))
1163
 
                {
1164
 
                        $sql_ignore_users .= ', ' . implode(', ', array_keys($notify_rows));
1165
 
                }
1166
 
 
1167
 
                $sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber
1168
 
                        FROM ' . FORUMS_WATCH_TABLE . ' fw, ' . USERS_TABLE . " u
1169
 
                        WHERE fw.forum_id = $forum_id
1170
 
                                AND fw.user_id NOT IN ($sql_ignore_users)
1171
 
                                AND fw.notify_status = 0
1172
 
                                AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')
1173
 
                                AND u.user_id = fw.user_id';
1174
 
                $result = $db->sql_query($sql);
1175
 
 
1176
 
                while ($row = $db->sql_fetchrow($result))
1177
 
                {
1178
 
                        $notify_rows[$row['user_id']] = array(
1179
 
                                'user_id'               => $row['user_id'],
1180
 
                                'username'              => $row['username'],
1181
 
                                'user_email'    => $row['user_email'],
1182
 
                                'user_jabber'   => $row['user_jabber'],
1183
 
                                'user_lang'             => $row['user_lang'],
1184
 
                                'notify_type'   => 'forum',
1185
 
                                'template'              => 'forum_notify',
1186
 
                                'method'                => $row['user_notify_type'],
1187
 
                                'allowed'               => false
1188
 
                        );
1189
 
                }
1190
 
                $db->sql_freeresult($result);
1191
 
        }
1192
 
 
1193
 
        if (!sizeof($notify_rows))
1194
 
        {
1195
 
                return;
1196
 
        }
1197
 
 
1198
 
        // Make sure users are allowed to read the forum
1199
 
        foreach ($auth->acl_get_list(array_keys($notify_rows), 'f_read', $forum_id) as $forum_id => $forum_ary)
1200
 
        {
1201
 
                foreach ($forum_ary as $auth_option => $user_ary)
1202
 
                {
1203
 
                        foreach ($user_ary as $user_id)
1204
 
                        {
1205
 
                                $notify_rows[$user_id]['allowed'] = true;
1206
 
                        }
1207
 
                }
1208
 
        }
1209
 
 
1210
 
 
1211
 
        // Now, we have to do a little step before really sending, we need to distinguish our users a little bit. ;)
1212
 
        $msg_users = $delete_ids = $update_notification = array();
1213
 
        foreach ($notify_rows as $user_id => $row)
1214
 
        {
1215
 
                if (!$row['allowed'] || !trim($row['user_email']))
1216
 
                {
1217
 
                        $delete_ids[$row['notify_type']][] = $row['user_id'];
1218
 
                }
1219
 
                else
1220
 
                {
1221
 
                        $msg_users[] = $row;
1222
 
                        $update_notification[$row['notify_type']][] = $row['user_id'];
1223
 
                }
1224
 
        }
1225
 
        unset($notify_rows);
1226
 
 
1227
 
        // Now, we are able to really send out notifications
1228
 
        if (sizeof($msg_users))
1229
 
        {
1230
 
                include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
1231
 
                $messenger = new messenger();
1232
 
 
1233
 
                $msg_list_ary = array();
1234
 
                foreach ($msg_users as $row)
1235
 
                {
1236
 
                        $pos = (!isset($msg_list_ary[$row['template']])) ? 0 : sizeof($msg_list_ary[$row['template']]);
1237
 
 
1238
 
                        $msg_list_ary[$row['template']][$pos]['method'] = $row['method'];
1239
 
                        $msg_list_ary[$row['template']][$pos]['email']  = $row['user_email'];
1240
 
                        $msg_list_ary[$row['template']][$pos]['jabber'] = $row['user_jabber'];
1241
 
                        $msg_list_ary[$row['template']][$pos]['name']   = $row['username'];
1242
 
                        $msg_list_ary[$row['template']][$pos]['lang']   = $row['user_lang'];
1243
 
                }
1244
 
                unset($msg_users);
1245
 
 
1246
 
                foreach ($msg_list_ary as $email_template => $email_list)
1247
 
                {
1248
 
                        foreach ($email_list as $addr)
1249
 
                        {
1250
 
                                $messenger->template($email_template, $addr['lang']);
1251
 
 
1252
 
                                $messenger->to($addr['email'], $addr['name']);
1253
 
                                $messenger->im($addr['jabber'], $addr['name']);
1254
 
 
1255
 
                                $messenger->assign_vars(array(
1256
 
                                        'USERNAME'              => htmlspecialchars_decode($addr['name']),
1257
 
                                        'TOPIC_TITLE'   => htmlspecialchars_decode($topic_title),
1258
 
                                        'FORUM_NAME'    => htmlspecialchars_decode($forum_name),
1259
 
 
1260
 
                                        'U_FORUM'                               => generate_board_url() . "/viewforum.$phpEx?f=$forum_id",
1261
 
                                        'U_TOPIC'                               => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id",
1262
 
                                        'U_NEWEST_POST'                 => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id&p=$post_id&e=$post_id",
1263
 
                                        'U_STOP_WATCHING_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id&unwatch=topic",
1264
 
                                        'U_STOP_WATCHING_FORUM' => generate_board_url() . "/viewforum.$phpEx?f=$forum_id&unwatch=forum",
1265
 
                                ));
1266
 
 
1267
 
                                $messenger->send($addr['method']);
1268
 
                        }
1269
 
                }
1270
 
                unset($msg_list_ary);
1271
 
 
1272
 
                $messenger->save_queue();
1273
 
        }
1274
 
 
1275
 
        // Handle the DB updates
1276
 
        $db->sql_transaction('begin');
1277
 
 
1278
 
        if (!empty($update_notification['topic']))
1279
 
        {
1280
 
                $sql = 'UPDATE ' . TOPICS_WATCH_TABLE . "
1281
 
                        SET notify_status = 1
1282
 
                        WHERE topic_id = $topic_id
1283
 
                                AND " . $db->sql_in_set('user_id', $update_notification['topic']);
1284
 
                $db->sql_query($sql);
1285
 
        }
1286
 
 
1287
 
        if (!empty($update_notification['forum']))
1288
 
        {
1289
 
                $sql = 'UPDATE ' . FORUMS_WATCH_TABLE . "
1290
 
                        SET notify_status = 1
1291
 
                        WHERE forum_id = $forum_id
1292
 
                                AND " . $db->sql_in_set('user_id', $update_notification['forum']);
1293
 
                $db->sql_query($sql);
1294
 
        }
1295
 
 
1296
 
        // Now delete the user_ids not authorised to receive notifications on this topic/forum
1297
 
        if (!empty($delete_ids['topic']))
1298
 
        {
1299
 
                $sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . "
1300
 
                        WHERE topic_id = $topic_id
1301
 
                                AND " . $db->sql_in_set('user_id', $delete_ids['topic']);
1302
 
                $db->sql_query($sql);
1303
 
        }
1304
 
 
1305
 
        if (!empty($delete_ids['forum']))
1306
 
        {
1307
 
                $sql = 'DELETE FROM ' . FORUMS_WATCH_TABLE . "
1308
 
                        WHERE forum_id = $forum_id
1309
 
                                AND " . $db->sql_in_set('user_id', $delete_ids['forum']);
1310
 
                $db->sql_query($sql);
1311
 
        }
1312
 
 
1313
 
        $db->sql_transaction('commit');
1314
 
}
1315
 
 
1316
 
//
1317
 
// Post handling functions
1318
 
//
1319
 
 
1320
 
/**
1321
 
* Delete Post
1322
 
*/
1323
 
function delete_post($forum_id, $topic_id, $post_id, &$data)
1324
 
{
1325
 
        global $db, $user, $auth;
1326
 
        global $config, $phpEx, $phpbb_root_path;
1327
 
 
1328
 
        // Specify our post mode
1329
 
        $post_mode = ($data['topic_first_post_id'] == $data['topic_last_post_id']) ? 'delete_topic' : (($data['topic_first_post_id'] == $post_id) ? 'delete_first_post' : (($data['topic_last_post_id'] == $post_id) ? 'delete_last_post' : 'delete'));
1330
 
        $sql_data = array();
1331
 
        $next_post_id = 0;
1332
 
 
1333
 
        include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
1334
 
 
1335
 
        $db->sql_transaction('begin');
1336
 
 
1337
 
        // we must make sure to update forums that contain the shadow'd topic
1338
 
        if ($post_mode == 'delete_topic')
1339
 
        {
1340
 
                $shadow_forum_ids = array();
1341
 
 
1342
 
                $sql = 'SELECT forum_id
1343
 
                        FROM ' . TOPICS_TABLE . '
1344
 
                        WHERE ' . $db->sql_in_set('topic_moved_id', $topic_id);
1345
 
                $result = $db->sql_query($sql);
1346
 
                while ($row = $db->sql_fetchrow($result))
1347
 
                {
1348
 
                        if (!isset($shadow_forum_ids[(int) $row['forum_id']]))
1349
 
                        {
1350
 
                                $shadow_forum_ids[(int) $row['forum_id']] = 1;
1351
 
                        }
1352
 
                        else
1353
 
                        {
1354
 
                                $shadow_forum_ids[(int) $row['forum_id']]++;
1355
 
                        }
1356
 
                }
1357
 
                $db->sql_freeresult($result);
1358
 
        }
1359
 
 
1360
 
        if (!delete_posts('post_id', array($post_id), false, false))
1361
 
        {
1362
 
                // Try to delete topic, we may had an previous error causing inconsistency
1363
 
                if ($post_mode == 'delete_topic')
1364
 
                {
1365
 
                        delete_topics('topic_id', array($topic_id), false);
1366
 
                }
1367
 
                trigger_error('ALREADY_DELETED');
1368
 
        }
1369
 
 
1370
 
        $db->sql_transaction('commit');
1371
 
 
1372
 
        // Collect the necessary information for updating the tables
1373
 
        $sql_data[FORUMS_TABLE] = '';
1374
 
        switch ($post_mode)
1375
 
        {
1376
 
                case 'delete_topic':
1377
 
 
1378
 
                        foreach ($shadow_forum_ids as $updated_forum => $topic_count)
1379
 
                        {
1380
 
                                // counting is fun! we only have to do sizeof($forum_ids) number of queries,
1381
 
                                // even if the topic is moved back to where its shadow lives (we count how many times it is in a forum)
1382
 
                                $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET forum_topics_real = forum_topics_real - ' . $topic_count . ', forum_topics = forum_topics - ' . $topic_count . ' WHERE forum_id = ' . $updated_forum);
1383
 
                                update_post_information('forum', $updated_forum);
1384
 
                        }
1385
 
 
1386
 
                        delete_topics('topic_id', array($topic_id), false);
1387
 
 
1388
 
                        if ($data['topic_type'] != POST_GLOBAL)
1389
 
                        {
1390
 
                                $sql_data[FORUMS_TABLE] .= 'forum_topics_real = forum_topics_real - 1';
1391
 
                                $sql_data[FORUMS_TABLE] .= ($data['topic_approved']) ? ', forum_posts = forum_posts - 1, forum_topics = forum_topics - 1' : '';
1392
 
                        }
1393
 
 
1394
 
                        $update_sql = update_post_information('forum', $forum_id, true);
1395
 
                        if (sizeof($update_sql))
1396
 
                        {
1397
 
                                $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
1398
 
                                $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
1399
 
                        }
1400
 
                break;
1401
 
 
1402
 
                case 'delete_first_post':
1403
 
                        $sql = 'SELECT p.post_id, p.poster_id, p.post_username, u.username, u.user_colour
1404
 
                                FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u
1405
 
                                WHERE p.topic_id = $topic_id
1406
 
                                        AND p.poster_id = u.user_id
1407
 
                                ORDER BY p.post_time ASC";
1408
 
                        $result = $db->sql_query_limit($sql, 1);
1409
 
                        $row = $db->sql_fetchrow($result);
1410
 
                        $db->sql_freeresult($result);
1411
 
 
1412
 
                        if ($data['topic_type'] != POST_GLOBAL)
1413
 
                        {
1414
 
                                $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
1415
 
                        }
1416
 
 
1417
 
                        $sql_data[TOPICS_TABLE] = 'topic_first_post_id = ' . intval($row['post_id']) . ", topic_first_poster_colour = '" . $db->sql_escape($row['user_colour']) . "', topic_first_poster_name = '" . (($row['poster_id'] == ANONYMOUS) ? $db->sql_escape($row['post_username']) : $db->sql_escape($row['username'])) . "'";
1418
 
 
1419
 
                        // Decrementing topic_replies here is fine because this case only happens if there is more than one post within the topic - basically removing one "reply"
1420
 
                        $sql_data[TOPICS_TABLE] .= ', topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
1421
 
 
1422
 
                        $next_post_id = (int) $row['post_id'];
1423
 
                break;
1424
 
 
1425
 
                case 'delete_last_post':
1426
 
                        if ($data['topic_type'] != POST_GLOBAL)
1427
 
                        {
1428
 
                                $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
1429
 
                        }
1430
 
 
1431
 
                        $update_sql = update_post_information('forum', $forum_id, true);
1432
 
                        if (sizeof($update_sql))
1433
 
                        {
1434
 
                                $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
1435
 
                                $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
1436
 
                        }
1437
 
 
1438
 
                        $sql_data[TOPICS_TABLE] = 'topic_bumped = 0, topic_bumper = 0, topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
1439
 
 
1440
 
                        $update_sql = update_post_information('topic', $topic_id, true);
1441
 
                        if (sizeof($update_sql))
1442
 
                        {
1443
 
                                $sql_data[TOPICS_TABLE] .= ', ' . implode(', ', $update_sql[$topic_id]);
1444
 
                                $next_post_id = (int) str_replace('topic_last_post_id = ', '', $update_sql[$topic_id][0]);
1445
 
                        }
1446
 
                        else
1447
 
                        {
1448
 
                                $sql = 'SELECT MAX(post_id) as last_post_id
1449
 
                                        FROM ' . POSTS_TABLE . "
1450
 
                                        WHERE topic_id = $topic_id " .
1451
 
                                                ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND post_approved = 1' : '');
1452
 
                                $result = $db->sql_query($sql);
1453
 
                                $row = $db->sql_fetchrow($result);
1454
 
                                $db->sql_freeresult($result);
1455
 
 
1456
 
                                $next_post_id = (int) $row['last_post_id'];
1457
 
                        }
1458
 
                break;
1459
 
 
1460
 
                case 'delete':
1461
 
                        $sql = 'SELECT post_id
1462
 
                                FROM ' . POSTS_TABLE . "
1463
 
                                WHERE topic_id = $topic_id " .
1464
 
                                        ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND post_approved = 1' : '') . '
1465
 
                                        AND post_time > ' . $data['post_time'] . '
1466
 
                                ORDER BY post_time ASC';
1467
 
                        $result = $db->sql_query_limit($sql, 1);
1468
 
                        $row = $db->sql_fetchrow($result);
1469
 
                        $db->sql_freeresult($result);
1470
 
 
1471
 
                        if ($data['topic_type'] != POST_GLOBAL)
1472
 
                        {
1473
 
                                $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
1474
 
                        }
1475
 
 
1476
 
                        $sql_data[TOPICS_TABLE] = 'topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
1477
 
                        $next_post_id = (int) $row['post_id'];
1478
 
                break;
1479
 
        }
1480
 
 
1481
 
//      $sql_data[USERS_TABLE] = ($data['post_postcount']) ? 'user_posts = user_posts - 1' : '';
1482
 
 
1483
 
        $db->sql_transaction('begin');
1484
 
 
1485
 
        $where_sql = array(
1486
 
                FORUMS_TABLE    => "forum_id = $forum_id",
1487
 
                TOPICS_TABLE    => "topic_id = $topic_id",
1488
 
                USERS_TABLE             => 'user_id = ' . $data['poster_id']
1489
 
        );
1490
 
 
1491
 
        foreach ($sql_data as $table => $update_sql)
1492
 
        {
1493
 
                if ($update_sql)
1494
 
                {
1495
 
                        $db->sql_query("UPDATE $table SET $update_sql WHERE " . $where_sql[$table]);
1496
 
                }
1497
 
        }
1498
 
 
1499
 
        // Adjust posted info for this user by looking for a post by him/her within this topic...
1500
 
        if ($post_mode != 'delete_topic' && $config['load_db_track'] && $data['poster_id'] != ANONYMOUS)
1501
 
        {
1502
 
                $sql = 'SELECT poster_id
1503
 
                        FROM ' . POSTS_TABLE . '
1504
 
                        WHERE topic_id = ' . $topic_id . '
1505
 
                                AND poster_id = ' . $data['poster_id'];
1506
 
                $result = $db->sql_query_limit($sql, 1);
1507
 
                $poster_id = (int) $db->sql_fetchfield('poster_id');
1508
 
                $db->sql_freeresult($result);
1509
 
 
1510
 
                // The user is not having any more posts within this topic
1511
 
                if (!$poster_id)
1512
 
                {
1513
 
                        $sql = 'DELETE FROM ' . TOPICS_POSTED_TABLE . '
1514
 
                                WHERE topic_id = ' . $topic_id . '
1515
 
                                        AND user_id = ' . $data['poster_id'];
1516
 
                        $db->sql_query($sql);
1517
 
                }
1518
 
        }
1519
 
 
1520
 
        $db->sql_transaction('commit');
1521
 
 
1522
 
        if ($data['post_reported'] && ($post_mode != 'delete_topic'))
1523
 
        {
1524
 
                sync('topic_reported', 'topic_id', array($topic_id));
1525
 
        }
1526
 
 
1527
 
        return $next_post_id;
1528
 
}
1529
 
 
1530
 
/**
1531
 
* Submit Post
1532
 
*/
1533
 
function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true)
1534
 
{
1535
 
        global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path;
1536
 
 
1537
 
        // We do not handle erasing posts here
1538
 
        if ($mode == 'delete')
1539
 
        {
1540
 
                return false;
1541
 
        }
1542
 
 
1543
 
        $current_time = time();
1544
 
 
1545
 
        if ($mode == 'post')
1546
 
        {
1547
 
                $post_mode = 'post';
1548
 
                $update_message = true;
1549
 
        }
1550
 
        else if ($mode != 'edit')
1551
 
        {
1552
 
                $post_mode = 'reply';
1553
 
                $update_message = true;
1554
 
        }
1555
 
        else if ($mode == 'edit')
1556
 
        {
1557
 
                $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
1558
 
        }
1559
 
 
1560
 
        // First of all make sure the subject and topic title are having the correct length.
1561
 
        // To achieve this without cutting off between special chars we convert to an array and then count the elements.
1562
 
        $subject = truncate_string($subject);
1563
 
        $data['topic_title'] = truncate_string($data['topic_title']);
1564
 
 
1565
 
        // Collect some basic information about which tables and which rows to update/insert
1566
 
        $sql_data = $topic_row = array();
1567
 
        $poster_id = ($mode == 'edit') ? $data['poster_id'] : (int) $user->data['user_id'];
1568
 
 
1569
 
        // Retrieve some additional information if not present
1570
 
        if ($mode == 'edit' && (!isset($data['post_approved']) || !isset($data['topic_approved']) || $data['post_approved'] === false || $data['topic_approved'] === false))
1571
 
        {
1572
 
                $sql = 'SELECT p.post_approved, t.topic_type, t.topic_replies, t.topic_replies_real, t.topic_approved
1573
 
                        FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
1574
 
                        WHERE t.topic_id = p.topic_id
1575
 
                                AND p.post_id = ' . $data['post_id'];
1576
 
                $result = $db->sql_query($sql);
1577
 
                $topic_row = $db->sql_fetchrow($result);
1578
 
                $db->sql_freeresult($result);
1579
 
 
1580
 
                $data['topic_approved'] = $topic_row['topic_approved'];
1581
 
                $data['post_approved'] = $topic_row['post_approved'];
1582
 
        }
1583
 
 
1584
 
        // Start the transaction here
1585
 
        $db->sql_transaction('begin');
1586
 
 
1587
 
 
1588
 
        // Collect Information
1589
 
        switch ($post_mode)
1590
 
        {
1591
 
                case 'post':
1592
 
                case 'reply':
1593
 
                        $sql_data[POSTS_TABLE]['sql'] = array(
1594
 
                                'forum_id'                      => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
1595
 
                                'poster_id'                     => (int) $user->data['user_id'],
1596
 
                                'icon_id'                       => $data['icon_id'],
1597
 
                                'poster_ip'                     => $user->ip,
1598
 
                                'post_time'                     => $current_time,
1599
 
                                'post_approved'         => (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : 1,
1600
 
                                'enable_bbcode'         => $data['enable_bbcode'],
1601
 
                                'enable_smilies'        => $data['enable_smilies'],
1602
 
                                'enable_magic_url'      => $data['enable_urls'],
1603
 
                                'enable_sig'            => $data['enable_sig'],
1604
 
                                'post_username'         => (!$user->data['is_registered']) ? $username : '',
1605
 
                                'post_subject'          => $subject,
1606
 
                                'post_text'                     => $data['message'],
1607
 
                                'post_checksum'         => $data['message_md5'],
1608
 
                                'post_attachment'       => (!empty($data['attachment_data'])) ? 1 : 0,
1609
 
                                'bbcode_bitfield'       => $data['bbcode_bitfield'],
1610
 
                                'bbcode_uid'            => $data['bbcode_uid'],
1611
 
                                'post_postcount'        => ($auth->acl_get('f_postcount', $data['forum_id'])) ? 1 : 0,
1612
 
                                'post_edit_locked'      => $data['post_edit_locked']
1613
 
                        );
1614
 
                break;
1615
 
 
1616
 
                case 'edit_first_post':
1617
 
                case 'edit':
1618
 
 
1619
 
                case 'edit_last_post':
1620
 
                case 'edit_topic':
1621
 
 
1622
 
                        // If edit reason is given always display edit info
1623
 
 
1624
 
                        // If editing last post then display no edit info
1625
 
                        // If m_edit permission then display no edit info
1626
 
                        // If normal edit display edit info
1627
 
 
1628
 
                        // Display edit info if edit reason given or user is editing his post, which is not the last within the topic.
1629
 
                        if ($data['post_edit_reason'] || (!$auth->acl_get('m_edit', $data['forum_id']) && ($post_mode == 'edit' || $post_mode == 'edit_first_post')))
1630
 
                        {
1631
 
                                $data['post_edit_reason']               = truncate_string($data['post_edit_reason'], 255, false);
1632
 
 
1633
 
                                $sql_data[POSTS_TABLE]['sql']   = array(
1634
 
                                        'post_edit_time'        => $current_time,
1635
 
                                        'post_edit_reason'      => $data['post_edit_reason'],
1636
 
                                        'post_edit_user'        => (int) $data['post_edit_user'],
1637
 
                                );
1638
 
 
1639
 
                                $sql_data[POSTS_TABLE]['stat'][] = 'post_edit_count = post_edit_count + 1';
1640
 
                        }
1641
 
                        else if (!$data['post_edit_reason'] && $mode == 'edit' && $auth->acl_get('m_edit', $data['forum_id']))
1642
 
                        {
1643
 
                                $sql_data[POSTS_TABLE]['sql'] = array(
1644
 
                                        'post_edit_reason'      => '',
1645
 
                                );
1646
 
                        }
1647
 
 
1648
 
                        // If the person editing this post is different to the one having posted then we will add a log entry stating the edit
1649
 
                        // Could be simplified by only adding to the log if the edit is not tracked - but this may confuse admins/mods
1650
 
                        if ($user->data['user_id'] != $poster_id)
1651
 
                        {
1652
 
                                $log_subject = ($subject) ? $subject : $data['topic_title'];
1653
 
                                add_log('mod', $data['forum_id'], $data['topic_id'], 'LOG_POST_EDITED', $log_subject, (!empty($username)) ? $username : $user->lang['GUEST']);
1654
 
                        }
1655
 
 
1656
 
                        if (!isset($sql_data[POSTS_TABLE]['sql']))
1657
 
                        {
1658
 
                                $sql_data[POSTS_TABLE]['sql'] = array();
1659
 
                        }
1660
 
 
1661
 
                        $sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
1662
 
                                'forum_id'                      => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
1663
 
                                'poster_id'                     => $data['poster_id'],
1664
 
                                'icon_id'                       => $data['icon_id'],
1665
 
                                'post_approved'         => (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : $data['post_approved'],
1666
 
                                'enable_bbcode'         => $data['enable_bbcode'],
1667
 
                                'enable_smilies'        => $data['enable_smilies'],
1668
 
                                'enable_magic_url'      => $data['enable_urls'],
1669
 
                                'enable_sig'            => $data['enable_sig'],
1670
 
                                'post_username'         => ($username && $data['poster_id'] == ANONYMOUS) ? $username : '',
1671
 
                                'post_subject'          => $subject,
1672
 
                                'post_checksum'         => $data['message_md5'],
1673
 
                                'post_attachment'       => (!empty($data['attachment_data'])) ? 1 : 0,
1674
 
                                'bbcode_bitfield'       => $data['bbcode_bitfield'],
1675
 
                                'bbcode_uid'            => $data['bbcode_uid'],
1676
 
                                'post_edit_locked'      => $data['post_edit_locked'])
1677
 
                        );
1678
 
 
1679
 
                        if ($update_message)
1680
 
                        {
1681
 
                                $sql_data[POSTS_TABLE]['sql']['post_text'] = $data['message'];
1682
 
                        }
1683
 
 
1684
 
                break;
1685
 
        }
1686
 
 
1687
 
        $post_approved = $sql_data[POSTS_TABLE]['sql']['post_approved'];
1688
 
        $topic_row = array();
1689
 
 
1690
 
        // And the topic ladies and gentlemen
1691
 
        switch ($post_mode)
1692
 
        {
1693
 
                case 'post':
1694
 
                        $sql_data[TOPICS_TABLE]['sql'] = array(
1695
 
                                'topic_poster'                          => (int) $user->data['user_id'],
1696
 
                                'topic_time'                            => $current_time,
1697
 
                                'forum_id'                                      => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
1698
 
                                'icon_id'                                       => $data['icon_id'],
1699
 
                                'topic_approved'                        => (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : 1,
1700
 
                                'topic_title'                           => $subject,
1701
 
                                'topic_first_poster_name'       => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
1702
 
                                'topic_first_poster_colour'     => $user->data['user_colour'],
1703
 
                                'topic_type'                            => $topic_type,
1704
 
                                'topic_time_limit'                      => ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0,
1705
 
                                'topic_attachment'                      => (!empty($data['attachment_data'])) ? 1 : 0,
1706
 
                        );
1707
 
 
1708
 
                        if (isset($poll['poll_options']) && !empty($poll['poll_options']))
1709
 
                        {
1710
 
                                $sql_data[TOPICS_TABLE]['sql'] = array_merge($sql_data[TOPICS_TABLE]['sql'], array(
1711
 
                                        'poll_title'            => $poll['poll_title'],
1712
 
                                        'poll_start'            => ($poll['poll_start']) ? $poll['poll_start'] : $current_time,
1713
 
                                        'poll_max_options'      => $poll['poll_max_options'],
1714
 
                                        'poll_length'           => ($poll['poll_length'] * 86400),
1715
 
                                        'poll_vote_change'      => $poll['poll_vote_change'])
1716
 
                                );
1717
 
                        }
1718
 
 
1719
 
                        $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id'])) ? ', user_posts = user_posts + 1' : '');
1720
 
        
1721
 
                        if ($topic_type != POST_GLOBAL)
1722
 
                        {
1723
 
                                if ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id']))
1724
 
                                {
1725
 
                                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + 1';
1726
 
                                }
1727
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real + 1' . (($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? ', forum_topics = forum_topics + 1' : '');
1728
 
                        }
1729
 
                break;
1730
 
 
1731
 
                case 'reply':
1732
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_replies_real = topic_replies_real + 1, topic_bumped = 0, topic_bumper = 0' . (($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? ', topic_replies = topic_replies + 1' : '') . ((!empty($data['attachment_data']) || (isset($data['topic_attachment']) && $data['topic_attachment'])) ? ', topic_attachment = 1' : '');
1733
 
 
1734
 
                        $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id'])) ? ', user_posts = user_posts + 1' : '');
1735
 
 
1736
 
                        if (($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) && $topic_type != POST_GLOBAL)
1737
 
                        {
1738
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + 1';
1739
 
                        }
1740
 
                break;
1741
 
 
1742
 
                case 'edit_topic':
1743
 
                case 'edit_first_post':
1744
 
 
1745
 
                        $sql_data[TOPICS_TABLE]['sql'] = array(
1746
 
                                'forum_id'                                      => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
1747
 
                                'icon_id'                                       => $data['icon_id'],
1748
 
                                'topic_approved'                        => (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : $data['topic_approved'],
1749
 
                                'topic_title'                           => $subject,
1750
 
                                'topic_first_poster_name'       => $username,
1751
 
                                'topic_type'                            => $topic_type,
1752
 
                                'topic_time_limit'                      => ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0,
1753
 
                                'poll_title'                            => (isset($poll['poll_options'])) ? $poll['poll_title'] : '',
1754
 
                                'poll_start'                            => (isset($poll['poll_options'])) ? (($poll['poll_start']) ? $poll['poll_start'] : $current_time) : 0,
1755
 
                                'poll_max_options'                      => (isset($poll['poll_options'])) ? $poll['poll_max_options'] : 1,
1756
 
                                'poll_length'                           => (isset($poll['poll_options'])) ? ($poll['poll_length'] * 86400) : 0,
1757
 
                                'poll_vote_change'                      => (isset($poll['poll_vote_change'])) ? $poll['poll_vote_change'] : 0,
1758
 
 
1759
 
                                'topic_attachment'                      => (!empty($data['attachment_data'])) ? 1 : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0),
1760
 
                        );
1761
 
 
1762
 
                        // Correctly set back the topic replies and forum posts... only if the topic was approved before and now gets disapproved
1763
 
                        if (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id']) && $data['topic_approved'])
1764
 
                        {
1765
 
                                // Do we need to grab some topic informations?
1766
 
                                if (!sizeof($topic_row))
1767
 
                                {
1768
 
                                        $sql = 'SELECT topic_type, topic_replies, topic_replies_real, topic_approved
1769
 
                                                FROM ' . TOPICS_TABLE . '
1770
 
                                                WHERE topic_id = ' . $data['topic_id'];
1771
 
                                        $result = $db->sql_query($sql);
1772
 
                                        $topic_row = $db->sql_fetchrow($result);
1773
 
                                        $db->sql_freeresult($result);
1774
 
                                }
1775
 
 
1776
 
                                // If this is the only post remaining we do not need to decrement topic_replies.
1777
 
                                // Also do not decrement if first post - then the topic_replies will not be adjusted if approving the topic again.
1778
 
 
1779
 
                                // If this is an edited topic or the first post the topic gets completely disapproved later on...
1780
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics = forum_topics - 1';
1781
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - ' . ($topic_row['topic_replies'] + 1);
1782
 
 
1783
 
                                set_config('num_topics', $config['num_topics'] - 1, true);
1784
 
                                set_config('num_posts', $config['num_posts'] - ($topic_row['topic_replies'] + 1), true);
1785
 
                        }
1786
 
 
1787
 
                break;
1788
 
 
1789
 
                case 'edit':
1790
 
                case 'edit_last_post':
1791
 
 
1792
 
                        // Correctly set back the topic replies and forum posts... but only if the post was approved before.
1793
 
                        if (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id']) && $data['post_approved'])
1794
 
                        {
1795
 
                                $sql_data[TOPICS_TABLE]['stat'][] = 'topic_replies = topic_replies - 1';
1796
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - 1';
1797
 
 
1798
 
                                set_config('num_posts', $config['num_posts'] - 1, true);
1799
 
                        }
1800
 
 
1801
 
                break;
1802
 
        }
1803
 
 
1804
 
        // Submit new topic
1805
 
        if ($post_mode == 'post')
1806
 
        {
1807
 
                $sql = 'INSERT INTO ' . TOPICS_TABLE . ' ' .
1808
 
                        $db->sql_build_array('INSERT', $sql_data[TOPICS_TABLE]['sql']);
1809
 
                $db->sql_query($sql);
1810
 
 
1811
 
                $data['topic_id'] = $db->sql_nextid();
1812
 
 
1813
 
                $sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
1814
 
                        'topic_id' => $data['topic_id'])
1815
 
                );
1816
 
                unset($sql_data[TOPICS_TABLE]['sql']);
1817
 
        }
1818
 
 
1819
 
        // Submit new post
1820
 
        if ($post_mode == 'post' || $post_mode == 'reply')
1821
 
        {
1822
 
                if ($post_mode == 'reply')
1823
 
                {
1824
 
                        $sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
1825
 
                                'topic_id' => $data['topic_id'])
1826
 
                        );
1827
 
                }
1828
 
 
1829
 
                $sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);
1830
 
                $db->sql_query($sql);
1831
 
                $data['post_id'] = $db->sql_nextid();
1832
 
 
1833
 
                if ($post_mode == 'post')
1834
 
                {
1835
 
                        $sql_data[TOPICS_TABLE]['sql'] = array(
1836
 
                                'topic_first_post_id'           => $data['post_id'],
1837
 
                                'topic_last_post_id'            => $data['post_id'],
1838
 
                                'topic_last_post_time'          => $current_time,
1839
 
                                'topic_last_poster_id'          => (int) $user->data['user_id'],
1840
 
                                'topic_last_poster_name'        => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
1841
 
                                'topic_last_poster_colour'      => $user->data['user_colour'],
1842
 
                        );
1843
 
                }
1844
 
 
1845
 
                unset($sql_data[POSTS_TABLE]['sql']);
1846
 
        }
1847
 
 
1848
 
        $make_global = false;
1849
 
 
1850
 
        // Are we globalising or unglobalising?
1851
 
        if ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic')
1852
 
        {
1853
 
                if (!sizeof($topic_row))
1854
 
                {
1855
 
                        $sql = 'SELECT topic_type, topic_replies, topic_replies_real, topic_approved, topic_last_post_id
1856
 
                                FROM ' . TOPICS_TABLE . '
1857
 
                                WHERE topic_id = ' . $data['topic_id'];
1858
 
                        $result = $db->sql_query($sql);
1859
 
                        $topic_row = $db->sql_fetchrow($result);
1860
 
                        $db->sql_freeresult($result);
1861
 
                }
1862
 
 
1863
 
                // globalise/unglobalise?
1864
 
                if (($topic_row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL) || ($topic_row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL))
1865
 
                {
1866
 
                        if (!empty($sql_data[FORUMS_TABLE]['stat']) && implode('', $sql_data[FORUMS_TABLE]['stat']))
1867
 
                        {
1868
 
                                $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET ' . implode(', ', $sql_data[FORUMS_TABLE]['stat']) . ' WHERE forum_id = ' . $data['forum_id']);
1869
 
                        }
1870
 
 
1871
 
                        $make_global = true;
1872
 
                        $sql_data[FORUMS_TABLE]['stat'] = array();
1873
 
                }
1874
 
 
1875
 
                // globalise
1876
 
                if ($topic_row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL)
1877
 
                {
1878
 
                        // Decrement topic/post count
1879
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - ' . ($topic_row['topic_replies_real'] + 1);
1880
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real - 1' . (($topic_row['topic_approved']) ? ', forum_topics = forum_topics - 1' : '');
1881
 
 
1882
 
                        // Update forum_ids for all posts
1883
 
                        $sql = 'UPDATE ' . POSTS_TABLE . '
1884
 
                                SET forum_id = 0
1885
 
                                WHERE topic_id = ' . $data['topic_id'];
1886
 
                        $db->sql_query($sql);
1887
 
                }
1888
 
                // unglobalise
1889
 
                else if ($topic_row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL)
1890
 
                {
1891
 
                        // Increment topic/post count
1892
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + ' . ($topic_row['topic_replies_real'] + 1);
1893
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real + 1' . (($topic_row['topic_approved']) ? ', forum_topics = forum_topics + 1' : '');
1894
 
 
1895
 
                        // Update forum_ids for all posts
1896
 
                        $sql = 'UPDATE ' . POSTS_TABLE . '
1897
 
                                SET forum_id = ' . $data['forum_id'] . '
1898
 
                                WHERE topic_id = ' . $data['topic_id'];
1899
 
                        $db->sql_query($sql);
1900
 
                }
1901
 
        }
1902
 
 
1903
 
        // Update the topics table
1904
 
        if (isset($sql_data[TOPICS_TABLE]['sql']))
1905
 
        {
1906
 
                $sql = 'UPDATE ' . TOPICS_TABLE . '
1907
 
                        SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . '
1908
 
                        WHERE topic_id = ' . $data['topic_id'];
1909
 
                $db->sql_query($sql);
1910
 
        }
1911
 
 
1912
 
        // Update the posts table
1913
 
        if (isset($sql_data[POSTS_TABLE]['sql']))
1914
 
        {
1915
 
                $sql = 'UPDATE ' . POSTS_TABLE . '
1916
 
                        SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . '
1917
 
                        WHERE post_id = ' . $data['post_id'];
1918
 
                $db->sql_query($sql);
1919
 
        }
1920
 
 
1921
 
        // Update Poll Tables
1922
 
        if (isset($poll['poll_options']) && !empty($poll['poll_options']))
1923
 
        {
1924
 
                $cur_poll_options = array();
1925
 
 
1926
 
                if ($poll['poll_start'] && $mode == 'edit')
1927
 
                {
1928
 
                        $sql = 'SELECT *
1929
 
                                FROM ' . POLL_OPTIONS_TABLE . '
1930
 
                                WHERE topic_id = ' . $data['topic_id'] . '
1931
 
                                ORDER BY poll_option_id';
1932
 
                        $result = $db->sql_query($sql);
1933
 
 
1934
 
                        $cur_poll_options = array();
1935
 
                        while ($row = $db->sql_fetchrow($result))
1936
 
                        {
1937
 
                                $cur_poll_options[] = $row;
1938
 
                        }
1939
 
                        $db->sql_freeresult($result);
1940
 
                }
1941
 
 
1942
 
                $sql_insert_ary = array();
1943
 
                
1944
 
                for ($i = 0, $size = sizeof($poll['poll_options']); $i < $size; $i++)
1945
 
                {
1946
 
                        if (strlen(trim($poll['poll_options'][$i])))
1947
 
                        {
1948
 
                                if (empty($cur_poll_options[$i]))
1949
 
                                {
1950
 
                                        // If we add options we need to put them to the end to be able to preserve votes...
1951
 
                                        $sql_insert_ary[] = array(
1952
 
                                                'poll_option_id'        => (int) sizeof($cur_poll_options) + 1 + sizeof($sql_insert_ary),
1953
 
                                                'topic_id'                      => (int) $data['topic_id'],
1954
 
                                                'poll_option_text'      => (string) $poll['poll_options'][$i]
1955
 
                                        );
1956
 
                                }
1957
 
                                else if ($poll['poll_options'][$i] != $cur_poll_options[$i])
1958
 
                                {
1959
 
                                        $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . "
1960
 
                                                SET poll_option_text = '" . $db->sql_escape($poll['poll_options'][$i]) . "'
1961
 
                                                WHERE poll_option_id = " . $cur_poll_options[$i]['poll_option_id'] . '
1962
 
                                                        AND topic_id = ' . $data['topic_id'];
1963
 
                                        $db->sql_query($sql);
1964
 
                                }
1965
 
                        }
1966
 
                }
1967
 
 
1968
 
                $db->sql_multi_insert(POLL_OPTIONS_TABLE, $sql_insert_ary);
1969
 
 
1970
 
                if (sizeof($poll['poll_options']) < sizeof($cur_poll_options))
1971
 
                {
1972
 
                        $sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . '
1973
 
                                WHERE poll_option_id > ' . sizeof($poll['poll_options']) . '
1974
 
                                        AND topic_id = ' . $data['topic_id'];
1975
 
                        $db->sql_query($sql);
1976
 
                }
1977
 
 
1978
 
                // If edited, we would need to reset votes (since options can be re-ordered above, you can't be sure if the change is for changing the text or adding an option
1979
 
                if ($mode == 'edit' && sizeof($poll['poll_options']) != sizeof($cur_poll_options))
1980
 
                {
1981
 
                        $db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data['topic_id']);
1982
 
                        $db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data['topic_id']);
1983
 
                }
1984
 
        }
1985
 
 
1986
 
        // Submit Attachments
1987
 
        if (!empty($data['attachment_data']) && $data['post_id'] && in_array($mode, array('post', 'reply', 'quote', 'edit')))
1988
 
        {
1989
 
                $space_taken = $files_added = 0;
1990
 
                $orphan_rows = array();
1991
 
 
1992
 
                foreach ($data['attachment_data'] as $pos => $attach_row)
1993
 
                {
1994
 
                        $orphan_rows[(int) $attach_row['attach_id']] = array();
1995
 
                }
1996
 
 
1997
 
                if (sizeof($orphan_rows))
1998
 
                {
1999
 
                        $sql = 'SELECT attach_id, filesize, physical_filename
2000
 
                                FROM ' . ATTACHMENTS_TABLE . '
2001
 
                                WHERE ' . $db->sql_in_set('attach_id', array_keys($orphan_rows)) . '
2002
 
                                        AND is_orphan = 1
2003
 
                                        AND poster_id = ' . $user->data['user_id'];
2004
 
                        $result = $db->sql_query($sql);
2005
 
 
2006
 
                        $orphan_rows = array();
2007
 
                        while ($row = $db->sql_fetchrow($result))
2008
 
                        {
2009
 
                                $orphan_rows[$row['attach_id']] = $row;
2010
 
                        }
2011
 
                        $db->sql_freeresult($result);
2012
 
                }
2013
 
 
2014
 
                foreach ($data['attachment_data'] as $pos => $attach_row)
2015
 
                {
2016
 
                        if ($attach_row['is_orphan'] && !in_array($attach_row['attach_id'], array_keys($orphan_rows)))
2017
 
                        {
2018
 
                                continue;
2019
 
                        }
2020
 
 
2021
 
                        if (!$attach_row['is_orphan'])
2022
 
                        {
2023
 
                                // update entry in db if attachment already stored in db and filespace
2024
 
                                $sql = 'UPDATE ' . ATTACHMENTS_TABLE . "
2025
 
                                        SET attach_comment = '" . $db->sql_escape($attach_row['attach_comment']) . "'
2026
 
                                        WHERE attach_id = " . (int) $attach_row['attach_id'] . '
2027
 
                                                AND is_orphan = 0';
2028
 
                                $db->sql_query($sql);
2029
 
                        }
2030
 
                        else
2031
 
                        {
2032
 
                                // insert attachment into db
2033
 
                                if (!@file_exists($phpbb_root_path . $config['upload_path'] . '/' . basename($orphan_rows[$attach_row['attach_id']]['physical_filename'])))
2034
 
                                {
2035
 
                                        continue;
2036
 
                                }
2037
 
 
2038
 
                                $space_taken += $orphan_rows[$attach_row['attach_id']]['filesize'];
2039
 
                                $files_added++;
2040
 
 
2041
 
                                $attach_sql = array(
2042
 
                                        'post_msg_id'           => $data['post_id'],
2043
 
                                        'topic_id'                      => $data['topic_id'],
2044
 
                                        'is_orphan'                     => 0,
2045
 
                                        'poster_id'                     => $poster_id,
2046
 
                                        'attach_comment'        => $attach_row['attach_comment'],
2047
 
                                );
2048
 
 
2049
 
                                $sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $attach_sql) . '
2050
 
                                        WHERE attach_id = ' . $attach_row['attach_id'] . '
2051
 
                                                AND is_orphan = 1
2052
 
                                                AND poster_id = ' . $user->data['user_id'];
2053
 
                                $db->sql_query($sql);
2054
 
                        }
2055
 
                }
2056
 
 
2057
 
                if ($space_taken && $files_added)
2058
 
                {
2059
 
                        set_config('upload_dir_size', $config['upload_dir_size'] + $space_taken, true);
2060
 
                        set_config('num_files', $config['num_files'] + $files_added, true);
2061
 
                }
2062
 
        }
2063
 
 
2064
 
        // we need to update the last forum information
2065
 
        // only applicable if the topic is not global and it is approved
2066
 
        // we also check to make sure we are not dealing with globaling the latest topic (pretty rare but still needs to be checked)
2067
 
        if ($topic_type != POST_GLOBAL && !$make_global && ($post_approved || !$data['post_approved']))
2068
 
        {
2069
 
                // the last post makes us update the forum table. This can happen if...
2070
 
                // We make a new topic
2071
 
                // We reply to a topic
2072
 
                // We edit the last post in a topic and this post is the latest in the forum (maybe)
2073
 
                // We edit the only post in the topic
2074
 
                // We edit the first post in the topic and all the other posts are not approved
2075
 
                if (($post_mode == 'post' || $post_mode == 'reply') && $post_approved)
2076
 
                {
2077
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data['post_id'];
2078
 
                        $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'";
2079
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . $current_time;
2080
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $user->data['user_id'];
2081
 
                        $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape((!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : '')) . "'";
2082
 
                        $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($user->data['user_colour']) . "'";
2083
 
                }
2084
 
                else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies']))
2085
 
                {
2086
 
                        // this does not _necessarily_ mean that we must update the info again,
2087
 
                        // it just means that we might have to
2088
 
                        $sql = 'SELECT forum_last_post_id, forum_last_post_subject
2089
 
                                FROM ' . FORUMS_TABLE . '
2090
 
                                WHERE forum_id = ' . (int) $data['forum_id'];
2091
 
                        $result = $db->sql_query($sql);
2092
 
                        $row = $db->sql_fetchrow($result);
2093
 
                        $db->sql_freeresult($result);
2094
 
 
2095
 
                        // this post is the latest post in the forum, better update
2096
 
                        if ($row['forum_last_post_id'] == $data['post_id'])
2097
 
                        {
2098
 
                                if ($post_approved && $row['forum_last_post_subject'] !== $subject)
2099
 
                                {
2100
 
                                        // the only data that can really be changed is the post's subject
2101
 
                                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_subject = \'' . $db->sql_escape($subject) . '\'';
2102
 
                                }
2103
 
                                else if ($data['post_approved'] !== $post_approved)
2104
 
                                {
2105
 
                                        // we need a fresh change of socks, everything has become invalidated
2106
 
                                        $sql = 'SELECT MAX(topic_last_post_id) as last_post_id
2107
 
                                                FROM ' . TOPICS_TABLE . '
2108
 
                                                WHERE forum_id = ' . (int) $data['forum_id'] . '
2109
 
                                                        AND topic_approved = 1';
2110
 
                                        $result = $db->sql_query($sql);
2111
 
                                        $row = $db->sql_fetchrow($result);
2112
 
                                        $db->sql_freeresult($result);
2113
 
 
2114
 
                                        // any posts left in this forum?
2115
 
                                        if (!empty($row['last_post_id']))
2116
 
                                        {
2117
 
                                                $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
2118
 
                                                        FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
2119
 
                                                        WHERE p.poster_id = u.user_id
2120
 
                                                                AND p.post_id = ' . (int) $row['last_post_id'];
2121
 
                                                $result = $db->sql_query($sql);
2122
 
                                                $row = $db->sql_fetchrow($result);
2123
 
                                                $db->sql_freeresult($result);
2124
 
 
2125
 
                                                // salvation, a post is found! jam it into the forums table
2126
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . (int) $row['post_id'];
2127
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
2128
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . (int) $row['post_time'];
2129
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $row['poster_id'];
2130
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
2131
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
2132
 
                                        }
2133
 
                                        else
2134
 
                                        {
2135
 
                                                // just our luck, the last topic in the forum has just been turned unapproved...
2136
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = 0';
2137
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = ''";
2138
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = 0';
2139
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = 0';
2140
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = ''";
2141
 
                                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = ''";
2142
 
                                        }
2143
 
                                }
2144
 
                        }
2145
 
                }
2146
 
        }
2147
 
        else if ($make_global)
2148
 
        {
2149
 
                // somebody decided to be a party pooper, we must recalculate the whole shebang (maybe)
2150
 
                $sql = 'SELECT forum_last_post_id
2151
 
                        FROM ' . FORUMS_TABLE . '
2152
 
                        WHERE forum_id = ' . (int) $data['forum_id'];
2153
 
                $result = $db->sql_query($sql);
2154
 
                $forum_row = $db->sql_fetchrow($result);
2155
 
                $db->sql_freeresult($result);
2156
 
 
2157
 
                // we made a topic global, go get new data
2158
 
                if ($topic_row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL && $forum_row['forum_last_post_id'] == $topic_row['topic_last_post_id'])
2159
 
                {
2160
 
                        // we need a fresh change of socks, everything has become invalidated
2161
 
                        $sql = 'SELECT MAX(topic_last_post_id) as last_post_id
2162
 
                                FROM ' . TOPICS_TABLE . '
2163
 
                                WHERE forum_id = ' . (int) $data['forum_id'] . '
2164
 
                                        AND topic_approved = 1';
2165
 
                        $result = $db->sql_query($sql);
2166
 
                        $row = $db->sql_fetchrow($result);
2167
 
                        $db->sql_freeresult($result);
2168
 
 
2169
 
                        // any posts left in this forum?
2170
 
                        if (!empty($row['last_post_id']))
2171
 
                        {
2172
 
                                $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
2173
 
                                        FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
2174
 
                                        WHERE p.poster_id = u.user_id
2175
 
                                                AND p.post_id = ' . (int) $row['last_post_id'];
2176
 
                                $result = $db->sql_query($sql);
2177
 
                                $row = $db->sql_fetchrow($result);
2178
 
                                $db->sql_freeresult($result);
2179
 
 
2180
 
                                // salvation, a post is found! jam it into the forums table
2181
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . (int) $row['post_id'];
2182
 
                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
2183
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . (int) $row['post_time'];
2184
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $row['poster_id'];
2185
 
                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
2186
 
                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
2187
 
                        }
2188
 
                        else
2189
 
                        {
2190
 
                                // just our luck, the last topic in the forum has just been globalized...
2191
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = 0';
2192
 
                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = ''";
2193
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = 0';
2194
 
                                $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = 0';
2195
 
                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = ''";
2196
 
                                $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = ''";
2197
 
                        }
2198
 
                }
2199
 
                else if ($topic_row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL && $forum_row['forum_last_post_id'] < $topic_row['topic_last_post_id'])
2200
 
                {
2201
 
                        // this post has a higher id, it is newer
2202
 
                        $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
2203
 
                                FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
2204
 
                                WHERE p.poster_id = u.user_id
2205
 
                                        AND p.post_id = ' . (int) $topic_row['topic_last_post_id'];
2206
 
                        $result = $db->sql_query($sql);
2207
 
                        $row = $db->sql_fetchrow($result);
2208
 
                        $db->sql_freeresult($result);
2209
 
 
2210
 
                        // salvation, a post is found! jam it into the forums table
2211
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . (int) $row['post_id'];
2212
 
                        $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
2213
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . (int) $row['post_time'];
2214
 
                        $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $row['poster_id'];
2215
 
                        $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
2216
 
                        $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
2217
 
                }
2218
 
        }
2219
 
 
2220
 
        // topic sync time!
2221
 
        // simply, we update if it is a reply or the last post is edited
2222
 
        if ($post_approved)
2223
 
        {
2224
 
                // reply requires the whole thing
2225
 
                if ($post_mode == 'reply')
2226
 
                {
2227
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_id = ' . (int) $data['post_id'];
2228
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_poster_id = ' . (int) $user->data['user_id'];
2229
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape((!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : '')) . "'";
2230
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_colour = '" . (($user->data['user_id'] != ANONYMOUS) ? $db->sql_escape($user->data['user_colour']) : '') . "'";
2231
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";
2232
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_time = ' . (int) $current_time;
2233
 
                }
2234
 
                else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies']))
2235
 
                {
2236
 
                        // only the subject can be changed from edit
2237
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";
2238
 
                }
2239
 
        }
2240
 
        else if (!$data['post_approved'] && ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies'])))
2241
 
        {
2242
 
                // like having the rug pulled from under us
2243
 
                $sql = 'SELECT MAX(post_id) as last_post_id
2244
 
                        FROM ' . POSTS_TABLE . '
2245
 
                        WHERE topic_id = ' . (int) $data['topic_id'] . '
2246
 
                                AND post_approved = 1';
2247
 
                $result = $db->sql_query($sql);
2248
 
                $row = $db->sql_fetchrow($result);
2249
 
                $db->sql_freeresult($result);
2250
 
 
2251
 
                // any posts left in this forum?
2252
 
                if (!empty($row['last_post_id']))
2253
 
                {
2254
 
                        $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
2255
 
                                FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
2256
 
                                WHERE p.poster_id = u.user_id
2257
 
                                        AND p.post_id = ' . (int) $row['last_post_id'];
2258
 
                        $result = $db->sql_query($sql);
2259
 
                        $row = $db->sql_fetchrow($result);
2260
 
                        $db->sql_freeresult($result);
2261
 
 
2262
 
                        // salvation, a post is found! jam it into the topics table
2263
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_id = ' . (int) $row['post_id'];
2264
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
2265
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_time = ' . (int) $row['post_time'];
2266
 
                        $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_poster_id = ' . (int) $row['poster_id'];
2267
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
2268
 
                        $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
2269
 
                }
2270
 
        }
2271
 
 
2272
 
        // Update total post count, do not consider moderated posts/topics
2273
 
        if ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id']))
2274
 
        {
2275
 
                if ($post_mode == 'post')
2276
 
                {
2277
 
                        set_config('num_topics', $config['num_topics'] + 1, true);
2278
 
                        set_config('num_posts', $config['num_posts'] + 1, true);
2279
 
                }
2280
 
 
2281
 
                if ($post_mode == 'reply')
2282
 
                {
2283
 
                        set_config('num_posts', $config['num_posts'] + 1, true);
2284
 
                }
2285
 
        }
2286
 
 
2287
 
        // Update forum stats
2288
 
        $where_sql = array(POSTS_TABLE => 'post_id = ' . $data['post_id'], TOPICS_TABLE => 'topic_id = ' . $data['topic_id'], FORUMS_TABLE => 'forum_id = ' . $data['forum_id'], USERS_TABLE => 'user_id = ' . $user->data['user_id']);
2289
 
 
2290
 
        foreach ($sql_data as $table => $update_ary)
2291
 
        {
2292
 
                if (isset($update_ary['stat']) && implode('', $update_ary['stat']))
2293
 
                {
2294
 
                        $sql = "UPDATE $table SET " . implode(', ', $update_ary['stat']) . ' WHERE ' . $where_sql[$table];
2295
 
                        $db->sql_query($sql);
2296
 
                }
2297
 
        }
2298
 
 
2299
 
        // Delete topic shadows (if any exist). We do not need a shadow topic for an global announcement
2300
 
        if ($make_global)
2301
 
        {
2302
 
                $sql = 'DELETE FROM ' . TOPICS_TABLE . '
2303
 
                        WHERE topic_moved_id = ' . $data['topic_id'];
2304
 
                $db->sql_query($sql);
2305
 
        }
2306
 
 
2307
 
        // Committing the transaction before updating search index
2308
 
        $db->sql_transaction('commit');
2309
 
 
2310
 
        // Delete draft if post was loaded...
2311
 
        $draft_id = request_var('draft_loaded', 0);
2312
 
        if ($draft_id)
2313
 
        {
2314
 
                $sql = 'DELETE FROM ' . DRAFTS_TABLE . "
2315
 
                        WHERE draft_id = $draft_id
2316
 
                                AND user_id = {$user->data['user_id']}";
2317
 
                $db->sql_query($sql);
2318
 
        }
2319
 
 
2320
 
        // Index message contents
2321
 
        if ($update_message && $data['enable_indexing'])
2322
 
        {
2323
 
                // Select the search method and do some additional checks to ensure it can actually be utilised
2324
 
                $search_type = basename($config['search_type']);
2325
 
 
2326
 
                if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
2327
 
                {
2328
 
                        trigger_error('NO_SUCH_SEARCH_MODULE');
2329
 
                }
2330
 
 
2331
 
                if (!class_exists($search_type))
2332
 
                {
2333
 
                        include("{$phpbb_root_path}includes/search/$search_type.$phpEx");
2334
 
                }
2335
 
 
2336
 
                $error = false;
2337
 
                $search = new $search_type($error);
2338
 
 
2339
 
                if ($error)
2340
 
                {
2341
 
                        trigger_error($error);
2342
 
                }
2343
 
 
2344
 
                $search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id, ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']);
2345
 
        }
2346
 
 
2347
 
        // Topic Notification, do not change if moderator is changing other users posts...
2348
 
        if ($user->data['user_id'] == $poster_id)
2349
 
        {
2350
 
                if (!$data['notify_set'] && $data['notify'])
2351
 
                {
2352
 
                        $sql = 'INSERT INTO ' . TOPICS_WATCH_TABLE . ' (user_id, topic_id)
2353
 
                                VALUES (' . $user->data['user_id'] . ', ' . $data['topic_id'] . ')';
2354
 
                        $db->sql_query($sql);
2355
 
                }
2356
 
                else if ($data['notify_set'] && !$data['notify'])
2357
 
                {
2358
 
                        $sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . '
2359
 
                                WHERE user_id = ' . $user->data['user_id'] . '
2360
 
                                        AND topic_id = ' . $data['topic_id'];
2361
 
                        $db->sql_query($sql);
2362
 
                }
2363
 
        }
2364
 
 
2365
 
        if ($mode == 'post' || $mode == 'reply' || $mode == 'quote')
2366
 
        {
2367
 
                // Mark this topic as posted to
2368
 
                markread('post', $data['forum_id'], $data['topic_id'], $data['post_time']);
2369
 
        }
2370
 
 
2371
 
        // Mark this topic as read
2372
 
        // We do not use post_time here, this is intended (post_time can have a date in the past if editing a message)
2373
 
        markread('topic', $data['forum_id'], $data['topic_id'], time());
2374
 
 
2375
 
        //
2376
 
        if ($config['load_db_lastread'] && $user->data['is_registered'])
2377
 
        {
2378
 
                $sql = 'SELECT mark_time
2379
 
                        FROM ' . FORUMS_TRACK_TABLE . '
2380
 
                        WHERE user_id = ' . $user->data['user_id'] . '
2381
 
                                AND forum_id = ' . $data['forum_id'];
2382
 
                $result = $db->sql_query($sql);
2383
 
                $f_mark_time = (int) $db->sql_fetchfield('mark_time');
2384
 
                $db->sql_freeresult($result);
2385
 
        }
2386
 
        else if ($config['load_anon_lastread'] || $user->data['is_registered'])
2387
 
        {
2388
 
                $f_mark_time = false;
2389
 
        }
2390
 
 
2391
 
        if (($config['load_db_lastread'] && $user->data['is_registered']) || $config['load_anon_lastread'] || $user->data['is_registered'])
2392
 
        {
2393
 
                // Update forum info
2394
 
                $sql = 'SELECT forum_last_post_time
2395
 
                        FROM ' . FORUMS_TABLE . '
2396
 
                        WHERE forum_id = ' . $data['forum_id'];
2397
 
                $result = $db->sql_query($sql);
2398
 
                $forum_last_post_time = (int) $db->sql_fetchfield('forum_last_post_time');
2399
 
                $db->sql_freeresult($result);
2400
 
 
2401
 
                update_forum_tracking_info($data['forum_id'], $forum_last_post_time, $f_mark_time, false);
2402
 
        }
2403
 
 
2404
 
        // Send Notifications
2405
 
        if ($mode != 'edit' && $mode != 'delete' && ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])))
2406
 
        {
2407
 
                user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id']);
2408
 
        }
2409
 
 
2410
 
        $params = $add_anchor = '';
2411
 
 
2412
 
        if ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id']))
2413
 
        {
2414
 
                $params .= '&amp;t=' . $data['topic_id'];
2415
 
 
2416
 
                if ($mode != 'post')
2417
 
                {
2418
 
                        $params .= '&amp;p=' . $data['post_id'];
2419
 
                        $add_anchor = '#p' . $data['post_id'];
2420
 
                }
2421
 
        }
2422
 
        else if ($mode != 'post' && $post_mode != 'edit_first_post' && $post_mode != 'edit_topic')
2423
 
        {
2424
 
                $params .= '&amp;t=' . $data['topic_id'];
2425
 
        }
2426
 
 
2427
 
        $url = (!$params) ? "{$phpbb_root_path}viewforum.$phpEx" : "{$phpbb_root_path}viewtopic.$phpEx";
2428
 
        $url = append_sid($url, 'f=' . $data['forum_id'] . $params) . $add_anchor;
2429
 
 
2430
 
        return $url;
2431
 
}
2432
 
 
2433
 
?>
 
 
b'\\ No newline at end of file'