本版本为全面代码审查后的系统性修复:36 项确认问题全部处理,涵盖崩溃修复、功能正确性、HTTP 协议合规、资源泄漏与安全加固。
🛡️ 全局异常兜底
此前整个应用没有任何未处理异常兜底——任何 UI 线程异常直接弹 .NET 崩溃对话框并终止进程,后台线程异常更是让进程无声消失。现在:
My.UnhandledException:异常写入日志后不退出,用户有机会保存状态AppDomain.UnhandledException:后台线程异常至少留下日志线索
🐛 修复:列表刷新闪退(高频崩溃源)
下载状态/百分比/预估时间/进度文本 4 个 AspectGetter 的 Catch 块会弹英文堆栈再 Throw——而 AspectGetter 在每一行重绘时执行,一行弹一次窗,关掉后崩溃。改为只记日志并返回安全占位值。
🐛 修复:其余用户可见错误
| 症状 | 根因与修复 |
|---|---|
| 打开 ELC 点"取消"报 "The path is not valid" | 取消时仍以空串调用 AddDLC;现在静默退出 |
| 单文件点 Reset 很快又变回 Error | Fichero 分支漏调 ResetearDescarga(),残留 .part 与错误状态;补齐与包分支一致 |
| 首次运行强制配置可被"取消"绕过 | 密码框被填占位符 ***** 恒非空,校验永不可达;占位符现视为"未设置" |
| Web 超时保存 61-99 重开变空再被改 5 | 载入边界 >60 与保存边界 0-99 不一致;统一为 0-99 |
| 队列文件损坏导致启动即崩 | CDate(strFecha) 区域性相关且无 Try;改 Date.TryParse 双文化解析,坏值跳过 |
| 后台弹窗藏到主窗体后面像卡死 | DoWork 线程直接 MessageBox.Show;改走 SafeShowError 编组回 UI |
| VLC 启动失败无任何反馈 | 返回值被忽略且无 Try;两处调用方现检查返回值 |
| 拖入非 ELC/DLC 文件被静默丢弃 | 现在给出提示 |
| 未选中条目点"打开目录"报空路径错误 | 空路径直接退出 |
🐛 修复:功能正确性缺陷
| 位置 | 修复 |
|---|---|
DescompresorController.vb |
缺分卷 RAR 假成功:IsComplete=False 时静默跳过且不置异常,上游报"解压成功";现显式抛错。重复 Code 卡"正在解压":静默跳过仍返回 True;现更新既有队列条目 |
FileDownloader.vb |
UI 冻结最长 16.5 秒:分块失败退避的 Thread.Sleep 忙等跑在 UI 线程;移到线程池。"Must specify size" 掩盖真实错误:Size=0 时跳过收尾块。Dispose 从不释放 Mutex/MutexFile/trigger:现确定性释放 |
Configuracion.vb |
Web 密码解密失败的空 Catch:保留密文当密码导致登录永远失败且无线索;现记日志并清空 |
Conexion.vb |
FileID 未转义直接拼 JSON/URL;补 JSON 转义 + UrlEncode |
Main.vb |
删除"包+子文件"时 CancellationComplete 双挂导致 Dispose 执行两遍;已被移除的对象直接跳过 |
🌐 HTTP 模块:Range 合规 + CSRF + 限速
- RFC 7233:支持
bytes=-N后缀区间与bytes=N-开放区间;越界返回 416 +bytes */size(此前静默钳位);bytes=0-0单字节探测只取一个对齐块(此前向 MEGA 请求整个文件,带宽放大);尾块截断到 Content-Length(响应体不再超发) ?mega=解析:直接用框架解析的参数值,?p=密码&mega=...顺序不再失败- 流媒体库 CSRF:Delete/Save/OpenVLC/ImportLinks/ExportLinks 现要求 POST + 有效 token(复用 Web 界面的 EnsureCsrf 模式);顺带修复浏览页 OpenVLC 用 GET 调 POST-only 接口的既有失效
- 登录限速:PBKDF2(100k) 在请求线程同步执行,POST 轰炸可打满线程池;现并发上限 4 + 60 秒窗口失败锁定 10 次
💾 资源泄漏
Criptografia.decrypt_key:循环内CreateDecryptor从不 Dispose;改 UsingMD5Utils.MD5CalcString:补 UsingDescompresorController×4 处、ThrottledStreamController×1 处 Mutex 补 Try/Finally- Configuration/PropiedadesDescarga 共 5 处悬停 ToolTip 泄漏;复用单实例
🔒 Stegano(隐写)
- 先写坏再报错:容量校验发生在写盘之后,留下截断的 .jpg;改为内存编码+校验全通过才落盘
- OpenWrite 不清空尾部:覆盖更长的旧文件时新旧字节拼接;
WriteAllBytes截断覆盖 - Uri 校验形同虚设:
RelativeOrAbsolute对 "hello world" 返回 True;限定 Absolute + http/https/file
🧹 维护性清理
- vbproj 删除死引用
TODO\TODO.txt、plantilla botones.psd;删除孤儿文件postbuildevent.xml - DPI 配置统一 PerMonitorV2;移除未部署的 Unsafe 程序集重定向
- 硬编码英文消息(10 处)接入语言系统,新增 en-US/zh-CN 条目
Full Changelog: v2.4.4...v2.4.5