phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / includes / acp / acp_permissions.php

History | View | Annotate | Download (38.7 kB)

1 5553 acydburn
<?php
2 7736 acydburn
/**
3 5553 acydburn
*
4 5553 acydburn
* @package acp
5 5553 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 5553 acydburn
*
9 5553 acydburn
*/
10 5553 acydburn
11 5553 acydburn
/**
12 8147 acydburn
* @ignore
13 8147 acydburn
*/
14 8147 acydburn
if (!defined('IN_PHPBB'))
15 8147 acydburn
{
16 8147 acydburn
        exit;
17 8147 acydburn
}
18 8147 acydburn
19 8147 acydburn
/**
20 5553 acydburn
* @package acp
21 5553 acydburn
*/
22 5553 acydburn
class acp_permissions
23 5553 acydburn
{
24 5553 acydburn
        var $u_action;
25 5553 acydburn
        var $permission_dropdown;
26 9402 acydburn
27 5553 acydburn
        function main($id, $mode)
28 5553 acydburn
        {
29 5553 acydburn
                global $db, $user, $auth, $template, $cache;
30 6015 acydburn
                global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
31 5553 acydburn
32 5553 acydburn
                include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
33 5553 acydburn
                include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
34 5553 acydburn
35 5553 acydburn
                $auth_admin = new auth_admin();
36 5553 acydburn
37 5553 acydburn
                $user->add_lang('acp/permissions');
38 6539 acydburn
                add_permission_language();
39 5553 acydburn
40 5553 acydburn
                $this->tpl_name = 'acp_permissions';
41 5553 acydburn
42 5824 acydburn
                // Trace has other vars
43 5824 acydburn
                if ($mode == 'trace')
44 5824 acydburn
                {
45 5824 acydburn
                        $user_id = request_var('u', 0);
46 5824 acydburn
                        $forum_id = request_var('f', 0);
47 5824 acydburn
                        $permission = request_var('auth', '');
48 5824 acydburn
49 5824 acydburn
                        $this->tpl_name = 'permission_trace';
50 5824 acydburn
51 8384 acydburn
                        if ($user_id && isset($auth_admin->acl_options['id'][$permission]) && $auth->acl_get('a_viewauth'))
52 5824 acydburn
                        {
53 5824 acydburn
                                $this->page_title = sprintf($user->lang['TRACE_PERMISSION'], $user->lang['acl_' . $permission]['lang']);
54 5824 acydburn
                                $this->permission_trace($user_id, $forum_id, $permission);
55 5824 acydburn
                                return;
56 5824 acydburn
                        }
57 6320 acydburn
                        trigger_error('NO_MODE', E_USER_ERROR);
58 5824 acydburn
                }
59 5824 acydburn
60 9887 bantu
                // Copy forum permissions
61 9887 bantu
                if ($mode == 'setting_forum_copy')
62 9887 bantu
                {
63 9887 bantu
                        $this->tpl_name = 'permission_forum_copy';
64 9887 bantu
65 9887 bantu
                        if ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
66 9887 bantu
                        {
67 9887 bantu
                                $this->page_title = 'ACP_FORUM_PERMISSIONS_COPY';
68 9887 bantu
                                $this->copy_forum_permissions();
69 9887 bantu
                                return;
70 9887 bantu
                        }
71 9887 bantu
72 9887 bantu
                        trigger_error('NO_MODE', E_USER_ERROR);
73 9887 bantu
                }
74 9887 bantu
75 5553 acydburn
                // Set some vars
76 5678 acydburn
                $action = request_var('action', array('' => 0));
77 5678 acydburn
                $action = key($action);
78 5553 acydburn
                $action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action;
79 5553 acydburn
80 5553 acydburn
                $all_forums = request_var('all_forums', 0);
81 5574 acydburn
                $subforum_id = request_var('subforum_id', 0);
82 5553 acydburn
                $forum_id = request_var('forum_id', array(0));
83 5574 acydburn
84 6513 acydburn
                $username = request_var('username', array(''), true);
85 6513 acydburn
                $usernames = request_var('usernames', '', true);
86 5574 acydburn
                $user_id = request_var('user_id', array(0));
87 5553 acydburn
88 5574 acydburn
                $group_id = request_var('group_id', array(0));
89 5715 acydburn
                $select_all_groups = request_var('select_all_groups', 0);
90 5574 acydburn
91 8120 kellanved
                $form_name = 'acp_permissions';
92 8120 kellanved
                add_form_key($form_name);
93 8120 kellanved
94 5715 acydburn
                // If select all groups is set, we pre-build the group id array (this option is used for other screens to link to the permission settings screen)
95 5715 acydburn
                if ($select_all_groups)
96 5715 acydburn
                {
97 5715 acydburn
                        // Add default groups to selection
98 6436 acydburn
                        $sql_and = (!$config['coppa_enable']) ? " AND group_name <> 'REGISTERED_COPPA'" : '';
99 5744 acydburn
100 5715 acydburn
                        $sql = 'SELECT group_id
101 5715 acydburn
                                FROM ' . GROUPS_TABLE . '
102 5744 acydburn
                                WHERE group_type = ' . GROUP_SPECIAL . "
103 5744 acydburn
                                $sql_and";
104 5715 acydburn
                        $result = $db->sql_query($sql);
105 5715 acydburn
106 5715 acydburn
                        while ($row = $db->sql_fetchrow($result))
107 5715 acydburn
                        {
108 5715 acydburn
                                $group_id[] = $row['group_id'];
109 5715 acydburn
                        }
110 5715 acydburn
                        $db->sql_freeresult($result);
111 5715 acydburn
                }
112 9402 acydburn
113 5553 acydburn
                // Map usernames to ids and vice versa
114 5553 acydburn
                if ($usernames)
115 5553 acydburn
                {
116 5553 acydburn
                        $username = explode("\n", $usernames);
117 5553 acydburn
                }
118 5553 acydburn
                unset($usernames);
119 5553 acydburn
120 5553 acydburn
                if (sizeof($username) && !sizeof($user_id))
121 5553 acydburn
                {
122 5553 acydburn
                        user_get_id_name($user_id, $username);
123 5553 acydburn
124 5553 acydburn
                        if (!sizeof($user_id))
125 5553 acydburn
                        {
126 6320 acydburn
                                trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
127 5553 acydburn
                        }
128 5553 acydburn
                }
129 5553 acydburn
                unset($username);
130 9402 acydburn
131 5574 acydburn
                // Build forum ids (of all forums are checked or subforum listing used)
132 5574 acydburn
                if ($all_forums)
133 5574 acydburn
                {
134 5574 acydburn
                        $sql = 'SELECT forum_id
135 5574 acydburn
                                FROM ' . FORUMS_TABLE . '
136 5574 acydburn
                                ORDER BY left_id';
137 5574 acydburn
                        $result = $db->sql_query($sql);
138 5574 acydburn
139 5574 acydburn
                        $forum_id = array();
140 5574 acydburn
                        while ($row = $db->sql_fetchrow($result))
141 5574 acydburn
                        {
142 8390 acydburn
                                $forum_id[] = (int) $row['forum_id'];
143 5574 acydburn
                        }
144 5574 acydburn
                        $db->sql_freeresult($result);
145 5574 acydburn
                }
146 5574 acydburn
                else if ($subforum_id)
147 5574 acydburn
                {
148 5574 acydburn
                        $forum_id = array();
149 5574 acydburn
                        foreach (get_forum_branch($subforum_id, 'children') as $row)
150 5574 acydburn
                        {
151 8390 acydburn
                                $forum_id[] = (int) $row['forum_id'];
152 5574 acydburn
                        }
153 5574 acydburn
                }
154 5574 acydburn
155 5553 acydburn
                // Define some common variables for every mode
156 5553 acydburn
                $error = array();
157 6073 acydburn
158 5553 acydburn
                $permission_scope = (strpos($mode, '_global') !== false) ? 'global' : 'local';
159 5553 acydburn
160 5574 acydburn
                // Showing introductionary page?
161 5574 acydburn
                if ($mode == 'intro')
162 5574 acydburn
                {
163 5937 grahamje
                        $this->page_title = 'ACP_PERMISSIONS';
164 6073 acydburn
165 5574 acydburn
                        $template->assign_vars(array(
166 5574 acydburn
                                'S_INTRO'                => true)
167 5574 acydburn
                        );
168 5574 acydburn
169 5574 acydburn
                        return;
170 5574 acydburn
                }
171 5574 acydburn
172 5553 acydburn
                switch ($mode)
173 5553 acydburn
                {
174 5553 acydburn
                        case 'setting_user_global':
175 5553 acydburn
                        case 'setting_group_global':
176 5553 acydburn
                                $this->permission_dropdown = array('u_', 'm_', 'a_');
177 5553 acydburn
                                $permission_victim = ($mode == 'setting_user_global') ? array('user') : array('group');
178 5553 acydburn
                                $this->page_title = ($mode == 'setting_user_global') ? 'ACP_USERS_PERMISSIONS' : 'ACP_GROUPS_PERMISSIONS';
179 5553 acydburn
                        break;
180 5553 acydburn
181 5553 acydburn
                        case 'setting_user_local':
182 5553 acydburn
                        case 'setting_group_local':
183 5553 acydburn
                                $this->permission_dropdown = array('f_', 'm_');
184 5553 acydburn
                                $permission_victim = ($mode == 'setting_user_local') ? array('user', 'forums') : array('group', 'forums');
185 5553 acydburn
                                $this->page_title = ($mode == 'setting_user_local') ? 'ACP_USERS_FORUM_PERMISSIONS' : 'ACP_GROUPS_FORUM_PERMISSIONS';
186 5553 acydburn
                        break;
187 5553 acydburn
188 5553 acydburn
                        case 'setting_admin_global':
189 5553 acydburn
                        case 'setting_mod_global':
190 5553 acydburn
                                $this->permission_dropdown = (strpos($mode, '_admin_') !== false) ? array('a_') : array('m_');
191 5553 acydburn
                                $permission_victim = array('usergroup');
192 5553 acydburn
                                $this->page_title = ($mode == 'setting_admin_global') ? 'ACP_ADMINISTRATORS' : 'ACP_GLOBAL_MODERATORS';
193 5553 acydburn
                        break;
194 5553 acydburn
195 5553 acydburn
                        case 'setting_mod_local':
196 5553 acydburn
                        case 'setting_forum_local':
197 5553 acydburn
                                $this->permission_dropdown = ($mode == 'setting_mod_local') ? array('m_') : array('f_');
198 5553 acydburn
                                $permission_victim = array('forums', 'usergroup');
199 5553 acydburn
                                $this->page_title = ($mode == 'setting_mod_local') ? 'ACP_FORUM_MODERATORS' : 'ACP_FORUM_PERMISSIONS';
200 5553 acydburn
                        break;
201 5553 acydburn
202 5553 acydburn
                        case 'view_admin_global':
203 5553 acydburn
                        case 'view_user_global':
204 5553 acydburn
                        case 'view_mod_global':
205 5553 acydburn
                                $this->permission_dropdown = ($mode == 'view_admin_global') ? array('a_') : (($mode == 'view_user_global') ? array('u_') : array('m_'));
206 5553 acydburn
                                $permission_victim = array('usergroup_view');
207 5553 acydburn
                                $this->page_title = ($mode == 'view_admin_global') ? 'ACP_VIEW_ADMIN_PERMISSIONS' : (($mode == 'view_user_global') ? 'ACP_VIEW_USER_PERMISSIONS' : 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS');
208 5553 acydburn
                        break;
209 5553 acydburn
210 5553 acydburn
                        case 'view_mod_local':
211 5553 acydburn
                        case 'view_forum_local':
212 5553 acydburn
                                $this->permission_dropdown = ($mode == 'view_mod_local') ? array('m_') : array('f_');
213 5553 acydburn
                                $permission_victim = array('forums', 'usergroup_view');
214 5553 acydburn
                                $this->page_title = ($mode == 'view_mod_local') ? 'ACP_VIEW_FORUM_MOD_PERMISSIONS' : 'ACP_VIEW_FORUM_PERMISSIONS';
215 5553 acydburn
                        break;
216 5553 acydburn
217 5553 acydburn
                        default:
218 6428 acydburn
                                trigger_error('NO_MODE', E_USER_ERROR);
219 6320 acydburn
                        break;
220 5553 acydburn
                }
221 5553 acydburn
222 5553 acydburn
                $template->assign_vars(array(
223 5553 acydburn
                        'L_TITLE'                => $user->lang[$this->page_title],
224 5553 acydburn
                        'L_EXPLAIN'                => $user->lang[$this->page_title . '_EXPLAIN'])
225 5553 acydburn
                );
226 5553 acydburn
227 5553 acydburn
                // Get permission type
228 5553 acydburn
                $permission_type = request_var('type', $this->permission_dropdown[0]);
229 5553 acydburn
230 5553 acydburn
                if (!in_array($permission_type, $this->permission_dropdown))
231 5553 acydburn
                {
232 6320 acydburn
                        trigger_error($user->lang['WRONG_PERMISSION_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
233 5553 acydburn
                }
234 5553 acydburn
235 5553 acydburn
                // Handle actions
236 5553 acydburn
                if (strpos($mode, 'setting_') === 0 && $action)
237 5553 acydburn
                {
238 5553 acydburn
                        switch ($action)
239 5553 acydburn
                        {
240 5553 acydburn
                                case 'delete':
241 9652 nickvergessen
                                        if (confirm_box(true))
242 8120 kellanved
                                        {
243 9652 nickvergessen
                                                // All users/groups selected?
244 9652 nickvergessen
                                                $all_users = (isset($_POST['all_users'])) ? true : false;
245 9652 nickvergessen
                                                $all_groups = (isset($_POST['all_groups'])) ? true : false;
246 6228 acydburn
247 9652 nickvergessen
                                                if ($all_users || $all_groups)
248 9652 nickvergessen
                                                {
249 9652 nickvergessen
                                                        $items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
250 6228 acydburn
251 9652 nickvergessen
                                                        if ($all_users && sizeof($items['user_ids']))
252 9652 nickvergessen
                                                        {
253 9652 nickvergessen
                                                                $user_id = $items['user_ids'];
254 9652 nickvergessen
                                                        }
255 9652 nickvergessen
                                                        else if ($all_groups && sizeof($items['group_ids']))
256 9652 nickvergessen
                                                        {
257 9652 nickvergessen
                                                                $group_id = $items['group_ids'];
258 9652 nickvergessen
                                                        }
259 9652 nickvergessen
                                                }
260 9652 nickvergessen
261 9652 nickvergessen
                                                if (sizeof($user_id) || sizeof($group_id))
262 6228 acydburn
                                                {
263 9652 nickvergessen
                                                        $this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
264 6228 acydburn
                                                }
265 9652 nickvergessen
                                                else
266 6228 acydburn
                                                {
267 9652 nickvergessen
                                                        trigger_error($user->lang['NO_USER_GROUP_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
268 6228 acydburn
                                                }
269 6228 acydburn
                                        }
270 6228 acydburn
                                        else
271 6228 acydburn
                                        {
272 9673 nickvergessen
                                                if (isset($_POST['cancel']))
273 9673 nickvergessen
                                                {
274 9673 nickvergessen
                                                        $u_redirect = $this->u_action . '&amp;type=' . $permission_type;
275 9673 nickvergessen
                                                        foreach ($forum_id as $fid)
276 9673 nickvergessen
                                                        {
277 9673 nickvergessen
                                                                $u_redirect .= '&amp;forum_id[]=' . $fid;
278 9673 nickvergessen
                                                        }
279 9673 nickvergessen
                                                        redirect($u_redirect);
280 9673 nickvergessen
                                                }
281 9673 nickvergessen
282 9652 nickvergessen
                                                $s_hidden_fields = array(
283 9652 nickvergessen
                                                        'i'                                => $id,
284 9652 nickvergessen
                                                        'mode'                        => $mode,
285 9652 nickvergessen
                                                        'action'                => array($action => 1),
286 9652 nickvergessen
                                                        'user_id'                => $user_id,
287 9652 nickvergessen
                                                        'group_id'                => $group_id,
288 9652 nickvergessen
                                                        'forum_id'                => $forum_id,
289 9652 nickvergessen
                                                        'type'                        => $permission_type,
290 9652 nickvergessen
                                                );
291 9652 nickvergessen
                                                if (isset($_POST['all_users']))
292 9652 nickvergessen
                                                {
293 9652 nickvergessen
                                                        $s_hidden_fields['all_users'] = 1;
294 9652 nickvergessen
                                                }
295 9652 nickvergessen
                                                if (isset($_POST['all_groups']))
296 9652 nickvergessen
                                                {
297 9652 nickvergessen
                                                        $s_hidden_fields['all_groups'] = 1;
298 9652 nickvergessen
                                                }
299 9652 nickvergessen
                                                confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields));
300 6228 acydburn
                                        }
301 5553 acydburn
                                break;
302 5553 acydburn
303 5553 acydburn
                                case 'apply_permissions':
304 5553 acydburn
                                        if (!isset($_POST['setting']))
305 5553 acydburn
                                        {
306 6320 acydburn
                                                trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
307 5553 acydburn
                                        }
308 8123 kellanved
                                        if (!check_form_key($form_name))
309 8120 kellanved
                                        {
310 8120 kellanved
                                                trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
311 8120 kellanved
                                        }
312 5553 acydburn
313 5553 acydburn
                                        $this->set_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
314 5553 acydburn
                                break;
315 5553 acydburn
316 5553 acydburn
                                case 'apply_all_permissions':
317 5553 acydburn
                                        if (!isset($_POST['setting']))
318 5553 acydburn
                                        {
319 6320 acydburn
                                                trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
320 5553 acydburn
                                        }
321 8123 kellanved
                                        if (!check_form_key($form_name))
322 8120 kellanved
                                        {
323 8120 kellanved
                                                trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
324 8120 kellanved
                                        }
325 5553 acydburn
326 5553 acydburn
                                        $this->set_all_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
327 5553 acydburn
                                break;
328 5553 acydburn
                        }
329 5553 acydburn
                }
330 5553 acydburn
331 5553 acydburn
332 5553 acydburn
                // Setting permissions screen
333 5553 acydburn
                $s_hidden_fields = build_hidden_fields(array(
334 5553 acydburn
                        'user_id'                => $user_id,
335 5553 acydburn
                        'group_id'                => $group_id,
336 5553 acydburn
                        'forum_id'                => $forum_id,
337 5553 acydburn
                        'type'                        => $permission_type)
338 5553 acydburn
                );
339 5553 acydburn
340 5553 acydburn
                // Go through the screens/options needed and present them in correct order
341 5553 acydburn
                foreach ($permission_victim as $victim)
342 5553 acydburn
                {
343 5553 acydburn
                        switch ($victim)
344 5553 acydburn
                        {
345 5553 acydburn
                                case 'forum_dropdown':
346 5553 acydburn
347 5553 acydburn
                                        if (sizeof($forum_id))
348 5553 acydburn
                                        {
349 5553 acydburn
                                                $this->check_existence('forum', $forum_id);
350 5553 acydburn
                                                continue 2;
351 5553 acydburn
                                        }
352 5553 acydburn
353 5553 acydburn
                                        $template->assign_vars(array(
354 5553 acydburn
                                                'S_SELECT_FORUM'                => true,
355 5678 acydburn
                                                'S_FORUM_OPTIONS'                => make_forum_select(false, false, true, false, false))
356 5553 acydburn
                                        );
357 5553 acydburn
358 5553 acydburn
                                break;
359 6073 acydburn
360 5553 acydburn
                                case 'forums':
361 5553 acydburn
362 5574 acydburn
                                        if (sizeof($forum_id))
363 5553 acydburn
                                        {
364 5574 acydburn
                                                $this->check_existence('forum', $forum_id);
365 5553 acydburn
                                                continue 2;
366 5553 acydburn
                                        }
367 5553 acydburn
368 6285 grahamje
                                        $forum_list = make_forum_select(false, false, true, false, false, false, true);
369 5574 acydburn
370 5574 acydburn
                                        // Build forum options
371 5574 acydburn
                                        $s_forum_options = '';
372 5574 acydburn
                                        foreach ($forum_list as $f_id => $f_row)
373 5574 acydburn
                                        {
374 7456 acydburn
                                                $s_forum_options .= '<option value="' . $f_id . '"' . (($f_row['selected']) ? ' selected="selected"' : '') . (($f_row['disabled']) ? ' disabled="disabled" class="disabled-option"' : '') . '>' . $f_row['padding'] . $f_row['forum_name'] . '</option>';
375 5574 acydburn
                                        }
376 5574 acydburn
377 5574 acydburn
                                        // Build subforum options
378 5574 acydburn
                                        $s_subforum_options = $this->build_subforum_options($forum_list);
379 5574 acydburn
380 5553 acydburn
                                        $template->assign_vars(array(
381 5553 acydburn
                                                'S_SELECT_FORUM'                => true,
382 5574 acydburn
                                                'S_FORUM_OPTIONS'                => $s_forum_options,
383 5574 acydburn
                                                'S_SUBFORUM_OPTIONS'        => $s_subforum_options,
384 5553 acydburn
                                                'S_FORUM_ALL'                        => true,
385 5553 acydburn
                                                'S_FORUM_MULTIPLE'                => true)
386 5553 acydburn
                                        );
387 5553 acydburn
388 5553 acydburn
                                break;
389 5553 acydburn
390 5553 acydburn
                                case 'user':
391 5553 acydburn
392 5553 acydburn
                                        if (sizeof($user_id))
393 5553 acydburn
                                        {
394 5553 acydburn
                                                $this->check_existence('user', $user_id);
395 5553 acydburn
                                                continue 2;
396 5553 acydburn
                                        }
397 5553 acydburn
398 5553 acydburn
                                        $template->assign_vars(array(
399 5553 acydburn
                                                'S_SELECT_USER'                        => true,
400 6864 dhn2
                                                'U_FIND_USERNAME'                => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=select_victim&amp;field=username&amp;select_single=true'),
401 8099 acydburn
                                        ));
402 5553 acydburn
403 5553 acydburn
                                break;
404 5553 acydburn
405 5553 acydburn
                                case 'group':
406 5553 acydburn
407 5553 acydburn
                                        if (sizeof($group_id))
408 5553 acydburn
                                        {
409 5553 acydburn
                                                $this->check_existence('group', $group_id);
410 5553 acydburn
                                                continue 2;
411 5553 acydburn
                                        }
412 5553 acydburn
413 5553 acydburn
                                        $template->assign_vars(array(
414 5553 acydburn
                                                'S_SELECT_GROUP'                => true,
415 8710 acydburn
                                                'S_GROUP_OPTIONS'                => group_select_options(false, false, false), // Show all groups
416 8710 acydburn
                                        ));
417 5553 acydburn
418 5553 acydburn
                                break;
419 5553 acydburn
420 5553 acydburn
                                case 'usergroup':
421 5553 acydburn
                                case 'usergroup_view':
422 5553 acydburn
423 6970 acydburn
                                        $all_users = (isset($_POST['all_users'])) ? true : false;
424 6970 acydburn
                                        $all_groups = (isset($_POST['all_groups'])) ? true : false;
425 6970 acydburn
426 6970 acydburn
                                        if ((sizeof($user_id) && !$all_users) || (sizeof($group_id) && !$all_groups))
427 5553 acydburn
                                        {
428 5553 acydburn
                                                if (sizeof($user_id))
429 5553 acydburn
                                                {
430 5553 acydburn
                                                        $this->check_existence('user', $user_id);
431 5553 acydburn
                                                }
432 5553 acydburn
433 5553 acydburn
                                                if (sizeof($group_id))
434 5553 acydburn
                                                {
435 5553 acydburn
                                                        $this->check_existence('group', $group_id);
436 5553 acydburn
                                                }
437 5553 acydburn
438 5553 acydburn
                                                continue 2;
439 5553 acydburn
                                        }
440 5553 acydburn
441 6970 acydburn
                                        // Now we check the users... because the "all"-selection is different here (all defined users/groups)
442 6228 acydburn
                                        $items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
443 5553 acydburn
444 6228 acydburn
                                        if ($all_users && sizeof($items['user_ids']))
445 5574 acydburn
                                        {
446 6228 acydburn
                                                $user_id = $items['user_ids'];
447 5574 acydburn
                                                continue 2;
448 5574 acydburn
                                        }
449 5574 acydburn
450 6228 acydburn
                                        if ($all_groups && sizeof($items['group_ids']))
451 5574 acydburn
                                        {
452 6228 acydburn
                                                $group_id = $items['group_ids'];
453 5574 acydburn
                                                continue 2;
454 5574 acydburn
                                        }
455 5574 acydburn
456 5553 acydburn
                                        $template->assign_vars(array(
457 5553 acydburn
                                                'S_SELECT_USERGROUP'                => ($victim == 'usergroup') ? true : false,
458 5553 acydburn
                                                'S_SELECT_USERGROUP_VIEW'        => ($victim == 'usergroup_view') ? true : false,
459 6228 acydburn
                                                'S_DEFINED_USER_OPTIONS'        => $items['user_ids_options'],
460 6228 acydburn
                                                'S_DEFINED_GROUP_OPTIONS'        => $items['group_ids_options'],
461 8710 acydburn
                                                'S_ADD_GROUP_OPTIONS'                => group_select_options(false, $items['group_ids'], false),        // Show all groups
462 6875 dhn2
                                                'U_FIND_USERNAME'                        => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=add_user&amp;field=username&amp;select_single=true'),
463 8099 acydburn
                                        ));
464 5553 acydburn
465 5553 acydburn
                                break;
466 5553 acydburn
                        }
467 5553 acydburn
468 6364 acydburn
                        // The S_ALLOW_SELECT parameter below is a measure to lower memory usage.
469 6364 acydburn
                        // If there are more than 5 forums selected the admin is not able to select all users/groups too.
470 6364 acydburn
                        // We need to see if the number of forums can be increased or need to be decreased.
471 6364 acydburn
472 5553 acydburn
                        $template->assign_vars(array(
473 5553 acydburn
                                'U_ACTION'                                => $this->u_action,
474 5553 acydburn
                                'ANONYMOUS_USER_ID'                => ANONYMOUS,
475 5553 acydburn
476 5553 acydburn
                                'S_SELECT_VICTIM'                => true,
477 6364 acydburn
                                'S_ALLOW_ALL_SELECT'        => (sizeof($forum_id) > 5) ? false : true,
478 5553 acydburn
                                'S_CAN_SELECT_USER'                => ($auth->acl_get('a_authusers')) ? true : false,
479 5553 acydburn
                                'S_CAN_SELECT_GROUP'        => ($auth->acl_get('a_authgroups')) ? true : false,
480 5553 acydburn
                                'S_HIDDEN_FIELDS'                => $s_hidden_fields)
481 5553 acydburn
                        );
482 5553 acydburn
483 5553 acydburn
                        // Let the forum names being displayed
484 5553 acydburn
                        if (sizeof($forum_id))
485 5553 acydburn
                        {
486 5553 acydburn
                                $sql = 'SELECT forum_name
487 5553 acydburn
                                        FROM ' . FORUMS_TABLE . '
488 6271 acydburn
                                        WHERE ' . $db->sql_in_set('forum_id', $forum_id) . '
489 7150 acydburn
                                        ORDER BY left_id ASC';
490 5553 acydburn
                                $result = $db->sql_query($sql);
491 5553 acydburn
492 5553 acydburn
                                $forum_names = array();
493 5553 acydburn
                                while ($row = $db->sql_fetchrow($result))
494 5553 acydburn
                                {
495 5553 acydburn
                                        $forum_names[] = $row['forum_name'];
496 5553 acydburn
                                }
497 5553 acydburn
                                $db->sql_freeresult($result);
498 5553 acydburn
499 5553 acydburn
                                $template->assign_vars(array(
500 5553 acydburn
                                        'S_FORUM_NAMES'                => (sizeof($forum_names)) ? true : false,
501 5553 acydburn
                                        'FORUM_NAMES'                => implode(', ', $forum_names))
502 5553 acydburn
                                );
503 5553 acydburn
                        }
504 5553 acydburn
505 5553 acydburn
                        return;
506 5553 acydburn
                }
507 5553 acydburn
508 5553 acydburn
                // Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
509 5553 acydburn
                if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id))
510 5553 acydburn
                {
511 6320 acydburn
                        trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING);
512 5553 acydburn
                }
513 5553 acydburn
514 5553 acydburn
                $template->assign_vars(array(
515 7909 acydburn
                        'S_PERMISSION_DROPDOWN'                => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
516 5553 acydburn
                        'L_PERMISSION_TYPE'                        => $user->lang['ACL_TYPE_' . strtoupper($permission_type)],
517 5553 acydburn
518 5553 acydburn
                        'U_ACTION'                                        => $this->u_action,
519 5553 acydburn
                        'S_HIDDEN_FIELDS'                        => $s_hidden_fields)
520 5553 acydburn
                );
521 5553 acydburn
522 5553 acydburn
                if (strpos($mode, 'setting_') === 0)
523 5553 acydburn
                {
524 5553 acydburn
                        $template->assign_vars(array(
525 5553 acydburn
                                'S_SETTING_PERMISSIONS'                => true)
526 5553 acydburn
                        );
527 5553 acydburn
528 6115 acydburn
                        $hold_ary = $auth_admin->get_mask('set', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
529 5553 acydburn
                        $auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
530 5553 acydburn
                }
531 5553 acydburn
                else
532 5553 acydburn
                {
533 5553 acydburn
                        $template->assign_vars(array(
534 5553 acydburn
                                'S_VIEWING_PERMISSIONS'                => true)
535 5553 acydburn
                        );
536 5553 acydburn
537 6115 acydburn
                        $hold_ary = $auth_admin->get_mask('view', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER);
538 5553 acydburn
                        $auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
539 5553 acydburn
                }
540 5553 acydburn
        }
541 5553 acydburn
542 5553 acydburn
        /**
543 5574 acydburn
        * Build +subforum options
544 5574 acydburn
        */
545 5574 acydburn
        function build_subforum_options($forum_list)
546 5574 acydburn
        {
547 5574 acydburn
                global $user;
548 5574 acydburn
549 5574 acydburn
                $s_options = '';
550 5574 acydburn
551 5574 acydburn
                $forum_list = array_merge($forum_list);
552 5574 acydburn
553 5574 acydburn
                foreach ($forum_list as $key => $row)
554 5574 acydburn
                {
555 6930 acydburn
                        if ($row['disabled'])
556 6930 acydburn
                        {
557 6930 acydburn
                                continue;
558 6930 acydburn
                        }
559 6930 acydburn
560 6808 acydburn
                        $s_options .= '<option value="' . $row['forum_id'] . '"' . (($row['selected']) ? ' selected="selected"' : '') . '>' . $row['padding'] . $row['forum_name'];
561 5574 acydburn
562 5574 acydburn
                        // We check if a branch is there...
563 5574 acydburn
                        $branch_there = false;
564 5574 acydburn
565 5574 acydburn
                        foreach (array_slice($forum_list, $key + 1) as $temp_row)
566 5574 acydburn
                        {
567 5574 acydburn
                                if ($temp_row['left_id'] > $row['left_id'] && $temp_row['left_id'] < $row['right_id'])
568 5574 acydburn
                                {
569 5574 acydburn
                                        $branch_there = true;
570 5574 acydburn
                                        break;
571 5574 acydburn
                                }
572 5574 acydburn
                                continue;
573 5574 acydburn
                        }
574 9402 acydburn
575 5574 acydburn
                        if ($branch_there)
576 5574 acydburn
                        {
577 5574 acydburn
                                $s_options .= ' [' . $user->lang['PLUS_SUBFORUMS'] . ']';
578 5574 acydburn
                        }
579 5574 acydburn
580 5574 acydburn
                        $s_options .= '</option>';
581 5574 acydburn
                }
582 5574 acydburn
583 5574 acydburn
                return $s_options;
584 5574 acydburn
        }
585 9402 acydburn
586 5574 acydburn
        /**
587 5553 acydburn
        * Build dropdown field for changing permission types
588 5553 acydburn
        */
589 7909 acydburn
        function build_permission_dropdown($options, $default_option, $permission_scope)
590 5553 acydburn
        {
591 5553 acydburn
                global $user, $auth;
592 9402 acydburn
593 5553 acydburn
                $s_dropdown_options = '';
594 5553 acydburn
                foreach ($options as $setting)
595 5553 acydburn
                {
596 5553 acydburn
                        if (!$auth->acl_get('a_' . str_replace('_', '', $setting) . 'auth'))
597 5553 acydburn
                        {
598 5553 acydburn
                                continue;
599 5553 acydburn
                        }
600 7909 acydburn
601 5553 acydburn
                        $selected = ($setting == $default_option) ? ' selected="selected"' : '';
602 7909 acydburn
                        $l_setting = (isset($user->lang['permission_type'][$permission_scope][$setting])) ? $user->lang['permission_type'][$permission_scope][$setting] : $user->lang['permission_type'][$setting];
603 7909 acydburn
                        $s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $l_setting . '</option>';
604 5553 acydburn
                }
605 5553 acydburn
606 5553 acydburn
                return $s_dropdown_options;
607 5553 acydburn
        }
608 5553 acydburn
609 5553 acydburn
        /**
610 5553 acydburn
        * Check if selected items exist. Remove not found ids and if empty return error.
611 5553 acydburn
        */
612 5553 acydburn
        function check_existence($mode, &$ids)
613 5553 acydburn
        {
614 5553 acydburn
                global $db, $user;
615 5553 acydburn
616 5553 acydburn
                switch ($mode)
617 5553 acydburn
                {
618 5553 acydburn
                        case 'user':
619 5553 acydburn
                                $table = USERS_TABLE;
620 5553 acydburn
                                $sql_id = 'user_id';
621 5553 acydburn
                        break;
622 5553 acydburn
623 5553 acydburn
                        case 'group':
624 5553 acydburn
                                $table = GROUPS_TABLE;
625 5553 acydburn
                                $sql_id = 'group_id';
626 5553 acydburn
                        break;
627 5553 acydburn
628 5553 acydburn
                        case 'forum':
629 5553 acydburn
                                $table = FORUMS_TABLE;
630 5553 acydburn
                                $sql_id = 'forum_id';
631 5553 acydburn
                        break;
632 5553 acydburn
                }
633 5553 acydburn
634 6970 acydburn
                if (sizeof($ids))
635 6970 acydburn
                {
636 6970 acydburn
                        $sql = "SELECT $sql_id
637 6970 acydburn
                                FROM $table
638 6970 acydburn
                                WHERE " . $db->sql_in_set($sql_id, $ids);
639 6970 acydburn
                        $result = $db->sql_query($sql);
640 6073 acydburn
641 6970 acydburn
                        $ids = array();
642 6970 acydburn
                        while ($row = $db->sql_fetchrow($result))
643 6970 acydburn
                        {
644 8390 acydburn
                                $ids[] = (int) $row[$sql_id];
645 6970 acydburn
                        }
646 6970 acydburn
                        $db->sql_freeresult($result);
647 5553 acydburn
                }
648 5553 acydburn
649 5553 acydburn
                if (!sizeof($ids))
650 5553 acydburn
                {
651 6320 acydburn
                        trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
652 5553 acydburn
                }
653 5553 acydburn
        }
654 5553 acydburn
655 8147 acydburn
        /**
656 5553 acydburn
        * Apply permissions
657 5553 acydburn
        */
658 5553 acydburn
        function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
659 5553 acydburn
        {
660 5553 acydburn
                global $user, $auth;
661 5553 acydburn
662 7692 kellanved
                $psubmit = request_var('psubmit', array(0 => array(0 => 0)));
663 5553 acydburn
664 5553 acydburn
                // User or group to be set?
665 5553 acydburn
                $ug_type = (sizeof($user_id)) ? 'user' : 'group';
666 5553 acydburn
667 5553 acydburn
                // Check the permission setting again
668 5553 acydburn
                if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
669 5553 acydburn
                {
670 6428 acydburn
                        trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
671 5553 acydburn
                }
672 9402 acydburn
673 5553 acydburn
                $ug_id = $forum_id = 0;
674 5553 acydburn
675 5553 acydburn
                // We loop through the auth settings defined in our submit
676 5553 acydburn
                list($ug_id, ) = each($psubmit);
677 5553 acydburn
                list($forum_id, ) = each($psubmit[$ug_id]);
678 5553 acydburn
679 8075 acydburn
                if (empty($_POST['setting']) || empty($_POST['setting'][$ug_id]) || empty($_POST['setting'][$ug_id][$forum_id]) || !is_array($_POST['setting'][$ug_id][$forum_id]))
680 8075 acydburn
                {
681 8075 acydburn
                        trigger_error('WRONG_PERMISSION_SETTING_FORMAT', E_USER_WARNING);
682 8075 acydburn
                }
683 8075 acydburn
684 8076 acydburn
                // We obtain and check $_POST['setting'][$ug_id][$forum_id] directly and not using request_var() because request_var()
685 8076 acydburn
                // currently does not support the amount of dimensions required. ;)
686 8076 acydburn
                //                $auth_settings = request_var('setting', array(0 => array(0 => array('' => 0))));
687 5553 acydburn
                $auth_settings = array_map('intval', $_POST['setting'][$ug_id][$forum_id]);
688 5553 acydburn
689 5574 acydburn
                // Do we have a role we want to set?
690 5574 acydburn
                $assigned_role = (isset($_POST['role'][$ug_id][$forum_id])) ? (int) $_POST['role'][$ug_id][$forum_id] : 0;
691 5574 acydburn
692 5574 acydburn
                // Do the admin want to set these permissions to other items too?
693 7693 kellanved
                $inherit = request_var('inherit', array(0 => array(0)));
694 5574 acydburn
695 5553 acydburn
                $ug_id = array($ug_id);
696 5553 acydburn
                $forum_id = array($forum_id);
697 5553 acydburn
698 5553 acydburn
                if (sizeof($inherit))
699 5553 acydburn
                {
700 5553 acydburn
                        foreach ($inherit as $_ug_id => $forum_id_ary)
701 5553 acydburn
                        {
702 5553 acydburn
                                // Inherit users/groups?
703 5553 acydburn
                                if (!in_array($_ug_id, $ug_id))
704 5553 acydburn
                                {
705 5553 acydburn
                                        $ug_id[] = $_ug_id;
706 5553 acydburn
                                }
707 5553 acydburn
708 5553 acydburn
                                // Inherit forums?
709 5553 acydburn
                                $forum_id = array_merge($forum_id, array_keys($forum_id_ary));
710 5553 acydburn
                        }
711 5553 acydburn
                }
712 5553 acydburn
713 5553 acydburn
                $forum_id = array_unique($forum_id);
714 5553 acydburn
715 5574 acydburn
                // If the auth settings differ from the assigned role, then do not set a role...
716 5574 acydburn
                if ($assigned_role)
717 5574 acydburn
                {
718 5574 acydburn
                        if (!$this->check_assigned_role($assigned_role, $auth_settings))
719 5574 acydburn
                        {
720 5574 acydburn
                                $assigned_role = 0;
721 5574 acydburn
                        }
722 5574 acydburn
                }
723 5574 acydburn
724 5553 acydburn
                // Update the permission set...
725 5574 acydburn
                $auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_settings, $assigned_role);
726 5553 acydburn
727 5553 acydburn
                // Do we need to recache the moderator lists?
728 5553 acydburn
                if ($permission_type == 'm_')
729 5553 acydburn
                {
730 5553 acydburn
                        cache_moderators();
731 5553 acydburn
                }
732 5553 acydburn
733 5553 acydburn
                // Remove users who are now moderators or admins from everyones foes list
734 5553 acydburn
                if ($permission_type == 'm_' || $permission_type == 'a_')
735 5553 acydburn
                {
736 7109 davidmj
                        update_foes($group_id, $user_id);
737 5553 acydburn
                }
738 5553 acydburn
739 5553 acydburn
                $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);
740 5553 acydburn
741 5553 acydburn
                trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
742 5553 acydburn
        }
743 5553 acydburn
744 8147 acydburn
        /**
745 5553 acydburn
        * Apply all permissions
746 5553 acydburn
        */
747 5553 acydburn
        function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
748 5553 acydburn
        {
749 5553 acydburn
                global $user, $auth;
750 5553 acydburn
751 5553 acydburn
                // User or group to be set?
752 5553 acydburn
                $ug_type = (sizeof($user_id)) ? 'user' : 'group';
753 5553 acydburn
754 5553 acydburn
                // Check the permission setting again
755 5553 acydburn
                if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
756 5553 acydburn
                {
757 6428 acydburn
                        trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
758 5553 acydburn
                }
759 6073 acydburn
760 5848 acydburn
                $auth_settings = (isset($_POST['setting'])) ? $_POST['setting'] : array();
761 5848 acydburn
                $auth_roles = (isset($_POST['role'])) ? $_POST['role'] : array();
762 5553 acydburn
                $ug_ids = $forum_ids = array();
763 5553 acydburn
764 5553 acydburn
                // We need to go through the auth settings
765 5553 acydburn
                foreach ($auth_settings as $ug_id => $forum_auth_row)
766 5553 acydburn
                {
767 5553 acydburn
                        $ug_id = (int) $ug_id;
768 5553 acydburn
                        $ug_ids[] = $ug_id;
769 6073 acydburn
770 5553 acydburn
                        foreach ($forum_auth_row as $forum_id => $auth_options)
771 5553 acydburn
                        {
772 5553 acydburn
                                $forum_id = (int) $forum_id;
773 5553 acydburn
                                $forum_ids[] = $forum_id;
774 5553 acydburn
775 5574 acydburn
                                // Check role...
776 5848 acydburn
                                $assigned_role = (isset($auth_roles[$ug_id][$forum_id])) ? (int) $auth_roles[$ug_id][$forum_id] : 0;
777 5574 acydburn
778 5574 acydburn
                                // If the auth settings differ from the assigned role, then do not set a role...
779 5574 acydburn
                                if ($assigned_role)
780 5574 acydburn
                                {
781 5574 acydburn
                                        if (!$this->check_assigned_role($assigned_role, $auth_options))
782 5574 acydburn
                                        {
783 5574 acydburn
                                                $assigned_role = 0;
784 5574 acydburn
                                        }
785 5574 acydburn
                                }
786 5574 acydburn
787 5553 acydburn
                                // Update the permission set...
788 6024 acydburn
                                $auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_options, $assigned_role, false);
789 5553 acydburn
                        }
790 5553 acydburn
                }
791 5553 acydburn
792 6024 acydburn
                $auth_admin->acl_clear_prefetch();
793 6024 acydburn
794 5553 acydburn
                // Do we need to recache the moderator lists?
795 5553 acydburn
                if ($permission_type == 'm_')
796 5553 acydburn
                {
797 5553 acydburn
                        cache_moderators();
798 5553 acydburn
                }
799 5553 acydburn
800 5553 acydburn
                // Remove users who are now moderators or admins from everyones foes list
801 5553 acydburn
                if ($permission_type == 'm_' || $permission_type == 'a_')
802 5553 acydburn
                {
803 7109 davidmj
                        update_foes($group_id, $user_id);
804 5553 acydburn
                }
805 5553 acydburn
806 5553 acydburn
                $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_ids, $forum_ids);
807 5553 acydburn
808 9496 acydburn
                if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
809 9496 acydburn
                {
810 9496 acydburn
                        trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_ids)));
811 9496 acydburn
                }
812 9496 acydburn
                else
813 9496 acydburn
                {
814 9496 acydburn
                        trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
815 9496 acydburn
                }
816 5553 acydburn
        }
817 5553 acydburn
818 5553 acydburn
        /**
819 5574 acydburn
        * Compare auth settings with auth settings from role
820 5574 acydburn
        * returns false if they differ, true if they are equal
821 5574 acydburn
        */
822 5574 acydburn
        function check_assigned_role($role_id, &$auth_settings)
823 5574 acydburn
        {
824 5574 acydburn
                global $db;
825 5574 acydburn
826 5574 acydburn
                $sql = 'SELECT o.auth_option, r.auth_setting
827 5574 acydburn
                        FROM ' . ACL_OPTIONS_TABLE . ' o, ' . ACL_ROLES_DATA_TABLE . ' r
828 5574 acydburn
                        WHERE o.auth_option_id = r.auth_option_id
829 5574 acydburn
                                AND r.role_id = ' . $role_id;
830 5574 acydburn
                $result = $db->sql_query($sql);
831 5574 acydburn
832 5574 acydburn
                $test_auth_settings = array();
833 5574 acydburn
                while ($row = $db->sql_fetchrow($result))
834 5574 acydburn
                {
835 5574 acydburn
                        $test_auth_settings[$row['auth_option']] = $row['auth_setting'];
836 5574 acydburn
                }
837 5574 acydburn
                $db->sql_freeresult($result);
838 5574 acydburn
839 6115 acydburn
                // We need to add any ACL_NO setting from auth_settings to compare correctly
840 5574 acydburn
                foreach ($auth_settings as $option => $setting)
841 5574 acydburn
                {
842 6115 acydburn
                        if ($setting == ACL_NO)
843 5574 acydburn
                        {
844 5574 acydburn
                                $test_auth_settings[$option] = $setting;
845 5574 acydburn
                        }
846 5574 acydburn
                }
847 5574 acydburn
848 5574 acydburn
                if (sizeof(array_diff_assoc($auth_settings, $test_auth_settings)))
849 5574 acydburn
                {
850 5574 acydburn
                        return false;
851 5574 acydburn
                }
852 5574 acydburn
853 5574 acydburn
                return true;
854 5574 acydburn
        }
855 5574 acydburn
856 5574 acydburn
        /**
857 5553 acydburn
        * Remove permissions
858 5553 acydburn
        */
859 5553 acydburn
        function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id)
860 5553 acydburn
        {
861 5558 acydburn
                global $user, $db, $auth;
862 9402 acydburn
863 5553 acydburn
                // User or group to be set?
864 5553 acydburn
                $ug_type = (sizeof($user_id)) ? 'user' : 'group';
865 5553 acydburn
866 5553 acydburn
                // Check the permission setting again
867 5553 acydburn
                if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
868 5553 acydburn
                {
869 6428 acydburn
                        trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
870 5553 acydburn
                }
871 5553 acydburn
872 5576 acydburn
                $auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $permission_type);
873 5553 acydburn
874 5553 acydburn
                // Do we need to recache the moderator lists?
875 5553 acydburn
                if ($permission_type == 'm_')
876 5553 acydburn
                {
877 5553 acydburn
                        cache_moderators();
878 5553 acydburn
                }
879 5553 acydburn
880 5553 acydburn
                $this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0)));
881 6073 acydburn
882 9496 acydburn
                if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
883 9496 acydburn
                {
884 9496 acydburn
                        trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_id)));
885 9496 acydburn
                }
886 9496 acydburn
                else
887 9496 acydburn
                {
888 9496 acydburn
                        trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
889 9496 acydburn
                }
890 5553 acydburn
        }
891 5553 acydburn
892 5553 acydburn
        /**
893 5553 acydburn
        * Log permission changes
894 5553 acydburn
        */
895 5553 acydburn
        function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)
896 5553 acydburn
        {
897 5553 acydburn
                global $db, $user;
898 5553 acydburn
899 5553 acydburn
                if (!is_array($ug_id))
900 5553 acydburn
                {
901 5553 acydburn
                        $ug_id = array($ug_id);
902 5553 acydburn
                }
903 5553 acydburn
904 5553 acydburn
                if (!is_array($forum_id))
905 5553 acydburn
                {
906 5553 acydburn
                        $forum_id = array($forum_id);
907 5553 acydburn
                }
908 5553 acydburn
909 5553 acydburn
                // Logging ... first grab user or groupnames ...
910 6271 acydburn
                $sql = ($ug_type == 'group') ? 'SELECT group_name as name, group_type FROM ' . GROUPS_TABLE . ' WHERE ' : 'SELECT username as name FROM ' . USERS_TABLE . ' WHERE ';
911 6930 acydburn
                $sql .= $db->sql_in_set(($ug_type == 'group') ? 'group_id' : 'user_id', array_map('intval', $ug_id));
912 5553 acydburn
                $result = $db->sql_query($sql);
913 5553 acydburn
914 5553 acydburn
                $l_ug_list = '';
915 5553 acydburn
                while ($row = $db->sql_fetchrow($result))
916 5553 acydburn
                {
917 7329 vic_delfant
                        $l_ug_list .= (($l_ug_list != '') ? ', ' : '') . ((isset($row['group_type']) && $row['group_type'] == GROUP_SPECIAL) ? '<span class="sep">' . $user->lang['G_' . $row['name']] . '</span>' : $row['name']);
918 5553 acydburn
                }
919 5553 acydburn
                $db->sql_freeresult($result);
920 5553 acydburn
921 5553 acydburn
                $mode = str_replace('setting_', '', $mode);
922 5553 acydburn
923 5553 acydburn
                if ($forum_id[0] == 0)
924 5553 acydburn
                {
925 5553 acydburn
                        add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list);
926 5553 acydburn
                }
927 5553 acydburn
                else
928 5553 acydburn
                {
929 5553 acydburn
                        // Grab the forum details if non-zero forum_id
930 8147 acydburn
                        $sql = 'SELECT forum_name
931 5553 acydburn
                                FROM ' . FORUMS_TABLE . '
932 6271 acydburn
                                WHERE ' . $db->sql_in_set('forum_id', $forum_id);
933 5553 acydburn
                        $result = $db->sql_query($sql);
934 5553 acydburn
935 5553 acydburn
                        $l_forum_list = '';
936 5553 acydburn
                        while ($row = $db->sql_fetchrow($result))
937 5553 acydburn
                        {
938 5553 acydburn
                                $l_forum_list .= (($l_forum_list != '') ? ', ' : '') . $row['forum_name'];
939 5553 acydburn
                        }
940 5553 acydburn
                        $db->sql_freeresult($result);
941 5553 acydburn
942 5553 acydburn
                        add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list);
943 5553 acydburn
                }
944 5553 acydburn
        }
945 5553 acydburn
946 5553 acydburn
        /**
947 5824 acydburn
        * Display a complete trace tree for the selected permission to determine where settings are set/unset
948 5824 acydburn
        */
949 5824 acydburn
        function permission_trace($user_id, $forum_id, $permission)
950 5824 acydburn
        {
951 5824 acydburn
                global $db, $template, $user, $auth;
952 5824 acydburn
953 6009 naderman
                if ($user_id != $user->data['user_id'])
954 6009 naderman
                {
955 6028 naderman
                        $sql = 'SELECT user_id, username, user_permissions, user_type
956 6009 naderman
                                FROM ' . USERS_TABLE . '
957 6009 naderman
                                WHERE user_id = ' . $user_id;
958 6009 naderman
                        $result = $db->sql_query($sql);
959 6009 naderman
                        $userdata = $db->sql_fetchrow($result);
960 6009 naderman
                        $db->sql_freeresult($result);
961 6009 naderman
                }
962 6009 naderman
                else
963 6009 naderman
                {
964 6009 naderman
                        $userdata = $user->data;
965 6009 naderman
                }
966 5824 acydburn
967 6009 naderman
                if (!$userdata)
968 5824 acydburn
                {
969 6320 acydburn
                        trigger_error('NO_USERS', E_USER_ERROR);
970 5824 acydburn
                }
971 5824 acydburn
972 6009 naderman
                $forum_name = false;
973 6009 naderman
974 6009 naderman
                if ($forum_id)
975 6009 naderman
                {
976 6009 naderman
                        $sql = 'SELECT forum_name
977 6009 naderman
                                FROM ' . FORUMS_TABLE . "
978 6009 naderman
                                WHERE forum_id = $forum_id";
979 6009 naderman
                        $result = $db->sql_query($sql, 3600);
980 6073 acydburn
                        $forum_name = $db->sql_fetchfield('forum_name');
981 6009 naderman
                        $db->sql_freeresult($result);
982 6009 naderman
                }
983 6009 naderman
984 6009 naderman
                $back = request_var('back', 0);
985 6009 naderman
986 5824 acydburn
                $template->assign_vars(array(
987 5824 acydburn
                        'PERMISSION'                        => $user->lang['acl_' . $permission]['lang'],
988 6009 naderman
                        'PERMISSION_USERNAME'        => $userdata['username'],
989 6009 naderman
                        'FORUM_NAME'                        => $forum_name,
990 7884 acydburn
991 7884 acydburn
                        'S_GLOBAL_TRACE'                => ($forum_id) ? false : true,
992 7884 acydburn
993 7884 acydburn
                        'U_BACK'                                => ($back) ? build_url(array('f', 'back')) . "&amp;f=$back" : '')
994 5824 acydburn
                );
995 5824 acydburn
996 5824 acydburn
                $template->assign_block_vars('trace', array(
997 5824 acydburn
                        'WHO'                        => $user->lang['DEFAULT'],
998 5824 acydburn
                        'INFORMATION'        => $user->lang['TRACE_DEFAULT'],
999 5824 acydburn
1000 6115 acydburn
                        'S_SETTING_NO'                => true,
1001 6115 acydburn
                        'S_TOTAL_NO'                => true)
1002 5824 acydburn
                );
1003 5824 acydburn
1004 5824 acydburn
                $sql = 'SELECT DISTINCT g.group_name, g.group_id, g.group_type
1005 5824 acydburn
                        FROM ' . GROUPS_TABLE . ' g
1006 5824 acydburn
                                LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON (ug.group_id = g.group_id)
1007 5824 acydburn
                        WHERE ug.user_id = ' . $user_id . '
1008 6081 acydburn
                                AND ug.user_pending = 0
1009 9625 acydburn
                                AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
1010 5824 acydburn
                        ORDER BY g.group_type DESC, g.group_id DESC';
1011 5824 acydburn
                $result = $db->sql_query($sql);
1012 5824 acydburn
1013 5824 acydburn
                $groups = array();
1014 5824 acydburn
                while ($row = $db->sql_fetchrow($result))
1015 5824 acydburn
                {
1016 5824 acydburn
                        $groups[$row['group_id']] = array(
1017 6115 acydburn
                                'auth_setting'                => ACL_NO,
1018 5824 acydburn
                                'group_name'                => ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']
1019 5824 acydburn
                        );
1020 5824 acydburn
                }
1021 5824 acydburn
                $db->sql_freeresult($result);
1022 5824 acydburn
1023 6115 acydburn
                $total = ACL_NO;
1024 7884 acydburn
                $add_key = (($forum_id) ? '_LOCAL' : '');
1025 7884 acydburn
1026 5824 acydburn
                if (sizeof($groups))
1027 5824 acydburn
                {
1028 5824 acydburn
                        // Get group auth settings
1029 5824 acydburn
                        $hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id);
1030 5824 acydburn
1031 5824 acydburn
                        foreach ($hold_ary as $group_id => $forum_ary)
1032 5824 acydburn
                        {
1033 5824 acydburn
                                $groups[$group_id]['auth_setting'] = $hold_ary[$group_id][$forum_id][$permission];
1034 5824 acydburn
                        }
1035 5824 acydburn
                        unset($hold_ary);
1036 5824 acydburn
1037 5824 acydburn
                        foreach ($groups as $id => $row)
1038 5824 acydburn
                        {
1039 5824 acydburn
                                switch ($row['auth_setting'])
1040 5824 acydburn
                                {
1041 6115 acydburn
                                        case ACL_NO:
1042 7884 acydburn
                                                $information = $user->lang['TRACE_GROUP_NO' . $add_key];
1043 5824 acydburn
                                        break;
1044 5824 acydburn
1045 5824 acydburn
                                        case ACL_YES:
1046 7884 acydburn
                                                $information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_YES_TOTAL_NO' . $add_key]);
1047 6115 acydburn
                                                $total = ($total == ACL_NO) ? ACL_YES : $total;
1048 5824 acydburn
                                        break;
1049 5824 acydburn
1050 6115 acydburn
                                        case ACL_NEVER:
1051 7884 acydburn
                                                $information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_NEVER_TOTAL_NO' . $add_key]);
1052 6115 acydburn
                                                $total = ACL_NEVER;
1053 5824 acydburn
                                        break;
1054 5824 acydburn
                                }
1055 5824 acydburn
1056 5824 acydburn
                                $template->assign_block_vars('trace', array(
1057 5824 acydburn
                                        'WHO'                        => $row['group_name'],
1058 5824 acydburn
                                        'INFORMATION'        => $information,
1059 5824 acydburn
1060 6115 acydburn
                                        'S_SETTING_NO'                => ($row['auth_setting'] == ACL_NO) ? true : false,
1061 5824 acydburn
                                        'S_SETTING_YES'                => ($row['auth_setting'] == ACL_YES) ? true : false,
1062 6115 acydburn
                                        'S_SETTING_NEVER'        => ($row['auth_setting'] == ACL_NEVER) ? true : false,
1063 6115 acydburn
                                        'S_TOTAL_NO'                => ($total == ACL_NO) ? true : false,
1064 5824 acydburn
                                        'S_TOTAL_YES'                => ($total == ACL_YES) ? true : false,
1065 6115 acydburn
                                        'S_TOTAL_NEVER'                => ($total == ACL_NEVER) ? true : false)
1066 5824 acydburn
                                );
1067 5824 acydburn
                        }
1068 5824 acydburn
                }
1069 5824 acydburn
1070 7884 acydburn
                // Get user specific permission... globally or for this forum
1071 5824 acydburn
                $hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
1072 6115 acydburn
                $auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
1073 5824 acydburn
1074 5824 acydburn
                switch ($auth_setting)
1075 5824 acydburn
                {
1076 6115 acydburn
                        case ACL_NO:
1077 7884 acydburn
                                $information = ($total == ACL_NO) ? $user->lang['TRACE_USER_NO_TOTAL_NO' . $add_key] : $user->lang['TRACE_USER_KEPT' . $add_key];
1078 6115 acydburn
                                $total = ($total == ACL_NO) ? ACL_NEVER : $total;
1079 5824 acydburn
                        break;
1080 5824 acydburn
1081 5824 acydburn
                        case ACL_YES:
1082 7884 acydburn
                                $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_YES_TOTAL_NO' . $add_key]);
1083 6115 acydburn
                                $total = ($total == ACL_NO) ? ACL_YES : $total;
1084 5824 acydburn
                        break;
1085 5824 acydburn
1086 6115 acydburn
                        case ACL_NEVER:
1087 7884 acydburn
                                $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_NEVER_TOTAL_NO' . $add_key]);
1088 6115 acydburn
                                $total = ACL_NEVER;
1089 5824 acydburn
                        break;
1090 5824 acydburn
                }
1091 5858 acydburn
1092 5824 acydburn
                $template->assign_block_vars('trace', array(
1093 6009 naderman
                        'WHO'                        => $userdata['username'],
1094 5824 acydburn
                        'INFORMATION'        => $information,
1095 5824 acydburn
1096 6115 acydburn
                        'S_SETTING_NO'                => ($auth_setting == ACL_NO) ? true : false,
1097 5824 acydburn
                        'S_SETTING_YES'                => ($auth_setting == ACL_YES) ? true : false,
1098 6115 acydburn
                        'S_SETTING_NEVER'        => ($auth_setting == ACL_NEVER) ? true : false,
1099 6115 acydburn
                        'S_TOTAL_NO'                => false,
1100 5824 acydburn
                        'S_TOTAL_YES'                => ($total == ACL_YES) ? true : false,
1101 6115 acydburn
                        'S_TOTAL_NEVER'                => ($total == ACL_NEVER) ? true : false)
1102 5824 acydburn
                );
1103 5858 acydburn
1104 7884 acydburn
                if ($forum_id != 0 && isset($auth->acl_options['global'][$permission]))
1105 6009 naderman
                {
1106 6009 naderman
                        if ($user_id != $user->data['user_id'])
1107 6009 naderman
                        {
1108 6009 naderman
                                $auth2 = new auth();
1109 6009 naderman
                                $auth2->acl($userdata);
1110 6009 naderman
                                $auth_setting = $auth2->acl_get($permission);
1111 6009 naderman
                        }
1112 6009 naderman
                        else
1113 6009 naderman
                        {
1114 6009 naderman
                                $auth_setting = $auth->acl_get($permission);
1115 6009 naderman
                        }
1116 6009 naderman
1117 6009 naderman
                        if ($auth_setting)
1118 6009 naderman
                        {
1119 6115 acydburn
                                $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_YES'] : $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_NEVER'];
1120 6009 naderman
                                $total = ACL_YES;
1121 6009 naderman
                        }
1122 6009 naderman
                        else
1123 6009 naderman
                        {
1124 6115 acydburn
                                $information = $user->lang['TRACE_USER_GLOBAL_NEVER_TOTAL_KEPT'];
1125 6009 naderman
                        }
1126 6009 naderman
1127 7884 acydburn
                        // If there is no auth information we do not need to worry the user by showing non-relevant data.
1128 7884 acydburn
                        if ($auth_setting)
1129 7884 acydburn
                        {
1130 7884 acydburn
                                $template->assign_block_vars('trace', array(
1131 7884 acydburn
                                        'WHO'                        => sprintf($user->lang['TRACE_GLOBAL_SETTING'], $userdata['username']),
1132 7884 acydburn
                                        'INFORMATION'        => sprintf($information, '<a href="' . $this->u_action . "&amp;u=$user_id&amp;f=0&amp;auth=$permission&amp;back=$forum_id\">", '</a>'),
1133 6009 naderman
1134 7884 acydburn
                                        'S_SETTING_NO'                => false,
1135 7884 acydburn
                                        'S_SETTING_YES'                => $auth_setting,
1136 7884 acydburn
                                        'S_SETTING_NEVER'        => !$auth_setting,
1137 7884 acydburn
                                        'S_TOTAL_NO'                => false,
1138 7884 acydburn
                                        'S_TOTAL_YES'                => ($total == ACL_YES) ? true : false,
1139 7884 acydburn
                                        'S_TOTAL_NEVER'                => ($total == ACL_NEVER) ? true : false)
1140 7884 acydburn
                                );
1141 7884 acydburn
                        }
1142 6009 naderman
                }
1143 6009 naderman
1144 5858 acydburn
                // Take founder status into account, overwriting the default values
1145 6009 naderman
                if ($userdata['user_type'] == USER_FOUNDER && strpos($permission, 'a_') === 0)
1146 5858 acydburn
                {
1147 5858 acydburn
                        $template->assign_block_vars('trace', array(
1148 6028 naderman
                                'WHO'                        => $userdata['username'],
1149 5858 acydburn
                                'INFORMATION'        => $user->lang['TRACE_USER_FOUNDER'],
1150 5858 acydburn
1151 6115 acydburn
                                'S_SETTING_NO'                => ($auth_setting == ACL_NO) ? true : false,
1152 5858 acydburn
                                'S_SETTING_YES'                => ($auth_setting == ACL_YES) ? true : false,
1153 6115 acydburn
                                'S_SETTING_NEVER'        => ($auth_setting == ACL_NEVER) ? true : false,
1154 6115 acydburn
                                'S_TOTAL_NO'                => false,
1155 5858 acydburn
                                'S_TOTAL_YES'                => true,
1156 6115 acydburn
                                'S_TOTAL_NEVER'                => false)
1157 5858 acydburn
                        );
1158 7884 acydburn
1159 7884 acydburn
                        $total = ACL_YES;
1160 5858 acydburn
                }
1161 7884 acydburn
1162 7884 acydburn
                // Total value...
1163 7884 acydburn
                $template->assign_vars(array(
1164 7884 acydburn
                        'S_RESULT_NO'                => ($total == ACL_NO) ? true : false,
1165 7884 acydburn
                        'S_RESULT_YES'                => ($total == ACL_YES) ? true : false,
1166 7884 acydburn
                        'S_RESULT_NEVER'        => ($total == ACL_NEVER) ? true : false,
1167 7884 acydburn
                ));
1168 5824 acydburn
        }
1169 6228 acydburn
1170 6228 acydburn
        /**
1171 9887 bantu
        * Handles copying permissions from one forum to others
1172 9887 bantu
        */
1173 9887 bantu
        function copy_forum_permissions()
1174 9887 bantu
        {
1175 9887 bantu
                global $auth, $cache, $template, $user;
1176 9887 bantu
1177 9887 bantu
                $user->add_lang('acp/forums');
1178 9887 bantu
1179 9887 bantu
                $submit = isset($_POST['submit']) ? true : false;
1180 9887 bantu
1181 9887 bantu
                if ($submit)
1182 9887 bantu
                {
1183 9887 bantu
                        $src = request_var('src_forum_id', 0);
1184 9887 bantu
                        $dest = request_var('dest_forum_ids', array(0));
1185 9887 bantu
1186 9887 bantu
                        if (confirm_box(true))
1187 9887 bantu
                        {
1188 9887 bantu
                                if (copy_forum_permissions($src, $dest))
1189 9887 bantu
                                {
1190 9887 bantu
                                        cache_moderators();
1191 9887 bantu
1192 9887 bantu
                                        $auth->acl_clear_prefetch();
1193 9887 bantu
                                        $cache->destroy('sql', FORUMS_TABLE);
1194 9887 bantu
1195 9887 bantu
                                        trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
1196 9887 bantu
                                }
1197 9887 bantu
                                else
1198 9887 bantu
                                {
1199 9887 bantu
                                        trigger_error($user->lang['SELECTED_FORUM_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
1200 9887 bantu
                                }
1201 9887 bantu
                        }
1202 9887 bantu
                        else
1203 9887 bantu
                        {
1204 9887 bantu
                                $s_hidden_fields = array(
1205 9887 bantu
                                        'submit'                        => $submit,
1206 9887 bantu
                                        'src_forum_id'                => $src,
1207 9887 bantu
                                        'dest_forum_ids'        => $dest,
1208 9887 bantu
                                );
1209 9887 bantu
1210 9887 bantu
                                $s_hidden_fields = build_hidden_fields($s_hidden_fields);
1211 9887 bantu
1212 10017 bantu
                                confirm_box(false, $user->lang['COPY_PERMISSIONS_CONFIRM'], $s_hidden_fields);
1213 9887 bantu
                        }
1214 9887 bantu
                }
1215 9887 bantu
1216 9887 bantu
                $template->assign_vars(array(
1217 9887 bantu
                        'S_FORUM_OPTIONS' => make_forum_select(false, false, false, false, false),
1218 9887 bantu
                ));
1219 9887 bantu
        }
1220 9887 bantu
1221 9887 bantu
        /**
1222 6228 acydburn
        * Get already assigned users/groups
1223 6228 acydburn
        */
1224 6228 acydburn
        function retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type)
1225 6228 acydburn
        {
1226 6228 acydburn
                global $db, $user;
1227 6228 acydburn
1228 6271 acydburn
                $sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
1229 6228 acydburn
1230 8390 acydburn
                // Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
1231 8390 acydburn
                $option_ids = $role_ids = array();
1232 6228 acydburn
1233 8390 acydburn
                $sql = 'SELECT auth_option_id
1234 8390 acydburn
                        FROM ' . ACL_OPTIONS_TABLE . '
1235 8390 acydburn
                        WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
1236 8390 acydburn
                $result = $db->sql_query($sql);
1237 6228 acydburn
1238 8390 acydburn
                while ($row = $db->sql_fetchrow($result))
1239 8390 acydburn
                {
1240 8390 acydburn
                        $option_ids[] = (int) $row['auth_option_id'];
1241 8390 acydburn
                }
1242 8390 acydburn
                $db->sql_freeresult($result);
1243 8390 acydburn
1244 8390 acydburn
                if (sizeof($option_ids))
1245 8390 acydburn
                {
1246 8390 acydburn
                        $sql = 'SELECT DISTINCT role_id
1247 8390 acydburn
                                FROM ' . ACL_ROLES_DATA_TABLE . '
1248 8390 acydburn
                                WHERE ' . $db->sql_in_set('auth_option_id', $option_ids);
1249 8390 acydburn
                        $result = $db->sql_query($sql);
1250 8390 acydburn
1251 8390 acydburn
                        while ($row = $db->sql_fetchrow($result))
1252 8390 acydburn
                        {
1253 8390 acydburn
                                $role_ids[] = (int) $row['role_id'];
1254 8390 acydburn
                        }
1255 8390 acydburn
                        $db->sql_freeresult($result);
1256 8390 acydburn
                }
1257 8390 acydburn
1258 8390 acydburn
                if (sizeof($option_ids) && sizeof($role_ids))
1259 8390 acydburn
                {
1260 8390 acydburn
                        $sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
1261 8390 acydburn
                }
1262 9402 acydburn
                else if (sizeof($role_ids))
1263 8390 acydburn
                {
1264 9402 acydburn
                        $sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids);
1265 9402 acydburn
                }
1266 9402 acydburn
                else if (sizeof($option_ids))
1267 9402 acydburn
                {
1268 8390 acydburn
                        $sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
1269 8390 acydburn
                }
1270 8390 acydburn
1271 8390 acydburn
                // Not ideal, due to the filesort, non-use of indexes, etc.
1272 8496 davidmj
                $sql = 'SELECT DISTINCT u.user_id, u.username, u.username_clean, u.user_regdate
1273 8390 acydburn
                        FROM ' . USERS_TABLE . ' u, ' . ACL_USERS_TABLE . " a
1274 8390 acydburn
                        WHERE u.user_id = a.user_id
1275 6228 acydburn
                                $sql_forum_id
1276 8390 acydburn
                                $sql_where
1277 8390 acydburn
                        ORDER BY u.username_clean, u.user_regdate ASC";
1278 6228 acydburn
                $result = $db->sql_query($sql);
1279 6228 acydburn
1280 6228 acydburn
                $s_defined_user_options = '';
1281 6228 acydburn
                $defined_user_ids = array();
1282 6228 acydburn
                while ($row = $db->sql_fetchrow($result))
1283 6228 acydburn
                {
1284 6228 acydburn
                        $s_defined_user_options .= '<option value="' . $row['user_id'] . '">' . $row['username'] . '</option>';
1285 6228 acydburn
                        $defined_user_ids[] = $row['user_id'];
1286 6228 acydburn
                }
1287 6228 acydburn
                $db->sql_freeresult($result);
1288 6228 acydburn
1289 8390 acydburn
                $sql = 'SELECT DISTINCT g.group_type, g.group_name, g.group_id
1290 8390 acydburn
                        FROM ' . GROUPS_TABLE . ' g, ' . ACL_GROUPS_TABLE . " a
1291 8390 acydburn
                        WHERE g.group_id = a.group_id
1292 6228 acydburn
                                $sql_forum_id
1293 8390 acydburn
                                $sql_where
1294 8390 acydburn
                        ORDER BY g.group_type DESC, g.group_name ASC";
1295 6228 acydburn
                $result = $db->sql_query($sql);
1296 6228 acydburn
1297 6228 acydburn
                $s_defined_group_options = '';
1298 6228 acydburn
                $defined_group_ids = array();
1299 6228 acydburn
                while ($row = $db->sql_fetchrow($result))
1300 6228 acydburn
                {
1301 6228 acydburn
                        $s_defined_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
1302 6228 acydburn
                        $defined_group_ids[] = $row['group_id'];
1303 6228 acydburn
                }
1304 6228 acydburn
                $db->sql_freeresult($result);
1305 6228 acydburn
1306 6228 acydburn
                return array(
1307 6228 acydburn
                        'group_ids'                        => $defined_group_ids,
1308 6228 acydburn
                        'group_ids_options'        => $s_defined_group_options,
1309 6228 acydburn
                        'user_ids'                        => $defined_user_ids,
1310 6228 acydburn
                        'user_ids_options'        => $s_defined_user_options
1311 6228 acydburn
                );
1312 6228 acydburn
        }
1313 5553 acydburn
}
1314 5553 acydburn
1315 5553 acydburn
?>