yukaidi
9b70fb2778
feat(QQscTool): 支持多文件和目录解析,通过 GetFileList API 实现递归目录导航
2026-05-29 13:22:12 +08:00
yukaidi
bd2868748f
feat(Home): 从粘贴文本中自动提取分享链接
2026-05-29 13:08:22 +08:00
yukaidi
1f47bf13b5
fix(QQscTool): 检测被和谐文件,避免返回无效直链
2026-05-29 12:56:28 +08:00
yukaidi
7d8b33afe0
refactor: 前端代码质量清理
...
- fix: Home.vue 组件名 'App' → 'Home'
- fix: DirectoryTree selectAll 补 parserUrl 空值检查
- fix: 提取 previewBaseUrl 到 utils/constants.js,解除 ShowFile 对 Home 的耦合
- fix: Home.vue focus 事件监听器改为命名函数,加 beforeUnmount 移除
- fix: Playground.vue MutationObserver 保存引用,onUnmounted 中 disconnect
- chore: 删除未使用的 api.js
- chore: 删除 ClientLinks.vue 死代码 downloadClient/shouldShowDownloadButton
- chore: 删除 DirectoryTree.vue 死代码 buildTree
2026-05-29 12:38:34 +08:00
yukaidi
367f7c78a4
Merge remote-tracking branch 'upstream/main'
2026-05-29 12:17:51 +08:00
yukaidi
1bd23ec4ae
feat: 目录浏览添加复制直链按钮
2026-05-29 12:13:00 +08:00
yukaidi
3461532679
fix: ConfigUtil 读取配置失败时自动尝试 resources/ 目录
...
当文件系统直接读取 app.yml 失败时(如 Docker 卷挂载场景),
ConfigUtil.readConfig 现在会自动尝试 resources/ 子目录作为
fallback,确保配置文件在各种部署方式下都能被正确加载。
2026-05-29 11:54:13 +08:00
yukaidi
4cfcdfa1f8
fix: Deploy 启动时自动从 resources/ 子目录查找配置文件
...
当 app.yml 在当前目录不存在时,自动回退到 resources/app.yml,
解决 Docker 部署时配置文件在 resources/ 子目录导致启动失败的问题。
2026-05-29 11:39:21 +08:00
yukaidi
ac2f526a1c
fix: clientLinks/clientLink 补全参数注入,统一 _requestOrigin 设置
...
- clientLinks 无 auth 时调用 URLParamUtil.addParam() 注入代理/认证配置
- clientLink 补设 _requestOrigin 并调用 addParam()
- getFileList/getFileDownUrl 补设 _requestOrigin 保持一致性
- getDownLink 回退地址补上端口号
2026-05-29 11:36:20 +08:00
yukaidi
cfb624e9e0
fix: 统一 origin 解析逻辑,修复反向代理下 domainName 不一致
...
- ServerApi 添加 resolveOrigin() 统一处理 X-Forwarded-Host 头
- ParserApi.parse() 补设 _requestOrigin,修复 /v2/linkInfo 路径遗漏
- 清理 app-dev.yml 残留注释
2026-05-29 11:31:08 +08:00
yukaidi
e1bf45b5c8
feat: domainName 改为可选,未配置时自动从请求地址推断
...
- app-dev.yml 注释掉默认 domainName
- ParserApi 添加 getLinkPrefix() 支持 X-Forwarded-Host 反向代理
- ServerApi 传递 _requestOrigin 到 otherParam 供 parser 层使用
- URLParamUtil.addParam() 读不到配置时用 _requestOrigin 兜底
- AppMain 启动日志 domainName 为空时显示本地端口地址
2026-05-29 11:27:32 +08:00
yukaidi
e2dc611aa4
fix: 剪切板自动读取失败时静默,仅手动读取时提示
2026-05-29 11:02:00 +08:00
yukaidi
77c953626f
fix: api.js baseURL 改为相对路径,修复反向代理下请求绕过代理的问题
2026-05-29 10:59:12 +08:00
yukaidi
0e14c9a925
refactor: 统一版本号管理,消除硬编码
...
项目版本(pom.xml revision)和parser版本(parserVersion)统一为单一来源,
前端构建时自动同步,发版只需改根pom.xml的两个属性。
2026-05-29 10:57:49 +08:00
yukaidi
a4e8585e2c
fix: 错误处理返回具体异常信息而非通用"服务器内部错误"
...
RouterHandlerFactory 的 onFailure 和 catch 两处均丢弃了
e.getMessage(),导致前端无法获知具体报错原因。
2026-05-29 10:49:54 +08:00
yukaidi
cf7d64916e
fix: Groovy 正则改为字符串形式避免斜杠解析问题
2026-05-29 10:37:31 +08:00
yukaidi
4ac80bbfe8
fix: gmavenplus-plugin 添加 Groovy 依赖
2026-05-29 10:34:24 +08:00
yukaidi
cfe8352d45
refactor: GitHub URL 改为构建时自动从 git remote origin 识别
...
前端:vue.config.js 通过 DefinePlugin 注入 VUE_APP_GITHUB_REPO_URL,
Home.vue/Playground.vue 中硬编码的 GitHub URL 全部改为动态变量。
后端:parser/pom.xml 添加 gmavenplus-plugin 在 initialize 阶段从
git remote origin 解析 github.owner/github.repo,SCM 字段引用 property。
2026-05-29 10:29:44 +08:00
yukaidi
4a0fe61d30
fix: ParserCreate 正则匹配 PWD 组时捕获 IllegalArgumentException
...
matcher.group(PWD) 在正则未定义 PWD 命名组时抛出
IllegalArgumentException 而非 IllegalStateException,原 catch 未覆盖
导致无提取码的链接(如QQ文件分享)返回 500。
2026-05-29 10:13:22 +08:00
yukaidi
c62e109aff
fix: 将硬编码的上游 GitHub URL 改为 fork 地址
...
Home.vue、Playground.vue、parser/pom.xml 中的 qaiu/netdisk-fast-download
URL 全部替换为 yukaidi1220/netdisk-fast-download。
2026-05-29 10:09:49 +08:00
qaiu
ff400d3be3
Merge pull request #186 from yukaidi1220/260529
...
fix: 修复多个内存泄漏问题、资源管理缺陷及安全漏洞
感谢 @yukaidi1220 的贡献! 🎉
本次 PR 对项目做了一次全面深入的审查,涵盖了内存泄漏、资源管理、安全漏洞和代码缺陷,工作量很大,质量也很高,辛苦了👍
几个小建议供参考:
registerPeriodicCleanup 注册时机:目前在 的 块中调用,类加载时机不能保证 Vertx 已完全就绪。建议后续改为实现 接口,在 启动后执行,时机更可控。CacheServiceImplstaticAppRunPostExecVerticle
RateLimiter 并发安全:去掉 方向正确,但需确认 底层是 ,否则 与 并发执行存在竞态风险。另外 不能保证 的原子性,可考虑改用 。synchronizedipRequestMapConcurrentHashMapremoveIfcomputevolatile int countcount++AtomicInteger
PanBase 子类覆写 client:static 共享 WebClient 本身没问题,但如果有子类在构造中重新赋值 用于特殊场景(如代理),需确保这些子类有对应的逻辑,否则泄漏依然存在。this.client = WebClient.create(...)close()
2026-05-29 09:59:56 +08:00
yukaidi
1d243b8f1b
fix: Docker EXPOSE 改为仅 6401,entrypoint 添加 -Duser.timezone
...
审查发现:
- EXPOSE 6400 误导用户映射后端端口,实际只需 6401(反向代理)
- TZ 环境变量不如 JVM -Duser.timezone 可靠
2026-05-29 09:57:05 +08:00
yukaidi
732a7f86fe
fix: Docker entrypoint 以 root 运行再降权,彻底解决 volume 权限问题
...
去掉 USER appuser,entrypoint 以 root 身份运行,先 chown 修复
volume 挂载目录的权限,再通过 su 降权到 appuser 执行应用。
2026-05-29 09:49:22 +08:00
yukaidi
3c428f6a6d
fix: ShutdownHook 注册顺序调整,确保 Vert.x 先于 JDBCPoolInit 关闭
...
JVM ShutdownHook 按注册逆序执行。将 AppMain 的 hook 移到 Deploy.start() 之前注册,
使执行顺序变为:Deploy hook(关闭 Vert.x)-> AppMain hook(关闭 JDBCPoolInit/JsParserExecutor)。
2026-05-29 09:01:08 +08:00
yukaidi
bff17f2d4e
fix: run.sh 改用 exec 直接运行 Java,修复 Docker 中 ShutdownHook 失效
...
原 nohup+tail-f 模式下,Docker SIGTERM 发给 tail 而非 Java 进程,
导致 ShutdownHook 永远不会触发,资源无法优雅关闭。
改为 exec 让 Java 成为 PID 1,正确接收信号。
同时支持通过 JVM_XMX/JVM_OPTS 环境变量自定义 JVM 参数。
2026-05-29 08:46:57 +08:00
yukaidi
df600eaada
fix: Dockerfile 预创建 db 和 logs 目录,修复非 root 用户无法写入 H2 数据库
...
appuser 运行时无法在 /app 下创建新子目录,H2 尝试创建 /app/db/nfdData.mv.db
时因目录不存在导致 AccessDeniedException。在 chown 之前预创建目录。
2026-05-29 08:34:59 +08:00
yukaidi
dd4027c931
fix: LzTool/IzToolWithAuth 最后两处 .get().toString() NPE 风险
...
- LzTool:221 — obj.get("url").toString() 改为 String.valueOf()
- IzToolWithAuth:434 — get("uuid").toString() 添加 null 检查
2026-05-29 07:54:33 +08:00
yukaidi
d1569195e4
fix: AppMain 注册 ShutdownHook 关闭 JDBCPoolInit 和 JsParserExecutor
...
审查发现 9c3945f 因模块依赖问题回退了 ShutdownHook 中的清理逻辑,
导致 JDBCPoolInit 连接池和 JsParserExecutor WorkerExecutor 在进程退出时
无法被显式关闭。将清理逻辑移到 web-service 模块的 AppMain(可依赖所有模块)。
2026-05-29 07:22:57 +08:00
yukaidi
d6e88f0c53
fix: PlaygroundApi 移除重复 import 和未使用的 getStackTrace 死代码
...
审查发现 42925c8 引入了重复的 StandardCharsets import,且 getStackTrace
方法在移除堆栈泄露后无任何调用方,属于死代码。
2026-05-29 07:06:53 +08:00
yukaidi
2a9fa81e56
fix: CacheManager registerPeriodicCleanup 添加防重入和 Vertx 就绪检查
...
审查发现 static 块中注册定时任务存在时序风险:如果 CacheServiceImpl 在 Vertx
初始化前被加载,定时任务将注册失败且无法恢复。添加 cleanupRegistered 标志防止
重复注册,Vertx 未就绪时跳过并等待下次调用。
2026-05-29 07:02:23 +08:00
yukaidi
5eed1fdfa0
revert: 回退 MyData.java 的构造函数修改,恢复为空 TODO
...
用户明确表示不需要改动 MyData 的 TODO,回退 741d7aa 对该文件的修改。
2026-05-29 06:58:41 +08:00
yukaidi
cf7fc4f502
fix: FjTool login() 中 token.substring 添加 null 保护
...
token 脱敏日志在 token 可能为 null 时会抛 NPE,添加 null 检查。
2026-05-29 06:58:09 +08:00
yukaidi
0ea31d631a
fix: 移除 IzTool/IzToolWithAuth login() 中未使用的 h 变量(死代码)
...
并发安全修复引入的 h 变量创建后从未使用,后续请求仍通过
setTemplateParam("appToken", token) 传递 token。删除死代码并为
同一行的 token.substring 添加 null 保护。
2026-05-29 06:57:44 +08:00
yukaidi
74840ab63f
fix(FsTool): 收窄 parseFileNameFromContentDisposition 中的 catch 异常类型
...
将 catch(Exception) 改为 catch(IllegalArgumentException),
只捕获 URLDecoder.decode 在遇到非法百分比编码时抛出的具体异常。
2026-05-29 06:38:35 +08:00
yukaidi
31f33339f1
fix(FsTool): 修复 parseById 中 get("paramJson") 可能导致的 NPE
...
当 otherParam 中缺少 "paramJson" 键时,后续 getString 调用会抛出 NPE。
添加 null 检查并提前返回失败。
2026-05-29 06:37:53 +08:00
yukaidi
c0a0d0dc47
fix(FjTool): 修复 parseById 中 get("paramJson") 可能导致的 NPE
...
当 otherParam 中缺少 "paramJson" 键时,后续 getString 调用会抛出 NPE。
添加 null 检查并提前返回失败。
2026-05-29 06:37:12 +08:00
yukaidi
0cd77ee9b9
fix(IzTool): 修复 parseFileList 中 get("uuid") 可能导致的 NPE
...
当 otherParam 中缺少 "uuid" 键时,原代码直接调用 .toString() 会抛出
NullPointerException。改为先取出 Object 再做 null 检查。
2026-05-29 06:36:43 +08:00
yukaidi
741d7aa8ca
fix: implement MyData @DataObject constructor deserialization
...
Implement the MyData(JsonObject) constructor to deserialize `id` and
`maxSize` fields from the provided JsonObject, replacing the empty TODO.
2026-05-29 06:28:39 +08:00
yukaidi
d06a80dc73
fix: narrow catch exception type in LzTool.java
...
Replace 2 instances of `catch (Exception ignored)` with
`catch (MalformedURLException ignored)` around `new java.net.URL(url)`
calls, since that constructor only throws MalformedURLException.
2026-05-29 06:28:20 +08:00
yukaidi
86b9c43b8b
fix: narrow catch exception type in ParserCreate.java
...
Replace 5 instances of `catch (Exception ignored)` with
`catch (IllegalStateException ignored)` around matcher.group() calls,
since that method only throws IllegalStateException when a named group
does not exist.
2026-05-29 06:27:51 +08:00
yukaidi
206981d4b4
revert: RouterHandlerFactory failureHandler 恢复返回 failure message
...
原 ctx.failure().getMessage() 是故意设计——RateLimiter 等组件通过 promise.fail()
传递用户友好的错误消息(如"请求次数太多了"),这些消息需要通过 failureHandler
返回给客户端。改为固定"服务器内部错误"会导致这些消息丢失。
仅添加 null 检查防止 NPE。
2026-05-29 06:15:56 +08:00
yukaidi
7d5831b5f4
fix: 彻底消除用户枚举和异常信息泄露的遗留问题
...
- UserServiceImpl: 3处"用户不存在"统一改为"用户名或密码错误"/"认证失败"
- RouterHandlerFactory: failureHandler 中 ctx.failure().getMessage() 改为"服务器内部错误"
2026-05-29 05:53:40 +08:00
yukaidi
7ca63985bd
fix(test): 删除空的 ParserApiClientLinkTest 文件
...
该文件仅包含空行,无实际测试代码,直接删除。
2026-05-29 04:06:21 +08:00
yukaidi
06416a4e5f
fix(test): JsFetchBridgeTest Vertx 资源泄漏修复
...
将各 @Test 方法中局部创建的 Vertx.vertx() 统一为成员变量,
通过 @Before 创建并初始化,@After 关闭,避免资源泄漏。
2026-05-29 04:06:13 +08:00
yukaidi
88739e8d1a
fix(test): JsParserTest Vertx 资源泄漏修复
...
将各 @Test 方法中局部创建的 Vertx.vertx() 统一为成员变量,
通过 @Before 创建并初始化,@After 关闭,避免资源泄漏。
2026-05-29 04:04:52 +08:00
yukaidi
ffaba4f496
fix(test): BaiduPhotoParserTest Vertx 资源泄漏修复
...
将各 @Test 方法中局部创建的 Vertx.vertx() 统一为成员变量,
通过 @Before 创建并初始化,@After 关闭,避免资源泄漏。
2026-05-29 04:03:37 +08:00
yukaidi
c4f94a2bc7
fix: replace printStackTrace/System.out.println with logger in JsHttpClient, PlaygroundApi, LogStatistics, CacheServiceImpl, JsPlaygroundExecutor, JsPlaygroundLogger
2026-05-29 03:48:11 +08:00
yukaidi
49a3918244
fix: replace double-brace init with static block + Collections.unmodifiableMap; add final to UNIQUE_PREFIX
2026-05-29 03:40:06 +08:00
yukaidi
caddff567f
fix: replace System.out.println with logger in IpExtractor
2026-05-29 03:39:36 +08:00
yukaidi
aed9e9f10d
fix: replace System.out.println/printStackTrace with logger in ReqIpUtil; add final to static fields
2026-05-29 03:39:11 +08:00