static function bootstrap()
{
# Asserting PHP 5.5.0+
if (version_compare(PHP_VERSION, '5.5.0', '<')) {
die('Flake Fatal Error: Flake requires PHP 5.5.0+ to run properly. Your version is: ' . PHP_VERSION . '.');
}
# Define safehash salt
define("PROJECT_SAFEHASH_SALT", "strong-secret-salt");
# Define absolute server path to Flake Framework
define("FLAKE_PATH_ROOT", PROJECT_PATH_ROOT . "Core/Frameworks/Flake/");
# ./
if (!defined('LF')) {
define('LF', chr(10));
}
if (!defined('CR')) {
define('CR', chr(13));
}
if (array_key_exists("SERVER_NAME", $_SERVER) && $_SERVER["SERVER_NAME"] === "mongoose") {
define("MONGOOSE_SERVER", true);
} else {
define("MONGOOSE_SERVER", false);
}
# Undo magic_quotes as this cannot be disabled by .htaccess on PHP ran as CGI
# Source: http://stackoverflow.com/questions/517008/how-to-turn-off-magic-quotes-on-shared-hosting
# Also: https://github.com/netgusto/Baikal/issues/155
if (in_array(strtolower(ini_get('magic_quotes_gpc')), ['1', 'on'])) {
$process = [];
if (isset($_GET) && is_array($_GET)) {
$process[] =& $_GET;
}
if (isset($_POST) && is_array($_POST)) {
$process[] =& $_POST;
}
if (isset($_COOKIE) && is_array($_COOKIE)) {
$process[] =& $_COOKIE;
}
if (isset($_REQUEST) && is_array($_REQUEST)) {
$process[] =& $_REQUEST;
}
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] =& $process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
# Fixing some CGI environments, that prefix HTTP_AUTHORIZATION (forwarded in .htaccess) with "REDIRECT_"
if (array_key_exists("REDIRECT_HTTP_AUTHORIZATION", $_SERVER)) {
$_SERVER["HTTP_AUTHORIZATION"] = $_SERVER["REDIRECT_HTTP_AUTHORIZATION"];
}
#################################################################################################
# determine Flake install root path
# not using realpath here to avoid symlinks resolution
define("PROJECT_PATH_CORE", PROJECT_PATH_ROOT . "Core/");
define("PROJECT_PATH_CORERESOURCES", PROJECT_PATH_CORE . "Resources/");
define("PROJECT_PATH_SPECIFIC", PROJECT_PATH_ROOT . "Specific/");
define("PROJECT_PATH_FRAMEWORKS", PROJECT_PATH_CORE . "Frameworks/");
define("PROJECT_PATH_WWWROOT", PROJECT_PATH_CORE . "WWWRoot/");
require_once PROJECT_PATH_CORE . "Distrib.php";
define("PROJECT_PATH_DOCUMENTROOT", PROJECT_PATH_ROOT . "html/");
# Determine PROJECT_BASEURI
$sScript = substr($_SERVER["SCRIPT_FILENAME"], strlen($_SERVER["DOCUMENT_ROOT"]));
$sDirName = str_replace("\\", "/", dirname($sScript));
# fix windows backslashes
if ($sDirName !== ".") {
$sDirName = self::appendSlash($sDirName);
} else {
$sDirName = "/";
}
$sBaseUrl = self::rmBeginSlash(self::rmProjectContext($sDirName));
define("PROJECT_BASEURI", self::prependSlash($sBaseUrl));
# SabreDAV needs a "/" at the beginning of BASEURL
# Determine PROJECT_URI
$sProtocol = \Flake\Util\Tools::getCurrentProtocol();
$sHttpBaseUrl = strtolower($_SERVER["REQUEST_URI"]);
$sHttpBaseUrl = self::rmQuery($sHttpBaseUrl);
$sHttpBaseUrl = self::rmScriptName($sHttpBaseUrl, $sScript);
$sHttpBaseUrl = self::rmProjectContext($sHttpBaseUrl);
define("PROJECT_URI", $sProtocol . "://" . $_SERVER["HTTP_HOST"] . $sHttpBaseUrl);
unset($sScript);
unset($sDirName);
unset($sBaseUrl);
unset($sProtocol);
unset($sHttpBaseUrl);
#################################################################################################
# Include Flake Framework config
require_once FLAKE_PATH_ROOT . "config.php";
# Determine Router class
$GLOBALS["ROUTER"] = \Flake\Util\Tools::router();
if (!\Flake\Util\Tools::isCliPhp()) {
ini_set("html_errors", true);
session_start();
if (!isset($_SESSION['CSRF_TOKEN'])) {
$_SESSION['CSRF_TOKEN'] = bin2hex(openssl_random_pseudo_bytes(20));
}
}
setlocale(LC_ALL, FLAKE_LOCALE);
date_default_timezone_set(FLAKE_TIMEZONE);
$GLOBALS["TEMPLATESTACK"] = [];
$aUrlInfo = parse_url(PROJECT_URI);
define("FLAKE_DOMAIN", $_SERVER["HTTP_HOST"]);
define("FLAKE_URIPATH", \Flake\Util\Tools::stripBeginSlash($aUrlInfo["path"]));
unset($aUrlInfo);
# Include Project config
# NOTE: DB initialization and App config files inclusion
# do not break execution if not properly executed, as
# these errors will have to be caught later in the process
# notably by the App install tool, if available; breaking right now
# would forbid such install tool forwarding, for instance
$sConfigPath = PROJECT_PATH_SPECIFIC . "config.php";
$sConfigSystemPath = PROJECT_PATH_SPECIFIC . "config.system.php";
if (file_exists($sConfigPath)) {
require_once $sConfigPath;
}
if (file_exists($sConfigSystemPath)) {
require_once $sConfigSystemPath;
}
self::initDb();
}