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_permission_roles.php

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


001  <?php
002  /**
003  *
004  * @package acp
005  * @version $Id$
006  * @copyright (c) 2005 phpBB Group
007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
008  *
009  */
010   
011  /**
012  * @ignore
013  */
014  if (!defined('IN_PHPBB'))
015  {
016      exit;
017  }
018   
019  /**
020  * @package acp
021  */
022  class acp_permission_roles
023  {
024      var $u_action;
025   
026      function main($id, $mode)
027      {
028          global $db, $user, $auth, $template, $cache;
029          global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
030   
031          include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
032          include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
033   
034          $auth_admin = new auth_admin();
035   
036          $user->add_lang('acp/permissions');
037          add_permission_language();
038   
039          $this->tpl_name = 'acp_permission_roles';
040   
041          $submit = (isset($_POST['submit'])) ? true : false;
042          $role_id = request_var('role_id', 0);
043          $action = request_var('action', '');
044          $action = (isset($_POST['add'])) ? 'add' : $action;
045   
046          $form_name = 'acp_permissions';
047          add_form_key($form_name);
048   
049          switch ($mode)
050          {
051              case 'admin_roles':
052                  $permission_type = 'a_';
053                  $this->page_title = 'ACP_ADMIN_ROLES';
054              break;
055   
056              case 'user_roles':
057                  $permission_type = 'u_';
058                  $this->page_title = 'ACP_USER_ROLES';
059              break;
060   
061              case 'mod_roles':
062                  $permission_type = 'm_';
063                  $this->page_title = 'ACP_MOD_ROLES';
064              break;
065   
066              case 'forum_roles':
067                  $permission_type = 'f_';
068                  $this->page_title = 'ACP_FORUM_ROLES';
069              break;
070   
071              default:
072                  trigger_error('NO_MODE', E_USER_ERROR);
073              break;
074          }
075   
076          $template->assign_vars(array(
077              'L_TITLE'        => $user->lang[$this->page_title],
078              'L_EXPLAIN'        => $user->lang[$this->page_title . '_EXPLAIN'])
079          );
080   
081          // Take action... admin submitted something
082          if ($submit || $action == 'remove')
083          {
084              switch ($action)
085              {
086                  case 'remove':
087   
088                      if (!$role_id)
089                      {
090                          trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
091                      }
092   
093                      $sql = 'SELECT *
094                          FROM ' . ACL_ROLES_TABLE . '
095                          WHERE role_id = ' . $role_id;
096                      $result = $db->sql_query($sql);
097                      $role_row = $db->sql_fetchrow($result);
098                      $db->sql_freeresult($result);
099   
100                      if (!$role_row)
101                      {
102                          trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
103                      }
104   
105                      if (confirm_box(true))
106                      {
107                          $this->remove_role($role_id, $permission_type);
108   
109                          $role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name'];
110                          add_log('admin', 'LOG_' . strtoupper($permission_type) . 'ROLE_REMOVED', $role_name);
111                          trigger_error($user->lang['ROLE_DELETED'] . adm_back_link($this->u_action));
112                      }
113                      else
114                      {
115                          confirm_box(false, 'DELETE_ROLE', build_hidden_fields(array(
116                              'i'            => $id,
117                              'mode'        => $mode,
118                              'role_id'    => $role_id,
119                              'action'    => $action,
120                          )));
121                      }
122   
123                  break;
124   
125                  case 'edit':
126                      if (!$role_id)
127                      {
128                          trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
129                      }
130   
131                      // Get role we edit
132                      $sql = 'SELECT *
133                          FROM ' . ACL_ROLES_TABLE . '
134                          WHERE role_id = ' . $role_id;
135                      $result = $db->sql_query($sql);
136                      $role_row = $db->sql_fetchrow($result);
137                      $db->sql_freeresult($result);
138   
139                      if (!$role_row)
140                      {
141                          trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
142                      }
143   
144                  // no break;
145   
146                  case 'add':
147   
148                      if (!check_form_key($form_name))
149                      {
150                          trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
151                      }
152   
153                      $role_name = utf8_normalize_nfc(request_var('role_name', '', true));
154                      $role_description = utf8_normalize_nfc(request_var('role_description', '', true));
155                      $auth_settings = request_var('setting', array('' => 0));
156   
157                      if (!$role_name)
158                      {
159                          trigger_error($user->lang['NO_ROLE_NAME_SPECIFIED'] . adm_back_link($this->u_action), E_USER_WARNING);
160                      }
161   
162                      if (utf8_strlen($role_description) > 4000)
163                      {
164                          trigger_error($user->lang['ROLE_DESCRIPTION_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
165                      }
166   
167                      // if we add/edit a role we check the name to be unique among the settings...
168                      $sql = 'SELECT role_id
169                          FROM ' . ACL_ROLES_TABLE . "
170                          WHERE role_type = '" . $db->sql_escape($permission_type) . "'
171                              AND role_name = '" . $db->sql_escape($role_name) . "'";
172                      $result = $db->sql_query($sql);
173                      $row = $db->sql_fetchrow($result);
174                      $db->sql_freeresult($result);
175   
176                      // Make sure we only print out the error if we add the role or change it's name
177                      if ($row && ($mode == 'add' || ($mode == 'edit' && $role_row['role_name'] != $role_name)))
178                      {
179                          trigger_error(sprintf($user->lang['ROLE_NAME_ALREADY_EXIST'], $role_name) . adm_back_link($this->u_action), E_USER_WARNING);
180                      }
181   
182                      $sql_ary = array(
183                          'role_name'            => (string) $role_name,
184                          'role_description'    => (string) $role_description,
185                          'role_type'            => (string) $permission_type,
186                      );
187   
188                      if ($action == 'edit')
189                      {
190                          $sql = 'UPDATE ' . ACL_ROLES_TABLE . '
191                              SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
192                              WHERE role_id = ' . $role_id;
193                          $db->sql_query($sql);
194                      }
195                      else
196                      {
197                          // Get maximum role order for inserting a new role...
198                          $sql = 'SELECT MAX(role_order) as max_order
199                              FROM ' . ACL_ROLES_TABLE . "
200                              WHERE role_type = '" . $db->sql_escape($permission_type) . "'";
201                          $result = $db->sql_query($sql);
202                          $max_order = (int) $db->sql_fetchfield('max_order');
203                          $db->sql_freeresult($result);
204   
205                          $sql_ary['role_order'] = $max_order + 1;
206   
207                          $sql = 'INSERT INTO ' . ACL_ROLES_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
208                          $db->sql_query($sql);
209   
210                          $role_id = $db->sql_nextid();
211                      }
212   
213                      // Now add the auth settings
214                      $auth_admin->acl_set_role($role_id, $auth_settings);
215   
216                      $role_name = (!empty($user->lang[$role_name])) ? $user->lang[$role_name] : $role_name;
217                      add_log('admin', 'LOG_' . strtoupper($permission_type) . 'ROLE_' . strtoupper($action), $role_name);
218   
219                      trigger_error($user->lang['ROLE_' . strtoupper($action) . '_SUCCESS'] . adm_back_link($this->u_action));
220   
221                  break;
222              }
223          }
224   
225          // Display screens
226          switch ($action)
227          {
228              case 'add':
229   
230                  $options_from = request_var('options_from', 0);
231   
232                  $role_row = array(
233                      'role_name'            => utf8_normalize_nfc(request_var('role_name', '', true)),
234                      'role_description'    => utf8_normalize_nfc(request_var('role_description', '', true)),
235                      'role_type'            => $permission_type,
236                  );
237   
238                  if ($options_from)
239                  {
240                      $sql = 'SELECT p.auth_option_id, p.auth_setting, o.auth_option
241                          FROM ' . ACL_ROLES_DATA_TABLE . ' p, ' . ACL_OPTIONS_TABLE . ' o
242                          WHERE o.auth_option_id = p.auth_option_id
243                              AND p.role_id = ' . $options_from . '
244                          ORDER BY p.auth_option_id';
245                      $result = $db->sql_query($sql);
246   
247                      $auth_options = array();
248                      while ($row = $db->sql_fetchrow($result))
249                      {
250                          $auth_options[$row['auth_option']] = $row['auth_setting'];
251                      }
252                      $db->sql_freeresult($result);
253                  }
254                  else
255                  {
256                      $sql = 'SELECT auth_option_id, auth_option
257                          FROM ' . ACL_OPTIONS_TABLE . "
258                          WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char) . "
259                              AND auth_option <> '{$permission_type}'
260                          ORDER BY auth_option_id";
261                      $result = $db->sql_query($sql);
262   
263                      $auth_options = array();
264                      while ($row = $db->sql_fetchrow($result))
265                      {
266                          $auth_options[$row['auth_option']] = ACL_NO;
267                      }
268                      $db->sql_freeresult($result);
269                  }
270   
271              // no break;
272   
273              case 'edit':
274   
275                  if ($action == 'edit')
276                  {
277                      if (!$role_id)
278                      {
279                          trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
280                      }
281                      
282                      $sql = 'SELECT *
283                          FROM ' . ACL_ROLES_TABLE . '
284                          WHERE role_id = ' . $role_id;
285                      $result = $db->sql_query($sql);
286                      $role_row = $db->sql_fetchrow($result);
287                      $db->sql_freeresult($result);
288   
289                      $sql = 'SELECT p.auth_option_id, p.auth_setting, o.auth_option
290                          FROM ' . ACL_ROLES_DATA_TABLE . ' p, ' . ACL_OPTIONS_TABLE . ' o
291                          WHERE o.auth_option_id = p.auth_option_id
292                              AND p.role_id = ' . $role_id . '
293                          ORDER BY p.auth_option_id';
294                      $result = $db->sql_query($sql);
295   
296                      $auth_options = array();
297                      while ($row = $db->sql_fetchrow($result))
298                      {
299                          $auth_options[$row['auth_option']] = $row['auth_setting'];
300                      }
301                      $db->sql_freeresult($result);
302                  }
303   
304                  if (!$role_row)
305                  {
306                      trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
307                  }
308   
309                  $template->assign_vars(array(
310                      'S_EDIT'            => true,
311   
312                      'U_ACTION'            => $this->u_action . "&amp;action={$action}&amp;role_id={$role_id}",
313                      'U_BACK'            => $this->u_action,
314   
315                      'ROLE_NAME'            => $role_row['role_name'],
316                      'ROLE_DESCRIPTION'    => $role_row['role_description'],
317                      'L_ACL_TYPE'        => $user->lang['ACL_TYPE_' . strtoupper($permission_type)],
318                      )
319                  );
320   
321                  // We need to fill the auth options array with ACL_NO options ;)
322                  $sql = 'SELECT auth_option_id, auth_option
323                      FROM ' . ACL_OPTIONS_TABLE . "
324                      WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char) . "
325                          AND auth_option <> '{$permission_type}'
326                      ORDER BY auth_option_id";
327                  $result = $db->sql_query($sql);
328   
329                  while ($row = $db->sql_fetchrow($result))
330                  {
331                      if (!isset($auth_options[$row['auth_option']]))
332                      {
333                          $auth_options[$row['auth_option']] = ACL_NO;
334                      }
335                  }
336                  $db->sql_freeresult($result);
337   
338                  // Unset global permission option
339                  unset($auth_options[$permission_type]);
340   
341                  // Display auth options
342                  $this->display_auth_options($auth_options);
343   
344                  // Get users/groups/forums using this preset...
345                  if ($action == 'edit')
346                  {
347                      $hold_ary = $auth_admin->get_role_mask($role_id);
348   
349                      if (sizeof($hold_ary))
350                      {
351                          $role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name'];
352   
353                          $template->assign_vars(array(
354                              'S_DISPLAY_ROLE_MASK'    => true,
355                              'L_ROLE_ASSIGNED_TO'    => sprintf($user->lang['ROLE_ASSIGNED_TO'], $role_name))
356                          );
357   
358                          $auth_admin->display_role_mask($hold_ary);
359                      }
360                  }
361   
362                  return;
363              break;
364   
365              case 'move_up':
366              case 'move_down':
367   
368                  $order = request_var('order', 0);
369                  $order_total = $order * 2 + (($action == 'move_up') ? -1 : 1);
370   
371                  $sql = 'UPDATE ' . ACL_ROLES_TABLE . '
372                      SET role_order = ' . $order_total . " - role_order
373                      WHERE role_type = '" . $db->sql_escape($permission_type) . "'
374                          AND role_order IN ($order" . (($action == 'move_up') ? $order - 1 : $order + 1) . ')';
375                  $db->sql_query($sql);
376   
377              break;
378          }
379   
380          // By default, check that role_order is valid and fix it if necessary
381          $sql = 'SELECT role_id, role_order
382              FROM ' . ACL_ROLES_TABLE . "
383              WHERE role_type = '" . $db->sql_escape($permission_type) . "'
384              ORDER BY role_order ASC";
385          $result = $db->sql_query($sql);
386   
387          if ($row = $db->sql_fetchrow($result))
388          {
389              $order = 0;
390              do
391              {
392                  $order++;
393                  if ($row['role_order'] != $order)
394                  {
395                      $db->sql_query('UPDATE ' . ACL_ROLES_TABLE . " SET role_order = $order WHERE role_id = {$row['role_id']}");
396                  }
397              }
398              while ($row = $db->sql_fetchrow($result));
399          }
400          $db->sql_freeresult($result);
401   
402          // Display assigned items?
403          $display_item = request_var('display_item', 0);
404   
405          // Select existing roles
406          $sql = 'SELECT *
407              FROM ' . ACL_ROLES_TABLE . "
408              WHERE role_type = '" . $db->sql_escape($permission_type) . "'
409              ORDER BY role_order ASC";
410          $result = $db->sql_query($sql);
411   
412          $s_role_options = '';
413          while ($row = $db->sql_fetchrow($result))
414          {
415              $role_name = (!empty($user->lang[$row['role_name']])) ? $user->lang[$row['role_name']] : $row['role_name'];
416   
417              $template->assign_block_vars('roles', array(
418                  'ROLE_NAME'                => $role_name,
419                  'ROLE_DESCRIPTION'        => (!empty($user->lang[$row['role_description']])) ? $user->lang[$row['role_description']] : nl2br($row['role_description']),
420   
421                  'U_EDIT'            => $this->u_action . '&amp;action=edit&amp;role_id=' . $row['role_id'],
422                  'U_REMOVE'            => $this->u_action . '&amp;action=remove&amp;role_id=' . $row['role_id'],
423                  'U_MOVE_UP'            => $this->u_action . '&amp;action=move_up&amp;order=' . $row['role_order'],
424                  'U_MOVE_DOWN'        => $this->u_action . '&amp;action=move_down&amp;order=' . $row['role_order'],
425                  'U_DISPLAY_ITEMS'    => ($row['role_id'] == $display_item) ? '' : $this->u_action . '&amp;display_item=' . $row['role_id'] . '#assigned_to')
426              );
427   
428              $s_role_options .= '<option value="' . $row['role_id'] . '">' . $role_name . '</option>';
429   
430              if ($display_item == $row['role_id'])
431              {
432                  $template->assign_vars(array(
433                      'L_ROLE_ASSIGNED_TO'    => sprintf($user->lang['ROLE_ASSIGNED_TO'], $role_name))
434                  );
435              }
436          }
437          $db->sql_freeresult($result);
438   
439          $template->assign_vars(array(
440              'S_ROLE_OPTIONS'        => $s_role_options)
441          );
442   
443          if ($display_item)
444          {
445              $template->assign_vars(array(
446                  'S_DISPLAY_ROLE_MASK'    => true)
447              );
448   
449              $hold_ary = $auth_admin->get_role_mask($display_item);
450              $auth_admin->display_role_mask($hold_ary);
451          }
452      }
453   
454      /**
455      * Display permission settings able to be set
456      */
457      function display_auth_options($auth_options)
458      {
459          global $template, $user;
460   
461          $content_array = $categories = array();
462          $key_sort_array = array(0);
463          $auth_options = array(0 => $auth_options);
464   
465          // Making use of auth_admin method here (we do not really want to change two similar code fragments)
466          auth_admin::build_permission_array($auth_options, $content_array, $categories, $key_sort_array);
467   
468          $content_array = $content_array[0];
469   
470          $template->assign_var('S_NUM_PERM_COLS', sizeof($categories));
471   
472          // Assign to template
473          foreach ($content_array as $cat => $cat_array)
474          {
475              $template->assign_block_vars('auth', array(
476                  'CAT_NAME'    => $user->lang['permission_cat'][$cat],
477   
478                  'S_YES'        => ($cat_array['S_YES'] && !$cat_array['S_NEVER'] && !$cat_array['S_NO']) ? true : false,
479                  'S_NEVER'    => ($cat_array['S_NEVER'] && !$cat_array['S_YES'] && !$cat_array['S_NO']) ? true : false,
480                  'S_NO'        => ($cat_array['S_NO'] && !$cat_array['S_NEVER'] && !$cat_array['S_YES']) ? true : false)
481              );
482   
483              foreach ($cat_array['permissions'] as $permission => $allowed)
484              {
485                  $template->assign_block_vars('auth.mask', array(
486                      'S_YES'        => ($allowed == ACL_YES) ? true : false,
487                      'S_NEVER'    => ($allowed == ACL_NEVER) ? true : false,
488                      'S_NO'        => ($allowed == ACL_NO) ? true : false,
489   
490                      'FIELD_NAME'    => $permission,
491                      'PERMISSION'    => $user->lang['acl_' . $permission]['lang'])
492                  );
493              }
494          }
495      }
496   
497      /**
498      * Remove role
499      */
500      function remove_role($role_id, $permission_type)
501      {
502          global $db;
503   
504          $auth_admin = new auth_admin();
505   
506          // Get complete auth array
507          $sql = 'SELECT auth_option, auth_option_id
508              FROM ' . ACL_OPTIONS_TABLE . "
509              WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char);
510          $result = $db->sql_query($sql);
511   
512          $auth_settings = array();
513          while ($row = $db->sql_fetchrow($result))
514          {
515              $auth_settings[$row['auth_option']] = ACL_NO;
516          }
517          $db->sql_freeresult($result);
518   
519          // Get the role auth settings we need to re-set...
520          $sql = 'SELECT o.auth_option, r.auth_setting
521              FROM ' . ACL_ROLES_DATA_TABLE . ' r, ' . ACL_OPTIONS_TABLE . ' o
522              WHERE o.auth_option_id = r.auth_option_id
523                  AND r.role_id = ' . $role_id;
524          $result = $db->sql_query($sql);
525   
526          while ($row = $db->sql_fetchrow($result))
527          {
528              $auth_settings[$row['auth_option']] = $row['auth_setting'];
529          }
530          $db->sql_freeresult($result);
531   
532          // Get role assignments
533          $hold_ary = $auth_admin->get_role_mask($role_id);
534   
535          // Re-assign permissions
536          foreach ($hold_ary as $forum_id => $forum_ary)
537          {
538              if (isset($forum_ary['users']))
539              {
540                  $auth_admin->acl_set('user', $forum_id, $forum_ary['users'], $auth_settings, 0, false);
541              }
542   
543              if (isset($forum_ary['groups']))
544              {
545                  $auth_admin->acl_set('group', $forum_id, $forum_ary['groups'], $auth_settings, 0, false);
546              }
547          }
548   
549          // Remove role from users and groups just to be sure (happens through acl_set)
550          $sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
551              WHERE auth_role_id = ' . $role_id;
552          $db->sql_query($sql);
553   
554          $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
555              WHERE auth_role_id = ' . $role_id;
556          $db->sql_query($sql);
557   
558          // Remove role data and role
559          $sql = 'DELETE FROM ' . ACL_ROLES_DATA_TABLE . '
560              WHERE role_id = ' . $role_id;
561          $db->sql_query($sql);
562   
563          $sql = 'DELETE FROM ' . ACL_ROLES_TABLE . '
564              WHERE role_id = ' . $role_id;
565          $db->sql_query($sql);
566   
567          $auth_admin->acl_clear_prefetch();
568      }
569  }
570   
571  ?>