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

« back to all changes in this revision

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

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

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'