[ Index ]

PHP Cross Reference of phpBB-3.1.12-deutsch

title

Body

[close]

/includes/ -> functions_install.php (source)

   1  <?php
   2  /**
   3  *
   4  * This file is part of the phpBB Forum Software package.
   5  *
   6  * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7  * @license GNU General Public License, version 2 (GPL-2.0)
   8  *
   9  * For full copyright and license information, please see
  10  * the docs/CREDITS.txt file.
  11  *
  12  */
  13  
  14  /**
  15  * @ignore
  16  */
  17  if (!defined('IN_PHPBB'))
  18  {
  19      exit;
  20  }
  21  
  22  /**
  23  * Returns an array of available DBMS with some data, if a DBMS is specified it will only
  24  * return data for that DBMS and will load its extension if necessary.
  25  */
  26  function get_available_dbms($dbms = false, $return_unavailable = false, $only_20x_options = false)
  27  {
  28      global $lang;
  29      $available_dbms = array(
  30          // Note: php 5.5 alpha 2 deprecated mysql.
  31          // Keep mysqli before mysql in this list.
  32          'mysqli'    => array(
  33              'LABEL'            => 'MySQL with MySQLi Extension',
  34              'SCHEMA'        => 'mysql_41',
  35              'MODULE'        => 'mysqli',
  36              'DELIM'            => ';',
  37              'DRIVER'        => 'phpbb\db\driver\mysqli',
  38              'AVAILABLE'        => true,
  39              '2.0.x'            => true,
  40          ),
  41          'mysql'        => array(
  42              'LABEL'            => 'MySQL',
  43              'SCHEMA'        => 'mysql',
  44              'MODULE'        => 'mysql',
  45              'DELIM'            => ';',
  46              'DRIVER'        => 'phpbb\db\driver\mysql',
  47              'AVAILABLE'        => true,
  48              '2.0.x'            => true,
  49          ),
  50          'mssql'        => array(
  51              'LABEL'            => 'MS SQL Server 2000+',
  52              'SCHEMA'        => 'mssql',
  53              'MODULE'        => 'mssql',
  54              'DELIM'            => 'GO',
  55              'DRIVER'        => 'phpbb\db\driver\mssql',
  56              'AVAILABLE'        => true,
  57              '2.0.x'            => true,
  58          ),
  59          'mssql_odbc'=>    array(
  60              'LABEL'            => 'MS SQL Server [ ODBC ]',
  61              'SCHEMA'        => 'mssql',
  62              'MODULE'        => 'odbc',
  63              'DELIM'            => 'GO',
  64              'DRIVER'        => 'phpbb\db\driver\mssql_odbc',
  65              'AVAILABLE'        => true,
  66              '2.0.x'            => true,
  67          ),
  68          'mssqlnative'        => array(
  69              'LABEL'            => 'MS SQL Server 2005+ [ Native ]',
  70              'SCHEMA'        => 'mssql',
  71              'MODULE'        => 'sqlsrv',
  72              'DELIM'            => 'GO',
  73              'DRIVER'        => 'phpbb\db\driver\mssqlnative',
  74              'AVAILABLE'        => true,
  75              '2.0.x'            => false,
  76          ),
  77          'oracle'    =>    array(
  78              'LABEL'            => 'Oracle',
  79              'SCHEMA'        => 'oracle',
  80              'MODULE'        => 'oci8',
  81              'DELIM'            => '/',
  82              'DRIVER'        => 'phpbb\db\driver\oracle',
  83              'AVAILABLE'        => true,
  84              '2.0.x'            => false,
  85          ),
  86          'postgres' => array(
  87              'LABEL'            => 'PostgreSQL 8.3+',
  88              'SCHEMA'        => 'postgres',
  89              'MODULE'        => 'pgsql',
  90              'DELIM'            => ';',
  91              'DRIVER'        => 'phpbb\db\driver\postgres',
  92              'AVAILABLE'        => true,
  93              '2.0.x'            => true,
  94          ),
  95          'sqlite'        => array(
  96              'LABEL'            => 'SQLite',
  97              'SCHEMA'        => 'sqlite',
  98              'MODULE'        => 'sqlite',
  99              '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  }


Generated: Thu Jan 11 00:25:41 2018 Cross-referenced by PHPXref 0.7.1