<?php
date_default_timezone_set('America/New_York');
/*
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

$header = "<html><head><title>VCL Setup Test Script</title>\n";
$header .= "<style type=\"text/css\">\n";
$header .= "ul {margin-top: 0;}\n";
$header .= "li {list-style-type: none;}\n";
$header .= ".pass {color: green;}\n";
$header .= ".fail {color: red;}\n";
$header .= ".title {font-weight: bold; font-style: italic;}\n";
$header .= "</style>\n";
$header .= "</head>\n";
if(isset($_GET['cookietest'])) {
	print $header;
	print "<body style=\"margin: 0; padding: 0;\">\n";
	if(isset($_COOKIE['cookietest']))
		print "<span class=pass>Successfully set a test cookie</span>\n";
	else
		print "<span class=fail>Failed to set a test cookie</span>\n";
	print "</body></html>\n";
	exit;
}
if(isset($_GET['includeconftest'])) {
	if(! is_readable('.ht-inc/conf.php')) {
		print "unreadable";
		exit;
	}
	if(include('.ht-inc/conf.php'))
		print 'worked';
	exit;
}
if(isset($_GET['includesecretstest'])) {
	if(! is_readable('.ht-inc/secrets.php')) {
		print "unreadable";
		exit;
	}
	if(include('.ht-inc/secrets.php'))
		print 'worked';
	exit;
}
$header .= "<body>\n";

function exHandler($errno, $errmsg) {
	print "Error: $errmsg<br>";
}
set_error_handler('exHandler');
function pass($msg) {
	print "<li><span class=pass>$msg</span></li>\n";
}

function fail($msg) {
	print "<li><span class=fail>$msg</span></li>\n";
}

function title($msg) {
	print "<span class=title>$msg ...</span><br>\n";
}

$myurl = "http://";
if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on")
	$myurl = "https://";
$myurl .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

$includesecrets = 1;
$includeconf = 1;

if(! ip2long(getHostbyname($_SERVER['HTTP_HOST']))) {
	print $header;
	# php version
	print "PHP version: " . phpversion() . "<br><br>\n";
	title("Trying to resolve my hostname ({$_SERVER['HTTP_HOST']})");
	print "<ul>\n";
	fail("unable to resolve my hostname; ensure {$_SERVER['HTTP_HOST']} is in DNS or create an entry for it in /etc/hosts");
	print "</ul>\n";
	$includesecrets = 0;
	$includeconf = 0;
}

# test including secrets.php
$allowurlopen = ini_get('allow_url_fopen');
if($includesecrets) {
	$data = '';
	if($fp = fopen("$myurl?includesecretstest=1", 'r')) {
		$data = fread($fp, 1000);
		fclose($fp);
	}
	if(preg_match('/parse error/i', $data))
		$data = '';
	if($allowurlopen && (empty($data) || $data == 'unreadable')) {
		print $header;
		# php version
		print "PHP version: " . phpversion() . "<br><br>\n";
		title("Including .ht-inc/secrets.php");
		print "<ul>\n";
		if($data == 'unreadable')
			fail("unable to read .ht-inc/secrets.php - check the permissions of the file");
		else
			fail("unable to include .ht-inc/secrets.php - this is probably due to a syntax error in .ht-inc/secrets.php");
		fail("skipping tests for contents of .ht-inc/secrets.php");
		print "</ul>\n";
		$includesecrets = 0;
		$includeconf = 0;
	}
}
else {
	title("Including .ht-inc/secrets.php");
	print "<ul>\n";
	fail("cannot include .ht-inc/secrets.php when hostname resolution fails");
	print "</ul>\n";
}

# conf.php test
if($includeconf) {
	$data = '';
	if($fp = fopen("$myurl?includeconftest=1", 'r')) {
		$data = fread($fp, 1000);
		fclose($fp);
	}
	if(preg_match('/parse error/i', $data)) {
		$data = '';
	}
	$allowurlopen = ini_get('allow_url_fopen');
	if($allowurlopen && (empty($data) || $data == 'unreadable')) {
		print $header;
		# php version
		print "PHP version: " . phpversion() . "<br><br>\n";
		title("Including .ht-inc/conf.php");
		print "<ul>\n";
		if($data == 'unreadable')
			fail("unable to read .ht-inc/conf.php - check the permissions of the file");
		else
			fail("unable to include .ht-inc/conf.php - this is probably due to a syntax error in .ht-inc/conf.php (or a file it includes)");
		fail("skipping tests for contents of .ht-inc/conf.php");
		print "</ul>\n";
		$includeconf = 0;
	}
}
else {
	title("Including .ht-inc/conf.php");
	print "<ul>\n";
	fail("cannot include .ht-inc/conf.php when including of .ht-inc/secrets.php fails");
	print "</ul>\n";
}

# conf.php tests
$createcryptkey = 0;
if($includeconf && include('.ht-inc/conf.php')) {
	$host = $_SERVER['HTTP_HOST'];
	if(! defined('COOKIEDOMAIN')) {
		print $header;
		# php version
		print "PHP version: " . phpversion() . "<br><br>\n";
		title("Including .ht-inc/conf.php");
		print "<ul>\n";
		pass("successfully included .ht-inc/conf.php");
		print "</ul>\n";
		title("Checking COOKIEDOMAIN setting in .ht-inc/conf.php");
		print "<ul>\n";
		fail("COOKIEDOMAIN is not defined in .ht-inc/conf.php");
		print "</ul>\n";
	}
	else {
		$len = strlen(COOKIEDOMAIN);
		if($len && substr_compare($host, COOKIEDOMAIN, 0 - $len, $len, true) != 0) {
			print $header;
			# php version
			print "PHP version: " . phpversion() . "<br><br>\n";
			title("Including .ht-inc/conf.php");
			print "<ul>\n";
			pass("successfully included .ht-inc/conf.php");
			print "</ul>\n";
			title("Checking COOKIEDOMAIN setting in .ht-inc/conf.php");
			print "<ul>\n";
			fail("COOKIEDOMAIN (" . COOKIEDOMAIN . ") does not match all of or ending of the hostname of this server ($host). This will prevent cookies from being set.");
			print "</ul>\n";
		}
		else {
			$expire = time() + 10;
			setcookie("cookietest", 1, $expire, '/', COOKIEDOMAIN);
			print $header;
			# php version
			print "PHP version: " . phpversion() . "<br><br>\n";
			title("Including .ht-inc/conf.php");
			print "<ul>\n";
			pass("successfully included .ht-inc/conf.php");
			print "</ul>\n";
			title("Checking COOKIEDOMAIN setting in .ht-inc/conf.php");
			print "<ul>\n";
			$test = COOKIEDOMAIN;
			if(empty($test))
				pass("COOKIEDOMAIN is set to empty string (this is valid and will result in the domain of cookies being set to $host)");
			else
				pass("COOKIEDOMAIN (" . COOKIEDOMAIN . ") appears to be set correctly");
			print "<iframe src=\"$myurl?cookietest=1\" width=200px height=20px scrolling=0 style=\"border: 0; padding: 0px\"></iframe><br>\n";
			print "</ul>\n";
		}
	}
	# check for BASEURL starting with https
	title("Checking that BASEURL in conf.php is set to use https");
	print "<ul>\n";
	if(! defined('BASEURL'))
		fail("BASEURL is not defined in .ht-inc/conf.php");
	else {
		if(substr_compare(BASEURL, 'https:', 0, 6, true) == 0)
			pass("BASEURL correctly set to use https");
		else
			fail("BASEURL is not set to use https. https is required.");
	}
	print "</ul>\n";

	# check for SCRIPT being set
	title("Checking that SCRIPT is set appropriately");
	print "<ul>\n";
	if(! defined('SCRIPT'))
		fail("SCRIPT is not defined in .ht-inc/conf.php");
	else {
		if(substr_compare(SCRIPT, '/', 0, 1, true) == 0 &&
		   substr_compare(SCRIPT, '.php', -4, 4, true) == 0)
			pass("SCRIPT appears to be set correctly");
		else
			fail("SCRIPT does not appear to be set correctly");
	}
	print "</ul>\n";

	# check various other constants
	title("Checking that other required constants are defined");
	print "<ul>\n";
	$consts = array('ONLINEDEBUG', 'HELPURL', 'HELPEMAIL', 'ERROREMAIL', 'ENVELOPESENDER', 'DEFAULTLOCALE', 'BASEURL', 'SCRIPT', 'HOMEURL', 'COOKIEDOMAIN', 'DEFAULTGROUP', 'DEFAULT_AFFILID', 'DAYSAHEAD', 'DEFAULT_PRIVNODE', 'SCHEDULER_ALLOCATE_RANDOM_COMPUTER', 'PRIV_CACHE_TIMEOUT', 'MIN_BLOCK_MACHINES', 'MAX_BLOCK_MACHINES', 'DOCUMENTATIONURL', 'USEFILTERINGSELECT', 'FILTERINGSELECTTHRESHOLD', 'SEMTIMEOUT', 'DEFAULTTHEME', 'HELPFAQURL', 'ALLOWADDSHIBUSERS', 'MAXINITIALIMAGINGTIME', 'MAXSUBIMAGES', 'NOAUTH_HOMENAV', 'QUERYLOGGING', 'XMLRPCLOGGING');
	$fails = array();
	foreach($consts as $const) {
		if(! defined("$const"))
			$fails[] = $const;
	}
	if(empty($fails))
		pass("All required constants are defined in .ht-inc/conf.php");
	else
		fail("The following constants need to be defined in .ht-inc/conf.php. Check conf-default.php for more information about each one.<br>" . implode("<br>\n", $fails));
	print "</ul>\n";

	# check for existance of maintenance directory
	title("Checking that .ht-inc/maintenance directory exists");
	print "<ul>\n";
	$file = preg_replace('|/testsetup.php|', '', $_SERVER['SCRIPT_FILENAME']);
	$file .= "/.ht-inc/maintenance";
	if(! is_dir($file))
		fail(".ht-inc/maintenance directory does not exist. Please create it.");
	else {
		pass(".ht-inc/maintenance directory exists");
		print "</ul>\n";
		# check that we can write files to maintenance directory
		title("Checking that .ht-inc/maintenance directory is writable");
		print "<ul>\n";
		if(! is_writable("$file"))
			fail("maintenance directory is not writable");
		else {
			if(! $fh = @fopen("$file/testfile", 'w'))
				fail("Failed to open file in maintenance directory");
			else {
				if(! fwrite($fh, 'test') || ! fclose($fh))
					fail("Failed to write to file in maintenance directory");
				else {
					# check that we can remove files from maintenance directory
					if(! unlink("$file/testfile"))
						fail("Failed to remove file from maintenance directory");
					else
						pass("maintenance directory is writable");
				}
			}
		}
	}
	print "</ul>\n";

	# check for existance of cryptkey directory
	title("Checking that .ht-inc/cryptkey directory exists");
	print "<ul>\n";
	$file = preg_replace('|/testsetup.php|', '', $_SERVER['SCRIPT_FILENAME']);
	$file .= "/.ht-inc/cryptkey";
	if(! is_dir($file))
		fail(".ht-inc/cryptkey directory does not exist. Please create it.");
	else {
		pass(".ht-inc/cryptkey directory exists");
		print "</ul>\n";
		# check that we can write files to cryptkey directory
		title("Checking that .ht-inc/cryptkey directory is writable");
		print "<ul>\n";
		if(! is_writable("$file"))
			fail("cryptkey directory is not writable");
		else {
			if(! $fh = @fopen("$file/testfile", 'w'))
				fail("Failed to open file in cryptkey directory");
			else {
				if(! fwrite($fh, 'test') || ! fclose($fh))
					fail("Failed to write to file in cryptkey directory");
				else {
					# check that we can remove files from cryptkey directory
					if(! unlink("$file/testfile"))
						fail("Failed to remove file from cryptkey directory");
					else {
						pass("cryptkey directory is writable");
						$createcryptkey = 1;
					}
				}
			}
		}
	}
	print "</ul>\n";
}

if($createcryptkey) {
	title("Checking asymmetric encryption key for this web server");
	print "<ul>\n";
	if(is_readable('.ht-inc/utils.php') && @(include '.ht-inc/utils.php') == TRUE) {
		global $aboarting;
		$aborting = 1; # set this so if abort function in utils.php is called, it just returns
		$file = preg_replace('|/testsetup.php|', '', $_SERVER['SCRIPT_FILENAME']);
		$filebase = $file . "/.ht-inc/cryptkey";
		$file1 = "$filebase/cryptkeyid";
		$file2 = "$filebase/private.pem";
		$exist = 0;
		if(is_readable("$file1") && is_readable("$file2"))
			$exist = 1;
		else
			print "<li>encryption key does not already exist - attempting to create</li>\n";
		$tmp = $_SERVER['SCRIPT_FILENAME'];
		$_SERVER['SCRIPT_FILENAME'] = str_replace('testsetup.php', 'index.php', $_SERVER['SCRIPT_FILENAME']);
		$actions = array('pages' => array());
		unset($_COOKIE['VCLAUTH']);
		dbConnect();
		initGlobals();
		checkCryptkey();
		dbDisconnect();
		$_SERVER['SCRIPT_FILENAME'] = $tmp;
		if(is_readable("$file1") && is_readable("$file2")) {
			if($exist)
				pass("Asymmetric key validated");
			else
				pass("Successfully created asymmetric encryption key");
		}
		else
			fail("Failed to create asymmetric encryption key");
	}
	else {
		fail("Failed to include .ht-inc/utils.php");
	}
	print "</ul>\n";
}

# required extentions
title("Testing for required php extensions");
if(version_compare(phpversion(), "5.2", "<"))
	$requiredexts = array('mysql', 'openssl', 'xml', 'xmlrpc', 'session', 'pcre', 'sockets', 'ldap', 'gettext');
else
	$requiredexts = array('mysql', 'openssl', 'xml', 'xmlrpc', 'session', 'pcre', 'sockets', 'ldap', 'json', 'gettext');
$exts = get_loaded_extensions();
$diff = array_diff($requiredexts, $exts);
print "<ul>\n";
if(count($diff)) {
	$missing = implode(', ', $diff);
	fail("Missing these extensions: $missing. Depending on the extension, some or all of VCL will not work.");
}
else
	pass("All required modules are installed");
if(! in_array('ldap', $exts)) {
	print "<li>NOTE: The <strong>ldap</strong> extension is only required if using LDAP authentication</li>\n";
}
print "</ul>\n";

# secrets.php file and mysql connection
if($includesecrets && include('.ht-inc/secrets.php')) {
	title("Checking values in .ht-inc/secrets.php");
	print "<ul>\n";
	$trymysqlconnect = 1;
	$allok = 1;
	if(empty($vclhost)) {
		fail("\$vclhost in .ht-inc/secrets.php is not set");
		$trymysqlconnect = 0;
		$allok = 0;
	}
	if(empty($vcldb)) {
		fail("\$vcldb in .ht-inc/secrets.php is not set");
		$trymysqlconnect = 0;
		$allok = 0;
	}
	if(empty($vclusername)) {
		fail("\$vclusername in .ht-inc/secrets.php is not set");
		$trymysqlconnect = 0;
		$allok = 0;
	}
	if(empty($vclpassword)) {
		fail("\$vclpassword in .ht-inc/secrets.php is not set");
		$trymysqlconnect = 0;
		$allok = 0;
	}
	if(empty($cryptkey)) {
		fail("\$cryptkey in .ht-inc/secrets.php is not set");
		$allok = 0;
	}
	elseif(function_exists('openssl_encrypt')) {
		$rc = base64_decode($cryptkey, 1);
		if($rc === FALSE) {
			fail("\$cryptkey in .ht-inc/secrets.php is not base64 encoded. Generate new value with <strong>openssl rand 32 | base64</strong>");
			$allok = 0;
		}
	}
	if(empty($pemkey)) {
		fail("\$pemkey in .ht-inc/secrets.php is not set");
		$allok = 0;
	}
	if($allok)
		pass("all required values in .ht-inc/secrets.php appear to be set");
	print "</ul>\n";
	if($trymysqlconnect && in_array('mysql', $exts) && in_array('sockets', $exts)) {
		title("Testing mysql connection");
		print "<ul>\n";
		if($fp = fsockopen($vclhost, 3306, $errno, $errstr, 5)) {
			$link = mysql_connect($vclhost, $vclusername, $vclpassword);
			if(! $link)
				fail("Could not connect to mysql on $vclhost");
			else {
				pass("Successfully connected to mysql on $vclhost");
				if(mysql_select_db($vcldb, $link))
					pass("Successfully selected database ($vcldb) on $vclhost");
				else
					fail("Could not select database ($vcldb) on $vclhost");
			}
		}
		else
			fail("Could not connect to port 3306 on $vclhost");
		print "</ul>\n";
	}
}

# test symmetric encryption
title("Testing symmetric encryption");
if(function_exists('openssl_encrypt')) {
	print "<ul>\n";
	if($includesecrets && ! empty($cryptkey)) {
		$teststring = 'testing';
		$iv = openssl_random_pseudo_bytes(16);
		$mode = "AES-256-CBC";
		if($cryptdata = openssl_encrypt($teststring, $mode, $cryptkey, 1, $iv)) {
			pass("Successfully encrypted test string");
			$decrypted = openssl_decrypt($cryptdata, $mode, $cryptkey, 1, $iv);
			if(trim($decrypted) == $teststring)
				pass("Successfully decrypted test string");
			else
				fail("Failed to decrypt test string");
		}
		else {
			fail("Failed to encrypt data");
		}
	}
	else
		fail("Cannot test encryption without \$cryptkey from .ht-inc/secrets.php");
	print "</ul>\n";
}
else {
	require_once(".ht-inc/phpseclib/Crypt/AES.php");
	print "<ul>\n";
	if($includesecrets && ! empty($cryptkey)) {
		$teststring = 'testing';
		$aes = new Crypt_AES(CRYPT_AES_MODE_CBC);
		$aes->setKeyLength(256);
		$iv = crypt_random_string(16);
		$aes->setIV($iv);
		$aes->setKey($cryptkey);
		if($cryptdata = $aes->encrypt($teststring)) {
			pass("Successfully encrypted test string");
			$decrypted = $aes->decrypt($cryptdata);
			if(trim($decrypted) == $teststring)
				pass("Successfully decrypted test string");
			else
				fail("Failed to decrypt test string");
		}
		else {
			fail("Failed to encrypt data");
		}
	}
	else
		fail("Cannot test encryption without \$cryptkey from .ht-inc/secrets.php");
	print "</ul>\n";
}

# encryption keys
$privkeyok = 0;
$pubkeyok = 0;
if(in_array('openssl', $exts)) {
	title("Testing asymmetric encryption key files");
	print "<ul>\n";
	if($includesecrets && ! empty($pemkey)) {
		if(is_readable(".ht-inc/keys.pem")) {
			$fp = fopen(".ht-inc/keys.pem", "r");
			$key = fread($fp, 8192);
			fclose($fp);
			$keys["private"] = openssl_pkey_get_private($key, $pemkey);
			if(! $keys['private'])
				fail("Could not create private key from private key file (.ht-inc/keys.pem). Try running .ht-inc/genkeys.sh again.");
			else {
				pass("successfully created private key from private key file");
				$privkeyok = 1;
			}
		}
		else
			fail("Could not read private key file (.ht-inc/keys.pem). Check permissions on the file.");
	}
	else
		fail("Cannot test private key file without \$pemkey from .ht-inc/secrets.php");

	if(is_readable(".ht-inc/pubkey.pem")) {
		$fp = fopen(".ht-inc/pubkey.pem", "r");
		$key = fread($fp, 8192);
		fclose($fp);
		$keys["public"] = openssl_pkey_get_public($key);
		if(! $keys['public'])
			fail("Could not create public key from public key file (.ht-inc/pubkey.pem). Try running .ht-inc/genkeys.sh again.");
		else {
			pass("successfully created public key from public key file");
			$pubkeyok = 1;
		}
	}
	else
		fail("Could not read public key file (.ht-inc/pubkey.pem). Check permissions on the file.");
	print "</ul>\n";

	title("Testing asymmetric encryption");
	print "<ul>\n";
	if(! $privkeyok)
		fail("cannot test encryption without a valid private key");
	else {
		if(openssl_private_encrypt('test string', $cryptdata, $keys["private"])) {
			pass("successfully encrypted test string");
			if(! $pubkeyok)
				fail("cannot test decryption without a valid public key");
			else {
				if(openssl_public_decrypt($cryptdata, $tmp, $keys['public'])) {
					if($tmp == 'test string')
						pass("successfully decrypted test string");
					else
						fail("failed to decrypt test string");
				}
				else
					fail("failed to decrypt test string");
			}
		}
		else
			fail("failed to encrypt test data");
	}
	print "</ul>\n";
}


# check dojo directories
title("Testing for existance of dojo directory");
print "<ul>\n";
if(is_dir('./dojo')) {
	pass("dojo directory exists");
	if(is_readable('./dojo'))
		pass("dojo directory is readable");
	else
		fail("dojo directory is not readable. Check permissions on this directory");
}
else
	fail("dojo directory does not exist. Download and install Dojo Toolkit 1.6.5");
print "</ul>\n";


# check for spyc
title("Testing for existance of spyc 0.5.1 and Spyc.php");
print "<ul>\n";
if(is_dir('./.ht-inc/spyc-0.5.1')) {
	pass("spyc directory exists");
	if(is_readable('./.ht-inc/spyc-0.5.1')) {
		pass("spyc directory is readable");
		if(is_file('./.ht-inc/spyc-0.5.1/Spyc.php')) {
			pass(".ht-inc/spyc-0.5.1/Spyc.php file exists");
			if(is_readable('.ht-inc/spyc-0.5.1/Spyc.php'))
				pass(".ht-inc/spyc-0.5.1/Spyc.php is readable");
			else
				fail(".ht-inc/spyc-0.5.1/Spyc.php is not readable. Check permissions on the file.");
		}
		else
			fail(".ht-inc/spyc-0.5.1/Spyc.php file does not exist.  Reinstall Spyc 0.5.1");
	}
	else
		fail("spyc-0.5.1 directory is not readable. Check permissions on this directory");
}
else
	fail(".ht-inc/spyc-0.5.1 directory does not exist. Download and install Spyc 0.5.1");
print "</ul>\n";

# check themes directories for dojo content having been copied in
title("Checking themes for dojo css");
print "<ul>\n";
$themes = scandir('themes');
foreach($themes as $theme) {
	if($theme == '.' || $theme == '..' || $theme == 'copydojocss.sh')
		continue;
	if(is_dir("themes/$theme/css/dojo") && is_file("themes/$theme/css/dojo/{$theme}.css"))
		pass("themes/$theme has had dojo css copied to it");
	else
		fail("themes/$theme is missing dojo css. Run themes/copydojocss.sh from the themes directory to correct this if you want to use this theme.");
}
print "</ul>\n";

# php display errors
title("Checking value of PHP display_errors");
$a = ini_get('display_errors');
print "<ul>\n";
if($a == 'Off' || $a == 'off' || $a == '')
	print "<li>display_errors: <strong>disabled</strong></li>\n";
elseif($a == 'On' || $a == 'on' || $a == 1)
	print "<li>display_errors: <strong>enabled</strong></li>\n";
else
	fail("failed to determine value of display_errors");
?>
<li>NOTE: Displaying errors in a production system is a security risk; however,<br>
while getting VCL up and running, having them displayed makes debugging<br>
a little easier. Edit your php.ini file to modify this setting.</li>
</ul>
<?php

print "Done";

print "</body></html>\n";
?>
