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

index.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 22.97 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  define('IN_PHPBB', true);
 018  define('IN_INSTALL', true);
 019  /**#@-*/
 020   
 021  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
 022  $phpEx = substr(strrchr(__FILE__, '.'), 1);
 023   
 024  if (version_compare(PHP_VERSION, '5.3.3') < 0)
 025  {
 026      die('You are running an unsupported PHP version. Please upgrade to PHP 5.3.3 or higher before trying to install phpBB 3.1');
 027  }
 028   
 029  function phpbb_require_updated($path, $optional = false)
 030  {
 031      global $phpbb_root_path, $table_prefix;
 032   
 033      $new_path = $phpbb_root_path . 'install/update/new/' . $path;
 034      $old_path = $phpbb_root_path . $path;
 035   
 036      if (file_exists($new_path))
 037      {
 038          require($new_path);
 039      }
 040      else if (!$optional || file_exists($old_path))
 041      {
 042          require($old_path);
 043      }
 044  }
 045   
 046  function phpbb_include_updated($path, $optional = false)
 047  {
 048      global $phpbb_root_path;
 049   
 050      $new_path = $phpbb_root_path . 'install/update/new/' . $path;
 051      $old_path = $phpbb_root_path . $path;
 052   
 053      if (file_exists($new_path))
 054      {
 055          include($new_path);
 056      }
 057      else if (!$optional || file_exists($old_path))
 058      {
 059          include($old_path);
 060      }
 061  }
 062   
 063  phpbb_require_updated('includes/startup.' . $phpEx);
 064   
 065  // Try to override some limits - maybe it helps some...
 066  @set_time_limit(0);
 067  $mem_limit = @ini_get('memory_limit');
 068  if (!empty($mem_limit))
 069  {
 070      $unit = strtolower(substr($mem_limit, -1, 1));
 071      $mem_limit = (int) $mem_limit;
 072   
 073      if ($unit == 'k')
 074      {
 075          $mem_limit = floor($mem_limit / 1024);
 076      }
 077      else if ($unit == 'g')
 078      {
 079          $mem_limit *= 1024;
 080      }
 081      else if (is_numeric($unit))
 082      {
 083          $mem_limit = floor((int) ($mem_limit . $unit) / 1048576);
 084      }
 085      $mem_limit = max(128, $mem_limit) . 'M';
 086  }
 087  else
 088  {
 089      $mem_limit = '128M';
 090  }
 091  @ini_set('memory_limit', $mem_limit);
 092   
 093  // In case $phpbb_adm_relative_path is not set (in case of an update), use the default.
 094  $phpbb_adm_relative_path = (isset($phpbb_adm_relative_path)) ? $phpbb_adm_relative_path : 'adm/';
 095  $phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : $phpbb_root_path . $phpbb_adm_relative_path;
 096   
 097  // Include essential scripts
 098  phpbb_require_updated('phpbb/class_loader.' . $phpEx);
 099   
 100  phpbb_require_updated('includes/functions.' . $phpEx);
 101   
 102  phpbb_require_updated('includes/functions_content.' . $phpEx, true);
 103   
 104  phpbb_include_updated('includes/functions_admin.' . $phpEx);
 105  phpbb_include_updated('includes/utf/utf_normalizer.' . $phpEx);
 106  phpbb_include_updated('includes/utf/utf_tools.' . $phpEx);
 107  phpbb_require_updated('includes/functions_install.' . $phpEx);
 108   
 109  // Setup class loader first
 110  $phpbb_class_loader_new = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}install/update/new/phpbb/", $phpEx);
 111  $phpbb_class_loader_new->register();
 112  $phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
 113  $phpbb_class_loader->register();
 114  $phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
 115  $phpbb_class_loader_ext->register();
 116   
 117  // Set up container
 118  $phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx);
 119  $phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx);
 120  $phpbb_container_builder->set_use_extensions(false);
 121  $phpbb_container_builder->set_dump_container(false);
 122  $phpbb_container_builder->set_use_custom_pass(false);
 123  $phpbb_container_builder->set_inject_config(false);
 124  $phpbb_container_builder->set_compile_container(false);
 125   
 126  $other_config_path = $phpbb_root_path . 'install/update/new/config/';
 127  $config_path = file_exists($other_config_path . 'services.yml') ? $other_config_path : $phpbb_root_path . 'config/';
 128  $phpbb_container_builder->set_config_path($config_path);
 129   
 130  $phpbb_container_builder->set_custom_parameters(array(
 131      'core.root_path'            => $phpbb_root_path,
 132      'core.adm_relative_path'    => $phpbb_adm_relative_path,
 133      'core.php_ext'                => $phpEx,
 134      'core.table_prefix'            => '',
 135      'cache.driver.class'        => 'phpbb\cache\driver\file',
 136  ));
 137   
 138  $phpbb_container = $phpbb_container_builder->get_container();
 139  $phpbb_container->register('dbal.conn.driver')->setSynthetic(true);
 140  $phpbb_container->compile();
 141   
 142  $phpbb_class_loader->set_cache($phpbb_container->get('cache.driver'));
 143  $phpbb_class_loader_ext->set_cache($phpbb_container->get('cache.driver'));
 144   
 145  $phpbb_dispatcher = $phpbb_container->get('dispatcher');
 146  $request    = $phpbb_container->get('request');
 147   
 148  // make sure request_var uses this request instance
 149  request_var('', 0, false, false, $request); // "dependency injection" for a function
 150   
 151  // Try and load an appropriate language if required
 152  $language = basename($request->variable('language', ''));
 153   
 154  if ($request->header('Accept-Language') && !$language)
 155  {
 156      $accept_lang_ary = explode(',', strtolower($request->header('Accept-Language')));
 157      foreach ($accept_lang_ary as $accept_lang)
 158      {
 159          // Set correct format ... guess full xx_yy form
 160          $accept_lang = substr($accept_lang, 0, 2) . '_' . substr($accept_lang, 3, 2);
 161   
 162          if (file_exists($phpbb_root_path . 'language/' . $accept_lang) && is_dir($phpbb_root_path . 'language/' . $accept_lang))
 163          {
 164              $language = $accept_lang;
 165              break;
 166          }
 167          else
 168          {
 169              // No match on xx_yy so try xx
 170              $accept_lang = substr($accept_lang, 0, 2);
 171              if (file_exists($phpbb_root_path . 'language/' . $accept_lang) && is_dir($phpbb_root_path . 'language/' . $accept_lang))
 172              {
 173                  $language = $accept_lang;
 174                  break;
 175              }
 176          }
 177      }
 178  }
 179   
 180  // No appropriate language found ... so let's use the first one in the language
 181  // dir, this may or may not be English
 182  if (!$language)
 183  {
 184      $dir = @opendir($phpbb_root_path . 'language');
 185   
 186      if (!$dir)
 187      {
 188          die('Unable to access the language directory');
 189          exit;
 190      }
 191   
 192      while (($file = readdir($dir)) !== false)
 193      {
 194          $path = $phpbb_root_path . 'language/' . $file;
 195   
 196          if (!is_file($path) && !is_link($path) && file_exists($path . '/iso.txt'))
 197          {
 198              $language = $file;
 199              break;
 200          }
 201      }
 202      closedir($dir);
 203  }
 204   
 205  if (!file_exists($phpbb_root_path . 'language/' . $language) || !is_dir($phpbb_root_path . 'language/' . $language))
 206  {
 207      die('No language found!');
 208  }
 209   
 210  // And finally, load the relevant language files
 211  $load_lang_files = array('common', 'acp/common', 'acp/board', 'install', 'posting');
 212  $new_path = $phpbb_root_path . 'install/update/new/language/' . $language . '/';
 213  $old_path = $phpbb_root_path . 'language/' . $language . '/';
 214   
 215  // NOTE: we can not use "phpbb_include_updated" as the files uses vars which would be required
 216  // to be global while loading.
 217  foreach ($load_lang_files as $lang_file)
 218  {
 219      if (file_exists($new_path . $lang_file . '.' . $phpEx))
 220      {
 221          include($new_path . $lang_file . '.' . $phpEx);
 222      }
 223      else
 224      {
 225          include($old_path . $lang_file . '.' . $phpEx);
 226      }
 227  }
 228   
 229  // usually we would need every single constant here - and it would be consistent. For 3.0.x, use a dirty hack... :(
 230   
 231  // Define needed constants
 232  define('CHMOD_ALL', 7);
 233  define('CHMOD_READ', 4);
 234  define('CHMOD_WRITE', 2);
 235  define('CHMOD_EXECUTE', 1);
 236   
 237  $mode = $request->variable('mode', 'overview');
 238  $sub = $request->variable('sub', '');
 239   
 240  // Set PHP error handler to ours
 241  set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
 242   
 243  $user = new \phpbb\user('\phpbb\datetime');
 244  $auth = new \phpbb\auth\auth();
 245   
 246  // Add own hook handler, if present. :o
 247  if (file_exists($phpbb_root_path . 'includes/hooks/index.' . $phpEx))
 248  {
 249      require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
 250      $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));
 251   
 252      $phpbb_hook_finder = $phpbb_container->get('hook_finder');
 253      foreach ($phpbb_hook_finder->find() as $hook)
 254      {
 255          @include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx);
 256      }
 257  }
 258  else
 259  {
 260      $phpbb_hook = false;
 261  }
 262   
 263  // Set some standard variables we want to force
 264  $config = new \phpbb\config\config(array(
 265      'load_tplcompile'    => '1'
 266  ));
 267   
 268  $symfony_request = $phpbb_container->get('symfony_request');
 269  $phpbb_filesystem = $phpbb_container->get('filesystem');
 270  $phpbb_path_helper = $phpbb_container->get('path_helper');
 271  $template = new \phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new \phpbb\template\context());
 272  $paths = array($phpbb_root_path . 'install/update/new/adm/style', $phpbb_admin_path . 'style');
 273  $paths = array_filter($paths, 'is_dir');
 274  $template->set_custom_style(array(
 275      array(
 276          'name'         => 'adm',
 277          'ext_path'     => 'adm/style/',
 278      ),
 279  ), $paths);
 280   
 281  $path = array_shift($paths);
 282   
 283  $template->assign_var('T_ASSETS_PATH', $path . '/../../assets');
 284  $template->assign_var('T_TEMPLATE_PATH', $path);
 285   
 286  $install = new module();
 287   
 288  $install->create('install', "index.$phpEx", $mode, $sub);
 289  $install->load();
 290   
 291  // Generate the page
 292  $install->page_header();
 293  $install->generate_navigation();
 294   
 295  $template->set_filenames(array(
 296      'body' => $install->get_tpl_name())
 297  );
 298   
 299  $install->page_footer();
 300   
 301  class module
 302  {
 303      var $id = 0;
 304      var $type = 'install';
 305      var $module_ary = array();
 306      var $filename;
 307      var $module_url = '';
 308      var $tpl_name = '';
 309      var $mode;
 310      var $sub;
 311   
 312      /**
 313      * Private methods, should not be overwritten
 314      */
 315      function create($module_type, $module_url, $selected_mod = false, $selected_submod = false)
 316      {
 317          global $db, $config, $phpEx, $phpbb_root_path;
 318   
 319          $module = array();
 320   
 321          // Grab module information using Bart's "neat-o-module" system (tm)
 322          $dir = @opendir('.');
 323   
 324          if (!$dir)
 325          {
 326              $this->error('Unable to access the installation directory', __LINE__, __FILE__);
 327          }
 328   
 329          $setmodules = 1;
 330          while (($file = readdir($dir)) !== false)
 331          {
 332              if (preg_match('#^install_(.*?)\.' . $phpEx . '$#', $file))
 333              {
 334                  include($file);
 335              }
 336          }
 337          closedir($dir);
 338   
 339          unset($setmodules);
 340   
 341          if (!sizeof($module))
 342          {
 343              $this->error('No installation modules found', __LINE__, __FILE__);
 344          }
 345   
 346          // Order to use and count further if modules get assigned to the same position or not having an order
 347          $max_module_order = 1000;
 348   
 349          foreach ($module as $row)
 350          {
 351              // Module order not specified or module already assigned at this position?
 352              if (!isset($row['module_order']) || isset($this->module_ary[$row['module_order']]))
 353              {
 354                  $row['module_order'] = $max_module_order;
 355                  $max_module_order++;
 356              }
 357   
 358              $this->module_ary[$row['module_order']]['name'] = $row['module_title'];
 359              $this->module_ary[$row['module_order']]['filename'] = $row['module_filename'];
 360              $this->module_ary[$row['module_order']]['subs'] = $row['module_subs'];
 361              $this->module_ary[$row['module_order']]['stages'] = $row['module_stages'];
 362   
 363              if (strtolower($selected_mod) == strtolower($row['module_title']))
 364              {
 365                  $this->id = (int) $row['module_order'];
 366                  $this->filename = (string) $row['module_filename'];
 367                  $this->module_url = (string) $module_url;
 368                  $this->mode = (string) $selected_mod;
 369                  // Check that the sub-mode specified is valid or set a default if not
 370                  if (is_array($row['module_subs']))
 371                  {
 372                      $this->sub = strtolower((in_array(strtoupper($selected_submod), $row['module_subs'])) ? $selected_submod : $row['module_subs'][0]);
 373                  }
 374                  else if (is_array($row['module_stages']))
 375                  {
 376                      $this->sub = strtolower((in_array(strtoupper($selected_submod), $row['module_stages'])) ? $selected_submod : $row['module_stages'][0]);
 377                  }
 378                  else
 379                  {
 380                      $this->sub = '';
 381                  }
 382              }
 383          } // END foreach
 384      } // END create
 385   
 386      /**
 387      * Load and run the relevant module if applicable
 388      */
 389      function load($mode = false, $run = true)
 390      {
 391          global $phpbb_root_path, $phpEx;
 392   
 393          if ($run)
 394          {
 395              if (!empty($mode))
 396              {
 397                  $this->mode = $mode;
 398              }
 399   
 400              $module = $this->filename;
 401              if (!class_exists($module))
 402              {
 403                  $this->error('Module "' . htmlspecialchars($module) . '" not accessible.', __LINE__, __FILE__);
 404              }
 405              $this->module = new $module($this);
 406   
 407              if (method_exists($this->module, 'main'))
 408              {
 409                  $this->module->main($this->mode, $this->sub);
 410              }
 411          }
 412      }
 413   
 414      /**
 415      * Output the standard page header
 416      */
 417      function page_header()
 418      {
 419          if (defined('HEADER_INC'))
 420          {
 421              return;
 422          }
 423   
 424          define('HEADER_INC', true);
 425          global $template, $lang, $stage, $phpbb_admin_path, $path;
 426   
 427          $template->assign_vars(array(
 428              'L_CHANGE'                => $lang['CHANGE'],
 429              'L_COLON'                => $lang['COLON'],
 430              'L_INSTALL_PANEL'        => $lang['INSTALL_PANEL'],
 431              'L_SELECT_LANG'            => $lang['SELECT_LANG'],
 432              'L_SKIP'                => $lang['SKIP'],
 433              'PAGE_TITLE'            => $this->get_page_title(),
 434              'T_IMAGE_PATH'            => htmlspecialchars($phpbb_admin_path) . 'images/',
 435              'T_JQUERY_LINK'            => $path . '/../../assets/javascript/jquery.min.js',
 436   
 437              'S_CONTENT_DIRECTION'     => $lang['DIRECTION'],
 438              'S_CONTENT_FLOW_BEGIN'    => ($lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
 439              'S_CONTENT_FLOW_END'    => ($lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
 440              'S_CONTENT_ENCODING'     => 'UTF-8',
 441   
 442              'S_USER_LANG'            => $lang['USER_LANG'],
 443              )
 444          );
 445   
 446          header('Content-type: text/html; charset=UTF-8');
 447          header('Cache-Control: private, no-cache="set-cookie"');
 448          header('Expires: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
 449   
 450          return;
 451      }
 452   
 453      /**
 454      * Output the standard page footer
 455      */
 456      function page_footer()
 457      {
 458          global $db, $template;
 459   
 460          $template->display('body');
 461   
 462          // Close our DB connection.
 463          if (!empty($db) && is_object($db))
 464          {
 465              $db->sql_close();
 466          }
 467   
 468          if (function_exists('exit_handler'))
 469          {
 470              exit_handler();
 471          }
 472      }
 473   
 474      /**
 475      * Returns desired template name
 476      */
 477      function get_tpl_name()
 478      {
 479          return $this->module->tpl_name . '.html';
 480      }
 481   
 482      /**
 483      * Returns the desired page title
 484      */
 485      function get_page_title()
 486      {
 487          global $lang;
 488   
 489          if (!isset($this->module->page_title))
 490          {
 491              return '';
 492          }
 493   
 494          return (isset($lang[$this->module->page_title])) ? $lang[$this->module->page_title] : $this->module->page_title;
 495      }
 496   
 497      /**
 498      * Generate an HTTP/1.1 header to redirect the user to another page
 499      * This is used during the installation when we do not have a database available to call the normal redirect function
 500      * @param string $page The page to redirect to relative to the installer root path
 501      */
 502      function redirect($page)
 503      {
 504          global $request;
 505   
 506          // HTTP_HOST is having the correct browser url in most cases...
 507          $server_name = strtolower(htmlspecialchars_decode($request->header('Host', $request->server('SERVER_NAME'))));
 508          $server_port = $request->server('SERVER_PORT', 0);
 509          $secure = $request->is_secure() ? 1 : 0;
 510   
 511          $script_name = htmlspecialchars_decode($request->server('PHP_SELF'));
 512          if (!$script_name)
 513          {
 514              $script_name = htmlspecialchars_decode($request->server('REQUEST_URI'));
 515          }
 516   
 517          // Replace backslashes and doubled slashes (could happen on some proxy setups)
 518          $script_name = str_replace(array('\\', '//'), '/', $script_name);
 519          $script_path = trim(dirname($script_name));
 520   
 521          $url = (($secure) ? 'https://' : 'http://') . $server_name;
 522   
 523          if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
 524          {
 525              // HTTP HOST can carry a port number...
 526              if (strpos($server_name, ':') === false)
 527              {
 528                  $url .= ':' . $server_port;
 529              }
 530          }
 531   
 532          $url .= $script_path . '/' . $page;
 533          header('Location: ' . $url);
 534          exit;
 535      }
 536   
 537      /**
 538      * Generate the navigation tabs
 539      */
 540      function generate_navigation()
 541      {
 542          global $lang, $template, $phpEx, $language;
 543   
 544          if (is_array($this->module_ary))
 545          {
 546              @ksort($this->module_ary);
 547              foreach ($this->module_ary as $cat_ary)
 548              {
 549                  $cat = $cat_ary['name'];
 550                  $l_cat = (!empty($lang['CAT_' . $cat])) ? $lang['CAT_' . $cat] : preg_replace('#_#', ' ', $cat);
 551                  $cat = strtolower($cat);
 552                  $url = $this->module_url . "?mode=$cat&amp;language=$language";
 553   
 554                  if ($this->mode == $cat)
 555                  {
 556                      $template->assign_block_vars('t_block1', array(
 557                          'L_TITLE'        => $l_cat,
 558                          'S_SELECTED'    => true,
 559                          'U_TITLE'        => $url,
 560                      ));
 561   
 562                      if (is_array($this->module_ary[$this->id]['subs']))
 563                      {
 564                          $subs = $this->module_ary[$this->id]['subs'];
 565                          foreach ($subs as $option)
 566                          {
 567                              $l_option = (!empty($lang['SUB_' . $option])) ? $lang['SUB_' . $option] : preg_replace('#_#', ' ', $option);
 568                              $option = strtolower($option);
 569                              $url = $this->module_url . '?mode=' . $this->mode . "&amp;sub=$option&amp;language=$language";
 570   
 571                              $template->assign_block_vars('l_block1', array(
 572                                  'L_TITLE'        => $l_option,
 573                                  'S_SELECTED'    => ($this->sub == $option),
 574                                  'U_TITLE'        => $url,
 575                              ));
 576                          }
 577                      }
 578   
 579                      if (is_array($this->module_ary[$this->id]['stages']))
 580                      {
 581                          $subs = $this->module_ary[$this->id]['stages'];
 582                          $matched = false;
 583                          foreach ($subs as $option)
 584                          {
 585                              $l_option = (!empty($lang['STAGE_' . $option])) ? $lang['STAGE_' . $option] : preg_replace('#_#', ' ', $option);
 586                              $option = strtolower($option);
 587                              $matched = ($this->sub == $option) ? true : $matched;
 588   
 589                              $template->assign_block_vars('l_block2', array(
 590                                  'L_TITLE'        => $l_option,
 591                                  'S_SELECTED'    => ($this->sub == $option),
 592                                  'S_COMPLETE'    => !$matched,
 593                              ));
 594                          }
 595                      }
 596                  }
 597                  else
 598                  {
 599                      $template->assign_block_vars('t_block1', array(
 600                          'L_TITLE'        => $l_cat,
 601                          'S_SELECTED'    => false,
 602                          'U_TITLE'        => $url,
 603                      ));
 604                  }
 605              }
 606          }
 607      }
 608   
 609      /**
 610      * Output an error message
 611      * If skip is true, return and continue execution, else exit
 612      */
 613      function error($error, $line, $file, $skip = false)
 614      {
 615          global $lang, $db, $template, $phpbb_admin_path;
 616   
 617          if ($skip)
 618          {
 619              $template->assign_block_vars('checks', array(
 620                  'S_LEGEND'    => true,
 621                  'LEGEND'    => $lang['INST_ERR'],
 622              ));
 623   
 624              $template->assign_block_vars('checks', array(
 625                  'TITLE'        => basename($file) . ' [ ' . $line . ' ]',
 626                  'RESULT'    => '<b style="color:red">' . $error . '</b>',
 627              ));
 628   
 629              return;
 630          }
 631   
 632          echo '<!DOCTYPE html>';
 633          echo '<html dir="ltr">';
 634          echo '<head>';
 635          echo '<meta charset="utf-8">';
 636          echo '<title>' . $lang['INST_ERR_FATAL'] . '</title>';
 637          echo '<link href="' . htmlspecialchars($phpbb_admin_path) . 'style/admin.css" rel="stylesheet" type="text/css" media="screen" />';
 638          echo '</head>';
 639          echo '<body id="errorpage">';
 640          echo '<div id="wrap">';
 641          echo '    <div id="page-header">';
 642          echo '    </div>';
 643          echo '    <div id="page-body">';
 644          echo '        <div id="acp">';
 645          echo '        <div class="panel">';
 646          echo '            <span class="corners-top"><span></span></span>';
 647          echo '            <div id="content">';
 648          echo '                <h1>' . $lang['INST_ERR_FATAL'] . '</h1>';
 649          echo '        <p>' . $lang['INST_ERR_FATAL'] . "</p>\n";
 650          echo '        <p>' . basename($file) . ' [ ' . $line . " ]</p>\n";
 651          echo '        <p><b>' . $error . "</b></p>\n";
 652          echo '            </div>';
 653          echo '            <span class="corners-bottom"><span></span></span>';
 654          echo '        </div>';
 655          echo '        </div>';
 656          echo '    </div>';
 657          echo '    <div id="page-footer">';
 658          echo '        Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited';
 659          echo '    </div>';
 660          echo '</div>';
 661          echo '</body>';
 662          echo '</html>';
 663   
 664          if (!empty($db) && is_object($db))
 665          {
 666              $db->sql_close();
 667          }
 668   
 669          exit_handler();
 670      }
 671   
 672      /**
 673      * Output an error message for a database related problem
 674      * If skip is true, return and continue execution, else exit
 675      */
 676      function db_error($error, $sql, $line, $file, $skip = false)
 677      {
 678          global $lang, $db, $template;
 679   
 680          if ($skip)
 681          {
 682              $template->assign_block_vars('checks', array(
 683                  'S_LEGEND'    => true,
 684                  'LEGEND'    => $lang['INST_ERR_FATAL'],
 685              ));
 686   
 687              $template->assign_block_vars('checks', array(
 688                  'TITLE'        => basename($file) . ' [ ' . $line . ' ]',
 689                  'RESULT'    => '<b style="color:red">' . $error . '</b><br />&#187; SQL:' . $sql,
 690              ));
 691   
 692              return;
 693          }
 694   
 695          $template->set_filenames(array(
 696              'body' => 'install_error.html')
 697          );
 698          $this->page_header();
 699          $this->generate_navigation();
 700   
 701          $template->assign_vars(array(
 702              'MESSAGE_TITLE'        => $lang['INST_ERR_FATAL_DB'],
 703              'MESSAGE_TEXT'        => '<p>' . basename($file) . ' [ ' . $line . ' ]</p><p>SQL : ' . $sql . '</p><p><b>' . $error . '</b></p>',
 704          ));
 705   
 706          // Rollback if in transaction
 707          if ($db->get_transaction())
 708          {
 709              $db->sql_transaction('rollback');
 710          }
 711   
 712          $this->page_footer();
 713      }
 714   
 715      /**
 716      * Generate the relevant HTML for an input field and the associated label and explanatory text
 717      */
 718      function input_field($name, $type, $value = '', $options = '')
 719      {
 720          global $lang;
 721          $tpl_type = explode(':', $type);
 722          $tpl = '';
 723   
 724          switch ($tpl_type[0])
 725          {
 726              case 'text':
 727              case 'password':
 728              // HTML5 text-like input types
 729              case 'color':
 730              case 'date':
 731              case 'time':
 732              case 'datetime':
 733              case 'datetime-local':
 734              case 'email':
 735              case 'month':
 736              case 'number':
 737              case 'range':
 738              case 'search':
 739              case 'tel':
 740              case 'url':
 741              case 'week':
 742   
 743                  $size = (int) $tpl_type[1];
 744                  $maxlength = (int) $tpl_type[2];
 745                  $autocomplete = (isset($options['autocomplete']) && $options['autocomplete'] == 'off') ? ' autocomplete="off"' : '';
 746   
 747                  $tpl = '<input id="' . $name . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '"' . $autocomplete . ' value="' . $value . '" />';
 748              break;
 749   
 750              case 'textarea':
 751                  $rows = (int) $tpl_type[1];
 752                  $cols = (int) $tpl_type[2];
 753   
 754                  $tpl = '<textarea id="' . $name . '" name="' . $name . '" rows="' . $rows . '" cols="' . $cols . '">' . $value . '</textarea>';
 755              break;
 756   
 757              case 'radio':
 758                  $key_yes    = ($value) ? ' checked="checked" id="' . $name . '"' : '';
 759                  $key_no        = (!$value) ? ' checked="checked" id="' . $name . '"' : '';
 760   
 761                  $tpl_type_cond = explode('_', $tpl_type[1]);
 762                  $type_no = ($tpl_type_cond[0] == 'disabled' || $tpl_type_cond[0] == 'enabled') ? false : true;
 763   
 764                  $tpl_no = '<label><input type="radio" name="' . $name . '" value="0"' . $key_no . ' class="radio" /> ' . (($type_no) ? $lang['NO'] : $lang['DISABLED']) . '</label>';
 765                  $tpl_yes = '<label><input type="radio" name="' . $name . '" value="1"' . $key_yes . ' class="radio" /> ' . (($type_no) ? $lang['YES'] : $lang['ENABLED']) . '</label>';
 766   
 767                  $tpl = ($tpl_type_cond[0] == 'yes' || $tpl_type_cond[0] == 'enabled') ? $tpl_yes . '&nbsp;&nbsp;' . $tpl_no : $tpl_no . '&nbsp;&nbsp;' . $tpl_yes;
 768              break;
 769   
 770              case 'select':
 771                  // @codingStandardsIgnoreStart
 772                  eval('$s_options = ' . str_replace('{VALUE}', $value, $options) . ';');
 773                  // @codingStandardsIgnoreEnd
 774                  $tpl = '<select id="' . $name . '" name="' . $name . '">' . $s_options . '</select>';
 775              break;
 776   
 777              case 'custom':
 778                  // @codingStandardsIgnoreStart
 779                  eval('$tpl = ' . str_replace('{VALUE}', $value, $options) . ';');
 780                  // @codingStandardsIgnoreEnd
 781              break;
 782   
 783              default:
 784              break;
 785          }
 786   
 787          return $tpl;
 788      }
 789   
 790      /**
 791      * Generate the drop down of available language packs
 792      */
 793      function inst_language_select($default = '')
 794      {
 795          global $phpbb_root_path, $phpEx;
 796   
 797          $dir = @opendir($phpbb_root_path . 'language');
 798   
 799          if (!$dir)
 800          {
 801              $this->error('Unable to access the language directory', __LINE__, __FILE__);
 802          }
 803   
 804          while ($file = readdir($dir))
 805          {
 806              $path = $phpbb_root_path . 'language/' . $file;
 807   
 808              if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS')
 809              {
 810                  continue;
 811              }
 812   
 813              if (file_exists($path . '/iso.txt'))
 814              {
 815                  list($displayname, $localname) = @file($path . '/iso.txt');
 816                  $lang[$localname] = $file;
 817              }
 818          }
 819          closedir($dir);
 820   
 821          @asort($lang);
 822          @reset($lang);
 823   
 824          $user_select = '';
 825          foreach ($lang as $displayname => $filename)
 826          {
 827              $selected = (strtolower($default) == strtolower($filename)) ? ' selected="selected"' : '';
 828              $user_select .= '<option value="' . $filename . '"' . $selected . '>' . ucwords($displayname) . '</option>';
 829          }
 830   
 831          return $user_select;
 832      }
 833  }
 834