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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
install_install.php
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&sub=requirements&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&sub=database&language=$language" : $this->p_master->module_url . "?mode=$mode&sub=requirements&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&sub=administrator" : $this->p_master->module_url . "?mode=$mode&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&sub=config_file" : $this->p_master->module_url . "?mode=$mode&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&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&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&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&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&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 ?>