From a7873891f2702668a22881498bfdf5528f9d13a8 Mon Sep 17 00:00:00 2001 From: noelorin Date: Sat, 26 Sep 2026 00:49:08 +0800 Subject: [PATCH] fix: caveman-review findings (danmaku match, SSRF, progress ownership, i18n errors, paging, QueryClient) --- .env.example | 3 ++ app/web/src/components/pages/BrowseBody.tsx | 11 ++-- .../components/pages/DanmakuSettingsBody.tsx | 3 +- app/web/src/components/pages/LibraryBody.tsx | 34 +++++++++--- app/web/src/components/pages/MountsBody.tsx | 3 +- app/web/src/components/pages/WatchBody.tsx | 6 ++- packages/dao/src/media-items.ts | 1 - packages/i18n/src/messages/en.ts | 2 + packages/i18n/src/messages/zh-CN.ts | 2 + packages/trpc/src/services/danmaku.service.ts | 12 +++-- packages/trpc/src/services/mount.service.ts | 54 ++++++++++++++++--- .../trpc/src/services/playback.service.ts | 5 +- .../trpc/src/services/webdav-client.test.ts | 16 +++++- packages/trpc/src/services/webdav-client.ts | 45 ++++++++++------ packages/types/src/index.ts | 1 + packages/types/src/media-fs.ts | 21 ++++++++ 16 files changed, 170 insertions(+), 49 deletions(-) create mode 100644 packages/types/src/media-fs.ts diff --git a/.env.example b/.env.example index 98298ec..316c94b 100644 --- a/.env.example +++ b/.env.example @@ -21,3 +21,6 @@ OPEN_DANMAKU_APP_SECRET= # 可选:Bangumi API 地址(默认 https://api.bgm.tv) # BANGUMI_API_BASE=https://api.bgm.tv + +# WebDAV 挂载威胁模型:仅允许 http(s);拒绝 localhost/127.*、169.254.*(云 metadata)。 +# 局域网私网(192.168.* 等)允许,便于本机 OpenList/群晖;公网部署请自行加出站策略。 diff --git a/app/web/src/components/pages/BrowseBody.tsx b/app/web/src/components/pages/BrowseBody.tsx index 34103d7..190d929 100644 --- a/app/web/src/components/pages/BrowseBody.tsx +++ b/app/web/src/components/pages/BrowseBody.tsx @@ -1,12 +1,11 @@ import type { Locale } from "@app/i18n"; import { t } from "@app/i18n"; +import { isVideoFilename } from "@app/types"; import { Button } from "@app/ui"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { useState } from "react"; import { createTRPCReactClient, trpc } from "~/lib/trpc"; -const VIDEO_RE = /\.(mp4|mkv|webm|avi|mov|m4v|ts|flv|wmv|mpg|mpeg)$/i; - function pathOf(segments: string[]): string { return segments.length > 0 ? `/${segments.join("/")}` : "/"; } @@ -104,7 +103,9 @@ function BrowseInner(props: { locale: Locale }) { {t(locale, "browse.scanDone", { count: scan.data.scanned })}

)} - {scan.isError &&

{scan.error.message}

} + {scan.isError && ( +

{t(locale, "browse.scanError")}

+ )}