<?php
/**
 * This script generates a SQLite database for a MediaWiki version 1.19.0
 * You must specify the login of the admin (argument 1) and its
 * password (argument 2) and the folder where the database file
 * is located (absolute path in argument 3).
 * It is used by the script install-wiki.sh in order to make easy the
 * installation of a MediaWiki.
 *
 * In order to generate a SQLite database file, MediaWiki ask the user
 * to submit some forms in its web browser. This script simulates this
 * behavior though the functions <get> and <submit>
 *
 */
$argc = $_SERVER['argc'];
$argv = $_SERVER['argv'];

$login = $argv[2];
$pass = $argv[3];
$tmp = $argv[4];
$port = $argv[5];

$url = 'http://localhost:'.$port.'/wiki/mw-config/index.php';
$db_dir = urlencode($tmp);
$tmp_cookie = tempnam($tmp, "COOKIE_");
/*
 * Fetches a page with cURL.
 */
function get($page_name = "") {
	$curl = curl_init();
	$page_name_add = "";
	if ($page_name != "") {
		$page_name_add = '?page='.$page_name;
	}
	$url = $GLOBALS['url'].$page_name_add;
	$tmp_cookie = $GLOBALS['tmp_cookie'];
	curl_setopt($curl, CURLOPT_COOKIEJAR, $tmp_cookie);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_COOKIEFILE, $tmp_cookie);
	curl_setopt($curl, CURLOPT_HEADER, true);
	curl_setopt($curl, CURLOPT_URL, $url);

	$page = curl_exec($curl);
	if (!$page) {
		die("Could not get page: $url\n");
	}
	curl_close($curl);
	return $page;
}

/*
 * Submits a form with cURL.
 */
function submit($page_name, $option = "") {
	$curl = curl_init();
	$datapost = 'submit-continue=Continue+%E2%86%92';
	if ($option != "") {
		$datapost = $option.'&'.$datapost;
	}
	$url = $GLOBALS['url'].'?page='.$page_name;
	$tmp_cookie = $GLOBALS['tmp_cookie'];
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $datapost);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_COOKIEJAR, $tmp_cookie);
	curl_setopt($curl, CURLOPT_COOKIEFILE, $tmp_cookie);

	$page = curl_exec($curl);
	if (!$page) {
		die("Could not get page: $url\n");
	}
	curl_close($curl);
	return "$page";
}

/*
 * Here starts this script: simulates the behavior of the user
 * submitting forms to generates the database file.
 * Note this simulation was made for the MediaWiki version 1.19.0,
 * we can't assume it works with other versions.
 *
 */

$page = get();
if (!preg_match('/input type="hidden" value="([0-9]+)" name="LanguageRequestTime"/',
		$page, $matches)) {
	echo "Unexpected content for page downloaded:\n";
	echo "$page";
	die;
};
$timestamp = $matches[1];
$language = "LanguageRequestTime=$timestamp&uselang=en&ContLang=en";
$page = submit('Language', $language);

submit('Welcome');

$db_config = 'DBType=sqlite';
$db_config = $db_config.'&sqlite_wgSQLiteDataDir='.$db_dir;
$db_config = $db_config.'&sqlite_wgDBname='.$argv[1];
submit('DBConnect', $db_config);

$wiki_config = 'config_wgSitename=TEST';
$wiki_config = $wiki_config.'&config__NamespaceType=site-name';
$wiki_config = $wiki_config.'&config_wgMetaNamespace=MyWiki';
$wiki_config = $wiki_config.'&config__AdminName='.$login;

$wiki_config = $wiki_config.'&config__AdminPassword='.$pass;
$wiki_config = $wiki_config.'&config__AdminPassword2='.$pass;

$wiki_config = $wiki_config.'&wiki__configEmail=email%40email.org';
$wiki_config = $wiki_config.'&config__SkipOptional=skip';
submit('Name', $wiki_config);
submit('Install');
submit('Install');

unlink($tmp_cookie);
?>
