1<?php
2/**
3 * Loads common functions used in the administration panel.
4 *
5 * @copyright (C) 2008-2012 PunBB, partially based on code (C) 2008-2009 FluxBB.org
6 * @license http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
7 * @package PunBB
8 */
9
10// Make sure no one attempts to run this script "directly"
11if (!defined('FORUM'))
12	exit;
13
14
15//
16// Display the admin navigation menu
17//
18function generate_admin_menu($submenu)
19{
20	global $forum_config, $forum_url, $forum_user, $lang_admin_common, $db_type;
21
22	$return = ($hook = get_hook('ca_fn_generate_admin_menu_start')) ? eval($hook) : null;
23	if ($return !== null)
24		return $return;
25
26	if ($submenu)
27	{
28		$forum_page['admin_submenu'] = array();
29
30		if ($forum_user['g_id'] != FORUM_ADMIN)
31		{
32			$forum_page['admin_submenu']['index'] = '<li class="'.((FORUM_PAGE == 'admin-information') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_index']).'">'.$lang_admin_common['Information'].'</span></a></li>';
33			$forum_page['admin_submenu']['users'] = '<li class="'.((FORUM_PAGE == 'admin-users') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_users']).'">'.$lang_admin_common['Searches'].'</a></li>';
34
35			if ($forum_config['o_censoring'] == '1')
36				$forum_page['admin_submenu']['censoring'] = '<li class="'.((FORUM_PAGE == 'admin-censoring') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_censoring']).'">'.$lang_admin_common['Censoring'].'</a></li>';
37
38			$forum_page['admin_submenu']['reports'] = '<li class="'.((FORUM_PAGE == 'admin-reports') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_reports']).'">'.$lang_admin_common['Reports'].'</a></li>';
39
40			if ($forum_user['g_mod_ban_users'] == '1')
41				$forum_page['admin_submenu']['bans'] = '<li class="'.((FORUM_PAGE == 'admin-bans') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_bans']).'">'.$lang_admin_common['Bans'].'</a></li>';
42		}
43		else
44		{
45			if (FORUM_PAGE_SECTION == 'start')
46			{
47				$forum_page['admin_submenu']['index'] = '<li class="'.((FORUM_PAGE == 'admin-information') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_index']).'">'.$lang_admin_common['Information'].'</a></li>';
48				$forum_page['admin_submenu']['categories'] = '<li class="'.((FORUM_PAGE == 'admin-categories') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_categories']).'">'.$lang_admin_common['Categories'].'</a></li>';
49				$forum_page['admin_submenu']['forums'] = '<li class="'.((FORUM_PAGE == 'admin-forums') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_forums']).'">'.$lang_admin_common['Forums'].'</a></li>';
50			}
51			else if (FORUM_PAGE_SECTION == 'users')
52			{
53				$forum_page['admin_submenu']['users'] = '<li class="'.((FORUM_PAGE == 'admin-users' || FORUM_PAGE == 'admin-uresults' || FORUM_PAGE == 'admin-iresults') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_users']).'">'.$lang_admin_common['Searches'].'</a></li>';
54				$forum_page['admin_submenu']['groups'] = '<li class="'.((FORUM_PAGE == 'admin-groups') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_groups']).'">'.$lang_admin_common['Groups'].'</a></li>';
55				$forum_page['admin_submenu']['ranks'] = '<li class="'.((FORUM_PAGE == 'admin-ranks') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_ranks']).'">'.$lang_admin_common['Ranks'].'</a></li>';
56				$forum_page['admin_submenu']['bans'] = '<li class="'.((FORUM_PAGE == 'admin-bans') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_bans']).'">'.$lang_admin_common['Bans'].'</a></li>';
57			}
58			else if (FORUM_PAGE_SECTION == 'settings')
59			{
60				$forum_page['admin_submenu']['settings_setup'] = '<li class="'.((FORUM_PAGE == 'admin-settings-setup') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_setup']).'">'.$lang_admin_common['Setup'].'</a></li>';
61				$forum_page['admin_submenu']['settings_features'] = '<li class="'.((FORUM_PAGE == 'admin-settings-features') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_features']).'">'.$lang_admin_common['Features'].'</a></li>';
62				$forum_page['admin_submenu']['settings-announcements'] = '<li class="'.((FORUM_PAGE == 'admin-settings-announcements') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_announcements']).'">'.$lang_admin_common['Announcements'].'</a></li>';
63				$forum_page['admin_submenu']['settings-email'] = '<li class="'.((FORUM_PAGE == 'admin-settings-email') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_email']).'">'.$lang_admin_common['E-mail'].'</a></li>';
64				$forum_page['admin_submenu']['settings-registration'] = '<li class="'.((FORUM_PAGE == 'admin-settings-registration') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_registration']).'">'.$lang_admin_common['Registration'].'</a></li>';
65				$forum_page['admin_submenu']['censoring'] = '<li class="'.((FORUM_PAGE == 'admin-censoring') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_censoring']).'">'.$lang_admin_common['Censoring'].'</a></li>';
66			}
67			else if (FORUM_PAGE_SECTION == 'management')
68			{
69				$forum_page['admin_submenu']['reports'] = '<li class="'.((FORUM_PAGE == 'admin-reports') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_reports']).'">'.$lang_admin_common['Reports'].'</a></li>';
70				$forum_page['admin_submenu']['prune'] = '<li class="'.((FORUM_PAGE == 'admin-prune') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_prune']).'">'.$lang_admin_common['Prune topics'].'</a></li>';
71				$forum_page['admin_submenu']['reindex'] = '<li class="'.((FORUM_PAGE == 'admin-reindex') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_reindex']).'">'.$lang_admin_common['Rebuild index'].'</a></li>';
72				$forum_page['admin_submenu']['options-maintenance'] = '<li class="'.((FORUM_PAGE == 'admin-settings-maintenance') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_maintenance']).'">'.$lang_admin_common['Maintenance mode'].'</a></li>';
73			}
74			else if (FORUM_PAGE_SECTION == 'extensions')
75			{
76				$forum_page['admin_submenu']['extensions-manage'] = '<li class="'.((FORUM_PAGE == 'admin-extensions-manage') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_extensions_manage']).'">'.$lang_admin_common['Manage extensions'].'</a></li>';
77				$forum_page['admin_submenu']['extensions-hotfixes'] = '<li class="'.((FORUM_PAGE == 'admin-extensions-hotfixes') ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_extensions_hotfixes']).'">'.$lang_admin_common['Manage hotfixes'].'</a></li>';
78			}
79		}
80
81		($hook = get_hook('ca_fn_generate_admin_menu_new_sublink')) ? eval($hook) : null;
82
83		return (!empty($forum_page['admin_submenu'])) ? implode("\n\t\t", $forum_page['admin_submenu']) : '';
84	}
85	else
86	{
87		if ($forum_user['g_id'] != FORUM_ADMIN)
88			$forum_page['admin_menu']['index'] = '<li class="active first-item"><a href="'.forum_link($forum_url['admin_index']).'"><span>'.$lang_admin_common['Moderate'].'</span></a></li>';
89		else
90		{
91			$forum_page['admin_menu']['index'] = '<li class="'.((FORUM_PAGE_SECTION == 'start') ? 'active' : 'normal').((empty($forum_page['admin_menu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_index']).'"><span>'.$lang_admin_common['Start'].'</span></a></li>';
92			$forum_page['admin_menu']['settings_setup'] = '<li class="'.((FORUM_PAGE_SECTION == 'settings') ? 'active' : 'normal').((empty($forum_page['admin_menu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_settings_setup']).'"><span>'.$lang_admin_common['Settings'].'</span></a></li>';
93			$forum_page['admin_menu']['users'] = '<li class="'.((FORUM_PAGE_SECTION == 'users') ? 'active' : 'normal').((empty($forum_page['admin_menu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_users']).'"><span>'.$lang_admin_common['Users'].'</span></a></li>';
94			$forum_page['admin_menu']['reports'] = '<li class="'.((FORUM_PAGE_SECTION == 'management') ? 'active' : 'normal').((empty($forum_page['admin_menu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_reports']).'"><span>'.$lang_admin_common['Management'].'</span></a></li>';
95			$forum_page['admin_menu']['extensions_manage'] = '<li class="'.((FORUM_PAGE_SECTION == 'extensions') ? 'active' : 'normal').((empty($forum_page['admin_menu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url['admin_extensions_manage']).'"><span>'.$lang_admin_common['Extensions'].'</span></a></li>';
96		}
97
98		($hook = get_hook('ca_fn_generate_admin_menu_new_link')) ? eval($hook) : null;
99
100		return implode("\n\t\t", $forum_page['admin_menu']);
101	}
102}
103
104
105//
106// Delete topics from $forum_id that are "older than" $prune_date (if $prune_sticky is 1, sticky topics will also be deleted)
107//
108function prune($forum_id, $prune_sticky, $prune_date)
109{
110	global $forum_db, $db_type;
111
112	$return = ($hook = get_hook('ca_fn_prune_start')) ? eval($hook) : null;
113	if ($return !== null)
114		return;
115
116	// Fetch topics to prune
117	$query = array(
118		'SELECT'	=> 't.id',
119		'FROM'		=> 'topics AS t',
120		'WHERE'		=> 't.forum_id='.$forum_id
121	);
122
123	if ($prune_date != -1)
124		$query['WHERE'] .= ' AND last_post<'.$prune_date;
125	if (!$prune_sticky)
126		$query['WHERE'] .= ' AND sticky=\'0\'';
127
128	($hook = get_hook('ca_fn_prune_qr_get_topics_to_prune')) ? eval($hook) : null;
129	$result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
130
131	$topic_ids = array();
132	while ($row = $forum_db->fetch_row($result))
133		$topic_ids[] = $row[0];
134
135	if (!empty($topic_ids))
136	{
137		$topic_ids = implode(',', $topic_ids);
138
139		// Fetch posts to prune (used lated for updating the search index)
140		$query = array(
141			'SELECT'	=> 'p.id',
142			'FROM'		=> 'posts AS p',
143			'WHERE'		=> 'p.topic_id IN('.$topic_ids.')'
144		);
145
146		($hook = get_hook('ca_fn_prune_qr_get_posts_to_prune')) ? eval($hook) : null;
147		$result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
148
149		$post_ids = array();
150		while ($row = $forum_db->fetch_row($result))
151			$post_ids[] = $row[0];
152
153		// Delete topics
154		$query = array(
155			'DELETE'	=> 'topics',
156			'WHERE'		=> 'id IN('.$topic_ids.')'
157		);
158
159		($hook = get_hook('ca_fn_prune_qr_prune_topics')) ? eval($hook) : null;
160		$forum_db->query_build($query) or error(__FILE__, __LINE__);
161
162		// Delete posts
163		$query = array(
164			'DELETE'	=> 'posts',
165			'WHERE'		=> 'topic_id IN('.$topic_ids.')'
166		);
167
168		($hook = get_hook('ca_fn_prune_qr_prune_posts')) ? eval($hook) : null;
169		$forum_db->query_build($query) or error(__FILE__, __LINE__);
170
171		// Delete subscriptions
172		$query = array(
173			'DELETE'	=> 'subscriptions',
174			'WHERE'		=> 'topic_id IN('.$topic_ids.')'
175		);
176
177		($hook = get_hook('ca_fn_prune_qr_prune_subscriptions')) ? eval($hook) : null;
178		$forum_db->query_build($query) or error(__FILE__, __LINE__);
179
180		// We removed a bunch of posts, so now we have to update the search index
181		if (!defined('FORUM_SEARCH_IDX_FUNCTIONS_LOADED'))
182			require FORUM_ROOT.'include/search_idx.php';
183
184		strip_search_index($post_ids);
185	}
186}
187
188
189// Add config value to forum config table
190// Warning!
191// This function dont refresh config cache - use "forum_clear_cache()" if
192// call this function outside install/uninstall extension manifest section
193function forum_config_add($name, $value)
194{
195	global $forum_db, $forum_config;
196
197	if (!empty($name) && !isset($forum_config[$name]))
198	{
199		$query = array(
200			'INSERT'	=> 'conf_name, conf_value',
201			'INTO'		=> 'config',
202			'VALUES'	=> '\''.$name.'\', \''.$value.'\''
203		);
204		$forum_db->query_build($query) or error(__FILE__, __LINE__);
205	}
206}
207
208
209// Remove config value from forum config table
210// Warning!
211// This function dont refresh config cache - use "forum_clear_cache()" if
212// call this function outside install/uninstall extension manifest section
213function forum_config_remove($name)
214{
215	global $forum_db;
216
217	if (is_array($name) && count($name) > 0)
218	{
219		if (!function_exists('clean_conf_names'))
220		{
221			function clean_conf_names($n)
222			{
223				global $forum_db;
224				return '\''.$forum_db->escape($n).'\'';
225			}
226		}
227
228		$name = array_map('clean_conf_names', $name);
229
230		$query = array(
231			'DELETE'	=> 'config',
232			'WHERE'		=> 'conf_name in ('.implode(',', $name).')',
233		);
234		$forum_db->query_build($query) or error(__FILE__, __LINE__);
235	}
236	else if (!empty($name))
237	{
238		$query = array(
239			'DELETE'	=> 'config',
240			'WHERE'		=> 'conf_name=\''.$forum_db->escape($name).'\''
241		);
242		$forum_db->query_build($query) or error(__FILE__, __LINE__);
243	}
244}
245
246
247($hook = get_hook('ca_new_function')) ? eval($hook) : null;
248