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  ?>