Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

install_install.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 69.57 KiB


 0001  <?php
 0002  /**
 0003  *
 0004  * @package install
 0005  * @version $Id$
 0006  * @copyright (c) 2005 phpBB Group
 0007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 0008  *
 0009  */
 0010   
 0011  /**
 0012  */
 0013  if (!defined('IN_INSTALL'))
 0014  {
 0015      // Someone has tried to access the file direct. This is not a good idea, so exit
 0016      exit;
 0017  }
 0018   
 0019  if (!empty($setmodules))
 0020  {
 0021      // If phpBB is already installed we do not include this module
 0022      if (@file_exists($phpbb_root_path . 'config.' . $phpEx) && !file_exists($phpbb_root_path . 'cache/install_lock'))
 0023      {
 0024          include_once($phpbb_root_path . 'config.' . $phpEx);
 0025   
 0026          if (defined('PHPBB_INSTALLED'))
 0027          {
 0028              return;
 0029          }
 0030      }
 0031   
 0032      $module[] = array(
 0033          'module_type'        => 'install',
 0034          'module_title'        => 'INSTALL',
 0035          'module_filename'    => substr(basename(__FILE__), 0, -strlen($phpEx)-1),
 0036          'module_order'        => 10,
 0037          'module_subs'        => '',
 0038          'module_stages'        => array('INTRO', 'REQUIREMENTS', 'DATABASE', 'ADMINISTRATOR', 'CONFIG_FILE', 'ADVANCED', 'CREATE_TABLE', 'FINAL'),
 0039          'module_reqs'        => ''
 0040      );
 0041  }
 0042   
 0043  /**
 0044  * Installation
 0045  * @package install
 0046  */
 0047  class install_install extends module
 0048  {
 0049      function install_install(&$p_master)
 0050      {
 0051          $this->p_master = &$p_master;
 0052      }
 0053   
 0054      function main($mode, $sub)
 0055      {
 0056          global $lang, $template, $language, $phpbb_root_path;
 0057   
 0058          switch ($sub)
 0059          {
 0060              case 'intro':
 0061                  $this->page_title = $lang['SUB_INTRO'];
 0062   
 0063                  $template->assign_vars(array(
 0064                      'TITLE'            => $lang['INSTALL_INTRO'],
 0065                      'BODY'            => $lang['INSTALL_INTRO_BODY'],
 0066                      'L_SUBMIT'        => $lang['NEXT_STEP'],
 0067                      'S_LANG_SELECT'    => '<select id="language" name="language">' . $this->p_master->inst_language_select($language) . '</select>',
 0068                      'U_ACTION'        => $this->p_master->module_url . "?mode=$mode&amp;sub=requirements&amp;language=$language",
 0069                  ));
 0070   
 0071              break;
 0072   
 0073              case 'requirements':
 0074                  $this->check_server_requirements($mode, $sub);
 0075   
 0076              break;
 0077   
 0078              case 'database':
 0079                  $this->obtain_database_settings($mode, $sub);
 0080              
 0081              break;
 0082   
 0083              case 'administrator':
 0084                  $this->obtain_admin_settings($mode, $sub);
 0085   
 0086              break;
 0087   
 0088              case 'config_file':
 0089                  $this->create_config_file($mode, $sub);
 0090              
 0091              break;
 0092   
 0093              case 'advanced':
 0094                  $this->obtain_advanced_settings($mode, $sub);
 0095   
 0096              break;
 0097   
 0098              case 'create_table':
 0099                  $this->load_schema($mode, $sub);
 0100              break;
 0101   
 0102              case 'final':
 0103                  $this->build_search_index($mode, $sub);
 0104                  $this->add_modules($mode, $sub);
 0105                  $this->add_language($mode, $sub);
 0106                  $this->add_bots($mode, $sub);
 0107                  $this->email_admin($mode, $sub);
 0108                  
 0109                  // Remove the lock file
 0110                  @unlink($phpbb_root_path . 'cache/install_lock');
 0111   
 0112              break;
 0113          }
 0114   
 0115          $this->tpl_name = 'install_install';
 0116      }
 0117   
 0118      /**
 0119      * Checks that the server we are installing on meets the requirements for running phpBB
 0120      */
 0121      function check_server_requirements($mode, $sub)
 0122      {
 0123          global $lang, $template, $phpbb_root_path, $phpEx, $language;
 0124   
 0125          $this->page_title = $lang['STAGE_REQUIREMENTS'];
 0126   
 0127          $template->assign_vars(array(
 0128              'TITLE'        => $lang['REQUIREMENTS_TITLE'],
 0129              'BODY'        => $lang['REQUIREMENTS_EXPLAIN'],
 0130          ));
 0131   
 0132          $passed = array('php' => false, 'db' => false, 'files' => false, 'pcre' => false, 'imagesize' => false,);
 0133   
 0134          // Test for basic PHP settings
 0135          $template->assign_block_vars('checks', array(
 0136              'S_LEGEND'            => true,
 0137              'LEGEND'            => $lang['PHP_SETTINGS'],
 0138              'LEGEND_EXPLAIN'    => $lang['PHP_SETTINGS_EXPLAIN'],
 0139          ));
 0140   
 0141          // Test the minimum PHP version
 0142          $php_version = PHP_VERSION;
 0143   
 0144          if (version_compare($php_version, '4.3.3') < 0)
 0145          {
 0146              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0147          }
 0148          else
 0149          {
 0150              $passed['php'] = true;
 0151   
 0152              // We also give feedback on whether we're running in safe mode
 0153              $result = '<strong style="color:green">' . $lang['YES'];
 0154              if (@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'on')
 0155              {
 0156                  $result .= ', ' . $lang['PHP_SAFE_MODE'];
 0157              }
 0158              $result .= '</strong>';
 0159          }
 0160   
 0161          $template->assign_block_vars('checks', array(
 0162              'TITLE'            => $lang['PHP_VERSION_REQD'],
 0163              'RESULT'        => $result,
 0164   
 0165              'S_EXPLAIN'        => false,
 0166              'S_LEGEND'        => false,
 0167          ));
 0168   
 0169          // Check for register_globals being enabled
 0170          if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on')
 0171          {
 0172              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0173          }
 0174          else
 0175          {
 0176              $result = '<strong style="color:green">' . $lang['YES'] . '</strong>';
 0177          }
 0178   
 0179          $template->assign_block_vars('checks', array(
 0180              'TITLE'            => $lang['PHP_REGISTER_GLOBALS'],
 0181              'TITLE_EXPLAIN'    => $lang['PHP_REGISTER_GLOBALS_EXPLAIN'],
 0182              'RESULT'        => $result,
 0183   
 0184              'S_EXPLAIN'        => true,
 0185              'S_LEGEND'        => false,
 0186          ));
 0187          
 0188          
 0189          // Check for url_fopen
 0190          if (@ini_get('allow_url_fopen') == '1' || strtolower(@ini_get('allow_url_fopen')) == 'on')
 0191          {
 0192              $result = '<strong style="color:green">' . $lang['YES'] . '</strong>';
 0193          }
 0194          else
 0195          {
 0196              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0197          }
 0198   
 0199          $template->assign_block_vars('checks', array(
 0200              'TITLE'            => $lang['PHP_URL_FOPEN_SUPPORT'],
 0201              'TITLE_EXPLAIN'    => $lang['PHP_URL_FOPEN_SUPPORT_EXPLAIN'],
 0202              'RESULT'        => $result,
 0203   
 0204              'S_EXPLAIN'        => true,
 0205              'S_LEGEND'        => false,
 0206          ));
 0207          
 0208          
 0209          // Check for getimagesize
 0210          if (@function_exists('getimagesize'))
 0211          {
 0212              $passed['imagesize'] = true;
 0213              $result = '<strong style="color:green">' . $lang['YES'] . '</strong>';
 0214          }
 0215          else
 0216          {
 0217              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0218          }
 0219   
 0220          $template->assign_block_vars('checks', array(
 0221              'TITLE'            => $lang['PHP_GETIMAGESIZE_SUPPORT'],
 0222              'TITLE_EXPLAIN'    => $lang['PHP_GETIMAGESIZE_SUPPORT_EXPLAIN'],
 0223              'RESULT'        => $result,
 0224   
 0225              'S_EXPLAIN'        => true,
 0226              'S_LEGEND'        => false,
 0227          ));
 0228   
 0229          // Check for PCRE UTF-8 support
 0230          if (@preg_match('//u', ''))
 0231          {
 0232              $passed['pcre'] = true;
 0233              $result = '<strong style="color:green">' . $lang['YES'] . '</strong>';
 0234          }
 0235          else
 0236          {
 0237              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0238          }
 0239   
 0240          $template->assign_block_vars('checks', array(
 0241              'TITLE'            => $lang['PCRE_UTF_SUPPORT'],
 0242              'TITLE_EXPLAIN'    => $lang['PCRE_UTF_SUPPORT_EXPLAIN'],
 0243              'RESULT'        => $result,
 0244   
 0245              'S_EXPLAIN'        => true,
 0246              'S_LEGEND'        => false,
 0247          ));
 0248   
 0249  /**
 0250  *        Better not enabling and adding to the loaded extensions due to the specific requirements needed
 0251          if (!@extension_loaded('mbstring'))
 0252          {
 0253              can_load_dll('mbstring');
 0254          }
 0255  */
 0256   
 0257          $passed['mbstring'] = true;
 0258          if (@extension_loaded('mbstring'))
 0259          {
 0260              // Test for available database modules
 0261              $template->assign_block_vars('checks', array(
 0262                  'S_LEGEND'            => true,
 0263                  'LEGEND'            => $lang['MBSTRING_CHECK'],
 0264                  'LEGEND_EXPLAIN'    => $lang['MBSTRING_CHECK_EXPLAIN'],
 0265              ));
 0266   
 0267              $checks = array(
 0268                  array('func_overload', '&', MB_OVERLOAD_MAIL|MB_OVERLOAD_STRING),
 0269                  array('encoding_translation', '!=', 0),
 0270                  array('http_input', '!=', 'pass'),
 0271                  array('http_output', '!=', 'pass')
 0272              );
 0273   
 0274              foreach ($checks as $mb_checks)
 0275              {
 0276                  $ini_val = @ini_get('mbstring.' . $mb_checks[0]);
 0277                  switch ($mb_checks[1])
 0278                  {
 0279                      case '&':
 0280                          if (intval($ini_val) & $mb_checks[2])
 0281                          {
 0282                              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0283                              $passed['mbstring'] = false;
 0284                          }
 0285                          else
 0286                          {
 0287                              $result = '<strong style="color:green">' . $lang['YES'] . '</strong>';
 0288                          }
 0289                      break;
 0290   
 0291                      case '!=':
 0292                          if ($ini_val != $mb_checks[2])
 0293                          {
 0294                              $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
 0295                              $passed['mbstring'] = false;
 0296                          }
 0297                          else
 0298                          {
 0299                              $result = '<strong style="color:green">' . $lang['YES'] . '</strong>';
 0300                          }
 0301                      break;
 0302                  }
 0303                  $template->assign_block_vars('checks', array(
 0304                      'TITLE'            => $lang['MBSTRING_' . strtoupper($mb_checks[0])],
 0305                      'TITLE_EXPLAIN'    => $lang['MBSTRING_' . strtoupper($mb_checks[0]) . '_EXPLAIN'],
 0306                      'RESULT'        => $result,
 0307   
 0308                      'S_EXPLAIN'        => true,
 0309                      'S_LEGEND'        => false,
 0310                  ));
 0311              }
 0312          }
 0313   
 0314          // Test for available database modules
 0315          $template->assign_block_vars('checks', array(
 0316              'S_LEGEND'            => true,
 0317              'LEGEND'            => $lang['PHP_SUPPORTED_DB'],
 0318              'LEGEND_EXPLAIN'    => $lang['PHP_SUPPORTED_DB_EXPLAIN'],
 0319          ));
 0320   
 0321          $available_dbms = get_available_dbms(false, true);
 0322          $passed['db'] = $available_dbms['ANY_DB_SUPPORT'];
 0323          unset($available_dbms['ANY_DB_SUPPORT']);
 0324   
 0325          foreach ($available_dbms as $db_name => $db_ary)
 0326          {
 0327              if (!$db_ary['AVAILABLE'])
 0328              {
 0329                  $template->assign_block_vars('checks', array(
 0330                      'TITLE'        => $lang['DLL_' . strtoupper($db_name)],
 0331                      'RESULT'    => '<span style="color:red">' . $lang['UNAVAILABLE'] . '</span>',
 0332   
 0333                      'S_EXPLAIN'    => false,
 0334                      'S_LEGEND'    => false,
 0335                  ));
 0336              }
 0337              else
 0338              {
 0339                  $template->assign_block_vars('checks', array(
 0340                      'TITLE'        => $lang['DLL_' . strtoupper($db_name)],
 0341                      'RESULT'    => '<strong style="color:green">' . $lang['AVAILABLE'] . '</strong>',
 0342   
 0343                      'S_EXPLAIN'    => false,
 0344                      'S_LEGEND'    => false,
 0345                  ));
 0346              }
 0347          }
 0348   
 0349          // Test for other modules
 0350          $template->assign_block_vars('checks', array(
 0351              'S_LEGEND'            => true,
 0352              'LEGEND'            => $lang['PHP_OPTIONAL_MODULE'],
 0353              'LEGEND_EXPLAIN'    => $lang['PHP_OPTIONAL_MODULE_EXPLAIN'],
 0354          ));
 0355   
 0356          foreach ($this->php_dlls_other as $dll)
 0357          {
 0358              if (!@extension_loaded($dll))
 0359              {
 0360                  if (!can_load_dll($dll))
 0361                  {
 0362                      $template->assign_block_vars('checks', array(
 0363                          'TITLE'        => $lang['DLL_' . strtoupper($dll)],
 0364                          'RESULT'    => '<strong style="color:red">' . $lang['UNAVAILABLE'] . '</strong>',
 0365   
 0366                          'S_EXPLAIN'    => false,
 0367                          'S_LEGEND'    => false,
 0368                      ));
 0369                      continue;
 0370                  }
 0371              }
 0372   
 0373              $template->assign_block_vars('checks', array(
 0374                  'TITLE'        => $lang['DLL_' . strtoupper($dll)],
 0375                  'RESULT'    => '<strong style="color:green">' . $lang['AVAILABLE'] . '</strong>',
 0376   
 0377                  'S_EXPLAIN'    => false,
 0378                  'S_LEGEND'    => false,
 0379              ));
 0380          }
 0381   
 0382          // Can we find Imagemagick anywhere on the system?
 0383          $exe = (DIRECTORY_SEPARATOR == '\\') ? '.exe' : '';
 0384   
 0385          $magic_home = getenv('MAGICK_HOME');
 0386          $img_imagick = '';
 0387          if (empty($magic_home))
 0388          {
 0389              $locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/');
 0390              $path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH'))));
 0391   
 0392              $locations = array_merge($path_locations, $locations);
 0393              foreach ($locations as $location)
 0394              {
 0395                  // The path might not end properly, fudge it
 0396                  if (substr($location, -1, 1) !== '/')
 0397                  {
 0398                      $location .= '/';
 0399                  }
 0400   
 0401                  if (@is_readable($location . 'mogrify' . $exe) && @filesize($location . 'mogrify' . $exe) > 3000)
 0402                  {
 0403                      $img_imagick = str_replace('\\', '/', $location);
 0404                      continue;
 0405                  }
 0406              }
 0407          }
 0408          else
 0409          {
 0410              $img_imagick = str_replace('\\', '/', $magic_home);
 0411          }
 0412   
 0413          $template->assign_block_vars('checks', array(
 0414              'TITLE'        => $lang['APP_MAGICK'],
 0415              'RESULT'    => ($img_imagick) ? '<strong style="color:green">' . $lang['AVAILABLE'] . ', ' . $img_imagick . '</strong>' : '<strong style="color:blue">' . $lang['NO_LOCATION'] . '</strong>',
 0416   
 0417              'S_EXPLAIN'    => false,
 0418              'S_LEGEND'    => false,
 0419          ));
 0420   
 0421          // Check permissions on files/directories we need access to
 0422          $template->assign_block_vars('checks', array(
 0423              'S_LEGEND'            => true,
 0424              'LEGEND'            => $lang['FILES_REQUIRED'],
 0425              'LEGEND_EXPLAIN'    => $lang['FILES_REQUIRED_EXPLAIN'],
 0426          ));
 0427   
 0428          $directories = array('cache/', 'files/', 'store/');
 0429   
 0430          umask(0);
 0431   
 0432          $passed['files'] = true;
 0433          foreach ($directories as $dir)
 0434          {
 0435              $exists = $write = false;
 0436   
 0437              // Try to create the directory if it does not exist
 0438              if (!file_exists($phpbb_root_path . $dir))
 0439              {
 0440                  @mkdir($phpbb_root_path . $dir, 0777);
 0441                  @chmod($phpbb_root_path . $dir, 0777);
 0442              }
 0443   
 0444              // Now really check
 0445              if (file_exists($phpbb_root_path . $dir) && is_dir($phpbb_root_path . $dir))
 0446              {
 0447                  if (!@is_writable($phpbb_root_path . $dir))
 0448                  {
 0449                      @chmod($phpbb_root_path . $dir, 0777);
 0450                  }
 0451                  $exists = true;
 0452              }
 0453   
 0454              // Now check if it is writable by storing a simple file
 0455              $fp = @fopen($phpbb_root_path . $dir . 'test_lock', 'wb');
 0456              if ($fp !== false)
 0457              {
 0458                  $write = true;
 0459              }
 0460              @fclose($fp);
 0461   
 0462              @unlink($phpbb_root_path . $dir . 'test_lock');
 0463   
 0464              $passed['files'] = ($exists && $write && $passed['files']) ? true : false;
 0465   
 0466              $exists = ($exists) ? '<strong style="color:green">' . $lang['FOUND'] . '</strong>' : '<strong style="color:red">' . $lang['NOT_FOUND'] . '</strong>';
 0467              $write = ($write) ? ', <strong style="color:green">' . $lang['WRITABLE'] . '</strong>' : (($exists) ? ', <strong style="color:red">' . $lang['UNWRITABLE'] . '</strong>' : '');
 0468   
 0469              $template->assign_block_vars('checks', array(
 0470                  'TITLE'        => $dir,
 0471                  'RESULT'    => $exists . $write,
 0472   
 0473                  'S_EXPLAIN'    => false,
 0474                  'S_LEGEND'    => false,
 0475              ));
 0476          }
 0477   
 0478          // Check permissions on files/directories it would be useful access to
 0479          $template->assign_block_vars('checks', array(
 0480              'S_LEGEND'            => true,
 0481              'LEGEND'            => $lang['FILES_OPTIONAL'],
 0482              'LEGEND_EXPLAIN'    => $lang['FILES_OPTIONAL_EXPLAIN'],
 0483          ));
 0484   
 0485          $directories = array('config.' . $phpEx, 'images/avatars/upload/');
 0486   
 0487          foreach ($directories as $dir)
 0488          {
 0489              $write = $exists = true;
 0490              if (file_exists($phpbb_root_path . $dir))
 0491              {
 0492                  if (!@is_writable($phpbb_root_path . $dir))
 0493                  {
 0494                      $write = false;
 0495                  }
 0496              }
 0497              else
 0498              {
 0499                  $write = $exists = false;
 0500              }
 0501   
 0502              $exists_str = ($exists) ? '<strong style="color:green">' . $lang['FOUND'] . '</strong>' : '<strong style="color:red">' . $lang['NOT_FOUND'] . '</strong>';
 0503              $write_str = ($write) ? ', <strong style="color:green">' . $lang['WRITABLE'] . '</strong>' : (($exists) ? ', <strong style="color:red">' . $lang['UNWRITABLE'] . '</strong>' : '');
 0504   
 0505              $template->assign_block_vars('checks', array(
 0506                  'TITLE'        => $dir,
 0507                  'RESULT'    => $exists_str . $write_str,
 0508   
 0509                  'S_EXPLAIN'    => false,
 0510                  'S_LEGEND'    => false,
 0511              ));
 0512          }
 0513   
 0514          // And finally where do we want to go next (well today is taken isn't it :P)
 0515          $s_hidden_fields = ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
 0516   
 0517          $url = (!in_array(false, $passed)) ? $this->p_master->module_url . "?mode=$mode&amp;sub=database&amp;language=$language" : $this->p_master->module_url . "?mode=$mode&amp;sub=requirements&amp;language=$language    ";
 0518          $submit = (!in_array(false, $passed)) ? $lang['INSTALL_START'] : $lang['INSTALL_TEST'];
 0519   
 0520   
 0521          $template->assign_vars(array(
 0522              'L_SUBMIT'    => $submit,
 0523              'S_HIDDEN'    => $s_hidden_fields,
 0524              'U_ACTION'    => $url,
 0525          ));
 0526      }
 0527   
 0528      /**
 0529      * Obtain the information required to connect to the database
 0530      */
 0531      function obtain_database_settings($mode, $sub)
 0532      {
 0533          global $lang, $template, $phpEx;
 0534   
 0535          $this->page_title = $lang['STAGE_DATABASE'];
 0536   
 0537          // Obtain any submitted data
 0538          $data = $this->get_submitted_data();
 0539   
 0540          $connect_test = false;
 0541          $error = array();
 0542          $available_dbms = get_available_dbms(false, true);
 0543   
 0544          // Has the user opted to test the connection?
 0545          if (isset($_POST['testdb']))
 0546          {
 0547              if (!isset($available_dbms[$data['dbms']]) || !$available_dbms[$data['dbms']]['AVAILABLE'])
 0548              {
 0549                  $error['db'][] = $lang['INST_ERR_NO_DB'];
 0550                  $connect_test = false;
 0551              }
 0552              else
 0553              {
 0554                  $connect_test = connect_check_db(true, $error, $available_dbms[$data['dbms']], $data['table_prefix'], $data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport']);
 0555              }
 0556   
 0557              $template->assign_block_vars('checks', array(
 0558                  'S_LEGEND'            => true,
 0559                  'LEGEND'            => $lang['DB_CONNECTION'],
 0560                  'LEGEND_EXPLAIN'    => false,
 0561              ));
 0562   
 0563              if ($connect_test)
 0564              {
 0565                  $template->assign_block_vars('checks', array(
 0566                      'TITLE'        => $lang['DB_TEST'],
 0567                      'RESULT'    => '<strong style="color:green">' . $lang['SUCCESSFUL_CONNECT'] . '</strong>',
 0568   
 0569                      'S_EXPLAIN'    => false,
 0570                      'S_LEGEND'    => false,
 0571                  ));
 0572              }
 0573              else
 0574              {
 0575                  $template->assign_block_vars('checks', array(
 0576                      'TITLE'        => $lang['DB_TEST'],
 0577                      'RESULT'    => '<strong style="color:red">' . implode('<br />', $error) . '</strong>',
 0578   
 0579                      'S_EXPLAIN'    => false,
 0580                      'S_LEGEND'    => false,
 0581                  ));
 0582              }
 0583          }
 0584   
 0585          if (!$connect_test)
 0586          {
 0587              // Update the list of available DBMS modules to only contain those which can be used
 0588              $available_dbms_temp = array();
 0589              foreach ($available_dbms as $type => $dbms_ary)
 0590              {
 0591                  if (!$dbms_ary['AVAILABLE'])
 0592                  {
 0593                      continue;
 0594                  }
 0595   
 0596                  $available_dbms_temp[$type] = $dbms_ary;
 0597              }
 0598   
 0599              $available_dbms = &$available_dbms_temp;
 0600   
 0601              // And now for the main part of this page
 0602              $data['table_prefix'] = (!empty($data['table_prefix']) ? $data['table_prefix'] : 'phpbb_');
 0603   
 0604              foreach ($this->db_config_options as $config_key => $vars)
 0605              {
 0606                  if (!is_array($vars) && strpos($config_key, 'legend') === false)
 0607                  {
 0608                      continue;
 0609                  }
 0610   
 0611                  if (strpos($config_key, 'legend') !== false)
 0612                  {
 0613                      $template->assign_block_vars('options', array(
 0614                          'S_LEGEND'        => true,
 0615                          'LEGEND'        => $lang[$vars])
 0616                      );
 0617   
 0618                      continue;
 0619                  }
 0620   
 0621                  $options = isset($vars['options']) ? $vars['options'] : '';
 0622   
 0623                  $template->assign_block_vars('options', array(
 0624                      'KEY'            => $config_key,
 0625                      'TITLE'            => $lang[$vars['lang']],
 0626                      'S_EXPLAIN'        => $vars['explain'],
 0627                      'S_LEGEND'        => false,
 0628                      'TITLE_EXPLAIN'    => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '',
 0629                      'CONTENT'        => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options),
 0630                      )
 0631                  );
 0632              }
 0633          }
 0634   
 0635          // And finally where do we want to go next (well today is taken isn't it :P)
 0636          $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
 0637          $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
 0638          if ($connect_test)
 0639          {
 0640              foreach ($this->db_config_options as $config_key => $vars)
 0641              {
 0642                  if (!is_array($vars))
 0643                  {
 0644                      continue;
 0645                  }
 0646                  $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
 0647              }
 0648          }
 0649   
 0650          $url = ($connect_test) ? $this->p_master->module_url . "?mode=$mode&amp;sub=administrator" : $this->p_master->module_url . "?mode=$mode&amp;sub=database";
 0651          $s_hidden_fields .= ($connect_test) ? '' : '<input type="hidden" name="testdb" value="true" />';
 0652   
 0653          $submit = $lang['NEXT_STEP'];
 0654   
 0655          $template->assign_vars(array(
 0656              'L_SUBMIT'    => $submit,
 0657              'S_HIDDEN'    => $s_hidden_fields,
 0658              'U_ACTION'    => $url,
 0659          ));
 0660      }
 0661   
 0662      /**
 0663      * Obtain the administrator's name, password and email address
 0664      */
 0665      function obtain_admin_settings($mode, $sub)
 0666      {
 0667          global $lang, $template, $phpEx;
 0668   
 0669          $this->page_title = $lang['STAGE_ADMINISTRATOR'];
 0670   
 0671          // Obtain any submitted data
 0672          $data = $this->get_submitted_data();
 0673   
 0674          if ($data['dbms'] == '')
 0675          {
 0676              // Someone's been silly and tried calling this page direct
 0677              // So we send them back to the start to do it again properly
 0678              $this->p_master->redirect("index.$phpEx?mode=install");
 0679          }
 0680   
 0681          $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
 0682          $passed = false;
 0683   
 0684          $data['default_lang'] = ($data['default_lang'] !== '') ? $data['default_lang'] : $data['language'];
 0685   
 0686          if (isset($_POST['check']))
 0687          {
 0688              $error = array();
 0689   
 0690              // Check the entered email address and password
 0691              if ($data['admin_name'] == '' || $data['admin_pass1'] == '' || $data['admin_pass2'] == '' || $data['board_email1'] == '' || $data['board_email2'] == '')
 0692              {
 0693                  $error[] = $lang['INST_ERR_MISSING_DATA'];
 0694              }
 0695   
 0696              if ($data['admin_pass1'] != $data['admin_pass2'] && $data['admin_pass1'] != '')
 0697              {
 0698                  $error[] = $lang['INST_ERR_PASSWORD_MISMATCH'];
 0699              }
 0700   
 0701              // Test against the default username rules
 0702              if ($data['admin_name'] != '' && utf8_strlen($data['admin_name']) < 3)
 0703              {
 0704                  $error[] = $lang['INST_ERR_USER_TOO_SHORT'];
 0705              }
 0706   
 0707              if ($data['admin_name'] != '' && utf8_strlen($data['admin_name']) > 20)
 0708              {
 0709                  $error[] = $lang['INST_ERR_USER_TOO_LONG'];
 0710              }
 0711   
 0712              // Test against the default password rules
 0713              if ($data['admin_pass1'] != '' && utf8_strlen($data['admin_pass1']) < 6)
 0714              {
 0715                  $error[] = $lang['INST_ERR_PASSWORD_TOO_SHORT'];
 0716              }
 0717   
 0718              if ($data['admin_pass1'] != '' && utf8_strlen($data['admin_pass1']) > 30)
 0719              {
 0720                  $error[] = $lang['INST_ERR_PASSWORD_TOO_LONG'];
 0721              }
 0722   
 0723              if ($data['board_email1'] != $data['board_email2'] && $data['board_email1'] != '')
 0724              {
 0725                  $error[] = $lang['INST_ERR_EMAIL_MISMATCH'];
 0726              }
 0727   
 0728              if ($data['board_email1'] != '' && !preg_match('/^' . get_preg_expression('email') . '$/i', $data['board_email1']))
 0729              {
 0730                  $error[] = $lang['INST_ERR_EMAIL_INVALID'];
 0731              }
 0732   
 0733              $template->assign_block_vars('checks', array(
 0734                  'S_LEGEND'            => true,
 0735                  'LEGEND'            => $lang['STAGE_ADMINISTRATOR'],
 0736                  'LEGEND_EXPLAIN'    => false,
 0737              ));
 0738   
 0739              if (!sizeof($error))
 0740              {
 0741                  $passed = true;
 0742                  $template->assign_block_vars('checks', array(
 0743                      'TITLE'        => $lang['ADMIN_TEST'],
 0744                      'RESULT'    => '<strong style="color:green">' . $lang['TESTS_PASSED'] . '</strong>',
 0745   
 0746                      'S_EXPLAIN'    => false,
 0747                      'S_LEGEND'    => false,
 0748                  ));
 0749              }
 0750              else
 0751              {
 0752                  $template->assign_block_vars('checks', array(
 0753                      'TITLE'        => $lang['ADMIN_TEST'],
 0754                      'RESULT'    => '<strong style="color:red">' . implode('<br />', $error) . '</strong>',
 0755   
 0756                      'S_EXPLAIN'    => false,
 0757                      'S_LEGEND'    => false,
 0758                  ));
 0759              }
 0760          }
 0761   
 0762          if (!$passed)
 0763          {
 0764              foreach ($this->admin_config_options as $config_key => $vars)
 0765              {
 0766                  if (!is_array($vars) && strpos($config_key, 'legend') === false)
 0767                  {
 0768                      continue;
 0769                  }
 0770   
 0771                  if (strpos($config_key, 'legend') !== false)
 0772                  {
 0773                      $template->assign_block_vars('options', array(
 0774                          'S_LEGEND'        => true,
 0775                          'LEGEND'        => $lang[$vars])
 0776                      );
 0777   
 0778                      continue;
 0779                  }
 0780   
 0781                  $options = isset($vars['options']) ? $vars['options'] : '';
 0782   
 0783                  $template->assign_block_vars('options', array(
 0784                      'KEY'            => $config_key,
 0785                      'TITLE'            => $lang[$vars['lang']],
 0786                      'S_EXPLAIN'        => $vars['explain'],
 0787                      'S_LEGEND'        => false,
 0788                      'TITLE_EXPLAIN'    => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '',
 0789                      'CONTENT'        => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options),
 0790                      )
 0791                  );
 0792              }
 0793          }
 0794          else
 0795          {
 0796              foreach ($this->admin_config_options as $config_key => $vars)
 0797              {
 0798                  if (!is_array($vars))
 0799                  {
 0800                      continue;
 0801                  }
 0802                  $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
 0803              }
 0804          }
 0805          
 0806          $s_hidden_fields .= ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
 0807          $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
 0808   
 0809          foreach ($this->db_config_options as $config_key => $vars)
 0810          {
 0811              if (!is_array($vars))
 0812              {
 0813                  continue;
 0814              }
 0815              $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
 0816          }
 0817   
 0818          $submit = $lang['NEXT_STEP'];
 0819   
 0820          $url = ($passed) ? $this->p_master->module_url . "?mode=$mode&amp;sub=config_file" : $this->p_master->module_url . "?mode=$mode&amp;sub=administrator";
 0821          $s_hidden_fields .= ($passed) ? '' : '<input type="hidden" name="check" value="true" />';
 0822   
 0823          $template->assign_vars(array(
 0824              'L_SUBMIT'    => $submit,
 0825              'S_HIDDEN'    => $s_hidden_fields,
 0826              'U_ACTION'    => $url,
 0827          ));
 0828      }
 0829   
 0830      /**
 0831      * Writes the config file to disk, or if unable to do so offers alternative methods
 0832      */
 0833      function create_config_file($mode, $sub)
 0834      {
 0835          global $lang, $template, $phpbb_root_path, $phpEx;
 0836   
 0837          $this->page_title = $lang['STAGE_CONFIG_FILE'];
 0838   
 0839          // Obtain any submitted data
 0840          $data = $this->get_submitted_data();
 0841   
 0842          if ($data['dbms'] == '')
 0843          {
 0844              // Someone's been silly and tried calling this page direct
 0845              // So we send them back to the start to do it again properly
 0846              $this->p_master->redirect("index.$phpEx?mode=install");
 0847          }
 0848   
 0849          $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
 0850          $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
 0851          $written = false;
 0852   
 0853          // Create a list of any PHP modules we wish to have loaded
 0854          $load_extensions = array();
 0855          $available_dbms = get_available_dbms($data['dbms']);
 0856          $check_exts = array_merge(array($available_dbms[$data['dbms']]['MODULE']), $this->php_dlls_other);
 0857   
 0858          foreach ($check_exts as $dll)
 0859          {
 0860              if (!@extension_loaded($dll))
 0861              {
 0862                  if (!can_load_dll($dll))
 0863                  {
 0864                      continue;
 0865                  }
 0866   
 0867                  $load_extensions[] = $dll . '.' . PHP_SHLIB_SUFFIX;
 0868              }
 0869          }
 0870   
 0871          // Create a lock file to indicate that there is an install in progress
 0872          $fp = @fopen($phpbb_root_path . 'cache/install_lock', 'wb');
 0873          if ($fp === false)
 0874          {
 0875              // We were unable to create the lock file - abort
 0876              $this->p_master->error($lang['UNABLE_WRITE_LOCK'], __LINE__, __FILE__);
 0877          }
 0878          @fclose($fp);
 0879   
 0880          @chmod($phpbb_root_path . 'cache/install_lock', 0666);
 0881   
 0882          $load_extensions = implode(',', $load_extensions);
 0883   
 0884          // Time to convert the data provided into a config file
 0885          $config_data = "<?php\n";
 0886          $config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n";
 0887          $config_data .= "\$dbms = '" . $available_dbms[$data['dbms']]['DRIVER'] . "';\n";
 0888          $config_data .= "\$dbhost = '{$data['dbhost']}';\n";
 0889          $config_data .= "\$dbport = '{$data['dbport']}';\n";
 0890          $config_data .= "\$dbname = '{$data['dbname']}';\n";
 0891          $config_data .= "\$dbuser = '{$data['dbuser']}';\n";
 0892          $config_data .= "\$dbpasswd = '{$data['dbpasswd']}';\n\n";
 0893          $config_data .= "\$table_prefix = '{$data['table_prefix']}';\n";
 0894  //        $config_data .= "\$acm_type = '" . (($acm_type) ? $acm_type : 'file') . "';\n";
 0895          $config_data .= "\$acm_type = 'file';\n";
 0896          $config_data .= "\$load_extensions = '$load_extensions';\n\n";
 0897          $config_data .= "@define('PHPBB_INSTALLED', true);\n";
 0898          $config_data .= "// @define('DEBUG', true);\n";
 0899          $config_data .= "// @define('DEBUG_EXTRA', true);\n";
 0900          $config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused!
 0901      
 0902          // Attempt to write out the config file directly. If it works, this is the easiest way to do it ...
 0903          if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && is_writable($phpbb_root_path . 'config.' . $phpEx)) || is_writable($phpbb_root_path))
 0904          {
 0905              // Assume it will work ... if nothing goes wrong below
 0906              $written = true;
 0907   
 0908              if (!($fp = @fopen($phpbb_root_path . 'config.' . $phpEx, 'w')))
 0909              {
 0910                  // Something went wrong ... so let's try another method
 0911                  $written = false;
 0912              }
 0913   
 0914              if (!(@fwrite($fp, $config_data)))
 0915              {
 0916                  // Something went wrong ... so let's try another method
 0917                  $written = false;
 0918              }
 0919   
 0920              @fclose($fp);
 0921   
 0922              if ($written)
 0923              {
 0924                  @chmod($phpbb_root_path . 'config.' . $phpEx, 0644);
 0925              }
 0926          }
 0927   
 0928          if (isset($_POST['dldone']))
 0929          {
 0930              // Do a basic check to make sure that the file has been uploaded
 0931              // Note that all we check is that the file has _something_ in it
 0932              // We don't compare the contents exactly - if they can't upload
 0933              // a single file correctly, it's likely they will have other problems....
 0934              if (filesize($phpbb_root_path . 'config.' . $phpEx) > 10)
 0935              {
 0936                  $written = true;
 0937              }
 0938          }
 0939   
 0940          $config_options = array_merge($this->db_config_options, $this->admin_config_options);
 0941   
 0942          foreach ($config_options as $config_key => $vars)
 0943          {
 0944              if (!is_array($vars))
 0945              {
 0946                  continue;
 0947              }
 0948              $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
 0949          }
 0950   
 0951          if (!$written)
 0952          {
 0953              // OK, so it didn't work let's try the alternatives
 0954   
 0955              if (isset($_POST['dlconfig']))
 0956              {
 0957                  // They want a copy of the file to download, so send the relevant headers and dump out the data
 0958                  header("Content-Type: text/x-delimtext; name=\"config.$phpEx\"");
 0959                  header("Content-disposition: attachment; filename=config.$phpEx");
 0960                  echo $config_data;
 0961                  exit;
 0962              }
 0963   
 0964              // The option to download the config file is always available, so output it here
 0965              $template->assign_vars(array(
 0966                  'BODY'                    => $lang['CONFIG_FILE_UNABLE_WRITE'],
 0967                  'L_DL_CONFIG'            => $lang['DL_CONFIG'],
 0968                  'L_DL_CONFIG_EXPLAIN'    => $lang['DL_CONFIG_EXPLAIN'],
 0969                  'L_DL_DONE'                => $lang['DONE'],
 0970                  'L_DL_DOWNLOAD'            => $lang['DL_DOWNLOAD'],
 0971                  'S_HIDDEN'                => $s_hidden_fields,
 0972                  'S_SHOW_DOWNLOAD'        => true,
 0973                  'U_ACTION'                => $this->p_master->module_url . "?mode=$mode&amp;sub=config_file",
 0974              ));
 0975              return;
 0976          }
 0977          else
 0978          {
 0979              $template->assign_vars(array(
 0980                  'BODY'        => $lang['CONFIG_FILE_WRITTEN'],
 0981                  'L_SUBMIT'    => $lang['NEXT_STEP'],
 0982                  'S_HIDDEN'    => $s_hidden_fields,
 0983                  'U_ACTION'    => $this->p_master->module_url . "?mode=$mode&amp;sub=advanced",
 0984              ));
 0985              return;
 0986          }
 0987      }
 0988   
 0989      /**
 0990      * Provide an opportunity to customise some advanced settings during the install
 0991      * in case it is necessary for them to be set to access later
 0992      */
 0993      function obtain_advanced_settings($mode, $sub)
 0994      {
 0995          global $lang, $template, $phpEx;
 0996   
 0997          $this->page_title = $lang['STAGE_ADVANCED'];
 0998   
 0999          // Obtain any submitted data
 1000          $data = $this->get_submitted_data();
 1001   
 1002          if ($data['dbms'] == '')
 1003          {
 1004              // Someone's been silly and tried calling this page direct
 1005              // So we send them back to the start to do it again properly
 1006              $this->p_master->redirect("index.$phpEx?mode=install");
 1007          }
 1008   
 1009          $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
 1010          $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
 1011   
 1012          $data['email_enable'] = ($data['email_enable'] !== '') ? $data['email_enable'] : true;
 1013          $data['server_name'] = ($data['server_name'] !== '') ? $data['server_name'] : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
 1014          $data['server_port'] = ($data['server_port'] !== '') ? $data['server_port'] : ((!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT'));
 1015          $data['server_protocol'] = ($data['server_protocol'] !== '') ? $data['server_protocol'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://');
 1016          $data['cookie_secure'] = ($data['cookie_secure'] !== '') ? $data['cookie_secure'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? true : false);
 1017   
 1018          if ($data['script_path'] === '')
 1019          {
 1020              $name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
 1021              if (!$name)
 1022              {
 1023                  $name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
 1024              }
 1025   
 1026              // Replace backslashes and doubled slashes (could happen on some proxy setups)
 1027              $name = str_replace(array('\\', '//', '/install'), '/', $name);
 1028              $data['script_path'] = trim(dirname($name));
 1029          }
 1030   
 1031          foreach ($this->advanced_config_options as $config_key => $vars)
 1032          {
 1033              if (!is_array($vars) && strpos($config_key, 'legend') === false)
 1034              {
 1035                  continue;
 1036              }
 1037   
 1038              if (strpos($config_key, 'legend') !== false)
 1039              {
 1040                  $template->assign_block_vars('options', array(
 1041                      'S_LEGEND'        => true,
 1042                      'LEGEND'        => $lang[$vars])
 1043                  );
 1044   
 1045                  continue;
 1046              }
 1047   
 1048              $options = isset($vars['options']) ? $vars['options'] : '';
 1049   
 1050              $template->assign_block_vars('options', array(
 1051                  'KEY'            => $config_key,
 1052                  'TITLE'            => $lang[$vars['lang']],
 1053                  'S_EXPLAIN'        => $vars['explain'],
 1054                  'S_LEGEND'        => false,
 1055                  'TITLE_EXPLAIN'    => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '',
 1056                  'CONTENT'        => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options),
 1057                  )
 1058              );
 1059          }
 1060   
 1061          $config_options = array_merge($this->db_config_options, $this->admin_config_options);
 1062          foreach ($config_options as $config_key => $vars)
 1063          {
 1064              if (!is_array($vars))
 1065              {
 1066                  continue;
 1067              }
 1068              $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
 1069          }
 1070   
 1071          $submit = $lang['NEXT_STEP'];
 1072   
 1073          $url = $this->p_master->module_url . "?mode=$mode&amp;sub=create_table";
 1074   
 1075          $template->assign_vars(array(
 1076              'BODY'        => $lang['STAGE_ADVANCED_EXPLAIN'],
 1077              'L_SUBMIT'    => $submit,
 1078              'S_HIDDEN'    => $s_hidden_fields,
 1079              'U_ACTION'    => $url,
 1080          ));
 1081      }
 1082   
 1083      /**
 1084      * Load the contents of the schema into the database and then alter it based on what has been input during the installation
 1085      */
 1086      function load_schema($mode, $sub)
 1087      {
 1088          global $db, $lang, $template, $phpbb_root_path, $phpEx;
 1089   
 1090          $this->page_title = $lang['STAGE_CREATE_TABLE'];
 1091          $s_hidden_fields = '';
 1092   
 1093          // Obtain any submitted data
 1094          $data = $this->get_submitted_data();
 1095   
 1096          if ($data['dbms'] == '')
 1097          {
 1098              // Someone's been silly and tried calling this page direct
 1099              // So we send them back to the start to do it again properly
 1100              $this->p_master->redirect("index.$phpEx?mode=install");
 1101          }
 1102   
 1103          $cookie_domain = ($data['server_name'] != '') ? $data['server_name'] : (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME');
 1104   
 1105          // Try to come up with the best solution for cookie domain...
 1106          if (strpos($cookie_domain, 'www.') === 0)
 1107          {
 1108              $cookie_domain = str_replace('www.', '.', $cookie_domain);
 1109          }
 1110   
 1111          // If we get here and the extension isn't loaded it should be safe to just go ahead and load it
 1112          $available_dbms = get_available_dbms($data['dbms']);
 1113   
 1114          if (!isset($available_dbms[$data['dbms']]))
 1115          {
 1116              // Someone's been silly and tried providing a non-existant dbms
 1117              $this->p_master->redirect("index.$phpEx?mode=install");
 1118          }
 1119   
 1120          $dbms = $available_dbms[$data['dbms']]['DRIVER'];
 1121   
 1122          // Load the appropriate database class if not already loaded
 1123          include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
 1124   
 1125          // Instantiate the database
 1126          $db = new $sql_db();
 1127          $db->sql_connect($data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport'], false, false);
 1128   
 1129          // NOTE: trigger_error does not work here.
 1130          $db->sql_return_on_error(true);
 1131   
 1132          // If mysql is chosen, we need to adjust the schema filename slightly to reflect the correct version. ;)
 1133          if ($data['dbms'] == 'mysql')
 1134          {
 1135              if (version_compare($db->mysql_version, '4.1.3', '>='))
 1136              {
 1137                  $available_dbms[$data['dbms']]['SCHEMA'] .= '_41';
 1138              }
 1139              else
 1140              {
 1141                  $available_dbms[$data['dbms']]['SCHEMA'] .= '_40';
 1142              }
 1143          }
 1144   
 1145          // Ok we have the db info go ahead and read in the relevant schema
 1146          // and work on building the table
 1147          $dbms_schema = 'schemas/' . $available_dbms[$data['dbms']]['SCHEMA'] . '_schema.sql';
 1148   
 1149          // How should we treat this schema?
 1150          $remove_remarks = $available_dbms[$data['dbms']]['COMMENTS'];
 1151          $delimiter = $available_dbms[$data['dbms']]['DELIM'];
 1152   
 1153          $sql_query = @file_get_contents($dbms_schema);
 1154   
 1155          $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query);
 1156   
 1157          $remove_remarks($sql_query);
 1158   
 1159          $sql_query = split_sql_file($sql_query, $delimiter);
 1160   
 1161          foreach ($sql_query as $sql)
 1162          {
 1163              //$sql = trim(str_replace('|', ';', $sql));
 1164              if (!$db->sql_query($sql))
 1165              {
 1166                  $error = $db->sql_error();
 1167                  $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__);
 1168              }
 1169          }
 1170          unset($sql_query);
 1171   
 1172          // Ok tables have been built, let's fill in the basic information
 1173          $sql_query = file_get_contents('schemas/schema_data.sql');
 1174   
 1175          // Deal with any special comments
 1176          switch ($data['dbms'])
 1177          {
 1178              case 'mssql':
 1179              case 'mssql_odbc':
 1180                  $sql_query = preg_replace('#\# MSSQL IDENTITY (phpbb_[a-z_]+) (ON|OFF) \##s', 'SET IDENTITY_INSERT \1 \2;', $sql_query);
 1181              break;
 1182   
 1183              case 'postgres':
 1184                  $sql_query = preg_replace('#\# POSTGRES (BEGIN|COMMIT) \##s', '\1; ', $sql_query);
 1185              break;
 1186          }
 1187   
 1188          // Change prefix
 1189          $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query);
 1190   
 1191          // Change language strings...
 1192          $sql_query = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', 'adjust_language_keys_callback', $sql_query);
 1193   
 1194          // Since there is only one schema file we know the comment style and are able to remove it directly with remove_remarks
 1195          remove_remarks($sql_query);
 1196          $sql_query = split_sql_file($sql_query, ';');
 1197   
 1198          foreach ($sql_query as $sql)
 1199          {
 1200              //$sql = trim(str_replace('|', ';', $sql));
 1201              if (!$db->sql_query($sql))
 1202              {
 1203                  $error = $db->sql_error();
 1204                  $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__);
 1205              }
 1206          }
 1207          unset($sql_query);
 1208   
 1209          $current_time = time();
 1210   
 1211          $user_ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars($_SERVER['REMOTE_ADDR']) : '';
 1212   
 1213          if ($data['script_path'] !== '/')
 1214          {
 1215              // Adjust destination path (no trailing slash)
 1216              if (substr($data['script_path'], -1) == '/')
 1217              {
 1218                  $data['script_path'] = substr($data['script_path'], 0, -1);
 1219              }
 1220   
 1221              $data['script_path'] = str_replace(array('../', './'), '', $data['script_path']);
 1222   
 1223              if ($data['script_path'][0] != '/')
 1224              {
 1225                  $data['script_path'] = '/' . $data['script_path'];
 1226              }
 1227          }
 1228   
 1229          // Set default config and post data, this applies to all DB's
 1230          $sql_ary = array(
 1231              'INSERT INTO ' . $data['table_prefix'] . "config (config_name, config_value)
 1232                  VALUES ('board_startdate', '$current_time')",
 1233   
 1234              'INSERT INTO ' . $data['table_prefix'] . "config (config_name, config_value)
 1235                  VALUES ('default_lang', '" . $db->sql_escape($data['default_lang']) . "')",
 1236   
 1237              'UPDATE ' . $data['table_prefix'] . "config
 1238                  SET config_value = '" . $db->sql_escape($data['img_imagick']) . "'
 1239                  WHERE config_name = 'img_imagick'",
 1240   
 1241              'UPDATE ' . $data['table_prefix'] . "config
 1242                  SET config_value = '" . $db->sql_escape($data['server_name']) . "'
 1243                  WHERE config_name = 'server_name'",
 1244   
 1245              'UPDATE ' . $data['table_prefix'] . "config
 1246                  SET config_value = '" . $db->sql_escape($data['server_port']) . "'
 1247                  WHERE config_name = 'server_port'",
 1248   
 1249              'UPDATE ' . $data['table_prefix'] . "config
 1250                  SET config_value = '" . $db->sql_escape($data['board_email1']) . "'
 1251                  WHERE config_name = 'board_email'",
 1252   
 1253              'UPDATE ' . $data['table_prefix'] . "config
 1254                  SET config_value = '" . $db->sql_escape($data['board_email1']) . "'
 1255                  WHERE config_name = 'board_contact'",
 1256   
 1257              'UPDATE ' . $data['table_prefix'] . "config
 1258                  SET config_value = '" . $db->sql_escape($cookie_domain) . "'
 1259                  WHERE config_name = 'cookie_domain'",
 1260   
 1261              'UPDATE ' . $data['table_prefix'] . "config
 1262                  SET config_value = '" . $db->sql_escape($lang['default_dateformat']) . "'
 1263                  WHERE config_name = 'default_dateformat'",
 1264   
 1265              'UPDATE ' . $data['table_prefix'] . "config
 1266                  SET config_value = '" . $db->sql_escape($data['email_enable']) . "'
 1267                  WHERE config_name = 'email_enable'",
 1268   
 1269              'UPDATE ' . $data['table_prefix'] . "config
 1270                  SET config_value = '" . $db->sql_escape($data['smtp_delivery']) . "'
 1271                  WHERE config_name = 'smtp_delivery'",
 1272   
 1273              'UPDATE ' . $data['table_prefix'] . "config
 1274                  SET config_value = '" . $db->sql_escape($data['smtp_host']) . "'
 1275                  WHERE config_name = 'smtp_host'",
 1276   
 1277              'UPDATE ' . $data['table_prefix'] . "config
 1278                  SET config_value = '" . $db->sql_escape($data['smtp_auth']) . "'
 1279                  WHERE config_name = 'smtp_auth_method'",
 1280   
 1281              'UPDATE ' . $data['table_prefix'] . "config
 1282                  SET config_value = '" . $db->sql_escape($data['smtp_user']) . "'
 1283                  WHERE config_name = 'smtp_username'",
 1284   
 1285              'UPDATE ' . $data['table_prefix'] . "config
 1286                  SET config_value = '" . $db->sql_escape($data['smtp_pass']) . "'
 1287                  WHERE config_name = 'smtp_password'",
 1288   
 1289              'UPDATE ' . $data['table_prefix'] . "config
 1290                  SET config_value = '" . $db->sql_escape($data['cookie_secure']) . "'
 1291                  WHERE config_name = 'cookie_secure'",
 1292   
 1293              'UPDATE ' . $data['table_prefix'] . "config
 1294                  SET config_value = '" . $db->sql_escape($data['force_server_vars']) . "'
 1295                  WHERE config_name = 'force_server_vars'",
 1296   
 1297              'UPDATE ' . $data['table_prefix'] . "config
 1298                  SET config_value = '" . $db->sql_escape($data['script_path']) . "'
 1299                  WHERE config_name = 'script_path'",
 1300   
 1301              'UPDATE ' . $data['table_prefix'] . "config
 1302                  SET config_value = '" . $db->sql_escape($data['server_protocol']) . "'
 1303                  WHERE config_name = 'server_protocol'",
 1304   
 1305              'UPDATE ' . $data['table_prefix'] . "config
 1306                  SET config_value = '" . $db->sql_escape($data['admin_name']) . "'
 1307                  WHERE config_name = 'newest_username'",
 1308              
 1309              'UPDATE ' . $data['table_prefix'] . "config
 1310                  SET config_value = '" . md5(mt_rand()) . "'
 1311                  WHERE config_name = 'avatar_salt'",
 1312                  
 1313              'UPDATE ' . $data['table_prefix'] . "users
 1314                  SET username = '" . $db->sql_escape($data['admin_name']) . "', user_password='" . $db->sql_escape(md5($data['admin_pass1'])) . "', user_ip = '" . $db->sql_escape($user_ip) . "', user_lang = '" . $db->sql_escape($data['default_lang']) . "', user_email='" . $db->sql_escape($data['board_email1']) . "', user_dateformat='" . $db->sql_escape($lang['default_dateformat']) . "', user_email_hash = " . (crc32($data['board_email1']) . strlen($data['board_email1'])) . ", username_clean = '" . $db->sql_escape(utf8_clean_string($data['admin_name'])) . "'
 1315                  WHERE username = 'Admin'",
 1316   
 1317              'UPDATE ' . $data['table_prefix'] . "moderator_cache
 1318                  SET username = '" . $db->sql_escape($data['admin_name']) . "'
 1319                  WHERE username = 'Admin'",
 1320   
 1321              'UPDATE ' . $data['table_prefix'] . "forums
 1322                  SET forum_last_poster_name = '" . $db->sql_escape($data['admin_name']) . "'
 1323                  WHERE forum_last_poster_name = 'Admin'",
 1324   
 1325              'UPDATE ' . $data['table_prefix'] . "topics
 1326                  SET topic_first_poster_name = '" . $db->sql_escape($data['admin_name']) . "', topic_last_poster_name = '" . $db->sql_escape($data['admin_name']) . "'
 1327                  WHERE topic_first_poster_name = 'Admin'
 1328                      OR topic_last_poster_name = 'Admin'",
 1329   
 1330              'UPDATE ' . $data['table_prefix'] . "users
 1331                  SET user_regdate = $current_time",
 1332   
 1333              'UPDATE ' . $data['table_prefix'] . "posts
 1334                  SET post_time = $current_time, poster_ip = '" . $db->sql_escape($user_ip) . "'",
 1335   
 1336              'UPDATE ' . $data['table_prefix'] . "topics
 1337                  SET topic_time = $current_time, topic_last_post_time = $current_time",
 1338   
 1339              'UPDATE ' . $data['table_prefix'] . "forums
 1340                  SET forum_last_post_time = $current_time",
 1341          );
 1342   
 1343          if (@extension_loaded('gd') || can_load_dll('gd'))
 1344          {
 1345              $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config
 1346                  SET config_value = '1'
 1347                  WHERE config_name = 'captcha_gd'";
 1348          }
 1349   
 1350          // We set a (semi-)unique cookie name to bypass login issues related to the cookie name.
 1351          $cookie_name = 'phpbb3_';
 1352          $rand_str = md5(mt_rand());
 1353          $rand_str = str_replace('0', 'z', base_convert($rand_str, 16, 35));
 1354          $rand_str = substr($rand_str, 0, 5);
 1355          $cookie_name .= strtolower($rand_str);
 1356   
 1357          $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config
 1358              SET config_value = '" . $db->sql_escape($cookie_name) . "'
 1359              WHERE config_name = 'cookie_name'";
 1360   
 1361          foreach ($sql_ary as $sql)
 1362          {
 1363              //$sql = trim(str_replace('|', ';', $sql));
 1364   
 1365              if (!$db->sql_query($sql))
 1366              {
 1367                  $error = $db->sql_error();
 1368                  $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__);
 1369              }
 1370          }
 1371   
 1372          $submit = $lang['NEXT_STEP'];
 1373   
 1374          $url = $this->p_master->module_url . "?mode=$mode&amp;sub=final";
 1375   
 1376          $template->assign_vars(array(
 1377              'BODY'        => $lang['STAGE_CREATE_TABLE_EXPLAIN'],
 1378              'L_SUBMIT'    => $submit,
 1379              'S_HIDDEN'    => build_hidden_fields($data),
 1380              'U_ACTION'    => $url,
 1381          ));
 1382      }
 1383   
 1384      /**
 1385      * Build the search index...
 1386      */
 1387      function build_search_index($mode, $sub)
 1388      {
 1389          global $db, $lang, $phpbb_root_path, $phpEx, $config;
 1390   
 1391          // Obtain any submitted data
 1392          $data = $this->get_submitted_data();
 1393          $table_prefix = $data['table_prefix'];
 1394   
 1395          // If we get here and the extension isn't loaded it should be safe to just go ahead and load it
 1396          $available_dbms = get_available_dbms($data['dbms']);
 1397   
 1398          if (!isset($available_dbms[$data['dbms']]))
 1399          {
 1400              // Someone's been silly and tried providing a non-existant dbms
 1401              $this->p_master->redirect("index.$phpEx?mode=install");
 1402          }
 1403   
 1404          $dbms = $available_dbms[$data['dbms']]['DRIVER'];
 1405   
 1406          // Load the appropriate database class if not already loaded
 1407          include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
 1408   
 1409          // Instantiate the database
 1410          $db = new $sql_db();
 1411          $db->sql_connect($data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport'], false, false);
 1412   
 1413          // NOTE: trigger_error does not work here.
 1414          $db->sql_return_on_error(true);
 1415   
 1416          include_once($phpbb_root_path . 'includes/constants.' . $phpEx);
 1417          include_once($phpbb_root_path . 'includes/search/fulltext_native.' . $phpEx);
 1418   
 1419          // Fill the config array - it is needed by those functions we call
 1420          $sql = 'SELECT *
 1421              FROM ' . CONFIG_TABLE;
 1422          $result = $db->sql_query($sql);
 1423   
 1424          $config = array();
 1425          while ($row = $db->sql_fetchrow($result))
 1426          {
 1427              $config[$row['config_name']] = $row['config_value'];
 1428          }
 1429          $db->sql_freeresult($result);
 1430   
 1431          $error = false;
 1432          $search = new fulltext_native($error);
 1433   
 1434          $sql = 'SELECT post_id, post_subject, post_text, poster_id, forum_id
 1435              FROM ' . POSTS_TABLE;
 1436          $result = $db->sql_query($sql);
 1437   
 1438          while ($row = $db->sql_fetchrow($result))
 1439          {
 1440              $search->index('post', $row['post_id'], $row['post_text'], $row['post_subject'], $row['poster_id'], $row['forum_id']);
 1441          }
 1442          $db->sql_freeresult($result);
 1443      }
 1444   
 1445      /**
 1446      * Populate the module tables
 1447      */
 1448      function add_modules($mode, $sub)
 1449      {
 1450          global $db, $lang, $phpbb_root_path, $phpEx;
 1451   
 1452          include_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx);
 1453   
 1454          $_module = &new acp_modules();
 1455          $module_classes = array('acp', 'mcp', 'ucp');
 1456   
 1457          // Add categories
 1458          foreach ($module_classes as $module_class)
 1459          {
 1460              $categories = array();
 1461   
 1462              // Set the module class
 1463              $_module->module_class = $module_class;
 1464   
 1465              foreach ($this->module_categories[$module_class] as $cat_name => $subs)
 1466              {
 1467                  $module_data = array(
 1468                      'module_basename'    => '',
 1469                      'module_enabled'    => 1,
 1470                      'module_display'    => 1,
 1471                      'parent_id'            => 0,
 1472                      'module_class'        => $module_class,
 1473                      'module_langname'    => $cat_name,
 1474                      'module_mode'        => '',
 1475                      'module_auth'        => '',
 1476                  );
 1477   
 1478                  // Add category
 1479                  $_module->update_module_data($module_data, true);
 1480   
 1481                  // Check for last sql error happened
 1482                  if ($db->sql_error_triggered)
 1483                  {
 1484                      $error = $db->sql_error($db->sql_error_sql);
 1485                      $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
 1486                  }
 1487   
 1488                  $categories[$cat_name]['id'] = (int) $module_data['module_id'];
 1489                  $categories[$cat_name]['parent_id'] = 0;
 1490   
 1491                  // Create sub-categories...
 1492                  if (is_array($subs))
 1493                  {
 1494                      foreach ($subs as $level2_name)
 1495                      {
 1496                          $module_data = array(
 1497                              'module_basename'    => '',
 1498                              'module_enabled'    => 1,
 1499                              'module_display'    => 1,
 1500                              'parent_id'            => (int) $categories[$cat_name]['id'],
 1501                              'module_class'        => $module_class,
 1502                              'module_langname'    => $level2_name,
 1503                              'module_mode'        => '',
 1504                              'module_auth'        => '',
 1505                          );
 1506   
 1507                          $_module->update_module_data($module_data, true);
 1508   
 1509                          // Check for last sql error happened
 1510                          if ($db->sql_error_triggered)
 1511                          {
 1512                              $error = $db->sql_error($db->sql_error_sql);
 1513                              $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
 1514                          }
 1515   
 1516                          $categories[$level2_name]['id'] = (int) $module_data['module_id'];
 1517                          $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id'];
 1518                      }
 1519                  }
 1520              }
 1521   
 1522              // Get the modules we want to add... returned sorted by name
 1523              $module_info = $_module->get_module_infos('', $module_class);
 1524   
 1525              foreach ($module_info as $module_basename => $fileinfo)
 1526              {
 1527                  foreach ($fileinfo['modes'] as $module_mode => $row)
 1528                  {
 1529                      foreach ($row['cat'] as $cat_name)
 1530                      {
 1531                          if (!isset($categories[$cat_name]))
 1532                          {
 1533                              continue;
 1534                          }
 1535   
 1536                          $module_data = array(
 1537                              'module_basename'    => $module_basename,
 1538                              'module_enabled'    => 1,
 1539                              'module_display'    => (isset($row['display'])) ? (int) $row['display'] : 1,
 1540                              'parent_id'            => (int) $categories[$cat_name]['id'],
 1541                              'module_class'        => $module_class,
 1542                              'module_langname'    => $row['title'],
 1543                              'module_mode'        => $module_mode,
 1544                              'module_auth'        => $row['auth'],
 1545                          );
 1546   
 1547                          $_module->update_module_data($module_data, true);
 1548   
 1549                          // Check for last sql error happened
 1550                          if ($db->sql_error_triggered)
 1551                          {
 1552                              $error = $db->sql_error($db->sql_error_sql);
 1553                              $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
 1554                          }
 1555                      }
 1556                  }
 1557              }
 1558   
 1559              // Move some of the modules around since the code above will put them in the wrong place
 1560              if ($module_class == 'acp')
 1561              {
 1562                  // Move main module 4 up...
 1563                  $sql = 'SELECT *
 1564                      FROM ' . MODULES_TABLE . "
 1565                      WHERE module_basename = 'main'
 1566                          AND module_class = 'acp'
 1567                          AND module_mode = 'main'";
 1568                  $result = $db->sql_query($sql);
 1569                  $row = $db->sql_fetchrow($result);
 1570                  $db->sql_freeresult($result);
 1571      
 1572                  $_module->move_module_by($row, 'move_up', 4);
 1573   
 1574                  // Move permissions intro screen module 4 up...
 1575                  $sql = 'SELECT *
 1576                      FROM ' . MODULES_TABLE . "
 1577                      WHERE module_basename = 'permissions'
 1578                          AND module_class = 'acp'
 1579                          AND module_mode = 'intro'";
 1580                  $result = $db->sql_query($sql);
 1581                  $row = $db->sql_fetchrow($result);
 1582                  $db->sql_freeresult($result);
 1583      
 1584                  $_module->move_module_by($row, 'move_up', 4);
 1585   
 1586                  // Move manage users screen module 5 up...
 1587                  $sql = 'SELECT *
 1588                      FROM ' . MODULES_TABLE . "
 1589                      WHERE module_basename = 'users'
 1590                          AND module_class = 'acp'
 1591                          AND module_mode = 'overview'";
 1592                  $result = $db->sql_query($sql);
 1593                  $row = $db->sql_fetchrow($result);
 1594                  $db->sql_freeresult($result);
 1595      
 1596                  $_module->move_module_by($row, 'move_up', 5);
 1597              }
 1598   
 1599              if ($module_class == 'ucp')
 1600              {
 1601                  // Move attachment module 4 down...
 1602                  $sql = 'SELECT *
 1603                      FROM ' . MODULES_TABLE . "
 1604                      WHERE module_basename = 'attachments'
 1605                          AND module_class = 'ucp'
 1606                          AND module_mode = 'attachments'";
 1607                  $result = $db->sql_query($sql);
 1608                  $row = $db->sql_fetchrow($result);
 1609                  $db->sql_freeresult($result);
 1610      
 1611                  $_module->move_module_by($row, 'move_down', 4);
 1612              }
 1613   
 1614              // And now for the special ones
 1615              // (these are modules which appear in multiple categories and thus get added manually to some for more control)
 1616              if (isset($this->module_extras[$module_class]))
 1617              {
 1618                  foreach ($this->module_extras[$module_class] as $cat_name => $mods)
 1619                  {
 1620                      $sql = 'SELECT module_id, left_id, right_id
 1621                          FROM ' . MODULES_TABLE . "
 1622                          WHERE module_langname = '" . $db->sql_escape($cat_name) . "'
 1623                              AND module_class = '" . $db->sql_escape($module_class) . "'";
 1624                      $result = $db->sql_query_limit($sql, 1);
 1625                      $row2 = $db->sql_fetchrow($result);
 1626                      $db->sql_freeresult($result);
 1627   
 1628                      foreach ($mods as $mod_name)
 1629                      {
 1630                          $sql = 'SELECT *
 1631                              FROM ' . MODULES_TABLE . "
 1632                              WHERE module_langname = '" . $db->sql_escape($mod_name) . "'
 1633                                  AND module_class = '" . $db->sql_escape($module_class) . "'
 1634                                  AND module_basename <> ''";
 1635                          $result = $db->sql_query_limit($sql, 1);
 1636                          $row = $db->sql_fetchrow($result);
 1637                          $db->sql_freeresult($result);
 1638   
 1639                          $module_data = array(
 1640                              'module_basename'    => $row['module_basename'],
 1641                              'module_enabled'    => (int) $row['module_enabled'],
 1642                              'module_display'    => (int) $row['module_display'],
 1643                              'parent_id'            => (int) $row2['module_id'],
 1644                              'module_class'        => $row['module_class'],
 1645                              'module_langname'    => $row['module_langname'],
 1646                              'module_mode'        => $row['module_mode'],
 1647                              'module_auth'        => $row['module_auth'],
 1648                          );
 1649   
 1650                          $_module->update_module_data($module_data, true);
 1651   
 1652                          // Check for last sql error happened
 1653                          if ($db->sql_error_triggered)
 1654                          {
 1655                              $error = $db->sql_error($db->sql_error_sql);
 1656                              $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
 1657                          }
 1658                      }
 1659                  }
 1660              }
 1661   
 1662              $_module->remove_cache_file();
 1663          }
 1664      }
 1665   
 1666      /**
 1667      * Populate the language tables
 1668      */
 1669      function add_language($mode, $sub)
 1670      {
 1671          global $db, $lang, $phpbb_root_path, $phpEx;
 1672   
 1673          $dir = @opendir($phpbb_root_path . 'language');
 1674   
 1675          if (!$dir)
 1676          {
 1677              $this->error('Unable to access the language directory', __LINE__, __FILE__);
 1678          }
 1679   
 1680          while (($file = readdir($dir)) !== false)
 1681          {
 1682              $path = $phpbb_root_path . 'language/' . $file;
 1683   
 1684              if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS')
 1685              {
 1686                  continue;
 1687              }
 1688   
 1689              if (is_dir($path) && file_exists($path . '/iso.txt'))
 1690              {
 1691                  $lang_file = file("{$phpbb_root_path}language/$path/iso.txt");
 1692   
 1693                  $lang_pack = array(
 1694                      'lang_iso'            => basename($path),
 1695                      'lang_dir'            => basename($path),
 1696                      'lang_english_name'    => trim(htmlspecialchars($lang_file[0])),
 1697                      'lang_local_name'    => trim(htmlspecialchars($lang_file[1], ENT_COMPAT, 'UTF-8')),
 1698                      'lang_author'        => trim(htmlspecialchars($lang_file[2], ENT_COMPAT, 'UTF-8')),
 1699                  );
 1700   
 1701                  $db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $lang_pack));
 1702   
 1703                  if ($db->sql_error_triggered)
 1704                  {
 1705                      $error = $db->sql_error($db->sql_error_sql);
 1706                      $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
 1707                  }
 1708   
 1709                  $valid_localized = array(
 1710                      'icon_back_top', 'icon_contact_aim', 'icon_contact_email', 'icon_contact_icq', 'icon_contact_jabber', 'icon_contact_msnm', 'icon_contact_pm', 'icon_contact_yahoo', 'icon_contact_www', 'icon_post_delete', 'icon_post_edit', 'icon_post_info', 'icon_post_quote', 'icon_post_report', 'icon_user_online', 'icon_user_offline', 'icon_user_profile', 'icon_user_search', 'icon_user_warn', 'button_pm_forward', 'button_pm_new', 'button_pm_reply', 'button_topic_locked', 'button_topic_new', 'button_topic_reply',
 1711                  );
 1712   
 1713                  $sql_ary = array();
 1714   
 1715                  $sql = 'SELECT *
 1716                      FROM ' . STYLES_IMAGESET_TABLE;
 1717                  $result = $db->sql_query($sql);
 1718   
 1719                  while ($imageset_row = $db->sql_fetchrow($result))
 1720                  {
 1721                      if (@file_exists("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['lang_iso']}/imageset.cfg"))
 1722                      {
 1723                          $cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['lang_iso']}/imageset.cfg");
 1724                          foreach ($cfg_data_imageset_data as $image_name => $value)
 1725                          {
 1726                              if (strpos($value, '*') !== false)
 1727                              {
 1728                                  if (substr($value, -1, 1) === '*')
 1729                                  {
 1730                                      list($image_filename, $image_height) = explode('*', $value);
 1731                                      $image_width = 0;
 1732                                  }
 1733                                  else
 1734                                  {
 1735                                      list($image_filename, $image_height, $image_width) = explode('*', $value);
 1736                                  }
 1737                              }
 1738                              else
 1739                              {
 1740                                  $image_filename = $value;
 1741                                  $image_height = $image_width = 0;
 1742                              }
 1743   
 1744                              if (strpos($image_name, 'img_') === 0 && $image_filename)
 1745                              {
 1746                                  $image_name = substr($image_name, 4);
 1747                                  if (in_array($image_name, $valid_localized))
 1748                                  {
 1749                                      $sql_ary[] = array(
 1750                                          'image_name'        => (string) $image_name,
 1751                                          'image_filename'    => (string) $image_filename,
 1752                                          'image_height'        => (int) $image_height,
 1753                                          'image_width'        => (int) $image_width,
 1754                                          'imageset_id'        => (int) $imageset_row['imageset_id'],
 1755                                          'image_lang'        => (string) $lang_pack['lang_iso'],
 1756                                      );
 1757                                  }
 1758                              }
 1759                          }
 1760                      }
 1761                  }
 1762                  $db->sql_freeresult($result);
 1763   
 1764                  if (sizeof($sql_ary))
 1765                  {
 1766                      $db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary);
 1767   
 1768                      if ($db->sql_error_triggered)
 1769                      {
 1770                          $error = $db->sql_error($db->sql_error_sql);
 1771                          $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
 1772                      }
 1773                  }
 1774              }
 1775          }
 1776          closedir($dir);
 1777      }
 1778   
 1779      /**
 1780      * Add search robots to the database
 1781      */
 1782      function add_bots($mode, $sub)
 1783      {
 1784          global $db, $lang, $phpbb_root_path, $phpEx, $config;
 1785   
 1786          // Obtain any submitted data
 1787          $data = $this->get_submitted_data();
 1788   
 1789          // Fill the config array - it is needed by those functions we call
 1790          $sql = 'SELECT *
 1791              FROM ' . CONFIG_TABLE;
 1792          $result = $db->sql_query($sql);
 1793   
 1794          $config = array();
 1795          while ($row = $db->sql_fetchrow($result))
 1796          {
 1797              $config[$row['config_name']] = $row['config_value'];
 1798          }
 1799          $db->sql_freeresult($result);
 1800   
 1801          $sql = 'SELECT group_id
 1802              FROM ' . GROUPS_TABLE . "
 1803              WHERE group_name = 'BOTS'";
 1804          $result = $db->sql_query($sql);
 1805          $group_id = (int) $db->sql_fetchfield('group_id');
 1806          $db->sql_freeresult($result);
 1807   
 1808          if (!$group_id)
 1809          {
 1810              // If we reach this point then something has gone very wrong
 1811              $this->p_master->error($lang['NO_GROUP'], __LINE__, __FILE__);
 1812          }
 1813   
 1814          if (!function_exists('user_add'))
 1815          {
 1816              include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
 1817          }
 1818   
 1819          foreach ($this->bot_list as $bot_name => $bot_ary)
 1820          {
 1821              $user_row = array(
 1822                  'user_type'                => USER_IGNORE,
 1823                  'group_id'                => $group_id,
 1824                  'username'                => $bot_name,
 1825                  'user_regdate'            => time(),
 1826                  'user_password'            => '',
 1827                  'user_colour'            => '9E8DA7',
 1828                  'user_email'            => '',
 1829                  'user_lang'                => $data['default_lang'],
 1830                  'user_style'            => 1,
 1831                  'user_timezone'            => 0,
 1832                  'user_dateformat'        => $lang['default_dateformat'],
 1833                  'user_allow_massemail'    => 0,
 1834              );
 1835              
 1836              $user_id = user_add($user_row);
 1837   
 1838              if (!$user_id)
 1839              {
 1840                  // If we can't insert this user then continue to the next one to avoid inconsistant data
 1841                  $this->p_master->db_error('Unable to insert bot into users table', $db->sql_error_sql, __LINE__, __FILE__, true);
 1842                  continue;
 1843              }
 1844   
 1845              $sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
 1846                  'bot_active'    => 1,
 1847                  'bot_name'        => (string) $bot_name,
 1848                  'user_id'        => (int) $user_id,
 1849                  'bot_agent'        => (string) $bot_ary[0],
 1850                  'bot_ip'        => (string) $bot_ary[1],
 1851              ));
 1852   
 1853              $result = $db->sql_query($sql);
 1854          }
 1855      }
 1856   
 1857      /**
 1858      * Sends an email to the board administrator with their password and some useful links
 1859      */
 1860      function email_admin($mode, $sub)
 1861      {
 1862          global $auth, $config, $db, $lang, $template, $user, $phpbb_root_path, $phpEx;
 1863   
 1864          $this->page_title = $lang['STAGE_FINAL'];
 1865   
 1866          // Obtain any submitted data
 1867          $data = $this->get_submitted_data();
 1868   
 1869          $sql = 'SELECT *
 1870              FROM ' . CONFIG_TABLE;
 1871          $result = $db->sql_query($sql);
 1872   
 1873          $config = array();
 1874          while ($row = $db->sql_fetchrow($result))
 1875          {
 1876              $config[$row['config_name']] = $row['config_value'];
 1877          }
 1878          $db->sql_freeresult($result);
 1879   
 1880          $user->session_begin();
 1881          $auth->login($data['admin_name'], $data['admin_pass1'], false, true, true);
 1882   
 1883          // OK, Now that we've reached this point we can be confident that everything
 1884          // is installed and working......I hope :)
 1885          // So it's time to send an email to the administrator confirming the details
 1886          // they entered
 1887   
 1888          if ($config['email_enable'])
 1889          {
 1890              include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
 1891   
 1892              $messenger = new messenger(false);
 1893   
 1894              $messenger->template('installed', $data['language']);
 1895   
 1896              $messenger->to($data['board_email1'], $data['admin_name']);
 1897   
 1898              $messenger->headers('X-AntiAbuse: Board servername - ' . $config['server_name']);
 1899              $messenger->headers('X-AntiAbuse: User_id - ' . $user->data['user_id']);
 1900              $messenger->headers('X-AntiAbuse: Username - ' . $user->data['username']);
 1901              $messenger->headers('X-AntiAbuse: User IP - ' . $user->ip);
 1902   
 1903              $messenger->assign_vars(array(
 1904                  'USERNAME'        => htmlspecialchars_decode($data['admin_name']),
 1905                  'PASSWORD'        => htmlspecialchars_decode($data['admin_pass1']))
 1906              );
 1907   
 1908              $messenger->send(NOTIFY_EMAIL);
 1909          }
 1910   
 1911          // And finally, add a note to the log
 1912          add_log('admin', 'LOG_INSTALL_INSTALLED', $config['version']);
 1913   
 1914          $template->assign_vars(array(
 1915              'TITLE'        => $lang['INSTALL_CONGRATS'],
 1916              'BODY'        => sprintf($lang['INSTALL_CONGRATS_EXPLAIN'], $config['version'], append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=convert&amp;language=' . $data['language']), '../docs/README.html'),
 1917              'L_SUBMIT'    => $lang['INSTALL_LOGIN'],
 1918              'U_ACTION'    => append_sid($phpbb_root_path . 'adm/index.' . $phpEx),
 1919          ));
 1920      }
 1921   
 1922      /**
 1923      * Generate a list of available mail server authentication methods
 1924      */
 1925      function mail_auth_select($selected_method)
 1926      {
 1927          global $lang;
 1928   
 1929          $auth_methods = array('PLAIN', 'LOGIN', 'CRAM-MD5', 'DIGEST-MD5', 'POP-BEFORE-SMTP');
 1930          $s_smtp_auth_options = '';
 1931   
 1932          foreach ($auth_methods as $method)
 1933          {
 1934              $s_smtp_auth_options .= '<option value="' . $method . '"' . (($selected_method == $method) ? ' selected="selected"' : '') . '>' . $lang['SMTP_' . str_replace('-', '_', $method)] . '</option>';
 1935          }
 1936   
 1937          return $s_smtp_auth_options;
 1938      }
 1939   
 1940      /**
 1941      * Get submitted data
 1942      */
 1943      function get_submitted_data()
 1944      {
 1945          return array(
 1946              'language'        => basename(request_var('language', '')),
 1947              'dbms'            => request_var('dbms', ''),
 1948              'dbhost'        => request_var('dbhost', ''),
 1949              'dbport'        => request_var('dbport', ''),
 1950              'dbuser'        => request_var('dbuser', ''),
 1951              'dbpasswd'        => htmlspecialchars_decode(request_var('dbpasswd', '', true)),
 1952              'dbname'        => request_var('dbname', ''),
 1953              'table_prefix'    => request_var('table_prefix', ''),
 1954              'default_lang'    => basename(request_var('default_lang', '')),
 1955              'admin_name'    => utf8_normalize_nfc(request_var('admin_name', '', true)),
 1956              'admin_pass1'    => request_var('admin_pass1', '', true),
 1957              'admin_pass2'    => request_var('admin_pass2', '', true),
 1958              'board_email1'    => strtolower(request_var('board_email1', '')),
 1959              'board_email2'    => strtolower(request_var('board_email2', '')),
 1960              'img_imagick'    => request_var('img_imagick', ''),
 1961              'ftp_path'        => request_var('ftp_path', ''),
 1962              'ftp_user'        => request_var('ftp_user', ''),
 1963              'ftp_pass'        => request_var('ftp_pass', ''),
 1964              'email_enable'    => request_var('email_enable', ''),
 1965              'smtp_delivery'    => request_var('smtp_delivery', ''),
 1966              'smtp_host'        => request_var('smtp_host', ''),
 1967              'smtp_auth'        => request_var('smtp_auth', ''),
 1968              'smtp_user'        => request_var('smtp_user', ''),
 1969              'smtp_pass'        => request_var('smtp_pass', ''),
 1970              'cookie_secure'    => request_var('cookie_secure', ''),
 1971              'force_server_vars'    => request_var('force_server_vars', ''),
 1972              'server_protocol'    => request_var('server_protocol', ''),
 1973              'server_name'    => request_var('server_name', ''),
 1974              'server_port'    => request_var('server_port', ''),
 1975              'script_path'    => request_var('script_path', ''),
 1976          );
 1977      }
 1978   
 1979      /**
 1980      * The information below will be used to build the input fields presented to the user
 1981      */
 1982      var $db_config_options = array(
 1983          'legend1'                => 'DB_CONFIG',
 1984          'dbms'                    => array('lang' => 'DBMS',            'type' => 'select', 'options' => 'dbms_select(\'{VALUE}\')', 'explain' => false),
 1985          'dbhost'                => array('lang' => 'DB_HOST',        'type' => 'text:25:100', 'explain' => true),
 1986          'dbport'                => array('lang' => 'DB_PORT',        'type' => 'text:25:100', 'explain' => true),
 1987          'dbname'                => array('lang' => 'DB_NAME',        'type' => 'text:25:100', 'explain' => false),
 1988          'dbuser'                => array('lang' => 'DB_USERNAME',    'type' => 'text:25:100', 'explain' => false),
 1989          'dbpasswd'                => array('lang' => 'DB_PASSWORD',    'type' => 'password:25:100', 'explain' => false),
 1990          'table_prefix'            => array('lang' => 'TABLE_PREFIX',    'type' => 'text:25:100', 'explain' => false),
 1991      );
 1992      var $admin_config_options = array(
 1993          'legend1'                => 'ADMIN_CONFIG',
 1994          'default_lang'            => array('lang' => 'DEFAULT_LANG',                'type' => 'select', 'options' => '$this->module->inst_language_select(\'{VALUE}\')', 'explain' => false),
 1995          'admin_name'            => array('lang' => 'ADMIN_USERNAME',            'type' => 'text:25:100', 'explain' => true),
 1996          'admin_pass1'            => array('lang' => 'ADMIN_PASSWORD',            'type' => 'password:25:100', 'explain' => true),
 1997          'admin_pass2'            => array('lang' => 'ADMIN_PASSWORD_CONFIRM',    'type' => 'password:25:100', 'explain' => false),
 1998          'board_email1'            => array('lang' => 'CONTACT_EMAIL',                'type' => 'text:25:100', 'explain' => false),
 1999          'board_email2'            => array('lang' => 'CONTACT_EMAIL_CONFIRM',        'type' => 'text:25:100', 'explain' => false),
 2000      );
 2001      var $advanced_config_options = array(
 2002          'legend1'                => 'ACP_EMAIL_SETTINGS',
 2003          'email_enable'            => array('lang' => 'ENABLE_EMAIL',        'type' => 'radio:enabled_disabled', 'explain' => true),
 2004          'smtp_delivery'            => array('lang' => 'USE_SMTP',            'type' => 'radio:yes_no', 'explain' => true),
 2005          'smtp_host'                => array('lang' => 'SMTP_SERVER',        'type' => 'text:25:50', 'explain' => false),
 2006          'smtp_auth'                => array('lang' => 'SMTP_AUTH_METHOD',    'type' => 'select', 'options' => '$this->module->mail_auth_select(\'{VALUE}\')', 'explain' => true),
 2007          'smtp_user'                => array('lang' => 'SMTP_USERNAME',        'type' => 'text:25:255', 'explain' => true),
 2008          'smtp_pass'                => array('lang' => 'SMTP_PASSWORD',        'type' => 'password:25:255', 'explain' => true),
 2009   
 2010          'legend2'                => 'SERVER_URL_SETTINGS',
 2011          'cookie_secure'            => array('lang' => 'COOKIE_SECURE',        'type' => 'radio:enabled_disabled', 'explain' => true),
 2012          'force_server_vars'        => array('lang' => 'FORCE_SERVER_VARS',    'type' => 'radio:yes_no', 'explain' => true),
 2013          'server_protocol'        => array('lang' => 'SERVER_PROTOCOL',    'type' => 'text:10:10', 'explain' => true),
 2014          'server_name'            => array('lang' => 'SERVER_NAME',        'type' => 'text:40:255', 'explain' => true),
 2015          'server_port'            => array('lang' => 'SERVER_PORT',        'type' => 'text:5:5', 'explain' => true),
 2016          'script_path'            => array('lang' => 'SCRIPT_PATH',        'type' => 'text::255', 'explain' => true),
 2017      );
 2018   
 2019      /**
 2020      * Specific PHP modules we may require for certain optional or extended features
 2021      */
 2022      var $php_dlls_other = array('zlib', 'ftp', 'gd', 'xml');
 2023   
 2024      /**
 2025      * A list of the web-crawlers/bots we recognise by default
 2026      *
 2027      * Candidates but not included:
 2028      * 'Accoona [Bot]'                'Accoona-AI-Agent/'
 2029      * 'ASPseek [Crawler]'            'ASPseek/'
 2030      * 'Boitho [Crawler]'            'boitho.com-dc/'
 2031      * 'Bunnybot [Bot]'                'powered by www.buncat.de'
 2032      * 'Cosmix [Bot]'                'cfetch/'
 2033      * 'Crawler Search [Crawler]'    '.Crawler-Search.de'
 2034      * 'Findexa [Crawler]'            'Findexa Crawler ('
 2035      * 'GBSpider [Spider]'            'GBSpider v'
 2036      * 'genie [Bot]'                    'genieBot ('
 2037      * 'Hogsearch [Bot]'                'oegp v. 1.3.0'
 2038      * 'Insuranco [Bot]'                'InsurancoBot'
 2039      * 'IRLbot [Bot]'                'http://irl.cs.tamu.edu/crawler'
 2040      * 'ISC Systems [Bot]'            'ISC Systems iRc Search'
 2041      * 'Jyxobot [Bot]'                'Jyxobot/'
 2042      * 'Kraehe [Metasuche]'            '-DIE-KRAEHE- META-SEARCH-ENGINE/'
 2043      * 'LinkWalker'                    'LinkWalker'
 2044      * 'MMSBot [Bot]'                'http://www.mmsweb.at/bot.html'
 2045      * 'Naver [Bot]'                    'nhnbot@naver.com)'
 2046      * 'NetResearchServer'            'NetResearchServer/'
 2047      * 'Nimble [Crawler]'            'NimbleCrawler'
 2048      * 'Ocelli [Bot]'                'Ocelli/'
 2049      * 'Onsearch [Bot]'                'onCHECK-Robot'
 2050      * 'Orange [Spider]'                'OrangeSpider'
 2051      * 'Sproose [Bot]'                'http://www.sproose.com/bot'
 2052      * 'Susie [Sync]'                '!Susie (http://www.sync2it.com/susie)'
 2053      * 'Tbot [Bot]'                    'Tbot/'
 2054      * 'Thumbshots [Capture]'        'thumbshots-de-Bot'
 2055      * 'Vagabondo [Crawler]'            'http://webagent.wise-guys.nl/'
 2056      * 'Walhello [Bot]'                'appie 1.1 (www.walhello.com)'
 2057      * 'WissenOnline [Bot]'            'WissenOnline-Bot'
 2058      * 'WWWeasel [Bot]'                'WWWeasel Robot v'
 2059      * 'Xaldon [Spider]'                'Xaldon WebSpider'
 2060      */
 2061      var $bot_list = array(
 2062          'AdsBot [Google]'            => array('AdsBot-Google', ''),
 2063          'Alexa [Bot]'                => array('ia_archiver', ''),
 2064          'Alta Vista [Bot]'            => array('Scooter/', ''),
 2065          'Ask Jeeves [Bot]'            => array('Ask Jeeves', ''),
 2066          'Baidu [Spider]'            => array('Baiduspider+(', ''),
 2067          'Exabot [Bot]'                => array('Exabot/', ''),
 2068          'FAST Enterprise [Crawler]'    => array('FAST Enterprise Crawler', ''),
 2069          'FAST WebCrawler [Crawler]'    => array('FAST-WebCrawler/', ''),
 2070          'Francis [Bot]'                => array('http://www.neomo.de/', ''),
 2071          'Gigabot [Bot]'                => array('Gigabot/', ''),
 2072          'Google Adsense [Bot]'        => array('Mediapartners-Google', ''),
 2073          'Google Desktop'            => array('Google Desktop', ''),
 2074          'Google Feedfetcher'        => array('Feedfetcher-Google', ''),
 2075          'Google [Bot]'                => array('Googlebot', ''),
 2076          'Heise IT-Markt [Crawler]'    => array('heise-IT-Markt-Crawler', ''),
 2077          'Heritrix [Crawler]'        => array('heritrix/1.', ''),
 2078          'IBM Research [Bot]'        => array('ibm.com/cs/crawler', ''),
 2079          'ICCrawler - ICjobs'        => array('ICCrawler - ICjobs', ''),
 2080          'ichiro [Crawler]'            => array('ichiro/2', ''),
 2081          'Majestic-12 [Bot]'            => array('MJ12bot/', ''),
 2082          'Metager [Bot]'                => array('MetagerBot/', ''),
 2083          'MSN NewsBlogs'                => array('msnbot-NewsBlogs/', ''),
 2084          'MSN [Bot]'                    => array('msnbot/', ''),
 2085          'MSNbot Media'                => array('msnbot-media/', ''),
 2086          'NG-Search [Bot]'            => array('NG-Search/', ''),
 2087          'Nutch [Bot]'                => array('http://lucene.apache.org/nutch/', ''),
 2088          'Nutch/CVS [Bot]'            => array('NutchCVS/', ''),
 2089          'OmniExplorer [Bot]'        => array('OmniExplorer_Bot/', ''),
 2090          'Online link [Validator]'    => array('online link validator', ''),
 2091          'psbot [Picsearch]'            => array('psbot/0', ''),
 2092          'Seekport [Bot]'            => array('Seekbot/', ''),
 2093          'Sensis [Crawler]'            => array('Sensis Web Crawler', ''),
 2094          'SEO Crawler'                => array('SEO search Crawler/', ''),
 2095          'Seoma [Crawler]'            => array('Seoma [SEO Crawler]', ''),
 2096          'SEOSearch [Crawler]'        => array('SEOsearch/', ''),
 2097          'Snappy [Bot]'                => array('Snappy/1.1 ( http://www.urltrends.com/ )', ''),
 2098          'Steeler [Crawler]'            => array('http://www.tkl.iis.u-tokyo.ac.jp/~crawler/', ''),
 2099          'Synoo [Bot]'                => array('SynooBot/', ''),
 2100          'Telekom [Bot]'                => array('crawleradmin.t-info@telekom.de', ''),
 2101          'TurnitinBot [Bot]'            => array('TurnitinBot/', ''),
 2102          'Voyager [Bot]'                => array('voyager/1.0', ''),
 2103          'W3 [Sitesearch]'            => array('W3 SiteSearch Crawler', ''),
 2104          'W3C [Linkcheck]'            => array('W3C-checklink/', ''),
 2105          'W3C [Validator]'            => array('W3C_*Validator', ''),
 2106          'WiseNut [Bot]'                => array('http://www.WISEnutbot.com', ''),
 2107          'YaCy [Bot]'                => array('yacybot', ''),
 2108          'Yahoo MMCrawler [Bot]'        => array('Yahoo-MMCrawler/', ''),
 2109          'Yahoo Slurp [Bot]'            => array('Yahoo! DE Slurp', ''),
 2110          'Yahoo [Bot]'                => array('Yahoo! Slurp', ''),
 2111          'YahooSeeker [Bot]'            => array('YahooSeeker/', ''),
 2112      );
 2113   
 2114      /**
 2115      * Define the module structure so that we can populate the database without
 2116      * needing to hard-code module_id values
 2117      */
 2118      var $module_categories = array(
 2119          'acp'    => array(
 2120              'ACP_CAT_GENERAL'        => array(
 2121                  'ACP_QUICK_ACCESS',
 2122                  'ACP_BOARD_CONFIGURATION',
 2123                  'ACP_CLIENT_COMMUNICATION',
 2124                  'ACP_SERVER_CONFIGURATION',
 2125              ),
 2126              'ACP_CAT_FORUMS'        => array(
 2127                  'ACP_MANAGE_FORUMS',
 2128                  'ACP_FORUM_BASED_PERMISSIONS',
 2129              ),
 2130              'ACP_CAT_POSTING'        => array(
 2131                  'ACP_MESSAGES',
 2132                  'ACP_ATTACHMENTS',
 2133              ),
 2134              'ACP_CAT_USERGROUP'        => array(
 2135                  'ACP_CAT_USERS',
 2136                  'ACP_GROUPS',
 2137                  'ACP_USER_SECURITY',
 2138              ),
 2139              'ACP_CAT_PERMISSIONS'    => array(
 2140                  'ACP_GLOBAL_PERMISSIONS',
 2141                  'ACP_FORUM_BASED_PERMISSIONS',
 2142                  'ACP_PERMISSION_ROLES',
 2143                  'ACP_PERMISSION_MASKS',
 2144              ),
 2145              'ACP_CAT_STYLES'        => array(
 2146                  'ACP_STYLE_MANAGEMENT',
 2147                  'ACP_STYLE_COMPONENTS',
 2148              ),
 2149              'ACP_CAT_MAINTENANCE'    => array(
 2150                  'ACP_FORUM_LOGS',
 2151                  'ACP_CAT_DATABASE',
 2152              ),
 2153              'ACP_CAT_SYSTEM'        => array(
 2154                  'ACP_AUTOMATION',
 2155                  'ACP_GENERAL_TASKS',
 2156                  'ACP_MODULE_MANAGEMENT',
 2157              ),
 2158              'ACP_CAT_DOT_MODS'        => null,
 2159          ),
 2160          'mcp'    => array(
 2161              'MCP_MAIN'        => null,
 2162              'MCP_QUEUE'        => null,
 2163              'MCP_REPORTS'    => null,
 2164              'MCP_NOTES'        => null,
 2165              'MCP_WARN'        => null,
 2166              'MCP_LOGS'        => null,
 2167              'MCP_BAN'        => null,
 2168          ),
 2169          'ucp'    => array(
 2170              'UCP_MAIN'            => null,
 2171              'UCP_PROFILE'        => null,
 2172              'UCP_PREFS'            => null,
 2173              'UCP_PM'            => null,
 2174              'UCP_USERGROUPS'    => null,
 2175              'UCP_ZEBRA'            => null,
 2176          ),
 2177      );
 2178   
 2179      var $module_extras = array(
 2180          'acp'    => array(
 2181              'ACP_QUICK_ACCESS' => array(
 2182                  'ACP_MANAGE_USERS',
 2183                  'ACP_GROUPS_MANAGE',
 2184                  'ACP_MANAGE_FORUMS',
 2185                  'ACP_MOD_LOGS',
 2186                  'ACP_BOTS',
 2187                  'ACP_PHP_INFO',
 2188              ),
 2189              'ACP_FORUM_BASED_PERMISSIONS' => array(
 2190                  'ACP_FORUM_PERMISSIONS',
 2191                  'ACP_FORUM_MODERATORS',
 2192                  'ACP_USERS_FORUM_PERMISSIONS',
 2193                  'ACP_GROUPS_FORUM_PERMISSIONS',
 2194              ),
 2195          ),
 2196      );
 2197  }
 2198   
 2199  ?>