406 lines
11 KiB
PHP
406 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* 运行目录
|
|
*/
|
|
|
|
// PHP版本检测
|
|
$min = '8.0';
|
|
$max = '8.6';
|
|
if (version_compare(PHP_VERSION, $min) < 0 || version_compare(PHP_VERSION, $max) > 0) {
|
|
exit("<font color=red>PHP版本要求大于".$min.".0且小于".$max.",当前".PHP_VERSION."不满足运行环境</font>");
|
|
}
|
|
|
|
define('FRAME_PHP_VERSION', $min);
|
|
define('FRAME_NAME', 'System');
|
|
define('FRAME_VERSION', '4.7');
|
|
|
|
defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors
|
|
defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error
|
|
defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error
|
|
defined('EXIT_UNKNOWN_FILE') || define('EXIT_UNKNOWN_FILE', 4); // file not found
|
|
defined('EXIT_UNKNOWN_CLASS') || define('EXIT_UNKNOWN_CLASS', 5); // unknown class
|
|
defined('EXIT_UNKNOWN_METHOD') || define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
|
|
defined('EXIT_USER_INPUT') || define('EXIT_USER_INPUT', 7); // invalid user input
|
|
defined('EXIT_DATABASE') || define('EXIT_DATABASE', 8); // database error
|
|
defined('EXIT__AUTO_MIN') || define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
|
|
defined('EXIT__AUTO_MAX') || define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code
|
|
|
|
/**
|
|
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_LOW instead.
|
|
*/
|
|
define('EVENT_PRIORITY_LOW', 200);
|
|
|
|
/**
|
|
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_NORMAL instead.
|
|
*/
|
|
define('EVENT_PRIORITY_NORMAL', 100);
|
|
|
|
/**
|
|
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_HIGH instead.
|
|
*/
|
|
define('EVENT_PRIORITY_HIGH', 10);
|
|
|
|
|
|
require CMSPATH . 'Core/Auto.php';
|
|
require CMSPATH . 'Core/Service.php';
|
|
require CMSPATH . 'Core/Hooks.php';
|
|
require FRAMEPATH . 'Extend/Run.php';
|
|
|
|
if (! function_exists('csrf_token')) {
|
|
/**
|
|
* Get the CSRF token value.
|
|
*
|
|
* @return string
|
|
*
|
|
* @throws \RuntimeException
|
|
*/
|
|
function csrf_token()
|
|
{
|
|
return \Phpcmf\Service::L('Security')->csrf_token();
|
|
}
|
|
}
|
|
|
|
if (! function_exists('csrf_hash')) {
|
|
/**
|
|
* Get the CSRF token value.
|
|
*
|
|
* @return string
|
|
*
|
|
* @throws \RuntimeException
|
|
*/
|
|
function csrf_hash()
|
|
{
|
|
return \Phpcmf\Service::L('Security')->csrf_hash();
|
|
}
|
|
}
|
|
|
|
if (! function_exists('lang')) {
|
|
function lang(...$param) {
|
|
|
|
if (empty($param)) {
|
|
return '';
|
|
}
|
|
|
|
// 取第一个作为语言名称
|
|
$string = $param[0];
|
|
unset($param[0]);
|
|
|
|
// 调用语言包内容
|
|
//$string = \Phpcmf\Service::L('lang')->text($string);
|
|
if ($param) {
|
|
//foreach ($param as $k => $t) {
|
|
//$param[$k] = \Phpcmf\Service::L('lang')->text($t);
|
|
//}
|
|
return vsprintf($string, $param);
|
|
}
|
|
|
|
return $string;
|
|
}
|
|
}
|
|
|
|
|
|
if (! function_exists('config')) {
|
|
function config(string $name, bool $getShared = true)
|
|
{
|
|
if ($getShared) {
|
|
return \CodeIgniter\Config\Factories::get('config', $name);
|
|
}
|
|
|
|
return \CodeIgniter\Config\Factories::config($name, ['getShared' => $getShared]);
|
|
}
|
|
}
|
|
|
|
if (! function_exists('is_really_writable')) {
|
|
/**
|
|
* Tests for file writability
|
|
*
|
|
* is_writable() returns TRUE on Windows servers when you really can't write to
|
|
* the file, based on the read-only attribute. is_writable() is also unreliable
|
|
* on Unix servers if safe_mode is on.
|
|
*
|
|
* @see https://bugs.php.net/bug.php?id=54709
|
|
*
|
|
* @throws Exception
|
|
*
|
|
* @codeCoverageIgnore Not practical to test, as travis runs on linux
|
|
*/
|
|
function is_really_writable(string $file): bool
|
|
{
|
|
// If we're on a Unix server we call is_writable
|
|
if (! is_windows()) {
|
|
return is_writable($file);
|
|
}
|
|
|
|
/* For Windows servers and safe_mode "on" installations we'll actually
|
|
* write a file then read it. Bah...
|
|
*/
|
|
if (is_dir($file)) {
|
|
$file = rtrim($file, '/') . '/' . bin2hex(random_bytes(16));
|
|
if (($fp = @fopen($file, 'ab')) === false) {
|
|
return false;
|
|
}
|
|
|
|
fclose($fp);
|
|
@chmod($file, 0777);
|
|
@unlink($file);
|
|
|
|
return true;
|
|
}
|
|
|
|
if (! is_file($file) || ($fp = @fopen($file, 'ab')) === false) {
|
|
return false;
|
|
}
|
|
|
|
fclose($fp);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (! function_exists('is_windows')) {
|
|
/**
|
|
* Detect if platform is running in Windows.
|
|
*/
|
|
function is_windows(?bool $mock = null): bool
|
|
{
|
|
static $mocked;
|
|
|
|
if (func_num_args() === 1) {
|
|
$mocked = $mock;
|
|
}
|
|
|
|
return $mocked ?? DIRECTORY_SEPARATOR === '\\';
|
|
}
|
|
}
|
|
|
|
|
|
if (! function_exists('helper')) {
|
|
/**
|
|
* Loads a helper file into memory. Supports namespaced helpers,
|
|
* both in and out of the 'Helpers' directory of a namespaced directory.
|
|
*
|
|
* Will load ALL helpers of the matching name, in the following order:
|
|
* 1. app/Helpers
|
|
* 2. {namespace}/Helpers
|
|
* 3. system/Helpers
|
|
*
|
|
* @param array|string $filenames
|
|
*
|
|
* @throws FileNotFoundException
|
|
*/
|
|
function helper($filenames): void
|
|
{
|
|
static $loaded = [];
|
|
|
|
|
|
if (! is_array($filenames)) {
|
|
$filenames = [$filenames];
|
|
}
|
|
|
|
// Store a list of all files to include...
|
|
$includes = [];
|
|
|
|
foreach ($filenames as $filename) {
|
|
// Store our system and application helper
|
|
// versions so that we can control the load ordering.
|
|
$systemHelper = '';
|
|
$appHelper = '';
|
|
$localIncludes = [];
|
|
|
|
if (! str_contains($filename, '_helper')) {
|
|
$filename .= '_helper';
|
|
}
|
|
|
|
// Check if this helper has already been loaded
|
|
if (in_array($filename, $loaded, true)) {
|
|
continue;
|
|
}
|
|
$path = FRAMEPATH.'Helpers/'.$filename.'.php';
|
|
$includes[] = $path;
|
|
$loaded[] = $filename;
|
|
}
|
|
|
|
// Now actually include all of the files
|
|
foreach ($includes as $path) {
|
|
include_once $path;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (! function_exists('service')) {
|
|
/**
|
|
* Allows cleaner access to the Services Config file.
|
|
* Always returns a SHARED instance of the class, so
|
|
* calling the function multiple times should always
|
|
* return the same instance.
|
|
*
|
|
* These are equal:
|
|
* - $timer = service('timer')
|
|
* - $timer = \CodeIgniter\Config\Services::timer();
|
|
*
|
|
* @param array|bool|float|int|object|string|null ...$params
|
|
*/
|
|
function service(string $name, ...$params): ?object
|
|
{
|
|
if ($params === []) {
|
|
return \CodeIgniter\Config\Services::get($name);
|
|
}
|
|
|
|
return \CodeIgniter\Config\Services::$name(...$params);
|
|
}
|
|
}
|
|
|
|
function site_url() {
|
|
return FC_NOW_HOST;
|
|
}
|
|
|
|
|
|
if (! function_exists('clean_path')) {
|
|
function clean_path(string $path): string
|
|
{
|
|
|
|
return $path;
|
|
}
|
|
}
|
|
|
|
if (!class_exists('Locale')) {
|
|
class Locale {
|
|
|
|
static private $locale;
|
|
|
|
public static function getDefault() {
|
|
return self::$locale;
|
|
}
|
|
|
|
public static function setDefault($locale) {
|
|
self::$locale = $locale;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if (! function_exists('env')) {
|
|
/**
|
|
* Allows user to retrieve values from the environment
|
|
* variables that have been set. Especially useful for
|
|
* retrieving values set from the .env file for
|
|
* use in config files.
|
|
*
|
|
* @param array<int|string, mixed>|bool|float|int|object|string|null $default
|
|
*
|
|
* @return array<int|string, mixed>|bool|float|int|object|string|null
|
|
*/
|
|
function env(string $key, $default = null)
|
|
{
|
|
$value = $_ENV[$key] ?? $_SERVER[$key] ?? getenv($key);
|
|
|
|
// Not found? Return the default value
|
|
if ($value === false) {
|
|
return $default;
|
|
}
|
|
|
|
// Handle any boolean values
|
|
return match (strtolower($value)) {
|
|
'true' => true,
|
|
'false' => false,
|
|
'empty' => '',
|
|
'null' => null,
|
|
default => $value,
|
|
};
|
|
}
|
|
}
|
|
|
|
if (! function_exists('esc')) {
|
|
/**
|
|
* Performs simple auto-escaping of data for security reasons.
|
|
* Might consider making this more complex at a later date.
|
|
*
|
|
* If $data is a string, then it simply escapes and returns it.
|
|
* If $data is an array, then it loops over it, escaping each
|
|
* 'value' of the key/value pairs.
|
|
*
|
|
* @param array|string $data
|
|
* @param 'attr'|'css'|'html'|'js'|'raw'|'url' $context
|
|
* @param string|null $encoding Current encoding for escaping.
|
|
* If not UTF-8, we convert strings from this encoding
|
|
* pre-escaping and back to this encoding post-escaping.
|
|
*
|
|
* @return array|string
|
|
*
|
|
* @throws InvalidArgumentException
|
|
*/
|
|
function esc($data, string $context = 'html', ?string $encoding = null)
|
|
{
|
|
$context = strtolower($context);
|
|
|
|
// Provide a way to NOT escape data since
|
|
// this could be called automatically by
|
|
// the View library.
|
|
if ($context === 'raw') {
|
|
return $data;
|
|
}
|
|
|
|
if (is_array($data)) {
|
|
foreach ($data as &$value) {
|
|
$value = esc($value, $context);
|
|
}
|
|
}
|
|
|
|
if (is_string($data)) {
|
|
if (! in_array($context, ['html', 'js', 'css', 'url', 'attr'], true)) {
|
|
throw new InvalidArgumentException('Invalid escape context provided.');
|
|
}
|
|
|
|
$method = $context === 'attr' ? 'escapeHtmlAttr' : 'escape' . ucfirst($context);
|
|
|
|
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
|
|
// 应用插件的自动识别
|
|
$loader = new \Phpcmf\Auto();
|
|
$myloader = new \Phpcmf\AutoConfig();
|
|
$myloader->psr4 = [
|
|
'CodeIgniter' => FRAMEPATH,
|
|
'Config' => FRAMEPATH.'Config',
|
|
];
|
|
$loader->initialize(\Phpcmf\Service::Auto($myloader));
|
|
$loader->register();
|
|
|
|
// 挂钩点 程序运行之前
|
|
\Phpcmf\Hooks::trigger('cms_run');
|
|
|
|
// 初始化异常处理
|
|
//\CodeIgniter\Exceptions\FrameworkException::initialize();
|
|
\CodeIgniter\Config\Services::exceptions()->initialize();
|
|
|
|
if (CI_DEBUG) {
|
|
\CodeIgniter\Events\Events::on('pre_system', function () {
|
|
|
|
/*
|
|
* --------------------------------------------------------------------
|
|
* Debug Toolbar Listeners.
|
|
* --------------------------------------------------------------------
|
|
* If you delete, they will no longer be collected.
|
|
*/
|
|
|
|
\CodeIgniter\Events\Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
|
|
|
|
$config = config(\Config\Toolbar::class);
|
|
|
|
$tool = new \CodeIgniter\Debug\Toolbar($config);
|
|
|
|
$tool->respond();
|
|
});
|
|
}
|
|
|
|
|
|
// 启动框架
|
|
$run = new \Frame\Run();
|
|
$run->bootWeb();
|
|
|