phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / posting.php

History | View | Annotate | Download (59.4 kB)

1
<?php
2
/**
3
*
4
* @package phpBB3
5
* @version $Id: posting.php 11607 2011-12-03 23:15:13Z git-gate $
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
define('IN_PHPBB', true);
15
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
16
$phpEx = substr(strrchr(__FILE__, '.'), 1);
17
include($phpbb_root_path . 'common.' . $phpEx);
18
include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
19
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
20
include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
21
22
23
// Start session management
24
$user->session_begin();
25
$auth->acl($user->data);
26
27
28
// Grab only parameters needed here
29
$post_id        = request_var('p', 0);
30
$topic_id        = request_var('t', 0);
31
$forum_id        = request_var('f', 0);
32
$draft_id        = request_var('d', 0);
33
$lastclick        = request_var('lastclick', 0);
34
35
$submit                = (isset($_POST['post'])) ? true : false;
36
$preview        = (isset($_POST['preview'])) ? true : false;
37
$save                = (isset($_POST['save'])) ? true : false;
38
$load                = (isset($_POST['load'])) ? true : false;
39
$delete                = (isset($_POST['delete'])) ? true : false;
40
$cancel                = (isset($_POST['cancel']) && !isset($_POST['save'])) ? true : false;
41
42
$refresh        = (isset($_POST['add_file']) || isset($_POST['delete_file']) || isset($_POST['full_editor']) || isset($_POST['cancel_unglobalise']) || $save || $load) ? true : false;
43
$mode                = ($delete && !$preview && !$refresh && $submit) ? 'delete' : request_var('mode', '');
44
45
$error = $post_data = array();
46
$current_time = time();
47
48
// Was cancel pressed? If so then redirect to the appropriate page
49
if ($cancel || ($current_time - $lastclick < 2 && $submit))
50
{
51
        $f = ($forum_id) ? 'f=' . $forum_id . '&amp;' : '';
52
        $redirect = ($post_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $f . 'p=' . $post_id) . '#p' . $post_id : (($topic_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $f . 't=' . $topic_id) : (($forum_id) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) : append_sid("{$phpbb_root_path}index.$phpEx")));
53
        redirect($redirect);
54
}
55
56
if (in_array($mode, array('post', 'reply', 'quote', 'edit', 'delete')) && !$forum_id)
57
{
58
        trigger_error('NO_FORUM');
59
}
60
61
// We need to know some basic information in all cases before we do anything.
62
switch ($mode)
63
{
64
        case 'post':
65
                $sql = 'SELECT *
66
                        FROM ' . FORUMS_TABLE . "
67
                        WHERE forum_id = $forum_id";
68
        break;
69
70
        case 'bump':
71
        case 'reply':
72
                if (!$topic_id)
73
                {
74
                        trigger_error('NO_TOPIC');
75
                }
76
77
                // Force forum id
78
                $sql = 'SELECT forum_id
79
                        FROM ' . TOPICS_TABLE . '
80
                        WHERE topic_id = ' . $topic_id;
81
                $result = $db->sql_query($sql);
82
                $f_id = (int) $db->sql_fetchfield('forum_id');
83
                $db->sql_freeresult($result);
84
85
                $forum_id = (!$f_id) ? $forum_id : $f_id;
86
87
                $sql = 'SELECT f.*, t.*
88
                        FROM ' . TOPICS_TABLE . ' t, ' . FORUMS_TABLE . " f
89
                        WHERE t.topic_id = $topic_id
90
                                AND (f.forum_id = t.forum_id
91
                                        OR f.forum_id = $forum_id)" .
92
                        (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND t.topic_approved = 1');
93
        break;
94
95
        case 'quote':
96
        case 'edit':
97
        case 'delete':
98
                if (!$post_id)
99
                {
100
                        $user->setup('posting');
101
                        trigger_error('NO_POST');
102
                }
103
104
                // Force forum id
105
                $sql = 'SELECT forum_id
106
                        FROM ' . POSTS_TABLE . '
107
                        WHERE post_id = ' . $post_id;
108
                $result = $db->sql_query($sql);
109
                $f_id = (int) $db->sql_fetchfield('forum_id');
110
                $db->sql_freeresult($result);
111
112
                $forum_id = (!$f_id) ? $forum_id : $f_id;
113
114
                $sql = 'SELECT f.*, t.*, p.*, u.username, u.username_clean, u.user_sig, u.user_sig_bbcode_uid, u.user_sig_bbcode_bitfield
115
                        FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . FORUMS_TABLE . ' f, ' . USERS_TABLE . " u
116
                        WHERE p.post_id = $post_id
117
                                AND t.topic_id = p.topic_id
118
                                AND u.user_id = p.poster_id
119
                                AND (f.forum_id = t.forum_id
120
                                        OR f.forum_id = $forum_id)" .
121
                                (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND p.post_approved = 1');
122
        break;
123
124
        case 'smilies':
125
                $sql = '';
126
                generate_smilies('window', $forum_id);
127
        break;
128
129
        case 'popup':
130
                if ($forum_id)
131
                {
132
                        $sql = 'SELECT forum_style
133
                                FROM ' . FORUMS_TABLE . '
134
                                WHERE forum_id = ' . $forum_id;
135
                }
136
                else
137
                {
138
                        upload_popup();
139
                        return;
140
                }
141
        break;
142
143
        default:
144
                $sql = '';
145
        break;
146
}
147
148
if (!$sql)
149
{
150
        $user->setup('posting');
151
        trigger_error('NO_POST_MODE');
152
}
153
154
$result = $db->sql_query($sql);
155
$post_data = $db->sql_fetchrow($result);
156
$db->sql_freeresult($result);
157
158
if (!$post_data)
159
{
160
        if (!($mode == 'post' || $mode == 'bump' || $mode == 'reply'))
161
        {
162
                $user->setup('posting');
163
        }
164
        trigger_error(($mode == 'post' || $mode == 'bump' || $mode == 'reply') ? 'NO_TOPIC' : 'NO_POST');
165
}
166
167
// Not able to reply to unapproved posts/topics
168
// TODO: add more descriptive language key
169
if ($auth->acl_get('m_approve', $forum_id) && ((($mode == 'reply' || $mode == 'bump') && !$post_data['topic_approved']) || ($mode == 'quote' && !$post_data['post_approved'])))
170
{
171
        trigger_error(($mode == 'reply' || $mode == 'bump') ? 'TOPIC_UNAPPROVED' : 'POST_UNAPPROVED');
172
}
173
174
if ($mode == 'popup')
175
{
176
        upload_popup($post_data['forum_style']);
177
        return;
178
}
179
180
$user->setup(array('posting', 'mcp', 'viewtopic'), $post_data['forum_style']);
181
182
if ($config['enable_post_confirm'] && !$user->data['is_registered'])
183
{
184
        include($phpbb_root_path . 'includes/captcha/captcha_factory.' . $phpEx);
185
        $captcha =& phpbb_captcha_factory::get_instance($config['captcha_plugin']);
186
        $captcha->init(CONFIRM_POST);
187
}
188
189
// Use post_row values in favor of submitted ones...
190
$forum_id        = (!empty($post_data['forum_id'])) ? (int) $post_data['forum_id'] : (int) $forum_id;
191
$topic_id        = (!empty($post_data['topic_id'])) ? (int) $post_data['topic_id'] : (int) $topic_id;
192
$post_id        = (!empty($post_data['post_id'])) ? (int) $post_data['post_id'] : (int) $post_id;
193
194
// Need to login to passworded forum first?
195
if ($post_data['forum_password'])
196
{
197
        login_forum_box(array(
198
                'forum_id'                        => $forum_id,
199
                'forum_password'        => $post_data['forum_password'])
200
        );
201
}
202
203
// Check permissions
204
if ($user->data['is_bot'])
205
{
206
        redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
207
}
208
209
// Is the user able to read within this forum?
210
if (!$auth->acl_get('f_read', $forum_id))
211
{
212
        if ($user->data['user_id'] != ANONYMOUS)
213
        {
214
                trigger_error('USER_CANNOT_READ');
215
        }
216
217
        login_box('', $user->lang['LOGIN_EXPLAIN_POST']);
218
}
219
220
// Permission to do the action asked?
221
$is_authed = false;
222
223
switch ($mode)
224
{
225
        case 'post':
226
                if ($auth->acl_get('f_post', $forum_id))
227
                {
228
                        $is_authed = true;
229
                }
230
        break;
231
232
        case 'bump':
233
                if ($auth->acl_get('f_bump', $forum_id))
234
                {
235
                        $is_authed = true;
236
                }
237
        break;
238
239
        case 'quote':
240
241
                $post_data['post_edit_locked'] = 0;
242
243
        // no break;
244
245
        case 'reply':
246
                if ($auth->acl_get('f_reply', $forum_id))
247
                {
248
                        $is_authed = true;
249
                }
250
        break;
251
252
        case 'edit':
253
                if ($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id))
254
                {
255
                        $is_authed = true;
256
                }
257
        break;
258
259
        case 'delete':
260
                if ($user->data['is_registered'] && $auth->acl_gets('f_delete', 'm_delete', $forum_id))
261
                {
262
                        $is_authed = true;
263
                }
264
        break;
265
}
266
267
if (!$is_authed)
268
{
269
        $check_auth = ($mode == 'quote') ? 'reply' : $mode;
270
271
        if ($user->data['is_registered'])
272
        {
273
                trigger_error('USER_CANNOT_' . strtoupper($check_auth));
274
        }
275
276
        login_box('', $user->lang['LOGIN_EXPLAIN_' . strtoupper($mode)]);
277
}
278
279
// Is the user able to post within this forum?
280
if ($post_data['forum_type'] != FORUM_POST && in_array($mode, array('post', 'bump', 'quote', 'reply')))
281
{
282
        trigger_error('USER_CANNOT_FORUM_POST');
283
}
284
285
// Forum/Topic locked?
286
if (($post_data['forum_status'] == ITEM_LOCKED || (isset($post_data['topic_status']) && $post_data['topic_status'] == ITEM_LOCKED)) && !$auth->acl_get('m_edit', $forum_id))
287
{
288
        trigger_error(($post_data['forum_status'] == ITEM_LOCKED) ? 'FORUM_LOCKED' : 'TOPIC_LOCKED');
289
}
290
291
// Can we edit this post ... if we're a moderator with rights then always yes
292
// else it depends on editing times, lock status and if we're the correct user
293
if ($mode == 'edit' && !$auth->acl_get('m_edit', $forum_id))
294
{
295
        if ($user->data['user_id'] != $post_data['poster_id'])
296
        {
297
                trigger_error('USER_CANNOT_EDIT');
298
        }
299
300
        if (!($post_data['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time']))
301
        {
302
                trigger_error('CANNOT_EDIT_TIME');
303
        }
304
305
        if ($post_data['post_edit_locked'])
306
        {
307
                trigger_error('CANNOT_EDIT_POST_LOCKED');
308
        }
309
}
310
311
// Handle delete mode...
312
if ($mode == 'delete')
313
{
314
        handle_post_delete($forum_id, $topic_id, $post_id, $post_data);
315
        return;
316
}
317
318
// Handle bump mode...
319
if ($mode == 'bump')
320
{
321
        if ($bump_time = bump_topic_allowed($forum_id, $post_data['topic_bumped'], $post_data['topic_last_post_time'], $post_data['topic_poster'], $post_data['topic_last_poster_id'])
322
           && check_link_hash(request_var('hash', ''), "topic_{$post_data['topic_id']}"))
323
        {
324
                $meta_url = phpbb_bump_topic($forum_id, $topic_id, $post_data, $current_time);
325
                meta_refresh(3, $meta_url);
326
327
                $message = $user->lang['TOPIC_BUMPED'] . '<br /><br />' . sprintf($user->lang['VIEW_MESSAGE'], '<a href="' . $meta_url . '">', '</a>');
328
                $message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
329
330
                trigger_error($message);
331
        }
332
333
        trigger_error('BUMP_ERROR');
334
}
335
336
// Subject length limiting to 60 characters if first post...
337
if ($mode == 'post' || ($mode == 'edit' && $post_data['topic_first_post_id'] == $post_data['post_id']))
338
{
339
        $template->assign_var('S_NEW_MESSAGE', true);
340
}
341
342
// Determine some vars
343
if (isset($post_data['poster_id']) && $post_data['poster_id'] == ANONYMOUS)
344
{
345
        $post_data['quote_username'] = (!empty($post_data['post_username'])) ? $post_data['post_username'] : $user->lang['GUEST'];
346
}
347
else
348
{
349
        $post_data['quote_username'] = isset($post_data['username']) ? $post_data['username'] : '';
350
}
351
352
$post_data['post_edit_locked']        = (isset($post_data['post_edit_locked'])) ? (int) $post_data['post_edit_locked'] : 0;
353
$post_data['post_subject_md5']        = (isset($post_data['post_subject']) && $mode == 'edit') ? md5($post_data['post_subject']) : '';
354
$post_data['post_subject']                = (in_array($mode, array('quote', 'edit'))) ? $post_data['post_subject'] : ((isset($post_data['topic_title'])) ? $post_data['topic_title'] : '');
355
$post_data['topic_time_limit']        = (isset($post_data['topic_time_limit'])) ? (($post_data['topic_time_limit']) ? (int) $post_data['topic_time_limit'] / 86400 : (int) $post_data['topic_time_limit']) : 0;
356
$post_data['poll_length']                = (!empty($post_data['poll_length'])) ? (int) $post_data['poll_length'] / 86400 : 0;
357
$post_data['poll_start']                = (!empty($post_data['poll_start'])) ? (int) $post_data['poll_start'] : 0;
358
$post_data['icon_id']                        = (!isset($post_data['icon_id']) || in_array($mode, array('quote', 'reply'))) ? 0 : (int) $post_data['icon_id'];
359
$post_data['poll_options']                = array();
360
361
// Get Poll Data
362
if ($post_data['poll_start'])
363
{
364
        $sql = 'SELECT poll_option_text
365
                FROM ' . POLL_OPTIONS_TABLE . "
366
                WHERE topic_id = $topic_id
367
                ORDER BY poll_option_id";
368
        $result = $db->sql_query($sql);
369
370
        while ($row = $db->sql_fetchrow($result))
371
        {
372
                $post_data['poll_options'][] = trim($row['poll_option_text']);
373
        }
374
        $db->sql_freeresult($result);
375
}
376
377
if ($mode == 'edit')
378
{
379
        $original_poll_data = array(
380
                'poll_title'                => $post_data['poll_title'],
381
                'poll_length'                => $post_data['poll_length'],
382
                'poll_max_options'        => $post_data['poll_max_options'],
383
                'poll_option_text'        => implode("\n", $post_data['poll_options']),
384
                'poll_start'                => $post_data['poll_start'],
385
                'poll_last_vote'        => $post_data['poll_last_vote'],
386
                'poll_vote_change'        => $post_data['poll_vote_change'],
387
        );
388
}
389
390
$orig_poll_options_size = sizeof($post_data['poll_options']);
391
392
$message_parser = new parse_message();
393
394
if (isset($post_data['post_text']))
395
{
396
        $message_parser->message = &$post_data['post_text'];
397
        unset($post_data['post_text']);
398
}
399
400
// Set some default variables
401
$uninit = array('post_attachment' => 0, 'poster_id' => $user->data['user_id'], 'enable_magic_url' => 0, 'topic_status' => 0, 'topic_type' => POST_NORMAL, 'post_subject' => '', 'topic_title' => '', 'post_time' => 0, 'post_edit_reason' => '', 'notify_set' => 0);
402
403
foreach ($uninit as $var_name => $default_value)
404
{
405
        if (!isset($post_data[$var_name]))
406
        {
407
                $post_data[$var_name] = $default_value;
408
        }
409
}
410
unset($uninit);
411
412
// Always check if the submitted attachment data is valid and belongs to the user.
413
// Further down (especially in submit_post()) we do not check this again.
414
$message_parser->get_submitted_attachment_data($post_data['poster_id']);
415
416
if ($post_data['post_attachment'] && !$submit && !$refresh && !$preview && $mode == 'edit')
417
{
418
        // Do not change to SELECT *
419
        $sql = 'SELECT attach_id, is_orphan, attach_comment, real_filename
420
                FROM ' . ATTACHMENTS_TABLE . "
421
                WHERE post_msg_id = $post_id
422
                        AND in_message = 0
423
                        AND is_orphan = 0
424
                ORDER BY filetime DESC";
425
        $result = $db->sql_query($sql);
426
        $message_parser->attachment_data = array_merge($message_parser->attachment_data, $db->sql_fetchrowset($result));
427
        $db->sql_freeresult($result);
428
}
429
430
if ($post_data['poster_id'] == ANONYMOUS)
431
{
432
        $post_data['username'] = ($mode == 'quote' || $mode == 'edit') ? trim($post_data['post_username']) : '';
433
}
434
else
435
{
436
        $post_data['username'] = ($mode == 'quote' || $mode == 'edit') ? trim($post_data['username']) : '';
437
}
438
439
$post_data['enable_urls'] = $post_data['enable_magic_url'];
440
441
if ($mode != 'edit')
442
{
443
        $post_data['enable_sig']                = ($config['allow_sig'] && $user->optionget('attachsig')) ? true: false;
444
        $post_data['enable_smilies']        = ($config['allow_smilies'] && $user->optionget('smilies')) ? true : false;
445
        $post_data['enable_bbcode']                = ($config['allow_bbcode'] && $user->optionget('bbcode')) ? true : false;
446
        $post_data['enable_urls']                = true;
447
}
448
449
$post_data['enable_magic_url'] = $post_data['drafts'] = false;
450
451
// User own some drafts?
452
if ($user->data['is_registered'] && $auth->acl_get('u_savedrafts') && ($mode == 'reply' || $mode == 'post' || $mode == 'quote'))
453
{
454
        $sql = 'SELECT draft_id
455
                FROM ' . DRAFTS_TABLE . '
456
                WHERE user_id = ' . $user->data['user_id'] .
457
                        (($forum_id) ? ' AND forum_id = ' . (int) $forum_id : '') .
458
                        (($topic_id) ? ' AND topic_id = ' . (int) $topic_id : '') .
459
                        (($draft_id) ? " AND draft_id <> $draft_id" : '');
460
        $result = $db->sql_query_limit($sql, 1);
461
462
        if ($db->sql_fetchrow($result))
463
        {
464
                $post_data['drafts'] = true;
465
        }
466
        $db->sql_freeresult($result);
467
}
468
469
$check_value = (($post_data['enable_bbcode']+1) << 8) + (($post_data['enable_smilies']+1) << 4) + (($post_data['enable_urls']+1) << 2) + (($post_data['enable_sig']+1) << 1);
470
471
// Check if user is watching this topic
472
if ($mode != 'post' && $config['allow_topic_notify'] && $user->data['is_registered'])
473
{
474
        $sql = 'SELECT topic_id
475
                FROM ' . TOPICS_WATCH_TABLE . '
476
                WHERE topic_id = ' . $topic_id . '
477
                        AND user_id = ' . $user->data['user_id'];
478
        $result = $db->sql_query($sql);
479
        $post_data['notify_set'] = (int) $db->sql_fetchfield('topic_id');
480
        $db->sql_freeresult($result);
481
}
482
483
// Do we want to edit our post ?
484
if ($mode == 'edit' && $post_data['bbcode_uid'])
485
{
486
        $message_parser->bbcode_uid = $post_data['bbcode_uid'];
487
}
488
489
// HTML, BBCode, Smilies, Images and Flash status
490
$bbcode_status        = ($config['allow_bbcode'] && $auth->acl_get('f_bbcode', $forum_id)) ? true : false;
491
$smilies_status        = ($config['allow_smilies'] && $auth->acl_get('f_smilies', $forum_id)) ? true : false;
492
$img_status                = ($bbcode_status && $auth->acl_get('f_img', $forum_id)) ? true : false;
493
$url_status                = ($config['allow_post_links']) ? true : false;
494
$flash_status        = ($bbcode_status && $auth->acl_get('f_flash', $forum_id) && $config['allow_post_flash']) ? true : false;
495
$quote_status        = true;
496
497
// Save Draft
498
if ($save && $user->data['is_registered'] && $auth->acl_get('u_savedrafts') && ($mode == 'reply' || $mode == 'post' || $mode == 'quote'))
499
{
500
        $subject = utf8_normalize_nfc(request_var('subject', '', true));
501
        $subject = (!$subject && $mode != 'post') ? $post_data['topic_title'] : $subject;
502
        $message = utf8_normalize_nfc(request_var('message', '', true));
503
504
        if ($subject && $message)
505
        {
506
                if (confirm_box(true))
507
                {
508
                        $sql = 'INSERT INTO ' . DRAFTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
509
                                'user_id'                => (int) $user->data['user_id'],
510
                                'topic_id'                => (int) $topic_id,
511
                                'forum_id'                => (int) $forum_id,
512
                                'save_time'                => (int) $current_time,
513
                                'draft_subject'        => (string) $subject,
514
                                'draft_message'        => (string) $message)
515
                        );
516
                        $db->sql_query($sql);
517
518
                        $meta_info = ($mode == 'post') ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) : append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id");
519
520
                        meta_refresh(3, $meta_info);
521
522
                        $message = $user->lang['DRAFT_SAVED'] . '<br /><br />';
523
                        $message .= ($mode != 'post') ? sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $meta_info . '">', '</a>') . '<br /><br />' : '';
524
                        $message .= sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
525
526
                        trigger_error($message);
527
                }
528
                else
529
                {
530
                        $s_hidden_fields = build_hidden_fields(array(
531
                                'mode'                => $mode,
532
                                'save'                => true,
533
                                'f'                        => $forum_id,
534
                                't'                        => $topic_id,
535
                                'subject'        => $subject,
536
                                'message'        => $message,
537
                                'attachment_data' => $message_parser->attachment_data,
538
                                )
539
                        );
540
541
                        $hidden_fields = array(
542
                                'icon_id'                        => 0,
543
544
                                'disable_bbcode'        => false,
545
                                'disable_smilies'        => false,
546
                                'disable_magic_url'        => false,
547
                                'attach_sig'                => true,
548
                                'lock_topic'                => false,
549
550
                                'topic_type'                => POST_NORMAL,
551
                                'topic_time_limit'        => 0,
552
553
                                'poll_title'                => '',
554
                                'poll_option_text'        => '',
555
                                'poll_max_options'        => 1,
556
                                'poll_length'                => 0,
557
                                'poll_vote_change'        => false,
558
                        );
559
560
                        foreach ($hidden_fields as $name => $default)
561
                        {
562
                                if (!isset($_POST[$name]))
563
                                {
564
                                        // Don't include it, if its not available
565
                                        unset($hidden_fields[$name]);
566
                                        continue;
567
                                }
568
569
                                if (is_bool($default))
570
                                {
571
                                        // Use the string representation
572
                                        $hidden_fields[$name] = request_var($name, '');
573
                                }
574
                                else
575
                                {
576
                                        $hidden_fields[$name] = request_var($name, $default);
577
                                }
578
                        }
579
580
                        $s_hidden_fields .= build_hidden_fields($hidden_fields);
581
582
                        confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields);
583
                }
584
        }
585
        else
586
        {
587
                if (utf8_clean_string($subject) === '')
588
                {
589
                        $error[] = $user->lang['EMPTY_SUBJECT'];
590
                }
591
592
                if (utf8_clean_string($message) === '')
593
                {
594
                        $error[] = $user->lang['TOO_FEW_CHARS'];
595
                }
596
        }
597
        unset($subject, $message);
598
}
599
600
// Load requested Draft
601
if ($draft_id && ($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $user->data['is_registered'] && $auth->acl_get('u_savedrafts'))
602
{
603
        $sql = 'SELECT draft_subject, draft_message
604
                FROM ' . DRAFTS_TABLE . "
605
                WHERE draft_id = $draft_id
606
                        AND user_id = " . $user->data['user_id'];
607
        $result = $db->sql_query_limit($sql, 1);
608
        $row = $db->sql_fetchrow($result);
609
        $db->sql_freeresult($result);
610
611
        if ($row)
612
        {
613
                $post_data['post_subject'] = $row['draft_subject'];
614
                $message_parser->message = $row['draft_message'];
615
616
                $template->assign_var('S_DRAFT_LOADED', true);
617
        }
618
        else
619
        {
620
                $draft_id = 0;
621
        }
622
}
623
624
// Load draft overview
625
if ($load && ($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_data['drafts'])
626
{
627
        load_drafts($topic_id, $forum_id);
628
}
629
630
631
if ($submit || $preview || $refresh)
632
{
633
        $post_data['topic_cur_post_id']        = request_var('topic_cur_post_id', 0);
634
        $post_data['post_subject']                = utf8_normalize_nfc(request_var('subject', '', true));
635
        $message_parser->message                = utf8_normalize_nfc(request_var('message', '', true));
636
637
        $post_data['username']                        = utf8_normalize_nfc(request_var('username', $post_data['username'], true));
638
        $post_data['post_edit_reason']        = (!empty($_POST['edit_reason']) && $mode == 'edit' && $auth->acl_get('m_edit', $forum_id)) ? utf8_normalize_nfc(request_var('edit_reason', '', true)) : '';
639
640
        $post_data['orig_topic_type']        = $post_data['topic_type'];
641
        $post_data['topic_type']                = request_var('topic_type', (($mode != 'post') ? (int) $post_data['topic_type'] : POST_NORMAL));
642
        $post_data['topic_time_limit']        = request_var('topic_time_limit', (($mode != 'post') ? (int) $post_data['topic_time_limit'] : 0));
643
644
        if ($post_data['enable_icons'] && $auth->acl_get('f_icons', $forum_id))
645
        {
646
                $post_data['icon_id'] = request_var('icon', (int) $post_data['icon_id']);
647
        }
648
649
        $post_data['enable_bbcode']                = (!$bbcode_status || isset($_POST['disable_bbcode'])) ? false : true;
650
        $post_data['enable_smilies']        = (!$smilies_status || isset($_POST['disable_smilies'])) ? false : true;
651
        $post_data['enable_urls']                = (isset($_POST['disable_magic_url'])) ? 0 : 1;
652
        $post_data['enable_sig']                = (!$config['allow_sig'] || !$auth->acl_get('f_sigs', $forum_id) || !$auth->acl_get('u_sig')) ? false : ((isset($_POST['attach_sig']) && $user->data['is_registered']) ? true : false);
653
654
        if ($config['allow_topic_notify'] && $user->data['is_registered'])
655
        {
656
                $notify = (isset($_POST['notify'])) ? true : false;
657
        }
658
        else
659
        {
660
                $notify = false;
661
        }
662
663
        $topic_lock                        = (isset($_POST['lock_topic'])) ? true : false;
664
        $post_lock                        = (isset($_POST['lock_post'])) ? true : false;
665
        $poll_delete                = (isset($_POST['poll_delete'])) ? true : false;
666
667
        if ($submit)
668
        {
669
                $status_switch = (($post_data['enable_bbcode']+1) << 8) + (($post_data['enable_smilies']+1) << 4) + (($post_data['enable_urls']+1) << 2) + (($post_data['enable_sig']+1) << 1);
670
                $status_switch = ($status_switch != $check_value);
671
        }
672
        else
673
        {
674
                $status_switch = 1;
675
        }
676
677
        // Delete Poll
678
        if ($poll_delete && $mode == 'edit' && sizeof($post_data['poll_options']) &&
679
                ((!$post_data['poll_last_vote'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) || $auth->acl_get('m_delete', $forum_id)))
680
        {
681
                if ($submit && check_form_key('posting'))
682
                {
683
                        $sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . "
684
                                WHERE topic_id = $topic_id";
685
                        $db->sql_query($sql);
686
687
                        $sql = 'DELETE FROM ' . POLL_VOTES_TABLE . "
688
                                WHERE topic_id = $topic_id";
689
                        $db->sql_query($sql);
690
691
                        $topic_sql = array(
692
                                'poll_title'                => '',
693
                                'poll_start'                 => 0,
694
                                'poll_length'                => 0,
695
                                'poll_last_vote'        => 0,
696
                                'poll_max_options'        => 0,
697
                                'poll_vote_change'        => 0
698
                        );
699
700
                        $sql = 'UPDATE ' . TOPICS_TABLE . '
701
                                SET ' . $db->sql_build_array('UPDATE', $topic_sql) . "
702
                                WHERE topic_id = $topic_id";
703
                        $db->sql_query($sql);
704
                }
705
706
                $post_data['poll_title'] = $post_data['poll_option_text'] = '';
707
                $post_data['poll_vote_change'] = $post_data['poll_max_options'] = $post_data['poll_length'] = 0;
708
        }
709
        else
710
        {
711
                $post_data['poll_title']                = utf8_normalize_nfc(request_var('poll_title', '', true));
712
                $post_data['poll_length']                = request_var('poll_length', 0);
713
                $post_data['poll_option_text']        = utf8_normalize_nfc(request_var('poll_option_text', '', true));
714
                $post_data['poll_max_options']        = request_var('poll_max_options', 1);
715
                $post_data['poll_vote_change']        = ($auth->acl_get('f_votechg', $forum_id) && $auth->acl_get('f_vote', $forum_id) && isset($_POST['poll_vote_change'])) ? 1 : 0;
716
        }
717
718
        // If replying/quoting and last post id has changed
719
        // give user option to continue submit or return to post
720
        // notify and show user the post made between his request and the final submit
721
        if (($mode == 'reply' || $mode == 'quote') && $post_data['topic_cur_post_id'] && $post_data['topic_cur_post_id'] != $post_data['topic_last_post_id'])
722
        {
723
                // Only do so if it is allowed forum-wide
724
                if ($post_data['forum_flags'] & FORUM_FLAG_POST_REVIEW)
725
                {
726
                        if (topic_review($topic_id, $forum_id, 'post_review', $post_data['topic_cur_post_id']))
727
                        {
728
                                $template->assign_var('S_POST_REVIEW', true);
729
                        }
730
731
                        $submit = false;
732
                        $refresh = true;
733
                }
734
        }
735
736
        // Parse Attachments - before checksum is calculated
737
        $message_parser->parse_attachments('fileupload', $mode, $forum_id, $submit, $preview, $refresh);
738
739
        // Grab md5 'checksum' of new message
740
        $message_md5 = md5($message_parser->message);
741
742
        // If editing and checksum has changed we know the post was edited while we're editing
743
        // Notify and show user the changed post
744
        if ($mode == 'edit' && $post_data['forum_flags'] & FORUM_FLAG_POST_REVIEW)
745
        {
746
                $edit_post_message_checksum = request_var('edit_post_message_checksum', '');
747
                $edit_post_subject_checksum = request_var('edit_post_subject_checksum', '');
748
749
                // $post_data['post_checksum'] is the checksum of the post submitted in the meantime
750
                // $message_md5 is the checksum of the post we're about to submit
751
                // $edit_post_message_checksum is the checksum of the post we're editing
752
                // ...
753
754
                // We make sure nobody else made exactly the same change
755
                // we're about to submit by also checking $message_md5 != $post_data['post_checksum']
756
                if (($edit_post_message_checksum !== '' && $edit_post_message_checksum != $post_data['post_checksum'] && $message_md5 != $post_data['post_checksum'])
757
                 || ($edit_post_subject_checksum !== '' && $edit_post_subject_checksum != $post_data['post_subject_md5'] && md5($post_data['post_subject']) != $post_data['post_subject_md5']))
758
                {
759
                        if (topic_review($topic_id, $forum_id, 'post_review_edit', $post_id))
760
                        {
761
                                $template->assign_vars(array(
762
                                        'S_POST_REVIEW'                        => true,
763
764
                                        'L_POST_REVIEW'                        => $user->lang['POST_REVIEW_EDIT'],
765
                                        'L_POST_REVIEW_EXPLAIN'        => $user->lang['POST_REVIEW_EDIT_EXPLAIN'],
766
                                ));
767
                        }
768
769
                        $submit = false;
770
                        $refresh = true;
771
                }
772
        }
773
774
        // Check checksum ... don't re-parse message if the same
775
        $update_message = ($mode != 'edit' || $message_md5 != $post_data['post_checksum'] || $status_switch || strlen($post_data['bbcode_uid']) < BBCODE_UID_LEN) ? true : false;
776
777
        // Also check if subject got updated...
778
        $update_subject = $mode != 'edit' || ($post_data['post_subject_md5'] && $post_data['post_subject_md5'] != md5($post_data['post_subject']));
779
780
        // Parse message
781
        if ($update_message)
782
        {
783
                if (sizeof($message_parser->warn_msg))
784
                {
785
                        $error[] = implode('<br />', $message_parser->warn_msg);
786
                        $message_parser->warn_msg = array();
787
                }
788
789
                $message_parser->parse($post_data['enable_bbcode'], ($config['allow_post_links']) ? $post_data['enable_urls'] : false, $post_data['enable_smilies'], $img_status, $flash_status, $quote_status, $config['allow_post_links']);
790
791
                // On a refresh we do not care about message parsing errors
792
                if (sizeof($message_parser->warn_msg) && $refresh)
793
                {
794
                        $message_parser->warn_msg = array();
795
                }
796
        }
797
        else
798
        {
799
                $message_parser->bbcode_bitfield = $post_data['bbcode_bitfield'];
800
        }
801
802
        if ($mode != 'edit' && !$preview && !$refresh && $config['flood_interval'] && !$auth->acl_get('f_ignoreflood', $forum_id))
803
        {
804
                // Flood check
805
                $last_post_time = 0;
806
807
                if ($user->data['is_registered'])
808
                {
809
                        $last_post_time = $user->data['user_lastpost_time'];
810
                }
811
                else
812
                {
813
                        $sql = 'SELECT post_time AS last_post_time
814
                                FROM ' . POSTS_TABLE . "
815
                                WHERE poster_ip = '" . $user->ip . "'
816
                                        AND post_time > " . ($current_time - $config['flood_interval']);
817
                        $result = $db->sql_query_limit($sql, 1);
818
                        if ($row = $db->sql_fetchrow($result))
819
                        {
820
                                $last_post_time = $row['last_post_time'];
821
                        }
822
                        $db->sql_freeresult($result);
823
                }
824
825
                if ($last_post_time && ($current_time - $last_post_time) < intval($config['flood_interval']))
826
                {
827
                        $error[] = $user->lang['FLOOD_ERROR'];
828
                }
829
        }
830
831
        // Validate username
832
        if (($post_data['username'] && !$user->data['is_registered']) || ($mode == 'edit' && $post_data['poster_id'] == ANONYMOUS && $post_data['username'] && $post_data['post_username'] && $post_data['post_username'] != $post_data['username']))
833
        {
834
                include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
835
836
                $user->add_lang('ucp');
837
838
                if (($result = validate_username($post_data['username'], (!empty($post_data['post_username'])) ? $post_data['post_username'] : '')) !== false)
839
                {
840
                        $error[] = $user->lang[$result . '_USERNAME'];
841
                }
842
843
                if (($result = validate_string($post_data['username'], false, $config['min_name_chars'], $config['max_name_chars'])) !== false)
844
                {
845
                        $min_max_amount = ($result == 'TOO_SHORT') ? $config['min_name_chars'] : $config['max_name_chars'];
846
                        $error[] = sprintf($user->lang['FIELD_' . $result], $user->lang['USERNAME'], $min_max_amount);
847
                }
848
        }
849
850
        if ($config['enable_post_confirm'] && !$user->data['is_registered'] && in_array($mode, array('quote', 'post', 'reply')))
851
        {
852
                $captcha_data = array(
853
                        'message'        => utf8_normalize_nfc(request_var('message', '', true)),
854
                        'subject'        => utf8_normalize_nfc(request_var('subject', '', true)),
855
                        'username'        => utf8_normalize_nfc(request_var('username', '', true)),
856
                );
857
                $vc_response = $captcha->validate($captcha_data);
858
                if ($vc_response)
859
                {
860
                        $error[] = $vc_response;
861
                }
862
        }
863
864
        // check form
865
        if (($submit || $preview) && !check_form_key('posting'))
866
        {
867
                $error[] = $user->lang['FORM_INVALID'];
868
        }
869
870
        // Parse subject
871
        if (!$preview && !$refresh && utf8_clean_string($post_data['post_subject']) === '' && ($mode == 'post' || ($mode == 'edit' && $post_data['topic_first_post_id'] == $post_id)))
872
        {
873
                $error[] = $user->lang['EMPTY_SUBJECT'];
874
        }
875
876
        $post_data['poll_last_vote'] = (isset($post_data['poll_last_vote'])) ? $post_data['poll_last_vote'] : 0;
877
878
        if ($post_data['poll_option_text'] &&
879
                ($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_post_id']/* && (!$post_data['poll_last_vote'] || $auth->acl_get('m_edit', $forum_id))*/))
880
                && $auth->acl_get('f_poll', $forum_id))
881
        {
882
                $poll = array(
883
                        'poll_title'                => $post_data['poll_title'],
884
                        'poll_length'                => $post_data['poll_length'],
885
                        'poll_max_options'        => $post_data['poll_max_options'],
886
                        'poll_option_text'        => $post_data['poll_option_text'],
887
                        'poll_start'                => $post_data['poll_start'],
888
                        'poll_last_vote'        => $post_data['poll_last_vote'],
889
                        'poll_vote_change'        => $post_data['poll_vote_change'],
890
                        'enable_bbcode'                => $post_data['enable_bbcode'],
891
                        'enable_urls'                => $post_data['enable_urls'],
892
                        'enable_smilies'        => $post_data['enable_smilies'],
893
                        'img_status'                => $img_status
894
                );
895
896
                $message_parser->parse_poll($poll);
897
898
                $post_data['poll_options'] = (isset($poll['poll_options'])) ? $poll['poll_options'] : array();
899
                $post_data['poll_title'] = (isset($poll['poll_title'])) ? $poll['poll_title'] : '';
900
901
                /* We reset votes, therefore also allow removing options
902
                if ($post_data['poll_last_vote'] && ($poll['poll_options_size'] < $orig_poll_options_size))
903
                {
904
                        $message_parser->warn_msg[] = $user->lang['NO_DELETE_POLL_OPTIONS'];
905
                }*/
906
        }
907
        else if ($mode == 'edit' && $post_id == $post_data['topic_first_post_id'] && $auth->acl_get('f_poll', $forum_id))
908
        {
909
                // The user removed all poll options, this is equal to deleting the poll.
910
                $poll = array(
911
                        'poll_title'                => '',
912
                        'poll_length'                => 0,
913
                        'poll_max_options'        => 0,
914
                        'poll_option_text'        => '',
915
                        'poll_start'                => 0,
916
                        'poll_last_vote'        => 0,
917
                        'poll_vote_change'        => 0,
918
                        'poll_options'                => array(),
919
                );
920
921
                $post_data['poll_options'] = array();
922
                $post_data['poll_title'] = '';
923
                $post_data['poll_start'] = $post_data['poll_length'] = $post_data['poll_max_options'] = $post_data['poll_last_vote'] = $post_data['poll_vote_change'] = 0;
924
        }
925
        else if (!$auth->acl_get('f_poll', $forum_id) && ($mode == 'edit') && ($post_id == $post_data['topic_first_post_id']) && ($original_poll_data['poll_title'] != ''))
926
        {
927
                // We have a poll but the editing user is not permitted to create/edit it.
928
                // So we just keep the original poll-data.
929
                $poll = array_merge($original_poll_data, array(
930
                        'enable_bbcode'                => $post_data['enable_bbcode'],
931
                        'enable_urls'                => $post_data['enable_urls'],
932
                        'enable_smilies'        => $post_data['enable_smilies'],
933
                        'img_status'                => $img_status,
934
                ));
935
936
                $message_parser->parse_poll($poll);
937
938
                $post_data['poll_options'] = (isset($poll['poll_options'])) ? $poll['poll_options'] : array();
939
                $post_data['poll_title'] = (isset($poll['poll_title'])) ? $poll['poll_title'] : '';
940
        }
941
        else
942
        {
943
                $poll = array();
944
        }
945
946
        // Check topic type
947
        if ($post_data['topic_type'] != POST_NORMAL && ($mode == 'post' || ($mode == 'edit' && $post_data['topic_first_post_id'] == $post_id)))
948
        {
949
                switch ($post_data['topic_type'])
950
                {
951
                        case POST_GLOBAL:
952
                        case POST_ANNOUNCE:
953
                                $auth_option = 'f_announce';
954
                        break;
955
956
                        case POST_STICKY:
957
                                $auth_option = 'f_sticky';
958
                        break;
959
960
                        default:
961
                                $auth_option = '';
962
                        break;
963
                }
964
965
                if (!$auth->acl_get($auth_option, $forum_id))
966
                {
967
                        // There is a special case where a user edits his post whereby the topic type got changed by an admin/mod.
968
                        // Another case would be a mod not having sticky permissions for example but edit permissions.
969
                        if ($mode == 'edit')
970
                        {
971
                                // To prevent non-authed users messing around with the topic type we reset it to the original one.
972
                                $post_data['topic_type'] = $post_data['orig_topic_type'];
973
                        }
974
                        else
975
                        {
976
                                $error[] = $user->lang['CANNOT_POST_' . str_replace('F_', '', strtoupper($auth_option))];
977
                        }
978
                }
979
        }
980
981
        if (sizeof($message_parser->warn_msg))
982
        {
983
                $error[] = implode('<br />', $message_parser->warn_msg);
984
        }
985
986
        // DNSBL check
987
        if ($config['check_dnsbl'] && !$refresh)
988
        {
989
                if (($dnsbl = $user->check_dnsbl('post')) !== false)
990
                {
991
                        $error[] = sprintf($user->lang['IP_BLACKLISTED'], $user->ip, $dnsbl[1]);
992
                }
993
        }
994
995
        // Store message, sync counters
996
        if (!sizeof($error) && $submit)
997
        {
998
                // Check if we want to de-globalize the topic... and ask for new forum
999
                if ($post_data['topic_type'] != POST_GLOBAL)
1000
                {
1001
                        $sql = 'SELECT topic_type, forum_id
1002
                                FROM ' . TOPICS_TABLE . "
1003
                                WHERE topic_id = $topic_id";
1004
                        $result = $db->sql_query($sql);
1005
                        $row = $db->sql_fetchrow($result);
1006
                        $db->sql_freeresult($result);
1007
1008
                        if ($row && !$row['forum_id'] && $row['topic_type'] == POST_GLOBAL)
1009
                        {
1010
                                $to_forum_id = request_var('to_forum_id', 0);
1011
1012
                                if ($to_forum_id)
1013
                                {
1014
                                        $sql = 'SELECT forum_type
1015
                                                FROM ' . FORUMS_TABLE . '
1016
                                                WHERE forum_id = ' . $to_forum_id;
1017
                                        $result = $db->sql_query($sql);
1018
                                        $forum_type = (int) $db->sql_fetchfield('forum_type');
1019
                                        $db->sql_freeresult($result);
1020
1021
                                        if ($forum_type != FORUM_POST || !$auth->acl_get('f_post', $to_forum_id) || (!$auth->acl_get('m_approve', $to_forum_id) && !$auth->acl_get('f_noapprove', $to_forum_id)))
1022
                                        {
1023
                                                $to_forum_id = 0;
1024
                                        }
1025
                                }
1026
1027
                                if (!$to_forum_id)
1028
                                {
1029
                                        include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
1030
1031
                                        $template->assign_vars(array(
1032
                                                'S_FORUM_SELECT'        => make_forum_select(false, false, false, true, true, true),
1033
                                                'S_UNGLOBALISE'                => true)
1034
                                        );
1035
1036
                                        $submit = false;
1037
                                        $refresh = true;
1038
                                }
1039
                                else
1040
                                {
1041
                                        if (!$auth->acl_get('f_post', $to_forum_id))
1042
                                        {
1043
                                                // This will only be triggered if the user tried to trick the forum.
1044
                                                trigger_error('NOT_AUTHORISED');
1045
                                        }
1046
1047
                                        $forum_id = $to_forum_id;
1048
                                }
1049
                        }
1050
                }
1051
1052
                if ($submit)
1053
                {
1054
                        // Lock/Unlock Topic
1055
                        $change_topic_status = $post_data['topic_status'];
1056
                        $perm_lock_unlock = ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && !empty($post_data['topic_poster']) && $user->data['user_id'] == $post_data['topic_poster'] && $post_data['topic_status'] == ITEM_UNLOCKED)) ? true : false;
1057
1058
                        if ($post_data['topic_status'] == ITEM_LOCKED && !$topic_lock && $perm_lock_unlock)
1059
                        {
1060
                                $change_topic_status = ITEM_UNLOCKED;
1061
                        }
1062
                        else if ($post_data['topic_status'] == ITEM_UNLOCKED && $topic_lock && $perm_lock_unlock)
1063
                        {
1064
                                $change_topic_status = ITEM_LOCKED;
1065
                        }
1066
1067
                        if ($change_topic_status != $post_data['topic_status'])
1068
                        {
1069
                                $sql = 'UPDATE ' . TOPICS_TABLE . "
1070
                                        SET topic_status = $change_topic_status
1071
                                        WHERE topic_id = $topic_id
1072
                                                AND topic_moved_id = 0";
1073
                                $db->sql_query($sql);
1074
1075
                                $user_lock = ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $post_data['topic_poster']) ? 'USER_' : '';
1076
1077
                                add_log('mod', $forum_id, $topic_id, 'LOG_' . $user_lock . (($change_topic_status == ITEM_LOCKED) ? 'LOCK' : 'UNLOCK'), $post_data['topic_title']);
1078
                        }
1079
1080
                        // Lock/Unlock Post Edit
1081
                        if ($mode == 'edit' && $post_data['post_edit_locked'] == ITEM_LOCKED && !$post_lock && $auth->acl_get('m_edit', $forum_id))
1082
                        {
1083
                                $post_data['post_edit_locked'] = ITEM_UNLOCKED;
1084
                        }
1085
                        else if ($mode == 'edit' && $post_data['post_edit_locked'] == ITEM_UNLOCKED && $post_lock && $auth->acl_get('m_edit', $forum_id))
1086
                        {
1087
                                $post_data['post_edit_locked'] = ITEM_LOCKED;
1088
                        }
1089
1090
                        $data = array(
1091
                                'topic_title'                        => (empty($post_data['topic_title'])) ? $post_data['post_subject'] : $post_data['topic_title'],
1092
                                'topic_first_post_id'        => (isset($post_data['topic_first_post_id'])) ? (int) $post_data['topic_first_post_id'] : 0,
1093
                                'topic_last_post_id'        => (isset($post_data['topic_last_post_id'])) ? (int) $post_data['topic_last_post_id'] : 0,
1094
                                'topic_time_limit'                => (int) $post_data['topic_time_limit'],
1095
                                'topic_attachment'                => (isset($post_data['topic_attachment'])) ? (int) $post_data['topic_attachment'] : 0,
1096
                                'post_id'                                => (int) $post_id,
1097
                                'topic_id'                                => (int) $topic_id,
1098
                                'forum_id'                                => (int) $forum_id,
1099
                                'icon_id'                                => (int) $post_data['icon_id'],
1100
                                'poster_id'                                => (int) $post_data['poster_id'],
1101
                                'enable_sig'                        => (bool) $post_data['enable_sig'],
1102
                                'enable_bbcode'                        => (bool) $post_data['enable_bbcode'],
1103
                                'enable_smilies'                => (bool) $post_data['enable_smilies'],
1104
                                'enable_urls'                        => (bool) $post_data['enable_urls'],
1105
                                'enable_indexing'                => (bool) $post_data['enable_indexing'],
1106
                                'message_md5'                        => (string) $message_md5,
1107
                                'post_time'                                => (isset($post_data['post_time'])) ? (int) $post_data['post_time'] : $current_time,
1108
                                'post_checksum'                        => (isset($post_data['post_checksum'])) ? (string) $post_data['post_checksum'] : '',
1109
                                'post_edit_reason'                => $post_data['post_edit_reason'],
1110
                                'post_edit_user'                => ($mode == 'edit') ? $user->data['user_id'] : ((isset($post_data['post_edit_user'])) ? (int) $post_data['post_edit_user'] : 0),
1111
                                'forum_parents'                        => $post_data['forum_parents'],
1112
                                'forum_name'                        => $post_data['forum_name'],
1113
                                'notify'                                => $notify,
1114
                                'notify_set'                        => $post_data['notify_set'],
1115
                                'poster_ip'                                => (isset($post_data['poster_ip'])) ? $post_data['poster_ip'] : $user->ip,
1116
                                'post_edit_locked'                => (int) $post_data['post_edit_locked'],
1117
                                'bbcode_bitfield'                => $message_parser->bbcode_bitfield,
1118
                                'bbcode_uid'                        => $message_parser->bbcode_uid,
1119
                                'message'                                => $message_parser->message,
1120
                                'attachment_data'                => $message_parser->attachment_data,
1121
                                'filename_data'                        => $message_parser->filename_data,
1122
1123
                                'topic_approved'                => (isset($post_data['topic_approved'])) ? $post_data['topic_approved'] : false,
1124
                                'post_approved'                        => (isset($post_data['post_approved'])) ? $post_data['post_approved'] : false,
1125
                        );
1126
1127
                        if ($mode == 'edit')
1128
                        {
1129
                                $data['topic_replies_real'] = $post_data['topic_replies_real'];
1130
                                $data['topic_replies'] = $post_data['topic_replies'];
1131
                        }
1132
1133
                        // The last parameter tells submit_post if search indexer has to be run
1134
                        $redirect_url = submit_post($mode, $post_data['post_subject'], $post_data['username'], $post_data['topic_type'], $poll, $data, $update_message, ($update_message || $update_subject) ? true : false);
1135
1136
                        if ($config['enable_post_confirm'] && !$user->data['is_registered'] && (isset($captcha) && $captcha->is_solved() === true) && ($mode == 'post' || $mode == 'reply' || $mode == 'quote'))
1137
                        {
1138
                                $captcha->reset();
1139
                        }
1140
1141
                        // Check the permissions for post approval. Moderators are not affected.
1142
                        if ((!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id']) && empty($data['force_approved_state'])) || (isset($data['force_approved_state']) && !$data['force_approved_state']))
1143
                        {
1144
                                meta_refresh(10, $redirect_url);
1145
                                $message = ($mode == 'edit') ? $user->lang['POST_EDITED_MOD'] : $user->lang['POST_STORED_MOD'];
1146
                                $message .= (($user->data['user_id'] == ANONYMOUS) ? '' : ' '. $user->lang['POST_APPROVAL_NOTIFY']);
1147
                        }
1148
                        else
1149
                        {
1150
                                meta_refresh(3, $redirect_url);
1151
1152
                                $message = ($mode == 'edit') ? 'POST_EDITED' : 'POST_STORED';
1153
                                $message = $user->lang[$message] . '<br /><br />' . sprintf($user->lang['VIEW_MESSAGE'], '<a href="' . $redirect_url . '">', '</a>');
1154
                        }
1155
1156
                        $message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $data['forum_id']) . '">', '</a>');
1157
                        trigger_error($message);
1158
                }
1159
        }
1160
}
1161
1162
// Preview
1163
if (!sizeof($error) && $preview)
1164
{
1165
        $post_data['post_time'] = ($mode == 'edit') ? $post_data['post_time'] : $current_time;
1166
1167
        $preview_message = $message_parser->format_display($post_data['enable_bbcode'], $post_data['enable_urls'], $post_data['enable_smilies'], false);
1168
1169
        $preview_signature = ($mode == 'edit') ? $post_data['user_sig'] : $user->data['user_sig'];
1170
        $preview_signature_uid = ($mode == 'edit') ? $post_data['user_sig_bbcode_uid'] : $user->data['user_sig_bbcode_uid'];
1171
        $preview_signature_bitfield = ($mode == 'edit') ? $post_data['user_sig_bbcode_bitfield'] : $user->data['user_sig_bbcode_bitfield'];
1172
1173
        // Signature
1174
        if ($post_data['enable_sig'] && $config['allow_sig'] && $preview_signature && $auth->acl_get('f_sigs', $forum_id))
1175
        {
1176
                $parse_sig = new parse_message($preview_signature);
1177
                $parse_sig->bbcode_uid = $preview_signature_uid;
1178
                $parse_sig->bbcode_bitfield = $preview_signature_bitfield;
1179
1180
                // Not sure about parameters for bbcode/smilies/urls... in signatures
1181
                $parse_sig->format_display($config['allow_sig_bbcode'], $config['allow_sig_links'], $config['allow_sig_smilies']);
1182
                $preview_signature = $parse_sig->message;
1183
                unset($parse_sig);
1184
        }
1185
        else
1186
        {
1187
                $preview_signature = '';
1188
        }
1189
1190
        $preview_subject = censor_text($post_data['post_subject']);
1191
1192
        // Poll Preview
1193
        if (!$poll_delete && ($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_post_id']/* && (!$post_data['poll_last_vote'] || $auth->acl_get('m_edit', $forum_id))*/))
1194
        && $auth->acl_get('f_poll', $forum_id))
1195
        {
1196
                $parse_poll = new parse_message($post_data['poll_title']);
1197
                $parse_poll->bbcode_uid = $message_parser->bbcode_uid;
1198
                $parse_poll->bbcode_bitfield = $message_parser->bbcode_bitfield;
1199
1200
                $parse_poll->format_display($post_data['enable_bbcode'], $post_data['enable_urls'], $post_data['enable_smilies']);
1201
1202
                if ($post_data['poll_length'])
1203
                {
1204
                        $poll_end = ($post_data['poll_length'] * 86400) + (($post_data['poll_start']) ? $post_data['poll_start'] : time());
1205
                }
1206
1207
                $template->assign_vars(array(
1208
                        'S_HAS_POLL_OPTIONS'        => (sizeof($post_data['poll_options'])),
1209
                        'S_IS_MULTI_CHOICE'                => ($post_data['poll_max_options'] > 1) ? true : false,
1210
1211
                        'POLL_QUESTION'                => $parse_poll->message,
1212
1213
                        'L_POLL_LENGTH'                => ($post_data['poll_length']) ? sprintf($user->lang['POLL_RUN_TILL'], $user->format_date($poll_end)) : '',
1214
                        'L_MAX_VOTES'                => ($post_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $post_data['poll_max_options']))
1215
                );
1216
1217
                $parse_poll->message = implode("\n", $post_data['poll_options']);
1218
                $parse_poll->format_display($post_data['enable_bbcode'], $post_data['enable_urls'], $post_data['enable_smilies']);
1219
                $preview_poll_options = explode('<br />', $parse_poll->message);
1220
                unset($parse_poll);
1221
1222
                foreach ($preview_poll_options as $key => $option)
1223
                {
1224
                        $template->assign_block_vars('poll_option', array(
1225
                                'POLL_OPTION_CAPTION'        => $option,
1226
                                'POLL_OPTION_ID'                => $key + 1)
1227
                        );
1228
                }
1229
                unset($preview_poll_options);
1230
        }
1231
1232
        // Attachment Preview
1233
        if (sizeof($message_parser->attachment_data))
1234
        {
1235
                $template->assign_var('S_HAS_ATTACHMENTS', true);
1236
1237
                $update_count = array();
1238
                $attachment_data = $message_parser->attachment_data;
1239
1240
                parse_attachments($forum_id, $preview_message, $attachment_data, $update_count, true);
1241
1242
                foreach ($attachment_data as $i => $attachment)
1243
                {
1244
                        $template->assign_block_vars('attachment', array(
1245
                                'DISPLAY_ATTACHMENT'        => $attachment)
1246
                        );
1247
                }
1248
                unset($attachment_data);
1249
        }
1250
1251
        if (!sizeof($error))
1252
        {
1253
                $template->assign_vars(array(
1254
                        'PREVIEW_SUBJECT'                => $preview_subject,
1255
                        'PREVIEW_MESSAGE'                => $preview_message,
1256
                        'PREVIEW_SIGNATURE'                => $preview_signature,
1257
1258
                        'S_DISPLAY_PREVIEW'                => true)
1259
                );
1260
        }
1261
}
1262
1263
// Decode text for message display
1264
$post_data['bbcode_uid'] = ($mode == 'quote' && !$preview && !$refresh && !sizeof($error)) ? $post_data['bbcode_uid'] : $message_parser->bbcode_uid;
1265
$message_parser->decode_message($post_data['bbcode_uid']);
1266
1267
if ($mode == 'quote' && !$submit && !$preview && !$refresh)
1268
{
1269
        if ($config['allow_bbcode'])
1270
        {
1271
                $message_parser->message = '[quote=&quot;' . $post_data['quote_username'] . '&quot;]' . censor_text(trim($message_parser->message)) . "[/quote]\n";
1272
        }
1273
        else
1274
        {
1275
                $offset = 0;
1276
                $quote_string = "&gt; ";
1277
                $message = censor_text(trim($message_parser->message));
1278
                // see if we are nesting. It's easily tricked but should work for one level of nesting
1279
                if (strpos($message, "&gt;") !== false)
1280
                {
1281
                        $offset = 10;
1282
                }
1283
                $message = utf8_wordwrap($message, 75 + $offset, "\n");
1284
1285
                $message = $quote_string . $message;
1286
                $message = str_replace("\n", "\n" . $quote_string, $message);
1287
                $message_parser->message =  $post_data['quote_username'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n";
1288
        }
1289
}
1290
1291
if (($mode == 'reply' || $mode == 'quote') && !$submit && !$preview && !$refresh)
1292
{
1293
        $post_data['post_subject'] = ((strpos($post_data['post_subject'], 'Re: ') !== 0) ? 'Re: ' : '') . censor_text($post_data['post_subject']);
1294
}
1295
1296
$attachment_data = $message_parser->attachment_data;
1297
$filename_data = $message_parser->filename_data;
1298
$post_data['post_text'] = $message_parser->message;
1299
1300
if (sizeof($post_data['poll_options']) || !empty($post_data['poll_title']))
1301
{
1302
        $message_parser->message = $post_data['poll_title'];
1303
        $message_parser->bbcode_uid = $post_data['bbcode_uid'];
1304
1305
        $message_parser->decode_message();
1306
        $post_data['poll_title'] = $message_parser->message;
1307
1308
        $message_parser->message = implode("\n", $post_data['poll_options']);
1309
        $message_parser->decode_message();
1310
        $post_data['poll_options'] = explode("\n", $message_parser->message);
1311
}
1312
1313
// MAIN POSTING PAGE BEGINS HERE
1314
1315
// Forum moderators?
1316
$moderators = array();
1317
if ($config['load_moderators'])
1318
{
1319
        get_moderators($moderators, $forum_id);
1320
}
1321
1322
// Generate smiley listing
1323
generate_smilies('inline', $forum_id);
1324
1325
// Generate inline attachment select box
1326
posting_gen_inline_attachments($attachment_data);
1327
1328
// Do show topic type selection only in first post.
1329
$topic_type_toggle = false;
1330
1331
if ($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_post_id']))
1332
{
1333
        $topic_type_toggle = posting_gen_topic_types($forum_id, $post_data['topic_type']);
1334
}
1335
1336
$s_topic_icons = false;
1337
if ($post_data['enable_icons'] && $auth->acl_get('f_icons', $forum_id))
1338
{
1339
        $s_topic_icons = posting_gen_topic_icons($mode, $post_data['icon_id']);
1340
}
1341
1342
$bbcode_checked                = (isset($post_data['enable_bbcode'])) ? !$post_data['enable_bbcode'] : (($config['allow_bbcode']) ? !$user->optionget('bbcode') : 1);
1343
$smilies_checked        = (isset($post_data['enable_smilies'])) ? !$post_data['enable_smilies'] : (($config['allow_smilies']) ? !$user->optionget('smilies') : 1);
1344
$urls_checked                = (isset($post_data['enable_urls'])) ? !$post_data['enable_urls'] : 0;
1345
$sig_checked                = $post_data['enable_sig'];
1346
$lock_topic_checked        = (isset($topic_lock) && $topic_lock) ? $topic_lock : (($post_data['topic_status'] == ITEM_LOCKED) ? 1 : 0);
1347
$lock_post_checked        = (isset($post_lock)) ? $post_lock : $post_data['post_edit_locked'];
1348
1349
// If the user is replying or posting and not already watching this topic but set to always being notified we need to overwrite this setting
1350
$notify_set                        = ($mode != 'edit' && $config['allow_topic_notify'] && $user->data['is_registered'] && !$post_data['notify_set']) ? $user->data['user_notify'] : $post_data['notify_set'];
1351
$notify_checked                = (isset($notify)) ? $notify : (($mode == 'post') ? $user->data['user_notify'] : $notify_set);
1352
1353
// Page title & action URL
1354
$s_action = append_sid("{$phpbb_root_path}posting.$phpEx", "mode=$mode&amp;f=$forum_id");
1355
$s_action .= ($topic_id) ? "&amp;t=$topic_id" : '';
1356
$s_action .= ($post_id) ? "&amp;p=$post_id" : '';
1357
1358
switch ($mode)
1359
{
1360
        case 'post':
1361
                $page_title = $user->lang['POST_TOPIC'];
1362
        break;
1363
1364
        case 'quote':
1365
        case 'reply':
1366
                $page_title = $user->lang['POST_REPLY'];
1367
        break;
1368
1369
        case 'delete':
1370
        case 'edit':
1371
                $page_title = $user->lang['EDIT_POST'];
1372
        break;
1373
}
1374
1375
// Build Navigation Links
1376
generate_forum_nav($post_data);
1377
1378
// Build Forum Rules
1379
generate_forum_rules($post_data);
1380
1381
// Posting uses is_solved for legacy reasons. Plugins have to use is_solved to force themselves to be displayed.
1382
if ($config['enable_post_confirm'] && !$user->data['is_registered'] && (isset($captcha) && $captcha->is_solved() === false) && ($mode == 'post' || $mode == 'reply' || $mode == 'quote'))
1383
{
1384
1385
        $template->assign_vars(array(
1386
                'S_CONFIRM_CODE'                        => true,
1387
                'CAPTCHA_TEMPLATE'                        => $captcha->get_template(),
1388
        ));
1389
}
1390
1391
$s_hidden_fields = ($mode == 'reply' || $mode == 'quote') ? '<input type="hidden" name="topic_cur_post_id" value="' . $post_data['topic_last_post_id'] . '" />' : '';
1392
$s_hidden_fields .= '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
1393
$s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . request_var('draft_loaded', $draft_id) . '" />' : '';
1394
1395
if ($mode == 'edit')
1396
{
1397
        $s_hidden_fields .= build_hidden_fields(array(
1398
                'edit_post_message_checksum'        => $post_data['post_checksum'],
1399
                'edit_post_subject_checksum'        => $post_data['post_subject_md5'],
1400
        ));
1401
}
1402
1403
// Add the confirm id/code pair to the hidden fields, else an error is displayed on next submit/preview
1404
if (isset($captcha) && $captcha->is_solved() !== false)
1405
{
1406
        $s_hidden_fields .= build_hidden_fields($captcha->get_hidden_fields());
1407
}
1408
1409
$form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_attachments'] || !$auth->acl_get('u_attach') || !$auth->acl_get('f_attach', $forum_id)) ? '' : ' enctype="multipart/form-data"';
1410
add_form_key('posting');
1411
1412
1413
// Start assigning vars for main posting page ...
1414
$template->assign_vars(array(
1415
        'L_POST_A'                                        => $page_title,
1416
        'L_ICON'                                        => ($mode == 'reply' || $mode == 'quote' || ($mode == 'edit' && $post_id != $post_data['topic_first_post_id'])) ? $user->lang['POST_ICON'] : $user->lang['TOPIC_ICON'],
1417
        'L_MESSAGE_BODY_EXPLAIN'        => (intval($config['max_post_chars'])) ? sprintf($user->lang['MESSAGE_BODY_EXPLAIN'], intval($config['max_post_chars'])) : '',
1418
1419
        'FORUM_NAME'                        => $post_data['forum_name'],
1420
        'FORUM_DESC'                        => ($post_data['forum_desc']) ? generate_text_for_display($post_data['forum_desc'], $post_data['forum_desc_uid'], $post_data['forum_desc_bitfield'], $post_data['forum_desc_options']) : '',
1421
        'TOPIC_TITLE'                        => censor_text($post_data['topic_title']),
1422
        'MODERATORS'                        => (sizeof($moderators)) ? implode(', ', $moderators[$forum_id]) : '',
1423
        'USERNAME'                                => ((!$preview && $mode != 'quote') || $preview) ? $post_data['username'] : '',
1424
        'SUBJECT'                                => $post_data['post_subject'],
1425
        'MESSAGE'                                => $post_data['post_text'],
1426
        'BBCODE_STATUS'                        => ($bbcode_status) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
1427
        'IMG_STATUS'                        => ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
1428
        'FLASH_STATUS'                        => ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
1429
        'SMILIES_STATUS'                => ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
1430
        'URL_STATUS'                        => ($bbcode_status && $url_status) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'],
1431
        'MAX_FONT_SIZE'                        => (int) $config['max_post_font_size'],
1432
        'MINI_POST_IMG'                        => $user->img('icon_post_target', $user->lang['POST']),
1433
        'POST_DATE'                                => ($post_data['post_time']) ? $user->format_date($post_data['post_time']) : '',
1434
        'ERROR'                                        => (sizeof($error)) ? implode('<br />', $error) : '',
1435
        'TOPIC_TIME_LIMIT'                => (int) $post_data['topic_time_limit'],
1436
        'EDIT_REASON'                        => $post_data['post_edit_reason'],
1437
        'U_VIEW_FORUM'                        => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id"),
1438
        'U_VIEW_TOPIC'                        => ($mode != 'post') ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id") : '',
1439
        'U_PROGRESS_BAR'                => append_sid("{$phpbb_root_path}posting.$phpEx", "f=$forum_id&amp;mode=popup"),
1440
        'UA_PROGRESS_BAR'                => addslashes(append_sid("{$phpbb_root_path}posting.$phpEx", "f=$forum_id&amp;mode=popup")),
1441
1442
        'S_PRIVMSGS'                                => false,
1443
        'S_CLOSE_PROGRESS_WINDOW'        => (isset($_POST['add_file'])) ? true : false,
1444
        'S_EDIT_POST'                                => ($mode == 'edit') ? true : false,
1445
        'S_EDIT_REASON'                                => ($mode == 'edit' && $auth->acl_get('m_edit', $forum_id)) ? true : false,
1446
        'S_DISPLAY_USERNAME'                => (!$user->data['is_registered'] || ($mode == 'edit' && $post_data['poster_id'] == ANONYMOUS)) ? true : false,
1447
        'S_SHOW_TOPIC_ICONS'                => $s_topic_icons,
1448
        'S_DELETE_ALLOWED'                        => ($mode == 'edit' && (($post_id == $post_data['topic_last_post_id'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id) && !$post_data['post_edit_locked'] && ($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])) || $auth->acl_get('m_delete', $forum_id))) ? true : false,
1449
        'S_BBCODE_ALLOWED'                        => ($bbcode_status) ? 1 : 0,
1450
        'S_BBCODE_CHECKED'                        => ($bbcode_checked) ? ' checked="checked"' : '',
1451
        'S_SMILIES_ALLOWED'                        => $smilies_status,
1452
        'S_SMILIES_CHECKED'                        => ($smilies_checked) ? ' checked="checked"' : '',
1453
        'S_SIG_ALLOWED'                                => ($auth->acl_get('f_sigs', $forum_id) && $config['allow_sig'] && $user->data['is_registered']) ? true : false,
1454
        'S_SIGNATURE_CHECKED'                => ($sig_checked) ? ' checked="checked"' : '',
1455
        'S_NOTIFY_ALLOWED'                        => (!$user->data['is_registered'] || ($mode == 'edit' && $user->data['user_id'] != $post_data['poster_id']) || !$config['allow_topic_notify'] || !$config['email_enable']) ? false : true,
1456
        'S_NOTIFY_CHECKED'                        => ($notify_checked) ? ' checked="checked"' : '',
1457
        'S_LOCK_TOPIC_ALLOWED'                => (($mode == 'edit' || $mode == 'reply' || $mode == 'quote') && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && !empty($post_data['topic_poster']) && $user->data['user_id'] == $post_data['topic_poster'] && $post_data['topic_status'] == ITEM_UNLOCKED))) ? true : false,
1458
        'S_LOCK_TOPIC_CHECKED'                => ($lock_topic_checked) ? ' checked="checked"' : '',
1459
        'S_LOCK_POST_ALLOWED'                => ($mode == 'edit' && $auth->acl_get('m_edit', $forum_id)) ? true : false,
1460
        'S_LOCK_POST_CHECKED'                => ($lock_post_checked) ? ' checked="checked"' : '',
1461
        'S_LINKS_ALLOWED'                        => $url_status,
1462
        'S_MAGIC_URL_CHECKED'                => ($urls_checked) ? ' checked="checked"' : '',
1463
        'S_TYPE_TOGGLE'                                => $topic_type_toggle,
1464
        'S_SAVE_ALLOWED'                        => ($auth->acl_get('u_savedrafts') && $user->data['is_registered'] && $mode != 'edit') ? true : false,
1465
        'S_HAS_DRAFTS'                                => ($auth->acl_get('u_savedrafts') && $user->data['is_registered'] && $post_data['drafts']) ? true : false,
1466
        'S_FORM_ENCTYPE'                        => $form_enctype,
1467
1468
        'S_BBCODE_IMG'                        => $img_status,
1469
        'S_BBCODE_URL'                        => $url_status,
1470
        'S_BBCODE_FLASH'                => $flash_status,
1471
        'S_BBCODE_QUOTE'                => $quote_status,
1472
1473
        'S_POST_ACTION'                        => $s_action,
1474
        'S_HIDDEN_FIELDS'                => $s_hidden_fields)
1475
);
1476
1477
// Build custom bbcodes array
1478
display_custom_bbcodes();
1479
1480
// Poll entry
1481
if (($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_post_id']/* && (!$post_data['poll_last_vote'] || $auth->acl_get('m_edit', $forum_id))*/))
1482
        && $auth->acl_get('f_poll', $forum_id))
1483
{
1484
        $template->assign_vars(array(
1485
                'S_SHOW_POLL_BOX'                => true,
1486
                'S_POLL_VOTE_CHANGE'        => ($auth->acl_get('f_votechg', $forum_id) && $auth->acl_get('f_vote', $forum_id)),
1487
                'S_POLL_DELETE'                        => ($mode == 'edit' && sizeof($post_data['poll_options']) && ((!$post_data['poll_last_vote'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) || $auth->acl_get('m_delete', $forum_id))),
1488
                'S_POLL_DELETE_CHECKED'        => (!empty($poll_delete)) ? true : false,
1489
1490
                'L_POLL_OPTIONS_EXPLAIN'        => sprintf($user->lang['POLL_OPTIONS_' . (($mode == 'edit') ? 'EDIT_' : '') . 'EXPLAIN'], $config['max_poll_options']),
1491
1492
                'VOTE_CHANGE_CHECKED'        => (!empty($post_data['poll_vote_change'])) ? ' checked="checked"' : '',
1493
                'POLL_TITLE'                        => (isset($post_data['poll_title'])) ? $post_data['poll_title'] : '',
1494
                'POLL_OPTIONS'                        => (!empty($post_data['poll_options'])) ? implode("\n", $post_data['poll_options']) : '',
1495
                'POLL_MAX_OPTIONS'                => (isset($post_data['poll_max_options'])) ? (int) $post_data['poll_max_options'] : 1,
1496
                'POLL_LENGTH'                        => $post_data['poll_length'])
1497
        );
1498
}
1499
1500
// Show attachment box for adding attachments if true
1501
$allowed = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && $config['allow_attachments'] && $form_enctype);
1502
1503
// Attachment entry
1504
posting_gen_attachment_entry($attachment_data, $filename_data, $allowed);
1505
1506
// Output page ...
1507
page_header($page_title, false);
1508
1509
$template->set_filenames(array(
1510
        'body' => 'posting_body.html')
1511
);
1512
1513
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
1514
1515
// Topic review
1516
if ($mode == 'reply' || $mode == 'quote')
1517
{
1518
        if (topic_review($topic_id, $forum_id))
1519
        {
1520
                $template->assign_var('S_DISPLAY_REVIEW', true);
1521
        }
1522
}
1523
1524
page_footer();
1525
1526
/**
1527
* Show upload popup (progress bar)
1528
*/
1529
function upload_popup($forum_style = 0)
1530
{
1531
        global $template, $user;
1532
1533
        ($forum_style) ? $user->setup('posting', $forum_style) : $user->setup('posting');
1534
1535
        page_header($user->lang['PROGRESS_BAR'], false);
1536
1537
        $template->set_filenames(array(
1538
                'popup'        => 'posting_progress_bar.html')
1539
        );
1540
1541
        $template->assign_vars(array(
1542
                'PROGRESS_BAR'        => $user->img('upload_bar', $user->lang['UPLOAD_IN_PROGRESS']))
1543
        );
1544
1545
        $template->display('popup');
1546
1547
        garbage_collection();
1548
        exit_handler();
1549
}
1550
1551
/**
1552
* Do the various checks required for removing posts as well as removing it
1553
*/
1554
function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data)
1555
{
1556
        global $user, $db, $auth, $config;
1557
        global $phpbb_root_path, $phpEx;
1558
1559
        // If moderator removing post or user itself removing post, present a confirmation screen
1560
        if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id) && $post_id == $post_data['topic_last_post_id'] && !$post_data['post_edit_locked'] && ($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])))
1561
        {
1562
                $s_hidden_fields = build_hidden_fields(array(
1563
                        'p'                => $post_id,
1564
                        'f'                => $forum_id,
1565
                        'mode'        => 'delete')
1566
                );
1567
1568
                if (confirm_box(true))
1569
                {
1570
                        $data = array(
1571
                                'topic_first_post_id'        => $post_data['topic_first_post_id'],
1572
                                'topic_last_post_id'        => $post_data['topic_last_post_id'],
1573
                                'topic_replies_real'        => $post_data['topic_replies_real'],
1574
                                'topic_approved'                => $post_data['topic_approved'],
1575
                                'topic_type'                        => $post_data['topic_type'],
1576
                                'post_approved'                        => $post_data['post_approved'],
1577
                                'post_reported'                        => $post_data['post_reported'],
1578
                                'post_time'                                => $post_data['post_time'],
1579
                                'poster_id'                                => $post_data['poster_id'],
1580
                                'post_postcount'                => $post_data['post_postcount']
1581
                        );
1582
1583
                        $next_post_id = delete_post($forum_id, $topic_id, $post_id, $data);
1584
                        $post_username = ($post_data['poster_id'] == ANONYMOUS && !empty($post_data['post_username'])) ? $post_data['post_username'] : $post_data['username'];
1585
1586
                        if ($next_post_id === false)
1587
                        {
1588
                                add_log('mod', $forum_id, $topic_id, 'LOG_DELETE_TOPIC', $post_data['topic_title'], $post_username);
1589
1590
                                $meta_info = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id");
1591
                                $message = $user->lang['POST_DELETED'];
1592
                        }
1593
                        else
1594
                        {
1595
                                add_log('mod', $forum_id, $topic_id, 'LOG_DELETE_POST', $post_data['post_subject'], $post_username);
1596
1597
                                $meta_info = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p=$next_post_id") . "#p$next_post_id";
1598
                                $message = $user->lang['POST_DELETED'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $meta_info . '">', '</a>');
1599
                        }
1600
1601
                        meta_refresh(3, $meta_info);
1602
                        $message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
1603
                        trigger_error($message);
1604
                }
1605
                else
1606
                {
1607
                        confirm_box(false, 'DELETE_POST', $s_hidden_fields);
1608
                }
1609
        }
1610
1611
        // If we are here the user is not able to delete - present the correct error message
1612
        if ($post_data['poster_id'] != $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id))
1613
        {
1614
                trigger_error('DELETE_OWN_POSTS');
1615
        }
1616
1617
        if ($post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id) && $post_id != $post_data['topic_last_post_id'])
1618
        {
1619
                trigger_error('CANNOT_DELETE_REPLIED');
1620
        }
1621
1622
        trigger_error('USER_CANNOT_DELETE');
1623
}
1624
1625
?>