From c83b834c8b3e37031b66910ec542a956acd7b451 Mon Sep 17 00:00:00 2001 From: xfy Date: Sun, 5 Jul 2026 14:32:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(code-runner):=20admin=20=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=BF=90=E8=A1=8C=E9=80=9F=E7=8E=87=E9=99=90?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 作者在 /admin/runner 沙箱调试代码块时,1 次/秒 + 50 次/天的读者限流 (RATE_LIMIT_CODE_EXEC_*)会频繁打断试运行。已登录 admin 改为跳过 check_code_exec_limit,仍受并发槽、资源钳制与源码大小校验约束。 --- src/api/code_runner/execute.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/api/code_runner/execute.rs b/src/api/code_runner/execute.rs index 7de5995..10a5483 100644 --- a/src/api/code_runner/execute.rs +++ b/src/api/code_runner/execute.rs @@ -21,6 +21,8 @@ use crate::api::code_runner::{ExecRequest, ExecResult, ExecStatus, ExecTask}; // server-only 辅助模块与依赖:仅在 server function body(被宏剥离到 WASM 之外)内使用。 #[cfg(feature = "server")] +use crate::api::auth::get_current_admin_user; +#[cfg(feature = "server")] use crate::api::code_runner::languages::{is_supported_lang, LANGUAGES}; #[cfg(feature = "server")] use crate::api::code_runner::progress::{ @@ -60,12 +62,20 @@ fn client_ip() -> String { /// /// 同步校验通过后立即返回 task_id,容器在后台执行;结果通过 /// [`get_exec_result`] 轮询查询。语言不支持 / 源码过大 / 触发限流时同步返回错误。 +/// +/// admin 角色跳过速率限制(便于作者在沙箱调试),但仍受并发槽、 +/// 资源钳制与源码大小校验约束。 #[server(StartExec, "/api")] pub async fn start_exec(req: ExecRequest) -> Result { // 1. 速率限制(双层:每秒突发 + 每日总额) - let ip = client_ip(); - if let Err(msg) = check_code_exec_limit(&ip) { - return Err(ServerFnError::new(msg)); + // admin 放行:作者在 /admin/runner 沙箱试运行时不应被限流打断; + // 仍受并发槽、资源钳制、源码大小校验约束。 + let is_admin = get_current_admin_user().await.is_ok(); + if !is_admin { + let ip = client_ip(); + if let Err(msg) = check_code_exec_limit(&ip) { + return Err(ServerFnError::new(msg)); + } } // 2. 语言白名单