📝 GETSSH 更新日志 (Changelog)
所有对 GETSSH 项目的重大更改都将记录在此文件中。项目遵循语义化版本控制。
🌪️ 基础设施大换血第二阶段:Tailwind CSS v4 & Vite 8 升级
- Tailwind v4 引擎跃迁:从 Tailwind CSS v3 全面升级至 v4。彻底废弃了臃肿的
tailwind.config.js,转而使用@import "tailwindcss";和@theme的纯 CSS 原生配置方案,释放次世代闪电般的样式编译引擎。 - Vite 8 深度整合:将构建工具链拉升至 Vite 8.0,完美迁移至全新的
@tailwindcss/vite插件和vite.config.mts配置规范,实现了极致的开发服务器冷启动速度。
🚀 基础设施大换血第三阶段:Electron 42 & Node 22 终极跨越
- 次世代 Electron 内核:跳出陈旧的 Electron 32 舒适区,将核心框架直接拉升至目前最前沿的 Electron 42.3.0。
- Node 22 后端环境:底层 Native 运行时同步升级至 Node 22,解锁最新的 V8 特性与强力安全补丁。
- IPC 接口现代化重构:逐一击破 Electron 42 带来的 API 破坏性变更(Deprecation Warnings),确保窗口控制器、系统事件监听器以及进程间通信(IPC)完美无缝运行。
📟 Xterm.js 架构清洗与加固
- N-API PTY 浴火重生:彻底清除了已经被时代淘汰的
@homebridge/node-pty-prebuilt-multiarch分支版本,全面回归官方的正统node-pty生态,直接调用 N-API 预编译库获得最高稳定性。 - Xterm 生态大一统:全局扫描并肃清了所有遗留的
xterm-addon-*散装依赖。将整个终端渲染引擎标准化至官方的@xterm/统一命名空间下(如@xterm/addon-fit、@xterm/addon-canvas)。 - WebGL/Canvas 智能降级渲染:在
Terminal.tsx中重铸了智能渲染回退机制。终端会优先尝试高性能 WebGL 渲染,并在检测到 GPU 上下文丢失或透明度不支持时,优雅且无感地平滑降级至 Canvas 渲染器。
🛡️ TypeScript 6.0 严苛防御体系
- ES2023 目标锁定:将全局 TypeScript Target 和 Module 系统拉升至
ESNext/ES2023,并强制开启isolatedModules和allowImportingTsExtensions严格模块解析。 - 零容忍类型核查:彻底修复了
sftpHandler.ts中原生回调函数的隐式any泄露,同时在cryptoHandler.ts(Rust N-API 解密边界)与sshHandler.ts(代理连接降级)中焊死了关键的空指针探测。在最高规格的strict: true下达成了完美的全局零编译错误。
📦 “小而美” DMG 极限打包压缩
- 多语言包暴击剔除:在
electron-builder配置中强行注入electronLanguages: ["en-US", "zh-CN"],像外科手术一样精准切除了 Electron Framework 中多达 50 个毫无用处的.pak和.lproj其他国家语言二进制包。 - 纯 JS 模块物理 Tree-Shaking:将
dompurify、p-limit、socks、http-proxy-agent等纯 JS 的伪 Native 依赖强行转移至devDependencies。Vite/esbuild 构建流现在会将它们直接原生融合进最终的index.js中,永久地把成千上万个碎文件从app.asar中驱逐出境。 - N-API 构建垃圾屏蔽:将
rust-core/**/node_modules/**直接踢出打包范围,阻断了约 17MB 的@napi-rs编译期废弃二进制文件泄漏进生产环境安装包。 - 压缩战果:经过一系列极限施压,完全压缩后的 ARM64 架构
.dmg体积历史性地跌至 101 MB —— 这几乎是完整搭载 Electron 42 庞大内核应用的物理体积极限!
🏗️ 基础设施大换血第一阶段:React 19 核心引擎热替换 (Infrastructure Upgrade Phase 1: React 19)
这是 GETSSH 技术栈现代化的重要里程碑。我们将整个前端核心引擎从 React 18 迁移至 React 19,全面拥抱最新的 React 运行时特性,并同步升级 UI 组件库与类型系统,确保未来的所有功能开发都建立在最前沿的技术地基上。
⚛️ React 19 核心迁移 (React 19 Core Migration)
- React 19.0.0 全量升级:将
react、react-dom及其类型定义@types/react、@types/react-dom全部拉升至19.0.0+,应用全面运行于 React 19 并发渲染模型之上。 forwardRef剥离预检:全局扫描代码库,确认项目无任何React.forwardRef遗留包装,已天然适配 React 19 原生 ref-as-prop 新范式。- 入口文件合规验证:确认
main.tsx入口使用了ReactDOM.createRoot,符合 React 19 的强制规范,无任何旧版ReactDOM.render残留。 - React 19 严格类型收束修复:修复了
ConnectForm.tsx中useRef<NodeJS.Timeout>()因 React 19 更严格的泛型推断规则报错的问题,将其更新为useRef<NodeJS.Timeout | null>(null)的规范写法。 - Lucide React 最新版升级:将图标库
lucide-react升级至最新版本,全量验证所有图标导入名称在新版规范中的兼容性,确认零命名冲突与废弃告警。 @testing-library/reactReact 19 适配:同步将测试库升级至最新版本,确保测试生态与 React 19 的 API 完全对齐。
🧹 环境物理清洗与依赖树重建 (Physical Dependency Purge & Rebuild)
- 幽灵依赖物理消灭:彻底销毁旧版混杂的
node_modules以及存在交叉污染的package-lock.json,并执行npm cache clean --force强制清空系统级 NPM 旧版缓存,从根源上消灭任何 React 18 遗留碎片。 - pnpm
node-linker=hoisted关键修复:深度排查并修复了由于pnpm默认软链接(Symlink)存储策略与 Electron 原生运行时 CJSrequire钩子不兼容导致的ssh2内部依赖路径迷失问题(Cannot find module './constants.js')。通过在.npmrc中强制启用node-linker=hoisted,让pnpm采用物理打平策略,完美解决了 Electron 中 CJS Native 模块的路径解析故障。 - 纯净依赖树封印:基于最终升级完成的
package.json执行了全新的pnpm install,完成了对整个依赖生态树的纯净重组与封印。
🔒 V2.0 插件 SDK 安全沙盒全面实装 (Plugin SDK v2.0 — Security Sandbox)
ctx.net.fetch网络通信桥实装:在后台插件的 Node VM 沙盒 Context 中安全注入了ctx.net.fetch(url, options)方法。插件须在package.json的capabilities数组中显式声明"net:fetch"权限,否则调用将被直接阻断并抛出SecurityError。- 终极 SSRF 防御墙:在底层 Fetch 拦截器中内置了严格的 DNS/正则双重防御,绝对禁止向局域网回环地址(
127.0.0.1,localhost,0.0.0.0)及私有 IP 网段(192.168.x.x,10.x.x.x,172.16.x.x)发起任何请求。 ctx.ui.registerSettings无代码配置表单:在受控的ctx.ui命名空间中注入了配置表单注册接口,允许后台插件在activate阶段注册包含string、number、boolean、password等类型的配置 Schema;主进程通过sync-plugin-settings-schemaIPC 同步给前端 Zustand Store,并在Settings.tsx的"插件配置"专属 Tab 中动态渲染出风格与宿主完全一致的表单组件,同时实现热重载。ctx.host.clipboard审计可视剪贴板:在受控的ctx.host命名空间中注入了clipboard.writeText和clipboard.readText,底层直接桥接 Electronclipboard原生模块;当插件调用readText时,系统强制弹出操作系统原生通知(通知内容含插件名称)以防止静默数据窃取,同时主进程记录完整审计日志。window.GETSSH.registerPanel/openPanel沉浸式面板:通过 preload 脚本向前端插件暴露了面板注册与开启接口;在sessionStore.ts中新增PluginPanelTab路由类型,在SessionManager.tsx的渲染树中引入<webview>进行沙箱化全屏渲染,使插件可以从侧边栏控制并接管主工作区的全景视图。
🛡️ 全代码库安全加固与 Bug 扫清 (Full Codebase Security Audit & Bug Fixes)
- IPC 路径穿越漏洞封堵:在
electron/main/index.ts中对getssh-plugin://自定义协议处理器实装严格的文件路径边界校验,拦截../../回溯攻击,确保插件只能读取其授权目录内的资产。 - 插件任意目录安装漏洞修复:在
PluginManager.ts的安装提交路径中增加对目标解压目录的 OS 级临时目录合法性校验,阻断非授权目录篡改。 - SFTP 写入越权防护:在
sftpHandler.ts的文件下载接口中强制锁定写入路径,仅允许写入Downloads或Desktop目录,防止恶意插件通过 SFTP 桥在系统后台注入自启动木马。 - TypeScript 全量 0 错误封印:对 70+ 个历史遗留 TypeScript 类型错误进行了系统性清除,涉及
src/types.d.ts(补全缺失的electronAPI接口)、LeafPane.tsx、PluginPane.tsx、TerminalPane.tsx、SplitPane.tsx、App.tsx等核心组件,最终实现npx tsc --noEmit输出零错误。
🦀 四大战区 Rust 底层改造全面竣工 (Rust Native Core — Full Completion)
这是一次对 GETSSH 进行彻底底层改造的里程碑式 Preview 版本。我们正式将 GETSSH 的核心性能敏感型路径从 Node.js / V8 完全剥离,交由 Rust 原生扩展(N-API)接管。此版本标志着四大安全与性能战区的 Rust 改造百分之百全面竣工。
🦀 战区一:Watchdog 进程卫士 (Process Guardian)
- Rust 独立守护进程正式落地:
rust-core/watchdog是一个完全独立于 Electron 主进程的 Rust 二进制守护程序,通过 Unix Domain Socket(macOS/Linux)和 Named Pipe(Windows)与主进程进行心跳通信。 - 60 秒物理强杀机制:若 Watchdog 在 60 秒内未收到心跳应答(如主进程被外部强制冻结或注入),Watchdog 将通过操作系统 API 对父进程发出物理级 SIGKILL,并弹出桌面通知,防止应用在被劫持状态下继续运行。
- SAFE MODE 防卡死兜底:当主进程从崩溃恢复并以 SAFE MODE 启动时,Watchdog 会自动识别并进入静默模式,不会对 SAFE MODE 进程执行强杀。
- 生产环境路径桥接:已全面实现
app.isPackaged双路径判断,确保无论是在开发环境还是打包后的生产环境,Watchdog 二进制文件均能被精准定位和启动。
🦀 战区二:Vault 本地凭证加密引擎 (Local Credential Encryption)
getssh-vaultN-API 扩展量产:通过@napi-rs将 Rust 加密逻辑编译为.node原生扩展,由 Electron 主进程直接加载。- AES-256-GCM 硬件级加密:使用 Rust
aes-gcmcrate 在底层实现对本地profiles.enc的物理级加密与解密,彻底消灭了 Node.js 层面的crypto模块潜在漏洞。 - 主密码与生物验证双重门禁:
cryptoHandler.ts实现了主密码校验与systemPreferences.promptTouchID生物识别的完整集成链路。
🦀 战区三:Sysprobe 系统探针 (System Metrics Probe)
getssh-sysprobeN-API 扩展量产:使用 Rust 的sysinfocrate 直接在操作系统底层采集 CPU、内存、网络、磁盘等系统指标。- 彻底剥离
node:os模块依赖:终结了systemHandler.ts之前依赖node:os的高频轮询方案,系统资源采集不再经过 V8 字符串序列化层,数据吞吐效率大幅提升,UI 卡顿率归零。
🦀 战区四:SFTP 极限混合网络引擎 (Hybrid SFTP Engine)
sftp-streamN-API 零拷贝引擎量产:rust-core/sftp-stream接管了文件上传和下载过程中最重的磁盘 I/O 部分。- Node-Rust 流水线桥接落地:
ssh2吐出的网络Buffer直接在 Rust 层被消费并流式落盘,彻底跳过 V8 字符串解析环节,形成"Node.js 负责网络协商、Rust 负责重 I/O"的混合双擎架构。 - 大文件下载确认防误触:在执行纯下载模式时,用户将看到当前文件的大小提示,确认后方可开始下载,有效防止对大文件的误触。
🔥 绝灭 adm-zip 内存毒瘤 (getssh-unarchive)
- 新建
getssh-unarchiveRust N-API 扩展:彻底废弃PluginManager.ts中使用的纯 JS 库adm-zip(其全量内存读取策略是一颗随时引爆的 OOM 炸弹)。 - 零拷贝流式解压:使用 Rust 的
zipcrate 与std::io::copy,文件从压缩包直接流式落盘,全程不经过任何 JavaScript/V8 内存。无论插件包体积多大,内存峰值波动恒定压制在 10MB 以内。 - 军工级 Zip Slip 漏洞物理封杀:在 Rust 层对压缩包内的每一条路径进行严格检查,一旦发现包含目录穿越符 (
../) 或绝对根路径的恶意条目,立即触发熔断机制,并物理销毁当前已解压的所有残骸文件,彻底封杀 Zip Slip 攻击向量。 tokio异步非阻塞解压:解压操作在 Rust 的tokio::task::spawn_blocking线程池中执行,Electron 主进程与渲染进程在解压过程中全程无感。
🔒 安全与锁定体验强化 (Security & Lock UX)
- CommandCenter 一键锁定档案按钮:在 WelcomePane 命令中心新增"锁定档案"按钮,用户无需等待超时计时器,随时可手动触发锁定。
- 未设密码时按钮智能禁用:若用户未设置主密码,"锁定档案"按钮自动灰化并展示工具提示说明,引导用户正确配置安全设置。
- 锁定界面 i18n 国际化:
CryptoModal锁定与解锁界面已全量接入react-i18next,完整支持中英文双语切换,彻底消灭英文残留。 - 锁定时高斯模糊隐私防护:触发锁定后,背景内容将被施加 40px 级别的强力高斯模糊滤镜(使用内联样式强制应用以规避 Tailwind JIT 潜在问题),有效保护隐私,防止无关人员从锁屏界面窥探用户的服务器信息。
- 全局加密状态单一数据源:将
cryptoMode、masterPassword等加密相关状态从App.tsx本地状态迁移至useCryptoStore(Zustand) 全局状态树,确保所有 UI 组件(包括 CommandCenter、CryptoModal)读取到一致且实时的状态。
📦 跨平台生产环境打包 (Cross-Platform Production Packaging)
- ASAR 物理剥离配置:在
electron-builder配置中加入"asarUnpack": ["**/*.node"],确保所有 Rust N-API 原生扩展被从app.asar虚拟文件系统中剥离,放入app.asar.unpacked真实物理目录,彻底消灭动态链接库在打包环境中加载失败的隐患。 - Watchdog 二进制注入:通过
extraResources配置,将预编译好的watchdog可执行文件原封不动地注入最终安装包的resources目录。 - macOS 硬化运行时与签名准备:开启
hardenedRuntime: true,并创建build/entitlements.mac.plist授权文件,注入com.apple.security.cs.allow-unsigned-executable-memory(兼容 V8 JIT)和com.apple.security.cs.disable-library-validation(允许加载自编译 Rust.node扩展),完美规避 macOS 10.15+ 系统的闪退与拦截。 - 依赖清理:彻底从根目录移除
adm-zip与@types/adm-zip,项目依赖树进一步纯净化。