diff --git a/.platform.app.yaml b/.platform.app.yaml new file mode 100644 index 00000000..34ea42d1 --- /dev/null +++ b/.platform.app.yaml @@ -0,0 +1,51 @@ +name: bludit +type: "php:7.4" +disk: 256 + +# Configure the web server to serve our static site. +web: + locations: + '/': + root: '' + passthru: '/index.php' + scripts: true + allow: true + index: + - index.php + rules: + '\.(jpe?g|png|gif|svgz?|css|js|map|ico|bmp|eot|woff2?|otf|ttf)$': + allow: true + expires: 300s + '\.(php)$': + allow: false + + '/bl-content/uploads/pages/': + root: 'bl-content/uploads/pages' + passthru: false + scripts: false + allow: true + '/bl-content/databases/': + root: 'bl-content/databases/' + scripts: false + allow: false + passthru: false + '/bl-content/workspaces/': + root: 'bl-content/workspaces/' + scripts: false + allow: false + passthru: false + '/bl-content/tmp/': + root: 'bl-content/tmp/' + scripts: false + allow: false + passthru: false + +mounts: + 'bl-content': + source: local + source_path: 'bl-content' + +hooks: + deploy: | + PRIMARY_DOMAIN=$(echo $PLATFORM_ROUTES | base64 -d | jq -r 'to_entries[] | select(.value.primary==true) | .key') + php install.php language=en password=$BLUDIT_PASSWORD domain=$PRIMARY_DOMAIN timezone=UTC diff --git a/.platform/routes.yaml b/.platform/routes.yaml new file mode 100644 index 00000000..22e1b0eb --- /dev/null +++ b/.platform/routes.yaml @@ -0,0 +1,6 @@ +"https://{default}/": + type: upstream + upstream: "bludit:http" +"https://www.{default}/": + type: redirect + to: "https://{default}/" diff --git a/.platform/services.yaml b/.platform/services.yaml new file mode 100644 index 00000000..e69de29b diff --git a/install.php b/install.php index b6bf0c26..2eceb278 100644 --- a/install.php +++ b/install.php @@ -6,33 +6,65 @@ * Author Diego Najar * Bludit is opensource software licensed under the MIT license. */ +function printErrorAndExit($strMessage, $intErrorCode) { + printError($strMessage); + exit($intErrorCode); // A response code other than 0 is a failure +} + +function printError($strMessage) { + if(php_sapi_name() == "cli") { + // In CLI mode, we want to output the error to STDERR + fwrite(STDERR, $strMessage.PHP_EOL); + } else { + // In web mode, output to screen and error_log + error_log('[ERROR] '. $strMessage, 0); //0 = syslog + echo $strMessage . '
'; + } +} // Check PHP version if (version_compare(phpversion(), '5.6', '<')) { - $errorText = 'Current PHP version '.phpversion().', you need > 5.6.'; - error_log('[ERROR] '.$errorText, 0); - exit($errorText); + printErrorAndExit('Current PHP version '.phpversion().', you need > 5.6.', 1); +} + +$isCLI = (php_sapi_name() == "cli"); +if($isCLI && $argc > 1) { + // Get parameters from cli, and insert them into $_GET + // this allows us to call the script like this: + // `php install.php language=es` -> $_GET['language'] = 'es' + parse_str(implode('&',array_slice($argv, 1)), $_GET); + + $requiredParams = array('password', 'domain', 'timezone'); + foreach($requiredParams as $param) { + if(!isset($_GET[$param])) { + printErrorAndExit('Required parameter missing: ' . $param, 2); + } + } + if (strlen($_GET['password']) < 6) { + printErrorAndExit('Password should be 6 chars minimum.', 3); + } + // Move _GET to _POST so we can reuse existing install method + $_POST = $_GET; + $_SERVER['REQUEST_METHOD'] = 'POST';// fool PHP a bit } // Check PHP modules $modulesRequired = array('mbstring', 'json', 'gd', 'dom'); $modulesRequiredExit = false; -$modulesRequiredMissing = ''; +$modulesMissing = array(); foreach ($modulesRequired as $module) { if (!extension_loaded($module)) { - $errorText = 'PHP module '.$module.' is not installed.'; - error_log('[ERROR] '.$errorText, 0); - - $modulesRequiredExit = true; - $modulesRequiredMissing .= $errorText.PHP_EOL; + $modulesMissing[] = $module; } } -if ($modulesRequiredExit) { - echo 'PHP modules missing:'; - echo $modulesRequiredMissing; - echo ''; - echo 'Please read Bludit requirements.'; - exit(0); + +if ($modulesMissing) { + $errorText='Not all required PHP modules installed, missing: ' . implode($isCLI ? ',' : '
', $modulesMissing); + + if(!$isCLI) { + echo 'Please read Bludit requirements.'; + } + printErrorAndExit($errorText, 4); } // Security constant @@ -65,14 +97,18 @@ define('CHECK_SYMBOLIC_LINKS', TRUE); define('FILENAME', 'index.txt'); // Domain and protocol -define('DOMAIN', $_SERVER['HTTP_HOST']); +$domain = isset($_GET['domain']) ? $_GET['domain'] : $_SERVER['HTTP_HOST']; //allow setting the domain via $_GET (or CLI) +$protocol = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://'; -if (!empty($_SERVER['HTTPS'])) { - define('PROTOCOL', 'https://'); -} else { - define('PROTOCOL', 'http://'); +if(strlen($domain) > 5 && substr($domain,0,4)=='http'){ + $url = parse_url($domain); + $domain = $url['host']; + $protocol = $url['scheme'].'://'; } +define('DOMAIN', $domain); +define('PROTOCOL', $protocol); + // Base URL // Change the base URL or leave it empty if you want to Bludit try to detect the base URL. $base = ''; @@ -85,9 +121,9 @@ if (!empty($_SERVER['DOCUMENT_ROOT']) && !empty($_SERVER['SCRIPT_NAME']) && empt $base = dirname($base); } -if (strpos($_SERVER['REQUEST_URI'], $base)!==0) { +if (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], $base)!==0) { $base = '/'; -} elseif ($base!=DS) { +} elseif ($base!=DS && $base!='.') { $base = trim($base, '/'); $base = '/'.$base.'/'; } else { @@ -95,7 +131,7 @@ if (strpos($_SERVER['REQUEST_URI'], $base)!==0) { $base = '/'; } -define('HTML_PATH_ROOT', $base); +define('HTML_PATH_ROOT', isset($_GET['html_path_root']) ? $_GET['html_path_root'] : $base); // Log separator define('LOG_SEP', ' | '); @@ -272,8 +308,7 @@ function install($adminPassword, $timezone) $pagesToInstall = array('example-page-1-slug', 'example-page-2-slug', 'example-page-3-slug', 'example-page-4-slug'); foreach ($pagesToInstall as $page) { if (!mkdir(PATH_PAGES.$L->get($page), DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_PAGES.$L->get($page); - error_log('[ERROR] '.$errorText, 0); + printError('Error when trying to created the directory=>'.PATH_PAGES.$L->get($page)); } } @@ -281,36 +316,30 @@ function install($adminPassword, $timezone) $pluginsToInstall = array('tinymce', 'about', 'simple-stats', 'robots', 'canonical'); foreach ($pluginsToInstall as $plugin) { if (!mkdir(PATH_PLUGINS_DATABASES.$plugin, DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_PLUGINS_DATABASES.$plugin; - error_log('[ERROR] '.$errorText, 0); + printError('Error when trying to created the directory=>'.PATH_PLUGINS_DATABASES.$plugin); } } // Directories for upload files if (!mkdir(PATH_UPLOADS_PROFILES, DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_UPLOADS_PROFILES; - error_log('[ERROR] '.$errorText, 0); + printError('Error when trying to created the directory=>'.PATH_UPLOADS_PROFILES); } if (!mkdir(PATH_UPLOADS_THUMBNAILS, DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_UPLOADS_THUMBNAILS; - error_log('[ERROR] '.$errorText, 0); + printError('Error when trying to created the directory=>'.PATH_UPLOADS_THUMBNAILS); } if (!mkdir(PATH_TMP, DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_TMP; - error_log('[ERROR] '.$errorText, 0); + printError('Error when trying to created the directory=>'.PATH_TMP); } if (!mkdir(PATH_WORKSPACES, DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_WORKSPACES; - error_log('[ERROR] '.$errorText, 0); + printError('Error when trying to created the directory=>'.PATH_WORKSPACES); } if (!mkdir(PATH_UPLOADS_PAGES, DIR_PERMISSIONS, true)) { - $errorText = 'Error when trying to created the directory=>'.PATH_UPLOADS_PAGES; - error_log('[ERROR] '.$errorText, 0); - } + printError('Error when trying to created the directory=>'.PATH_UPLOADS_PAGES); + } // ============================================================================ // Create files @@ -552,9 +581,7 @@ function redirect($url) { // ============================================================================ if (alreadyInstalled()) { - $errorText = 'Bludit is already installed ;)'; - error_log('[ERROR] '.$errorText, 0); - exit($errorText); + printErrorAndExit('Bludit is already installed ;-)', 199); } // Install a demo, just call the install.php?demo=true @@ -563,17 +590,23 @@ if (isset($_GET['demo'])) { redirect(HTML_PATH_ROOT); } + // Install by POST method if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (Text::length($_POST['password'])<6) { - $errorText = $L->g('password-must-be-at-least-6-characters-long'); - error_log('[ERROR] '.$errorText, 0); + printError($L->g('password-must-be-at-least-6-characters-long')); } else { - install($_POST['password'], $_POST['timezone']); - redirect(HTML_PATH_ROOT); + if(install($_POST['password'], $_POST['timezone'])) { + // Succesfull install + if($isCLI) { + echo 'Bludit installed succesfully!'; + exit(0); + } else { + redirect(HTML_PATH_ROOT); + } + }; } } - ?>