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

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

permission.php

Zuletzt modifiziert: 09.10.2024, 12:55 - Dateigröße: 15.64 KiB


 001  <?php
 002  /**
 003  *
 004  * This file is part of the phpBB Forum Software package.
 005  *
 006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 007  * @license GNU General Public License, version 2 (GPL-2.0)
 008  *
 009  * For full copyright and license information, please see
 010  * the docs/CREDITS.txt file.
 011  *
 012  */
 013   
 014  namespace phpbb\db\migration\tool;
 015   
 016  /**
 017  * Migration permission management tool
 018  */
 019  class permission implements \phpbb\db\migration\tool\tool_interface
 020  {
 021      /** @var \phpbb\auth\auth */
 022      protected $auth;
 023   
 024      /** @var \phpbb\cache\service */
 025      protected $cache;
 026   
 027      /** @var \phpbb\db\driver\driver_interface */
 028      protected $db;
 029   
 030      /** @var string */
 031      protected $phpbb_root_path;
 032   
 033      /** @var string */
 034      protected $php_ext;
 035   
 036      /**
 037      * Constructor
 038      *
 039      * @param \phpbb\db\driver\driver_interface $db
 040      * @param \phpbb\cache\service $cache
 041      * @param \phpbb\auth\auth $auth
 042      * @param string $phpbb_root_path
 043      * @param string $php_ext
 044      */
 045      public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, \phpbb\auth\auth $auth, $phpbb_root_path, $php_ext)
 046      {
 047          $this->db = $db;
 048          $this->cache = $cache;
 049          $this->auth = $auth;
 050          $this->phpbb_root_path = $phpbb_root_path;
 051          $this->php_ext = $php_ext;
 052      }
 053   
 054      /**
 055      * {@inheritdoc}
 056      */
 057      public function get_name()
 058      {
 059          return 'permission';
 060      }
 061   
 062      /**
 063      * Permission Exists
 064      *
 065      * Check if a permission (auth) setting exists
 066      *
 067      * @param string $auth_option The name of the permission (auth) option
 068      * @param bool $global True for checking a global permission setting,
 069      *     False for a local permission setting
 070      * @return bool true if it exists, false if not
 071      */
 072      public function exists($auth_option, $global = true)
 073      {
 074          if ($global)
 075          {
 076              $type_sql = ' AND is_global = 1';
 077          }
 078          else
 079          {
 080              $type_sql = ' AND is_local = 1';
 081          }
 082   
 083          $sql = 'SELECT auth_option_id
 084              FROM ' . ACL_OPTIONS_TABLE . "
 085              WHERE auth_option = '" . $this->db->sql_escape($auth_option) . "'"
 086                  . $type_sql;
 087          $result = $this->db->sql_query($sql);
 088   
 089          $row = $this->db->sql_fetchrow($result);
 090          $this->db->sql_freeresult($result);
 091   
 092          if ($row)
 093          {
 094              return true;
 095          }
 096   
 097          return false;
 098      }
 099   
 100      /**
 101      * Permission Add
 102      *
 103      * Add a permission (auth) option
 104      *
 105      * @param string $auth_option The name of the permission (auth) option
 106      * @param bool $global True for checking a global permission setting,
 107      *     False for a local permission setting
 108      * @param int|false $copy_from If set, contains the id of the permission from which to copy the new one.
 109      * @return null
 110      */
 111      public function add($auth_option, $global = true, $copy_from = false)
 112      {
 113          if ($this->exists($auth_option, $global))
 114          {
 115              return;
 116          }
 117   
 118          // We've added permissions, so set to true to notify the user.
 119          $this->permissions_added = true;
 120   
 121          if (!class_exists('auth_admin'))
 122          {
 123              include($this->phpbb_root_path . 'includes/acp/auth.' . $this->php_ext);
 124          }
 125          $auth_admin = new \auth_admin();
 126   
 127          // We have to add a check to see if the !$global (if global, local, and if local, global) permission already exists.  If it does, acl_add_option currently has a bug which would break the ACL system, so we are having a work-around here.
 128          if ($this->exists($auth_option, !$global))
 129          {
 130              $sql_ary = array(
 131                  'is_global'    => 1,
 132                  'is_local'    => 1,
 133              );
 134              $sql = 'UPDATE ' . ACL_OPTIONS_TABLE . '
 135                  SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . "
 136                  WHERE auth_option = '" . $this->db->sql_escape($auth_option) . "'";
 137              $this->db->sql_query($sql);
 138          }
 139          else
 140          {
 141              if ($global)
 142              {
 143                  $auth_admin->acl_add_option(array('global' => array($auth_option)));
 144              }
 145              else
 146              {
 147                  $auth_admin->acl_add_option(array('local' => array($auth_option)));
 148              }
 149          }
 150   
 151          // The permission has been added, now we can copy it if needed
 152          if ($copy_from && isset($auth_admin->acl_options['id'][$copy_from]))
 153          {
 154              $old_id = $auth_admin->acl_options['id'][$copy_from];
 155              $new_id = $auth_admin->acl_options['id'][$auth_option];
 156   
 157              $tables = array(ACL_GROUPS_TABLE, ACL_ROLES_DATA_TABLE, ACL_USERS_TABLE);
 158   
 159              foreach ($tables as $table)
 160              {
 161                  $sql = 'SELECT *
 162                      FROM ' . $table . '
 163                      WHERE auth_option_id = ' . $old_id;
 164                  $result = $this->db->sql_query($sql);
 165   
 166                  $sql_ary = array();
 167                  while ($row = $this->db->sql_fetchrow($result))
 168                  {
 169                      $row['auth_option_id'] = $new_id;
 170                      $sql_ary[] = $row;
 171                  }
 172                  $this->db->sql_freeresult($result);
 173   
 174                  if (!empty($sql_ary))
 175                  {
 176                      $this->db->sql_multi_insert($table, $sql_ary);
 177                  }
 178              }
 179   
 180              $auth_admin->acl_clear_prefetch();
 181          }
 182      }
 183   
 184      /**
 185      * Permission Remove
 186      *
 187      * Remove a permission (auth) option
 188      *
 189      * @param string $auth_option The name of the permission (auth) option
 190      * @param bool $global True for checking a global permission setting,
 191      *     False for a local permission setting
 192      * @return null
 193      */
 194      public function remove($auth_option, $global = true)
 195      {
 196          if (!$this->exists($auth_option, $global))
 197          {
 198              return;
 199          }
 200   
 201          if ($global)
 202          {
 203              $type_sql = ' AND is_global = 1';
 204          }
 205          else
 206          {
 207              $type_sql = ' AND is_local = 1';
 208          }
 209          $sql = 'SELECT auth_option_id, is_global, is_local
 210              FROM ' . ACL_OPTIONS_TABLE . "
 211              WHERE auth_option = '" . $this->db->sql_escape($auth_option) . "'" .
 212                  $type_sql;
 213          $result = $this->db->sql_query($sql);
 214          $row = $this->db->sql_fetchrow($result);
 215          $this->db->sql_freeresult($result);
 216   
 217          $id = (int) $row['auth_option_id'];
 218   
 219          // If it is a local and global permission, do not remove the row! :P
 220          if ($row['is_global'] && $row['is_local'])
 221          {
 222              $sql = 'UPDATE ' . ACL_OPTIONS_TABLE . '
 223                  SET ' . (($global) ? 'is_global = 0' : 'is_local = 0') . '
 224                  WHERE auth_option_id = ' . $id;
 225              $this->db->sql_query($sql);
 226          }
 227          else
 228          {
 229              // Delete time
 230              $tables = array(ACL_GROUPS_TABLE, ACL_ROLES_DATA_TABLE, ACL_USERS_TABLE, ACL_OPTIONS_TABLE);
 231              foreach ($tables as $table)
 232              {
 233                  $this->db->sql_query('DELETE FROM ' . $table . '
 234                      WHERE auth_option_id = ' . $id);
 235              }
 236          }
 237   
 238          // Purge the auth cache
 239          $this->cache->destroy('_acl_options');
 240          $this->auth->acl_clear_prefetch();
 241      }
 242   
 243      /**
 244      * Add a new permission role
 245      *
 246      * @param string $role_name The new role name
 247      * @param string $role_type The type (u_, m_, a_)
 248      * @param string $role_description Description of the new role
 249      *
 250      * @return null
 251      */
 252      public function role_add($role_name, $role_type, $role_description = '')
 253      {
 254          $sql = 'SELECT role_id
 255              FROM ' . ACL_ROLES_TABLE . "
 256              WHERE role_name = '" . $this->db->sql_escape($role_name) . "'";
 257          $this->db->sql_query($sql);
 258          $role_id = (int) $this->db->sql_fetchfield('role_id');
 259   
 260          if ($role_id)
 261          {
 262              return;
 263          }
 264   
 265          $sql = 'SELECT MAX(role_order) AS max_role_order
 266              FROM ' . ACL_ROLES_TABLE . "
 267              WHERE role_type = '" . $this->db->sql_escape($role_type) . "'";
 268          $this->db->sql_query($sql);
 269          $role_order = (int) $this->db->sql_fetchfield('max_role_order');
 270          $role_order = (!$role_order) ? 1 : $role_order + 1;
 271   
 272          $sql_ary = array(
 273              'role_name'            => $role_name,
 274              'role_description'    => $role_description,
 275              'role_type'            => $role_type,
 276              'role_order'        => $role_order,
 277          );
 278   
 279          $sql = 'INSERT INTO ' . ACL_ROLES_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
 280          $this->db->sql_query($sql);
 281      }
 282   
 283      /**
 284      * Update the name on a permission role
 285      *
 286      * @param string $old_role_name The old role name
 287      * @param string $new_role_name The new role name
 288      * @return null
 289      * @throws \phpbb\db\migration\exception
 290      */
 291      public function role_update($old_role_name, $new_role_name)
 292      {
 293          $sql = 'SELECT role_id
 294              FROM ' . ACL_ROLES_TABLE . "
 295              WHERE role_name = '" . $this->db->sql_escape($old_role_name) . "'";
 296          $this->db->sql_query($sql);
 297          $role_id = (int) $this->db->sql_fetchfield('role_id');
 298   
 299          if (!$role_id)
 300          {
 301              throw new \phpbb\db\migration\exception('ROLE_NOT_EXIST', $old_role_name);
 302          }
 303   
 304          $sql = 'UPDATE ' . ACL_ROLES_TABLE . "
 305              SET role_name = '" . $this->db->sql_escape($new_role_name) . "'
 306              WHERE role_name = '" . $this->db->sql_escape($old_role_name) . "'";
 307          $this->db->sql_query($sql);
 308      }
 309   
 310      /**
 311      * Remove a permission role
 312      *
 313      * @param string $role_name The role name to remove
 314      * @return null
 315      */
 316      public function role_remove($role_name)
 317      {
 318          $sql = 'SELECT role_id
 319              FROM ' . ACL_ROLES_TABLE . "
 320              WHERE role_name = '" . $this->db->sql_escape($role_name) . "'";
 321          $this->db->sql_query($sql);
 322          $role_id = (int) $this->db->sql_fetchfield('role_id');
 323   
 324          if (!$role_id)
 325          {
 326              return;
 327          }
 328   
 329          $sql = 'DELETE FROM ' . ACL_ROLES_DATA_TABLE . '
 330              WHERE role_id = ' . $role_id;
 331          $this->db->sql_query($sql);
 332   
 333          $sql = 'DELETE FROM ' . ACL_ROLES_TABLE . '
 334              WHERE role_id = ' . $role_id;
 335          $this->db->sql_query($sql);
 336   
 337          $this->auth->acl_clear_prefetch();
 338      }
 339   
 340      /**
 341      * Permission Set
 342      *
 343      * Allows you to set permissions for a certain group/role
 344      *
 345      * @param string $name The name of the role/group
 346      * @param string|array $auth_option The auth_option or array of
 347      *     auth_options you would like to set
 348      * @param string $type The type (role|group)
 349      * @param bool $has_permission True if you want to give them permission,
 350      *     false if you want to deny them permission
 351      * @return null
 352      * @throws \phpbb\db\migration\exception
 353      */
 354      public function permission_set($name, $auth_option, $type = 'role', $has_permission = true)
 355      {
 356          if (!is_array($auth_option))
 357          {
 358              $auth_option = array($auth_option);
 359          }
 360   
 361          $new_auth = array();
 362          $sql = 'SELECT auth_option_id
 363              FROM ' . ACL_OPTIONS_TABLE . '
 364              WHERE ' . $this->db->sql_in_set('auth_option', $auth_option);
 365          $result = $this->db->sql_query($sql);
 366          while ($row = $this->db->sql_fetchrow($result))
 367          {
 368              $new_auth[] = (int) $row['auth_option_id'];
 369          }
 370          $this->db->sql_freeresult($result);
 371   
 372          if (empty($new_auth))
 373          {
 374              return;
 375          }
 376   
 377          $current_auth = array();
 378   
 379          $type = (string) $type; // Prevent PHP bug.
 380   
 381          switch ($type)
 382          {
 383              case 'role':
 384                  $sql = 'SELECT role_id
 385                      FROM ' . ACL_ROLES_TABLE . "
 386                      WHERE role_name = '" . $this->db->sql_escape($name) . "'";
 387                  $this->db->sql_query($sql);
 388                  $role_id = (int) $this->db->sql_fetchfield('role_id');
 389   
 390                  if (!$role_id)
 391                  {
 392                      throw new \phpbb\db\migration\exception('ROLE_NOT_EXIST', $name);
 393                  }
 394   
 395                  $sql = 'SELECT auth_option_id, auth_setting
 396                      FROM ' . ACL_ROLES_DATA_TABLE . '
 397                      WHERE role_id = ' . $role_id;
 398                  $result = $this->db->sql_query($sql);
 399                  while ($row = $this->db->sql_fetchrow($result))
 400                  {
 401                      $current_auth[$row['auth_option_id']] = $row['auth_setting'];
 402                  }
 403                  $this->db->sql_freeresult($result);
 404              break;
 405   
 406              case 'group':
 407                  $sql = 'SELECT group_id
 408                      FROM ' . GROUPS_TABLE . "
 409                      WHERE group_name = '" . $this->db->sql_escape($name) . "'";
 410                  $this->db->sql_query($sql);
 411                  $group_id = (int) $this->db->sql_fetchfield('group_id');
 412   
 413                  if (!$group_id)
 414                  {
 415                      throw new \phpbb\db\migration\exception('GROUP_NOT_EXIST', $name);
 416                  }
 417   
 418                  // If the group has a role set for them we will add the requested permissions to that role.
 419                  $sql = 'SELECT auth_role_id
 420                      FROM ' . ACL_GROUPS_TABLE . '
 421                      WHERE group_id = ' . $group_id . '
 422                          AND auth_role_id <> 0
 423                          AND forum_id = 0';
 424                  $this->db->sql_query($sql);
 425                  $role_id = (int) $this->db->sql_fetchfield('auth_role_id');
 426                  if ($role_id)
 427                  {
 428                      $sql = 'SELECT role_name
 429                          FROM ' . ACL_ROLES_TABLE . '
 430                          WHERE role_id = ' . $role_id;
 431                      $this->db->sql_query($sql);
 432                      $role_name = $this->db->sql_fetchfield('role_name');
 433   
 434                      return $this->permission_set($role_name, $auth_option, 'role', $has_permission);
 435                  }
 436   
 437                  $sql = 'SELECT auth_option_id, auth_setting
 438                      FROM ' . ACL_GROUPS_TABLE . '
 439                      WHERE group_id = ' . $group_id;
 440                  $result = $this->db->sql_query($sql);
 441                  while ($row = $this->db->sql_fetchrow($result))
 442                  {
 443                      $current_auth[$row['auth_option_id']] = $row['auth_setting'];
 444                  }
 445                  $this->db->sql_freeresult($result);
 446              break;
 447          }
 448   
 449          $sql_ary = array();
 450          switch ($type)
 451          {
 452              case 'role':
 453                  foreach ($new_auth as $auth_option_id)
 454                  {
 455                      if (!isset($current_auth[$auth_option_id]))
 456                      {
 457                          $sql_ary[] = array(
 458                              'role_id'            => $role_id,
 459                              'auth_option_id'    => $auth_option_id,
 460                              'auth_setting'        => $has_permission,
 461                          );
 462                      }
 463                  }
 464   
 465                  $this->db->sql_multi_insert(ACL_ROLES_DATA_TABLE, $sql_ary);
 466              break;
 467   
 468              case 'group':
 469                  foreach ($new_auth as $auth_option_id)
 470                  {
 471                      if (!isset($current_auth[$auth_option_id]))
 472                      {
 473                          $sql_ary[] = array(
 474                              'group_id'            => $group_id,
 475                              'auth_option_id'    => $auth_option_id,
 476                              'auth_setting'        => $has_permission,
 477                          );
 478                      }
 479                  }
 480   
 481                  $this->db->sql_multi_insert(ACL_GROUPS_TABLE, $sql_ary);
 482              break;
 483          }
 484   
 485          $this->auth->acl_clear_prefetch();
 486      }
 487   
 488      /**
 489      * Permission Unset
 490      *
 491      * Allows you to unset (remove) permissions for a certain group/role
 492      *
 493      * @param string $name The name of the role/group
 494      * @param string|array $auth_option The auth_option or array of
 495      *     auth_options you would like to set
 496      * @param string $type The type (role|group)
 497      * @return null
 498      * @throws \phpbb\db\migration\exception
 499      */
 500      public function permission_unset($name, $auth_option, $type = 'role')
 501      {
 502          if (!is_array($auth_option))
 503          {
 504              $auth_option = array($auth_option);
 505          }
 506   
 507          $to_remove = array();
 508          $sql = 'SELECT auth_option_id
 509              FROM ' . ACL_OPTIONS_TABLE . '
 510              WHERE ' . $this->db->sql_in_set('auth_option', $auth_option);
 511          $result = $this->db->sql_query($sql);
 512          while ($row = $this->db->sql_fetchrow($result))
 513          {
 514              $to_remove[] = (int) $row['auth_option_id'];
 515          }
 516          $this->db->sql_freeresult($result);
 517   
 518          if (empty($to_remove))
 519          {
 520              return;
 521          }
 522   
 523          $type = (string) $type; // Prevent PHP bug.
 524   
 525          switch ($type)
 526          {
 527              case 'role':
 528                  $sql = 'SELECT role_id
 529                      FROM ' . ACL_ROLES_TABLE . "
 530                      WHERE role_name = '" . $this->db->sql_escape($name) . "'";
 531                  $this->db->sql_query($sql);
 532                  $role_id = (int) $this->db->sql_fetchfield('role_id');
 533   
 534                  if (!$role_id)
 535                  {
 536                      throw new \phpbb\db\migration\exception('ROLE_NOT_EXIST', $name);
 537                  }
 538   
 539                  $sql = 'DELETE FROM ' . ACL_ROLES_DATA_TABLE . '
 540                      WHERE ' . $this->db->sql_in_set('auth_option_id', $to_remove);
 541                  $this->db->sql_query($sql);
 542              break;
 543   
 544              case 'group':
 545                  $sql = 'SELECT group_id
 546                      FROM ' . GROUPS_TABLE . "
 547                      WHERE group_name = '" . $this->db->sql_escape($name) . "'";
 548                  $this->db->sql_query($sql);
 549                  $group_id = (int) $this->db->sql_fetchfield('group_id');
 550   
 551                  if (!$group_id)
 552                  {
 553                      throw new \phpbb\db\migration\exception('GROUP_NOT_EXIST', $name);
 554                  }
 555   
 556                  // If the group has a role set for them we will remove the requested permissions from that role.
 557                  $sql = 'SELECT auth_role_id
 558                      FROM ' . ACL_GROUPS_TABLE . '
 559                      WHERE group_id = ' . $group_id . '
 560                          AND auth_role_id <> 0';
 561                  $this->db->sql_query($sql);
 562                  $role_id = (int) $this->db->sql_fetchfield('auth_role_id');
 563                  if ($role_id)
 564                  {
 565                      $sql = 'SELECT role_name
 566                          FROM ' . ACL_ROLES_TABLE . '
 567                          WHERE role_id = ' . $role_id;
 568                      $this->db->sql_query($sql);
 569                      $role_name = $this->db->sql_fetchfield('role_name');
 570   
 571                      return $this->permission_unset($role_name, $auth_option, 'role');
 572                  }
 573   
 574                  $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
 575                      WHERE ' . $this->db->sql_in_set('auth_option_id', $to_remove);
 576                  $this->db->sql_query($sql);
 577              break;
 578          }
 579   
 580          $this->auth->acl_clear_prefetch();
 581      }
 582   
 583      /**
 584      * {@inheritdoc}
 585      */
 586      public function reverse()
 587      {
 588          $arguments = func_get_args();
 589          $original_call = array_shift($arguments);
 590   
 591          $call = false;
 592          switch ($original_call)
 593          {
 594              case 'add':
 595                  $call = 'remove';
 596              break;
 597   
 598              case 'remove':
 599                  $call = 'add';
 600              break;
 601   
 602              case 'permission_set':
 603                  $call = 'permission_unset';
 604              break;
 605   
 606              case 'permission_unset':
 607                  $call = 'permission_set';
 608              break;
 609   
 610              case 'role_add':
 611                  $call = 'role_remove';
 612              break;
 613   
 614              case 'role_remove':
 615                  $call = 'role_add';
 616              break;
 617   
 618              case 'role_update':
 619                  // Set to the original value if the current value is what we compared to originally
 620                  $arguments = array(
 621                      $arguments[1],
 622                      $arguments[0],
 623                  );
 624              break;
 625          }
 626   
 627          if ($call)
 628          {
 629              return call_user_func_array(array(&$this, $call), $arguments);
 630          }
 631      }
 632  }
 633