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

« back to all changes in this revision

Viewing changes to www/php/phpBB3/mcp.php

Dispatch now generates an index for each plugin type, allowing plugins to
be written which are aware of other plugins, and other plugin types.

All view plugins now subclass from ivle.webapp.base.plugins.ViewPlugin,
as opposed to subclassing BasePlugin directly. This will allow us to
easily re-write console as an OverlayPlugin, and allow future new
plugins types to be created.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/**
 
3
*
 
4
* @package mcp
 
5
* @version $Id: mcp.php,v 1.138 2007/08/30 21:19:04 acydburn 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
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_admin.' . $phpEx);
 
19
require($phpbb_root_path . 'includes/functions_module.' . $phpEx);
 
20
 
 
21
// Start session management
 
22
$user->session_begin();
 
23
$auth->acl($user->data);
 
24
$user->setup('mcp');
 
25
 
 
26
$module = new p_master();
 
27
 
 
28
// Setting a variable to let the style designer know where he is...
 
29
$template->assign_var('S_IN_MCP', true);
 
30
 
 
31
// Basic parameter data
 
32
$id = request_var('i', '');
 
33
 
 
34
if (isset($_REQUEST['mode']) && is_array($_REQUEST['mode']))
 
35
{
 
36
        $mode = request_var('mode', array(''));
 
37
        list($mode, ) = each($mode);
 
38
}
 
39
else
 
40
{
 
41
        $mode = request_var('mode', '');
 
42
}
 
43
 
 
44
// Only Moderators can go beyond this point
 
45
if (!$user->data['is_registered'])
 
46
{
 
47
        if ($user->data['is_bot'])
 
48
        {
 
49
                redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
 
50
        }
 
51
 
 
52
        login_box('', $user->lang['LOGIN_EXPLAIN_MCP']);
 
53
}
 
54
 
 
55
$quickmod = (isset($_REQUEST['quickmod'])) ? true : false;
 
56
$action = request_var('action', '');
 
57
$action_ary = request_var('action', array('' => 0));
 
58
 
 
59
$forum_action = request_var('forum_action', '');
 
60
if ($forum_action !== '' && !empty($_POST['sort']))
 
61
{
 
62
        $action = $forum_action;
 
63
}
 
64
 
 
65
if (sizeof($action_ary))
 
66
{
 
67
        list($action, ) = each($action_ary);
 
68
}
 
69
unset($action_ary);
 
70
 
 
71
if ($mode == 'topic_logs')
 
72
{
 
73
        $id = 'logs';
 
74
        $quickmod = false;
 
75
}
 
76
 
 
77
$post_id = request_var('p', 0);
 
78
$topic_id = request_var('t', 0);
 
79
$forum_id = request_var('f', 0);
 
80
$user_id = request_var('u', 0);
 
81
$username = utf8_normalize_nfc(request_var('username', '', true));
 
82
 
 
83
if ($post_id)
 
84
{
 
85
        // We determine the topic and forum id here, to make sure the moderator really has moderative rights on this post
 
86
        $sql = 'SELECT topic_id, forum_id
 
87
                FROM ' . POSTS_TABLE . "
 
88
                WHERE post_id = $post_id";
 
89
        $result = $db->sql_query($sql);
 
90
        $row = $db->sql_fetchrow($result);
 
91
        $db->sql_freeresult($result);
 
92
 
 
93
        $topic_id = (int) $row['topic_id'];
 
94
        $forum_id = (int) ($row['forum_id']) ? $row['forum_id'] : $forum_id;
 
95
}
 
96
else if ($topic_id)
 
97
{
 
98
        $sql = 'SELECT forum_id
 
99
                FROM ' . TOPICS_TABLE . "
 
100
                WHERE topic_id = $topic_id";
 
101
        $result = $db->sql_query($sql);
 
102
        $row = $db->sql_fetchrow($result);
 
103
        $db->sql_freeresult($result);
 
104
 
 
105
        $forum_id = (int) $row['forum_id'];
 
106
}
 
107
 
 
108
// If the user doesn't have any moderator powers (globally or locally) he can't access the mcp
 
109
if (!$auth->acl_getf_global('m_'))
 
110
{
 
111
        // Except he is using one of the quickmod tools for users
 
112
        $user_quickmod_actions = array(
 
113
                'lock'                  => 'f_user_lock',
 
114
                'make_sticky'   => 'f_sticky',
 
115
                'make_announce' => 'f_announce',
 
116
                'make_global'   => 'f_announce',
 
117
                'make_normal'   => array('f_announce', 'f_sticky')
 
118
        );
 
119
 
 
120
        $allow_user = false;
 
121
        if ($quickmod && isset($user_quickmod_actions[$action]) && $user->data['is_registered'] && $auth->acl_gets($user_quickmod_actions[$action], $forum_id))
 
122
        {
 
123
                $topic_info = get_topic_data(array($topic_id));
 
124
                if ($topic_info[$topic_id]['topic_poster'] == $user->data['user_id'])
 
125
                {
 
126
                        $allow_user = true;
 
127
                }
 
128
        }
 
129
 
 
130
        if (!$allow_user)
 
131
        {
 
132
                trigger_error('NOT_AUTHORISED');
 
133
        }
 
134
}
 
135
 
 
136
// if the user cannot read the forum he tries to access then we won't allow mcp access either
 
137
if ($forum_id && !$auth->acl_get('f_read', $forum_id))
 
138
{
 
139
        trigger_error('NOT_AUTHORISED');
 
140
}
 
141
 
 
142
if ($forum_id)
 
143
{
 
144
        $module->acl_forum_id = $forum_id;
 
145
}
 
146
 
 
147
// Instantiate module system and generate list of available modules
 
148
$module->list_modules('mcp');
 
149
 
 
150
if ($quickmod)
 
151
{
 
152
        $mode = 'quickmod';
 
153
 
 
154
        switch ($action)
 
155
        {
 
156
                case 'lock':
 
157
                case 'unlock':
 
158
                case 'lock_post':
 
159
                case 'unlock_post':
 
160
                case 'make_sticky':
 
161
                case 'make_announce':
 
162
                case 'make_global':
 
163
                case 'make_normal':
 
164
                case 'fork':
 
165
                case 'move':
 
166
                case 'delete_post':
 
167
                case 'delete_topic':
 
168
                        $module->load('mcp', 'main', 'quickmod');
 
169
                        exit_handler();
 
170
                break;
 
171
 
 
172
                case 'topic_logs':
 
173
                        $module->set_active('logs', 'topic_logs');
 
174
                break;
 
175
 
 
176
                case 'merge_topic':
 
177
                        $module->set_active('main', 'forum_view');
 
178
                break;
 
179
 
 
180
                case 'split':
 
181
                case 'merge':
 
182
                        $module->set_active('main', 'topic_view');
 
183
                break;
 
184
 
 
185
                default:
 
186
                        trigger_error("$action not allowed as quickmod");
 
187
        }
 
188
}
 
189
else
 
190
{
 
191
        // Select the active module
 
192
        $module->set_active($id, $mode);
 
193
}
 
194
 
 
195
// Hide some of the options if we don't have the relevant information to use them
 
196
if (!$post_id)
 
197
{
 
198
        $module->set_display('main', 'post_details', false);
 
199
        $module->set_display('warn', 'warn_post', false);
 
200
}
 
201
 
 
202
if ($mode == '' || $mode == 'unapproved_topics' || $mode == 'unapproved_posts')
 
203
{
 
204
        $module->set_display('queue', 'approve_details', false);
 
205
}
 
206
 
 
207
if ($mode == '' || $mode == 'reports' || $mode == 'reports_closed')
 
208
{
 
209
        $module->set_display('reports', 'report_details', false);
 
210
}
 
211
 
 
212
if (!$topic_id)
 
213
{
 
214
        $module->set_display('main', 'topic_view', false);
 
215
        $module->set_display('logs', 'topic_logs', false);
 
216
}
 
217
 
 
218
if (!$forum_id)
 
219
{
 
220
        $module->set_display('main', 'forum_view', false);
 
221
        $module->set_display('logs', 'forum_logs', false);
 
222
}
 
223
 
 
224
if (!$user_id && $username == '')
 
225
{
 
226
        $module->set_display('notes', 'user_notes', false);
 
227
        $module->set_display('warn', 'warn_user', false);
 
228
}
 
229
 
 
230
// Load and execute the relevant module
 
231
$module->load_active();
 
232
 
 
233
// Assign data to the template engine for the list of modules
 
234
$module->assign_tpl_vars(append_sid("{$phpbb_root_path}mcp.$phpEx"));
 
235
 
 
236
// Generate urls for letting the moderation control panel being accessed in different modes
 
237
$template->assign_vars(array(
 
238
        'U_MCP'                 => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main'),
 
239
        'U_MCP_FORUM'   => ($forum_id) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=forum_view&amp;f=$forum_id") : '',
 
240
        'U_MCP_TOPIC'   => ($forum_id && $topic_id) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=topic_view&amp;t=$topic_id") : '',
 
241
        'U_MCP_POST'    => ($forum_id && $topic_id && $post_id) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=post_details&amp;t=$topic_id&amp;p=$post_id") : '',
 
242
));
 
243
 
 
244
// Generate the page, do not display/query online list
 
245
$module->display($module->get_page_title(), false);
 
246
 
 
247
/**
 
248
* Functions used to generate additional URL paramters
 
249
*/
 
250
function _module__url($mode, &$module_row)
 
251
{
 
252
        return extra_url();
 
253
}
 
254
 
 
255
function _module_notes_url($mode, &$module_row)
 
256
{
 
257
        if ($mode == 'front')
 
258
        {
 
259
                return '';
 
260
        }
 
261
 
 
262
        global $user_id;
 
263
        return ($user_id) ? "&amp;u=$user_id" : '';
 
264
}
 
265
 
 
266
function _module_warn_url($mode, &$module_row)
 
267
{
 
268
        if ($mode == 'front' || $mode == 'list')
 
269
        {
 
270
                global $forum_id;
 
271
 
 
272
                return ($forum_id) ? "&amp;f=$forum_id" : '';
 
273
        }
 
274
 
 
275
        if ($mode == 'warn_post')
 
276
        {
 
277
                global $forum_id, $post_id;
 
278
 
 
279
                $url_extra = ($forum_id) ? "&amp;f=$forum_id" : '';
 
280
                $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
 
281
 
 
282
                return $url_extra;
 
283
        }
 
284
        else
 
285
        {
 
286
                global $user_id;
 
287
 
 
288
                return ($user_id) ? "&amp;u=$user_id" : '';
 
289
        }
 
290
}
 
291
 
 
292
function _module_main_url($mode, &$module_row)
 
293
{
 
294
        return extra_url();
 
295
}
 
296
 
 
297
function _module_logs_url($mode, &$module_row)
 
298
{
 
299
        return extra_url();
 
300
}
 
301
 
 
302
function _module_ban_url($mode, &$module_row)
 
303
{
 
304
        return extra_url();
 
305
}
 
306
 
 
307
function _module_queue_url($mode, &$module_row)
 
308
{
 
309
        return extra_url();
 
310
}
 
311
 
 
312
function _module_reports_url($mode, &$module_row)
 
313
{
 
314
        return extra_url();
 
315
}
 
316
 
 
317
function extra_url()
 
318
{
 
319
        global $forum_id, $topic_id, $post_id, $user_id;
 
320
 
 
321
        $url_extra = '';
 
322
        $url_extra .= ($forum_id) ? "&amp;f=$forum_id" : '';
 
323
        $url_extra .= ($topic_id) ? "&amp;t=$topic_id" : '';
 
324
        $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
 
325
        $url_extra .= ($user_id) ? "&amp;u=$user_id" : '';
 
326
 
 
327
        return $url_extra;
 
328
}
 
329
 
 
330
/**
 
331
* Get simple topic data
 
332
*/
 
333
function get_topic_data($topic_ids, $acl_list = false, $read_tracking = false)
 
334
{
 
335
        global $auth, $db, $config, $user;
 
336
        static $rowset = array();
 
337
 
 
338
        $topics = array();
 
339
 
 
340
        if (!sizeof($topic_ids))
 
341
        {
 
342
                return array();
 
343
        }
 
344
 
 
345
        // cache might not contain read tracking info, so we can't use it if read
 
346
        // tracking information is requested
 
347
        if (!$read_tracking)
 
348
        {
 
349
                $cache_topic_ids = array_intersect($topic_ids, array_keys($rowset));
 
350
                $topic_ids = array_diff($topic_ids, array_keys($rowset));
 
351
        }
 
352
        else
 
353
        {
 
354
                $cache_topic_ids = array();
 
355
        }
 
356
 
 
357
        if (sizeof($topic_ids))
 
358
        {
 
359
                $sql_array = array(
 
360
                        'SELECT'        => 't.*, f.*',
 
361
 
 
362
                        'FROM'          => array(
 
363
                                TOPICS_TABLE    => 't',
 
364
                        ),
 
365
 
 
366
                        'LEFT_JOIN'     => array(
 
367
                                array(
 
368
                                        'FROM'  => array(FORUMS_TABLE => 'f'),
 
369
                                        'ON'    => 'f.forum_id = t.forum_id'
 
370
                                )
 
371
                        ),
 
372
 
 
373
                        'WHERE'         => $db->sql_in_set('t.topic_id', $topic_ids)
 
374
                );
 
375
 
 
376
                if ($read_tracking && $config['load_db_lastread'])
 
377
                {
 
378
                        $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
 
379
 
 
380
                        $sql_array['LEFT_JOIN'][] = array(
 
381
                                'FROM'  => array(TOPICS_TRACK_TABLE => 'tt'),
 
382
                                'ON'    => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
 
383
                        );
 
384
 
 
385
                        $sql_array['LEFT_JOIN'][] = array(
 
386
                                'FROM'  => array(FORUMS_TRACK_TABLE => 'ft'),
 
387
                                'ON'    => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
 
388
                        );
 
389
                }
 
390
 
 
391
                $sql = $db->sql_build_query('SELECT', $sql_array);
 
392
                $result = $db->sql_query($sql);
 
393
        
 
394
                while ($row = $db->sql_fetchrow($result))
 
395
                {
 
396
                        if (!$row['forum_id'])
 
397
                        {
 
398
                                // Global Announcement?
 
399
                                $row['forum_id'] = request_var('f', 0);
 
400
                        }
 
401
 
 
402
                        $rowset[$row['topic_id']] = $row;
 
403
 
 
404
                        if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
 
405
                        {
 
406
                                continue;
 
407
                        }
 
408
 
 
409
                        $topics[$row['topic_id']] = $row;
 
410
                }
 
411
                $db->sql_freeresult($result);
 
412
        }
 
413
 
 
414
        foreach ($cache_topic_ids as $id)
 
415
        {
 
416
                if (!$acl_list || $auth->acl_gets($acl_list, $rowset[$id]['forum_id']))
 
417
                {
 
418
                        $topics[$id] = $rowset[$id];
 
419
                }
 
420
        }
 
421
 
 
422
        return $topics;
 
423
}
 
424
 
 
425
/**
 
426
* Get simple post data
 
427
*/
 
428
function get_post_data($post_ids, $acl_list = false, $read_tracking = false)
 
429
{
 
430
        global $db, $auth, $config, $user;
 
431
 
 
432
        $rowset = array();
 
433
 
 
434
        if (!sizeof($post_ids))
 
435
        {
 
436
                return array();
 
437
        }
 
438
 
 
439
        $sql_array = array(
 
440
                'SELECT'        => 'p.*, u.*, t.*, f.*',
 
441
 
 
442
                'FROM'          => array(
 
443
                        USERS_TABLE             => 'u',
 
444
                        POSTS_TABLE             => 'p',
 
445
                        TOPICS_TABLE    => 't',
 
446
                ),
 
447
 
 
448
                'LEFT_JOIN'     => array(
 
449
                        array(
 
450
                                'FROM'  => array(FORUMS_TABLE => 'f'),
 
451
                                'ON'    => 'f.forum_id = t.forum_id'
 
452
                        )
 
453
                ),
 
454
 
 
455
                'WHERE'         => $db->sql_in_set('p.post_id', $post_ids) . '
 
456
                        AND u.user_id = p.poster_id
 
457
                        AND t.topic_id = p.topic_id',
 
458
        );
 
459
 
 
460
        if ($read_tracking && $config['load_db_lastread'])
 
461
        {
 
462
                $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
 
463
 
 
464
                $sql_array['LEFT_JOIN'][] = array(
 
465
                        'FROM'  => array(TOPICS_TRACK_TABLE => 'tt'),
 
466
                        'ON'    => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
 
467
                );
 
468
 
 
469
                $sql_array['LEFT_JOIN'][] = array(
 
470
                        'FROM'  => array(FORUMS_TRACK_TABLE => 'ft'),
 
471
                        'ON'    => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
 
472
                );
 
473
        }
 
474
 
 
475
        $sql = $db->sql_build_query('SELECT', $sql_array);
 
476
        $result = $db->sql_query($sql);
 
477
        unset($sql_array);
 
478
 
 
479
        while ($row = $db->sql_fetchrow($result))
 
480
        {
 
481
                if (!$row['forum_id'])
 
482
                {
 
483
                        // Global Announcement?
 
484
                        $row['forum_id'] = request_var('f', 0);
 
485
                }
 
486
 
 
487
                if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
 
488
                {
 
489
                        continue;
 
490
                }
 
491
 
 
492
                if (!$row['post_approved'] && !$auth->acl_get('m_approve', $row['forum_id']))
 
493
                {
 
494
                        // Moderators without the permission to approve post should at least not see them. ;)
 
495
                        continue;
 
496
                }
 
497
 
 
498
                $rowset[$row['post_id']] = $row;
 
499
        }
 
500
        $db->sql_freeresult($result);
 
501
 
 
502
        return $rowset;
 
503
}
 
504
 
 
505
/**
 
506
* Get simple forum data
 
507
*/
 
508
function get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking = false)
 
509
{
 
510
        global $auth, $db, $user, $config;
 
511
 
 
512
        $rowset = array();
 
513
 
 
514
        if (!is_array($forum_id))
 
515
        {
 
516
                $forum_id = array($forum_id);
 
517
        }
 
518
 
 
519
        if (!sizeof($forum_id))
 
520
        {
 
521
                return array();
 
522
        }
 
523
 
 
524
        if ($read_tracking && $config['load_db_lastread'])
 
525
        {
 
526
                $read_tracking_join = ' LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
 
527
                        AND ft.forum_id = f.forum_id)';
 
528
                $read_tracking_select = ', ft.mark_time';
 
529
        }
 
530
        else
 
531
        {
 
532
                $read_tracking_join = $read_tracking_select = '';
 
533
        }
 
534
 
 
535
        $sql = "SELECT f.* $read_tracking_select
 
536
                FROM " . FORUMS_TABLE . " f$read_tracking_join
 
537
                WHERE " . $db->sql_in_set('f.forum_id', $forum_id);
 
538
        $result = $db->sql_query($sql);
 
539
 
 
540
        while ($row = $db->sql_fetchrow($result))
 
541
        {
 
542
                if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
 
543
                {
 
544
                        continue;
 
545
                }
 
546
 
 
547
                if ($auth->acl_get('m_approve', $row['forum_id']))
 
548
                {
 
549
                        $row['forum_topics'] = $row['forum_topics_real'];
 
550
                }
 
551
 
 
552
                $rowset[$row['forum_id']] = $row;
 
553
        }
 
554
        $db->sql_freeresult($result);
 
555
 
 
556
        return $rowset;
 
557
}
 
558
 
 
559
/**
 
560
* sorting in mcp
 
561
*
 
562
* @param string $where_sql should either be WHERE (default if ommited) or end with AND or OR
 
563
*/
 
564
function mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by_sql, &$sort_order_sql, &$total, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')
 
565
{
 
566
        global $db, $user, $auth, $template;
 
567
 
 
568
        $sort_days = request_var('st', 0);
 
569
        $min_time = ($sort_days) ? time() - ($sort_days * 86400) : 0;
 
570
 
 
571
        switch ($mode)
 
572
        {
 
573
                case 'viewforum':
 
574
                        $type = 'topics';
 
575
                        $default_key = 't';
 
576
                        $default_dir = 'd';
 
577
 
 
578
                        $sql = 'SELECT COUNT(topic_id) AS total
 
579
                                FROM ' . TOPICS_TABLE . "
 
580
                                $where_sql forum_id = $forum_id
 
581
                                        AND topic_type NOT IN (" . POST_ANNOUNCE . ', ' . POST_GLOBAL . ")
 
582
                                        AND topic_last_post_time >= $min_time";
 
583
 
 
584
                        if (!$auth->acl_get('m_approve', $forum_id))
 
585
                        {
 
586
                                $sql .= 'AND topic_approved = 1';
 
587
                        }
 
588
                break;
 
589
 
 
590
                case 'viewtopic':
 
591
                        $type = 'posts';
 
592
                        $default_key = 't';
 
593
                        $default_dir = 'a';
 
594
 
 
595
                        $sql = 'SELECT COUNT(post_id) AS total
 
596
                                FROM ' . POSTS_TABLE . "
 
597
                                $where_sql topic_id = $topic_id
 
598
                                        AND post_time >= $min_time";
 
599
 
 
600
                        if (!$auth->acl_get('m_approve', $forum_id))
 
601
                        {
 
602
                                $sql .= 'AND post_approved = 1';
 
603
                        }
 
604
                break;
 
605
 
 
606
                case 'unapproved_posts':
 
607
                        $type = 'posts';
 
608
                        $default_key = 't';
 
609
                        $default_dir = 'd';
 
610
                        $where_sql .= ($topic_id) ? ' topic_id = ' . $topic_id . ' AND' : '';
 
611
 
 
612
                        $sql = 'SELECT COUNT(post_id) AS total
 
613
                                FROM ' . POSTS_TABLE . "
 
614
                                $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : get_forum_list('m_approve')) . '
 
615
                                        AND post_approved = 0';
 
616
 
 
617
                        if ($min_time)
 
618
                        {
 
619
                                $sql .= ' AND post_time >= ' . $min_time;
 
620
                        }
 
621
                break;
 
622
 
 
623
                case 'unapproved_topics':
 
624
                        $type = 'topics';
 
625
                        $default_key = 't';
 
626
                        $default_dir = 'd';
 
627
 
 
628
                        $sql = 'SELECT COUNT(topic_id) AS total
 
629
                                FROM ' . TOPICS_TABLE . "
 
630
                                $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : get_forum_list('m_approve')) . '
 
631
                                        AND topic_approved = 0';
 
632
 
 
633
                        if ($min_time)
 
634
                        {
 
635
                                $sql .= ' AND topic_time >= ' . $min_time;
 
636
                        }
 
637
                break;
 
638
 
 
639
                case 'reports':
 
640
                case 'reports_closed':
 
641
                        $type = 'reports';
 
642
                        $default_key = 't';
 
643
                        $default_dir = 'd';
 
644
                        $limit_time_sql = ($min_time) ? "AND r.report_time >= $min_time" : '';
 
645
 
 
646
                        if ($topic_id)
 
647
                        {
 
648
                                $where_sql .= ' p.topic_id = ' . $topic_id;
 
649
                        }
 
650
                        else if ($forum_id)
 
651
                        {
 
652
                                $where_sql .= ' p.forum_id = ' . $forum_id;
 
653
                        }
 
654
                        else
 
655
                        {
 
656
                                $where_sql .= ' ' . $db->sql_in_set('p.forum_id', get_forum_list('!m_report'), true, true);
 
657
                        }
 
658
 
 
659
                        if ($mode == 'reports')
 
660
                        {
 
661
                                $where_sql .= ' AND r.report_closed = 0';
 
662
                        }
 
663
                        else
 
664
                        {
 
665
                                $where_sql .= ' AND r.report_closed = 1';
 
666
                        }
 
667
 
 
668
                        $sql = 'SELECT COUNT(r.report_id) AS total
 
669
                                FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . " p
 
670
                                $where_sql
 
671
                                        AND p.post_id = r.post_id
 
672
                                        $limit_time_sql";
 
673
                break;
 
674
 
 
675
                case 'viewlogs':
 
676
                        $type = 'logs';
 
677
                        $default_key = 't';
 
678
                        $default_dir = 'd';
 
679
 
 
680
                        $sql = 'SELECT COUNT(log_id) AS total
 
681
                                FROM ' . LOG_TABLE . "
 
682
                                $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : get_forum_list('m_')) . '
 
683
                                        AND log_time >= ' . $min_time . '
 
684
                                        AND log_type = ' . LOG_MOD;
 
685
                break;
 
686
        }
 
687
 
 
688
        $sort_key = request_var('sk', $default_key);
 
689
        $sort_dir = request_var('sd', $default_dir);
 
690
        $sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);
 
691
 
 
692
        switch ($type)
 
693
        {
 
694
                case 'topics':
 
695
                        $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 
696
                        $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'tt' => $user->lang['TOPIC_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
 
697
 
 
698
                        $sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_replies_real' : 't.topic_replies'), 's' => 't.topic_title', 'v' => 't.topic_views');
 
699
                        $limit_time_sql = ($min_time) ? "AND t.topic_last_post_time >= $min_time" : '';
 
700
                break;
 
701
 
 
702
                case 'posts':
 
703
                        $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 
704
                        $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
 
705
                        $sort_by_sql = array('a' => 'u.username_clean', 't' => 'p.post_time', 's' => 'p.post_subject');
 
706
                        $limit_time_sql = ($min_time) ? "AND p.post_time >= $min_time" : '';
 
707
                break;
 
708
 
 
709
                case 'reports':
 
710
                        $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 
711
                        $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
 
712
                        $sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.post_time', 't' => 'r.report_time', 's' => 'p.post_subject');
 
713
                break;
 
714
 
 
715
                case 'logs':
 
716
                        $limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 
717
                        $sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']);
 
718
 
 
719
                        $sort_by_sql = array('u' => 'u.username_clean', 't' => 'l.log_time', 'i' => 'l.log_ip', 'o' => 'l.log_operation');
 
720
                        $limit_time_sql = ($min_time) ? "AND l.log_time >= $min_time" : '';
 
721
                break;
 
722
        }
 
723
 
 
724
        if (!isset($sort_by_sql[$sort_key]))
 
725
        {
 
726
                $sort_key = $default_key;
 
727
        }
 
728
 
 
729
        $sort_order_sql = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
 
730
 
 
731
        $s_limit_days = $s_sort_key = $s_sort_dir = $sort_url = '';
 
732
        gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url);
 
733
 
 
734
        $template->assign_vars(array(
 
735
                'S_SELECT_SORT_DIR'             => $s_sort_dir,
 
736
                'S_SELECT_SORT_KEY'             => $s_sort_key,
 
737
                'S_SELECT_SORT_DAYS'    => $s_limit_days)
 
738
        );
 
739
 
 
740
        if (($sort_days && $mode != 'viewlogs') || in_array($mode, array('reports', 'unapproved_topics', 'unapproved_posts')) || $where_sql != 'WHERE')
 
741
        {
 
742
                $result = $db->sql_query($sql);
 
743
                $total = (int) $db->sql_fetchfield('total');
 
744
                $db->sql_freeresult($result);
 
745
        }
 
746
        else
 
747
        {
 
748
                $total = -1;
 
749
        }
 
750
}
 
751
 
 
752
/**
 
753
* Validate ids
 
754
*
 
755
* @param        array   &$ids                   The relevant ids to check
 
756
* @param        string  $table                  The table to find the ids in
 
757
* @param        string  $sql_id                 The ids relevant column name
 
758
* @param        array   $acl_list               A list of permissions the user need to have
 
759
* @param        mixed   $singe_forum    Limit to one forum id (int) or the first forum found (true)
 
760
*
 
761
* @return       mixed   False if no ids were able to be retrieved, true if at least one id left.
 
762
*                                       Additionally, this value can be the forum_id assigned if $single_forum was set.
 
763
*                                       Therefore checking the result for with !== false is the best method.
 
764
*/
 
765
function check_ids(&$ids, $table, $sql_id, $acl_list = false, $single_forum = false)
 
766
{
 
767
        global $db, $auth;
 
768
 
 
769
        if (!is_array($ids) || empty($ids))
 
770
        {
 
771
                return false;
 
772
        }
 
773
 
 
774
        $sql = "SELECT $sql_id, forum_id FROM $table
 
775
                WHERE " . $db->sql_in_set($sql_id, $ids);
 
776
        $result = $db->sql_query($sql);
 
777
 
 
778
        $ids = array();
 
779
        $forum_id = false;
 
780
 
 
781
        while ($row = $db->sql_fetchrow($result))
 
782
        {
 
783
                if ($acl_list && $row['forum_id'] && !$auth->acl_gets($acl_list, $row['forum_id']))
 
784
                {
 
785
                        continue;
 
786
                }
 
787
 
 
788
                if ($acl_list && !$row['forum_id'] && !$auth->acl_getf_global($acl_list))
 
789
                {
 
790
                        continue;
 
791
                }
 
792
 
 
793
                // Limit forum? If not, just assign the id.
 
794
                if ($single_forum === false)
 
795
                {
 
796
                        $ids[] = $row[$sql_id];
 
797
                        continue;
 
798
                }
 
799
 
 
800
                // Limit forum to a specific forum id?
 
801
                // This can get really tricky, because we do not want to create a failure on global topics. :)
 
802
                if ($row['forum_id'])
 
803
                {
 
804
                        if ($single_forum !== true && $row['forum_id'] == (int) $single_forum)
 
805
                        {
 
806
                                $forum_id = (int) $single_forum;
 
807
                        }
 
808
                        else if ($forum_id === false)
 
809
                        {
 
810
                                $forum_id = $row['forum_id'];
 
811
                        }
 
812
 
 
813
                        if ($row['forum_id'] == $forum_id)
 
814
                        {
 
815
                                $ids[] = $row[$sql_id];
 
816
                        }
 
817
                }
 
818
                else
 
819
                {
 
820
                        // Always add a global topic
 
821
                        $ids[] = $row[$sql_id];
 
822
                }
 
823
        }
 
824
        $db->sql_freeresult($result);
 
825
 
 
826
        if (!sizeof($ids))
 
827
        {
 
828
                return false;
 
829
        }
 
830
 
 
831
        // If forum id is false and ids populated we may have only global announcements selected (returning 0 because of (int) $forum_id)
 
832
 
 
833
        return ($single_forum === false) ? true : (int) $forum_id;
 
834
}
 
835
 
 
836
?>
 
 
b'\\ No newline at end of file'