41 Commits
Author SHA1 Message Date
Logan.Li 83a3630404 feat(settings): 运行配置中心——.env 业务参数统一到后台页面维护
CI / backend (push) Waiting to run
- 新增 app_configs 表与 appconfig 注册表:读取优先级 页面 → .env → 默认,删除即回退
- 页面可配 7 项:支付回调基址、成功回跳、Webhook 密钥(加密入库)、未验签放行开关、CORS、可信代理、GeoIP 路径
- 引导密钥(JWT_SECRET / OPSLIC_MASTER_KEY / OFFLINE_LICENSE_SEED)与部署参数只读展示掩码+指纹,永不入库
- 校验:URL 格式、密钥长度≥16、CIDR、release 下禁止开启未验签回调;变更写审计日志
- 消费点改造:支付回调地址、Waffo 回跳、webhook 验签、可信代理、CORS、GeoIP 统一走配置中心
- 前端新增「审计与设置 → 运行配置」页(分组表格 + 来源标记 + 编辑弹窗 + 恢复默认)
- .env.example 补注释:哪些必须留在 .env、哪些已收敛到页面
2026-11-01 06:17:58 +08:00
Logan.Li b0b611eee2 refactor(payment): 支付配置接入统一 secretbox 信封加密
CI / backend (push) Waiting to run
- 丢弃支付模块自带的 PAYMENT_SECRET_KEY/JWT_SECRET 派生双密钥体系,
  EncryptSecret/DecryptSecret 直接走 internal/secretbox(OPSLIC_MASTER_KEY)
- 全站只有一把主密钥:Waffo 私钥、节点 shared_key、支付 APIv3 密钥/应用私钥同格式同前缀
- 测试改由 TestMain 装载 secretbox 主密钥,密文前缀统一引用 secretbox.Prefix
- .env.example 移除 PAYMENT_SECRET_KEY,改为说明复用 OPSLIC_MASTER_KEY
2026-11-01 06:03:24 +08:00
Logan.Li 3a98ccc631 chore(gitignore): 忽略每日备份目录与 .env.bak 快照 2026-11-01 05:59:51 +08:00
Logan.Li 7d53c6ed3c feat(payment): 后台「支付配置」支持微信支付与支付宝凭据管理
后端:
- 新增 payment_configs 单行配置表;APIv3 密钥、应用私钥/公钥以 AES-256-GCM 密文入库(enc:v1 前缀,主密钥取 PAYMENT_SECRET_KEY,缺省回退 JWT_SECRET 派生)
- 证书/私钥落 PAYMENT_CERT_DIR(默认 /data/payment-certs),目录 0700 / 文件 0600,不经任何静态路由暴露
- 接口:GET/PUT /api/admin/payment/config、POST /upload(PEM 校验 + 微信证书序列号自动回填)、POST /test(真打官方接口:微信 /v3/certificates 签名校验、支付宝 alipay.trade.query 签名校验)、POST /wechat/platform-certs(APIv3 密钥解密平台证书并落盘)
- 未配置凭据时测试返回 skipped 而不是 500;敏感字段在返回体里一律脱敏

前端:
- /payments 改为「通用设置 + 微信支付 / 支付宝 / Waffo 海外支付」页签(原 Waffo 页整页迁到 views/payments/Waffo.vue)
- 微信:mchid、AppID、APIv3 密钥(密码框 + 掩码回显 + 更换/清除)、证书序列号、支付方式多选、三项证书上传、自动获取平台证书
- 支付宝:app_id、应用私钥(粘贴/上传)、支付宝公钥、网关、RSA2、回调地址
- 菜单归入「审计与设置 → 支付配置」
2026-11-01 05:59:51 +08:00
Logan.Li 630f2819cb feat(auth): 登录页改版并支持「记住密码」
- 左右分栏:左侧品牌区(产品定位 + 三条能力要点),窄屏自动收起只留表单
- 表单补字段标签、记住密码勾选与提示、登录按钮 loading 文案
- 记住密码:本机保存账号密码(XOR+Base64 混淆,非明文),下次自动填充并恢复勾选;取消勾选再登录会清除
- 清掉模板化的单卡片登录页
2026-11-01 05:59:51 +08:00
Logan.Li 1c50d565eb fix(security): webhook fail-closed、机密字段信封加密、限流信任代理修正
CI / backend (push) Waiting to run
三项 P0 安全修复:

1. Webhook 验签 fail-closed
   - WaffoWebhook 未配置验签材料时从「告警放行」改为 503 拒绝,
     封死伪造 order.completed 结算订单的路径
   - 通用 PaymentWebhook 从「仅 release 拒绝」收紧为默认拒绝,
     仅显式 ALLOW_UNVERIFIED_WEBHOOK=1(本地调试)放行

2. 机密字段信封加密(新增 internal/secretbox)
   - AES-256-GCM,主密钥 OPSLIC_MASTER_KEY(64 位 hex),密文带
     enc:v1: 前缀;Encrypt 幂等、历史明文原样放行
   - PaymentGatewayConfig.SecretKey/WebhookSecret 与 PeerNode.
     SharedKey 挂 GORM 钩子透明加解密,业务代码零改动;SharedKey
     列宽 128→512(密文更长)
   - 启动 fail-fast 校验主密钥;MigratePlaintext 幂等迁移存量明文;
     节点同步只含业务表,机密表为节点本地,互不影响
   - docker-compose/.env.example 补 OPSLIC_MASTER_KEY 与说明

3. 限流信任代理修正
   - 默认 SetTrustedProxies(nil) 不信任任何 X-Forwarded-For,
     封死伪造 XFF 轮换 IP 绕过按 IP 限流;反代节点用
     TRUSTED_PROXIES 指定内网 CIDR,非法配置拒绝启动

验证:go build/vet/test 全绿(含 secretbox 6 条单测);
读取路径(Waffo 私钥/webhook 密钥/互联密钥)确认全走 GORM 钩子。

部署注意:上线须配置 OPSLIC_MASTER_KEY(双节点一致)与
WAFFO_WEBHOOK_PUBLIC_KEY(未配则回调 503,属预期);香港反代
节点配 TRUSTED_PROXIES。
2026-11-01 02:03:26 +08:00
Logan.Li e0cef06234 refactor: 错误消息脱敏 + 后端 CI
- 新增 utils.InternalMsg:内部错误详情只进服务端日志,对外统一脱敏
  消息,不再向客户端泄露 GORM/SQL 实现细节;九个 controller 的
  err.Error() 出口全部切换
- 新增 .github/workflows/ci.yml:go build/vet/test(backend,go 1.25)
2026-11-01 02:03:26 +08:00
Logan.Li 1a47dee63d docs: 部署与环境(两套线上拓扑,不含账密)
记录 l123.91ai.io 反代与 licence.rlwj.cn 本机部署口径;
远程改为 gitea.91ai.io/rlwj-lab/opsx-licence。
2026-10-15 17:53:15 +08:00
Logan.Li 7d648a2883 docs: 接入文档页签文案精简 2026-09-14 23:23:56 +08:00
Logan.Li 722b719688 fix: 接入文档页——签名规范深底配色修复;接入模型改CSS时序图(不再字符对齐);补请求参数表/curl自测/信封格式说明 2026-09-14 23:19:46 +08:00
Logan.Li 53678b3ca9 fix: 侧边栏菜单光标保持默认箭头 2026-09-14 23:05:50 +08:00
Logan.Li 473dcd0aab feat: 产品/客户/订单批量删除;接入 GeoLite2 城市库(地理分布/激活记录/审计日志显示归属地);仪表盘趋势图美化 2026-09-14 22:48:14 +08:00
Logan.Li 252ae14aef feat: 离线License批量删除;同步循环加固(启动即跑/pending自动握手/防重入/panic恢复,移至main启动);同步时间显示到秒 2026-09-14 22:08:43 +08:00
Logan.Li 30b87dec62 fix: CORS 白名单支持 tauri://localhost——修复桌面工具设备列表 Load failed 2026-09-14 22:00:08 +08:00
Logan.Li 44387835e1 feat: 节点互联双向同步——授权/计划/客户(邮箱)按业务键LWW增量同步,HTTPS+HMAC互联密钥,默认10分钟宽松节奏 2026-09-14 21:33:00 +08:00
Logan.Li 06a9dac99b fix: 移除 SQLite 不支持的 CURRENT_TIMESTAMP 列默认值,修复迁移失败 crash loop 2026-09-14 21:12:45 +08:00
Logan.Li 0c0c56b18e docs: 管理后台密码出库,补充服务器环境说明 2026-09-14 21:08:39 +08:00
Logan.Li 059bbb833a feat: 管理后台新增接入文档页——Rust/Vue/React/CLI/后端代理接入示例 2026-09-14 21:08:39 +08:00
Logan.Li 2f0cb71fc2 feat: 管理后台认证加固——改密即失效旧令牌/账号锁定/登录审计/release随机初始密码 2026-09-14 21:08:39 +08:00
Logan.Li b76111dfc3 feat: 客户端授权防护——响应签名/激活令牌/宽限期/换座限制/在线清扫/疑似共享标记 2026-09-14 21:08:39 +08:00
Logan.Li 37d9e8ca56 fix: 测试包年商品改用 USD,避免 CNY 不被支持
Waffo 测试侧 Yearly Product 仅支持 USD;按 Product ID 自动选币种。
2026-08-13 00:13:07 +08:00
Logan.Li 2b44e8dcb3 fix: 仅保留 Waffo,并修复调试包年误用永久 Product
调试不再把兼容字段 product_id 覆盖到包年;包年禁止回落永久商品;下单强制走 Waffo。
2026-08-13 00:04:22 +08:00
Logan.Li d94da2129c fix: 支付页去掉货币列,包年/永久货币由后端自动带
Product 映射只保留计划与 PROD_xxx;包年默认 CNY、永久默认 USD,避免误填干扰。
2026-08-12 23:47:31 +08:00
Logan.Li 7c146cb639 fix: 修复支付页测试/生产 Product 映射串用与无法保存
切换环境时先暂存再切换;后端 Profile 不再串用另一侧商品;支持一键填充 OpsXshell 与跨环境复制,调试使用当前页映射。
2026-08-12 23:35:27 +08:00
Logan.LiandCursor 9b79eabd34 fix: 修复收入统计 404,并隔离支付测试/生产配置
Dashboard 收入接口路径对齐;登录页去掉「授权管理平台」;Waffo 测试/生产密钥与 Product 映射分环境保存。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 22:37:22 +08:00
Logan.LiandCursor 76bba729f1 chore: 清理设置页多余文案并移除未使用的 License 模板
支付已迁至独立菜单;模板未接入发证流程,前后端入口一并下线。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 22:01:02 +08:00
Logan.LiandCursor 4c46088f4f feat: 客户关联产品并支持按产品圈选通知群体
新增客户-产品多对多关联,列表可按产品筛选并复制邮箱;发证/下单自动回填历史关联。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 21:58:35 +08:00
Logan.LiandCursor d0e1ca3729 feat: License 支持筛选多选批量删除
仅已吊销或已过期可删,有效授权自动跳过;单条删除同步限制。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 21:53:34 +08:00
Logan.LiandCursor f26e787cfc fix: 离线证到期重签空邮箱撞唯一索引
复用 customer_id/同名客户,禁止重复插入空 email;重签前端带回原客户。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 21:49:55 +08:00
Logan.LiandCursor bac72e6945 fix: 按评审报告止血支付漏洞并加固授权链路
废除浏览器回跳自助结算,通用 webhook 强制密钥鉴权,Waffo 支持验签与未知事件忽略;重构订单状态机/激活占座/SQLite WAL,并补备份、readyz、限流与前端导出/登录页安全修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 21:26:58 +08:00
Logan.LiandCursor 8cc2c83f9d feat: 通用授权后台、离线证、Waffo 支付页与仪表盘加强
支持多产品计划展示、LICOFF 离线签发、支付独立配置与调试,以及分析看板;同步更新 README 与集成文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 20:25:46 +08:00
Logan.LiandCursor 0966375076 feat: 支付成功页与友好 webhook 落地页
浏览器回跳展示许可证并深链回 App;补齐包年订单因未收到 Waffo POST 未发码的体验。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 16:39:13 +08:00
Logan.LiandCursor 554998f4b7 fix: 永久授权结账币种改为 CNY
与 pancake 永久商品 onetime+CNY 链接对齐,包年/永久均为 CNY。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 16:19:33 +08:00
Logan.LiandCursor e8d98c993f fix: 包年 CNY / 永久 USD 分币种结账
按档位分别拼 Waffo currency,避免永久商品用 CNY 报不可用。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 16:18:05 +08:00
Logan.LiandCursor d4c5637168 fix: 包年改为 Waffo 一次性商品并切 CNY
包年 SKU 换为 PROD_1BIezCi932IbgCzRIV8hcJ,checkout type 统一 onetime。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 16:04:36 +08:00
Logan.LiandCursor a47af22e91 chore: Waffo 网关默认币种改为 USD
与 pancake 商品链接 currency=USD 对齐。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 15:58:00 +08:00
Logan.LiandCursor f00ea7e873 fix: Waffo webhook 支持 GET 探测,避免浏览器打开 404
仪表盘/浏览器用 GET 校验 URL 时返回 ready;支付事件仍走 POST。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 15:57:37 +08:00
Logan.LiandCursor ac31cc059a fix: 过滤非法 CORS Origin,避免 Docker 启动 panic
gin-contrib/cors 不接受 tauri://,启动时过滤仅保留 http/https。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 12:09:06 +08:00
Logan.LiandCursor cb1a9be2c4 chore: 增加 Docker 单容器部署
生产用 Dockerfile + compose 嵌入前端二进制,run.sh docker 一键构建启动。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 12:02:29 +08:00
Logan.LiandCursor 95405de119 feat: 对齐 Waffo 包年/永久结账与客户端席位 API
同步 OpsXShell 档位定价与 Waffo 商品映射,补齐 checkout/webhook/设备列表契约,便于桌面端购买与满席释放。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 11:42:56 +08:00
Logan.Li 4ae318335c feat: 完成 opsx-licence 许可证管理平台全栈实现
基于 opsx-web-lite 框架(Go+Gin+Vue3+Element Plus)构建许可证管理服务器,
业务域参考 Licence 服务器 Web 版。

【后端 - 4层架构】
- 认证:单 Admin 表 + JWT(HS256)
- 核心授权域:Product / Customer / License / Activation
  · License 生成/验证/激活/机器绑定/心跳/续期/吊销
  · 客户端契约接口:/api/v1/license/{verify,activate,deactivate,heartbeat}
- 定价订单:Plan / Order / 支付网关配置
- 防重复购买:CustomerEntitlement + 幂等支付 webhook + 手动发放
- 分析审计:Dashboard 统计 / Analytics / AuditLog / Setting 管理

【前端】
- Dashboard(ECharts 图表)、产品、客户、License、计划、订单、权益、日志、设置
- 9 个完整 CRUD 业务页面 + 登录/布局

【部署】
- SQLite + 单二进制(//go:embed 嵌入前端)
- 开发:./run.sh start(前端5181/后端9001)
- 生产:./run.sh build && ./run.sh binary start
- 默认账号:admin/admin

Author: Logan.Li
2026-08-07 15:02:00 +08:00