包含:登录失败锁定、90天密码有效期、30分钟会话超时、 强制改密、登录审计日志、屏幕水印、企业背景图、 备案信息固定底部、favicon、JS空集合保护、 会话过期体验优化(403 JSON)、display_errors 关闭、 固定 key 根治 Integrity check failed 等全部改动 注意:config.inc.php/.htaccess/.user.ini 含敏感信息, 通过 .gitignore 排除,勿推送到公开仓库。
59 lines
1.6 KiB
PHP
59 lines
1.6 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
namespace MRBS\Intl;
|
|
|
|
// A class which is just a wrapper for the standard PHP class if it's available; otherwise it
|
|
// provides a basic emulation of PHP's IntlDatePatternGenerator class.
|
|
|
|
use MRBS\Exception;
|
|
use MRBS\Language;
|
|
|
|
// We need to check that the 'intl' extension is loaded because earlier versions of
|
|
// MRBS had the IntlDatePatternGenerator emulation class at the top level in lib. If users
|
|
// have upgraded by just overwriting files without deleting that file, then it will
|
|
// be picked up by the class_exists() test and used instead of the more up-to-date
|
|
// emulation below.
|
|
if (class_exists('\IntlDatePatternGenerator') && extension_loaded('intl'))
|
|
{
|
|
class IntlDatePatternGenerator extends \IntlDatePatternGenerator
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
class IntlDatePatternGenerator
|
|
{
|
|
private const DEFAULT_LOCALE = 'en';
|
|
|
|
private $locale;
|
|
|
|
// $locale The locale. If null is passed, uses the ini setting intl.default_locale.
|
|
public function __construct(?string $locale = null)
|
|
{
|
|
if (!isset($locale)) {
|
|
$locale = ini_get('intl.default_locale');
|
|
if (($locale === false) || ($locale === '')) {
|
|
throw new Exception("Could not get locale");
|
|
}
|
|
}
|
|
|
|
$this->locale = $locale;
|
|
}
|
|
|
|
|
|
public function getBestPattern(string $skeleton)
|
|
{
|
|
$file = MRBS_ROOT . "/intl/skeletons/$skeleton.ini";
|
|
|
|
if (is_readable($file)) {
|
|
$patterns = parse_ini_file($file);
|
|
if (!empty($patterns)) {
|
|
return $patterns[Language::convertToBcp47($this->locale)] ?? $patterns[self::DEFAULT_LOCALE] ?? false;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|