2018-10-29 13:10:45 +00:00
< ? php
namespace Friendica\Module ;
use Friendica\App ;
use Friendica\BaseModule ;
use Friendica\Core ;
use Friendica\Core\L10n ;
2018-10-31 14:35:50 +00:00
use Friendica\Core\Renderer ;
2018-11-08 15:14:37 +00:00
use Friendica\Util\Strings ;
2018-10-29 13:10:45 +00:00
use Friendica\Util\Temporal ;
class Install extends BaseModule
{
/**
* Step one - System check
*/
const SYSTEM_CHECK = 1 ;
/**
* Step two - Database configuration
*/
const DATABASE_CONFIG = 2 ;
/**
* Step three - Adapat site settings
*/
const SITE_SETTINGS = 3 ;
/**
* Step four - All steps finished
*/
const FINISHED = 4 ;
/**
* @ var int The current step of the wizard
*/
private static $currentWizardStep ;
2018-10-29 17:44:39 +00:00
/**
* @ var Core\Installer The installer
*/
private static $installer ;
2018-10-29 13:10:45 +00:00
public static function init ()
{
$a = self :: getApp ();
// route: install/testrwrite
// $baseurl/install/testrwrite to test if rewrite in .htaccess is working
if ( $a -> getArgumentValue ( 1 , '' ) == 'testrewrite' ) {
// Status Code 204 means that it worked without content
Core\System :: httpExit ( 204 );
}
2018-10-29 13:39:09 +00:00
// We overwrite current theme css, because during install we may not have a working mod_rewrite
// so we may not have a css at all. Here we set a static css file for the install procedure pages
2018-10-31 17:25:38 +00:00
Renderer :: $theme [ 'stylesheet' ] = $a -> getBaseURL () . '/view/install/style.css' ;
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
self :: $installer = new Core\Installer ();
2018-10-29 13:10:45 +00:00
self :: $currentWizardStep = defaults ( $_POST , 'pass' , self :: SYSTEM_CHECK );
}
public static function post ()
{
$a = self :: getApp ();
switch ( self :: $currentWizardStep ) {
case self :: SYSTEM_CHECK :
case self :: DATABASE_CONFIG :
// Nothing to do in these steps
2018-10-29 17:44:39 +00:00
break ;
2018-10-29 13:10:45 +00:00
case self :: SITE_SETTINGS :
2018-11-09 18:29:42 +00:00
$dbhost = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbhost' , Core\Installer :: DEFAULT_HOST )));
$dbuser = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbuser' , '' )));
$dbpass = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbpass' , '' )));
$dbdata = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbdata' , '' )));
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
// If we cannot connect to the database, return to the previous step
if ( ! self :: $installer -> checkDB ( $dbhost , $dbuser , $dbpass , $dbdata )) {
self :: $currentWizardStep = self :: DATABASE_CONFIG ;
2018-10-29 13:10:45 +00:00
}
2018-10-29 17:44:39 +00:00
break ;
2018-10-29 13:10:45 +00:00
case self :: FINISHED :
$urlpath = $a -> getURLPath ();
2018-11-09 18:29:42 +00:00
$dbhost = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbhost' , Core\Installer :: DEFAULT_HOST )));
$dbuser = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbuser' , '' )));
$dbpass = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbpass' , '' )));
$dbdata = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbdata' , '' )));
$timezone = Strings :: escapeTags ( trim ( defaults ( $_POST , 'timezone' , Core\Installer :: DEFAULT_TZ )));
$language = Strings :: escapeTags ( trim ( defaults ( $_POST , 'language' , Core\Installer :: DEFAULT_LANG )));
$adminmail = Strings :: escapeTags ( trim ( defaults ( $_POST , 'adminmail' , '' )));
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
// If we cannot connect to the database, return to the Database config wizard
if ( ! self :: $installer -> checkDB ( $dbhost , $dbuser , $dbpass , $dbdata )) {
self :: $currentWizardStep = self :: DATABASE_CONFIG ;
2018-10-30 10:30:19 +00:00
return ;
2018-10-29 13:10:45 +00:00
}
2018-10-30 10:30:19 +00:00
$phpath = self :: $installer -> getPHPPath ();
2018-10-29 17:44:39 +00:00
if ( ! self :: $installer -> createConfig ( $phpath , $urlpath , $dbhost , $dbuser , $dbpass , $dbdata , $timezone , $language , $adminmail , $a -> getBasePath ())) {
return ;
2018-10-29 13:10:45 +00:00
}
2019-02-03 21:46:50 +00:00
self :: $installer -> installDatabase ( $a -> getBasePath ());
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
break ;
2018-10-29 13:10:45 +00:00
}
}
public static function content ()
{
$a = self :: getApp ();
$output = '' ;
2018-10-31 20:03:32 +00:00
$install_title = L10n :: t ( 'Friendica Communications Server - Setup' );
2018-10-29 13:10:45 +00:00
switch ( self :: $currentWizardStep ) {
case self :: SYSTEM_CHECK :
$phppath = defaults ( $_POST , 'phpath' , null );
2018-10-29 17:44:39 +00:00
$status = self :: $installer -> checkEnvironment ( $a -> getBaseURL (), $phppath );
2018-10-29 13:10:45 +00:00
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install_checks.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2018-10-29 13:10:45 +00:00
'$title' => $install_title ,
'$pass' => L10n :: t ( 'System check' ),
2018-10-29 17:44:39 +00:00
'$checks' => self :: $installer -> getChecks (),
2018-10-29 13:10:45 +00:00
'$passed' => $status ,
2018-10-31 20:03:32 +00:00
'$see_install' => L10n :: t ( 'Please see the file "INSTALL.txt".' ),
2018-10-29 13:10:45 +00:00
'$next' => L10n :: t ( 'Next' ),
'$reload' => L10n :: t ( 'Check again' ),
'$phpath' => $phppath ,
'$baseurl' => $a -> getBaseURL ()
]);
break ;
case self :: DATABASE_CONFIG :
2018-11-09 18:29:42 +00:00
$dbhost = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbhost' , Core\Installer :: DEFAULT_HOST )));
$dbuser = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbuser' , '' )));
$dbpass = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbpass' , '' )));
$dbdata = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbdata' , '' )));
$phpath = Strings :: escapeTags ( trim ( defaults ( $_POST , 'phpath' , '' )));
$adminmail = Strings :: escapeTags ( trim ( defaults ( $_POST , 'adminmail' , '' )));
2018-10-29 13:10:45 +00:00
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install_db.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2018-10-29 13:10:45 +00:00
'$title' => $install_title ,
'$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.' ),
2018-10-29 17:44:39 +00:00
'checks' => self :: $installer -> getChecks (),
2018-10-29 13:10:45 +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' ],
'$lbl_10' => L10n :: t ( 'Please select a default timezone for your website' ),
'$baseurl' => $a -> getBaseURL (),
'$phpath' => $phpath ,
'$submit' => L10n :: t ( 'Submit' )
]);
break ;
2018-10-29 17:44:39 +00:00
2018-10-29 13:10:45 +00:00
case self :: SITE_SETTINGS :
2018-11-09 18:29:42 +00:00
$dbhost = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbhost' , Core\Installer :: DEFAULT_HOST )));
$dbuser = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbuser' , '' )));
$dbpass = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbpass' , '' )));
$dbdata = Strings :: escapeTags ( trim ( defaults ( $_POST , 'dbdata' , '' )));
$phpath = Strings :: escapeTags ( trim ( defaults ( $_POST , 'phpath' , '' )));
2018-10-29 13:10:45 +00:00
2018-11-09 18:29:42 +00:00
$adminmail = Strings :: escapeTags ( trim ( defaults ( $_POST , 'adminmail' , '' )));
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
$timezone = defaults ( $_POST , 'timezone' , Core\Installer :: DEFAULT_TZ );
2018-10-29 13:10:45 +00:00
/* Installed langs */
$lang_choices = L10n :: getAvailableLanguages ();
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install_settings.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2018-10-29 13:10:45 +00:00
'$title' => $install_title ,
2018-10-29 17:44:39 +00:00
'$checks' => self :: $installer -> getChecks (),
2018-10-29 13:10:45 +00:00
'$pass' => L10n :: t ( 'Site settings' ),
'$dbhost' => $dbhost ,
'$dbuser' => $dbuser ,
'$dbpass' => $dbpass ,
'$dbdata' => $dbdata ,
'$phpath' => $phpath ,
'$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' ],
'$timezone' => Temporal :: getTimezoneField ( 'timezone' , L10n :: t ( 'Please select a default timezone for your website' ), $timezone , '' ),
'$language' => [ 'language' ,
2018-10-29 17:44:39 +00:00
L10n :: t ( 'System Language:' ),
Core\Installer :: DEFAULT_LANG ,
2018-10-29 13:10:45 +00:00
L10n :: t ( 'Set the default language for your Friendica installation interface and to send emails.' ),
$lang_choices ],
'$baseurl' => $a -> getBaseURL (),
'$submit' => L10n :: t ( 'Submit' )
]);
break ;
case self :: FINISHED :
$db_return_text = " " ;
2018-10-29 17:44:39 +00:00
if ( count ( self :: $installer -> getChecks ()) == 0 ) {
2018-10-29 13:10:45 +00:00
$txt = '<p style="font-size: 130%;">' ;
$txt .= L10n :: t ( 'Your Friendica site database has been installed.' ) . EOL ;
$db_return_text .= $txt ;
}
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install_finished.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2018-10-29 17:44:39 +00:00
'$title' => $install_title ,
'$checks' => self :: $installer -> getChecks (),
'$pass' => L10n :: t ( 'Installation finished' ),
'$text' => $db_return_text . self :: whatNext ( $a ),
2018-10-29 13:10:45 +00:00
]);
break ;
}
return $output ;
}
/**
* Creates the text for the next steps
*
* @ param App $a The global App
*
* @ return string The text for the next steps
2019-01-06 21:06:53 +00:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2018-10-29 13:10:45 +00:00
*/
2018-10-29 13:39:09 +00:00
private static function whatNext ( $a )
{
2018-10-29 13:10:45 +00:00
$baseurl = $a -> getBaseUrl ();
return
L10n :: t ( '<h1>What next</h1>' )
2018-10-29 13:39:09 +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".' )
. " </p><p> "
. 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 )
. " </p> " ;
2018-10-29 13:10:45 +00:00
}
}