]> git.mxchange.org Git - friendica.git/commitdiff
Adding basepath, urlpath, hostname and ssl_policy to installation
authorPhilipp Holzer <admin@philipp.info>
Tue, 26 Mar 2019 21:04:31 +0000 (22:04 +0100)
committerPhilipp Holzer <admin@philipp.info>
Sun, 14 Apr 2019 12:23:06 +0000 (14:23 +0200)
20 files changed:
bin/daemon.php
src/BaseObject.php
src/Core/Console/AutomaticInstallation.php
src/Core/Installer.php
src/Database/DBA.php
src/Factory/DBFactory.php
src/Factory/DependencyFactory.php
src/Module/Install.php
tests/DatabaseTest.php
tests/Util/AppMockTrait.php
tests/include/ApiTest.php
tests/src/Core/Console/AutomaticInstallationConsoleTest.php
tests/src/Core/InstallerTest.php
tests/src/Database/DBATest.php
tests/src/Database/DBStructureTest.php
tests/src/Util/BasePathTest.php [new file with mode: 0644]
view/templates/install_base.tpl [new file with mode: 0644]
view/templates/install_db.tpl
view/templates/install_settings.tpl
view/templates/local.config.tpl

index 298cfa2534ad1221ddbf1cf7561de89830b354e2..047bf71be77b4ac31dbea889098e5dd52dce8b5b 100755 (executable)
@@ -144,9 +144,7 @@ if (!$foreground) {
        file_put_contents($pidfile, $pid);
 
        // We lose the database connection upon forking
-       /// @todo refactoring during https://github.com/friendica/friendica/issues/6720
-       $basePath = \Friendica\Util\BasePath::create(dirname(__DIR__), $_SERVER);
-       Factory\DBFactory::init($basePath, $a->getConfigCache(), $a->getProfiler(), $_SERVER);
+       Factory\DBFactory::init($a->getConfigCache(), $a->getProfiler(), $_SERVER);
 }
 
 Config::set('system', 'worker_daemon_mode', true);
index 7e90478a9d613a378bf28dace96144a9b38f94b5..9a2d064750b7d74ca13bc17fd2473323cf3298f8 100644 (file)
@@ -15,6 +15,9 @@ use Friendica\Network\HTTPException\InternalServerErrorException;
  */
 class BaseObject
 {
+       /**
+        * @var App
+        */
        private static $app = null;
 
        /**
index 911c1c00a8b732d958e24794fcf453c820e6c15d..34a933e12ef51f686b60574f6b3df53b3fb18dfc 100644 (file)
@@ -30,17 +30,19 @@ Options
     -v                      Show more debug information.
     -a                      All setup checks are required (except .htaccess)
     -f|--file <config>      prepared config file (e.g. "config/local.config.php" itself) which will override every other config option - except the environment variables)
-    -s|--savedb             Save the DB credentials to the file (if environment variables is used)
-    -H|--dbhost <host>      The host of the mysql/mariadb database (env MYSQL_HOST)
-    -p|--dbport <port>      The port of the mysql/mariadb database (env MYSQL_PORT)
-    -d|--dbdata <database>  The name of the mysql/mariadb database (env MYSQL_DATABASE)
-    -U|--dbuser <username>  The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME)
-    -P|--dbpass <password>  The password of the mysql/mariadb database login (env MYSQL_PASSWORD)
-    -u|--urlpath <url_path> The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH) 
-    -b|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH) 
-    -A|--admin <mail>       The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL)
-    -T|--tz <timezone>      The timezone of Friendica (env FRIENDICA_TZ)
-    -L|--lang <language>    The language of Friendica (env FRIENDICA_LANG)
+    -s|--savedb                 Save the DB credentials to the file (if environment variables is used)
+    -H|--dbhost <host>          The host of the mysql/mariadb database (env MYSQL_HOST)
+    -p|--dbport <port>          The port of the mysql/mariadb database (env MYSQL_PORT)
+    -d|--dbdata <database>      The name of the mysql/mariadb database (env MYSQL_DATABASE)
+    -U|--dbuser <username>      The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME)
+    -P|--dbpass <password>      The password of the mysql/mariadb database login (env MYSQL_PASSWORD)
+    -U|--urlpath <url_path>     The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH) 
+    -B|--phppath <php_path>     The path of the PHP binary (env FRIENDICA_PHP_PATH)
+    -b|--basepath <base_path>   The basepath of Friendica(env FRIENDICA_BASE_PATH)
+    -S|--sslpolicy <ssl_policy> The SSL policy of Friendica (env FRIENDICA_SSL_POLICY) 
+    -n|--hostname <hostname>    The hostname of Friendica (env FRIENDICA_PHP_HOSTNAME)  
+    -t|--tz <timezone>          The timezone of Friendica (env FRIENDICA_TZ)
+    -L|--lang <language>        The language of Friendica (env FRIENDICA_LANG)
  
 Environment variables
    MYSQL_HOST                  The host of the mysql/mariadb database (mandatory if mysql and environment is used)
@@ -48,9 +50,12 @@ Environment variables
    MYSQL_USERNAME|MYSQL_USER   The username of the mysql/mariadb database login (MYSQL_USERNAME is for mysql, MYSQL_USER for mariadb)
    MYSQL_PASSWORD              The password of the mysql/mariadb database login
    MYSQL_DATABASE              The name of the mysql/mariadb database
-   FRIENDICA_URL_PATH          The URL path of Friendica (f.e. '/friendica')
-   FRIENDICA_PHP_PATH          The path of the PHP binary
+   FRIENDICA_URL_PATH          The URL path of Friendica (f.e. '/friendica') - leave empty for auto detection
+   FRIENDICA_PHP_PATH          The path of the PHP binary - leave empty for auto detection
+   FRIENDICA_BASE_PATH         The basepath of Friendica - leave empty for auto detection
    FRIENDICA_ADMIN_MAIL        The admin email address of Friendica (this email will be used for admin access)
+   FRIENDICA_SSL_POLICY        The SSL policy of Friendica (default is NO SSL)
+   FRIENDICA_HOSTNAME          The hostname of Friendica - leave empty for auto detection
    FRIENDICA_TZ                The timezone of Friendica
    FRIENDICA_LANG              The langauge of Friendica
    
@@ -76,6 +81,7 @@ HELP;
                $installer = new Installer();
 
                $configCache = $a->getConfigCache();
+               $installer->setUpCache($configCache, dirname(__DIR__, 3), $_SERVER);
 
                $this->out(" Complete!\n\n");
 
@@ -99,7 +105,7 @@ HELP;
                                // Copy config file
                                $this->out("Copying config file...\n");
                                if (!copy($a->getBasePath() . DIRECTORY_SEPARATOR . $config_file, $a->getBasePath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.config.php')) {
-                                       throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $a->getBasePath() . "'"  . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.config.php' manually.\n");
+                                       throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $a->getBasePath() . "'" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.config.php' manually.\n");
                                }
                        }
 
@@ -129,7 +135,10 @@ HELP;
                        $php_path = $this->getOption(['b', 'phppath'], !empty('FRIENDICA_PHP_PATH') ? getenv('FRIENDICA_PHP_PATH') : null);
                        if (!empty($php_path)) {
                                $configCache->set('config', 'php_path', $php_path);
+                       } else {
+                               $configCache->set('config', 'php_path', $installer->getPHPPath());
                        }
+
                        $configCache->set('config', 'admin_email',
                                $this->getOption(['A', 'admin'],
                                        !empty(getenv('FRIENDICA_ADMIN_MAIL')) ? getenv('FRIENDICA_ADMIN_MAIL') : ''));
@@ -140,16 +149,29 @@ HELP;
                                $this->getOption(['L', 'lang'],
                                        !empty(getenv('FRIENDICA_LANG')) ? getenv('FRIENDICA_LANG') : Installer::DEFAULT_LANG));
 
+                       $configCache->set('system', 'urlpath', $this->getOption(['u', 'urlpath'], !empty(getenv('FRIENDICA_URL_PATH')) ? getenv('FRIENDICA_URL_PATH') : ''));
+                       $basepath = $this->getOption(['b', 'basepath'], !empty(getenv('FRIENDICA_BASE_PATH')) ? getenv('FRIENDICA_BASE_PATH') : null);
+                       if (!empty($basepath)) {
+                               $configCache->set('system', 'basepath', $basepath);
+                       }
+                       $php_path = $this->getOption(['B', 'phppath'], !empty(getenv('FRIENDICA_PHP_PATH')) ? getenv('FRIENDICA_PHP_PATH') : null);
+                       if (!empty($php_path)) {
+                               $configCache->set('config', 'php_path', $php_path);
+                       }
+                       $ssl_policy = $this->getOption(['S', 'sslpolicy'], !empty(getenv('FRIENDICA_SSL_POLICY')) ? getenv('FRIENDICA_SSL_POLICY') : null);
+                       if (!empty($ssl_policy)) {
+                               $configCache->set('system', 'ssl_policy', $ssl_policy);
+                       }
+                       $configCache->set('config', 'hostname', $this->getOption(['n', 'hostname'], !empty(getenv('FRIENDICA_HOSTNAME')) ? getenv('FRIENDICA_HOSTNAME') : ''));
+
+                       $configCache->set('system', 'url', $installer->determineBaseUrl($configCache));
 
-                       if (empty($php_path)) {
-                               $configCache->set('config', 'php_path', $installer->getPHPPath());
+                       if (empty($configCache->get('config', 'hostname'))) {
+                               $this->out('The Friendica hostname has to be set during CLI installation.');
+                               return 1;
                        }
 
-                       $installer->createConfig(
-                               $a,
-                               $configCache,
-                               $a->getBasePath()
-                       );
+                       $installer->createConfig($configCache);
                }
 
                $this->out(" Complete!\n\n");
@@ -159,7 +181,7 @@ HELP;
 
                $installer->resetChecks();
 
-               if (!$installer->checkDB($a->getBasePath(), $configCache, $a->getProfiler())) {
+               if (!$installer->checkDB($configCache, $a->getProfiler())) {
                        $errorMessage = $this->extractErrors($installer->getChecks());
                        throw new RuntimeException($errorMessage);
                }
@@ -220,10 +242,7 @@ HELP;
                        $checked = false;
                }
 
-               $php_path = null;
-               if ($configCache->has('config', 'php_path')) {
-                       $php_path = $configCache->get('config', 'php_path');
-               }
+               $php_path = $configCache->get('config', 'php_path');
 
                if (!$installer->checkPHP($php_path, true)) {
                        $checked = false;
index b9f096eb5bc82e2a8960b0e4421797d9a5449c14..52a51498e8228e68d05e22f9c999fde1295d7f1c 100644 (file)
@@ -6,12 +6,12 @@ namespace Friendica\Core;
 
 use DOMDocument;
 use Exception;
-use Friendica\App;
 use Friendica\Core\Config\Cache\IConfigCache;
 use Friendica\Database\DBA;
 use Friendica\Database\DBStructure;
 use Friendica\Object\Image;
 use Friendica\Util\Logger\VoidLogger;
+use Friendica\Util\BasePath;
 use Friendica\Util\Network;
 use Friendica\Util\Profiler;
 use Friendica\Util\Strings;
@@ -131,15 +131,15 @@ class Installer
         * - Creates `config/local.config.php`
         * - Installs Database Structure
         *
-        * @param App          $app         The Friendica App
         * @param IConfigCache $configCache The config cache with all config relevant information
-        * @param string $basepath  The basepath of Friendica
         *
         * @return bool true if the config was created, otherwise false
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function createConfig(App $app, IConfigCache $configCache, $basepath)
+       public function createConfig(IConfigCache $configCache)
        {
+               $basepath = $configCache->get('system', 'basepath');
+
                $tpl = Renderer::getMarkupTemplate('local.config.tpl');
                $txt = Renderer::replaceMacros($tpl, [
                        '$dbhost'    => $configCache->get('database', 'hostname'),
@@ -147,12 +147,16 @@ class Installer
                        '$dbpass'    => $configCache->get('database', 'password'),
                        '$dbdata'    => $configCache->get('database', 'database'),
 
-                       '$phpath'    => $this->getPHPPath(),
+                       '$phpath'    => $configCache->get('config', 'php_path'),
                        '$adminmail' => $configCache->get('config', 'admin_email'),
+                       '$hostname'  => $configCache->get('config', 'hostname'),
 
+                       '$urlpath'   => $configCache->get('system', 'urlpath'),
+                       '$baseurl'   => $configCache->get('system', 'url'),
+                       '$sslpolicy' => $configCache->get('system', 'ssl_policy'),
+                       '$basepath'  => $basepath,
                        '$timezone'  => $configCache->get('system', 'default_timezone'),
                        '$language'  => $configCache->get('system', 'language'),
-                       '$urlpath'   => $app->getURLPath(),
                ]);
 
                $result = file_put_contents($basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.config.php', $txt);
@@ -244,7 +248,7 @@ class Installer
                        $help .= EOL . EOL;
                        $tpl = Renderer::getMarkupTemplate('field_input.tpl');
                        $help .= Renderer::replaceMacros($tpl, [
-                               '$field' => ['phpath', L10n::t('PHP executable path'), $phppath, L10n::t('Enter full path to php executable. You can leave this blank to continue the installation.')],
+                               '$field' => ['config.php_path', L10n::t('PHP executable path'), $phppath, L10n::t('Enter full path to php executable. You can leave this blank to continue the installation.')],
                        ]);
                        $phppath = "";
                }
@@ -588,21 +592,20 @@ class Installer
        /**
         * Checking the Database connection and if it is available for the current installation
         *
-        * @param string       $basePath    The basepath of this call
         * @param IConfigCache $configCache The configuration cache
         * @param Profiler    $profiler    The profiler of this app
         *
         * @return bool true if the check was successful, otherwise false
         * @throws Exception
         */
-       public function checkDB($basePath, IConfigCache $configCache, Profiler $profiler)
+       public function checkDB(IConfigCache $configCache, Profiler $profiler)
        {
                $dbhost = $configCache->get('database', 'hostname');
                $dbuser = $configCache->get('database', 'username');
                $dbpass = $configCache->get('database', 'password');
                $dbdata = $configCache->get('database', 'database');
 
-               if (!DBA::connect($basePath, $configCache, $profiler, new VoidLogger(), $dbhost, $dbuser, $dbpass, $dbdata)) {
+               if (!DBA::connect($configCache, $profiler, new VoidLogger(), $dbhost, $dbuser, $dbpass, $dbdata)) {
                        $this->addCheck(L10n::t('Could not connect to database.'), false, true, '');
 
                        return false;
@@ -618,4 +621,18 @@ class Installer
 
                return true;
        }
+
+       /**
+        * Setup the default cache for a new installation
+        *
+        * @param IConfigCache $configCache The configuration cache
+        * @param string       $basePath    The determined basepath
+        *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public function setUpCache(IConfigCache $configCache, $basePath)
+       {
+               $configCache->set('config', 'php_path'  , $this->getPHPPath());
+               $configCache->set('system', 'basepath'  , $basePath);
+       }
 }
index c5ba523810e59f9523b7cedf9c554a7c106eb516..bbf134e8ad8dc5b9df75a1a639828a7a67c67a05 100644 (file)
@@ -44,10 +44,6 @@ class DBA
         * @var LoggerInterface
         */
        private static $logger;
-       /**
-        * @var string
-        */
-       private static $basePath;
        private static $server_info = '';
        private static $connection;
        private static $driver;
@@ -63,14 +59,13 @@ class DBA
        private static $db_name = '';
        private static $db_charset = '';
 
-       public static function connect($basePath, IConfigCache $configCache, Profiler $profiler, LoggerInterface $logger, $serveraddr, $user, $pass, $db, $charset = null)
+       public static function connect(IConfigCache $configCache, Profiler $profiler, LoggerInterface $logger, $serveraddr, $user, $pass, $db, $charset = null)
        {
                if (!is_null(self::$connection) && self::connected()) {
                        return true;
                }
 
                // We are storing these values for being able to perform a reconnect
-               self::$basePath = $basePath;
                self::$configCache = $configCache;
                self::$profiler = $profiler;
                self::$logger = $logger;
@@ -189,7 +184,7 @@ class DBA
        public static function reconnect() {
                self::disconnect();
 
-               $ret = self::connect(self::$basePath, self::$configCache, self::$profiler, self::$logger, self::$db_serveraddr, self::$db_user, self::$db_pass, self::$db_name, self::$db_charset);
+               $ret = self::connect(self::$configCache, self::$profiler, self::$logger, self::$db_serveraddr, self::$db_user, self::$db_pass, self::$db_name, self::$db_charset);
                return $ret;
        }
 
@@ -1079,7 +1074,7 @@ class DBA
         * This process must only be started once, since the value is cached.
         */
        private static function buildRelationData() {
-               $definition = DBStructure::definition(self::$basePath);
+               $definition = DBStructure::definition(self::$configCache->get('system', 'basepath'));
 
                foreach ($definition AS $table => $structure) {
                        foreach ($structure['fields'] AS $field => $field_struct) {
index eeab5556676b27b9d53361fd36c7f01146ff97b3..1c01f733192d6604940415c77b7ddf394d358e22 100644 (file)
@@ -12,16 +12,13 @@ class DBFactory
        /**
         * Initialize the DBA connection
         *
-        * @param string             $basePath    The basepath of the application
         * @param Cache\IConfigCache $configCache The configuration cache
         * @param Profiler           $profiler    The profiler
         * @param array              $server      The $_SERVER variables
         *
         * @throws \Exception if connection went bad
-        *
-        * @todo refactor basedir during https://github.com/friendica/friendica/issues/6720
         */
-       public static function init($basePath, Cache\IConfigCache $configCache, Profiler $profiler, array $server)
+       public static function init(Cache\IConfigCache $configCache, Profiler $profiler, array $server)
        {
                if (Database\DBA::connected()) {
                        return;
@@ -52,9 +49,9 @@ class DBFactory
                        $db_data = $server['MYSQL_DATABASE'];
                }
 
-               if (Database\DBA::connect($basePath, $configCache, $profiler, new VoidLogger(), $db_host, $db_user, $db_pass, $db_data, $charset)) {
+               if (Database\DBA::connect($configCache, $profiler, new VoidLogger(), $db_host, $db_user, $db_pass, $db_data, $charset)) {
                        // Loads DB_UPDATE_VERSION constant
-                       Database\DBStructure::definition($basePath, false);
+                       Database\DBStructure::definition($configCache->get('system', 'basepath'), false);
                }
 
                unset($db_host, $db_user, $db_pass, $db_data, $charset);
index 9512d8d94824111d620ae79b5af421b883c69133..d089c326669ac0ff048a113d1cacff03d17d4548 100644 (file)
@@ -3,7 +3,6 @@
 namespace Friendica\Factory;
 
 use Friendica\App;
-use Friendica\Database\DBA;
 use Friendica\Factory;
 use Friendica\Util\BasePath;
 use Friendica\Util\BaseURL;
@@ -30,12 +29,11 @@ class DependencyFactory
                $configLoader = new Config\ConfigFileLoader($basePath, $mode);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                // needed to call PConfig::init()
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create($channel, $config, $profiler);
-               DBA::setLogger($logger);
                Factory\LoggerFactory::createDev($channel, $config, $profiler);
                $baseURL = new BaseURL($config, $_SERVER);
 
index 8e93c0a26c9dac3be493cea3fe484bb682acc68f..67677940f3ab7d12792cdc5bcbe756203c93d6c3 100644 (file)
@@ -8,6 +8,8 @@ use Friendica\Core;
 use Friendica\Core\Config\Cache\IConfigCache;
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
+use Friendica\Util\BasePath;
+use Friendica\Util\BaseURL;
 use Friendica\Util\Strings;
 use Friendica\Util\Temporal;
 
@@ -18,17 +20,21 @@ class Install extends BaseModule
         */
        const SYSTEM_CHECK = 1;
        /**
-        * Step two - Database configuration
+        * Step two - Base information
         */
-       const DATABASE_CONFIG = 2;
+       const BASE_CONFIG = 2;
        /**
-        * Step three - Adapat site settings
+        * Step three - Database configuration
         */
-       const SITE_SETTINGS = 3;
+       const DATABASE_CONFIG = 3;
        /**
-        * Step four - All steps finished
+        * Step four - Adapat site settings
         */
-       const FINISHED = 4;
+       const SITE_SETTINGS = 4;
+       /**
+        * Step five - All steps finished
+        */
+       const FINISHED = 5;
 
        /**
         * @var int The current step of the wizard
@@ -44,10 +50,6 @@ class Install extends BaseModule
        {
                $a = self::getApp();
 
-               if (!$a->getMode()->isInstall()) {
-                       Core\System::httpExit(403);
-               }
-
                // route: install/testrwrite
                // $baseurl/install/testrwrite to test if rewrite in .htaccess is working
                if ($a->getArgumentValue(1, '') == 'testrewrite') {
@@ -55,11 +57,16 @@ class Install extends BaseModule
                        Core\System::httpExit(204);
                }
 
+               self::$installer = new Core\Installer();
+
+               // get basic installation information and save them to the config cache
+               $configCache = $a->getConfigCache();
+               self::$installer->setUpCache($configCache, BasePath::create($a->getBasePath(), $_SERVER));
+
                // 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
                Renderer::$theme['stylesheet'] = $a->getBaseURL() . '/view/install/style.css';
 
-               self::$installer = new Core\Installer();
                self::$currentWizardStep = defaults($_POST, 'pass', self::SYSTEM_CHECK);
        }
 
@@ -70,20 +77,34 @@ class Install extends BaseModule
 
                switch (self::$currentWizardStep) {
                        case self::SYSTEM_CHECK:
+                       case self::BASE_CONFIG:
+                               self::checkSetting($configCache, $_POST, 'config', 'php_path');
+                               break;
+
                        case self::DATABASE_CONFIG:
                                self::checkSetting($configCache, $_POST, 'config', 'php_path');
+
+                               self::checkSetting($configCache, $_POST, 'config', 'hostname');
+                               self::checkSetting($configCache, $_POST, 'system', 'ssl_policy');
+                               self::checkSetting($configCache, $_POST, 'system', 'basepath');
+                               self::checkSetting($configCache, $_POST, 'system', 'urlpath');
                                break;
 
                        case self::SITE_SETTINGS:
                                self::checkSetting($configCache, $_POST, 'config', 'php_path');
 
+                               self::checkSetting($configCache, $_POST, 'config', 'hostname');
+                               self::checkSetting($configCache, $_POST, 'system', 'ssl_policy');
+                               self::checkSetting($configCache, $_POST, 'system', 'basepath');
+                               self::checkSetting($configCache, $_POST, 'system', 'urlpath');
+
                                self::checkSetting($configCache, $_POST, 'database', 'hostname', Core\Installer::DEFAULT_HOST);
                                self::checkSetting($configCache, $_POST, 'database', 'username', '');
                                self::checkSetting($configCache, $_POST, 'database', 'password', '');
                                self::checkSetting($configCache, $_POST, 'database', 'database', '');
 
                                // If we cannot connect to the database, return to the previous step
-                               if (!self::$installer->checkDB($a->getBasePath(), $configCache, $a->getProfiler())) {
+                               if (!self::$installer->checkDB($configCache, $a->getProfiler())) {
                                        self::$currentWizardStep = self::DATABASE_CONFIG;
                                }
 
@@ -92,6 +113,11 @@ class Install extends BaseModule
                        case self::FINISHED:
                                self::checkSetting($configCache, $_POST, 'config', 'php_path');
 
+                               self::checkSetting($configCache, $_POST, 'config', 'hostname');
+                               self::checkSetting($configCache, $_POST, 'system', 'ssl_policy');
+                               self::checkSetting($configCache, $_POST, 'system', 'basepath');
+                               self::checkSetting($configCache, $_POST, 'system', 'urlpath');
+
                                self::checkSetting($configCache, $_POST, 'database', 'hostname', Core\Installer::DEFAULT_HOST);
                                self::checkSetting($configCache, $_POST, 'database', 'username', '');
                                self::checkSetting($configCache, $_POST, 'database', 'password', '');
@@ -102,16 +128,16 @@ class Install extends BaseModule
                                self::checkSetting($configCache, $_POST, 'config', 'admin_email', '');
 
                                // If we cannot connect to the database, return to the Database config wizard
-                               if (!self::$installer->checkDB($a->getBasePath(), $configCache, $a->getProfiler())) {
+                               if (!self::$installer->checkDB($configCache, $a->getProfiler())) {
                                        self::$currentWizardStep = self::DATABASE_CONFIG;
                                        return;
                                }
 
-                               if (!self::$installer->createConfig($a, $configCache, $a->getBasePath())) {
+                               if (!self::$installer->createConfig($configCache)) {
                                        return;
                                }
 
-                               self::$installer->installDatabase($a->getBasePath());
+                               self::$installer->installDatabase($configCache->get('system', 'basepath'));
 
                                break;
                }
@@ -146,6 +172,43 @@ class Install extends BaseModule
                                ]);
                                break;
 
+                       case self::BASE_CONFIG:
+                               $ssl_choices = [
+                                       BaseUrl::SSL_POLICY_NONE     => L10n::t("No SSL policy, links will track page SSL state"),
+                                       BaseUrl::SSL_POLICY_FULL     => L10n::t("Force all links to use SSL"),
+                                       BaseUrl::SSL_POLICY_SELFSIGN => L10n::t("Self-signed certificate, use SSL for local links only \x28discouraged\x29")
+                               ];
+
+                               $tpl = Renderer::getMarkupTemplate('install_base.tpl');
+                               $output .= Renderer::replaceMacros($tpl, [
+                                       '$title'      => $install_title,
+                                       '$pass'       => L10n::t('Base settings'),
+                                       '$ssl_policy' => ['system-ssl_policy',
+                                                                               L10n::t("SSL link policy"),
+                                                                               $configCache->get('system', 'ssl_policy'),
+                                                                               L10n::t("Determines whether generated links should be forced to use SSL"),
+                                                                               $ssl_choices],
+                                       '$hostname'   => ['config-hostname',
+                                                                               L10n::t('Host name'),
+                                                                               $configCache->get('config', 'hostname'),
+                                                                               L10n::t('Overwrite this field in case the determinated hostname isn\'t right, otherweise leave it as is.'),
+                                                                               'required'],
+                                       '$basepath'   => ['system-basepath',
+                                                                               L10n::t("Base path to installation"),
+                                                                               $configCache->get('system', 'basepath'),
+                                                                               L10n::t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot."),
+                                                                               'required'],
+                                       '$urlpath'    => ['system-urlpath',
+                                                                               L10n::t('Sub path of the URL'),
+                                                                               $configCache->get('system', 'urlpath'),
+                                                                               L10n::t('Overwrite this field in case the sub path determination isn\'t right, otherwise leave it as is. Leaving this field blank means the installation is at the base URL without sub path.'),
+                                                                               ''],
+                                       '$baseurl'    => $a->getBaseURL(),
+                                       '$php_path'   => $configCache->get('config', 'php_path'),
+                                       '$submit'     => L10n::t('Submit'),
+                               ]);
+                               break;
+
                        case self::DATABASE_CONFIG:
                                $tpl = Renderer::getMarkupTemplate('install_db.tpl');
                                $output .= Renderer::replaceMacros($tpl, [
@@ -155,6 +218,10 @@ class Install extends BaseModule
                                        '$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.'),
                                        'checks'    => self::$installer->getChecks(),
+                                       '$hostname'   => $configCache->get('config', 'hostname'),
+                                       '$ssl_policy' => $configCache->get('system', 'ssl_policy'),
+                                       '$basepath'   => $configCache->get('system', 'basepath'),
+                                       '$urlpath'    => $configCache->get('system', 'urlpath'),
                                        '$dbhost'   => ['database-hostname',
                                                                        L10n::t('Database Server Name'),
                                                                        $configCache->get('database', 'hostname'),
@@ -192,11 +259,14 @@ class Install extends BaseModule
                                        '$title'                => $install_title,
                                        '$checks'               => self::$installer->getChecks(),
                                        '$pass'                 => L10n::t('Site settings'),
+                                       '$hostname'     => $configCache->get('config', 'hostname'),
+                                       '$ssl_policy'   => $configCache->get('system', 'ssl_policy'),
+                                       '$basepath'     => $configCache->get('system', 'basepath'),
+                                       '$urlpath'      => $configCache->get('system', 'urlpath'),
                                        '$dbhost'               => $configCache->get('database', 'hostname'),
                                        '$dbuser'               => $configCache->get('database', 'username'),
                                        '$dbpass'               => $configCache->get('database', 'password'),
                                        '$dbdata'               => $configCache->get('database', 'database'),
-                                       '$phpath'               => $configCache->get('config', 'php_path'),
                                        '$adminmail'    => ['config-admin_email',
                                                                                L10n::t('Site administrator email address'),
                                                                                $configCache->get('config', 'admin_email'),
@@ -212,6 +282,7 @@ class Install extends BaseModule
                                                                                L10n::t('Set the default language for your Friendica installation interface and to send emails.'),
                                                                                $lang_choices],
                                        '$baseurl'              => $a->getBaseURL(),
+                                       '$php_path' => $configCache->get('config', 'php_path'),
                                        '$submit'               => L10n::t('Submit')
                                ]);
                                break;
index 0c2350e2dea310644e0f3254ea2ac0239a393b37..b3418c20f4024878c9999ebf9f6d908d6374335b 100644 (file)
@@ -50,7 +50,6 @@ abstract class DatabaseTest extends MockedTest
                $profiler = \Mockery::mock(Profiler::class);
 
                DBA::connect(
-                       $basePath,
                        $config,
                        $profiler,
                        new VoidLogger(),
index 23920ff6f434d30f666472f8011184ed3aebe951..0bbacaf48d8d187672eae23f12cfb8f80ad42f0d 100644 (file)
@@ -39,10 +39,9 @@ trait AppMockTrait
         * Mock the App
         *
         * @param vfsStreamDirectory $root The root directory
-        * @param Config\Cache\ConfigCache $configCache
         * @param bool $raw If true, no config mocking will be done
         */
-       public function mockApp(vfsStreamDirectory $root, $configCache = null, $raw = false)
+       public function mockApp(vfsStreamDirectory $root, $raw = false)
        {
                $this->configMock = \Mockery::mock(Config\Cache\IConfigCache::class);
                $this->mode = \Mockery::mock(App\Mode::class);
@@ -50,7 +49,7 @@ trait AppMockTrait
                // Disable the adapter
                $configAdapterMock->shouldReceive('isConnected')->andReturn(false);
 
-               $config = new Config\Configuration((isset($configCache) ? $configCache : $this->configMock), $configAdapterMock);
+               $config = new Config\Configuration($this->configMock, $configAdapterMock);
                // Initialize empty Config
                Config::init($config);
 
@@ -69,7 +68,7 @@ trait AppMockTrait
 
                $this->app
                        ->shouldReceive('getConfigCache')
-                       ->andReturn((isset($configCache) ? $configCache : $this->configMock));
+                       ->andReturn($this->configMock);
                $this->app
                        ->shouldReceive('getTemplateEngine')
                        ->andReturn(new FriendicaSmartyEngine());
@@ -82,7 +81,7 @@ trait AppMockTrait
                $this->app
                        ->shouldReceive('getBaseUrl')
                        ->andReturnUsing(function () {
-                               return $this->app->getConfigCache()->get('system', 'url');
+                               return $this->configMock->get('system', 'url');
                        });
 
                BaseObject::setApp($this->app);
index 933b9a45ae31346ea59bf2617eff7528902de0f3..8dc3304f2bd7341451bcce63aab382393404a68f 100644 (file)
@@ -55,7 +55,7 @@ class ApiTest extends DatabaseTest
                $configLoader = new ConfigFileLoader($basePath, $mode);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create('test', $config, $profiler);
index f24f56cdb54281132eb14159fa451df442266f82..30c8b4b850ec2fe73f9db9727a95b134e36ea931 100644 (file)
@@ -56,7 +56,7 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
                $this->configCache->set('config', 'php_path', trim(shell_exec('which php')));
                $this->configCache->set('system', 'theme', 'smarty3');
 
-               $this->mockApp($this->root, null, true);
+               $this->mockApp($this->root, true);
 
                $this->configMock->shouldReceive('set')->andReturnUsing(function ($cat, $key, $value) {
                        if ($key !== 'basepath') {
@@ -97,10 +97,14 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
                                        ],
                                        'config' => [
                                                'php_path'    => '',
+                                               'hostname'    => 'friendica.local',
                                                'admin_email' => '',
                                        ],
                                        'system' => [
+                                               'basepath'    => '',
                                                'urlpath'     => '',
+                                               'url'         => 'http://friendica.local',
+                                               'ssl_policy'  => '',
                                                'default_timezone' => '',
                                                'language'    => '',
                                        ],
@@ -117,10 +121,14 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
                                        ],
                                        'config' => [
                                                'php_path'    => '',
+                                               'hostname'    => 'friendica.local',
                                                'admin_email' => 'admin@philipp.info',
                                        ],
                                        'system' => [
                                                'urlpath'     => 'test/it',
+                                               'url'         => 'http://friendica.local/test/it',
+                                               'basepath'    => '',
+                                               'ssl_policy'  => '2',
                                                'default_timezone' => 'en',
                                                'language'    => 'Europe/Berlin',
                                        ],
@@ -137,10 +145,14 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
                                        ],
                                        'config' => [
                                                'php_path'    => '',
+                                               'hostname'    => 'friendica.local',
                                                'admin_email' => 'admin@philipp.info',
                                        ],
                                        'system' => [
                                                'urlpath'     => 'test/it',
+                                               'url'         => 'https://friendica.local/test/it',
+                                               'basepath'    => '',
+                                               'ssl_policy'  => '1',
                                                'default_timezone' => 'en',
                                                'language'    => 'Europe/Berlin',
                                        ],
@@ -236,6 +248,30 @@ Checking database...
 Could not connect to database.: 
 
 
+FIN;
+
+               $this->assertEquals($finished, $txt);
+       }
+
+       private function assertStuckHostnam($txt)
+       {
+               $finished = <<<FIN
+Initializing setup...
+
+ Complete!
+
+
+Checking environment...
+
+ NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.
+
+ Complete!
+
+
+Creating config file...
+
+The Friendica hostname has to be set during CLI installation.
+
 FIN;
 
                $this->assertEquals($finished, $txt);
@@ -269,8 +305,9 @@ FIN;
         * @param boolean    $saveDb       True, if the db credentials should get saved to the file
         * @param boolean    $default      True, if we use the default values
         * @param boolean    $defaultDb    True, if we use the default value for the DB
+        * @param boolean    $realBasepath True, if we use the real basepath of the installation, not the mocked one
         */
-       public function assertConfig($assertion = null, $saveDb = false, $default = true, $defaultDb = true)
+       public function assertConfig($assertion = null, $saveDb = false, $default = true, $defaultDb = true, $realBasepath = false)
        {
                if (!empty($assertion['database']['hostname'])) {
                        $assertion['database']['hostname'] .= (!empty($assertion['database']['port']) ? ':' . $assertion['database']['port'] : '');
@@ -283,18 +320,35 @@ FIN;
 
                $this->assertConfigEntry('config', 'admin_email', $assertion);
                $this->assertConfigEntry('config', 'php_path', trim(shell_exec('which php')));
+               $this->assertConfigEntry('config', 'hostname', $assertion);
 
                $this->assertConfigEntry('system', 'default_timezone', $assertion, ($default) ? Installer::DEFAULT_TZ : null);
                $this->assertConfigEntry('system', 'language', $assertion, ($default) ? Installer::DEFAULT_LANG : null);
+               $this->assertConfigEntry('system', 'url', $assertion);
+               $this->assertConfigEntry('system', 'urlpath', $assertion);
+               $this->assertConfigEntry('system', 'ssl_policy', $assertion, ($default) ? SSL_POLICY_NONE : null);
+               $this->assertConfigEntry('system', 'basepath', ($realBasepath) ? $this->root->url() : $assertion);
        }
 
        /**
         * Test the automatic installation without any parameter/setting
+        * Should stuck because of missing hostname
         */
        public function testEmpty()
        {
-               $this->app->shouldReceive('getURLPath')->andReturn('')->atLeast()->once();
+               $console = new AutomaticInstallation($this->consoleArgv);
+
+               $txt = $this->dumpExecute($console);
+
+               $this->assertStuckHostnam($txt);
+       }
 
+       /**
+        * Test the automatic installation without any parameter/setting
+        * except hostname
+        */
+       public function testEmptyWithHostname()
+       {
                $this->mockConnect(true, 1);
                $this->mockConnected(true, 1);
                $this->mockExistsTable('user', false, 1);
@@ -304,13 +358,14 @@ FIN;
                $this->mockReplaceMacros('testTemplate', \Mockery::any(), '', 1);
 
                $console = new AutomaticInstallation($this->consoleArgv);
+               $console->setOption('n', 'friendica.local');
 
                $txt = $this->dumpExecute($console);
 
                $this->assertFinished($txt, true, false);
                $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php'));
 
-               $this->assertConfig();
+               $this->assertConfig(['config' => ['hostname' => 'friendica.local'], 'system' => ['url' => 'http://friendica.local']], false, true, true, true);
        }
 
        /**
@@ -356,12 +411,16 @@ return [
 
        'config' => [
                'admin_email' => '{$conf('config', 'admin_email')}',
+               'hostname' => '{$conf('config', 'hostname')}',
                'sitename' => 'Friendica Social Network',
                'register_policy' => \Friendica\Module\Register::OPEN,
                'register_text' => '',
        ],
        'system' => [
+               'basepath' => '{$conf('system', 'basepath')}',
                'urlpath' => '{$conf('system', 'urlpath')}',
+               'url' => '{$conf('system', 'url')}',
+               'ssl_policy' => '{$conf('system', 'ssl_policy')}',
                'default_timezone' => '{$conf('system', 'default_timezone')}',
                'language' => '{$conf('system', 'language')}',
        ],
@@ -392,8 +451,6 @@ CONF;
         */
        public function testWithEnvironmentAndSave(array $data)
        {
-               $this->app->shouldReceive('getURLPath')->andReturn('')->atLeast()->once();
-
                $this->mockConnect(true, 1);
                $this->mockConnected(true, 1);
                $this->mockExistsTable('user', false, 1);
@@ -408,11 +465,14 @@ CONF;
                $this->assertTrue(putenv('MYSQL_USERNAME=' . $data['database']['username']));
                $this->assertTrue(putenv('MYSQL_PASSWORD=' . $data['database']['password']));
 
+               $this->assertTrue(putenv('FRIENDICA_HOSTNAME='   . $data['config']['hostname']));
+               $this->assertTrue(putenv('FRIENDICA_BASE_PATH='  . $data['system']['basepath']));
                $this->assertTrue(putenv('FRIENDICA_URL_PATH='   . $data['system']['urlpath']));
                $this->assertTrue(putenv('FRIENDICA_PHP_PATH='   . $data['config']['php_path']));
                $this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=' . $data['config']['admin_email']));
                $this->assertTrue(putenv('FRIENDICA_TZ='         . $data['system']['default_timezone']));
                $this->assertTrue(putenv('FRIENDICA_LANG='       . $data['system']['language']));
+               $this->assertTrue(putenv('FRIENDICA_SSL_POLICY=' . $data['system']['ssl_policy']));
 
                $console = new AutomaticInstallation($this->consoleArgv);
                $console->setOption('savedb', true);
@@ -420,7 +480,7 @@ CONF;
                $txt = $this->dumpExecute($console);
 
                $this->assertFinished($txt, true);
-               $this->assertConfig($data, true, true, false);
+               $this->assertConfig($data, true, true, false, true);
        }
 
        /**
@@ -430,8 +490,6 @@ CONF;
         */
        public function testWithEnvironmentWithoutSave(array $data)
        {
-               $this->app->shouldReceive('getURLPath')->andReturn('')->atLeast()->once();
-
                $this->mockConnect(true, 1);
                $this->mockConnected(true, 1);
                $this->mockExistsTable('user', false, 1);
@@ -446,18 +504,21 @@ CONF;
                $this->assertTrue(putenv('MYSQL_USERNAME=' . $data['database']['username']));
                $this->assertTrue(putenv('MYSQL_PASSWORD=' . $data['database']['password']));
 
-               $this->assertTrue(putenv('FRIENDICA_URL_PATH=' . $data['system']['urlpath']));
-               $this->assertTrue(putenv('FRIENDICA_PHP_PATH=' . $data['config']['php_path']));
+               $this->assertTrue(putenv('FRIENDICA_HOSTNAME='   . $data['config']['hostname']));
+               $this->assertTrue(putenv('FRIENDICA_BASE_PATH='  . $data['system']['basepath']));
+               $this->assertTrue(putenv('FRIENDICA_URL_PATH='   . $data['system']['urlpath']));
+               $this->assertTrue(putenv('FRIENDICA_PHP_PATH='   . $data['config']['php_path']));
                $this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=' . $data['config']['admin_email']));
-               $this->assertTrue(putenv('FRIENDICA_TZ=' . $data['system']['default_timezone']));
-               $this->assertTrue(putenv('FRIENDICA_LANG=' . $data['system']['language']));
+               $this->assertTrue(putenv('FRIENDICA_TZ='         . $data['system']['default_timezone']));
+               $this->assertTrue(putenv('FRIENDICA_LANG='       . $data['system']['language']));
+               $this->assertTrue(putenv('FRIENDICA_SSL_POLICY=' . $data['system']['ssl_policy']));
 
                $console = new AutomaticInstallation($this->consoleArgv);
 
                $txt = $this->dumpExecute($console);
 
                $this->assertFinished($txt, true);
-               $this->assertConfig($data, false, true);
+               $this->assertConfig($data, false, true, false, true);
        }
 
        /**
@@ -466,8 +527,6 @@ CONF;
         */
        public function testWithArguments(array $data)
        {
-               $this->app->shouldReceive('getURLPath')->andReturn('')->atLeast()->once();
-
                $this->mockConnect(true, 1);
                $this->mockConnected(true, 1);
                $this->mockExistsTable('user', false, 1);
@@ -483,21 +542,24 @@ CONF;
                                $console->setOption($var, $data[$cat][$key]);
                        }
                };
-               $option('dbhost'   , 'database', 'hostname');
-               $option('dbport'   , 'database', 'port');
-               $option('dbuser'   , 'database', 'username');
-               $option('dbpass'   , 'database', 'password');
-               $option('dbdata'   , 'database', 'database');
-               $option('urlpath'  , 'system'  , 'urlpath');
-               $option('phppath'  , 'config'  , 'php_path');
-               $option('admin'    , 'config'  , 'admin_email');
-               $option('tz'       , 'system'  , 'default_timezone');
-               $option('lang'     , 'system'  , 'language');
+               $option('dbhost'    , 'database', 'hostname');
+               $option('dbport'    , 'database', 'port');
+               $option('dbuser'    , 'database', 'username');
+               $option('dbpass'    , 'database', 'password');
+               $option('dbdata'    , 'database', 'database');
+               $option('urlpath'   , 'system'  , 'urlpath');
+               $option('phppath'   , 'config'  , 'php_path');
+               $option('admin'     , 'config'  , 'admin_email');
+               $option('tz'        , 'system'  , 'default_timezone');
+               $option('lang'      , 'system'  , 'language');
+               $option('hostname'  , 'config'  , 'hostname');
+               $option('basepath'  , 'system'  , 'basepath');
+               $option('sslpolicy' , 'system'  , 'ssl_policy');
 
                $txt = $this->dumpExecute($console);
 
                $this->assertFinished($txt, true);
-               $this->assertConfig($data, true, true, true);
+               $this->assertConfig($data, true, true, true, true);
        }
 
        /**
@@ -505,20 +567,20 @@ CONF;
         */
        public function testNoDatabaseConnection()
        {
-               $this->app->shouldReceive('getURLPath')->andReturn('')->atLeast()->once();
                $this->mockConnect(false, 1);
 
                $this->mockGetMarkupTemplate('local.config.tpl', 'testTemplate', 1);
                $this->mockReplaceMacros('testTemplate', \Mockery::any(), '', 1);
 
                $console = new AutomaticInstallation($this->consoleArgv);
+               $console->setOption('n', 'friendica.local');
 
                $txt = $this->dumpExecute($console);
 
                $this->assertStuckDB($txt);
                $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php'));
 
-               $this->assertConfig(null, false, true, false);
+               $this->assertConfig(['config' => ['hostname' => 'friendica.local'], 'system' => ['url' => 'http://friendica.local']], false, true, false, true);
        }
 
        public function testGetHelp()
@@ -540,17 +602,19 @@ Options
     -v                      Show more debug information.
     -a                      All setup checks are required (except .htaccess)
     -f|--file <config>      prepared config file (e.g. "config/local.config.php" itself) which will override every other config option - except the environment variables)
-    -s|--savedb             Save the DB credentials to the file (if environment variables is used)
-    -H|--dbhost <host>      The host of the mysql/mariadb database (env MYSQL_HOST)
-    -p|--dbport <port>      The port of the mysql/mariadb database (env MYSQL_PORT)
-    -d|--dbdata <database>  The name of the mysql/mariadb database (env MYSQL_DATABASE)
-    -U|--dbuser <username>  The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME)
-    -P|--dbpass <password>  The password of the mysql/mariadb database login (env MYSQL_PASSWORD)
-    -u|--urlpath <url_path> The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH) 
-    -b|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH) 
-    -A|--admin <mail>       The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL)
-    -T|--tz <timezone>      The timezone of Friendica (env FRIENDICA_TZ)
-    -L|--lang <language>    The language of Friendica (env FRIENDICA_LANG)
+    -s|--savedb                 Save the DB credentials to the file (if environment variables is used)
+    -H|--dbhost <host>          The host of the mysql/mariadb database (env MYSQL_HOST)
+    -p|--dbport <port>          The port of the mysql/mariadb database (env MYSQL_PORT)
+    -d|--dbdata <database>      The name of the mysql/mariadb database (env MYSQL_DATABASE)
+    -U|--dbuser <username>      The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME)
+    -P|--dbpass <password>      The password of the mysql/mariadb database login (env MYSQL_PASSWORD)
+    -U|--urlpath <url_path>     The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH) 
+    -B|--phppath <php_path>     The path of the PHP binary (env FRIENDICA_PHP_PATH)
+    -b|--basepath <base_path>   The basepath of Friendica(env FRIENDICA_BASE_PATH)
+    -S|--sslpolicy <ssl_policy> The SSL policy of Friendica (env FRIENDICA_SSL_POLICY) 
+    -n|--hostname <hostname>    The hostname of Friendica (env FRIENDICA_PHP_HOSTNAME)  
+    -t|--tz <timezone>          The timezone of Friendica (env FRIENDICA_TZ)
+    -L|--lang <language>        The language of Friendica (env FRIENDICA_LANG)
  
 Environment variables
    MYSQL_HOST                  The host of the mysql/mariadb database (mandatory if mysql and environment is used)
@@ -558,9 +622,12 @@ Environment variables
    MYSQL_USERNAME|MYSQL_USER   The username of the mysql/mariadb database login (MYSQL_USERNAME is for mysql, MYSQL_USER for mariadb)
    MYSQL_PASSWORD              The password of the mysql/mariadb database login
    MYSQL_DATABASE              The name of the mysql/mariadb database
-   FRIENDICA_URL_PATH          The URL path of Friendica (f.e. '/friendica')
-   FRIENDICA_PHP_PATH          The path of the PHP binary
+   FRIENDICA_URL_PATH          The URL path of Friendica (f.e. '/friendica') - leave empty for auto detection
+   FRIENDICA_PHP_PATH          The path of the PHP binary - leave empty for auto detection
+   FRIENDICA_BASE_PATH         The basepath of Friendica - leave empty for auto detection
    FRIENDICA_ADMIN_MAIL        The admin email address of Friendica (this email will be used for admin access)
+   FRIENDICA_SSL_POLICY        The SSL policy of Friendica (default is NO SSL)
+   FRIENDICA_HOSTNAME          The hostname of Friendica - leave empty for auto detection
    FRIENDICA_TZ                The timezone of Friendica
    FRIENDICA_LANG              The langauge of Friendica
    
index e56596c6c090b67fc0574d9c0041d74723173da9..a238bf8e7d9389383ef0bc3738163c2a694d0978 100644 (file)
@@ -3,6 +3,7 @@
 // this is in the same namespace as Install for mocking 'function_exists'
 namespace Friendica\Core;
 
+use Friendica\Core\Config\Cache\IConfigCache;
 use Friendica\Network\CurlResult;
 use Friendica\Object\Image;
 use Friendica\Test\MockedTest;
@@ -392,6 +393,21 @@ class InstallerTest extends MockedTest
                        false,
                        $install->getChecks());
        }
+
+       /**
+        * Test the setup of the config cache for installation
+        */
+       public function testSetUpCache()
+       {
+               $this->mockL10nT();
+
+               $install = new Installer();
+               $configCache = \Mockery::mock(IConfigCache::class);
+               $configCache->shouldReceive('set')->with('config', 'php_path', \Mockery::any())->once();
+               $configCache->shouldReceive('set')->with('system', 'basepath', '/test/')->once();
+
+               $install->setUpCache($configCache, '/test/');
+       }
 }
 
 /**
index 21ccd1df1f9c916db39789c995ffc28fac343c1d..36bba1e65b9b6a531a77cfcc79bd75ba7f2d7919 100644 (file)
@@ -20,7 +20,7 @@ class DBATest extends DatabaseTest
                $configLoader = new ConfigFileLoader($basePath, $mode);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create('test', $config, $profiler);
index 4bf4ed51c44a8dccdc4d48ae2ea811c96c76e3a6..6050b7073ad8fd93d3cddc0d69984c9d70bb7d32 100644 (file)
@@ -20,7 +20,7 @@ class DBStructureTest extends DatabaseTest
                $configLoader = new ConfigFileLoader($basePath, $mode);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create('test', $config, $profiler);
diff --git a/tests/src/Util/BasePathTest.php b/tests/src/Util/BasePathTest.php
new file mode 100644 (file)
index 0000000..bb23cb6
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+namespace Friendica\Test\src\Util;
+
+use Friendica\Test\MockedTest;
+use Friendica\Util\BasePath;
+
+class BasePathTest extends MockedTest
+{
+       /**
+        * Test the basepath determination
+        */
+       public function testDetermineBasePath()
+       {
+               $serverArr = ['DOCUMENT_ROOT' => '/invalid', 'PWD' => '/invalid2'];
+               $this->assertEquals('/valid', BasePath::create('/valid', $serverArr));
+       }
+
+       /**
+        * Test the basepath determination with DOCUMENT_ROOT and PWD
+        */
+       public function testDetermineBasePathWithServer()
+       {
+               $serverArr = ['DOCUMENT_ROOT' => '/valid'];
+               $this->assertEquals('/valid', BasePath::create('', $serverArr));
+
+               $serverArr = ['PWD' => '/valid_too'];
+               $this->assertEquals('/valid_too', BasePath::create('', $serverArr));
+       }
+}
diff --git a/view/templates/install_base.tpl b/view/templates/install_base.tpl
new file mode 100644 (file)
index 0000000..712488f
--- /dev/null
@@ -0,0 +1,34 @@
+<h1><img src="{{$baseurl}}/images/friendica-32.png"> {{$title}}</h1>
+<h2>{{$pass}}</h2>
+
+<p>
+       {{$info_01}}<br>
+       {{$info_02}}<br>
+       {{$info_03}}
+</p>
+
+<table>
+       {{foreach $checks as $check}}
+       <tr><td>{{$check.title}} </td><td>
+                       {{if ! $check.status}}
+                       <img src="{{$baseurl}}/view/install/red.png" alt="Requirement not satisfied">
+                       {{/if}}
+                       {{/foreach}}
+</table>
+
+<form id="install-form" action="{{$baseurl}}/install" method="post">
+
+       <input type="hidden" name="config-php_path" value="{{$php_path}}" />
+       <input type="hidden" name="pass" value="3" />
+
+       {{include file="field_select.tpl" field=$ssl_policy}}
+       <br />
+       {{include file="field_input.tpl" field=$hostname}}
+       <br />
+       {{include file="field_input.tpl" field=$basepath}}
+       <br />
+       {{include file="field_input.tpl" field=$urlpath}}
+
+       <input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
+
+</form>
index 5c28f0e5f7ce4499d4eaa9d97d11fec2be55e0d6..1a5778cc83747564aa31bb1bca543830cbc698ba 100644 (file)
 <form id="install-form" action="{{$baseurl}}/install" method="post">
 
        <input type="hidden" name="config-php_path" value="{{$php_path}}" />
-       <input type="hidden" name="pass" value="3" />
+       <input type="hidden" name="config-hostname" value="{{$hostname}}" />
+       <input type="hidden" name="system-ssl_policy" value="{{$ssl_policy}}" />
+       <input type="hidden" name="system-basepath" value="{{$basepath}}" />
+       <input type="hidden" name="system-urlpath" value="{{$urlpath}}" />
+       <input type="hidden" name="pass" value="4" />
 
        {{include file="field_input.tpl" field=$dbhost}}
        {{include file="field_input.tpl" field=$dbuser}}
index 2f28a25c6f32a0838d6a52f9055da4c07d6c38cc..e17ef2456b9f1539fa5ef03ce96ee51cf046eeec 100644 (file)
@@ -7,14 +7,18 @@
 <form id="install-form" action="{{$baseurl}}/install" method="post">
 
 <input type="hidden" name="config-php_path" value="{{$php_path}}" />
+<input type="hidden" name="config-hostname" value="{{$hostname}}" />
+<input type="hidden" name="system-ssl_policy" value="{{$ssl_policy}}" />
+<input type="hidden" name="system-basepath" value="{{$basepath}}" />
+<input type="hidden" name="system-urlpath" value="{{$urlpath}}" />
 <input type="hidden" name="database-hostname" value="{{$dbhost}}" />
 <input type="hidden" name="database-username" value="{{$dbuser}}" />
 <input type="hidden" name="database-password" value="{{$dbpass}}" />
 <input type="hidden" name="database-database" value="{{$dbdata}}" />
-<input type="hidden" name="pass" value="4" />
+<input type="hidden" name="pass" value="5" />
 
-{{include file="field_input.tpl" field=$adminmail}}
-{{$timezone nofilter}}
+{{include file="field_input.tpl" field=$adminmail}} <br />
+{{$timezone nofilter}} <br />
 {{include file="field_select.tpl" field=$language}}
 
 <input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
index 3201a998542ab1c78f989059b8afeb152c2dd3f3..05c87056c69a67ba655e5fd51f13fc49bfec56a1 100644 (file)
@@ -24,11 +24,14 @@ return [
                'php_path' => '{{$phpath}}',
                'admin_email' => '{{$adminmail}}',
                'sitename' => 'Friendica Social Network',
+               'hostname' => '{{$hostname}}',
                'register_policy' => \Friendica\Module\Register::OPEN,
                'max_import_size' => 200000,
        ],
        'system' => [
                'urlpath' => '{{$urlpath}}',
+               'url' => '{{$baseurl}}',
+               'ssl_policy' => {{$sslpolicy}},
                'basepath' => '{{$basepath}}',
                'default_timezone' => '{{$timezone}}',
                'language' => '{{$language}}',