MRBS 1.12.2 等保2.0二级整改完整提交

包含:登录失败锁定、90天密码有效期、30分钟会话超时、
强制改密、登录审计日志、屏幕水印、企业背景图、
备案信息固定底部、favicon、JS空集合保护、
会话过期体验优化(403 JSON)、display_errors 关闭、
固定 key 根治 Integrity check failed 等全部改动

注意:config.inc.php/.htaccess/.user.ini 含敏感信息,
通过 .gitignore 排除,勿推送到公开仓库。
This commit is contained in:
人事系统开发
2026-09-09 16:55:02 +08:00
commit 1ba6efd8ed
2151 changed files with 528780 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
<?php
declare(strict_types=1);
namespace MRBS;
require "defaultincludes.inc";
use MRBS\Form\Form;
use UnexpectedValueException;
// Cancel a user's registration
function cancel_registration(int $registration_id) : void
{
global $auth;
$registration = get_registration_by_id($registration_id);
if (!isset($registration))
{
return;
}
$entry = get_entry_by_id($registration['entry_id']);
// Check that the user is authorised for this operation
$mrbs_user = session()->getCurrentUser();
if (!isset($entry) ||
(!getWritable($registration['username'], $entry['room_id']) &&
!getWritable($registration['create_by'], $entry['room_id']) &&
!(isset($mrbs_user) && $auth['users_can_delete_others_registrations'])))
{
return;
}
// Check that it is not too late to cancel a registration
if (!is_book_admin($entry['room_id']) && entry_registration_cancellation_has_closed($entry))
{
return;
}
// They are authorised, so go ahead and delete the registration
$sql = "DELETE FROM " . _tbl('participants') . "
WHERE id=:registration_id";
$sql_params = array(
':registration_id' => $registration_id
);
db()->command($sql, $sql_params);
}
// Register a user for an event
function register_user(string $username, int $event_id) : void
{
$entry = get_entry_by_id($event_id);
// Check that the user is authorised for this operation
if (!isset($entry) || !(can_register_others($entry['room_id']) || getWritable($username, $entry['room_id'])))
{
return;
}
// Check that the user is an admin or else that the entry is open for registration
if (!is_book_admin($entry['room_id']) && !entry_registration_is_open($entry))
{
return;
}
// Obtain a lock to make sure no one else registers after we've checked that there
// are spare places
db()->mutex_lock(_tbl('participants'));
$data = get_booking_info($event_id, false);
// Check that registration is allowed ...
if (!empty($data['allow_registration']))
{
// ... and that there are spare places
$n_registered = count($data['registrants']);
if (empty($data['registrant_limit_enabled']) ||
($data['registrant_limit'] > $n_registered))
{
// ... and that the user hasn't already been registered
if (!in_arrayi($username, array_column($data['registrants'], 'username')))
{
$mrbs_user = session()->getCurrentUser();
$mrbs_username = (isset($mrbs_user)) ? $mrbs_user->username : null;
// then register the user
add_registrant($event_id, array(
'username' => $username,
'create_by' => $mrbs_username,
'registered' => time()
));
}
}
}
// Release the lock
db()->mutex_unlock(_tbl('participants'));
}
// Check the CSRF token.
Form::checkToken();
// Check the user is authorised for this page
checkAuthorised(this_page());
// Get the form vars
$action = get_form_var('action', 'string');
$event_id = get_form_var('event_id', 'int');
$returl = get_form_var('returl', 'url_local', 'index.php');
// Take the appropriate action. The individual functions check that the user
// is authorised to take the action.
try
{
switch ($action)
{
case 'cancel':
$registration_id = get_form_var('registration_id', 'int');
if (!isset($registration_id))
{
throw new UnexpectedValueException("No registration_id received from form.");
}
cancel_registration($registration_id);
break;
case 'register':
$username = get_form_var('username', 'string');
if (!isset($username) || ($username === ''))
{
throw new UnexpectedValueException("No username received from form.");
}
if (!isset($event_id))
{
throw new UnexpectedValueException("No event_id received from form.");
}
register_user($username, $event_id);
break;
default:
throw new UnexpectedValueException("Unknown action '$action'");
break;
}
}
catch (UnexpectedValueException $e)
{
trigger_error($e->getMessage(), E_USER_WARNING);
}
location_header($returl);