Files
CLOAK/lib/Cloak/SimulationRouteResolver.php
T

176 lines
5.6 KiB
PHP
Raw Normal View History

2026-06-15 22:42:59 +08:00
<?php
2026-06-16 04:58:56 +08:00
require_once __DIR__ . '/WhitelistGate.php';
2026-06-15 22:42:59 +08:00
require_once __DIR__ . '/FpUrlHelper.php';
require_once __DIR__ . '/RiskSecondaryGate.php';
require_once __DIR__ . '/RiskSecondaryCache.php';
2026-06-16 04:58:56 +08:00
require_once __DIR__ . '/RiskSecondarySession.php';
2026-06-15 22:42:59 +08:00
require_once __DIR__ . '/ClientIpResolver.php';
/**
* 模拟测试路由:写日志,不输出 HTML / 302
*/
class SimulationRouteResolver
{
/**
* @param array $ctx 需含 v_info, logs, config_name, reason, model
* @return array{branch:string,log_id:?int,logs:array,needs_secondary:bool}
*/
public static function dispatch(array $ctx)
{
extract($ctx, EXTR_SKIP);
2026-06-16 04:58:56 +08:00
if (!empty($_SESSION['cloak_whitelist_fast'])) {
return self::whitelistFpBranch($logs, $config_name ?? '');
}
2026-06-15 22:42:59 +08:00
if (SHOW_SITE_MODE_SWITCH == 'zp') {
return self::safeBranch($logs, $v_info);
}
$showFp = (SHOW_SITE_MODE_SWITCH == 'ip_check' && $_SESSION['check_result'] != 'false')
|| SHOW_SITE_MODE_SWITCH == 'fp';
if ($showFp) {
return self::fpOrRiskBranch($logs, $v_info, $config_name);
}
return self::safeBranch($logs, $v_info);
}
2026-06-16 04:58:56 +08:00
/**
* @param array $logs
*/
private static function whitelistFpBranch(array $logs, $config_name)
{
$logs['result'] = 'true';
$logs['reason'] = '';
$resolved = FpUrlHelper::resolve($config_name, true);
$logs['fp_url'] = $resolved['url'] !== '' ? $resolved['url'] : FpUrlHelper::fallbackUrl();
$log_id = write_log_db($logs);
return [
'branch' => 'fp_page',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
2026-06-15 22:42:59 +08:00
/**
* @param array $logs
*/
private static function safeBranch(array $logs, $v_info)
{
if (SHOW_SITE_MODE_SWITCH == 'zp') {
$logs['result'] = 'false';
$logs['reason'] = self::mergeReason($logs['reason'] ?? '', '正品模式');
}
$logs['fp_url'] = DB_ZP;
$log_id = write_log_db($logs);
return [
'branch' => 'safe_page',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
/**
* @param array $logs
*/
private static function fpOrRiskBranch(array $logs, $v_info, $config_name)
{
if (AUTO_BLACK == 'ON') {
$times = howmanytimesbyip($v_info->v_ip);
if ($times + 1 >= AUTO_BLACK_TIMES) {
write_black_list($v_info->v_ip);
}
}
if (!isset($_SESSION['visit_to_3'])) {
$_SESSION['visit_to_3'] = '1';
}
2026-06-16 04:58:56 +08:00
if (RiskSecondaryGate::isEnabledForRequest()) {
2026-06-15 22:42:59 +08:00
$cached = RiskSecondaryCache::get(ClientIpResolver::resolve());
if ($cached !== null) {
return self::fpFromRiskCache($logs, $v_info, $config_name, $cached);
}
}
2026-06-16 04:58:56 +08:00
if (($_SESSION['visit_to_3'] ?? '1') != '3' && RiskSecondaryGate::isEnabledForRequest()) {
2026-06-15 22:42:59 +08:00
$logs['result'] = 'wait';
$logs['reason'] = self::mergeReason($logs['reason'] ?? '', '二次风控检测中');
$logs['fp_url'] = '';
$log_id = write_log_db($logs);
2026-06-16 04:58:56 +08:00
RiskSecondarySession::markWaitLog($log_id);
2026-06-15 22:42:59 +08:00
return [
'branch' => 'secondary_risk',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => true,
];
}
$logs['result'] = 'true';
2026-06-16 04:58:56 +08:00
$logs['reason'] = '';
2026-06-15 22:42:59 +08:00
$resolved = FpUrlHelper::resolve($config_name, true);
$logs['fp_url'] = $resolved['url'] !== '' ? $resolved['url'] : FpUrlHelper::fallbackUrl();
2026-06-16 04:58:56 +08:00
$log_id = RiskSecondarySession::shouldSkipFpPageLog() ? null : write_log_db($logs);
2026-06-15 22:42:59 +08:00
return [
'branch' => 'fp_page',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
/**
* @param array $logs
* @param array $cached
*/
private static function fpFromRiskCache(array $logs, $v_info, $config_name, array $cached)
{
RiskSecondaryCache::applyToSession($cached);
$apiResponse = RiskSecondaryCache::toApiResponse($cached);
$logs['result'] = $apiResponse['result'] ? 'true' : 'false';
2026-06-16 04:58:56 +08:00
$logs['reason'] = cloak_cache_hit_log_reason($logs['result']);
2026-06-15 22:42:59 +08:00
$logs['fp_url'] = trim((string) ($apiResponse['link'] ?? ''));
if ($logs['fp_url'] === '') {
$logs['fp_url'] = $logs['result'] === 'true'
? FpUrlHelper::fallbackUrl()
: (defined('DB_ZP') ? (string) DB_ZP : '');
}
if ($logs['result'] === 'false') {
return self::safeBranch($logs, $v_info);
}
2026-06-16 04:58:56 +08:00
$log_id = RiskSecondarySession::shouldSkipFpPageLog() ? null : write_log_db($logs);
2026-06-15 22:42:59 +08:00
return [
'branch' => 'fp_page_cache',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
private static function mergeReason($existing, $append)
{
$existing = trim((string) $existing);
$append = trim((string) $append);
if ($existing === '') {
return $append;
}
if ($append === '' || strpos($existing, $append) !== false) {
return $existing;
}
return $existing . '' . $append;
}
}