Add PHP's xml module check and upload limits to setup.

And some documentation.
This commit is contained in:
Klaus Weidenbach 2015-05-24 01:34:08 +02:00
parent 7f9e4d6add
commit e90c331bf6
2 changed files with 315 additions and 260 deletions

View File

@ -1,43 +1,38 @@
<?php /** @file */ <?php
/** /**
* @file index.php
* *
* Red Matrix * @brief The main entry point to the application.
* *
* Bootstrap the application, load configuration, load modules, load theme, etc.
*/ */
/** /*
*
* bootstrap the application * bootstrap the application
*
*/ */
require_once('boot.php'); require_once('boot.php');
// our global App object
$a = new App; $a = new App;
/** /*
*
* Load the configuration file which contains our DB credentials. * Load the configuration file which contains our DB credentials.
* Ignore errors. If the file doesn't exist or is empty, we are running in installation mode.' * Ignore errors. If the file doesn't exist or is empty, we are running in
* * installation mode.
*/ */
$a->install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false : true); $a->install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false : true);
@include(".htconfig.php"); @include('.htconfig.php');
$a->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC'); $a->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
date_default_timezone_set($a->timezone); date_default_timezone_set($a->timezone);
/** /*
*
* Try to open the database; * Try to open the database;
*
*/ */
require_once("include/dba/dba_driver.php"); require_once('include/dba/dba_driver.php');
if(! $a->install) { if(! $a->install) {
$db = dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data, $db_type, $a->install); $db = dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data, $db_type, $a->install);
@ -51,7 +46,7 @@ if(! $a->install) {
load_config('system'); load_config('system');
load_config('feature'); load_config('feature');
require_once("include/session.php"); require_once('include/session.php');
load_hooks(); load_hooks();
call_hooks('init_1'); call_hooks('init_1');
@ -114,8 +109,7 @@ if((x($_GET,'zid')) && (! $a->install)) {
} }
if((x($_SESSION, 'authenticated')) || (x($_POST, 'auth-params')) || ($a->module === 'login')) if((x($_SESSION, 'authenticated')) || (x($_POST, 'auth-params')) || ($a->module === 'login'))
require("include/auth.php"); require('include/auth.php');
if(! x($_SESSION, 'sysmsg')) if(! x($_SESSION, 'sysmsg'))
$_SESSION['sysmsg'] = array(); $_SESSION['sysmsg'] = array();
@ -170,7 +164,6 @@ $a->set_apps($arr['app_menu']);
if(strlen($a->module)) { if(strlen($a->module)) {
/** /**
* *
* We will always have a module name. * We will always have a module name.
@ -184,7 +177,6 @@ if(strlen($a->module)) {
$a->module_loaded = true; $a->module_loaded = true;
} }
if((strpos($a->module,'admin') === 0) && (! is_site_admin())) { if((strpos($a->module,'admin') === 0) && (! is_site_admin())) {
$a->module_loaded = false; $a->module_loaded = false;
notice( t('Permission denied.') . EOL); notice( t('Permission denied.') . EOL);
@ -197,7 +189,6 @@ if(strlen($a->module)) {
*/ */
if(! $a->module_loaded) { if(! $a->module_loaded) {
if(file_exists("mod/site/{$a->module}.php")) { if(file_exists("mod/site/{$a->module}.php")) {
include_once("mod/site/{$a->module}.php"); include_once("mod/site/{$a->module}.php");
$a->module_loaded = true; $a->module_loaded = true;
@ -210,7 +201,6 @@ if(strlen($a->module)) {
/** /**
*
* The URL provided does not resolve to a valid module. * The URL provided does not resolve to a valid module.
* *
* On Dreamhost sites, quite often things go wrong for no apparent reason and they send us to '/internal_error.html'. * On Dreamhost sites, quite often things go wrong for no apparent reason and they send us to '/internal_error.html'.
@ -219,7 +209,6 @@ if(strlen($a->module)) {
* this will often succeed and eventually do the right thing. * this will often succeed and eventually do the right thing.
* *
* Otherwise we are going to emit a 404 not found. * Otherwise we are going to emit a 404 not found.
*
*/ */
if(! $a->module_loaded) { if(! $a->module_loaded) {
@ -235,12 +224,13 @@ if(strlen($a->module)) {
} }
logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG); logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG);
header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found')); header($_SERVER['SERVER_PROTOCOL'] . ' 404 ' . t('Not Found'));
$tpl = get_markup_template("404.tpl"); $tpl = get_markup_template('404.tpl');
$a->page['content'] = replace_macros($tpl, array( $a->page['content'] = replace_macros($tpl, array(
'$message' => t('Page not found.') '$message' => t('Page not found.')
)); ));
// pretend this is a module so it will initialise the theme.
// pretend this is a module so it will initialise the theme
$a->module = '404'; $a->module = '404';
$a->module_loaded = true; $a->module_loaded = true;
} }
@ -253,7 +243,6 @@ if(! x($a->page,'content'))
$a->page['content'] = ''; $a->page['content'] = '';
if(! ($a->module === 'setup')) { if(! ($a->module === 'setup')) {
/* set JS cookie */ /* set JS cookie */
if($_COOKIE['jsAvailable'] != 1) { if($_COOKIE['jsAvailable'] != 1) {
@ -263,12 +252,12 @@ if(! ($a->module === 'setup')) {
$_COOKIE['jsAvailable'] = 1; $_COOKIE['jsAvailable'] = 1;
} }
} }
call_hooks('page_content_top', $a->page['content']); call_hooks('page_content_top', $a->page['content']);
} }
/** /**
* Call module functions * Call module functions
*/ */
@ -310,7 +299,7 @@ if($a->module_loaded) {
* load current theme info * load current theme info
*/ */
$theme_info_file = "view/theme/".current_theme()."/php/theme.php"; $theme_info_file = 'view/theme/' . current_theme() . '/php/theme.php';
if (file_exists($theme_info_file)){ if (file_exists($theme_info_file)){
require_once($theme_info_file); require_once($theme_info_file);
} }
@ -319,10 +308,10 @@ if($a->module_loaded) {
$func = str_replace('-', '_', current_theme()) . '_init'; $func = str_replace('-', '_', current_theme()) . '_init';
$func($a); $func($a);
} }
elseif (x($a->theme_info,"extends") && file_exists("view/theme/".$a->theme_info["extends"]."/php/theme.php")) { elseif (x($a->theme_info, 'extends') && file_exists('view/theme/' . $a->theme_info['extends'] . '/php/theme.php')) {
require_once("view/theme/".$a->theme_info["extends"]."/php/theme.php"); require_once('view/theme/' . $a->theme_info['extends'] . '/php/theme.php');
if(function_exists(str_replace('-','_',$a->theme_info["extends"]) . '_init')) { if(function_exists(str_replace('-', '_', $a->theme_info['extends']) . '_init')) {
$func = str_replace('-','_',$a->theme_info["extends"]) . '_init'; $func = str_replace('-', '_', $a->theme_info['extends']) . '_init';
$func($a); $func($a);
} }
} }
@ -335,7 +324,6 @@ if($a->module_loaded) {
$func($a); $func($a);
} }
if(! $a->error) { if(! $a->error) {
// If a theme has defined an _aside() function, run that first // If a theme has defined an _aside() function, run that first
// //
@ -373,24 +361,25 @@ if($a->module_loaded) {
call_hooks($a->module . '_mod_aftercontent', $arr); call_hooks($a->module . '_mod_aftercontent', $arr);
$a->page['content'] .= $arr['content']; $a->page['content'] .= $arr['content'];
} }
} }
// If you're just visiting, let javascript take you home // If you're just visiting, let javascript take you home
if(x($_SESSION,'visitor_home')) if(x($_SESSION, 'visitor_home')) {
$homebase = $_SESSION['visitor_home']; $homebase = $_SESSION['visitor_home'];
elseif(local_channel()) } elseif(local_channel()) {
$homebase = $a->get_baseurl() . '/channel/' . $a->channel['channel_address']; $homebase = $a->get_baseurl() . '/channel/' . $a->channel['channel_address'];
}
if(isset($homebase)) if(isset($homebase)) {
$a->page['content'] .= '<script>var homebase = "' . $homebase . '";</script>'; $a->page['content'] .= '<script>var homebase = "' . $homebase . '";</script>';
}
// now that we've been through the module content, see if the page reported // now that we've been through the module content, see if the page reported
// a permission problem and if so, a 403 response would seem to be in order. // a permission problem and if so, a 403 response would seem to be in order.
if(stristr(implode("", $_SESSION['sysmsg']), t('Permission denied'))) { if(stristr(implode("", $_SESSION['sysmsg']), t('Permission denied'))) {
header($_SERVER["SERVER_PROTOCOL"] . ' 403 ' . t('Permission denied.')); header($_SERVER['SERVER_PROTOCOL'] . ' 403 ' . t('Permission denied.'));
} }

View File

@ -1,8 +1,19 @@
<?php <?php
/**
* @file mod/setup.php
*
* Controller for the initial setup/installation.
*
* @todo This setup module could need some love and improvements.
*/
$install_wizard_pass = 1; $install_wizard_pass = 1;
/**
* @brief Initialisation for the setup module.
*
* @param[in,out] App &$a
*/
function setup_init(&$a){ function setup_init(&$a){
// Ensure that if somebody hasn't read the install documentation and doesn't have all // Ensure that if somebody hasn't read the install documentation and doesn't have all
@ -17,24 +28,26 @@ function setup_init(&$a){
// throw a white screen because these error messages divulge information which can // throw a white screen because these error messages divulge information which can
// potentially be useful to hackers. // potentially be useful to hackers.
error_reporting(E_ERROR | E_WARNING | E_PARSE ); error_reporting(E_ERROR | E_WARNING | E_PARSE );
ini_set('log_errors', '0'); ini_set('log_errors', '0');
ini_set('display_errors', '1'); ini_set('display_errors', '1');
// $baseurl/setup/testrwrite to test if rewite in .htaccess is working // $baseurl/setup/testrwrite to test if rewite in .htaccess is working
if (argc() == 2 && argv(1) == "testrewrite") { if (argc() == 2 && argv(1) == "testrewrite") {
echo "ok"; echo 'ok';
killme(); killme();
} }
global $install_wizard_pass; global $install_wizard_pass;
if (x($_POST, 'pass')) if (x($_POST, 'pass'))
$install_wizard_pass = intval($_POST['pass']); $install_wizard_pass = intval($_POST['pass']);
} }
/**
* @brief Handle the actions of the different setup steps.
*
* @param[in,out] App &$a
*/
function setup_post(&$a) { function setup_post(&$a) {
global $install_wizard_pass, $db; global $install_wizard_pass, $db;
@ -58,8 +71,9 @@ function setup_post(&$a) {
require_once('include/dba/dba_driver.php'); require_once('include/dba/dba_driver.php');
unset($db); unset($db);
$db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true); $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
if(! $db->connected) { if(! $db->connected) {
echo "Database Connect failed: " . $db->error; echo 'Database Connect failed: ' . $db->error;
killme(); killme();
$a->data['db_conn_failed']=true; $a->data['db_conn_failed']=true;
} }
@ -101,7 +115,6 @@ function setup_post(&$a) {
$adminmail = notags(trim($_POST['adminmail'])); $adminmail = notags(trim($_POST['adminmail']));
$siteurl = notags(trim($_POST['siteurl'])); $siteurl = notags(trim($_POST['siteurl']));
if($siteurl != z_root()) { if($siteurl != z_root()) {
$test = z_fetch_url($siteurl."/setup/testrewrite"); $test = z_fetch_url($siteurl."/setup/testrewrite");
if((! $test['success']) || ($test['body'] != 'ok')) { if((! $test['success']) || ($test['body'] != 'ok')) {
@ -158,15 +171,21 @@ function get_db_errno() {
return mysql_errno(); return mysql_errno();
} }
/**
* @brief Get output for the setup page.
*
* Depending on the state we are currently in it returns different content.
*
* @param App &$a
* @return string parsed HTML output
*/
function setup_content(&$a) { function setup_content(&$a) {
global $install_wizard_pass, $db; global $install_wizard_pass, $db;
$o = ''; $o = '';
$wizard_status = ""; $wizard_status = '';
$install_title = t('$Projectname Server - Setup'); $install_title = t('$Projectname Server - Setup');
if(x($a->data, 'db_conn_failed')) { if(x($a->data, 'db_conn_failed')) {
$install_wizard_pass = 2; $install_wizard_pass = 2;
$wizard_status = t('Could not connect to database.'); $wizard_status = t('Could not connect to database.');
@ -182,21 +201,18 @@ function setup_content(&$a) {
$install_wizard_pass = 2; $install_wizard_pass = 2;
$wizard_status = t('Could not create table.'); $wizard_status = t('Could not create table.');
} }
$db_return_text = '';
$db_return_text="";
if(x($a->data, 'db_installed')) { if(x($a->data, 'db_installed')) {
$txt = '<p style="font-size: 130%;">'; $txt = '<p style="font-size: 130%;">';
$txt .= t('Your site database has been installed.') . EOL; $txt .= t('Your site database has been installed.') . EOL;
$db_return_text .= $txt; $db_return_text .= $txt;
} }
if(x($a->data, 'db_failed')) { if(x($a->data, 'db_failed')) {
$txt = t('You may need to import the file "install/schema_xxx.sql" manually using a database client.') . EOL; $txt = t('You may need to import the file "install/schema_xxx.sql" manually using a database client.') . EOL;
$txt .= t('Please see the file "install/INSTALL.txt".') . EOL ."<hr>" ; $txt .= t('Please see the file "install/INSTALL.txt".') . EOL ."<hr>" ;
$txt .= "<pre>".$a->data['db_failed'] . "</pre>". EOL ; $txt .= "<pre>".$a->data['db_failed'] . "</pre>". EOL ;
$db_return_text .= $txt; $db_return_text .= $txt;
} }
if($db && $db->connected) { if($db && $db->connected) {
$r = q("SELECT COUNT(*) as `total` FROM `account`"); $r = q("SELECT COUNT(*) as `total` FROM `account`");
if($r && count($r) && $r[0]['total']) { if($r && count($r) && $r[0]['total']) {
@ -218,7 +234,7 @@ function setup_content(&$a) {
$tpl = get_markup_template('install.tpl'); $tpl = get_markup_template('install.tpl');
return replace_macros($tpl, array( return replace_macros($tpl, array(
'$title' => $install_title, '$title' => $install_title,
'$pass' => "", '$pass' => '',
'$text' => $db_return_text . what_next(), '$text' => $db_return_text . what_next(),
)); ));
} }
@ -226,7 +242,6 @@ function setup_content(&$a) {
switch ($install_wizard_pass){ switch ($install_wizard_pass){
case 1: { // System check case 1: { // System check
$checks = array(); $checks = array();
check_funcs($checks); check_funcs($checks);
@ -244,17 +259,18 @@ function setup_content(&$a) {
check_php($phpath, $checks); check_php($phpath, $checks);
check_phpconfig($checks);
check_htaccess($checks); check_htaccess($checks);
function check_passed($v, $c) { function check_passed($v, $c) {
if ($c['required']) if ($c['required'])
$v = $v && $c['status']; $v = $v && $c['status'];
return $v; return $v;
} }
$checkspassed = array_reduce($checks, "check_passed", true); $checkspassed = array_reduce($checks, "check_passed", true);
$tpl = get_markup_template('install_checks.tpl'); $tpl = get_markup_template('install_checks.tpl');
$o .= replace_macros($tpl, array( $o .= replace_macros($tpl, array(
'$title' => $install_title, '$title' => $install_title,
@ -282,7 +298,6 @@ function setup_content(&$a) {
$adminmail = notags(trim($_POST['adminmail'])); $adminmail = notags(trim($_POST['adminmail']));
$siteurl = notags(trim($_POST['siteurl'])); $siteurl = notags(trim($_POST['siteurl']));
$tpl = get_markup_template('install_db.tpl'); $tpl = get_markup_template('install_db.tpl');
$o .= replace_macros($tpl, array( $o .= replace_macros($tpl, array(
'$title' => $install_title, '$title' => $install_title,
@ -303,7 +318,6 @@ function setup_content(&$a) {
'$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')), '$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
'$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')), '$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
'$lbl_10' => t('Please select a default timezone for your website'), '$lbl_10' => t('Please select a default timezone for your website'),
'$baseurl' => $a->get_baseurl(), '$baseurl' => $a->get_baseurl(),
@ -311,7 +325,6 @@ function setup_content(&$a) {
'$phpath' => $phpath, '$phpath' => $phpath,
'$submit' => t('Submit'), '$submit' => t('Submit'),
)); ));
return $o; return $o;
}; break; }; break;
@ -333,7 +346,6 @@ function setup_content(&$a) {
$o .= replace_macros($tpl, array( $o .= replace_macros($tpl, array(
'$title' => $install_title, '$title' => $install_title,
'$pass' => t('Site settings'), '$pass' => t('Site settings'),
'$status' => $wizard_status, '$status' => $wizard_status,
'$dbhost' => $dbhost, '$dbhost' => $dbhost,
@ -348,39 +360,44 @@ function setup_content(&$a) {
'$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')), '$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
'$timezone' => array('timezone', t('Please select a default timezone for your website'), $timezone, '', get_timezones()), '$timezone' => array('timezone', t('Please select a default timezone for your website'), $timezone, '', get_timezones()),
'$baseurl' => $a->get_baseurl(), '$baseurl' => $a->get_baseurl(),
'$submit' => t('Submit'), '$submit' => t('Submit'),
)); ));
return $o; return $o;
}; break; }; break;
} }
} }
/** /**
* checks : array passed to template * @brief Add a check result to the array for output.
* title : string *
* status : boolean * @param[in,out] array &$checks array passed to template
* required : boolean * @param string $title a title for the check
* help : string optional * @param boolean $status
* @param boolean $required
* @param[optional] string $help optional help string
*/ */
function check_add(&$checks, $title, $status, $required, $help){ function check_add(&$checks, $title, $status, $required, $help = '') {
$checks[] = array( $checks[] = array(
'title' => $title, 'title' => $title,
'status' => $status, 'status' => $status,
'required' => $required, 'required' => $required,
'help' => $help, 'help' => $help
); );
} }
/**
* @brief Checks the PHP environment.
*
* @param[in,out] string &$phpath
* @param[out] array &$checks
*/
function check_php(&$phpath, &$checks) { function check_php(&$phpath, &$checks) {
$help = '';
if (strlen($phpath)) { if (strlen($phpath)) {
$passed = file_exists($phpath); $passed = file_exists($phpath);
} else { } else {
@ -388,18 +405,19 @@ function check_php(&$phpath, &$checks) {
$phpath = trim(shell_exec('where php')); $phpath = trim(shell_exec('where php'));
else else
$phpath = trim(shell_exec('which php')); $phpath = trim(shell_exec('which php'));
$passed = strlen($phpath); $passed = strlen($phpath);
} }
$help = "";
if(!$passed) { if(!$passed) {
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL; $help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
$help .= t("If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron.") . EOL; $help .= t('If you don\'t have a command line version of PHP installed on server, you will not be able to run background polling via cron.') . EOL;
$help .= EOL . EOL ; $help .= EOL . EOL ;
$tpl = get_markup_template('field_input.tpl'); $tpl = get_markup_template('field_input.tpl');
$help .= replace_macros($tpl, array( $help .= replace_macros($tpl, array(
'$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable. You can leave this blank to continue the installation.')), '$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable. You can leave this blank to continue the installation.')),
)); ));
$phpath=""; $phpath = '';
} }
check_add($checks, t('Command line PHP').($passed?" (<tt>$phpath</tt>)":""), $passed, false, $help); check_add($checks, t('Command line PHP').($passed?" (<tt>$phpath</tt>)":""), $passed, false, $help);
@ -409,28 +427,56 @@ function check_php(&$phpath, &$checks) {
$cmd = "$phpath install/testargs.php $str"; $cmd = "$phpath install/testargs.php $str";
$result = trim(shell_exec($cmd)); $result = trim(shell_exec($cmd));
$passed2 = $result == $str; $passed2 = $result == $str;
$help = ""; $help = '';
if(!$passed2) { if(!$passed2) {
$help .= t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL; $help .= t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL;
$help .= t('This is required for message delivery to work.'); $help .= t('This is required for message delivery to work.');
} }
check_add($checks, t('PHP register_argc_argv'), $passed, true, $help); check_add($checks, t('PHP register_argc_argv'), $passed, true, $help);
} }
} }
function check_keys(&$checks) { /**
* @brief Some PHP configuration checks.
*
* @todo Change how we display such informational text. Add more description
* how to change them.
*
* @param[out] array &$checks
*/
function check_phpconfig(&$checks) {
require_once 'include/environment.php';
$help = ''; $help = '';
$result = getPhpiniUploadLimits();
$help = sprintf(t('Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.'),
userReadableSize($result['post_max_size']),
userReadableSize($result['max_upload_filesize']),
$result['max_file_uploads']
);
$help .= '<br>' . t('You can adjust these settings in the servers php.ini.');
check_add($checks, t('PHP upload limits'), true, false, $help);
}
/**
* @brief Check if the openssl implementation can generate keys.
*
* @param[out] array $checks
*/
function check_keys(&$checks) {
$help = '';
$res = false; $res = false;
if(function_exists('openssl_pkey_new')) if (function_exists('openssl_pkey_new')) {
$res = openssl_pkey_new(array( $res = openssl_pkey_new(array(
'digest_alg' => 'sha1', 'digest_alg' => 'sha1',
'private_key_bits' => 4096, 'private_key_bits' => 4096,
'encrypt_key' => false )); 'encrypt_key' => false)
);
}
// Get private key // Get private key
@ -438,33 +484,39 @@ function check_keys(&$checks) {
$help .= t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL; $help .= t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL;
$help .= t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".'); $help .= t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".');
} }
check_add($checks, t('Generate encryption keys'), $res, true, $help);
check_add($checks, t('Generate encryption keys'), $res, true, $help);
} }
/**
* @brief Check for some PHP functions and modules.
*
* @param[in,out] array &$checks
*/
function check_funcs(&$checks) { function check_funcs(&$checks) {
$ck_funcs = array(); $ck_funcs = array();
check_add($ck_funcs, t('libCurl PHP module'), true, true, "");
check_add($ck_funcs, t('GD graphics PHP module'), true, true, "");
check_add($ck_funcs, t('OpenSSL PHP module'), true, true, "");
check_add($ck_funcs, t('mysqli or postgres PHP module'), true, true, "");
check_add($ck_funcs, t('mb_string PHP module'), true, true, "");
check_add($ck_funcs, t('mcrypt PHP module'), true, true, "");
// add check metadata, the real check is done bit later and return values set
check_add($ck_funcs, t('libCurl PHP module'), true, true);
check_add($ck_funcs, t('GD graphics PHP module'), true, true);
check_add($ck_funcs, t('OpenSSL PHP module'), true, true);
check_add($ck_funcs, t('mysqli or postgres PHP module'), true, true);
check_add($ck_funcs, t('mb_string PHP module'), true, true);
check_add($ck_funcs, t('mcrypt PHP module'), true, true);
check_add($ck_funcs, t('xml PHP module'), true, true);
if(function_exists('apache_get_modules')){ if(function_exists('apache_get_modules')){
if (! in_array('mod_rewrite', apache_get_modules())) { if (! in_array('mod_rewrite', apache_get_modules())) {
check_add($ck_funcs, t('Apache mod_rewrite module'), false, true, t('Error: Apache webserver mod-rewrite module is required but not installed.')); check_add($ck_funcs, t('Apache mod_rewrite module'), false, true, t('Error: Apache webserver mod-rewrite module is required but not installed.'));
} else { } else {
check_add($ck_funcs, t('Apache mod_rewrite module'), true, true, ""); check_add($ck_funcs, t('Apache mod_rewrite module'), true, true);
} }
} }
if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) { if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) {
check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini')); check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini'));
} }
else { else {
check_add($ck_funcs, t('proc_open'), true, true, ""); check_add($ck_funcs, t('proc_open'), true, true);
} }
if(! function_exists('curl_init')) { if(! function_exists('curl_init')) {
@ -491,19 +543,25 @@ function check_funcs(&$checks) {
$ck_funcs[5]['status'] = false; $ck_funcs[5]['status'] = false;
$ck_funcs[5]['help'] = t('Error: mcrypt PHP module required but not installed.'); $ck_funcs[5]['help'] = t('Error: mcrypt PHP module required but not installed.');
} }
if(! extension_loaded('xml')) {
$checks = array_merge($checks, $ck_funcs); $ck_funcs[6]['status'] = false;
$ck_funcs[6]['help'] = t('Error: xml PHP module required for DAV but not installed.');
} }
$checks = array_merge($checks, $ck_funcs);
}
/**
* @brief Check for .htconfig requirements.
*
* @param[out] array &$checks
*/
function check_htconfig(&$checks) { function check_htconfig(&$checks) {
$status = true; $status = true;
$help = ""; $help = '';
if( (file_exists('.htconfig.php') && !is_writable('.htconfig.php')) || if( (file_exists('.htconfig.php') && !is_writable('.htconfig.php')) ||
(!file_exists('.htconfig.php') && !is_writable('.')) ) { (!file_exists('.htconfig.php') && !is_writable('.')) ) {
$status = false; $status = false;
$help = t('The web installer needs to be able to create a file called ".htconfig.php" in the top folder of your web server and it is unable to do so.') .EOL; $help = t('The web installer needs to be able to create a file called ".htconfig.php" in the top folder of your web server and it is unable to do so.') .EOL;
$help .= t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL; $help .= t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL;
@ -512,14 +570,18 @@ function check_htconfig(&$checks) {
} }
check_add($checks, t('.htconfig.php is writable'), $status, false, $help); check_add($checks, t('.htconfig.php is writable'), $status, false, $help);
} }
/**
* @brief Checks for our templating engine Smarty3 requirements.
*
* @param[out] array &$checks
*/
function check_smarty3(&$checks) { function check_smarty3(&$checks) {
$status = true; $status = true;
$help = ""; $help = '';
if( !is_writable(TEMPLATE_BUILD_PATH) ) {
if(! is_writable(TEMPLATE_BUILD_PATH) ) {
$status = false; $status = false;
$help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL; $help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
$help .= sprintf( t('In order to store these compiled templates, the web server needs to have write access to the directory %s under the Red top level folder.'), TEMPLATE_BUILD_PATH) . EOL; $help .= sprintf( t('In order to store these compiled templates, the web server needs to have write access to the directory %s under the Red top level folder.'), TEMPLATE_BUILD_PATH) . EOL;
@ -528,31 +590,37 @@ function check_smarty3(&$checks) {
} }
check_add($checks, sprintf( t('%s is writable'), TEMPLATE_BUILD_PATH), $status, true, $help); check_add($checks, sprintf( t('%s is writable'), TEMPLATE_BUILD_PATH), $status, true, $help);
} }
/**
* @brief Check for store directory.
*
* @param[out] array &$checks
*/
function check_store(&$checks) { function check_store(&$checks) {
$status = true; $status = true;
$help = ""; $help = '';
@os_mkdir(TEMPLATE_BUILD_PATH, STORAGE_DEFAULT_PERMISSIONS, true); @os_mkdir(TEMPLATE_BUILD_PATH, STORAGE_DEFAULT_PERMISSIONS, true);
if(! is_writable('store')) { if(! is_writable('store')) {
$status = false; $status = false;
$help = t('Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL; $help = t('Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL;
$help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL; $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
} }
check_add($checks, t('store is writable'), $status, true, $help); check_add($checks, t('store is writable'), $status, true, $help);
} }
/**
* @brief Check URL rewrite und SSL certificate.
*
* @param[out] array &$checks
*/
function check_htaccess(&$checks) { function check_htaccess(&$checks) {
$a = get_app(); $a = get_app();
$status = true; $status = true;
$help = ""; $help = '';
$ssl_error = false; $ssl_error = false;
$url = $a->get_baseurl() . '/setup/testrewrite'; $url = $a->get_baseurl() . '/setup/testrewrite';
@ -589,11 +657,11 @@ function check_htaccess(&$checks) {
$status = false; $status = false;
$help = t('Url rewrite in .htaccess is not working. Check your server configuration.'.'Test: '.var_export($test,true)); $help = t('Url rewrite in .htaccess is not working. Check your server configuration.'.'Test: '.var_export($test,true));
} }
check_add($checks, t('Url rewrite is working'), $status, true, $help); check_add($checks, t('Url rewrite is working'), $status, true, $help);
} else { } else {
// cannot check modrewrite if libcurl is not installed // cannot check modrewrite if libcurl is not installed
} }
} }
@ -601,6 +669,7 @@ function manual_config(&$a) {
$data = htmlspecialchars($a->data['txt'], ENT_COMPAT, 'UTF-8'); $data = htmlspecialchars($a->data['txt'], ENT_COMPAT, 'UTF-8');
$o = t('The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.'); $o = t('The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.');
$o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>"; $o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>";
return $o; return $o;
} }
@ -626,6 +695,7 @@ function load_database($db) {
} }
} }
} }
return $errors; return $errors;
} }
@ -649,12 +719,10 @@ function what_next() {
if(stristr($x['ssl_version'],'openssl')) if(stristr($x['ssl_version'],'openssl'))
set_config('system','curl_ssl_ciphers','ALL:!eNULL'); set_config('system','curl_ssl_ciphers','ALL:!eNULL');
// Create a system channel // Create a system channel
require_once ('include/identity.php'); require_once ('include/identity.php');
create_sys_channel(); create_sys_channel();
$baseurl = $a->get_baseurl(); $baseurl = $a->get_baseurl();
return return
t('<h1>What next</h1>') t('<h1>What next</h1>')
@ -664,5 +732,3 @@ function what_next() {
.t("Go to your new Red node <a href='$baseurl/register'>registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.") .t("Go to your new Red node <a href='$baseurl/register'>registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
."</p>"; ."</p>";
} }