/** * Inicializovat system * * @param string $root relativni cesta do korenoveho adresare * @param string|null $configFile cesta ke konfiguracnimu skriptu nebo null(= vychozi) * @param bool $envChanges provest zmeny v prostredi (error reporting, locale, header, ...) 1/0 * @param bool $lightMode odlehceny mod (pouze pripojeni k db, bez session, nastaveni, lokalizace, atd) 1/0 * @param bool $databaseEnabled inicializovat pripojeni k databazi 1/0 * @param bool $runCron automaticky spustit cron, je-li aktivovan 1/0 */ public static function init($root, $configFile = null, $envChanges = true, $lightMode = false, $databaseEnabled = true, $runCron = true) { if (self::$initialized) { throw new BadMethodCallException(); } $initialized = true; self::$start = microtime(true); /* ---- konfigurace ---- */ if (null === $configFile) { self::$configFile = $root . 'config.php'; } else { self::$configFile = $configFile; } self::$envChanges = $envChanges; self::$lightMode = $lightMode; self::$databaseEnabled = $databaseEnabled; self::$imageError = $root . 'remote/image_error.png'; // soubor s nastavenim require self::$configFile; // doplneni konfigurace (kvuli kompatibilite) if (!isset($locale)) { $locale = array('czech', 'utf8', 'cz_CZ'); } if (!isset($timezone)) { $timezone = 'Europe/Prague'; } if (!isset($geo)) { $geo = array(50.5, 14.26, 90.583333); } if (!isset($port)) { // pokud neni uveden $port, muze byt definovan jako soucast $server (server:port) if (false !== ($serverColonPos = strpos($server, ':'))) { $port = (int) substr($server, $serverColonPos + 1); $server = substr($server, 0, $serverColonPos); } else { $port = ini_get('mysqli.default_port'); } } // systemove konstanty define('_indexroot', $root); define('_core', '1'); define('_nl', "\n"); define('_sessionprefix', md5($server . $database . $user . $prefix) . '-'); if (!defined('_administration')) { define('_administration', 0); } define('_dev', isset($dev) ? $dev : true); // vyvojovy mod 1/0 define('_systemstate', 0); // 0 = beta, 1 = rc, 2 = stable define('_systemstate_revision', 0); // revize systemu define('_systemversion', '7.5.5'); // verze systemu define('_mysql_prefix', $prefix); define('_mysql_db', $database); define('_upload_dir', _indexroot . 'upload/'); define('_plugin_dir', _indexroot . 'plugins/common/'); define('_tmp_dir', _indexroot . 'data/tmp/'); define('_void_file', _indexroot . 'data/void.nodelete'); define('_geo_latitude', $geo[0]); define('_geo_longitude', $geo[1]); define('_geo_zenith', $geo[2]); /* ---- autoloader ---- */ require _indexroot . 'require/class/class_loader.php'; self::$classLoader = new ClassLoader(); self::$classLoader->setDebug(_dev)->registerClassMap(array('AdminBread' => _indexroot . 'require/class/admin_bread.php', 'Color' => _indexroot . 'require/class/color.php', 'DBDump' => _indexroot . 'require/class/dbdump.php', 'KZip' => _indexroot . 'require/class/kzip.php', 'KZipStream' => _indexroot . 'require/class/kzip.php', 'TreeManager' => _indexroot . 'require/class/tree_manager.php', 'TreeReader' => _indexroot . 'require/class/tree_reader.php', 'LangPack' => _indexroot . 'require/class/lang_pack.php', 'FileCache' => _indexroot . 'require/class/file_cache.php'))->register(); /* ---- upravy PHP prostredi ---- */ if ($envChanges) { // kontrola verze PHP a pritomnosti rozsireni if (version_compare(PHP_VERSION, '5.1.0', '<')) { _systemFailure('Je vyžadováno PHP 5.1.0 nebo novější.'); } if (!extension_loaded('mbstring')) { _systemFailure('Chybí PHP rozšíření <code>mbstring</code> (Multibyte String Functions).'); } if (!extension_loaded('mysqli')) { _systemFailure('Chybí PHP rozšíření <code>mysqli</code>, které je potřebné pro práci s databází.'); } // kontrola a nastaveni $_SERVER['REQUEST_URI'] if (!isset($_SERVER['REQUEST_URI'])) { if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL']; } elseif (isset($_SERVER['HTTP_REQUEST_URI'])) { $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI']; } else { if (isset($_SERVER['SCRIPT_NAME'])) { $_SERVER['HTTP_REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; } else { $_SERVER['HTTP_REQUEST_URI'] = $_SERVER['PHP_SELF']; } if (!empty($_SERVER['QUERY_STRING'])) { $_SERVER['HTTP_REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; } $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI']; } } // vyruseni register_globals if (ini_get('register_globals') != '') { foreach (array_keys($_REQUEST) as $key) { unset($GLOBALS[$key]); } } // vypnuti magic_quotes if (get_magic_quotes_gpc()) { $search = array(&$_GET, &$_POST, &$_COOKIE); for ($i = 0; isset($search[$i]); ++$i) { foreach ($search[$i] as &$value) { if (is_array($value)) { $search[] =& $value; } else { $value = stripslashes($value); } } unset($search[$i]); } if (function_exists('set_magic_quotes_runtime')) { @set_magic_quotes_runtime(0); } unset($search, $i, $value); } // hlaseni chyb $err_rep = E_ALL; if (_dev) { $disable = array(); } else { $disable = array('E_NOTICE ', 'E_USER_NOTICE', 'E_DEPRECATED', 'E_STRICT'); } for ($i = 0; isset($disable[$i]); ++$i) { if (defined($disable[$i])) { $err_rep &= ~constant($disable[$i]); } } error_reporting($err_rep); // casove pasmo @setlocale(LC_TIME, $locale); if (function_exists('date_default_timezone_set')) { date_default_timezone_set($timezone); } // interni kodovani mb_internal_encoding('UTF-8'); // vychozi hlavicky if (!defined('_header')) { header('Content-Type: text/html; charset=UTF-8'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() - 604800) . ' GMT'); } elseif (_header) { header(_header); } } /* ---- nacteni funkci ---- */ require _indexroot . 'require/functions.php'; if (isset($_GET['___identify'])) { echo 'SunLight CMS ', _systemversion, ' ', self::$states[_systemstate], _systemstate_revision; exit; } /* ---- pripojeni k mysql ---- */ if ($databaseEnabled) { $con = @mysqli_connect($server, $user, $password, $database, $port); if (!is_object($con)) { _systemFailure('Připojení k databázi se nezdařilo. Důvodem je pravděpodobně výpadek serveru nebo chybné přístupové údaje.</p><hr /><pre>' . _htmlStr(mysqli_connect_error()) . '</pre><hr /><p>Zkontrolujte přístupové údaje v souboru <em>config.php</em>.'); } $con->set_charset('utf8'); DB::$con = $con; DB::query('SET sql_mode=\'\''); } /* ---- konstanty nastaveni, jazykovy soubor, motiv, session ---- */ if (!$lightMode) { // definovani konstant nastaveni $query = DB::query('SELECT * FROM `' . _mysql_prefix . '-settings`', true); $directive = array('banned' => ''); if (DB::error() != false) { _systemFailure('Připojení k databázi proběhlo úspěšně, ale dotaz na databázi selhal.</p><hr /><pre>' . _htmlStr(DB::error()) . '</pre><hr /><p>Zkontrolujte, zda je databáze správně nainstalovaná.'); } while ($item = DB::row($query)) { if (isset($directive[$item['var']])) { // direktiva $directive[$item['var']] = $item['val']; } elseif ($item['var'][0] === '.') { // nastaveni zacinajici teckou self::$settings[substr($item['var'], 1)] = $item['val']; } else { // konstanta define('_' . $item['var'], $item['val']); } } DB::free($query); // nastavit interval pro maintenance self::$cronIntervals['maintenance'] = _maintenance_interval; // ip adresa klienta if (empty($_SERVER['REMOTE_ADDR'])) { $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; } if (_proxy_mode && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } define('_userip', trim(($addr_comma = strrpos($ip, ',')) === false ? $ip : substr($ip, $addr_comma + 1))); // poinstalacni kontrola if (_install_check) { require _indexroot . 'require/installcheck.php'; } // kontrola verze databaze if (!defined('_dbversion') or !_checkVersion('database', _dbversion)) { _systemFailure('Verze nainstalované databáze není kompatibilní s verzí systému. Pokud byl právě aplikován patch pro přechod na novější verzi, pravděpodobně jste zapoměl(a) spustit skript pro aktualizaci databáze.'); } // inicializace session require _indexroot . 'require/session.php'; // inicializace jazykoveho souboru if (_loginindicator and _language_allowcustom and _loginlanguage != "") { $language = _loginlanguage; } else { $language = _language; } $langfile = _indexroot . 'plugins/languages/' . $language . '.php'; $langfile_default = _indexroot . 'plugins/languages/default.php'; if (file_exists($langfile)) { $GLOBALS['_lang'] = (require $langfile); define('_active_language', $language); } else { if (file_exists($langfile_default)) { $GLOBALS['_lang'] = (require $langfile_default); define('_active_language', 'default'); } else { _systemFailure('Zvolený ani přednastavený jazykový soubor nebyl nalezen.'); } } // kontrola verze jazykoveho souboru if (!_checkVersion('language_file', $GLOBALS['_lang']['main.version'])) { DB::query('UPDATE `' . _mysql_prefix . '-settings` SET val="default" WHERE var="language"'); _systemFailure('Zvolený jazykový soubor není kompatibilní s verzí systému.'); } // kontrola blokace IP if ($directive['banned'] !== '' && !_administration) { $directive['banned'] = explode("\n", $directive['banned']); for ($i = 0; isset($directive['banned'][$i]); ++$i) { if (0 === strncmp($directive['banned'][$i], _userip, strlen($directive['banned'][$i]))) { header('HTTP/1.0 403 Forbidden'); if (defined('_header')) { die('Your IP address is banned'); } require _indexroot . 'require/ipban.php'; die; } } } // motiv $template = _indexroot . 'plugins/templates/' . _template . '/template.php'; $template_config = _indexroot . 'plugins/templates/' . _template . '/config.php'; if (!file_exists($template) or !file_exists($template_config)) { DB::query('UPDATE `' . _mysql_prefix . '-settings` SET val=\'default\' WHERE var=\'template\''); _systemFailure('Zvolený motiv ' . _template . ' nebyl nalezen. Přepnuto na výchozí motiv.'); } require $template_config; // kontrola verze motivu if (!_checkVersion('template', _template_version) and !_administration) { _systemFailure('Zvolený motiv není kompatibilní s verzí systému.'); } // nacist rozsireni _extendLoad(); // udalost inicializace systemu _extend('call', 'sys.init'); // systemove callbacky _extend('reg', 'sys.cron.maintenance', array(__CLASS__, 'doMaintenance')); // cron if (_cron_auto && $runCron) { self::runCron(); } } }