feat: add client subscription startup policy

This commit is contained in:
QiuSW
2026-07-28 15:14:48 +08:00
parent f0f34156da
commit 1c100c5d7e
15 changed files with 290 additions and 21 deletions
+23
View File
@@ -2197,3 +2197,26 @@
- 发布检查:线上 `manage.py check` 通过;`migrate --noinput` 显示 `No migrations to apply`;因历史 `staticfiles` 目录由 root 创建,先修正为 `cmhub:cmhub` 后 `collectstatic` 成功。
- 重启:`cmhub-web`、`cmhub-generate` 和 66 个 `cmhub-image-worker` 已重启并 active;Nginx、MySQL 8.4 active,systemd failed units 为 0。
- 公网验收:`https://cm.833729.com/` 返回 HTTP 200;`/api/v1/client/releases/latest?platform=windows` 返回 HTTP 200;线上 `.deploy_revision=976b55c`,T-634 代码已存在。
## 2026-07-28 完成:T-635 cmshopee 客户端启动订阅策略接口
- 实现:新增无状态 `config.client_subscription_policy`。环境变量
`CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY=off|observe|enforce` 是客户端策略的唯一
配置源,输出兼容客户端的 `subscription_check_enabled` /
`subscription_enforcement_enabled`;非 `off` 必须提供带时区的
`CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT`,非法值在 Django 启动校验和
运行时配置读取时均明确拒绝。
- 接口:公开版本检查接口在当前发布、无发布和无下载地址三条成功路径均返回
顶层 `client_policy`,并给所有响应设置 `Cache-Control: no-store`。接口仍只读
`DownloadRelease` 和环境配置,不读取用户、权益、套餐、点数或 API Key,不扣点。
- 语义:订阅状态新增 `real_entitlement_allowed`,只在真实权益为 `active` /
`grace` 时为真。既有 `allowed` 保持“当前服务端模式下最终访问结果”,因此
`open` / `shadow` 无权益账号仍可能 `allowed=true`,但不会被新客户端误判为真实会员。
- 兼容:未新增迁移或后台配置页;未改通用 / 专属生成、预扣 / 退款、充值支付、
软件订单或 `CMSHOPEE_SUBSCRIPTION_MODE` 的服务端授权。旧客户端忽略新增字段
保持原行为;新版客户端策略失败时应进入检测开启、强制关闭的观察回退。
- 验证:`py_compile`、`manage.py check`、`init.ps1` 和 `git diff --check` 均通过。
隔离 SQLite 目标回归 27 tests OK,覆盖 off / observe / enforce、无发布策略、
非法配置、`no-store`、release 字段白名单及 active / grace / required / expired
的真实权益语义。`makemigrations --check --dry-run` 为 No changes detected;
旧本地 MySQL 地址 `43.128.3.240` 拒绝连接,只产生迁移历史检查 warning,本任务无迁移。