Register
phpBB.com Wiki · Home Projects Help

root / trunk / phpBB / mcp.php

1 3281 psotfx
<?php
2 7736 acydburn
/**
3 5114 acydburn
*
4 5114 acydburn
* @package mcp
5 5114 acydburn
* @version $Id$
6 7736 acydburn
* @copyright (c) 2005 phpBB Group
7 7736 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5114 acydburn
*
9 5114 acydburn
*/
10 3281 psotfx
11 5114 acydburn
/**
12 5114 acydburn
* @ignore
13 5114 acydburn
*/
14 3281 psotfx
define('IN_PHPBB', true);
15 8572 acydburn
if (!defined('PHPBB_ROOT_PATH')) define('PHPBB_ROOT_PATH', './');
16 8572 acydburn
if (!defined('PHP_EXT')) define('PHP_EXT', substr(strrchr(__FILE__, '.'), 1));
17 8572 acydburn
include(PHPBB_ROOT_PATH . 'common.' . PHP_EXT);
18 8572 acydburn
include(PHPBB_ROOT_PATH . 'includes/functions_admin.' . PHP_EXT);
19 8572 acydburn
require(PHPBB_ROOT_PATH . 'includes/functions_module.' . PHP_EXT);
20 3281 psotfx
21 4496 ludovic_arnaud
// Start session management
22 5247 acydburn
$user->session_begin();
23 4496 ludovic_arnaud
$auth->acl($user->data);
24 4844 acydburn
$user->setup('mcp');
25 3784 ludovic_arnaud
26 5305 grahamje
$module = new p_master();
27 4694 ludovic_arnaud
28 6104 acydburn
// Setting a variable to let the style designer know where he is...
29 6104 acydburn
$template->assign_var('S_IN_MCP', true);
30 6104 acydburn
31 4496 ludovic_arnaud
// Basic parameter data
32 5300 grahamje
$id = request_var('i', '');
33 4921 acydburn
34 5526 naderman
if (isset($_REQUEST['mode']) && is_array($_REQUEST['mode']))
35 4937 acydburn
{
36 5765 acydburn
	$mode = request_var('mode', array(''));
37 5765 acydburn
	list($mode, ) = each($mode);
38 4937 acydburn
}
39 5307 acydburn
else
40 5307 acydburn
{
41 5307 acydburn
	$mode = request_var('mode', '');
42 5307 acydburn
}
43 4937 acydburn
44 4921 acydburn
// Only Moderators can go beyond this point
45 5117 acydburn
if (!$user->data['is_registered'])
46 4694 ludovic_arnaud
{
47 5117 acydburn
	if ($user->data['is_bot'])
48 4921 acydburn
	{
49 8572 acydburn
		redirect(append_sid(PHPBB_ROOT_PATH . 'index.' . PHP_EXT));
50 4921 acydburn
	}
51 5117 acydburn
52 5117 acydburn
	login_box('', $user->lang['LOGIN_EXPLAIN_MCP']);
53 4694 ludovic_arnaud
}
54 4921 acydburn
55 4921 acydburn
$quickmod = (isset($_REQUEST['quickmod'])) ? true : false;
56 4921 acydburn
$action = request_var('action', '');
57 5152 acydburn
$action_ary = request_var('action', array('' => 0));
58 4921 acydburn
59 7539 davidmj
$forum_action = request_var('forum_action', '');
60 7539 davidmj
if ($forum_action !== '' && !empty($_POST['sort']))
61 7539 davidmj
{
62 7539 davidmj
	$action = $forum_action;
63 7539 davidmj
}
64 7539 davidmj
65 5152 acydburn
if (sizeof($action_ary))
66 3796 ludovic_arnaud
{
67 5526 naderman
	list($action, ) = each($action_ary);
68 4496 ludovic_arnaud
}
69 5152 acydburn
unset($action_ary);
70 3796 ludovic_arnaud
71 5460 grahamje
if ($mode == 'topic_logs')
72 5460 grahamje
{
73 5460 grahamje
	$id = 'logs';
74 5460 grahamje
	$quickmod = false;
75 5460 grahamje
}
76 5460 grahamje
77 5526 naderman
$post_id = request_var('p', 0);
78 5526 naderman
$topic_id = request_var('t', 0);
79 5526 naderman
$forum_id = request_var('f', 0);
80 5526 naderman
$user_id = request_var('u', 0);
81 7920 acydburn
$username = utf8_normalize_nfc(request_var('username', '', true));
82 5526 naderman
83 5526 naderman
if ($post_id)
84 4923 acydburn
{
85 5526 naderman
	// We determine the topic and forum id here, to make sure the moderator really has moderative rights on this post
86 5526 naderman
	$sql = 'SELECT topic_id, forum_id
87 5526 naderman
		FROM ' . POSTS_TABLE . "
88 5526 naderman
		WHERE post_id = $post_id";
89 5526 naderman
	$result = $db->sql_query($sql);
90 5526 naderman
	$row = $db->sql_fetchrow($result);
91 5526 naderman
	$db->sql_freeresult($result);
92 5526 naderman
93 5526 naderman
	$topic_id = (int) $row['topic_id'];
94 6030 grahamje
	$forum_id = (int) ($row['forum_id']) ? $row['forum_id'] : $forum_id;
95 4923 acydburn
}
96 7394 vic_delfant
else if ($topic_id)
97 4924 acydburn
{
98 5526 naderman
	$sql = 'SELECT forum_id
99 5526 naderman
		FROM ' . TOPICS_TABLE . "
100 5526 naderman
		WHERE topic_id = $topic_id";
101 5526 naderman
	$result = $db->sql_query($sql);
102 5526 naderman
	$row = $db->sql_fetchrow($result);
103 5526 naderman
	$db->sql_freeresult($result);
104 5526 naderman
105 5526 naderman
	$forum_id = (int) $row['forum_id'];
106 4924 acydburn
}
107 4924 acydburn
108 5584 naderman
// If the user doesn't have any moderator powers (globally or locally) he can't access the mcp
109 6028 naderman
if (!$auth->acl_getf_global('m_'))
110 4921 acydburn
{
111 5986 naderman
	// Except he is using one of the quickmod tools for users
112 5986 naderman
	$user_quickmod_actions = array(
113 5986 naderman
		'lock'			=> 'f_user_lock',
114 5986 naderman
		'make_sticky'	=> 'f_sticky',
115 5986 naderman
		'make_announce'	=> 'f_announce',
116 5986 naderman
		'make_global'	=> 'f_announce',
117 6015 acydburn
		'make_normal'	=> array('f_announce', 'f_sticky')
118 6015 acydburn
	);
119 5986 naderman
120 5986 naderman
	$allow_user = false;
121 5986 naderman
	if ($quickmod && isset($user_quickmod_actions[$action]) && $user->data['is_registered'] && $auth->acl_gets($user_quickmod_actions[$action], $forum_id))
122 5986 naderman
	{
123 5986 naderman
		$topic_info = get_topic_data(array($topic_id));
124 5986 naderman
		if ($topic_info[$topic_id]['topic_poster'] == $user->data['user_id'])
125 5986 naderman
		{
126 5986 naderman
			$allow_user = true;
127 5986 naderman
		}
128 5986 naderman
	}
129 5986 naderman
130 5986 naderman
	if (!$allow_user)
131 5986 naderman
	{
132 7919 kellanved
		trigger_error('NOT_AUTHORISED');
133 5986 naderman
	}
134 5526 naderman
}
135 5024 acydburn
136 6045 naderman
// if the user cannot read the forum he tries to access then we won't allow mcp access either
137 6045 naderman
if ($forum_id && !$auth->acl_get('f_read', $forum_id))
138 6045 naderman
{
139 7919 kellanved
	trigger_error('NOT_AUTHORISED');
140 6045 naderman
}
141 6045 naderman
142 5585 acydburn
if ($forum_id)
143 5526 naderman
{
144 6015 acydburn
	$module->acl_forum_id = $forum_id;
145 5526 naderman
}
146 5024 acydburn
147 5526 naderman
// Instantiate module system and generate list of available modules
148 5526 naderman
$module->list_modules('mcp');
149 5024 acydburn
150 5526 naderman
if ($quickmod)
151 5526 naderman
{
152 5526 naderman
	$mode = 'quickmod';
153 5024 acydburn
154 5526 naderman
	switch ($action)
155 5432 grahamje
	{
156 5526 naderman
		case 'lock':
157 5526 naderman
		case 'unlock':
158 5526 naderman
		case 'lock_post':
159 5526 naderman
		case 'unlock_post':
160 5526 naderman
		case 'make_sticky':
161 5526 naderman
		case 'make_announce':
162 5526 naderman
		case 'make_global':
163 5526 naderman
		case 'make_normal':
164 5526 naderman
		case 'fork':
165 5526 naderman
		case 'move':
166 5526 naderman
		case 'delete_post':
167 5526 naderman
		case 'delete_topic':
168 5526 naderman
			$module->load('mcp', 'main', 'quickmod');
169 8961 acydburn
			return;
170 6015 acydburn
		break;
171 5432 grahamje
172 5526 naderman
		case 'topic_logs':
173 5526 naderman
			$module->set_active('logs', 'topic_logs');
174 5526 naderman
		break;
175 4921 acydburn
176 7261 naderman
		case 'merge_topic':
177 7261 naderman
			$module->set_active('main', 'forum_view');
178 7261 naderman
		break;
179 7261 naderman
180 5986 naderman
		case 'split':
181 5986 naderman
		case 'merge':
182 5986 naderman
			$module->set_active('main', 'topic_view');
183 5986 naderman
		break;
184 5986 naderman
185 5526 naderman
		default:
186 8961 acydburn
			trigger_error("$action not allowed as quickmod", E_USER_ERROR);
187 8961 acydburn
		break;
188 5526 naderman
	}
189 5526 naderman
}
190 5526 naderman
else
191 5526 naderman
{
192 5300 grahamje
	// Select the active module
193 5300 grahamje
	$module->set_active($id, $mode);
194 5526 naderman
}
195 5300 grahamje
196 5526 naderman
// Hide some of the options if we don't have the relevant information to use them
197 5526 naderman
if (!$post_id)
198 5526 naderman
{
199 5570 naderman
	$module->set_display('main', 'post_details', false);
200 5570 naderman
	$module->set_display('warn', 'warn_post', false);
201 7432 vic_delfant
}
202 5986 naderman
203 7432 vic_delfant
if ($mode == '' || $mode == 'unapproved_topics' || $mode == 'unapproved_posts')
204 7432 vic_delfant
{
205 7432 vic_delfant
	$module->set_display('queue', 'approve_details', false);
206 5526 naderman
}
207 5585 acydburn
208 7432 vic_delfant
if ($mode == '' || $mode == 'reports' || $mode == 'reports_closed')
209 7432 vic_delfant
{
210 7432 vic_delfant
	$module->set_display('reports', 'report_details', false);
211 7432 vic_delfant
}
212 7432 vic_delfant
213 5526 naderman
if (!$topic_id)
214 5526 naderman
{
215 5570 naderman
	$module->set_display('main', 'topic_view', false);
216 5570 naderman
	$module->set_display('logs', 'topic_logs', false);
217 5526 naderman
}
218 5585 acydburn
219 5526 naderman
if (!$forum_id)
220 5526 naderman
{
221 5570 naderman
	$module->set_display('main', 'forum_view', false);
222 5570 naderman
	$module->set_display('logs', 'forum_logs', false);
223 5526 naderman
}
224 5585 acydburn
225 5526 naderman
if (!$user_id && $username == '')
226 5526 naderman
{
227 5570 naderman
	$module->set_display('notes', 'user_notes', false);
228 5570 naderman
	$module->set_display('warn', 'warn_user', false);
229 5526 naderman
}
230 5305 grahamje
231 5526 naderman
// Load and execute the relevant module
232 5526 naderman
$module->load_active();
233 5300 grahamje
234 5526 naderman
// Assign data to the template engine for the list of modules
235 8572 acydburn
$module->assign_tpl_vars(append_sid(PHPBB_ROOT_PATH . 'mcp.' . PHP_EXT));
236 5300 grahamje
237 7007 acydburn
// Generate urls for letting the moderation control panel being accessed in different modes
238 7007 acydburn
$template->assign_vars(array(
239 8572 acydburn
	'U_MCP'			=> append_sid('mcp', 'i=main'),
240 8572 acydburn
	'U_MCP_FORUM'	=> ($forum_id) ? append_sid('mcp', "i=main&amp;mode=forum_view&amp;f=$forum_id") : '',
241 8572 acydburn
	'U_MCP_TOPIC'	=> ($forum_id && $topic_id) ? append_sid('mcp', "i=main&amp;mode=topic_view&amp;t=$topic_id") : '',
242 8572 acydburn
	'U_MCP_POST'	=> ($forum_id && $topic_id && $post_id) ? append_sid('mcp', "i=main&amp;mode=post_details&amp;t=$topic_id&amp;p=$post_id") : '',
243 7007 acydburn
));
244 7007 acydburn
245 6054 acydburn
// Generate the page, do not display/query online list
246 6054 acydburn
$module->display($module->get_page_title(), false);
247 5300 grahamje
248 5305 grahamje
/**
249 5305 grahamje
* Functions used to generate additional URL paramters
250 5305 grahamje
*/
251 6787 acydburn
function _module__url($mode, &$module_row)
252 5763 grahamje
{
253 5763 grahamje
	return extra_url();
254 5763 grahamje
}
255 5763 grahamje
256 7384 acydburn
function _module_notes_url($mode, &$module_row)
257 7384 acydburn
{
258 7384 acydburn
	if ($mode == 'front')
259 7384 acydburn
	{
260 7384 acydburn
		return '';
261 7384 acydburn
	}
262 7384 acydburn
263 7384 acydburn
	global $user_id;
264 7384 acydburn
	return ($user_id) ? "&amp;u=$user_id" : '';
265 7384 acydburn
}
266 7384 acydburn
267 7384 acydburn
function _module_warn_url($mode, &$module_row)
268 7384 acydburn
{
269 7384 acydburn
	if ($mode == 'front' || $mode == 'list')
270 7384 acydburn
	{
271 7663 davidmj
		global $forum_id;
272 7663 davidmj
273 7663 davidmj
		return ($forum_id) ? "&amp;f=$forum_id" : '';
274 7384 acydburn
	}
275 7384 acydburn
276 7384 acydburn
	if ($mode == 'warn_post')
277 7384 acydburn
	{
278 7384 acydburn
		global $forum_id, $post_id;
279 7384 acydburn
280 7384 acydburn
		$url_extra = ($forum_id) ? "&amp;f=$forum_id" : '';
281 7384 acydburn
		$url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
282 7384 acydburn
283 7384 acydburn
		return $url_extra;
284 7384 acydburn
	}
285 7384 acydburn
	else
286 7384 acydburn
	{
287 7384 acydburn
		global $user_id;
288 7384 acydburn
289 7384 acydburn
		return ($user_id) ? "&amp;u=$user_id" : '';
290 7384 acydburn
	}
291 7384 acydburn
}
292 7384 acydburn
293 6787 acydburn
function _module_main_url($mode, &$module_row)
294 5305 grahamje
{
295 5305 grahamje
	return extra_url();
296 5305 grahamje
}
297 5325 acydburn
298 6787 acydburn
function _module_logs_url($mode, &$module_row)
299 6787 acydburn
{
300 6787 acydburn
	return extra_url();
301 6787 acydburn
}
302 6787 acydburn
303 6787 acydburn
function _module_ban_url($mode, &$module_row)
304 6787 acydburn
{
305 6787 acydburn
	return extra_url();
306 6787 acydburn
}
307 6787 acydburn
308 7007 acydburn
function _module_queue_url($mode, &$module_row)
309 7007 acydburn
{
310 7007 acydburn
	return extra_url();
311 7007 acydburn
}
312 7007 acydburn
313 7663 davidmj
function _module_reports_url($mode, &$module_row)
314 7663 davidmj
{
315 7663 davidmj
	return extra_url();
316 7663 davidmj
}
317 7663 davidmj
318 5305 grahamje
function extra_url()
319 5305 grahamje
{
320 6787 acydburn
	global $forum_id, $topic_id, $post_id, $user_id;
321 6015 acydburn
322 5305 grahamje
	$url_extra = '';
323 5305 grahamje
	$url_extra .= ($forum_id) ? "&amp;f=$forum_id" : '';
324 5305 grahamje
	$url_extra .= ($topic_id) ? "&amp;t=$topic_id" : '';
325 5305 grahamje
	$url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
326 6787 acydburn
	$url_extra .= ($user_id) ? "&amp;u=$user_id" : '';
327 6015 acydburn
328 5305 grahamje
	return $url_extra;
329 5305 grahamje
}
330 4924 acydburn
331 5114 acydburn
/**
332 5114 acydburn
* Get simple topic data
333 5114 acydburn
*/
334 6936 naderman
function get_topic_data($topic_ids, $acl_list = false, $read_tracking = false)
335 4924 acydburn
{
336 6936 naderman
	global $auth, $db, $config, $user;
337 5986 naderman
	static $rowset = array();
338 6015 acydburn
339 5986 naderman
	$topics = array();
340 4924 acydburn
341 5986 naderman
	if (!sizeof($topic_ids))
342 4924 acydburn
	{
343 4924 acydburn
		return array();
344 4924 acydburn
	}
345 4924 acydburn
346 6936 naderman
	// cache might not contain read tracking info, so we can't use it if read
347 6936 naderman
	// tracking information is requested
348 6936 naderman
	if (!$read_tracking)
349 6936 naderman
	{
350 6936 naderman
		$cache_topic_ids = array_intersect($topic_ids, array_keys($rowset));
351 6936 naderman
		$topic_ids = array_diff($topic_ids, array_keys($rowset));
352 6936 naderman
	}
353 6936 naderman
	else
354 6936 naderman
	{
355 6936 naderman
		$cache_topic_ids = array();
356 6936 naderman
	}
357 4970 psotfx
358 5986 naderman
	if (sizeof($topic_ids))
359 4924 acydburn
	{
360 6936 naderman
		$sql_array = array(
361 6936 naderman
			'SELECT'	=> 't.*, f.*',
362 6936 naderman
363 6936 naderman
			'FROM'		=> array(
364 6936 naderman
				TOPICS_TABLE	=> 't',
365 6936 naderman
			),
366 6936 naderman
367 6936 naderman
			'LEFT_JOIN'	=> array(
368 6936 naderman
				array(
369 6936 naderman
					'FROM'	=> array(FORUMS_TABLE => 'f'),
370 6936 naderman
					'ON'	=> 'f.forum_id = t.forum_id'
371 6936 naderman
				)
372 6936 naderman
			),
373 6936 naderman
374 6936 naderman
			'WHERE'		=> $db->sql_in_set('t.topic_id', $topic_ids)
375 6936 naderman
		);
376 6936 naderman
377 6936 naderman
		if ($read_tracking && $config['load_db_lastread'])
378 6936 naderman
		{
379 6936 naderman
			$sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
380 6936 naderman
381 6936 naderman
			$sql_array['LEFT_JOIN'][] = array(
382 6936 naderman
				'FROM'	=> array(TOPICS_TRACK_TABLE => 'tt'),
383 6936 naderman
				'ON'	=> 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
384 6936 naderman
			);
385 6936 naderman
386 6936 naderman
			$sql_array['LEFT_JOIN'][] = array(
387 6936 naderman
				'FROM'	=> array(FORUMS_TRACK_TABLE => 'ft'),
388 6936 naderman
				'ON'	=> 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
389 6936 naderman
			);
390 6936 naderman
		}
391 6936 naderman
392 6936 naderman
		$sql = $db->sql_build_query('SELECT', $sql_array);
393 5986 naderman
		$result = $db->sql_query($sql);
394 8656 acydburn
395 5986 naderman
		while ($row = $db->sql_fetchrow($result))
396 4924 acydburn
		{
397 6030 grahamje
			if (!$row['forum_id'])
398 6030 grahamje
			{
399 6030 grahamje
				// Global Announcement?
400 6030 grahamje
				$row['forum_id'] = request_var('f', 0);
401 6030 grahamje
			}
402 6030 grahamje
403 5986 naderman
			$rowset[$row['topic_id']] = $row;
404 5986 naderman
405 5986 naderman
			if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
406 5986 naderman
			{
407 5986 naderman
				continue;
408 5986 naderman
			}
409 5986 naderman
410 5986 naderman
			$topics[$row['topic_id']] = $row;
411 4924 acydburn
		}
412 6015 acydburn
		$db->sql_freeresult($result);
413 5986 naderman
	}
414 4924 acydburn
415 5986 naderman
	foreach ($cache_topic_ids as $id)
416 5986 naderman
	{
417 5986 naderman
		if (!$acl_list || $auth->acl_gets($acl_list, $rowset[$id]['forum_id']))
418 5986 naderman
		{
419 5986 naderman
			$topics[$id] = $rowset[$id];
420 5986 naderman
		}
421 4924 acydburn
	}
422 4924 acydburn
423 5986 naderman
	return $topics;
424 4924 acydburn
}
425 4924 acydburn
426 5114 acydburn
/**
427 5114 acydburn
* Get simple post data
428 5114 acydburn
*/
429 6936 naderman
function get_post_data($post_ids, $acl_list = false, $read_tracking = false)
430 4924 acydburn
{
431 6936 naderman
	global $db, $auth, $config, $user;
432 6015 acydburn
433 4924 acydburn
	$rowset = array();
434 4924 acydburn
435 5986 naderman
	if (!sizeof($post_ids))
436 5986 naderman
	{
437 5986 naderman
		return array();
438 5986 naderman
	}
439 5986 naderman
440 6936 naderman
	$sql_array = array(
441 5885 davidmj
		'SELECT'	=> 'p.*, u.*, t.*, f.*',
442 5885 davidmj
443 5885 davidmj
		'FROM'		=> array(
444 5885 davidmj
			USERS_TABLE		=> 'u',
445 6938 acydburn
			POSTS_TABLE		=> 'p',
446 5885 davidmj
			TOPICS_TABLE	=> 't',
447 5885 davidmj
		),
448 5885 davidmj