fix: 修复中危问题:注册接口、模型名、LLM 超时、WebSocket 断线、未公开任务泄露等
服务端 - 删掉没人用的 /account/register,外网不能再批量注册小号 - 模型名只放行豆包和配置的 LLM_MODEL,浏览器里存的旧模型名换成默认模型; 聊天默认模型改读 LLM_MODEL - 流式生成改成 120 秒无数据才超时(另有 15 分钟总上限),思考模型不会被中途掐断; SSE 最后一行没有换行时不再丢内容 - WebSocket:token 无效 401、任务不存在 404,建对话失败时关闭连接; 引导出错时把没有回复的提问移出上下文 - 未公开的教程只有超管能看,未公开的挑战和素材管理员也能看,其他人 404 - Caddy:/media 加 CSP sandbox 和 nosniff,上传的 html/svg 直接打开不能跑脚本; 加 CORS,预览 iframe 里的代码可以读取字体和 fetch 素材 前端 - 新增 ReconnectingSocket:意外断开后退避重连,握手失败先刷新 token; 断线时清掉“生成中”状态,旧连接的事件不再改写新连接 - marked 扩展抽到 utils/markdown.ts:教程用独立实例,不再改全局 marked; 学生内容的渲染保留高亮,不带会渲染原始 HTML 的 preview 扩展 - 挑战页、创作页加载完成前离开时不再建立连接,离开时关闭引导弹窗 - 教程、提交列表、用户管理跟随浏览器前进后退;快速翻页只用最后一次结果, 改筛选条件不再请求两次 - 随机评分弹窗在 AI 回复完之后不再弹出 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
73788c4595
commit
cdeb7c18ef
22 files changed
+489
-210
No files matched your search
@@ -17,6 +17,34 @@ describe("权限", () => {
|
||||
expect((await adm("GET", "/api/submission/gradebook/?classname=a")).status).toBe(403)
|
||||
})
|
||||
|
||||
test("未公开的教程只有超管能看,未公开的挑战管理员也能看", async () => {
|
||||
makeUser("stu")
|
||||
makeUser("adm", "admin")
|
||||
makeUser("boss", "super")
|
||||
makeTask("草稿教程", "tutorial", 1, false)
|
||||
makeTask("草稿挑战", "challenge", 2, false)
|
||||
makeTask("公开挑战", "challenge", 3, true)
|
||||
const [anon, stu, adm, boss] = await Promise.all([client(), client("stu"), client("adm"), client("boss")])
|
||||
for (const path of ["/api/tutorial/1", "/api/challenge/2", "/api/assets/challenge/2"]) {
|
||||
expect((await anon("GET", path)).status).toBe(404)
|
||||
expect((await stu("GET", path)).status).toBe(404)
|
||||
}
|
||||
expect((await stu("GET", "/api/challenge/3")).status).toBe(200)
|
||||
expect((await adm("GET", "/api/tutorial/1")).status).toBe(404)
|
||||
expect((await adm("GET", "/api/challenge/2")).status).toBe(200)
|
||||
expect((await adm("GET", "/api/assets/challenge/2")).status).toBe(200)
|
||||
expect((await boss("GET", "/api/tutorial/1")).status).toBe(200)
|
||||
})
|
||||
|
||||
test("没有公开注册接口", async () => {
|
||||
const res = await (await client())("POST", "/api/account/register", {
|
||||
username: "x",
|
||||
email: "x@x.com",
|
||||
password: "123456",
|
||||
})
|
||||
expect(res.status).toBe(404)
|
||||
})
|
||||
|
||||
test("封号后 access token 和 refresh token 都失效", async () => {
|
||||
const id = makeUser("stu")
|
||||
makeUser("boss", "super")
|
||||
|
||||
Reference in new issue
Block a user