Skip to content

Releases: YZBRH/keyrealm

v1.4.3

Choose a tag to compare

@github-actions github-actions released this 15 Oct 08:56

新增

  • 检查到新版本时显示「更新内容」:正式版展示目标版本在远端 CHANGELOG.md 里的那一段
    (拿不到就退回该 Release 的说明正文),测试版列出当前 commit → 远端 commit 之间的全部提交
    标题
    。取不到只提示一句,不影响检查结果本身。
  • 「短信服务商」只保留下拉里能真验证的服务商:其余没有只读校验接口的一律移出选项,免得选了
    却只能得到「未验证」。

变更

  • 「更新」卡片挪到「系统设置」最后一栏(与「网络与代理」交换位置)。
  • 邮箱的 TLS 交给框架的「TLS 版本」策略:邮箱原先自持一套「允许旧版 TLS」开关(插件字段
    allow_legacy_tls),与框架重复造轮子;现复用 plugin_sdk.ssl_context()。要连只开
    TLS 1.0/1.1 的老邮件服务器,把该凭据的「TLS 版本」固定成 1.1(或 1.0)即可——框架在固定
    旧版时会自动放宽 OpenSSL 安全级别。邮箱「不校验证书」的既有行为保持不变。
  • 仓库转为公开:README 增「效果演示」截图小节;「访问令牌」的说明改为可选(不填也能检查
    与更新,填了是认证 GitHub API、避开匿名限流;仓库转回私有时才必需)。
  • 插件 docstring 与 manifest 提示文案整体精简;五家云厂商签名器的逐字校准证据集中到
    docs/SIGNER_CALIBRATION.md;README 定稿新结构。

修复

  • macOS 版启动一两秒后自己退出(应用完全不可用):托盘用的 pystray 在 macOS 上会去跑
    Cocoa 的主事件循环,而原先把它放进了后台守护线程——主线程的 webview.start() 于是拿不到
    循环控制权、立刻返回,应用随即正常收尾退出(Windows / Linux 的 pystray 后端允许脱离主线程,
    所以只在 macOS 上发作)。现改为把共享的 NSApplication 交给 pystray.Icon(...)、再用
    run_detached() 挂到 pywebview 的主循环上;旧版 pystray 不支持该集成时直接不显示托盘,
    绝不退回「抢主循环」那条路。
  • 备份导入:经表单保存过的凭据一律导入失败:导入校验把「不在插件 fields_schema 里的键」
    判成未知字段,而保留键(_proxy_mode / _proxy_id / _tls_version)本就不由任何 manifest
    声明,于是每条经表单存过的凭据都被整条判失败(导出再导入即复现)。现把保留键从该判定里豁免。

数据库

  • 结构版本 1.2.1 → 1.2.2(一跳脚本 scripts/migrations/m_1.2.1__to_1.2.2.py,无表结构
    变动
    ,可在更新交棒阶段完成)。对应凭据数据格式变化:mail_smtp 删掉 allow_legacy_tls
    字段;数据部分由 backend/data_upgrades.py 在解锁后 / 导入备份时完成(只删旧键,原先勾过
    的人改在「TLS 版本」里重选)。

v1.4.2

Choose a tag to compare

@github-actions github-actions released this 14 Oct 18:29

新增

  • 首页侧栏品牌名右侧显示版本号:小字灰色 v1.4.2(取自 get_version 的 version,
    不带 commit 尾巴);侧栏收起时不显示。

变更

  • 「百度人脸」换上真实图标:原先用 emoji 🙂 占位,现为百度蓝圆角底 + 「AI」字标。
  • 「Google API 凭据」改名为「Google API」 —— 只改显示名,credential_type 与目录名不动。
  • 「短信服务商」从「API 服务」移入「邮箱」类别,该类别改名「邮箱 / 短信」:
    短信网关 / 接码服务商是发送通道,与邮箱同族;「API 服务」那一类装的都是在线服务的密钥
    (Firecrawl / Tavily / 秘塔 / Coze / Dify / FOFA / Google API / 百度人脸)。
  • 「Cloudflare」从「域名解析」移入「云服务商」:它验的是平台凭据本身——API Token 打
    /user/tokens/verify、Email + Global API Key 打 /user,不是 DNS 权限;credential_type
    本来就是 cloud_cloudflare(当年移入 dns 时留下的名字)。
  • 类别计数:API 服务 9 → 8、邮箱 / 短信 1 → 2、域名解析 4 → 3、云服务商 11 → 12
    (插件总数 64、类别数 10 不变)。

数据库

  • 结构版本保持 1.2.1 —— 无结构变动,不需要迁移脚本。上面几次搬迁只改插件的
    归属类别(目录),credential_type 一律不变,存量凭据与启用状态都不受影响;
    库里的 plugin_path / category 由 upsert_plugin 在启动时自动同步。

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 17:25

修复

  • 正式版更新装不上(✗ 解压失败:[Errno 13] Permission denied: …\Keyrealm.exe):交棒进程自己
    就跑在待替换的 exe 上,而 Windows 下运行中的 exe 不能原地覆盖(WinError 32,Python 报成
    PermissionError)——「源码构建」那条路早已先改名腾位,「解压预编译包」这条路漏了,于是
    1.4.0 的正式版更新在任何机器上都装不上。现在两条路复用同一套让位逻辑:包里带 exe 时先挪到
    <exe>.old 再解压;中途失败挪回来(宁可停在旧版本,也不让程序目录没有 exe)。

数据库

  • 结构版本保持 1.2.1 —— 无结构变动,不需要迁移脚本。

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 16:58

新增

  • 「对象存储」类别(第 10 个类别):
    • S3 兼容存储(storage_s3):签名 ListBuckets 验证 Access Key(MinIO / 自建 / 任意 S3 兼容),
      并提供桶列表、对象浏览、对象下载。
    • 匿名对象存储(公开桶检测)(storage_anon):不需要任何密钥,判定并浏览可匿名访问的桶
      (只读列举 / 读取 / 打包下载 + 一次匿名写探测),通吃阿里云 OSS / 腾讯 COS / 华为 OBS / AWS S3 /
      百度 BOS / MinIO 及任意 HTTP 桶。
    • 插件总数 61 → 64,类别 9 → 10。
  • TLS 版本策略(框架级,走 make_client() 的插件全部自动生效,插件无需改动):
    • 新增「TLS 版本」下拉:auto(默认)/ 固定 1.0 / 1.1 / 1.2 / 1.3;按
      凭据 > 插件预设 > 类别预设 > 全局默认 逐级继承(与「代理」同一套),系统设置里可改全局默认。
    • auto = 先按标准协商;仅当握手在连接阶段失败才自动回退 TLS 1.2 重试一次(证书校验照旧)。
    • 连接失败时日志会打印异常链,可直接区分「被重置 / DNS 失败 / 证书失败 / 超时」。
  • MCP 记住开关状态:点「启动服务」后,下次启动应用会自动恢复;点过「停止服务」则保持关闭。
  • 新增插件:百度人脸(api/baidu_face);高德地图改为按「Key 类型」分档验证。
  • 「数据升级」体系(backend/data_upgrades.py):插件数据格式的变化按「结构变化」处理——
    提升 SCHEMA_VERSION 并在 scripts/migrations/ 留一跳脚本(哪怕表结构没动);需要解密的那部分
    由本模块在导入备份与更新后解锁时一次性转换。插件与框架不再做运行时双格式兼容。
  • 代码比库新时自动补齐结构:解锁时发现磁盘库的结构版本落后于代码,自动跑一遍逐级迁移;
    导入备份前也先补齐。运行器每跳成功后才推进 schema_version——版本号永不领先于实际结构。
  • 数据库结构迁移的详细日志:状态(已最新 / 演练 / 链断档 / 被拒)、开始横幅(起止 + 跳数 + 库路径)、
    每跳(脚本名 + 快照名 + 盘点 + 耗时)、失败定位、结束总耗时。
  • 「上次更新」显示 commit 哈希,并且可关闭:测试版两版版本号常相同,靠 commit 才能区分变更;
    关掉后换页 / 重启都不再出现,直到出现新的更新结果。
  • 「检查更新」改成后台任务,结果持久化(换页 / 重启后仍在,直到被下次检查替换)。
  • 「自动检测更新」开关(默认开启):启动后与解锁后各自动查一次。
  • 私有仓库支持访问令牌(PAT):更新需访问私有 GitHub 仓库时,在设置里填一次即可。
  • 「备份」升级为全量(含 salt,可跨保险库还原);更新前的备份复用它,产物落 data/backup/。
  • 后台任务列表分页,列表区可滚动。
  • 更新改为「两段式」:应用内先「准备」(下载 / 拉源码 / 构建,带进度),再交棒「提交」
    (替换 / 迁移 / 重启,此时应用已退出)。

变更

  • 更新 / 构建不再弹控制台黑窗;交棒阶段全程写日志(去掉黑窗后不能再静默)。
  • 测试版拉源码默认丢弃本地改动;构建改用 npm ci,不再弄脏 package-lock.json。
  • MCP Token 移出数据库:改存 settings(mcp_token_hash + 前缀),鉴权改为常量时间比对;
    删掉从未启用的「Token 级工具范围」。备份不再单列该段,跨库还原后同一个 token 继续可用。
  • plugins.plugin_path 改存相对路径(相对 plugins/)——绝对路径会把程序目录钉死。
  • 百度文心 llm_wenxin 1.0.0 → 1.1.0:凭证拆成 API Key + Secret Key 两个必填字段,
    不再要求用户自己拼 API_KEY|SECRET_KEY。
  • 匿名桶 / S3 的「跳过 TLS 证书校验」统一走框架的 make_client(verify=…);删掉两个签名模块里
    没人调用的 httpx 便利入口(签名部分保持零第三方依赖)。
  • 设置页与凭据提示文案精简;界面不再把 markdown 的 **加粗** 原样显示。

修复

  • TLS 握手兼容会改写 ServerHello 的中间设备:OpenSSL 3 起默认拒绝「对端不支持 RFC 5746 安全重协商」
    的握手,于是经企业网关 / 部分代理客户端的连接一律失败(UNSAFE_LEGACY_RENEGOTIATION_DISABLED;
    同机 curl 因走 Schannel 而正常,容易误判成「目标不支持」)。现在恢复 OpenSSL 1.1 的默认行为——
    只放宽「允许连接」,不开 ALLOW_UNSAFE_LEGACY_RENEGOTIATION。
  • 更新后自动重启会把「更新代理」漏给新应用:新进程一直带着 ALL_PROXY=<更新代理>,于是
    全部插件请求都走了它,而界面上看不出任何设置。现在重启时还原更新前的代理环境变量。
  • 更新替换失败(WinError 32):交棒进程自己就运行在待替换的 exe 上,Windows 下不能覆盖——
    改为先把旧文件改名腾位(Keyrealm.old)再放新的。
  • 重启崩溃(Failed to execute script 'pyiboot01_bootstrap' / _MEI…\base_library.zip 不存在):
    脱离起的子进程会复用父进程的临时解压目录、随父进程退出失效——现在一律带
    PYINSTALLER_RESET_ENVIRONMENT=1。
  • 备份不再因 WebView 缓存被占用而失败;修 sqlite 连接未关闭导致 Windows 上删不掉快照。
  • 打包前的建表自检清单跟上删表(否则构建被挡下)。
  • 匿名桶插件打到「站点页面 / 网关页」时的提示改为指向端点与路径——原先那条断言「桶名带下划线写错了」,是错的。

数据库

  • 结构版本 1.0.0 → 1.2.1(三跳,各一跳脚本;都不需要主密码,可在更新交棒阶段完成,
    应用解锁时也会自动补齐):
    • 1.0.0 → 1.1.0:文心凭证由单字段拆成 api_key + secret_key(表结构无变化,只推进版本号)。
    • 1.1.0 → 1.2.0:删除 mcp_tokens 表(Token 搬进 settings,用户不必重新生成);
      plugins.plugin_path 由绝对路径转为相对。
    • 1.2.0 → 1.2.1:清掉两条没人读的 settings 死键(data_version、data_schema_version)。
  • 本次的 TLS 版本策略与 MCP 开关记忆无结构变动——新增的 settings 键与凭据 JSON 里的
    _tls_version 保留键都带默认值,旧库无需迁移。

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 03:45

新增

  • 「地图」类别新增腾讯地图(腾讯位置服务)插件(map_tencent)。WebService Key 验证走
    IP 定位接口(/ws/location/v1/ip,无需参数、不消耗配额型服务),并区分「Key 无效」
    (190 / 311)与「有效但受限」(配额 120/121、白名单 112、未开 WebService 199、
    签名未过 111 等)。Key 开启签名校验时,在凭据里补填 SK 即可,插件按
    md5(path + "?" + 升序参数 + SK) 自动计算 sig。
    另提供 8 个只读操作:地理编码 · 逆地址解析 · 地点搜索 · 行政区划 · 距离计算 · IP 定位 ·
    实况天气 · 预报天气。插件总数 60 → 61(地图类别 2 → 3)。

  • 程序内更新(两种渠道):「设置 → 更新」里检查并一键更新。

    • 正式版:比对 GitHub Release 的最新正式版标签,有新版就下载对应平台的预编译包替换当前程序、
      逐级迁移数据库、自动重启——不编译(源码部署据此切到二进制)。
    • 测试版:跟 main 最新提交(版本号 或 commit 任一不同即算有更新),从源码构建;本机没有源码
      会先 git init+fetch+checkout 把程序目录转成源码部署,再建/补虚拟环境、装依赖、build.py --frontend。
    • 更新代理:跟随全局默认 / 直连 / 指定「代理列表」里的某个代理(git 侧经 -c http.proxy 注入,
      压过 git 全局配置里的 http.proxy;pip/npm 走环境变量);也可用 KEYREALM_UPDATE_PROXY 临时覆盖。
    • 更新前自动备份(可执行文件 + plugins/ + data/,只留一份),完成后自动重启。
    • 版本检查 / 更新 / 数据库逐级迁移 / 重启是四个独立脚本(scripts/*.py + .sh/.bat 薄引导,
      无交互、缺环境自动建),核心实现在 backend/updater.py;应用内交棒经 main.py --self-update(打包版也适用)。
  • 数据库逐级迁移:新增 scripts/migrations/,脚本命名 m_<from>__to_<to>.py(只提供相邻两版、绝不跨级),
    运行器把链逐级串起来升、每跳留 SQLite 快照;预编译包里也带一份(.update-meta/),让没源码的机器也能迁移。

  • 预编译包自动发布:打 tag(vX.Y.Z)触发 .github/workflows/release.yml,在 windows-latest 与
    macos-latest 上并行构建,产出 Keyrealm-<版本>-<平台>.zip 并挂到该 tag 的 GitHub Release(也可手动触发)。

变更

  • 构建产物默认落在仓库根(.git 同级),scripts/build.py 新增 --output / -o 可指定落点
    (--output release 即旧行为);输出=仓库根时会跳过 plugins/ 的自我复制、并保留 Keyrealm.old 供回滚。

数据库

  • 结构版本保持 1.0.0 —— 本次无结构变动,不需要迁移脚本。