Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

acp_permissions.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 35.52 KiB


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