Files
chongming-gateway/pyproject.toml
T
chakcy 93fed12d14 feat: 集成 chongming-license 机器码授权门禁(打包可选、授权版不可关)
三处收口,未授权插件不加载、不暴露端点、不可管理:
- core/licensing:授权管理器单例 + 构建期烘焙决策(chongming/_build_flags.py,
  随代码编译、部署侧不可改);开发/测试默认放行,CHONGMING_LICENSE_MODE 可临时开
- lifespan_setup:_scan_plugins(盘扫)与 _discover_plugins(授权收口)分离,
  未授权插件连同 TOML 路由/MQTT 主题/副本数一起从启动流程消失(契约校验因此
  不会硬失败),启动打印授权横幅
- route_registry.set_denied_types:未授权类型经 Zenoh 推来的描述符一律忽略
  (否则把 load_mode 改成 external 即可绕过)
- worker_admin:扩缩容/重启/读改配置对未授权插件一律 403,实例盘点附 licensed 标注
- routes/licensing:/license/{info,reload,file}(仅超管),导入先验签后原子落盘,
  坏文件不覆盖现有授权;导入不即时加载插件,如实告知需重启

打包可选:不加 --license 出"非授权版"(不校验、插件照常加载);授权版强制校验
且公钥随代码内置(现场换 config.toml 公钥自签也无效)。未烘焙的旧打包产物沿用
"打包即强制"的旧语义;烘焙标记只在产物内生效,不影响源码运行。

补依赖 greenlet(chongming-auth→database 的 sqlalchemy asyncio import 期即要求)
与 python-multipart(上传端点注册路由即要求);新增 test/test_license_gate.py
(52 项:门禁/契约存活/描述符拦截/管理接口/上传安全/烘焙三态,自造夹具直接运行)。
2026-10-14 10:57:09 +08:00

56 lines
1.3 KiB
TOML

[build-system]
build-backend = "hatchling.build"
requires = ["hatchling"]
[project]
name = "chongming-gateway"
version = "0.1.1"
description = "chongming 网关:FastAPI + Zenoh 的配置驱动微服务网关(插件路由动态挂载、Worker 服务发现与负载均衡)"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
# chongming 家族工具包
"chongming-auth",
"chongming-cache",
"chongming-config",
"chongming-jwt",
"chongming-worker",
"chongming-license",
# Web / 服务器
"fastapi",
"granian[reload,uvloop]",
"gunicorn",
"httptools",
"starlette",
"uvicorn",
"uvloop",
# 运行时
"amqtt",
"eclipse-zenoh",
# chongming-auth → chongming-database 的 sqlalchemy[asyncio] 在 import 期即要求
"greenlet",
"orjson",
"pwdlib",
"pydantic",
# /license/file 上传端点(File/UploadFile)在注册路由时即要求
"python-multipart",
"sqlite-vfs",
]
[project.scripts]
gunicorn = "chongming:gunicorn_serve"
granian = "chongming:granian_serve"
serve = "chongming:serve"
[tool.hatch.build.targets.wheel]
packages = ["src/chongming"]
[[tool.uv.index]]
url = "http://124.71.68.6:3000/api/packages/chongming/pypi/simple/"
[[tool.uv.index]]
url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
[dependency-groups]
dev = ["twine>=7.0.0"]