Exemplo n.º 1
0
 /**
  * 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();
         }
     }
 }
Exemplo n.º 2
0
for ($i = 0; isset($check_dirs[$i]); ++$i) {
    $path = _indexroot . $check_dirs[$i];
    if (!@is_dir($path)) {
        $errors[] = 'Adresář <em>/' . $check_dirs[$i] . '</em> neexistuje nebo není dostupný ke čtení';
    } elseif (!@is_writeable($path)) {
        $errors[] = 'Do adresáře <em>/' . $check_dirs[$i] . '</em> nelze zapisovat';
    }
}
// kontrola existence adresare install a souboru patch.php
if (@is_dir(_indexroot . 'install') && !_dev) {
    $errors[] = 'Adresář <em>install</em> se stále nachází na serveru - po instalaci je třeba jej odstranit';
}
if (file_exists(_indexroot . 'patch.php')) {
    $errors[] = 'Soubor <em>patch.php</em> se stále nachází na serveru - po aktualizaci databáze je třeba jej odstranit';
}
if (file_exists(_indexroot . 'install.php') && !_dev) {
    $errors[] = 'Soubor <em>install.php</em> se stále nachází na serveru - po instalaci je třeba jej odstranit';
}
// vyhodnoceni
if (empty($errors)) {
    // vse ok
    DB::query('UPDATE `' . _mysql_prefix . '-settings` SET `val`=\'0\' WHERE `var`=\'install_check\'');
} else {
    // detekovany chyby
    $errors_str = "<ul>\n";
    for ($i = 0; isset($errors[$i]); ++$i) {
        $errors_str .= '<li>' . $errors[$i] . '</li>' . _nl;
    }
    $errors_str .= "</ul>";
    _systemFailure('Při kontrole instalace byly detekovány následující problémy:</p>' . $errors_str . '<p>Systém bude funkční až po jejich nápravě.');
}