AutumnNazi
|
cebf256a44
|
✨ feat(sidebar): 支持侧边栏宽度随拖动实时调整
- 使用 CSS 宽度变量与 RAF 实时更新侧边栏及工作区布局
- 仅在拖动结束后持久化最终宽度,避免每帧触发 Store 重渲染
- 移除侧边栏 ghost 指示线并补充交互清理回归测试
|
2026-07-27 21:40:21 +08:00 |
|
Syngnat
|
70282286fc
|
Merge pull request #744 from AutumnNazi/fix/cloud-backup-provider-separation
|
2026-07-27 20:47:37 +08:00 |
|
Syngnat
|
770243e0da
|
🐛 fix(kingbase): 修复开表与 ER 图加载缓慢问题
- 解耦 Kingbase 首屏查询与编辑定位元数据加载
- 使用单次全库外键快照替代 ER 图逐表扫描
- 补充大规模表结构和异步元数据回归测试
Fixes #731
Fixes #732
|
2026-07-27 20:39:08 +08:00 |
|
AutumnNazi
|
ee53a56183
|
✨ feat(cloud-backup): 支持加密云端备份与选择性恢复
- 新增 WebDAV 与 S3 独立配置、凭据和远端状态管理
- 使用 Argon2id 与 AES-256-GCM 加密连接及配置备份
- 支持分类备份、自动同步、远端预览和一次性确认恢复
- 连接与已保存查询按 ID 合并恢复,并保留本地独有数据
- 补充前后端回归测试、六语言文案和恢复失败回滚
|
2026-07-27 20:20:00 +08:00 |
|
Syngnat
|
999218dccc
|
Merge pull request #743 from virgosgod-maker/fix/go-test-environment
|
2026-07-27 19:34:36 +08:00 |
|
Syngnat
|
d35c863eb1
|
Merge pull request #742 from virgosgod-maker/fix/issue-734
|
2026-07-27 19:34:09 +08:00 |
|
mango
|
0bf8d28e22
|
🐛 fix(ci): 固定后端测试资源与 Java 编码
|
2026-07-27 19:14:37 +08:00 |
|
mango
|
5a16c2b201
|
🐛 fix(test): 修复后端测试环境与跨平台隔离
|
2026-07-27 19:05:06 +08:00 |
|
mango
|
596be31601
|
🐛 fix: 修复 Issue #734 (Closes #734)
|
2026-07-27 17:44:27 +08:00 |
|
Syngnat
|
0e06c74b54
|
🎨 style(redis): 扁平化工作台并修正分隔与悬浮细节
- 将 V2 Redis 工作台改为连续网格布局并移除卡牌边框与阴影
- 让左右面板分隔线跨行对齐并同步网格宽度变量
- 扩大分隔线拖动热区且保持视觉线宽为 1px
- 优化长 Key 省略布局和悬浮查看触发区域
Refs #727
|
2026-07-27 17:35:00 +08:00 |
|
Syngnat
|
1bede52595
|
🐛 fix(redis): 完善集合值分页与只读查看
- 统一 Hash、List、Set、ZSet 与 Stream 的自适应分页表格
- 使用 Redis 返回长度展示真实总数并保持分页入口可见
- 为 List 元素增加只读查看模式且避免误写 Redis
- 短列表不再预留空滚动槽并补齐多语言文案
Refs #728
Refs #733
|
2026-07-27 17:35:00 +08:00 |
|
Syngnat
|
1a25348292
|
🐛 fix(redis): 修复过滤扫描空页导致 Key 搜索漏项
- 自动沿非零游标继续扫描空结果页
- 在游标结束或重复时安全终止续扫
- 增加过滤搜索跨空页命中 Key 的回归测试
|
2026-07-27 17:35:00 +08:00 |
|
Syngnat
|
fac84c29fb
|
✨ feat(connection-modal): 重构连接弹窗 Studio 交互 (#740)
2026年7月27日 17:05:54 提交
|
2026-07-27 17:34:34 +08:00 |
|
Syngnat
|
d3fc941e14
|
🐛 fix: 修复 Issue #726 (#739)
## 关联 Issue
Closes #726
## 变更内容
- 为 SQL 查询结果的列筛选器增加当前已加载结果的值统计、数量和搜索,并支持点击值填充筛选条件。
- 为 SQL 内部结果标签增加固定/取消固定能力;固定结果不会被重跑、执行失败或批量关闭覆盖,并支持独立窗口拖出与还原。
- 将普通数据列最小拖拽宽度统一为 80px,避免排序和筛选按钮被裁切。
- 将 SQL 结果标签圆角统一为 8px,并补齐六语言文案与回归测试。
影响范围仅限前端查询结果、DataGrid 列筛选/列宽、结果标签状态及共享 i18n 文案,不涉及数据库结构或后端数据处理。
## 测试结果
- `npm --prefix frontend test -- --exclude
src/components/QueryEditorToolbar.layout.test.tsx`:通过(排除 upstream/dev
已存在且与本 PR 无关的过期样式断言)。
- `npm --prefix frontend test -- --run
src/components/QueryEditor.results-and-drop.test.tsx`:105/105 通过。
- `npm --prefix frontend test -- --run
src/utils/dataGridClientFilter.test.ts
src/components/DataGridColumnTitle.test.tsx
src/components/useDataGridColumnResize.interaction.test.tsx`:20/20 通过。
- `npm --prefix frontend test -- --run src/i18n/catalogIntegrity.test.ts
src/i18n/keyResolution.test.ts`:3/3 通过。
- `go test ./shared/i18n`:通过。
- `npm --prefix frontend run build`:通过。
- `git diff --check`:通过。
说明:`upstream/dev` 当前的 `QueryEditorToolbar.layout.test.tsx` 仍断言事务提交按钮使用
`--gn-accent-soft`,但同一基线 CSS 已改为 `--gn-warn`。本 PR
未修改该事务按钮区域,因此未将无关基线修复混入本次变更。
## 风险说明
- 不涉及数据变更、数据库迁移或后端兼容性变化。
- 值统计范围是当前 SQL 结果页已加载的数据,界面文案已明确为“当前结果”。
- 固定状态为 QueryEditor 会话态,不跨工作区关闭或应用重启持久化。
- 回滚方式:回退提交 `83f54d62`。
|
2026-07-27 17:34:02 +08:00 |
|
lsx
|
e79da2e1e6
|
✨ feat(connection-modal): 重构连接弹窗 Studio 交互
|
2026-07-27 17:02:55 +08:00 |
|
mango
|
83f54d62af
|
🐛 fix: 修复 Issue #726 (Closes #726)
|
2026-07-27 16:54:46 +08:00 |
|
Syngnat
|
2d1034e77e
|
✨ feat(connection-modal): 按 Demo 重做新建连接弹窗信息架构与密排表单
- 选型页:侧栏搜索/最近/分类 + 类型卡片网格(Studio 布局)
- 配置页:顶栏 Tab(基本/网络与安全/外观/高级),去掉左侧分区导航
- 基本区:URI 置顶,名称/主机/认证密排,模式分段,生产保护扁平折叠
- 网络区:列表勾选 + 详情面板;高级区承接 connectionParams
- Step1/Step2 分宽(960/600),补充 dense 文案 i18n 与相关单测
- 附:标题栏主操作抽成 TitleBarPrimaryActions,并附 HTML Demo 参考
|
2026-07-27 12:20:12 +08:00 |
|
Syngnat
|
b80989cb7b
|
🐛 fix(nativewindow): 修复主进程退出后子窗口残留
- 启动独立窗口时传递并校验主进程 PID
- 按平台监控父进程并在其退出后关闭子窗口
- 补充 PID 解析、真实父进程退出和异常探测回归测试
|
2026-07-27 08:43:12 +08:00 |
|
Syngnat
|
d48c7d06d6
|
🐛 fix(updater): 修复状态竞态与后台进程回收
|
2026-07-27 00:14:03 +08:00 |
|
Syngnat
|
970d861c39
|
🐛 fix(driver-agent): 为 IPC 超时与关停增加可取消回收
|
2026-07-27 00:11:16 +08:00 |
|
Syngnat
|
76249c00b9
|
🐛 fix(ssh): 为共享端口转发增加引用计数与失败回滚
|
2026-07-27 00:07:42 +08:00 |
|
Syngnat
|
546b71945d
|
🐛 fix(tdengine): 编码 DSN 用户名与密码
|
2026-07-26 23:33:48 +08:00 |
|
Syngnat
|
f8b698d9ae
|
🐛 fix(ai): 修复流式终态与 Provider 并发选择
|
2026-07-26 23:29:01 +08:00 |
|
Syngnat
|
cc24d8213a
|
✨ feat(connection): 优化数据源选择并支持全局搜索
- 新增全部分类、跨分类名称与类型键搜索及空结果提示
- 将卡片网格重构为响应式平面目录并完善键盘可达性
- 补齐六语言文案及语言切换、状态重置与过滤行为回归
|
2026-07-26 23:13:51 +08:00 |
|
Syngnat
|
daacd95193
|
🎨 style(connection): 连接表单必填项置顶并去掉层层卡片
信息架构:原顺序是 身份信息 → 连接 URI → …(约 800 行后)→ 目标地址 → 服务与数据库 → 凭据,
最关键的 host/端口/账号/密码排在最后,而可选的连接名称、预设类型与很高的 URI 多行输入框
占据首屏。
- 把 identity 与 uri 两组从条件链之前搬到之后,使首屏依次为目标地址 → 生产连接保护 →
连接模式 → 认证凭据;连接名称与预设类型下沉,URI 作为「粘贴整串」的高级入口置于末尾
- URI 分组改为可折叠且默认折叠;编辑已含 uri 的连接时默认展开,避免看不到已录入的值
- configSectionCardStyle 由「16px 圆角 + 边框 + 内阴影 + 独立底色」改为「小标题 + 细上分割线」,
并用 CSS 让首组不显示分割线
- modalInnerSectionStyle 同样去除边框/底色/圆角(保留内边距,间距不变)。该样式同时用于
左侧导航容器、右侧内容面板与网络安全各分组,原先与内部分组叠成多层「卡片套卡片」
- 左侧导航项改为扁平列表:去掉 14px 圆角、边框、渐变底与投影,选中态只用左侧强调条 + 淡底
- 测试补 expandUriSection 辅助函数:两个断言 URI 文案/按钮的用例需先展开该分组。
已确认这两项失败确由本次行为变更引起(基线 21 项全通过)
|
2026-07-26 22:31:04 +08:00 |
|
Syngnat
|
c5e25d2ff5
|
🐛 fix(sql-error): 锁等待超时不再被误判为查询超时并给出无效建议
MySQL 报 Error 1205 (HY000): Lock wait timeout exceeded 时,界面归类为「查询超时或被取消」,
建议「检查 SQL 执行计划、过滤条件和索引,必要时缩小查询范围或调整超时时间」——
这套建议对行锁等待完全无效:成因是另一个事务持锁,调大超时只会让用户等更久。
根因:timeout_or_canceled 规则里有一条过宽的 /timeout/i,而 findSqlErrorSemantic 取首个
命中的规则,于是把锁等待超时也吞成了查询超时。
- 新增 lock_contention 规则并排在 timeout_or_canceled 之前,覆盖各方言的锁竞争与死锁:
MySQL 1205/1213、PostgreSQL deadlock detected 与 lock timeout、
SQL Server 1222/1205、Oracle ORA-00060/00054/30006、SQLite database is locked
- 文案改为指向真正的处置动作:先提交或回滚未完成的事务(含本应用 SQL 编辑器里自己未提交的
事务)再重试,并明确说明调大查询超时无效
- 6 个语言补齐 label/explanation/suggestion
- 补 4 项测试:1205 不再归类为超时、建议不再提"调整超时"、各方言锁竞争均被识别、
普通查询超时不被新规则误吞。已确认清空新规则的 patterns 后 3 项必定失败,
且失败信息正好复现原缺陷
|
2026-07-26 22:17:04 +08:00 |
|
Syngnat
|
e6d77cd7ab
|
🐛 fix(transaction): 修复前端刷新后托管事务变成孤儿并长期持有行锁
复现路径:SQL 编辑器执行 DELETE 进入托管事务后不点提交、直接刷新前端,再执行同一条 DELETE,
会卡满 innodb_lock_wait_timeout(默认 50 秒)并报 Error 1205 Lock wait timeout exceeded,
只能重启应用才能恢复。
根因:待提交事务的 ID 只存在于前端组件内存(useSqlEditorTransactionController 的
useState/useRef),持久化状态里只有 commitMode/autoCommitDelayMs 这类设置。前端一旦刷新,
残留在 a.sqlTransactions 中的条目就再也无法被提交或回滚,却仍开着并持有 pinned 连接与行锁。
原先只有显式提交/回滚与应用退出(rollbackPendingSQLTransactionsOnShutdown)两条清理路径,
刷新不经过其中任何一条。
- 新增 Wails OnDomReady 钩子(每次 WebView 导航完成即触发,刷新必然命中),
回滚所有已无法被引用的托管事务。首次加载时事务表为空,故无副作用;
本应用是 React SPA,正常使用中不会产生整页导航,不会误杀活跃事务
- rollbackPendingSQLTransactionsOnShutdown 抽出公共实现,审计来源区分
app_shutdown 与 frontend_reload,便于事后区分两类自动回滚
- 补 4 项回归测试:回滚并释放会话、空表无副作用、nil 容错、已完成事务不重复回滚。
已确认禁用钩子后首个用例必定失败(回滚 0 次)
顺带说明:界面把 Error 1205 归类为「查询超时或被取消」并建议「检查执行计划、调整超时时间」
是误导——1205 是行锁等待超时,成因是另一事务持锁。该错误语义映射未在本次修改范围内。
|
2026-07-26 22:11:10 +08:00 |
|
Syngnat
|
08fff6aa36
|
🎨 style(theme): 提升主操作按钮醒目度、修复默认主题标签对比度并降级保存按钮
- 新增 --gn-accent-strong 系列(提饱和 1.55×)供主按钮填充:内置主题的强调色刻意低饱和
(Comfort Dark 仅 20%、Deep Ocean 28%),淡到接近灰蓝,填在按钮上读起来"没有颜色"。
只改按钮填充,侧边栏高亮与文字仍用原 accent,保持主题整体淡雅。
实测深色主题饱和度提升到 31%–72%,对工具栏对比度仍 ≥6.0、标签 ≥6.1
- 提饱和只对深色主题生效:浅色主题的强调色本身已约 46% 饱和,提了反而把白色标签从 4.5+
压到 4.14 跌破 AA(该情况由新增测试抓出)
- 默认 v2 主题补上此前从未定义的 --gn-on-accent:所有 var(--gn-on-accent, #fff) 都在回退
白字,深色下压 #22c55e 仅 2.28、浅色下压 #16a34a 仅 3.30,均不满足 WCAG AA。
改为 #0a2417 / #052e16,得 7.21 / 4.52
- 「保存」按钮降为描边次级样式:它与「执行」原本都是实心按钮,而两者填充色(accent 与 info)
在内置主题下区分度仅 1.05–1.25,相邻两个同色方块分不出谁是谁。
由于 Midnight Navy / Nord Slate 的 accent 本身即蓝青系,靠拉开色相无法解决,
改用层级区分:工具栏里只有「执行」是实心主按钮,主操作因此真正突出
- 补 2 项不变式测试:accent-strong 饱和度提升且标签 ≥4.5、其三态同样逐级加深
说明:原计划的「拉开执行与保存色相」经测量不可行(accent 自身即蓝青系,warn 已被手动事务
占用),故改为层级区分,与之前沟通的方案不同。
|
2026-07-26 21:59:17 +08:00 |
|
Syngnat
|
57d6e50884
|
🎨 style(transaction): 手动事务提交按钮改用 warn 独立配色并修复待提交条数看不见
- 手动事务的「提交」按钮不再跟随主题强调色:它是需要用户显式决断的状态,与普通主操作同色时
无法区分。改用 warn 实心填充,与已是 danger 的「回滚」形成语义配对。
原先是 accent-soft 底 + accent-2 文字,同色系淡色叠淡色,文字本身对比就很低
- 修复待提交条数徽标的数字看不见:底色原为硬编码 rgba(22,163,74,.18)、文字为 --gn-accent-2,
而按钮底是 --gn-accent —— 三者几乎同色,实测对比度仅 1.10–1.17,
静止状态数字完全不可见,只有 hover 把按钮压暗后才显现(DataGrid 与 SQL 编辑器两处同病)
- 新增 --gn-on-warn / --gn-warn-hover / --gn-warn-active / --gn-warn-badge-bg /
--gn-accent-badge-bg。前景色按亮度择优,因为 warn 跨度很大(#9f5f1d ~ #ebcb8b);
徽标底色的叠加方向也随前景色反向偏移,写死半透明白会让浅色主题的白字只剩 2.65
- 补 3 项不变式测试:warn 标签与徽标数字对比度均 ≥4.5、warn 三态逐级加深且互不相同。
该用例已实测抓住浅色主题 warm-paper 的徽标对比不足
实测:徽标数字对比度由 1.10–1.17 提升到 ≥4.5;warn 标签 7.59–11.80。
|
2026-07-26 21:51:08 +08:00 |
|
Syngnat
|
5e1afad49f
|
🐛 fix(frontend-test): 移除钉死主题变量的 DataGrid 提交按钮样式断言
- 该断言要求 hover 态 CSS 精确包含 background: var(--gn-accent-2) !important
- 主题修复将 hover 与 active 拆分为 --gn-accent-hover 与 --gn-accent-active 派生色后,断言随即失效
- 断言仅比对样式表文本、不验证渲染结果,同 it 用例中的 16 项渲染断言保持不变
|
2026-07-26 21:50:10 +08:00 |
|
Syngnat
|
de43b1fb4d
|
🐛 fix(tabs): 恢复活动标签顶部强调条 (#725)
- 合并 PR #725,为 V2 工作区活动标签补回顶部强调条
- 冲突文件 TabManager.adaptive-width.test.ts 取本地版本:PR 更新的是读取 v2-theme.css 文本做正则匹配的断言,该类断言已在测试套件治理中整体移除,保留会与测试策略守卫冲突
- 强调条样式变更由 v2-theme.css 承载,测试文件仅保留自适应宽度的行为用例
|
2026-07-26 21:41:48 +08:00 |
|
Syngnat
|
75660ef3db
|
🎨 style(theme): 修复主要操作按钮交互态在各主题下几乎不可辨
根因在 token 层:--gn-ant-primary-hover 与 --gn-ant-primary-active 都直接取 palette.accent2,
两者取值完全相同,hover 与按下态在视觉上无任何区别;而 accent2 又是 accent 的近邻色
(内置主题的强调色刻意低饱和),实测 base→hover 对比度仅 1.05–1.29,
其中 Deep Ocean 的 accent2 甚至比 accent 更亮(调色板方向反了)。
- 新增 mixHex 与 --gn-accent-hover / --gn-accent-active,按 82% / 60% 派生逐级加深的三态,
并让 --gn-ant-primary-hover/active 指向它。该链路经 customTheme.ts:read →
App.tsx colorPrimaryHover/Active 传给 antd,全站主要操作按钮一并受益
- 混合锚点按模式区分:深色主题向面板底色混合;浅色主题的面板比强调色更亮,
向面板混合会把按钮冲淡成禁用观感,改为向纯黑混合(用 fg1 只能到 1.19–1.22 不达阈值)
- 提交事务按钮(DataGrid 与 SQL 编辑器两处)拆分 :hover 与 :active,
此前两者共用同一条规则、点击无反馈;回退值保留 accent-2 兼容旧自定义主题
- 补 4 项不变式测试:三态互不相同、两段对比度均达 1.25、亮度单调递减不反向。
该用例已实测抓住浅色主题的方向反转与阈值不足
实测:深色主题 base→hover 1.31–1.39、hover→active 1.43–1.55;浅色 1.35 / 1.45。
未处理:默认 v2 深色主题未定义 --gn-on-accent 而回退 #fff,白字压在 #22c55e 上仅 2.28、
禁用态文字 2.05,均不满足 WCAG AA;按本次确认范围未纳入。
|
2026-07-26 21:39:26 +08:00 |
|
Syngnat
|
b8af7bede8
|
🐛 fix(frontend-test): 移除因标记失效而长期失败的 DataGrid 静态断言
- 删除 localizes editor and JSON feedback through DataGrid i18n keys 用例
- 该用例以含换行符的代码片段为起止标记切取源码,Windows 检出为 CRLF 时 indexOf 返回 -1,切出空串后报出无法定位的断言错误
- 用例全部断言均作用于源码切片,不执行被测代码,删除后该文件 33 项测试全部通过
|
2026-07-26 21:37:56 +08:00 |
|
Syngnat
|
88b427c41a
|
🔥 remove(go-test): 删除后端读取源码文本断言的测试函数
- 移除 99 个仅读取同包 .go 源码做字符串包含断言的测试函数,共 3746 行
- 判据为函数内出现 os.ReadFile 读取 .go 文件且剥离字符串字面量后不调用任何生产代码
- 保留 2 个同时调用生产接口的测试函数,清理 45 个文件中失去引用的 import
- go build、go vet 通过,测试失败集合由 40 项减至 39 项且无新增,减少项为已长期失败的墓碑用例
|
2026-07-26 21:37:22 +08:00 |
|
Syngnat
|
57a0bb4f69
|
🐛 fix(about): 修正更新通道选中态被 v2 通用 Segmented 样式覆盖
- 上一提交的选择器特异性只有 (0,3,1),与 v2-theme.css:601 的
`body[data-ui-version="v2"] .ant-segmented .ant-segmented-item-selected` 同分,
而 v2-theme.css 在 App.css 之后导入,同分时后加载者胜出,
选中态仍被 --gn-bg-panel 覆盖回灰底,主题色胶囊实际未生效
- 选择器补上 .ant-segmented(.gonavi-about-update-channel.ant-segmented)把特异性提到 (0,4,1)
- 选中项的 color 一并显式设为白色,避免 v2 通用规则的 --gn-fg-1 在强调色底上对比不足
|
2026-07-26 21:21:51 +08:00 |
|
Syngnat
|
bb3a6ee577
|
🎨 style(about): 修正开关与更新通道选择器的主题色一致性
- 修复 v2 深色下「自动检查更新」开关显示为琥珀色:旧版 UI 的
body[data-theme='dark'] .ant-switch.ant-switch-checked 用了两个类,特异性高于
v2-theme.css 的 .ant-switch-checked,即便 v2 样式后加载也会被压过。
给旧版规则加 :not([data-ui-version='v2']) 限定,让 v2 的 --gn-accent 生效
- 同一根因的 .ant-radio:hover 琥珀描边一并限定(v2 未覆盖该选择器,同样会泄漏)
- 更新通道选择器改为主题色实心胶囊:原深色下选中态 rgba(30,41,59,.98) 与容器底
rgba(15,23,42,.55) 对比极低,选中状态几乎不可辨且未体现主题色。
选中项与切换滑块统一用 var(--gn-accent) + 白字,未选项透明底、hover 微亮,
并补充跟随主题色的键盘焦点环
- --gn-accent 仅在 v2 下定义,故新规则限定 v2 作用域,旧版 UI 保留原中性配色
未加测试:两处均为纯 CSS 视觉改动,jsdom 不加载外部样式表、无法断言计算样式;
且项目已立规约禁止新增读取源码文本的断言型测试(src/testPolicy.test.ts)。
已通过 tsc --noEmit 与 useAppUpdateManager/customThemeStore/v2ThemeModalConfirm/testPolicy 共 34 项测试。
|
2026-07-26 21:18:27 +08:00 |
|
Syngnat
|
3ea04f5530
|
🐛 fix(webserver): 修复 X-Forwarded-For 可绕过登录失败锁定
- clientIP 改为以不可伪造的直连对端地址为准:该头完全由客户端控制,原实现无条件采信其首值,
直连攻击者每次请求换一个值即可拿到全新限流桶,彻底绕过 5 次失败锁定
(口令下限仅 6 位可在线爆破),并使 attempts map 无界增长;且每次尝试都会触发一次
64 MiB 的 Argon2id 推导,形成认证面的 CPU/内存 DoS
- 新增 GONAVI_WEB_TRUSTED_PROXIES(IP/CIDR 逗号分隔):仅当对端命中该列表时才采信
X-Forwarded-For,并取最右侧的非可信跳(左侧可被客户端预先伪造);非法值不予采信,
避免用任意字符串制造新桶
- loginAttemptTracker 增加条目上限与过期清扫:条目原先只在登录成功或同 key 再次 allow 时
才删除,分布式来源下会单向增长
- docker.web-server.env.example 补充新变量说明(含反代部署下必须配置的提示)
- 补 4 项回归测试,已确认还原为采信 XFF 首值后必定失败
|
2026-07-26 21:08:49 +08:00 |
|
Syngnat
|
0c10be0aa2
|
🐛 fix(db): 修复大整数与 IP 列显示丢值、会话路径方言退化、MariaDB 漏影响行数校验
- normalizeQueryValue 的 Struct 分支补「指针接收者 Stringer」探测:big.Int 的 String() 定义在
*big.Int 上,clickhouse-go 对 Int128/UInt128/Int256/UInt256 列返回 big.Int 值,原先落到
fmt.Sprintf("%v") 变成内部结构体转储,前端与 CSV/JSON/XLSX 导出的原始数值完全不可恢复
- Slice 分支对具名字节切片先试 Stringer、再回退 bytesToDisplayValue:net.IP 是具名 []byte,
不匹配上层的 case []byte,原先被展开成 [192,168,0,1] 而非 "192.168.0.1"
- MySQL/MariaDB 的 OpenSessionExecer 补回扫描方言:原先传空串使 DATE 列在会话路径
(流式导出、SQL 编辑器托管事务)被格式化成 RFC3339,与网格直查的 2006-01-02 不一致
- MariaDB.ApplyChanges 的 DELETE/UPDATE 补 requireSingleRowAffected(与 mysql_impl 对齐):
原先丢弃 sql.Result,无主键表上一次单元格编辑可能静默改写多行,或 0 行命中仍提示提交成功
- 补 5 项回归测试,并断言既有的 MySQL BIT 位掩码语义未被破坏
未修:query_value.go 的 PG bit/varbit 文本位串被当作二进制位掩码解释。该缺陷需要给 6 个
PG 系驱动都补 scanDialect 才能可靠区分方言;仅按字节内容启发式会把 MySQL BIT(8) 存值 48
(字节 0x30 即 ASCII '0')误显示为 "0",属于用一个静默错误换另一个,故留待单独处理。
|
2026-07-26 20:52:58 +08:00 |
|
Syngnat
|
8e3a183abb
|
♻️ refactor(frontend-test): 剥离混合型测试中的寄生源码文本断言
- 基于 TypeScript AST 精确识别 readFileSync 派生变量及其断言,仅删除不改写保留代码
- 断言全为源码文本的 it() 块整块移除,混合块中只剔除单条源码断言
- 清理随之失效的变量声明、空 it()/describe() 与无用 import,6 个文件因无用例残留而删除
- 累计移除 1283 处代码区间、8270 行,守卫基线由 130 条收敛至 12 条
- 全量测试失败集合无新增,TabManager 悬浮信息用例的 CRLF 误报一并消除
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-26 20:52:35 +08:00 |
|
Syngnat
|
4c93e7f175
|
🐛 fix(driver-agent): 移除 IPC 单行 8 MiB 上限,避免大批次请求打死连接
- 请求主循环由 bufio.Scanner 改为 bufio.Reader.ReadString:Scanner 的单行上限硬编码 8 MiB,
超限时 Scan() 返回 false 使循环退出、进程终止,该连接从此永久不可用(主进程后续所有
查询/元数据操作都返回 EOF,只能手动重连)。而主进程写入端本就无上限:一个 1000 行的导入
批次或一个大 JSON/CLOB 单元格都能轻易超过 8 MiB
- 循环抽出为 serveAgentRequests(input, writer, runtimeState) 以便测试,并正确处理末行无换行符
- 补 3 项回归测试:12 MiB 超大行后续请求仍被处理、非法 JSON 只回错误不终止循环、末行无换行符
- 已实测确认前提:8 MiB 上限的 Scanner 对 12 MiB 单行读到 0 行并返回 token too long
|
2026-07-26 20:42:50 +08:00 |
|
Syngnat
|
9074cd9707
|
🔥 remove(frontend-test): 删除源码文本断言型测试并补齐全局 i18n 校验
- 删除 105 个纯静态测试文件(6624 行):仅把源码当字符串断言、不执行被测代码
- 新增 testPolicy 守卫:禁止新增读源码文本的测试,131 个存量文件记入只减不增的基线
- 新增 i18n keyResolution:校验源码 t() 引用的 key 均可经完整解析链得到译文
- 新增 i18n catalogIntegrity:校验占位符跨语言一致、无空译文
- 补齐 6 个语言包缺失的 common.retry,修复审计面板重试按钮显示字面量 key
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-26 20:39:11 +08:00 |
|
Syngnat
|
663ef8259b
|
🐛 fix(app): 修复已存查询导入丢失 SQL 与连接配置并发写入互相覆盖
- saved_queries.Import 改为复制 file.Queries 再原地更新:原先直接引用底层数组,下标写会同时
污染 file.Queries,使 replaceQueries 拿到的「磁盘旧快照」已含新值,比较 previous.SQL 相等
而跳过写盘。同 ID 同名条目只改 SQL 时,元数据已更新但 .sql 文件仍是旧内容,新 SQL 永久丢失
- connections.json 增加包级互斥 savedConnectionsMu:savedConnectionRepository() 每次返回新
实例,实例级锁无效。Save/Delete/Duplicate 与 migrateSavedConnectionSecrets 的
load→修改→saveAll 序列纳入同一临界区,避免后写者用旧列表整体覆盖前写者导致连接静默丢失,
以及 Delete 删除密文后被 Save 写回而产生的僵尸连接
- saveAll 改为临时文件 + Sync + 原子替换:os.WriteFile 先截断,进程在该窗口被杀会留下空的
connections.json;原子替换后读者只会看到旧文件或完整新文件,只读路径无需加锁
- 补 4 项回归测试,均已确认在移除修复后必定失败(12 条并发保存、并发混合增删的 JSON 完整性、
原子写无临时文件残留、同名改 SQL 的落盘)
|
2026-07-26 20:36:04 +08:00 |
|
AutumnNazi
|
b2f2dff6fd
|
🐛 fix(tabs): 恢复活动标签顶部强调条
- 恢复 V2 工作区活动标签顶部绿色强调条
- 保留标签四角圆角与顶部伪元素屏蔽逻辑
- 更新活动标签视觉回归断言
|
2026-07-26 20:35:29 +08:00 |
|
Syngnat
|
2bdbdc9382
|
🐛 fix(sync): 修复分页比对与 DDL 字面量缺反斜杠转义导致的错删行与语法错误 DDL
- quoteSyncSQLString 改为方言感知:新增 syncDialectEscapesBackslash,对 mysql/mariadb/
clickhouse/tdengine/starrocks/diros/oceanbase 先翻倍反斜杠再翻倍单引号;postgres 系、
sqlserver、sqlite、duckdb 保持原样(翻倍反而会写入两个反斜杠并损坏比对)
- 含反斜杠的主键原先在 IN 列表里被目标库解释成别的字符串,导致源端存在的行先被判为插入、
反查时又匹配不到而被判为删除并真的从目标删掉,最终 Success=true 但目标永久缺行
- dbType 逐层传入 formatSyncSQLLiteral 的 3 个调用点:buildPKInSelectQuery、
buildKeysetPagedTableQuery、buildSourceQueryPKInSelectSQL
- escapeMySQLStringLiteral 同类修复:列注释与 DEFAULT 值内联进 MySQL/ClickHouse DDL 时,
以反斜杠结尾的注释会让 COMMENT '...\' 吞掉闭合引号并生成语法错误的 DDL
- 补 5 项回归测试,方言分组做双向断言(漏加与误加都会失败)
|
2026-07-26 20:19:29 +08:00 |
|
Syngnat
|
01c3c2f9c9
|
🐛 fix(sync): 修复 SQL 结果集全量覆盖先清空目标表导致的数据不可恢复丢失
- 加自表守卫:源查询是任意 SQL、无法可靠判断是否引用目标表,故抽出 isSameSyncEndpoint
做端点级比较,源与目标同端点时退回非分页路径(该路径先把源行读入内存再清空,语义安全)。
分页叠加自表覆盖本质不可行:清空后的分页会读到空表,目标最终只剩第一页数据
- 改为先读首页、成功后才清空目标,与 tryApplyDirectImportInPages 保持一致。
原顺序先 TRUNCATE 再首读,源查询一旦报错就留下被清空且无法恢复的目标表
(TRUNCATE 在 MySQL 上是 DDL、隐式提交不可回滚),而函数还把读到 0 行当作同步成功
- isSamePhysicalSyncTable 改为复用 isSameSyncEndpoint,表名比较语义不变
- 补 4 项回归测试:端点比较、表名语义不变、自表退回且退回前未清空、先读后清顺序
|
2026-07-26 20:11:52 +08:00 |
|
Syngnat
|
1128c501c3
|
🐛 fix(mqtt): 修复关闭连接与在途消息拉取竞争导致的进程崩溃
- pahoMQTTRuntime 增加 RWMutex 与 activeClient() 快照取用:FetchMessages 会在 4~30 秒
等待窗口结束后才在 defer 里解引用客户端,而 Close() 原先无锁把 client 置为 nil,
保活探测失败或用户断开连接时那次 nil 接口方法调用会崩掉整个桌面进程
- Close() 改为只置 closed 标志并断开连接,不清空在途读者会解引用的字段;并保证幂等
- FetchMessages/Publish/Ping 全程改用入口处的客户端快照,defer 中的 Unsubscribe 同样使用快照
- MQTTDB.Close() 不再把 m.runtime 置 nil,消除 QueryContext/Publish 通过 nil 检查后
解引用的窗口;关闭后的 runtime 对所有调用返回「连接未打开」,报错口径不变
- 补 3 项回归测试:在途读者快照可用性、并发 Close 交错、Close 幂等性
|
2026-07-26 20:08:07 +08:00 |
|
Syngnat
|
e8ef3b3f01
|
🐛 fix(webserver): 修复登录/初始化页 next 参数的 DOM XSS 与开放重定向
- 客户端补归一化:两个页面脚本都用 location.search 重读原始 next,服务端过滤对其完全无效。
新增共用的 safeNextTarget(),用 URL 解析器做同源判定(javascript:/data: 的 origin 为 null),
归一化后再交给 window.location.replace,堵住 ?next=javascript:... 在页面自身源内执行、
进而携带会话 Cookie 调用 /api/invoke 读取全部已保存连接并执行任意 SQL 的链路
- 服务端补 /\ 缺口:抽出 isSafeLocalRedirect 供 resolvePostAuthRedirect 与
buildAuthRedirectURL 共用。WHATWG URL 解析器对 special scheme 把反斜杠等价为斜杠,
故 /\evil.com 会被解析成 //evil.com,原先仅查 // 前缀挡不住该变体
- 补回归测试:覆盖 javascript:/data:///evil.com//\evil.com 等载荷,
并断言两个页面脚本不再出现未归一化的 next 裸读
|
2026-07-26 19:56:50 +08:00 |
|
Syngnat
|
6a21b75ff7
|
🐛 fix(export): 补齐 SQL 导出反斜杠转义漏掉的 ClickHouse 与 TDengine 方言
- isMySQLLikeDBType 更名为 dialectEscapesBackslashInStringLiteral,按语义而非协议族命名
- 新增 clickhouse/tdengine/taos:这三个方言的字符串字面量同样支持 C 风格反斜杠转义,
上一提交漏掉会导致其 dump 还原时仍被静默改写
- 补充双向断言:漏加方言(数据被改写)与误加方言(反斜杠被写成两个)都会测试失败
|
2026-07-26 19:43:41 +08:00 |
|
Syngnat
|
1a8effb51f
|
🐛 fix(export,ssh,secret,explain): 修复 SQL 导出注入与六处静默数据丢失/资源泄漏
- SQL 导出:formatSQLValue 按方言转义反斜杠,修复 MySQL 系 dump 还原时静默改写数据、
且以反斜杠结尾的值吞掉闭合引号致源库恶意行可执行任意 SQL 的问题;非 MySQL 方言保持原样
- 明文凭据:daily_secrets.json 由 0o644 改为 0o600、目录改 0o700,并对历史文件显式 Chmod
- SSH 隧道:RegisterSSHNetwork 改为确定性 network 名并复用缓存客户端,消除驱动全局 dialer
表随重连线性增长、永久钉住 ssh.Client 的连接与 goroutine 泄漏
- xlsx 导入:单元格 r 属性列号增加 OOXML 16384 上限并提前熔断,避免篡改文件放大分配致 OOM
- 数据导出:三处非 SQL 导出入口捕获 file.Close 错误,不再在落盘失败时返回“导出成功”
- 数据根迁移:copyFile 捕获 Close 错误并补 Sync,避免被截断的副本被判定为迁移成功
- 执行计划:节点 ID 改为按 ExplainResult 派生,移除进程级全局计数器与 reset,
修复并发诊断互相踩踏编号导致的重复 node ID 与错挂父子边
- 补充 5 个回归测试文件,含“导出→切分”闭环断言与未转义时的反向对照
|
2026-07-26 19:40:33 +08:00 |
|
Syngnat
|
702a21cbfa
|
🐛 fix(proxy,export): 修复转发器并发竞争泄漏与 xlsx 导出错误吞噬
- 转发器缓存改为写锁内双重检查,避免并发下重复创建 listener 造成端口与 goroutine 泄漏
- writeRowsToXlsx 通过命名返回值捕获 file.Close 错误,防止导出数据未落盘被静默忽略
|
2026-07-26 18:53:51 +08:00 |
|