Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
acp_permissions.php
0001 <?php
0002 /**
0003 *
0004 * This file is part of the phpBB Forum Software package.
0005 *
0006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007 * @license GNU General Public License, version 2 (GPL-2.0)
0008 *
0009 * For full copyright and license information, please see
0010 * the docs/CREDITS.txt file.
0011 *
0012 */
0013
0014 /**
0015 * @ignore
0016 */
0017 if (!defined('IN_PHPBB'))
0018 {
0019 exit;
0020 }
0021
0022 class acp_permissions
0023 {
0024 var $u_action;
0025 var $permission_dropdown;
0026 protected $permissions;
0027
0028 function main($id, $mode)
0029 {
0030 global $db, $user, $auth, $template, $cache, $phpbb_container;
0031 global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
0032
0033 include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
0034 include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
0035
0036 $this->permissions = $phpbb_container->get('acl.permissions');
0037
0038 $auth_admin = new auth_admin();
0039
0040 $user->add_lang('acp/permissions');
0041 add_permission_language();
0042
0043 $this->tpl_name = 'acp_permissions';
0044
0045 // Trace has other vars
0046 if ($mode == 'trace')
0047 {
0048 $user_id = request_var('u', 0);
0049 $forum_id = request_var('f', 0);
0050 $permission = request_var('auth', '');
0051
0052 $this->tpl_name = 'permission_trace';
0053
0054 if ($user_id && isset($auth_admin->acl_options['id'][$permission]) && $auth->acl_get('a_viewauth'))
0055 {
0056 $this->page_title = sprintf($user->lang['TRACE_PERMISSION'], $this->permissions->get_permission_lang($permission));
0057 $this->permission_trace($user_id, $forum_id, $permission);
0058 return;
0059 }
0060 trigger_error('NO_MODE', E_USER_ERROR);
0061 }
0062
0063 // Copy forum permissions
0064 if ($mode == 'setting_forum_copy')
0065 {
0066 $this->tpl_name = 'permission_forum_copy';
0067
0068 if ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
0069 {
0070 $this->page_title = 'ACP_FORUM_PERMISSIONS_COPY';
0071 $this->copy_forum_permissions();
0072 return;
0073 }
0074
0075 trigger_error('NO_MODE', E_USER_ERROR);
0076 }
0077
0078 // Set some vars
0079 $action = request_var('action', array('' => 0));
0080 $action = key($action);
0081 $action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action;
0082
0083 $all_forums = request_var('all_forums', 0);
0084 $subforum_id = request_var('subforum_id', 0);
0085 $forum_id = request_var('forum_id', array(0));
0086
0087 $username = request_var('username', array(''), true);
0088 $usernames = request_var('usernames', '', true);
0089 $user_id = request_var('user_id', array(0));
0090
0091 $group_id = request_var('group_id', array(0));
0092 $select_all_groups = request_var('select_all_groups', 0);
0093
0094 $form_name = 'acp_permissions';
0095 add_form_key($form_name);
0096
0097 // 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)
0098 if ($select_all_groups)
0099 {
0100 // Add default groups to selection
0101 $sql_and = (!$config['coppa_enable']) ? " AND group_name <> 'REGISTERED_COPPA'" : '';
0102
0103 $sql = 'SELECT group_id
0104 FROM ' . GROUPS_TABLE . '
0105 WHERE group_type = ' . GROUP_SPECIAL . "
0106 $sql_and";
0107 $result = $db->sql_query($sql);
0108
0109 while ($row = $db->sql_fetchrow($result))
0110 {
0111 $group_id[] = $row['group_id'];
0112 }
0113 $db->sql_freeresult($result);
0114 }
0115
0116 // Map usernames to ids and vice versa
0117 if ($usernames)
0118 {
0119 $username = explode("\n", $usernames);
0120 }
0121 unset($usernames);
0122
0123 if (sizeof($username) && !sizeof($user_id))
0124 {
0125 user_get_id_name($user_id, $username);
0126
0127 if (!sizeof($user_id))
0128 {
0129 trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
0130 }
0131 }
0132 unset($username);
0133
0134 // Build forum ids (of all forums are checked or subforum listing used)
0135 if ($all_forums)
0136 {
0137 $sql = 'SELECT forum_id
0138 FROM ' . FORUMS_TABLE . '
0139 ORDER BY left_id';
0140 $result = $db->sql_query($sql);
0141
0142 $forum_id = array();
0143 while ($row = $db->sql_fetchrow($result))
0144 {
0145 $forum_id[] = (int) $row['forum_id'];
0146 }
0147 $db->sql_freeresult($result);
0148 }
0149 else if ($subforum_id)
0150 {
0151 $forum_id = array();
0152 foreach (get_forum_branch($subforum_id, 'children') as $row)
0153 {
0154 $forum_id[] = (int) $row['forum_id'];
0155 }
0156 }
0157
0158 // Define some common variables for every mode
0159 $error = array();
0160
0161 $permission_scope = (strpos($mode, '_global') !== false) ? 'global' : 'local';
0162
0163 // Showing introductionary page?
0164 if ($mode == 'intro')
0165 {
0166 $this->page_title = 'ACP_PERMISSIONS';
0167
0168 $template->assign_vars(array(
0169 'S_INTRO' => true)
0170 );
0171
0172 return;
0173 }
0174
0175 switch ($mode)
0176 {
0177 case 'setting_user_global':
0178 case 'setting_group_global':
0179 $this->permission_dropdown = array('u_', 'm_', 'a_');
0180 $permission_victim = ($mode == 'setting_user_global') ? array('user') : array('group');
0181 $this->page_title = ($mode == 'setting_user_global') ? 'ACP_USERS_PERMISSIONS' : 'ACP_GROUPS_PERMISSIONS';
0182 break;
0183
0184 case 'setting_user_local':
0185 case 'setting_group_local':
0186 $this->permission_dropdown = array('f_', 'm_');
0187 $permission_victim = ($mode == 'setting_user_local') ? array('user', 'forums') : array('group', 'forums');
0188 $this->page_title = ($mode == 'setting_user_local') ? 'ACP_USERS_FORUM_PERMISSIONS' : 'ACP_GROUPS_FORUM_PERMISSIONS';
0189 break;
0190
0191 case 'setting_admin_global':
0192 case 'setting_mod_global':
0193 $this->permission_dropdown = (strpos($mode, '_admin_') !== false) ? array('a_') : array('m_');
0194 $permission_victim = array('usergroup');
0195 $this->page_title = ($mode == 'setting_admin_global') ? 'ACP_ADMINISTRATORS' : 'ACP_GLOBAL_MODERATORS';
0196 break;
0197
0198 case 'setting_mod_local':
0199 case 'setting_forum_local':
0200 $this->permission_dropdown = ($mode == 'setting_mod_local') ? array('m_') : array('f_');
0201 $permission_victim = array('forums', 'usergroup');
0202 $this->page_title = ($mode == 'setting_mod_local') ? 'ACP_FORUM_MODERATORS' : 'ACP_FORUM_PERMISSIONS';
0203 break;
0204
0205 case 'view_admin_global':
0206 case 'view_user_global':
0207 case 'view_mod_global':
0208 $this->permission_dropdown = ($mode == 'view_admin_global') ? array('a_') : (($mode == 'view_user_global') ? array('u_') : array('m_'));
0209 $permission_victim = array('usergroup_view');
0210 $this->page_title = ($mode == 'view_admin_global') ? 'ACP_VIEW_ADMIN_PERMISSIONS' : (($mode == 'view_user_global') ? 'ACP_VIEW_USER_PERMISSIONS' : 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS');
0211 break;
0212
0213 case 'view_mod_local':
0214 case 'view_forum_local':
0215 $this->permission_dropdown = ($mode == 'view_mod_local') ? array('m_') : array('f_');
0216 $permission_victim = array('forums', 'usergroup_view');
0217 $this->page_title = ($mode == 'view_mod_local') ? 'ACP_VIEW_FORUM_MOD_PERMISSIONS' : 'ACP_VIEW_FORUM_PERMISSIONS';
0218 break;
0219
0220 default:
0221 trigger_error('NO_MODE', E_USER_ERROR);
0222 break;
0223 }
0224
0225 $template->assign_vars(array(
0226 'L_TITLE' => $user->lang[$this->page_title],
0227 'L_EXPLAIN' => $user->lang[$this->page_title . '_EXPLAIN'])
0228 );
0229
0230 // Get permission type
0231 $permission_type = request_var('type', $this->permission_dropdown[0]);
0232
0233 if (!in_array($permission_type, $this->permission_dropdown))
0234 {
0235 trigger_error($user->lang['WRONG_PERMISSION_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
0236 }
0237
0238 // Handle actions
0239 if (strpos($mode, 'setting_') === 0 && $action)
0240 {
0241 switch ($action)
0242 {
0243 case 'delete':
0244 if (confirm_box(true))
0245 {
0246 // All users/groups selected?
0247 $all_users = (isset($_POST['all_users'])) ? true : false;
0248 $all_groups = (isset($_POST['all_groups'])) ? true : false;
0249
0250 if ($all_users || $all_groups)
0251 {
0252 $items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
0253
0254 if ($all_users && sizeof($items['user_ids']))
0255 {
0256 $user_id = $items['user_ids'];
0257 }
0258 else if ($all_groups && sizeof($items['group_ids']))
0259 {
0260 $group_id = $items['group_ids'];
0261 }
0262 }
0263
0264 if (sizeof($user_id) || sizeof($group_id))
0265 {
0266 $this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
0267 }
0268 else
0269 {
0270 trigger_error($user->lang['NO_USER_GROUP_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
0271 }
0272 }
0273 else
0274 {
0275 if (isset($_POST['cancel']))
0276 {
0277 $u_redirect = $this->u_action . '&type=' . $permission_type;
0278 foreach ($forum_id as $fid)
0279 {
0280 $u_redirect .= '&forum_id[]=' . $fid;
0281 }
0282 redirect($u_redirect);
0283 }
0284
0285 $s_hidden_fields = array(
0286 'i' => $id,
0287 'mode' => $mode,
0288 'action' => array($action => 1),
0289 'user_id' => $user_id,
0290 'group_id' => $group_id,
0291 'forum_id' => $forum_id,
0292 'type' => $permission_type,
0293 );
0294 if (isset($_POST['all_users']))
0295 {
0296 $s_hidden_fields['all_users'] = 1;
0297 }
0298 if (isset($_POST['all_groups']))
0299 {
0300 $s_hidden_fields['all_groups'] = 1;
0301 }
0302 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields));
0303 }
0304 break;
0305
0306 case 'apply_permissions':
0307 if (!isset($_POST['setting']))
0308 {
0309 trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
0310 }
0311 if (!check_form_key($form_name))
0312 {
0313 trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
0314 }
0315
0316 $this->set_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
0317 break;
0318
0319 case 'apply_all_permissions':
0320 if (!isset($_POST['setting']))
0321 {
0322 trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
0323 }
0324 if (!check_form_key($form_name))
0325 {
0326 trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
0327 }
0328
0329 $this->set_all_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
0330 break;
0331 }
0332 }
0333
0334 // Go through the screens/options needed and present them in correct order
0335 foreach ($permission_victim as $victim)
0336 {
0337 switch ($victim)
0338 {
0339 case 'forum_dropdown':
0340
0341 if (sizeof($forum_id))
0342 {
0343 $this->check_existence('forum', $forum_id);
0344 continue 2;
0345 }
0346
0347 $template->assign_vars(array(
0348 'S_SELECT_FORUM' => true,
0349 'S_FORUM_OPTIONS' => make_forum_select(false, false, true, false, false))
0350 );
0351
0352 break;
0353
0354 case 'forums':
0355
0356 if (sizeof($forum_id))
0357 {
0358 $this->check_existence('forum', $forum_id);
0359 continue 2;
0360 }
0361
0362 $forum_list = make_forum_select(false, false, true, false, false, false, true);
0363
0364 // Build forum options
0365 $s_forum_options = '';
0366 foreach ($forum_list as $f_id => $f_row)
0367 {
0368 $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>';
0369 }
0370
0371 // Build subforum options
0372 $s_subforum_options = $this->build_subforum_options($forum_list);
0373
0374 $template->assign_vars(array(
0375 'S_SELECT_FORUM' => true,
0376 'S_FORUM_OPTIONS' => $s_forum_options,
0377 'S_SUBFORUM_OPTIONS' => $s_subforum_options,
0378 'S_FORUM_ALL' => true,
0379 'S_FORUM_MULTIPLE' => true)
0380 );
0381
0382 break;
0383
0384 case 'user':
0385
0386 if (sizeof($user_id))
0387 {
0388 $this->check_existence('user', $user_id);
0389 continue 2;
0390 }
0391
0392 $template->assign_vars(array(
0393 'S_SELECT_USER' => true,
0394 'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=select_victim&field=username&select_single=true'),
0395 ));
0396
0397 break;
0398
0399 case 'group':
0400
0401 if (sizeof($group_id))
0402 {
0403 $this->check_existence('group', $group_id);
0404 continue 2;
0405 }
0406
0407 $template->assign_vars(array(
0408 'S_SELECT_GROUP' => true,
0409 'S_GROUP_OPTIONS' => group_select_options(false, false, false), // Show all groups
0410 ));
0411
0412 break;
0413
0414 case 'usergroup':
0415 case 'usergroup_view':
0416
0417 $all_users = (isset($_POST['all_users'])) ? true : false;
0418 $all_groups = (isset($_POST['all_groups'])) ? true : false;
0419
0420 if ((sizeof($user_id) && !$all_users) || (sizeof($group_id) && !$all_groups))
0421 {
0422 if (sizeof($user_id))
0423 {
0424 $this->check_existence('user', $user_id);
0425 }
0426
0427 if (sizeof($group_id))
0428 {
0429 $this->check_existence('group', $group_id);
0430 }
0431
0432 continue 2;
0433 }
0434
0435 // Now we check the users... because the "all"-selection is different here (all defined users/groups)
0436 $items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
0437
0438 if ($all_users && sizeof($items['user_ids']))
0439 {
0440 $user_id = $items['user_ids'];
0441 continue 2;
0442 }
0443
0444 if ($all_groups && sizeof($items['group_ids']))
0445 {
0446 $group_id = $items['group_ids'];
0447 continue 2;
0448 }
0449
0450 $template->assign_vars(array(
0451 'S_SELECT_USERGROUP' => ($victim == 'usergroup') ? true : false,
0452 'S_SELECT_USERGROUP_VIEW' => ($victim == 'usergroup_view') ? true : false,
0453 'S_DEFINED_USER_OPTIONS' => $items['user_ids_options'],
0454 'S_DEFINED_GROUP_OPTIONS' => $items['group_ids_options'],
0455 'S_ADD_GROUP_OPTIONS' => group_select_options(false, $items['group_ids'], false), // Show all groups
0456 'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=add_user&field=username&select_single=true'),
0457 ));
0458
0459 break;
0460 }
0461
0462 // The S_ALLOW_SELECT parameter below is a measure to lower memory usage.
0463 // If there are more than 5 forums selected the admin is not able to select all users/groups too.
0464 // We need to see if the number of forums can be increased or need to be decreased.
0465
0466 // Setting permissions screen
0467 $s_hidden_fields = build_hidden_fields(array(
0468 'user_id' => $user_id,
0469 'group_id' => $group_id,
0470 'forum_id' => $forum_id,
0471 'type' => $permission_type,
0472 ));
0473
0474 $template->assign_vars(array(
0475 'U_ACTION' => $this->u_action,
0476 'ANONYMOUS_USER_ID' => ANONYMOUS,
0477
0478 'S_SELECT_VICTIM' => true,
0479 'S_ALLOW_ALL_SELECT' => (sizeof($forum_id) > 5) ? false : true,
0480 'S_CAN_SELECT_USER' => ($auth->acl_get('a_authusers')) ? true : false,
0481 'S_CAN_SELECT_GROUP' => ($auth->acl_get('a_authgroups')) ? true : false,
0482 'S_HIDDEN_FIELDS' => $s_hidden_fields)
0483 );
0484
0485 // Let the forum names being displayed
0486 if (sizeof($forum_id))
0487 {
0488 $sql = 'SELECT forum_name
0489 FROM ' . FORUMS_TABLE . '
0490 WHERE ' . $db->sql_in_set('forum_id', $forum_id) . '
0491 ORDER BY left_id ASC';
0492 $result = $db->sql_query($sql);
0493
0494 $forum_names = array();
0495 while ($row = $db->sql_fetchrow($result))
0496 {
0497 $forum_names[] = $row['forum_name'];
0498 }
0499 $db->sql_freeresult($result);
0500
0501 $template->assign_vars(array(
0502 'S_FORUM_NAMES' => (sizeof($forum_names)) ? true : false,
0503 'FORUM_NAMES' => implode($user->lang['COMMA_SEPARATOR'], $forum_names))
0504 );
0505 }
0506
0507 return;
0508 }
0509
0510 // Setting permissions screen
0511 $s_hidden_fields = build_hidden_fields(array(
0512 'user_id' => $user_id,
0513 'group_id' => $group_id,
0514 'forum_id' => $forum_id,
0515 'type' => $permission_type,
0516 ));
0517
0518 // Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
0519 if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id))
0520 {
0521 trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING);
0522 }
0523
0524 $template->assign_vars(array(
0525 'S_PERMISSION_DROPDOWN' => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
0526 'L_PERMISSION_TYPE' => $this->permissions->get_type_lang($permission_type),
0527
0528 'U_ACTION' => $this->u_action,
0529 'S_HIDDEN_FIELDS' => $s_hidden_fields)
0530 );
0531
0532 if (strpos($mode, 'setting_') === 0)
0533 {
0534 $template->assign_vars(array(
0535 'S_SETTING_PERMISSIONS' => true)
0536 );
0537
0538 $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);
0539 $auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
0540 }
0541 else
0542 {
0543 $template->assign_vars(array(
0544 'S_VIEWING_PERMISSIONS' => true)
0545 );
0546
0547 $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);
0548 $auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
0549 }
0550 }
0551
0552 /**
0553 * Build +subforum options
0554 */
0555 function build_subforum_options($forum_list)
0556 {
0557 global $user;
0558
0559 $s_options = '';
0560
0561 $forum_list = array_merge($forum_list);
0562
0563 foreach ($forum_list as $key => $row)
0564 {
0565 if ($row['disabled'])
0566 {
0567 continue;
0568 }
0569
0570 $s_options .= '<option value="' . $row['forum_id'] . '"' . (($row['selected']) ? ' selected="selected"' : '') . '>' . $row['padding'] . $row['forum_name'];
0571
0572 // We check if a branch is there...
0573 $branch_there = false;
0574
0575 foreach (array_slice($forum_list, $key + 1) as $temp_row)
0576 {
0577 if ($temp_row['left_id'] > $row['left_id'] && $temp_row['left_id'] < $row['right_id'])
0578 {
0579 $branch_there = true;
0580 break;
0581 }
0582 continue;
0583 }
0584
0585 if ($branch_there)
0586 {
0587 $s_options .= ' [' . $user->lang['PLUS_SUBFORUMS'] . ']';
0588 }
0589
0590 $s_options .= '</option>';
0591 }
0592
0593 return $s_options;
0594 }
0595
0596 /**
0597 * Build dropdown field for changing permission types
0598 */
0599 function build_permission_dropdown($options, $default_option, $permission_scope)
0600 {
0601 global $auth;
0602
0603 $s_dropdown_options = '';
0604 foreach ($options as $setting)
0605 {
0606 if (!$auth->acl_get('a_' . str_replace('_', '', $setting) . 'auth'))
0607 {
0608 continue;
0609 }
0610
0611 $selected = ($setting == $default_option) ? ' selected="selected"' : '';
0612 $l_setting = $this->permissions->get_type_lang($setting, $permission_scope);
0613 $s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $l_setting . '</option>';
0614 }
0615
0616 return $s_dropdown_options;
0617 }
0618
0619 /**
0620 * Check if selected items exist. Remove not found ids and if empty return error.
0621 */
0622 function check_existence($mode, &$ids)
0623 {
0624 global $db, $user;
0625
0626 switch ($mode)
0627 {
0628 case 'user':
0629 $table = USERS_TABLE;
0630 $sql_id = 'user_id';
0631 break;
0632
0633 case 'group':
0634 $table = GROUPS_TABLE;
0635 $sql_id = 'group_id';
0636 break;
0637
0638 case 'forum':
0639 $table = FORUMS_TABLE;
0640 $sql_id = 'forum_id';
0641 break;
0642 }
0643
0644 if (sizeof($ids))
0645 {
0646 $sql = "SELECT $sql_id
0647 FROM $table
0648 WHERE " . $db->sql_in_set($sql_id, $ids);
0649 $result = $db->sql_query($sql);
0650
0651 $ids = array();
0652 while ($row = $db->sql_fetchrow($result))
0653 {
0654 $ids[] = (int) $row[$sql_id];
0655 }
0656 $db->sql_freeresult($result);
0657 }
0658
0659 if (!sizeof($ids))
0660 {
0661 trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
0662 }
0663 }
0664
0665 /**
0666 * Apply permissions
0667 */
0668 function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
0669 {
0670 global $db, $cache, $user, $auth;
0671 global $request;
0672
0673 $psubmit = request_var('psubmit', array(0 => array(0 => 0)));
0674
0675 // User or group to be set?
0676 $ug_type = (sizeof($user_id)) ? 'user' : 'group';
0677
0678 // Check the permission setting again
0679 if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
0680 {
0681 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
0682 }
0683
0684 $ug_id = $forum_id = 0;
0685
0686 // We loop through the auth settings defined in our submit
0687 list($ug_id, ) = each($psubmit);
0688 list($forum_id, ) = each($psubmit[$ug_id]);
0689
0690 $settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, \phpbb\request\request_interface::POST);
0691 if (empty($settings) || empty($settings[$ug_id]) || empty($settings[$ug_id][$forum_id]))
0692 {
0693 trigger_error('WRONG_PERMISSION_SETTING_FORMAT', E_USER_WARNING);
0694 }
0695
0696 $auth_settings = $settings[$ug_id][$forum_id];
0697
0698 // Do we have a role we want to set?
0699 $roles = $request->variable('role', array(0 => array(0 => 0)), false, \phpbb\request\request_interface::POST);
0700 $assigned_role = (isset($roles[$ug_id][$forum_id])) ? (int) $roles[$ug_id][$forum_id] : 0;
0701
0702 // Do the admin want to set these permissions to other items too?
0703 $inherit = request_var('inherit', array(0 => array(0)));
0704
0705 $ug_id = array($ug_id);
0706 $forum_id = array($forum_id);
0707
0708 if (sizeof($inherit))
0709 {
0710 foreach ($inherit as $_ug_id => $forum_id_ary)
0711 {
0712 // Inherit users/groups?
0713 if (!in_array($_ug_id, $ug_id))
0714 {
0715 $ug_id[] = $_ug_id;
0716 }
0717
0718 // Inherit forums?
0719 $forum_id = array_merge($forum_id, array_keys($forum_id_ary));
0720 }
0721 }
0722
0723 $forum_id = array_unique($forum_id);
0724
0725 // If the auth settings differ from the assigned role, then do not set a role...
0726 if ($assigned_role)
0727 {
0728 if (!$this->check_assigned_role($assigned_role, $auth_settings))
0729 {
0730 $assigned_role = 0;
0731 }
0732 }
0733
0734 // Update the permission set...
0735 $auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_settings, $assigned_role);
0736
0737 // Do we need to recache the moderator lists?
0738 if ($permission_type == 'm_')
0739 {
0740 phpbb_cache_moderators($db, $cache, $auth);
0741 }
0742
0743 // Remove users who are now moderators or admins from everyones foes list
0744 if ($permission_type == 'm_' || $permission_type == 'a_')
0745 {
0746 phpbb_update_foes($db, $auth, $group_id, $user_id);
0747 }
0748
0749 $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);
0750
0751 trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
0752 }
0753
0754 /**
0755 * Apply all permissions
0756 */
0757 function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
0758 {
0759 global $db, $cache, $user, $auth;
0760 global $request;
0761
0762 // User or group to be set?
0763 $ug_type = (sizeof($user_id)) ? 'user' : 'group';
0764
0765 // Check the permission setting again
0766 if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
0767 {
0768 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
0769 }
0770
0771 $auth_settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, \phpbb\request\request_interface::POST);
0772 $auth_roles = $request->variable('role', array(0 => array(0 => 0)), false, \phpbb\request\request_interface::POST);
0773 $ug_ids = $forum_ids = array();
0774
0775 // We need to go through the auth settings
0776 foreach ($auth_settings as $ug_id => $forum_auth_row)
0777 {
0778 $ug_id = (int) $ug_id;
0779 $ug_ids[] = $ug_id;
0780
0781 foreach ($forum_auth_row as $forum_id => $auth_options)
0782 {
0783 $forum_id = (int) $forum_id;
0784 $forum_ids[] = $forum_id;
0785
0786 // Check role...
0787 $assigned_role = (isset($auth_roles[$ug_id][$forum_id])) ? (int) $auth_roles[$ug_id][$forum_id] : 0;
0788
0789 // If the auth settings differ from the assigned role, then do not set a role...
0790 if ($assigned_role)
0791 {
0792 if (!$this->check_assigned_role($assigned_role, $auth_options))
0793 {
0794 $assigned_role = 0;
0795 }
0796 }
0797
0798 // Update the permission set...
0799 $auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_options, $assigned_role, false);
0800 }
0801 }
0802
0803 $auth_admin->acl_clear_prefetch();
0804
0805 // Do we need to recache the moderator lists?
0806 if ($permission_type == 'm_')
0807 {
0808 phpbb_cache_moderators($db, $cache, $auth);
0809 }
0810
0811 // Remove users who are now moderators or admins from everyones foes list
0812 if ($permission_type == 'm_' || $permission_type == 'a_')
0813 {
0814 phpbb_update_foes($db, $auth, $group_id, $user_id);
0815 }
0816
0817 $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_ids, $forum_ids);
0818
0819 if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
0820 {
0821 trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_ids)));
0822 }
0823 else
0824 {
0825 trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
0826 }
0827 }
0828
0829 /**
0830 * Compare auth settings with auth settings from role
0831 * returns false if they differ, true if they are equal
0832 */
0833 function check_assigned_role($role_id, &$auth_settings)
0834 {
0835 global $db;
0836
0837 $sql = 'SELECT o.auth_option, r.auth_setting
0838 FROM ' . ACL_OPTIONS_TABLE . ' o, ' . ACL_ROLES_DATA_TABLE . ' r
0839 WHERE o.auth_option_id = r.auth_option_id
0840 AND r.role_id = ' . $role_id;
0841 $result = $db->sql_query($sql);
0842
0843 $test_auth_settings = array();
0844 while ($row = $db->sql_fetchrow($result))
0845 {
0846 $test_auth_settings[$row['auth_option']] = $row['auth_setting'];
0847 }
0848 $db->sql_freeresult($result);
0849
0850 // We need to add any ACL_NO setting from auth_settings to compare correctly
0851 foreach ($auth_settings as $option => $setting)
0852 {
0853 if ($setting == ACL_NO)
0854 {
0855 $test_auth_settings[$option] = $setting;
0856 }
0857 }
0858
0859 if (sizeof(array_diff_assoc($auth_settings, $test_auth_settings)))
0860 {
0861 return false;
0862 }
0863
0864 return true;
0865 }
0866
0867 /**
0868 * Remove permissions
0869 */
0870 function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id)
0871 {
0872 global $user, $db, $cache, $auth;
0873
0874 // User or group to be set?
0875 $ug_type = (sizeof($user_id)) ? 'user' : 'group';
0876
0877 // Check the permission setting again
0878 if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
0879 {
0880 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
0881 }
0882
0883 $auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $permission_type);
0884
0885 // Do we need to recache the moderator lists?
0886 if ($permission_type == 'm_')
0887 {
0888 phpbb_cache_moderators($db, $cache, $auth);
0889 }
0890
0891 $this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0)));
0892
0893 if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
0894 {
0895 trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_id)));
0896 }
0897 else
0898 {
0899 trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
0900 }
0901 }
0902
0903 /**
0904 * Log permission changes
0905 */
0906 function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)
0907 {
0908 global $db, $user;
0909
0910 if (!is_array($ug_id))
0911 {
0912 $ug_id = array($ug_id);
0913 }
0914
0915 if (!is_array($forum_id))
0916 {
0917 $forum_id = array($forum_id);
0918 }
0919
0920 // Logging ... first grab user or groupnames ...
0921 $sql = ($ug_type == 'group') ? 'SELECT group_name as name, group_type FROM ' . GROUPS_TABLE . ' WHERE ' : 'SELECT username as name FROM ' . USERS_TABLE . ' WHERE ';
0922 $sql .= $db->sql_in_set(($ug_type == 'group') ? 'group_id' : 'user_id', array_map('intval', $ug_id));
0923 $result = $db->sql_query($sql);
0924
0925 $l_ug_list = '';
0926 while ($row = $db->sql_fetchrow($result))
0927 {
0928 $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']);
0929 }
0930 $db->sql_freeresult($result);
0931
0932 $mode = str_replace('setting_', '', $mode);
0933
0934 if ($forum_id[0] == 0)
0935 {
0936 add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list);
0937 }
0938 else
0939 {
0940 // Grab the forum details if non-zero forum_id
0941 $sql = 'SELECT forum_name
0942 FROM ' . FORUMS_TABLE . '
0943 WHERE ' . $db->sql_in_set('forum_id', $forum_id);
0944 $result = $db->sql_query($sql);
0945
0946 $l_forum_list = '';
0947 while ($row = $db->sql_fetchrow($result))
0948 {
0949 $l_forum_list .= (($l_forum_list != '') ? ', ' : '') . $row['forum_name'];
0950 }
0951 $db->sql_freeresult($result);
0952
0953 add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list);
0954 }
0955 }
0956
0957 /**
0958 * Display a complete trace tree for the selected permission to determine where settings are set/unset
0959 */
0960 function permission_trace($user_id, $forum_id, $permission)
0961 {
0962 global $db, $template, $user, $auth;
0963
0964 if ($user_id != $user->data['user_id'])
0965 {
0966 $userdata = $auth->obtain_user_data($user_id);
0967 }
0968 else
0969 {
0970 $userdata = $user->data;
0971 }
0972
0973 if (!$userdata)
0974 {
0975 trigger_error('NO_USERS', E_USER_ERROR);
0976 }
0977
0978 $forum_name = false;
0979
0980 if ($forum_id)
0981 {
0982 $sql = 'SELECT forum_name
0983 FROM ' . FORUMS_TABLE . "
0984 WHERE forum_id = $forum_id";
0985 $result = $db->sql_query($sql, 3600);
0986 $forum_name = $db->sql_fetchfield('forum_name');
0987 $db->sql_freeresult($result);
0988 }
0989
0990 $back = request_var('back', 0);
0991
0992 $template->assign_vars(array(
0993 'PERMISSION' => $this->permissions->get_permission_lang($permission),
0994 'PERMISSION_USERNAME' => $userdata['username'],
0995 'FORUM_NAME' => $forum_name,
0996
0997 'S_GLOBAL_TRACE' => ($forum_id) ? false : true,
0998
0999 'U_BACK' => ($back) ? build_url(array('f', 'back')) . "&f=$back" : '')
1000 );
1001
1002 $template->assign_block_vars('trace', array(
1003 'WHO' => $user->lang['DEFAULT'],
1004 'INFORMATION' => $user->lang['TRACE_DEFAULT'],
1005
1006 'S_SETTING_NO' => true,
1007 'S_TOTAL_NO' => true)
1008 );
1009
1010 $sql = 'SELECT DISTINCT g.group_name, g.group_id, g.group_type
1011 FROM ' . GROUPS_TABLE . ' g
1012 LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON (ug.group_id = g.group_id)
1013 WHERE ug.user_id = ' . $user_id . '
1014 AND ug.user_pending = 0
1015 AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
1016 ORDER BY g.group_type DESC, g.group_id DESC';
1017 $result = $db->sql_query($sql);
1018
1019 $groups = array();
1020 while ($row = $db->sql_fetchrow($result))
1021 {
1022 $groups[$row['group_id']] = array(
1023 'auth_setting' => ACL_NO,
1024 'group_name' => ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']
1025 );
1026 }
1027 $db->sql_freeresult($result);
1028
1029 $total = ACL_NO;
1030 $add_key = (($forum_id) ? '_LOCAL' : '');
1031
1032 if (sizeof($groups))
1033 {
1034 // Get group auth settings
1035 $hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id);
1036
1037 foreach ($hold_ary as $group_id => $forum_ary)
1038 {
1039 $groups[$group_id]['auth_setting'] = $hold_ary[$group_id][$forum_id][$permission];
1040 }
1041 unset($hold_ary);
1042
1043 foreach ($groups as $id => $row)
1044 {
1045 switch ($row['auth_setting'])
1046 {
1047 case ACL_NO:
1048 $information = $user->lang['TRACE_GROUP_NO' . $add_key];
1049 break;
1050
1051 case ACL_YES:
1052 $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]);
1053 $total = ($total == ACL_NO) ? ACL_YES : $total;
1054 break;
1055
1056 case ACL_NEVER:
1057 $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]);
1058 $total = ACL_NEVER;
1059 break;
1060 }
1061
1062 $template->assign_block_vars('trace', array(
1063 'WHO' => $row['group_name'],
1064 'INFORMATION' => $information,
1065
1066 'S_SETTING_NO' => ($row['auth_setting'] == ACL_NO) ? true : false,
1067 'S_SETTING_YES' => ($row['auth_setting'] == ACL_YES) ? true : false,
1068 'S_SETTING_NEVER' => ($row['auth_setting'] == ACL_NEVER) ? true : false,
1069 'S_TOTAL_NO' => ($total == ACL_NO) ? true : false,
1070 'S_TOTAL_YES' => ($total == ACL_YES) ? true : false,
1071 'S_TOTAL_NEVER' => ($total == ACL_NEVER) ? true : false)
1072 );
1073 }
1074 }
1075
1076 // Get user specific permission... globally or for this forum
1077 $hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
1078 $auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
1079
1080 switch ($auth_setting)
1081 {
1082 case ACL_NO:
1083 $information = ($total == ACL_NO) ? $user->lang['TRACE_USER_NO_TOTAL_NO' . $add_key] : $user->lang['TRACE_USER_KEPT' . $add_key];
1084 $total = ($total == ACL_NO) ? ACL_NEVER : $total;
1085 break;
1086
1087 case ACL_YES:
1088 $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]);
1089 $total = ($total == ACL_NO) ? ACL_YES : $total;
1090 break;
1091
1092 case ACL_NEVER:
1093 $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]);
1094 $total = ACL_NEVER;
1095 break;
1096 }
1097
1098 $template->assign_block_vars('trace', array(
1099 'WHO' => $userdata['username'],
1100 'INFORMATION' => $information,
1101
1102 'S_SETTING_NO' => ($auth_setting == ACL_NO) ? true : false,
1103 'S_SETTING_YES' => ($auth_setting == ACL_YES) ? true : false,
1104 'S_SETTING_NEVER' => ($auth_setting == ACL_NEVER) ? true : false,
1105 'S_TOTAL_NO' => false,
1106 'S_TOTAL_YES' => ($total == ACL_YES) ? true : false,
1107 'S_TOTAL_NEVER' => ($total == ACL_NEVER) ? true : false)
1108 );
1109
1110 if ($forum_id != 0 && isset($auth->acl_options['global'][$permission]))
1111 {
1112 if ($user_id != $user->data['user_id'])
1113 {
1114 $auth2 = new \phpbb\auth\auth();
1115 $auth2->acl($userdata);
1116 $auth_setting = $auth2->acl_get($permission);
1117 }
1118 else
1119 {
1120 $auth_setting = $auth->acl_get($permission);
1121 }
1122
1123 if ($auth_setting)
1124 {
1125 $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_YES'] : $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_NEVER'];
1126 $total = ACL_YES;
1127 }
1128 else
1129 {
1130 $information = $user->lang['TRACE_USER_GLOBAL_NEVER_TOTAL_KEPT'];
1131 }
1132
1133 // If there is no auth information we do not need to worry the user by showing non-relevant data.
1134 if ($auth_setting)
1135 {
1136 $template->assign_block_vars('trace', array(
1137 'WHO' => sprintf($user->lang['TRACE_GLOBAL_SETTING'], $userdata['username']),
1138 'INFORMATION' => sprintf($information, '<a href="' . $this->u_action . "&u=$user_id&f=0&auth=$permission&back=$forum_id\">", '</a>'),
1139
1140 'S_SETTING_NO' => false,
1141 'S_SETTING_YES' => $auth_setting,
1142 'S_SETTING_NEVER' => !$auth_setting,
1143 'S_TOTAL_NO' => false,
1144 'S_TOTAL_YES' => ($total == ACL_YES) ? true : false,
1145 'S_TOTAL_NEVER' => ($total == ACL_NEVER) ? true : false)
1146 );
1147 }
1148 }
1149
1150 // Take founder status into account, overwriting the default values
1151 if ($userdata['user_type'] == USER_FOUNDER && strpos($permission, 'a_') === 0)
1152 {
1153 $template->assign_block_vars('trace', array(
1154 'WHO' => $userdata['username'],
1155 'INFORMATION' => $user->lang['TRACE_USER_FOUNDER'],
1156
1157 'S_SETTING_NO' => ($auth_setting == ACL_NO) ? true : false,
1158 'S_SETTING_YES' => ($auth_setting == ACL_YES) ? true : false,
1159 'S_SETTING_NEVER' => ($auth_setting == ACL_NEVER) ? true : false,
1160 'S_TOTAL_NO' => false,
1161 'S_TOTAL_YES' => true,
1162 'S_TOTAL_NEVER' => false)
1163 );
1164
1165 $total = ACL_YES;
1166 }
1167
1168 // Total value...
1169 $template->assign_vars(array(
1170 'S_RESULT_NO' => ($total == ACL_NO) ? true : false,
1171 'S_RESULT_YES' => ($total == ACL_YES) ? true : false,
1172 'S_RESULT_NEVER' => ($total == ACL_NEVER) ? true : false,
1173 ));
1174 }
1175
1176 /**
1177 * Handles copying permissions from one forum to others
1178 */
1179 function copy_forum_permissions()
1180 {
1181 global $db, $auth, $cache, $template, $user;
1182
1183 $user->add_lang('acp/forums');
1184
1185 $submit = isset($_POST['submit']) ? true : false;
1186
1187 if ($submit)
1188 {
1189 $src = request_var('src_forum_id', 0);
1190 $dest = request_var('dest_forum_ids', array(0));
1191
1192 if (confirm_box(true))
1193 {
1194 if (copy_forum_permissions($src, $dest))
1195 {
1196 phpbb_cache_moderators($db, $cache, $auth);
1197
1198 $auth->acl_clear_prefetch();
1199 $cache->destroy('sql', FORUMS_TABLE);
1200
1201 trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
1202 }
1203 else
1204 {
1205 trigger_error($user->lang['SELECTED_FORUM_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
1206 }
1207 }
1208 else
1209 {
1210 $s_hidden_fields = array(
1211 'submit' => $submit,
1212 'src_forum_id' => $src,
1213 'dest_forum_ids' => $dest,
1214 );
1215
1216 $s_hidden_fields = build_hidden_fields($s_hidden_fields);
1217
1218 confirm_box(false, $user->lang['COPY_PERMISSIONS_CONFIRM'], $s_hidden_fields);
1219 }
1220 }
1221
1222 $template->assign_vars(array(
1223 'S_FORUM_OPTIONS' => make_forum_select(false, false, false, false, false),
1224 ));
1225 }
1226
1227 /**
1228 * Get already assigned users/groups
1229 */
1230 function retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type)
1231 {
1232 global $db, $user;
1233
1234 $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');
1235
1236 // Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
1237 $option_ids = $role_ids = array();
1238
1239 $sql = 'SELECT auth_option_id
1240 FROM ' . ACL_OPTIONS_TABLE . '
1241 WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->get_any_char());
1242 $result = $db->sql_query($sql);
1243
1244 while ($row = $db->sql_fetchrow($result))
1245 {
1246 $option_ids[] = (int) $row['auth_option_id'];
1247 }
1248 $db->sql_freeresult($result);
1249
1250 if (sizeof($option_ids))
1251 {
1252 $sql = 'SELECT DISTINCT role_id
1253 FROM ' . ACL_ROLES_DATA_TABLE . '
1254 WHERE ' . $db->sql_in_set('auth_option_id', $option_ids);
1255 $result = $db->sql_query($sql);
1256
1257 while ($row = $db->sql_fetchrow($result))
1258 {
1259 $role_ids[] = (int) $row['role_id'];
1260 }
1261 $db->sql_freeresult($result);
1262 }
1263
1264 if (sizeof($option_ids) && sizeof($role_ids))
1265 {
1266 $sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
1267 }
1268 else if (sizeof($role_ids))
1269 {
1270 $sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids);
1271 }
1272 else if (sizeof($option_ids))
1273 {
1274 $sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
1275 }
1276
1277 // Not ideal, due to the filesort, non-use of indexes, etc.
1278 $sql = 'SELECT DISTINCT u.user_id, u.username, u.username_clean, u.user_regdate
1279 FROM ' . USERS_TABLE . ' u, ' . ACL_USERS_TABLE . " a
1280 WHERE u.user_id = a.user_id
1281 $sql_forum_id
1282 $sql_where
1283 ORDER BY u.username_clean, u.user_regdate ASC";
1284 $result = $db->sql_query($sql);
1285
1286 $s_defined_user_options = '';
1287 $defined_user_ids = array();
1288 while ($row = $db->sql_fetchrow($result))
1289 {
1290 $s_defined_user_options .= '<option value="' . $row['user_id'] . '">' . $row['username'] . '</option>';
1291 $defined_user_ids[] = $row['user_id'];
1292 }
1293 $db->sql_freeresult($result);
1294
1295 $sql = 'SELECT DISTINCT g.group_type, g.group_name, g.group_id
1296 FROM ' . GROUPS_TABLE . ' g, ' . ACL_GROUPS_TABLE . " a
1297 WHERE g.group_id = a.group_id
1298 $sql_forum_id
1299 $sql_where
1300 ORDER BY g.group_type DESC, g.group_name ASC";
1301 $result = $db->sql_query($sql);
1302
1303 $s_defined_group_options = '';
1304 $defined_group_ids = array();
1305 while ($row = $db->sql_fetchrow($result))
1306 {
1307 $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>';
1308 $defined_group_ids[] = $row['group_id'];
1309 }
1310 $db->sql_freeresult($result);
1311
1312 return array(
1313 'group_ids' => $defined_group_ids,
1314 'group_ids_options' => $s_defined_group_options,
1315 'user_ids' => $defined_user_ids,
1316 'user_ids_options' => $s_defined_user_options
1317 );
1318 }
1319 }
1320