<?php
/***************************************************************************
 *                                 install.php
 *                            -------------------
 *   begin                : Tuesday, Sept 11, 2001
 *   copyright            : (C) 2001 The phpBB Group
 *   email                : supportphpbb.com
 *
 *   $Id$
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

$phpbb_root_path='./';
include($phpbb_root_path.'extension.inc');

if( !get_magic_quotes_gpc() )
{
	if( is_array($HTTP_GET_VARS) )
	{
		while( list($k, $v) = each($HTTP_GET_VARS) )
		{
			if( is_array($HTTP_GET_VARS[$k]) )
			{
				while( list($k2, $v2) = each($HTTP_GET_VARS[$k]) )
				{
					$HTTP_GET_VARS[$k][$k2] = addslashes($v2);
				}
				@reset($HTTP_GET_VARS[$k]);
			}
			else
			{
				$HTTP_GET_VARS[$k] = addslashes($v);
			}
		}
		@reset($HTTP_GET_VARS);
	}

	if( is_array($HTTP_POST_VARS) )
	{
		while( list($k, $v) = each($HTTP_POST_VARS) )
		{
			if( is_array($HTTP_POST_VARS[$k]) )
			{
				while( list($k2, $v2) = each($HTTP_POST_VARS[$k]) )
				{
					$HTTP_POST_VARS[$k][$k2] = addslashes($v2);
				}
				@reset($HTTP_POST_VARS[$k]);
			}
			else
			{
				$HTTP_POST_VARS[$k] = addslashes($v);
			}
		}
		@reset($HTTP_POST_VARS);
	}

	if( is_array($HTTP_COOKIE_VARS) )
	{
		while( list($k, $v) = each($HTTP_COOKIE_VARS) )
		{
			if( is_array($HTTP_COOKIE_VARS[$k]) )
			{
				while( list($k2, $v2) = each($HTTP_COOKIE_VARS[$k]) )
				{
					$HTTP_COOKIE_VARS[$k][$k2] = addslashes($v2);
				}
				@reset($HTTP_COOKIE_VARS[$k]);
			}
			else
			{
				$HTTP_COOKIE_VARS[$k] = addslashes($v);
			}
		}
		@reset($HTTP_COOKIE_VARS);
	}
}

/***************************************************************************
 *								Install Customization Section
 *
 *		This section can be modified to set up some basic default information
 * 	used by the install script.  Specifically the default theme data
 *		and the default template.
 *
 **************************************************************************/

$default_language = 'english';
$default_template = 'subSilver';
					
$available_dbms = array(
	array(
		"LABEL" => "MySQL",
		"VALUE" => "mysql"
	), 
	array(
		"LABEL" => "PostgreSQL 7.x",
		"VALUE" => "postgres"
	), 
	array(
		"LABEL" => "MS SQL Server 7/2000",
		"VALUE" => "mssql"
	),
	array(
		"LABEL" => "ODBC - MS Access",
		"VALUE" => "odbc:msaccess"
	)
);

/***************************************************************************
*		
*						End Install Customization Section
*
***************************************************************************/

$userdata = array();
$lang = array();

//
// Obtain various vars
//
if( isset($HTTP_POST_VARS['install_step']) || isset($HTTP_GET_VARS['install_step']) )
{
	$install_step = ( isset($HTTP_POST_VARS['install_step']) ) ? $HTTP_POST_VARS['install_step'] : $HTTP_GET_VARS['install_step'];
}
else
{
	$install_step = "";
}

$dbms = isset($HTTP_POST_VARS['dbms']) ? $HTTP_POST_VARS['dbms'] : "";
$language = ( !empty($HTTP_POST_VARS['language']) ) ? $HTTP_POST_VARS['language'] : $default_language;

$dbhost = ( !empty($HTTP_POST_VARS['dbhost']) ) ? $HTTP_POST_VARS['dbhost'] : "";
$dbuser = ( !empty($HTTP_POST_VARS['dbuser']) ) ? $HTTP_POST_VARS['dbuser'] : "";
$dbpasswd = ( !empty($HTTP_POST_VARS['dbpasswd']) ) ? $HTTP_POST_VARS['dbpasswd'] : "";
$dbname = ( !empty($HTTP_POST_VARS['dbname']) ) ? $HTTP_POST_VARS['dbname'] : "";

$admin_username = ( !empty($HTTP_POST_VARS['admin_user']) ) ? $HTTP_POST_VARS['admin_user'] : "";
$admin_pass1 = ( !empty($HTTP_POST_VARS['admin_pass1']) ) ? $HTTP_POST_VARS['admin_pass1'] : "";
$admin_pass2 = ( !empty($HTTP_POST_VARS['admin_pass2']) ) ? $HTTP_POST_VARS['admin_pass2'] : "";

$table_prefix = ( !empty($HTTP_POST_VARS['prefix']) ) ? $HTTP_POST_VARS['prefix'] : "";

include($phpbb_root_path.'includes/sql_parse.'.$phpEx);
include($phpbb_root_path.'includes/constants.'.$phpEx);
include($phpbb_root_path.'includes/template.'.$phpEx);
include($phpbb_root_path.'includes/functions.'.$phpEx);
include($phpbb_root_path.'includes/sessions.'.$phpEx);

//
// Import language file, setup template ...
//
include($phpbb_root_path.'language/lang_' . $language . '/lang_main.'.$phpEx);

$template = new Template($phpbb_root_path . "templates/" . $default_template);

//
// Load default template for install
// 
$template->set_filenames(array(
	"body" => "install.tpl")
);

$template->assign_vars(array(
	"L_INSTALLATION" => $lang['Welcome_install'])
);


//
// Start main program ...
//
if( @file_exists('config.'.$phpEx) )
{
	include('config.'.$phpEx);
}

if( defined("PHPBB_INSTALLED") )
{
	//
	// Sorry this has already been installed can't do anything more with it
	//
	$template->assign_block_vars("error_install", array());
	$template->assign_vars(array(
		"L_ERROR_TITLE" => $lang['Installer_Error'],
		"L_ERROR" => $lang['Previous_Install'])
	);

	$template->pparse('body');
	exit;
}
else if( !empty($HTTP_POST_VARS['send_file']) )
{
	header("Content-Type: text/x-delimtext; name=\"config.php\"");
	header("Content-disposition: attachment; filename=config.php");

	if( get_magic_quotes_gpc() )
	{
		$HTTP_POST_VARS['config_data'] = stripslashes($HTTP_POST_VARS['config_data']);
	}

	echo $HTTP_POST_VARS['config_data'];

	exit;
}
else if( empty($install_step) || $admin_pass1 != $admin_pass2 || $dbhost == "" )
{
	//
	// Ok we haven't installed before so lets work our way through the various
	// steps of the install process.  This could turn out to be quite a lengty 
	// process.
	//

	//
	// Step 0 gather the pertinant info for database setup...
	// Namely dbms, dbhost, dbname, dbuser, and dbpasswd.
	//
	$instruction_text = $lang['Inst_Step_0'];

	if( $HTTP_POST_VARS['admin_pass1'] != $HTTP_POST_VARS['admin_pass2'] )
	{
		$instruction_text = $lang['Password_mismatch'] . '<br />' . $instruction_text;
	}

	$lang_options = language_select($language, 'language');

	$dbms_options = '<select name="dbms">';
	for($i = 0; $i < count($available_dbms); $i++)
	{
		$selected = ( $available_dbms[$i]['VALUE'] == $dbms ) ? "selected=\"selected\"" : "";
		$dbms_options .= '<option value="' . $available_dbms[$i]['VALUE'] . '">' . $available_dbms[$i]['LABEL'] . '</option>';
	}
	$dbms_options .= '</select>';

	$s_hidden_fields = '<input type="hidden" name="install_step" value="1" />';

	$template->assign_block_vars("stage_one_install", array());
	$template->assign_block_vars("common_install", array());

	$template->assign_vars(array(
		"L_INSTRUCTION_TEXT" => $instruction_text,
		"L_INITIAL_CONFIGURATION" => $lang['Initial_config'], 
		"L_DATABASE_CONFIGURATION" => $lang['DB_config'], 
		"L_ADMIN_CONFIGURATION" => $lang['Admin_config'], 
		"L_LANGUAGE" => $lang['Default_lang'], 
		"L_DBMS" => $lang['dbms'], 
		"L_DB_HOST" => $lang['DB_Host'], 
		"L_DB_NAME" => $lang['DB_Name'], 
		"L_DB_USER" => $lang['Database'] . ' ' . $lang['Username'], 
		"L_DB_PASSWORD" => $lang['Database'] . ' ' . $lang['Password'], 
		"L_DB_PREFIX" => $lang['Table_Prefix'], 

		"L_ADMIN_USERNAME" => $lang['Administrator'] . ' ' . $lang['Username'], 
		"L_ADMIN_PASSWORD" => $lang['Administrator'] . ' ' . $lang['Password'], 
		"L_ADMIN_CONFIRM_PASSWORD" => $lang['Confirm'] . ' ' . $lang['Password'], 

		"L_SUBMIT" => $lang['Start_Install'], 

		"DB_PREFIX" => ( $table_prefix != "" ) ? $table_prefix : "phpbb_", 
		"DB_HOST" => ( $dbhost != "" ) ? $dbhost : "", 
		"DB_USER" => ( $dbuser != "" ) ? $dbuser : "", 
		"DB_PASSWD" => ( $dbpasswd != "" ) ? $dbpasswd : "", 
		"ADMIN_USERNAME" => ( $admin_username != "" ) ? $admin_username : "", 

		"S_LANG_SELECT" => $lang_options, 
		"S_DBMS_SELECT" => $dbms_options, 
		"S_HIDDEN_FIELDS" => $s_hidden_fields, 
		"S_FORM_ACTION" => "install.$phpEx")
	);

//		"L_DOMAIN_NAME" => $lang['Domain_name'],
//		"L_DOMAIN_NAME_EXPLAIN" => $lang['Domain_name_explain'], 

	$template->pparse("body");

	exit();
}
else
{
	//
	// If the dbms is set to be odbc then we need to skip most of the 
	// steps and go straight to writing the config file.  We'll spit
	// out some additional instruction_textions later on what to do after installation
	// for the odbc DBMS.
	//
	if( ereg(':', $dbms) )
	{
		$dbms = explode(':', $dbms);
		$dbhost = $dbms[1] . ':' . $dbhost;
		$dbms = $dbms[0];
	}
	else if( isset($dbms) ) 
	{
		include($phpbb_root_path.'includes/db.'.$phpEx);
	}

	$dbms_schema = 'db/' . $dbms.'_schema.sql';
	$dbms_basic = 'db/' . $dbms . '_basic.sql';

	$remove_remarks = ( $dbms == 'mysql' ) ? 'remove_remarks' : 'remove_comments';
	$delimiter = ( $dbms == 'mssql' ) ? 'GO' : ';'; 

	if( $install_step == 1 )
	{
		if($dbms != 'odbc')
		{
			//
			// Ok we have the db info go ahead and read in the relevant schema
			// and work on building the table.. probably ought to provide some
			// kind of feedback to the user as we are working here in order
			// to let them know we are actually doing something.
			//
			$sql_query = @fread(@fopen($dbms_schema, 'r'), @filesize($dbms_schema));
			$sql_query = $remove_remarks($sql_query);
			$sql_query = split_sql_file($sql_query, $delimiter);
			$sql_count = count($sql_query);
			$sql_query = preg_replace('/phpbb_/', $table_prefix, $sql_query);
	
			for($i = 0; $i < $sql_count; $i++)
			{
				$result = $db->sql_query($sql_query[$i]);
				if( !$result )
				{
					$error = $db->sql_error();
	
					$template->assign_block_vars("error_install", array());
						$template->assign_vars(array(
						"L_ERROR_TITLE" => $lang['Installer_Error'],
						"L_ERROR" => $lang['Install_db_error'] . '<br>' . $error['message'])
					);
					$template->pparse('body');
					die();
				}
			}
	
			//
			// Ok tables have been built, let's fill in the basic information
			//
			$sql_query = @fread(@fopen($dbms_basic, 'r'), @filesize($dbms_basic));
			$sql_query = $remove_remarks($sql_query);
			$sql_query = split_sql_file($sql_query, $delimiter);
				$sql_count = count($sql_query);
			$sql_query = preg_replace('/phpbb_/', $table_prefix, $sql_query);
	
			for($i = 0; $i < $sql_count; $i++)
			{
				$result = $db->sql_query($sql_query[$i]);
				if( !$result )
				{
					$error = $db->sql_error();
	
					$template->assign_block_vars("error_install", array());
					$template->assign_vars(array(
						"L_ERROR_TITLE" => $lang['Installer_Error'],
						"L_ERROR" => $lang['Install_db_error'] . "<br />" . $error["message"])
					);
					$template->pparse('body');
					die();
				}
			}
			//
			// Ok at this point they have entered their admin password, let's go 
			// ahead and create the admin account with some basic default information
			// that they can customize later, and write out the config file.  After
			// this we are going to pass them over to the admin_forum.php script
			// to set up their forum defaults.
			//
			$error = "";
			//
			// Update the default admin user with their information.
			//
			$sql = "INSERT INTO " . $table_prefix . "config (config_name, config_value) 
				VALUES ('board_startdate', " . time() . ")";
			$result = $db->sql_query($sql);
			if( !$result )
			{
				$error .= "Could not insert board_startdate :: " . $sql . "<br /><br />";
			}

			$sql = "INSERT INTO " . $table_prefix . "config (config_name, config_value) 
				VALUES ('default_lang', '$language')";
			$result = $db->sql_query($sql);
			if( !$result )
			{
				$error .= "Could not insert default_lang :: " . $sql . "<br /><br />";
			}

			$sql = "UPDATE " . $table_prefix . "users 
				SET username = '$admin_name', user_password='" . md5($admin_pass1) . "', user_lang = '" . $language . "' 
				WHERE username = 'Admin'";
			$result = $db->sql_query($sql);
			if( !$result )
			{
				$error .= "Could not update admin info :: " . $sql . "<br /><br />";
			}

			$sql = "UPDATE " . $table_prefix . "users 
				SET user_regdate = " . time();
			$result = $db->sql_query($sql);
			if( !$result )
			{
				$error .= "Could not update user_regdate :: " . $sql . "<br /><br />";
			}

			if( $error != "" )
			{
				$error = $db->sql_error();

				$template->assign_block_vars("error_install", array());
				$template->assign_vars(array(
					"L_ERROR_TITLE" => $lang['Installer_Error'],
					"L_ERROR" => $lang['Install_db_error'] . '<br /><br />' . $error)
				);

				$template->pparse('body');
				exit;
			}
		}
		$template->assign_block_vars("common_install", array());
		//
		// Write out the config file.
		//
		$config_data = '<?php'."\n\n";
		$config_data .= "//\n// phpBB 2.x auto-generated config file\n// Do not change anything in this file!\n//\n\n";
		$config_data .= '$dbms = "' . $dbms . '";' . "\n\n";
		$config_data .= '$dbhost = "' . $dbhost . '";' . "\n";
		$config_data .= '$dbname = "' . $dbname . '";' . "\n";
		$config_data .= '$dbuser = "' . $dbuser . '";' . "\n";
		$config_data .= '$dbpasswd = "' . $dbpasswd . '";' . "\n\n";
		$config_data .= '$table_prefix = "' . $table_prefix . '";' . "\n\n";
		$config_data .= 'define(\'PHPBB_INSTALLED\', true);'."\n\n";	
		$config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused!

		@umask(0111);
		$no_open = FALSE;
		$fp = @fopen('config.php', 'w');
		if( !$fp )
		{
			//
			// Unable to open the file writeable do something here as an attempt
			// to get around that...
			//
			$s_hidden_fields = '<input type="hidden" name="config_data" value="' . htmlspecialchars($config_data) . '" />';
			$s_hidden_fields .= '<input type="hidden" name="send_file" value="1" />';			
			if ( $dbms == 'odbc' )
			{
				//
				// Output the instruction_textions for the odbc...
				//
				$template->assign_block_vars("common_install", array());
	
				$s_hidden_fields .= '<input type="hidden" name="install_step" value="3" />';
				$lang['Unwritable_config'] = $lang['ODBC_Instructs'] . '<br />' . $lang['Unwritable_config'];	
			}

			$template->assign_vars(array(
				"L_INSTRUCTION_TEXT" => $lang['Unwriteable_config'],
				"L_SUBMIT" => $lang['Download_config'],

				"S_HIDDEN_FIELDS" => $s_hidden_fields, 
				"S_FORM_ACTION" => "install.$phpEx")
			);

			$template->pparse('body');
			exit();
		}

		$result = @fputs($fp, $config_data, strlen($config_data));
		fclose($fp);

		//
		// Ok we are basically done with the install process let's go on 
		// and let the user configure their board now.
		// We are going to do this by calling the admin_board.php from the
		// normal board admin section.
		//
		$s_hidden_fields = '<input type="hidden" name="username" value="' . $admin_name . '" />';
		$s_hidden_fields .= '<input type="hidden" name="password" value="' . $admin_pass1 . '" />';
		$s_hidden_fields .= '<input type="hidden" name="forward_page" value="admin/" />';
		$s_hidden_fields .= '<input type="hidden" name="submit" value="Login" />';
		if ( $dbms == 'odbc' )
		{
			//
			// Output the instruction_textions for the odbc...
			//
			$lang['Inst_Step_2'] = $lang['ODBC_Instructs'] . '<br />' . $lang['Inst_Step_2'];
		}

		$template->assign_vars(array(
			"L_INSTRUCTION_TEXT" => $lang['Inst_Step_2'],
			"L_SUBMIT" => $lang['Finish_Install'],

			"S_HIDDEN_FIELDS" => $s_hidden_fields, 
			"S_FORM_ACTION" => "login.$phpEx")
		);
		
		$template->pparse('body');
		exit();
	}
}

?>