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

functions_install.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 14.10 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  /**
 015  * @ignore
 016  */
 017  if (!defined('IN_PHPBB'))
 018  {
 019      exit;
 020  }
 021   
 022  /**
 023  * Returns an array of available DBMS with some data, if a DBMS is specified it will only
 024  * return data for that DBMS and will load its extension if necessary.
 025  */
 026  function get_available_dbms($dbms = false, $return_unavailable = false, $only_20x_options = false)
 027  {
 028      global $lang;
 029      $available_dbms = array(
 030          // Note: php 5.5 alpha 2 deprecated mysql.
 031          // Keep mysqli before mysql in this list.
 032          'mysqli'    => array(
 033              'LABEL'            => 'MySQL with MySQLi Extension',
 034              'SCHEMA'        => 'mysql_41',
 035              'MODULE'        => 'mysqli',
 036              'DELIM'            => ';',
 037              'DRIVER'        => 'phpbb\db\driver\mysqli',
 038              'AVAILABLE'        => true,
 039              '2.0.x'            => true,
 040          ),
 041          'mysql'        => array(
 042              'LABEL'            => 'MySQL',
 043              'SCHEMA'        => 'mysql',
 044              'MODULE'        => 'mysql',
 045              'DELIM'            => ';',
 046              'DRIVER'        => 'phpbb\db\driver\mysql',
 047              'AVAILABLE'        => true,
 048              '2.0.x'            => true,
 049          ),
 050          'mssql'        => array(
 051              'LABEL'            => 'MS SQL Server 2000+',
 052              'SCHEMA'        => 'mssql',
 053              'MODULE'        => 'mssql',
 054              'DELIM'            => 'GO',
 055              'DRIVER'        => 'phpbb\db\driver\mssql',
 056              'AVAILABLE'        => true,
 057              '2.0.x'            => true,
 058          ),
 059          'mssql_odbc'=>    array(
 060              'LABEL'            => 'MS SQL Server [ ODBC ]',
 061              'SCHEMA'        => 'mssql',
 062              'MODULE'        => 'odbc',
 063              'DELIM'            => 'GO',
 064              'DRIVER'        => 'phpbb\db\driver\mssql_odbc',
 065              'AVAILABLE'        => true,
 066              '2.0.x'            => true,
 067          ),
 068          'mssqlnative'        => array(
 069              'LABEL'            => 'MS SQL Server 2005+ [ Native ]',
 070              'SCHEMA'        => 'mssql',
 071              'MODULE'        => 'sqlsrv',
 072              'DELIM'            => 'GO',
 073              'DRIVER'        => 'phpbb\db\driver\mssqlnative',
 074              'AVAILABLE'        => true,
 075              '2.0.x'            => false,
 076          ),
 077          'oracle'    =>    array(
 078              'LABEL'            => 'Oracle',
 079              'SCHEMA'        => 'oracle',
 080              'MODULE'        => 'oci8',
 081              'DELIM'            => '/',
 082              'DRIVER'        => 'phpbb\db\driver\oracle',
 083              'AVAILABLE'        => true,
 084              '2.0.x'            => false,
 085          ),
 086          'postgres' => array(
 087              'LABEL'            => 'PostgreSQL 8.3+',
 088              'SCHEMA'        => 'postgres',
 089              'MODULE'        => 'pgsql',
 090              'DELIM'            => ';',
 091              'DRIVER'        => 'phpbb\db\driver\postgres',
 092              'AVAILABLE'        => true,
 093              '2.0.x'            => true,
 094          ),
 095          'sqlite'        => array(
 096              'LABEL'            => 'SQLite',
 097              'SCHEMA'        => 'sqlite',
 098              'MODULE'        => 'sqlite',
 099              'DELIM'            => ';',
 100              'DRIVER'        => 'phpbb\db\driver\sqlite',
 101              'AVAILABLE'        => true,
 102              '2.0.x'            => false,
 103          ),
 104          'sqlite3'        => array(
 105              'LABEL'            => 'SQLite3',
 106              'SCHEMA'        => 'sqlite',
 107              'MODULE'        => 'sqlite3',
 108              'DELIM'            => ';',
 109              'DRIVER'        => 'phpbb\db\driver\sqlite3',
 110              'AVAILABLE'        => true,
 111              '2.0.x'            => false,
 112          ),
 113      );
 114   
 115      if ($dbms)
 116      {
 117          if (isset($available_dbms[$dbms]))
 118          {
 119              $available_dbms = array($dbms => $available_dbms[$dbms]);
 120          }
 121          else
 122          {
 123              return array();
 124          }
 125      }
 126   
 127      // now perform some checks whether they are really available
 128      foreach ($available_dbms as $db_name => $db_ary)
 129      {
 130          if ($only_20x_options && !$db_ary['2.0.x'])
 131          {
 132              if ($return_unavailable)
 133              {
 134                  $available_dbms[$db_name]['AVAILABLE'] = false;
 135              }
 136              else
 137              {
 138                  unset($available_dbms[$db_name]);
 139              }
 140              continue;
 141          }
 142   
 143          $dll = $db_ary['MODULE'];
 144   
 145          if (!@extension_loaded($dll))
 146          {
 147              if ($return_unavailable)
 148              {
 149                  $available_dbms[$db_name]['AVAILABLE'] = false;
 150              }
 151              else
 152              {
 153                  unset($available_dbms[$db_name]);
 154              }
 155              continue;
 156          }
 157          $any_db_support = true;
 158      }
 159   
 160      if ($return_unavailable)
 161      {
 162          $available_dbms['ANY_DB_SUPPORT'] = $any_db_support;
 163      }
 164      return $available_dbms;
 165  }
 166   
 167  /**
 168  * Generate the drop down of available database options
 169  */
 170  function dbms_select($default = '', $only_20x_options = false)
 171  {
 172      global $lang;
 173   
 174      $available_dbms = get_available_dbms(false, false, $only_20x_options);
 175      $dbms_options = '';
 176      foreach ($available_dbms as $dbms_name => $details)
 177      {
 178          $selected = ($dbms_name == $default) ? ' selected="selected"' : '';
 179          $dbms_options .= '<option value="' . $dbms_name . '"' . $selected .'>' . $lang['DLL_' . strtoupper($dbms_name)] . '</option>';
 180      }
 181      return $dbms_options;
 182  }
 183   
 184  /**
 185  * Get tables of a database
 186  *
 187  * @deprecated
 188  */
 189  function get_tables(&$db)
 190  {
 191      $db_tools = new \phpbb\db\tools($db);
 192   
 193      return $db_tools->sql_list_tables();
 194  }
 195   
 196  /**
 197  * Used to test whether we are able to connect to the database the user has specified
 198  * and identify any problems (eg there are already tables with the names we want to use
 199  * @param    array    $dbms should be of the format of an element of the array returned by {@link get_available_dbms get_available_dbms()}
 200  *                    necessary extensions should be loaded already
 201  */
 202  function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport, $prefix_may_exist = false, $load_dbal = true, $unicode_check = true)
 203  {
 204      global $phpbb_root_path, $phpEx, $config, $lang;
 205   
 206      $dbms = $dbms_details['DRIVER'];
 207   
 208      // Instantiate it and set return on error true
 209      $db = new $dbms();
 210      $db->sql_return_on_error(true);
 211   
 212      // Check that we actually have a database name before going any further.....
 213      if ($dbms_details['DRIVER'] != 'phpbb\db\driver\sqlite' && $dbms_details['DRIVER'] != 'phpbb\db\driver\sqlite3' && $dbms_details['DRIVER'] != 'phpbb\db\driver\oracle' && $dbname === '')
 214      {
 215          $error[] = $lang['INST_ERR_DB_NO_NAME'];
 216          return false;
 217      }
 218   
 219      // Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
 220      if (($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' || $dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite3') && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0)
 221      {
 222          $error[] = $lang['INST_ERR_DB_FORUM_PATH'];
 223          return false;
 224      }
 225   
 226      // Check the prefix length to ensure that index names are not too long and does not contain invalid characters
 227      switch ($dbms_details['DRIVER'])
 228      {
 229          case 'phpbb\db\driver\mysql':
 230          case 'phpbb\db\driver\mysqli':
 231              if (strspn($table_prefix, '-./\\') !== 0)
 232              {
 233                  $error[] = $lang['INST_ERR_PREFIX_INVALID'];
 234                  return false;
 235              }
 236   
 237          // no break;
 238   
 239          case 'phpbb\db\driver\postgres':
 240              $prefix_length = 36;
 241          break;
 242   
 243          case 'phpbb\db\driver\mssql':
 244          case 'phpbb\db\driver\mssql_odbc':
 245          case 'phpbb\db\driver\mssqlnative':
 246              $prefix_length = 90;
 247          break;
 248   
 249          case 'phpbb\db\driver\sqlite':
 250          case 'phpbb\db\driver\sqlite3':
 251              $prefix_length = 200;
 252          break;
 253   
 254          case 'phpbb\db\driver\oracle':
 255              $prefix_length = 6;
 256          break;
 257      }
 258   
 259      if (strlen($table_prefix) > $prefix_length)
 260      {
 261          $error[] = sprintf($lang['INST_ERR_PREFIX_TOO_LONG'], $prefix_length);
 262          return false;
 263      }
 264   
 265      // Try and connect ...
 266      if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true)))
 267      {
 268          $db_error = $db->sql_error();
 269          $error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? utf8_convert_message($db_error['message']) : $lang['INST_ERR_DB_NO_ERROR']);
 270      }
 271      else
 272      {
 273          // Likely matches for an existing phpBB installation
 274          if (!$prefix_may_exist)
 275          {
 276              $temp_prefix = strtolower($table_prefix);
 277              $table_ary = array($temp_prefix . 'attachments', $temp_prefix . 'config', $temp_prefix . 'sessions', $temp_prefix . 'topics', $temp_prefix . 'users');
 278   
 279              $tables = get_tables($db);
 280              $tables = array_map('strtolower', $tables);
 281              $table_intersect = array_intersect($tables, $table_ary);
 282   
 283              if (sizeof($table_intersect))
 284              {
 285                  $error[] = $lang['INST_ERR_PREFIX'];
 286              }
 287          }
 288   
 289          // Make sure that the user has selected a sensible DBAL for the DBMS actually installed
 290          switch ($dbms_details['DRIVER'])
 291          {
 292              case 'phpbb\db\driver\mysqli':
 293                  if (version_compare(mysqli_get_server_info($db->get_db_connect_id()), '4.1.3', '<'))
 294                  {
 295                      $error[] = $lang['INST_ERR_DB_NO_MYSQLI'];
 296                  }
 297              break;
 298   
 299              case 'phpbb\db\driver\sqlite':
 300                  if (version_compare(sqlite_libversion(), '2.8.2', '<'))
 301                  {
 302                      $error[] = $lang['INST_ERR_DB_NO_SQLITE'];
 303                  }
 304              break;
 305   
 306              case 'phpbb\db\driver\sqlite3':
 307                  $version = \SQLite3::version();
 308                  if (version_compare($version['versionString'], '3.6.15', '<'))
 309                  {
 310                      $error[] = $lang['INST_ERR_DB_NO_SQLITE3'];
 311                  }
 312              break;
 313   
 314              case 'phpbb\db\driver\oracle':
 315                  if ($unicode_check)
 316                  {
 317                      $sql = "SELECT *
 318                          FROM NLS_DATABASE_PARAMETERS
 319                          WHERE PARAMETER = 'NLS_RDBMS_VERSION'
 320                              OR PARAMETER = 'NLS_CHARACTERSET'";
 321                      $result = $db->sql_query($sql);
 322   
 323                      while ($row = $db->sql_fetchrow($result))
 324                      {
 325                          $stats[$row['parameter']] = $row['value'];
 326                      }
 327                      $db->sql_freeresult($result);
 328   
 329                      if (version_compare($stats['NLS_RDBMS_VERSION'], '9.2', '<') && $stats['NLS_CHARACTERSET'] !== 'UTF8')
 330                      {
 331                          $error[] = $lang['INST_ERR_DB_NO_ORACLE'];
 332                      }
 333                  }
 334              break;
 335   
 336              case 'phpbb\db\driver\postgres':
 337                  if ($unicode_check)
 338                  {
 339                      $sql = "SHOW server_encoding;";
 340                      $result = $db->sql_query($sql);
 341                      $row = $db->sql_fetchrow($result);
 342                      $db->sql_freeresult($result);
 343   
 344                      if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8')
 345                      {
 346                          $error[] = $lang['INST_ERR_DB_NO_POSTGRES'];
 347                      }
 348                  }
 349              break;
 350          }
 351   
 352      }
 353   
 354      if ($error_connect && (!isset($error) || !sizeof($error)))
 355      {
 356          return true;
 357      }
 358      return false;
 359  }
 360   
 361  /**
 362  * Removes "/* style" as well as "# style" comments from $input.
 363  *
 364  * @param string $input        Input string
 365  *
 366  * @return string            Input string with comments removed
 367  */
 368  function phpbb_remove_comments($input)
 369  {
 370      // Remove /* */ comments (http://ostermiller.org/findcomment.html)
 371      $input = preg_replace('#/\*(.|[\r\n])*?\*/#', "\n", $input);
 372   
 373      // Remove # style comments
 374      $input = preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*$/m', "\n", $input));
 375   
 376      return $input;
 377  }
 378   
 379  /**
 380  * split_sql_file will split an uploaded sql file into single sql statements.
 381  * Note: expects trim() to have already been run on $sql.
 382  */
 383  function split_sql_file($sql, $delimiter)
 384  {
 385      $sql = str_replace("\r" , '', $sql);
 386      $data = preg_split('/' . preg_quote($delimiter, '/') . '$/m', $sql);
 387   
 388      $data = array_map('trim', $data);
 389   
 390      // The empty case
 391      $end_data = end($data);
 392   
 393      if (empty($end_data))
 394      {
 395          unset($data[key($data)]);
 396      }
 397   
 398      return $data;
 399  }
 400   
 401  /**
 402  * For replacing {L_*} strings with preg_replace_callback
 403  */
 404  function adjust_language_keys_callback($matches)
 405  {
 406      if (!empty($matches[1]))
 407      {
 408          global $lang, $db;
 409   
 410          return (!empty($lang[$matches[1]])) ? $db->sql_escape($lang[$matches[1]]) : $db->sql_escape($matches[1]);
 411      }
 412  }
 413   
 414  /**
 415  * Creates the output to be stored in a phpBB config.php file
 416  *
 417  * @param    array    $data Array containing the database connection information
 418  * @param    string    $dbms The name of the DBAL class to use
 419  * @param    bool    $debug If the debug constants should be enabled by default or not
 420  * @param    bool    $debug_container If the container should be compiled on
 421  *                    every page load or not
 422  * @param    bool    $debug_test If the DEBUG_TEST constant should be added
 423  *                    NOTE: Only for use within the testing framework
 424  *
 425  * @return    string    The output to write to the file
 426  */
 427  function phpbb_create_config_file_data($data, $dbms, $debug = false, $debug_container = false, $debug_test = false)
 428  {
 429      $config_data = "<?php\n";
 430      $config_data .= "// phpBB 3.1.x auto-generated configuration file\n// Do not change anything in this file!\n";
 431   
 432      $config_data_array = array(
 433          'dbms'            => $dbms,
 434          'dbhost'        => $data['dbhost'],
 435          'dbport'        => $data['dbport'],
 436          'dbname'        => $data['dbname'],
 437          'dbuser'        => $data['dbuser'],
 438          'dbpasswd'        => htmlspecialchars_decode($data['dbpasswd']),
 439          'table_prefix'    => $data['table_prefix'],
 440   
 441          'phpbb_adm_relative_path'    => 'adm/',
 442   
 443          'acm_type'        => 'phpbb\cache\driver\file',
 444      );
 445   
 446      foreach ($config_data_array as $key => $value)
 447      {
 448          $config_data .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n";
 449      }
 450   
 451      $config_data .= "\n@define('PHPBB_INSTALLED', true);\n";
 452      $config_data .= "// @define('PHPBB_DISPLAY_LOAD_TIME', true);\n";
 453   
 454      if ($debug)
 455      {
 456          $config_data .= "@define('DEBUG', true);\n";
 457      }
 458      else
 459      {
 460          $config_data .= "// @define('DEBUG', true);\n";
 461      }
 462   
 463      if ($debug_container)
 464      {
 465          $config_data .= "@define('DEBUG_CONTAINER', true);\n";
 466      }
 467      else
 468      {
 469          $config_data .= "// @define('DEBUG_CONTAINER', true);\n";
 470      }
 471   
 472      if ($debug_test)
 473      {
 474          $config_data .= "@define('DEBUG_TEST', true);\n";
 475      }
 476   
 477      return $config_data;
 478  }
 479   
 480  /**
 481  * Check whether a file should be ignored on update
 482  *
 483  * We ignore new files in some circumstances:
 484  * 1. The file is a language file, but the language is not installed
 485  * 2. The file is a style file, but the style is not installed
 486  * 3. The file is a style language file, but the language is not installed
 487  *
 488  * @param    string    $phpbb_root_path    phpBB root path
 489  * @param    string    $file                File including path from phpbb root
 490  * @return    bool        Should we ignore the new file or add it to the board?
 491  */
 492  function phpbb_ignore_new_file_on_update($phpbb_root_path, $file)
 493  {
 494      $ignore_new_file = false;
 495   
 496      // We ignore new files in some circumstances:
 497      // 1. The file is a language file, but the language is not installed
 498      if (!$ignore_new_file && strpos($file, 'language/') === 0)
 499      {
 500          list($language_dir, $language_iso) = explode('/', $file);
 501          $ignore_new_file = !file_exists($phpbb_root_path . $language_dir . '/' . $language_iso);
 502      }
 503   
 504      // 2. The file is a style file, but the style is not installed
 505      if (!$ignore_new_file && strpos($file, 'styles/') === 0)
 506      {
 507          list($styles_dir, $style_name) = explode('/', $file);
 508          $ignore_new_file = !file_exists($phpbb_root_path . $styles_dir . '/' . $style_name);
 509      }
 510   
 511      // 3. The file is a style language file, but the language is not installed
 512      if (!$ignore_new_file && strpos($file, 'styles/') === 0)
 513      {
 514          $dirs = explode('/', $file);
 515          if (sizeof($dirs) >= 5)
 516          {
 517              list($styles_dir, $style_name, $template_component, $language_iso) = explode('/', $file);
 518              if ($template_component == 'theme' && $language_iso !== 'images')
 519              {
 520                  $ignore_new_file = !file_exists($phpbb_root_path . 'language/' . $language_iso);
 521              }
 522          }
 523      }
 524   
 525      return $ignore_new_file;
 526  }
 527   
 528  /**
 529  * Check whether phpBB is installed.
 530  *
 531  * @param string $phpbb_root_path    Path to the phpBB board root.
 532  * @param string $php_ext            PHP file extension.
 533  *
 534  * @return bool Returns true if phpBB is installed.
 535  */
 536  function phpbb_check_installation_exists($phpbb_root_path, $php_ext)
 537  {
 538      // Try opening config file
 539      if (file_exists($phpbb_root_path . 'config.' . $php_ext))
 540      {
 541          include($phpbb_root_path . 'config.' . $php_ext);
 542      }
 543   
 544      return defined('PHPBB_INSTALLED');
 545  }
 546