2010-08-16 04:49:29 +00:00
< ? php
2017-11-29 12:52:27 +00:00
/**
* @ file mod / install . php
*/
2018-01-25 02:08:45 +00:00
2017-04-30 04:07:00 +00:00
use Friendica\App ;
2018-01-21 17:06:27 +00:00
use Friendica\Core\L10n ;
2017-08-26 06:04:21 +00:00
use Friendica\Core\System ;
2017-11-08 03:57:46 +00:00
use Friendica\Database\DBM ;
2017-12-14 21:13:02 +00:00
use Friendica\Database\DBStructure ;
2017-12-07 13:56:11 +00:00
use Friendica\Object\Image ;
2018-01-27 04:09:48 +00:00
use Friendica\Util\Network ;
2018-01-25 02:08:45 +00:00
use Friendica\Util\Temporal ;
2012-01-02 19:16:28 +00:00
2017-04-30 04:01:26 +00:00
$install_wizard_pass = 1 ;
2016-02-07 14:11:34 +00:00
2017-01-09 12:14:25 +00:00
function install_init ( App $a ) {
2014-06-03 22:44:58 +00:00
2012-05-23 11:38:31 +00:00
// $baseurl/install/testrwrite to test if rewite in .htaccess is working
2017-04-25 05:55:20 +00:00
if ( $a -> argc == 2 && $a -> argv [ 1 ] == " testrewrite " ) {
2012-05-23 11:38:31 +00:00
echo " ok " ;
killme ();
}
2016-12-21 22:04:09 +00:00
2015-11-13 09:56:06 +00:00
// We overwrite current theme css, because during install we could not have a working mod_rewrite
// so we could not have a css at all. Here we set a static css file for the install procedure pages
$a -> config [ 'system' ][ 'theme' ] = " ../install " ;
2017-08-26 07:32:10 +00:00
$a -> theme [ 'stylesheet' ] = System :: baseUrl () . " /view/install/style.css " ;
2016-12-21 22:04:09 +00:00
2012-01-02 19:16:28 +00:00
global $install_wizard_pass ;
2017-04-25 05:55:20 +00:00
if ( x ( $_POST , 'pass' )) {
2012-01-02 19:16:28 +00:00
$install_wizard_pass = intval ( $_POST [ 'pass' ]);
2016-12-21 22:04:09 +00:00
}
2016-02-07 14:11:34 +00:00
2012-01-02 19:16:28 +00:00
}
2010-08-16 04:49:29 +00:00
2017-01-09 12:14:25 +00:00
function install_post ( App $a ) {
2017-10-11 12:56:36 +00:00
global $install_wizard_pass ;
2010-08-16 04:49:29 +00:00
2012-01-02 19:16:28 +00:00
switch ( $install_wizard_pass ) {
case 1 :
case 2 :
return ;
break ; // just in case return don't return :)
case 3 :
$urlpath = $a -> get_path ();
$dbhost = notags ( trim ( $_POST [ 'dbhost' ]));
$dbuser = notags ( trim ( $_POST [ 'dbuser' ]));
$dbpass = notags ( trim ( $_POST [ 'dbpass' ]));
$dbdata = notags ( trim ( $_POST [ 'dbdata' ]));
$phpath = notags ( trim ( $_POST [ 'phpath' ]));
2012-12-28 21:51:50 +00:00
require_once ( " include/dba.php " );
2017-10-11 12:56:36 +00:00
if ( ! dba :: connect ( $dbhost , $dbuser , $dbpass , $dbdata , true )) {
2017-04-25 05:55:20 +00:00
$a -> data [ 'db_conn_failed' ] = true ;
2011-03-22 00:34:29 +00:00
}
2011-07-08 02:12:35 +00:00
2014-06-03 22:44:58 +00:00
return ;
2012-01-02 19:16:28 +00:00
break ;
2012-08-18 19:28:49 +00:00
case 4 :
2012-01-02 19:16:28 +00:00
$urlpath = $a -> get_path ();
$dbhost = notags ( trim ( $_POST [ 'dbhost' ]));
$dbuser = notags ( trim ( $_POST [ 'dbuser' ]));
$dbpass = notags ( trim ( $_POST [ 'dbpass' ]));
$dbdata = notags ( trim ( $_POST [ 'dbdata' ]));
$phpath = notags ( trim ( $_POST [ 'phpath' ]));
$timezone = notags ( trim ( $_POST [ 'timezone' ]));
2016-04-06 18:18:33 +00:00
$language = notags ( trim ( $_POST [ 'language' ]));
2012-01-02 19:16:28 +00:00
$adminmail = notags ( trim ( $_POST [ 'adminmail' ]));
2018-01-19 16:25:48 +00:00
$rino = 1 ;
2012-01-02 19:16:28 +00:00
// connect to db
2017-10-11 12:56:36 +00:00
dba :: connect ( $dbhost , $dbuser , $dbpass , $dbdata , true );
2012-01-02 19:16:28 +00:00
2015-06-23 10:32:35 +00:00
$tpl = get_markup_template ( 'htconfig.tpl' );
2018-01-15 13:05:12 +00:00
$txt = replace_macros ( $tpl ,[
2012-01-02 19:16:28 +00:00
'$dbhost' => $dbhost ,
'$dbuser' => $dbuser ,
'$dbpass' => $dbpass ,
'$dbdata' => $dbdata ,
'$timezone' => $timezone ,
2016-04-06 18:18:33 +00:00
'$language' => $language ,
2012-01-02 19:16:28 +00:00
'$urlpath' => $urlpath ,
'$phpath' => $phpath ,
2016-04-20 12:17:48 +00:00
'$adminmail' => $adminmail ,
'$rino' => $rino
2018-01-15 13:05:12 +00:00
]);
2015-11-06 23:22:26 +00:00
2012-01-02 19:16:28 +00:00
$result = file_put_contents ( '.htconfig.php' , $txt );
2016-12-21 22:04:09 +00:00
if ( ! $result ) {
2012-01-02 19:16:28 +00:00
$a -> data [ 'txt' ] = $txt ;
}
2015-11-06 23:22:26 +00:00
2017-10-11 12:56:36 +00:00
$errors = load_database ();
2015-11-06 23:22:26 +00:00
2010-11-06 12:07:10 +00:00
2016-12-21 22:04:09 +00:00
if ( $errors ) {
2012-01-02 19:16:28 +00:00
$a -> data [ 'db_failed' ] = $errors ;
2016-12-21 22:04:09 +00:00
} else {
2012-01-02 19:16:28 +00:00
$a -> data [ 'db_installed' ] = true ;
2016-12-21 22:04:09 +00:00
}
2010-08-16 04:49:29 +00:00
2012-01-02 19:16:28 +00:00
return ;
break ;
}
2010-08-16 04:49:29 +00:00
}
2017-01-09 12:14:25 +00:00
function install_content ( App $a ) {
2010-08-16 04:49:29 +00:00
2017-10-11 12:56:36 +00:00
global $install_wizard_pass ;
2010-11-18 10:59:59 +00:00
$o = '' ;
2012-01-02 19:16:28 +00:00
$wizard_status = " " ;
2018-01-22 12:29:50 +00:00
$install_title = L10n :: t ( 'Friendica Communications Server - Setup' );
2012-05-23 11:38:31 +00:00
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
if ( x ( $a -> data , 'db_conn_failed' )) {
2012-01-02 19:16:28 +00:00
$install_wizard_pass = 2 ;
2018-01-22 12:29:50 +00:00
$wizard_status = L10n :: t ( 'Could not connect to database.' );
2012-01-02 19:16:28 +00:00
}
2017-04-25 05:55:20 +00:00
if ( x ( $a -> data , 'db_create_failed' )) {
2012-01-02 19:16:28 +00:00
$install_wizard_pass = 2 ;
2018-01-22 12:29:50 +00:00
$wizard_status = L10n :: t ( 'Could not create table.' );
2012-01-02 19:16:28 +00:00
}
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
$db_return_text = " " ;
if ( x ( $a -> data , 'db_installed' )) {
2012-01-02 19:16:28 +00:00
$txt = '<p style="font-size: 130%;">' ;
2018-01-22 12:29:50 +00:00
$txt .= L10n :: t ( 'Your Friendica site database has been installed.' ) . EOL ;
2012-05-23 11:38:31 +00:00
$db_return_text .= $txt ;
2011-03-22 00:34:29 +00:00
}
2017-04-25 05:55:20 +00:00
if ( x ( $a -> data , 'db_failed' )) {
2018-01-22 12:29:50 +00:00
$txt = L10n :: t ( 'You may need to import the file "database.sql" manually using phpmyadmin or mysql.' ) . EOL ;
$txt .= L10n :: t ( 'Please see the file "INSTALL.txt".' ) . EOL . " <hr> " ;
2017-04-25 05:55:20 +00:00
$txt .= " <pre> " . $a -> data [ 'db_failed' ] . " </pre> " . EOL ;
2012-05-23 11:38:31 +00:00
$db_return_text .= $txt ;
2011-03-22 00:34:29 +00:00
}
2014-06-03 22:44:58 +00:00
2017-10-11 12:56:36 +00:00
if ( dba :: $connected ) {
2011-03-22 00:34:29 +00:00
$r = q ( " SELECT COUNT(*) as `total` FROM `user` " );
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r ) && $r [ 0 ][ 'total' ]) {
2012-01-02 19:16:28 +00:00
$tpl = get_markup_template ( 'install.tpl' );
2018-01-15 13:05:12 +00:00
return replace_macros ( $tpl , [
2012-01-02 19:16:28 +00:00
'$title' => $install_title ,
'$pass' => '' ,
2018-01-22 12:29:50 +00:00
'$status' => L10n :: t ( 'Database already in use.' ),
2012-01-02 19:16:28 +00:00
'$text' => '' ,
2018-01-15 13:05:12 +00:00
]);
2011-03-22 00:34:29 +00:00
}
}
2010-11-18 10:59:59 +00:00
2017-04-25 05:55:20 +00:00
if ( x ( $a -> data , 'txt' ) && strlen ( $a -> data [ 'txt' ])) {
2012-05-23 11:38:31 +00:00
$db_return_text .= manual_config ( $a );
}
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
if ( $db_return_text != " " ) {
2012-08-18 19:28:49 +00:00
$tpl = get_markup_template ( 'install.tpl' );
2018-01-15 13:05:12 +00:00
return replace_macros ( $tpl , [
2012-05-23 11:38:31 +00:00
'$title' => $install_title ,
'$pass' => " " ,
'$text' => $db_return_text . what_next (),
2018-01-15 13:05:12 +00:00
]);
2012-05-23 11:38:31 +00:00
}
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
switch ( $install_wizard_pass ) {
2012-01-02 19:16:28 +00:00
case 1 : { // System check
2010-11-18 10:59:59 +00:00
2018-01-15 13:05:12 +00:00
$checks = [];
2010-08-16 04:49:29 +00:00
2012-01-02 19:16:28 +00:00
check_funcs ( $checks );
2010-08-16 04:49:29 +00:00
2015-11-06 23:22:26 +00:00
check_imagik ( $checks );
2012-01-02 19:16:28 +00:00
check_htconfig ( $checks );
2010-08-16 04:49:29 +00:00
2012-12-24 14:59:46 +00:00
check_smarty3 ( $checks );
2012-01-02 19:16:28 +00:00
check_keys ( $checks );
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
if ( x ( $_POST , 'phpath' )) {
2012-02-10 22:03:43 +00:00
$phpath = notags ( trim ( $_POST [ 'phpath' ]));
2016-12-21 22:04:09 +00:00
}
2010-11-25 23:33:32 +00:00
2012-01-02 19:16:28 +00:00
check_php ( $phpath , $checks );
2010-11-25 23:33:32 +00:00
2016-12-21 22:04:09 +00:00
check_htaccess ( $checks );
2014-06-03 22:44:58 +00:00
2016-12-21 22:04:09 +00:00
/// @TODO Maybe move this out?
2017-04-25 05:55:20 +00:00
function check_passed ( $v , $c ) {
2016-12-21 22:04:09 +00:00
if ( $c [ 'required' ]) {
2012-01-02 19:16:28 +00:00
$v = $v && $c [ 'status' ];
2016-12-21 22:04:09 +00:00
}
2012-01-02 19:16:28 +00:00
return $v ;
}
$checkspassed = array_reduce ( $checks , " check_passed " , true );
2014-06-03 22:44:58 +00:00
2012-06-01 07:31:24 +00:00
2012-01-02 19:16:28 +00:00
$tpl = get_markup_template ( 'install_checks.tpl' );
2018-01-15 13:05:12 +00:00
$o .= replace_macros ( $tpl , [
2012-01-02 19:16:28 +00:00
'$title' => $install_title ,
2018-01-22 12:29:50 +00:00
'$pass' => L10n :: t ( 'System check' ),
2012-01-02 19:16:28 +00:00
'$checks' => $checks ,
'$passed' => $checkspassed ,
2018-01-22 12:29:50 +00:00
'$see_install' => L10n :: t ( 'Please see the file "INSTALL.txt".' ),
'$next' => L10n :: t ( 'Next' ),
'$reload' => L10n :: t ( 'Check again' ),
2012-01-02 19:16:28 +00:00
'$phpath' => $phpath ,
2017-08-26 07:32:10 +00:00
'$baseurl' => System :: baseUrl (),
2018-01-15 13:05:12 +00:00
]);
2012-01-02 19:16:28 +00:00
return $o ;
}; break ;
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
case 2 : { // Database config
2017-04-25 05:55:20 +00:00
$dbhost = (( x ( $_POST , 'dbhost' )) ? notags ( trim ( $_POST [ 'dbhost' ])) : 'localhost' );
2012-01-02 19:16:28 +00:00
$dbuser = notags ( trim ( $_POST [ 'dbuser' ]));
$dbpass = notags ( trim ( $_POST [ 'dbpass' ]));
$dbdata = notags ( trim ( $_POST [ 'dbdata' ]));
2012-02-10 22:03:43 +00:00
$phpath = notags ( trim ( $_POST [ 'phpath' ]));
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
$tpl = get_markup_template ( 'install_db.tpl' );
2018-01-15 13:05:12 +00:00
$o .= replace_macros ( $tpl , [
2012-01-02 19:16:28 +00:00
'$title' => $install_title ,
2018-01-22 12:29:50 +00:00
'$pass' => L10n :: t ( 'Database connection' ),
'$info_01' => L10n :: t ( 'In order to install Friendica we need to know how to connect to your database.' ),
'$info_02' => L10n :: t ( 'Please contact your hosting provider or site administrator if you have questions about these settings.' ),
'$info_03' => L10n :: t ( 'The database you specify below should already exist. If it does not, please create it before continuing.' ),
2012-01-02 19:16:28 +00:00
'$status' => $wizard_status ,
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
'$dbhost' => [ 'dbhost' , L10n :: t ( 'Database Server Name' ), $dbhost , '' , 'required' ],
'$dbuser' => [ 'dbuser' , L10n :: t ( 'Database Login Name' ), $dbuser , '' , 'required' , 'autofocus' ],
'$dbpass' => [ 'dbpass' , L10n :: t ( 'Database Login Password' ), $dbpass , L10n :: t ( " For security reasons the password must not be empty " ), 'required' ],
'$dbdata' => [ 'dbdata' , L10n :: t ( 'Database Name' ), $dbdata , '' , 'required' ],
'$adminmail' => [ 'adminmail' , L10n :: t ( 'Site administrator email address' ), $adminmail , L10n :: t ( 'Your account email address must match this in order to use the web admin panel.' ), 'required' , 'autofocus' , 'email' ],
2012-01-02 19:16:28 +00:00
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
2018-01-22 12:29:50 +00:00
'$lbl_10' => L10n :: t ( 'Please select a default timezone for your website' ),
2014-06-03 22:44:58 +00:00
2017-08-26 07:32:10 +00:00
'$baseurl' => System :: baseUrl (),
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
'$phpath' => $phpath ,
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
'$submit' => L10n :: t ( 'Submit' ),
2014-06-03 22:44:58 +00:00
2018-01-15 13:05:12 +00:00
]);
2012-01-02 19:16:28 +00:00
return $o ;
}; break ;
case 3 : { // Site settings
2012-12-28 21:51:50 +00:00
require_once ( 'include/datetime.php' );
2017-04-25 05:55:20 +00:00
$dbhost = (( x ( $_POST , 'dbhost' )) ? notags ( trim ( $_POST [ 'dbhost' ])) : 'localhost' );
2012-01-02 19:16:28 +00:00
$dbuser = notags ( trim ( $_POST [ 'dbuser' ]));
$dbpass = notags ( trim ( $_POST [ 'dbpass' ]));
$dbdata = notags ( trim ( $_POST [ 'dbdata' ]));
2012-02-10 22:03:43 +00:00
$phpath = notags ( trim ( $_POST [ 'phpath' ]));
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
$adminmail = notags ( trim ( $_POST [ 'adminmail' ]));
2017-04-25 05:55:20 +00:00
$timezone = (( x ( $_POST , 'timezone' )) ? ( $_POST [ 'timezone' ]) : 'America/Los_Angeles' );
2016-04-06 18:18:33 +00:00
/* Installed langs */
2018-01-21 17:06:27 +00:00
$lang_choices = L10n :: getAvailableLanguages ();
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
$tpl = get_markup_template ( 'install_settings.tpl' );
2018-01-15 13:05:12 +00:00
$o .= replace_macros ( $tpl , [
2012-01-02 19:16:28 +00:00
'$title' => $install_title ,
2018-01-22 12:29:50 +00:00
'$pass' => L10n :: t ( 'Site settings' ),
2012-01-02 19:16:28 +00:00
'$status' => $wizard_status ,
2014-06-03 22:44:58 +00:00
'$dbhost' => $dbhost ,
2012-01-02 19:16:28 +00:00
'$dbuser' => $dbuser ,
'$dbpass' => $dbpass ,
'$dbdata' => $dbdata ,
'$phpath' => $phpath ,
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
'$adminmail' => [ 'adminmail' , L10n :: t ( 'Site administrator email address' ), $adminmail , L10n :: t ( 'Your account email address must match this in order to use the web admin panel.' ), 'required' , 'autofocus' , 'email' ],
2012-01-02 19:16:28 +00:00
2014-06-03 22:44:58 +00:00
2018-01-25 02:08:45 +00:00
'$timezone' => Temporal :: getTimezoneField ( 'timezone' , L10n :: t ( 'Please select a default timezone for your website' ), $timezone , '' ),
2018-01-22 12:29:50 +00:00
'$language' => [ 'language' , L10n :: t ( 'System Language:' ), 'en' , L10n :: t ( 'Set the default language for your Friendica installation interface and to send emails.' ), $lang_choices ],
2017-08-26 07:32:10 +00:00
'$baseurl' => System :: baseUrl (),
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
'$submit' => L10n :: t ( 'Submit' ),
2014-06-03 22:44:58 +00:00
2018-01-15 13:05:12 +00:00
]);
2012-01-02 19:16:28 +00:00
return $o ;
}; break ;
2014-06-03 22:44:58 +00:00
2012-01-02 19:16:28 +00:00
}
}
2010-08-16 04:49:29 +00:00
2012-01-02 19:16:28 +00:00
/**
* checks : array passed to template
* title : string
* status : boolean
* required : boolean
* help : string optional
*/
2017-04-25 05:55:20 +00:00
function check_add ( & $checks , $title , $status , $required , $help ) {
2018-01-15 13:05:12 +00:00
$checks [] = [
2012-01-02 19:16:28 +00:00
'title' => $title ,
'status' => $status ,
'required' => $required ,
'help' => $help ,
2018-01-15 13:05:12 +00:00
];
2010-08-16 04:49:29 +00:00
}
2012-01-02 19:16:28 +00:00
function check_php ( & $phpath , & $checks ) {
2013-03-01 09:43:04 +00:00
$passed = $passed2 = $passed3 = false ;
2017-04-25 05:55:20 +00:00
if ( strlen ( $phpath )) {
2012-01-02 19:16:28 +00:00
$passed = file_exists ( $phpath );
} else {
$phpath = trim ( shell_exec ( 'which php' ));
$passed = strlen ( $phpath );
2010-11-25 23:33:32 +00:00
}
2012-01-02 19:16:28 +00:00
$help = " " ;
2016-12-21 22:04:09 +00:00
if ( ! $passed ) {
2018-01-22 12:29:50 +00:00
$help .= L10n :: t ( 'Could not find a command line version of PHP in the web server PATH.' ) . EOL ;
$help .= L10n :: t ( " If you don't have a command line version of PHP installed on your server, you will not be able to run the background processing. See <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-worker'>'Setup the worker'</a> " ) . EOL ;
2017-04-25 05:55:20 +00:00
$help .= EOL . EOL ;
2012-01-02 19:16:28 +00:00
$tpl = get_markup_template ( 'field_input.tpl' );
2018-01-15 13:05:12 +00:00
$help .= replace_macros ( $tpl , [
2018-01-22 12:29:50 +00:00
'$field' => [ 'phpath' , L10n :: t ( 'PHP executable path' ), $phpath , L10n :: t ( 'Enter full path to php executable. You can leave this blank to continue the installation.' )],
2018-01-15 13:05:12 +00:00
]);
2017-04-25 05:55:20 +00:00
$phpath = " " ;
2012-01-02 19:16:28 +00:00
}
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'Command line PHP' ) . ( $passed ? " (<tt> $phpath </tt>) " : " " ), $passed , false , $help );
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
if ( $passed ) {
2013-03-01 09:43:04 +00:00
$cmd = " $phpath -v " ;
$result = trim ( shell_exec ( $cmd ));
2017-04-25 05:55:20 +00:00
$passed2 = ( strpos ( $result , " (cli) " ) !== false );
2013-03-01 09:43:04 +00:00
list ( $result ) = explode ( " \n " , $result );
$help = " " ;
2017-04-25 05:55:20 +00:00
if ( ! $passed2 ) {
2018-01-24 21:51:32 +00:00
$help .= L10n :: t ( " PHP executable is not the php cli binary \x28 could be cgi-fgci version \x29 " ) . EOL ;
2018-01-22 12:29:50 +00:00
$help .= L10n :: t ( 'Found PHP version: ' ) . " <tt> $result </tt> " ;
2013-03-01 09:43:04 +00:00
}
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'PHP cli binary' ), $passed2 , true , $help );
2013-03-01 09:43:04 +00:00
}
2014-06-03 22:44:58 +00:00
2016-12-21 22:04:09 +00:00
if ( $passed2 ) {
2010-11-25 23:33:32 +00:00
$str = autoname ( 8 );
$cmd = " $phpath testargs.php $str " ;
$result = trim ( shell_exec ( $cmd ));
2013-03-01 09:43:04 +00:00
$passed3 = $result == $str ;
2012-01-02 19:16:28 +00:00
$help = " " ;
2017-04-25 05:55:20 +00:00
if ( ! $passed3 ) {
2018-01-22 12:29:50 +00:00
$help .= L10n :: t ( 'The command line version of PHP on your system does not have "register_argc_argv" enabled.' ) . EOL ;
$help .= L10n :: t ( 'This is required for message delivery to work.' );
2010-11-25 23:33:32 +00:00
}
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'PHP register_argc_argv' ), $passed3 , true , $help );
2010-08-16 04:49:29 +00:00
}
2014-06-03 22:44:58 +00:00
2016-02-07 14:11:34 +00:00
2010-08-16 04:49:29 +00:00
}
2012-01-02 19:16:28 +00:00
function check_keys ( & $checks ) {
2010-11-25 23:33:32 +00:00
2012-01-02 19:16:28 +00:00
$help = '' ;
2010-11-25 23:33:32 +00:00
$res = false ;
2016-12-21 22:04:09 +00:00
if ( function_exists ( 'openssl_pkey_new' )) {
2018-01-15 13:05:12 +00:00
$res = openssl_pkey_new ([
2016-12-21 22:04:09 +00:00
'digest_alg' => 'sha1' ,
'private_key_bits' => 4096 ,
'encrypt_key' => false
2018-01-15 13:05:12 +00:00
]);
2016-12-21 22:04:09 +00:00
}
2010-11-25 23:33:32 +00:00
// Get private key
2016-12-21 22:04:09 +00:00
if ( ! $res ) {
2018-01-22 12:29:50 +00:00
$help .= L10n :: t ( 'Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys' ) . EOL ;
$help .= L10n :: t ( 'If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".' );
2010-12-22 22:07:27 +00:00
}
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'Generate encryption keys' ), $res , true , $help );
2016-02-07 14:11:34 +00:00
2010-11-25 23:33:32 +00:00
}
2016-02-07 14:11:34 +00:00
2012-01-02 19:16:28 +00:00
function check_funcs ( & $checks ) {
2018-01-15 13:05:12 +00:00
$ck_funcs = [];
2018-01-22 12:29:50 +00:00
check_add ( $ck_funcs , L10n :: t ( 'libCurl PHP module' ), true , true , " " );
check_add ( $ck_funcs , L10n :: t ( 'GD graphics PHP module' ), true , true , " " );
check_add ( $ck_funcs , L10n :: t ( 'OpenSSL PHP module' ), true , true , " " );
check_add ( $ck_funcs , L10n :: t ( 'PDO or MySQLi PHP module' ), true , true , " " );
check_add ( $ck_funcs , L10n :: t ( 'mb_string PHP module' ), true , true , " " );
check_add ( $ck_funcs , L10n :: t ( 'XML PHP module' ), true , true , " " );
check_add ( $ck_funcs , L10n :: t ( 'iconv module' ), true , true , " " );
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
if ( function_exists ( 'apache_get_modules' )) {
2012-01-02 19:16:28 +00:00
if ( ! in_array ( 'mod_rewrite' , apache_get_modules ())) {
2018-01-22 12:29:50 +00:00
check_add ( $ck_funcs , L10n :: t ( 'Apache mod_rewrite module' ), false , true , L10n :: t ( 'Error: Apache webserver mod-rewrite module is required but not installed.' ));
2012-01-02 19:16:28 +00:00
} else {
2018-01-22 12:29:50 +00:00
check_add ( $ck_funcs , L10n :: t ( 'Apache mod_rewrite module' ), true , true , " " );
2012-01-02 19:16:28 +00:00
}
}
2012-06-01 07:31:24 +00:00
2017-04-25 05:55:20 +00:00
if ( ! function_exists ( 'curl_init' )) {
$ck_funcs [ 0 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 0 ][ 'help' ] = L10n :: t ( 'Error: libCURL PHP module required but not installed.' );
2012-01-02 19:16:28 +00:00
}
2017-04-25 05:55:20 +00:00
if ( ! function_exists ( 'imagecreatefromjpeg' )) {
$ck_funcs [ 1 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 1 ][ 'help' ] = L10n :: t ( 'Error: GD graphics PHP module with JPEG support required but not installed.' );
2012-01-02 19:16:28 +00:00
}
2016-12-21 22:04:09 +00:00
if ( ! function_exists ( 'openssl_public_encrypt' )) {
2017-04-25 05:55:20 +00:00
$ck_funcs [ 2 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 2 ][ 'help' ] = L10n :: t ( 'Error: openssl PHP module required but not installed.' );
2012-01-02 19:16:28 +00:00
}
2017-04-25 05:55:20 +00:00
if ( ! function_exists ( 'mysqli_connect' ) && ! class_exists ( 'pdo' )) {
$ck_funcs [ 3 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 3 ][ 'help' ] = L10n :: t ( 'Error: PDO or MySQLi PHP module required but not installed.' );
2012-01-02 19:16:28 +00:00
}
2017-04-25 06:10:14 +00:00
if ( ! function_exists ( 'mysqli_connect' ) && class_exists ( 'pdo' ) && ! in_array ( 'mysql' , PDO :: getAvailableDrivers ())) {
$ck_funcs [ 3 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 3 ][ 'help' ] = L10n :: t ( 'Error: The MySQL driver for PDO is not installed.' );
2017-04-25 06:10:14 +00:00
}
2017-04-25 05:55:20 +00:00
if ( ! function_exists ( 'mb_strlen' )) {
$ck_funcs [ 4 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 4 ][ 'help' ] = L10n :: t ( 'Error: mb_string PHP module required but not installed.' );
2012-01-02 19:16:28 +00:00
}
2017-04-25 05:55:20 +00:00
if ( ! function_exists ( 'iconv_strlen' )) {
$ck_funcs [ 7 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 7 ][ 'help' ] = L10n :: t ( 'Error: iconv PHP module required but not installed.' );
2016-08-06 06:54:41 +00:00
}
2014-06-03 22:44:58 +00:00
2015-11-07 10:03:08 +00:00
$checks = array_merge ( $checks , $ck_funcs );
2015-11-06 23:22:26 +00:00
2016-04-27 18:16:35 +00:00
// check for XML DOM Documents being able to be generated
try {
$xml = new DOMDocument ();
} catch ( Exception $e ) {
2016-04-27 18:23:06 +00:00
$ck_funcs [ 6 ][ 'status' ] = false ;
2018-01-22 12:29:50 +00:00
$ck_funcs [ 6 ][ 'help' ] = L10n :: t ( 'Error, XML PHP module required but not installed.' );
2016-04-27 18:16:35 +00:00
}
2010-11-18 10:59:59 +00:00
}
2016-02-07 14:11:34 +00:00
2012-01-02 19:16:28 +00:00
function check_htconfig ( & $checks ) {
$status = true ;
$help = " " ;
2016-12-21 22:04:09 +00:00
if (( file_exists ( '.htconfig.php' ) && ! is_writable ( '.htconfig.php' )) ||
2017-04-25 05:55:20 +00:00
( ! file_exists ( '.htconfig.php' ) && ! is_writable ( '.' ))) {
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
$status = false ;
2018-01-22 12:29:50 +00:00
$help = L10n :: 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 .= L10n :: 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 .= L10n :: t ( 'At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder.' ) . EOL ;
$help .= L10n :: t ( 'You can alternatively skip this procedure and perform a manual installation. Please see the file "INSTALL.txt" for instructions.' ) . EOL ;
2010-08-16 04:49:29 +00:00
}
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( '.htconfig.php is writable' ), $status , false , $help );
2016-02-07 14:11:34 +00:00
2010-08-16 04:49:29 +00:00
}
2012-12-24 14:59:46 +00:00
function check_smarty3 ( & $checks ) {
$status = true ;
$help = " " ;
2017-04-25 05:55:20 +00:00
if ( ! is_writable ( 'view/smarty3' )) {
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
$status = false ;
2018-01-22 12:29:50 +00:00
$help = L10n :: t ( 'Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.' ) . EOL ;
$help .= L10n :: t ( 'In order to store these compiled templates, the web server needs to have write access to the directory view/smarty3/ under the Friendica top level folder.' ) . EOL ;
2018-01-24 21:51:32 +00:00
$help .= L10n :: t ( " Please ensure that the user that your web server runs as \x28 e.g. www-data \x29 has write access to this folder. " ) . EOL ;
$help .= L10n :: t ( " Note: as a security measure, you should give the web server write access to view/smarty3/ only--not the template files \x28 .tpl \x29 that it contains. " ) . EOL ;
2012-12-24 14:59:46 +00:00
}
2014-06-03 22:44:58 +00:00
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'view/smarty3 is writable' ), $status , true , $help );
2016-02-07 14:11:34 +00:00
2012-12-24 14:59:46 +00:00
}
2012-05-23 11:38:31 +00:00
function check_htaccess ( & $checks ) {
$status = true ;
$help = " " ;
2016-12-20 20:15:53 +00:00
if ( function_exists ( 'curl_init' )) {
2018-01-27 16:13:41 +00:00
$test = Network :: fetchUrl ( System :: baseUrl () . " /install/testrewrite " );
2014-06-03 22:44:58 +00:00
2017-04-25 05:55:20 +00:00
if ( $test != " ok " ) {
2018-01-27 16:13:41 +00:00
$test = Network :: fetchUrl ( normalise_link ( System :: baseUrl () . " /install/testrewrite " ));
2016-12-20 20:15:53 +00:00
}
2015-06-13 19:58:40 +00:00
2017-04-25 05:55:20 +00:00
if ( $test != " ok " ) {
2015-06-13 19:58:40 +00:00
$status = false ;
2018-01-22 12:29:50 +00:00
$help = L10n :: t ( 'Url rewrite in .htaccess is not working. Check your server configuration.' );
2015-06-13 19:58:40 +00:00
}
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'Url rewrite is working' ), $status , true , $help );
2016-12-21 22:04:09 +00:00
} else {
2015-06-13 19:58:40 +00:00
// cannot check modrewrite if libcurl is not installed
2016-12-20 20:15:53 +00:00
/// @TODO Maybe issue warning here?
2015-06-13 19:58:40 +00:00
}
2012-05-23 11:38:31 +00:00
}
2015-11-06 23:22:26 +00:00
function check_imagik ( & $checks ) {
$imagick = false ;
$gif = false ;
if ( class_exists ( 'Imagick' )) {
$imagick = true ;
2017-12-07 13:56:11 +00:00
$supported = Image :: supportedTypes ();
2015-11-06 23:22:26 +00:00
if ( array_key_exists ( 'image/gif' , $supported )) {
$gif = true ;
}
}
2016-12-19 00:10:11 +00:00
if ( $imagick == false ) {
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'ImageMagick PHP extension is not installed' ), $imagick , false , " " );
2016-12-21 22:04:09 +00:00
} else {
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'ImageMagick PHP extension is installed' ), $imagick , false , " " );
2016-12-19 00:10:11 +00:00
if ( $imagick ) {
2018-01-22 12:29:50 +00:00
check_add ( $checks , L10n :: t ( 'ImageMagick supports GIF' ), $gif , false , " " );
2016-12-19 00:10:11 +00:00
}
2015-11-06 23:22:26 +00:00
}
}
2017-01-09 12:14:25 +00:00
function manual_config ( App $a ) {
2017-04-25 05:55:20 +00:00
$data = htmlentities ( $a -> data [ 'txt' ], ENT_COMPAT , 'UTF-8' );
2018-01-22 12:29:50 +00:00
$o = L10n :: 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.' );
2010-11-16 03:27:15 +00:00
$o .= " <textarea rows= \" 24 \" cols= \" 80 \" > $data </textarea> " ;
2010-11-06 12:07:10 +00:00
return $o ;
2010-08-16 04:49:29 +00:00
}
2017-04-25 05:55:20 +00:00
function load_database_rem ( $v , $i ) {
2012-01-02 19:16:28 +00:00
$l = trim ( $i );
2017-04-25 05:55:20 +00:00
if ( strlen ( $l ) > 1 && ( $l [ 0 ] == " - " || ( $l [ 0 ] == " / " && $l [ 1 ] == " * " ))) {
2012-01-02 19:16:28 +00:00
return $v ;
} else {
return $v . " \n " . $i ;
}
}
2017-10-11 12:56:36 +00:00
function load_database () {
2017-12-14 22:18:53 +00:00
$errors = DBStructure :: update ( false , true );
2014-06-03 22:44:58 +00:00
2010-08-16 04:49:29 +00:00
return $errors ;
2011-05-23 09:39:57 +00:00
}
2012-04-17 05:58:52 +00:00
2012-05-23 11:38:31 +00:00
function what_next () {
2017-08-26 07:32:10 +00:00
$baseurl = System :: baseUrl ();
2014-06-03 22:44:58 +00:00
return
2018-01-24 15:19:58 +00:00
L10n :: t ( '<h1>What next</h1>' )
2018-01-22 21:59:31 +00:00
. " <p> " . L10n :: t ( 'IMPORTANT: You will need to [manually] setup a scheduled task for the worker.' )
. L10n :: t ( 'Please see the file "INSTALL.txt".' )
2012-05-23 11:38:31 +00:00
. " </p><p> "
2018-01-24 21:51:32 +00:00
. L10n :: t ( 'Go to your new Friendica node <a href="%s/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.' , $baseurl )
2012-05-23 11:38:31 +00:00
. " </p> " ;
}