fix(extensions): IP 归属地管理端测试可绕过启用开关

后台测试此前受 ip_geo_enabled 短路,未启用时结果恒为空;强制 live lookup 并返回可读失败原因。
This commit is contained in:
2026-07-12 14:35:19 +08:00
parent 5c84d259e7
commit 3675b7dcef
4 changed files with 78 additions and 21 deletions
@@ -284,6 +284,9 @@ class AKSRT_Admin_Extension_Controller extends AKSRT_Admin_Controller_Base {
/**
* POST /extensions/ip-test — test current IP provider with a given IP.
*
* Admin tests force a live lookup (skip enable-gate + cache) so operators can
* verify credentials before flipping the runtime switch.
*/
public function test_ip_geo(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
@@ -297,12 +300,46 @@ class AKSRT_Admin_Extension_Controller extends AKSRT_Admin_Controller_Base {
return $this->error(__('IP 归属地服务不可用', 'aksrt'), 500);
}
$result = AKSRT_IP_Geo::get_instance()->lookup($ip);
$geo = AKSRT_IP_Geo::get_instance();
$status = $geo->get_status();
$result = $geo->lookup($ip, true);
$reason = (string) ($result['reason'] ?? '');
$message = '';
$ok = !empty($result['country']) || !empty($result['province']) || !empty($result['city']);
if (!$ok) {
switch ($reason) {
case 'private_ip':
$message = __('该地址为私有/保留 IP,无法查询归属地。请换公网 IP 测试。', 'aksrt');
break;
case 'provider_empty':
if (!empty($status['missing_fields'])) {
$message = sprintf(
/* translators: %s: missing config field keys */
__('当前服务商凭据不完整(缺少:%s),请先在「扩展 → IP归属地」补全配置。', 'aksrt'),
implode(', ', (array) $status['missing_fields'])
);
} else {
$message = __('服务商未返回有效归属地,请检查凭据、网络出口或换一个 IP 重试。', 'aksrt');
}
break;
case 'disabled':
$message = __('IP 归属地功能未启用。', 'aksrt');
break;
default:
$message = __('未查询到归属地信息。', 'aksrt');
}
}
return $this->success([
'data' => [
'ip' => $ip,
'result' => $result,
'ip' => $ip,
'ok' => $ok,
'message' => $message,
'status' => $status,
'result' => $result,
'display' => $ok ? $geo->format($result) : '',
],
]);
}