WechatOnCloud/bridge/woc_bridge/models/db.py
Kris 15fc62d478 feat: 完成微信UI自动化新架构全量开发与集成
- 新增六层UI自动化架构:从Backend到Capabilities的完整分层实现
- 添加WeChat 4.0分辨率适配Profile与图像模板资源
- 实现幂等缓存、熔断器、重试策略、链路追踪与监控指标
- 新增头像下载安全校验、发布朋友圈路径白名单防护
- 优化密钥缓存、DB校验逻辑与初始化流程
- 补充完整错误码体系与启动清场机制
2026-07-16 01:19:47 +08:00

86 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""DB 域模型:密钥注入 / 密钥状态 / DB 初始化。"""
from __future__ import annotations
from typing import Optional
from pydantic import BaseModel, Field
# ---------------------------------------------------------------------------
# DB 解密接口POST /api/db/decrypt, GET /api/db/key/status
# ---------------------------------------------------------------------------
class DbDecryptRequest(BaseModel):
"""手动 key 注入请求。
外部系统(如 ForcePilot或管理员通过 POST /api/db/decrypt 传入 64 位
十六进制密钥bridge 验证并缓存,后续所有 DB 查询接口立即恢复可用。
"""
key: str = Field(description="64 位十六进制 SQLCipher 密钥")
salt: Optional[str] = Field(
default=None,
description="可选:该 key 对应的 DB salt32 位十六进制)。未指定时 bridge 自动读取当前 DB 的 salt",
)
class DbDecryptResponse(BaseModel):
"""key 注入结果。
- verified=true 时 key 已缓存,后续 DB 查询接口立即可用
- verified=false 时 key 不匹配,未缓存
"""
success: bool = Field(description="请求是否处理成功(不代表 key 正确)")
verified: bool = Field(default=False, description="key 是否通过验证并缓存")
key_mode: Optional[str] = Field(
default=None,
description="key 形态enc_key已派生密钥/ key_material原始密钥材料验证失败时为 None",
)
error: Optional[str] = Field(default=None, description="验证失败或特殊状态key_mismatch / file_too_small / db_not_encrypted")
class DbKeyStatusResponse(BaseModel):
"""key 缓存状态查询响应。
供调用方判断是否需要注入 key 或等待自动提取。
"""
cached: bool = Field(default=False, description="是否有缓存的 key")
source: Optional[str] = Field(
default=None,
description="key 来源env环境变量/ apiPOST 注入)/ auto_extract内存扫描/ file持久化文件",
)
verified: bool = Field(default=False, description="缓存 key 是否已通过验证")
key_prefix: Optional[str] = Field(
default=None,
description="key 前 4 + ... + 后 4 字符,用于确认是哪个 key不泄露完整 key",
)
class DbInitRequest(BaseModel):
"""DB 初始化请求(显式触发密钥提取)。"""
pid: Optional[int] = Field(default=None, description="可选:指定微信进程 PID")
db_dir: Optional[str] = Field(default=None, description="可选:指定微信数据目录,默认自动检测")
force: bool = Field(default=False, description="是否强制重新提取,忽略已有 keys 文件")
class DbInitResponse(BaseModel):
"""DB 初始化响应。"""
success: bool = Field(description="请求是否受理")
state: str = Field(description="状态started / already_done / in_progress / failed")
message: str = Field(description="阶段描述")
key_count: Optional[int] = Field(default=None, description="已提取到的 salt→key 映射数量")
class DbInitStatusResponse(BaseModel):
"""DB 初始化后台任务状态。"""
state: str = Field(description="状态idle / running / success / failed")
progress_pct: Optional[float] = Field(default=None, description="进度百分比 0-100")
message: Optional[str] = Field(default=None, description="当前阶段描述")
key_count: Optional[int] = Field(default=None, description="成功提取的密钥数")
error: Optional[str] = Field(default=None, description="失败原因")