Skip to content

Releases: erikwang2013/poster-rust

v2.0.1

Choose a tag to compare

@erikwang2013 erikwang2013 released this 11 Oct 16:01

v2.0.1

修复

  • 未启用任何框架 feature 时,Guard 内部的 trust_forwarded_for getter 触发 dead_code 构建告警(v2.0.0 引入)——该组合下没有调用方,加 allow(dead_code) 并注明原因;同时保住字段的「被读取」事实,避免字段级告警。

(纯修复版本,无 API 变更;建议所有 2.0.0 用户升级以消除默认特性构建告警。)

v2.0.0

Choose a tag to compare

@erikwang2013 erikwang2013 released this 11 Oct 15:07

v2.0.0

深度安全审计修复批次 + 全文档去 PHP 化。含破坏性 API 变更(严格 semver 主版本,详见 CHANGELOG)。

安全

  • 限流记录与验证码载荷彻底隔离(key 形态强校验 + captcha: 命名空间)——修复跨 key 限流绕过。
  • 限流身份哈希改用进程级随机种子,不再可离线复算。
  • X-Forwarded-For 默认不再采信(只信对端 IP);代理部署显式开启 Guard::with_trust_forwarded_for(true)。
  • warp / poem 的 verify 请求体补 2 MiB 上限。

修复

  • 限流原子化(窗口并入计数键 + Storage::increment_or_init);验证码一次性消费改原子抢删。
  • 存储回收与预算封顶(Memory 64 MiB / File 65536 文件)。
  • 旋转文本画布像素预算、艺术字描边上限、元素几何护栏(超大模板参数返回错误而非 OOM/panic)。
  • Redis 存储读写超时 + 惰性重连;FileStorage::set 持锁。
  • warp / rocket 端点契约修正;bee-rust 补 verify 路由;换行支持假名/谚文;snake_case 模板键生效。
  • 修复 3 个 doctest(全特性 CI 恢复);8 框架阻塞调用移入阻塞池。

性能

  • 字体与整行渲染缓存改为进程级(跨请求复用)。

变更(破坏性)

  • 公共枚举 #[non_exhaustive];Storage::delete 返回 Result<bool>;bee_rust::router 签名变更。
  • PosterConfig::validate():set_global 拒绝非法配置。

文档

  • 全文档去 PHP 化(注释 / 测试名 / README / 架构图);README 数字实测修正。
  • CI:9 个单 feature 编译矩阵;rustfmt 全仓落地并转正门禁。

v1.1.2

Choose a tag to compare

@erikwang2013 erikwang2013 released this 07 Oct 17:08

文档更新(无代码/API 变化)。

文档

  • README(中 / 英)移除「与 PHP 版的差异 / Differences from poster-php」章节。
  • 项目宠物下方新增语言标签:Rust 1.85+ · edition 2024(项目语言)+ 文档语言互链
    (文档语言:中文 / docs: English,均为 shields.io 徽章,三个链接已验证返回 200)。

说明

本版仅有文档改动(README 随包分发,故按补丁号发布);公开 API、运行时行为与依赖均与 v1.1.1 一致。

MIT License · Copyright © 2026 erik erik@erik.xyz · https://erik.xyz

v1.1.1

Choose a tag to compare

@erikwang2013 erikwang2013 released this 07 Oct 14:46

rocket / poem / salvo 的 POST {path}/verify 端点补上运行时 e2e(v1.1.0 时这三个框架只有编译验证)。

测试

  • 新三套端到端用例(各框架自带测试客户端,与 warp 那套同构):
    • tests/integrations_rocket.rs(rocket::local::blocking::Client)— 5 用例:XFF 分桶限流、
      对端地址分桶(.remote(addr) 伪造)、缺 XFF 走 "unknown" 兜底桶、错误答案、非法 JSON 400
    • tests/integrations_poem.rs(poem::test::TestClient)— 4 用例:Route::data 提取器、
      取参顺序、非 TCP RemoteAddr 回退、非法 JSON 400
    • tests/integrations_salvo.rs(salvo::test::TestClient)— 5 用例:parse_json 失败 →
      400 渲染路径、remote_addr None 回退、GET /captcha/new 路由平铺回归(钉住 1.1.0 修复的拼接 bug)
  • Cargo.toml 仅 dev-dependencies 变动(poem/salvo 补 test 特性,均关默认特性);公开 API 与运行时行为无变化,故按补丁号发布。

覆盖边界(诚实标注)

  • poem / salvo 的测试客户端无法设置对端地址,「XFF 缺失 → 对端 IP」分支只有 rocket 跑到端到端;
  • Guard 未托管 / verify_as 出错(401/500)在测试环境无法触发,未覆盖。

质量

8 个框架的 verify 端点现全部有运行时覆盖:axum 2 · warp 3 · rocket 5 · poem 4 · salvo 5(19 个 e2e 用例);
默认 160 用例全绿;cargo clippy --features rocket,poem,salvo,warp --all-targets -- -D warnings 零告警。

MIT License · Copyright © 2026 erik erik@erik.xyz · https://erik.xyz

v1.1.0

Choose a tag to compare

@erikwang2013 erikwang2013 released this 07 Oct 13:58

8 个框架端点齐平(补 verify)+ 两处路由修复。

新增

  • rocket / poem / salvo / warp 补上 POST {path}/verify(此前只有 axum / actix / bee-rust / e-cat 有):
    请求体 {"key","answer"} → {"pass": bool},限流身份按请求派生(X-Forwarded-For 第一段 → 对端 IP → "unknown"),
    与其余框架逐字段一致。现在 8 个集成统一提供三条路由:GET {path}/new、GET {path}/{key}、POST {path}/verify。
  • 新增 tests/integrations_warp.rs(warp::test):XFF 分桶限流、错误答案、非法 JSON 400。

修复(v1.0.x 存在)

  • salvo 路由表:{prefix}/new 原先嵌在 {prefix}/{key} 之下,salvo 按相对段拼接后实际路径成了
    /{prefix}/{key}/{prefix}/new —— GET /captcha/new 一直 404。改为平级兄弟路由,参数段放最后。
  • warp 出图路由未限方法:任意方法都会被 path::param 吃掉;补 warp::get(),否则
    POST /captcha/verify 的非法 JSON 会「回退」到出图路由变成 404 而不是 400。
  • clippy --all-targets 清零(examples / tests / benches 共 5 处 lint),CI 的 clippy 同步升级为 --all-targets;
    src/lib.rs 文档链接 [Guard::verify] → [Guard::verify_as]。

质量

  • 160 个测试用例全绿;warp 端到端 3/3;axum 端到端 2/2
  • 逐 feature 编译:axum / actix / rocket / poem / salvo / warp / bee-rust / ecat 单个开启均 0 错误
  • cargo clippy --all-features --all-targets -- -D warnings 零告警

MIT License · Copyright © 2026 erik erik@erik.xyz · https://erik.xyz

v1.0.1

Choose a tag to compare

@erikwang2013 erikwang2013 released this 07 Oct 12:42

性能优化 + 两处 v1.0.0 编译缺陷修复。

修复

  • 只开单个框架 feature 时无法编译(v1.0.0 缺陷):axum 缺 json/query/tokio/http1 特性、poem 缺 server 特性。此前只有 --all-features 通过,是因为 bee-rust(bee_router)间接打开了 axum 的这些特性,掩盖了缺口。现在 8 个 feature 逐个单独验证全绿:axum / actix / rocket / poem / salvo / warp / bee-rust / ecat(+ redis)。
  • 集成层限流身份:校验端点此前把所有请求计入同一个常量桶,用户量一大互相误杀。现按请求派生(X-Forwarded-For 第一段 → 对端 IP → "unknown"),新增 Guard::verify_as,README 补代理场景安全提示。

性能(输出逐字节一致)

  • 海报渲染结果缓存(对齐 PHP $rendered 语义):重复 render() / save() / output() 只渲染一次,元素/背景/尺寸变更即失效。示例多次输出合并为 1 次渲染。
  • 文字整行渲染缓存:重复绘制(水印、描边艺术字)2.3×,旋转重复场景 10-20×。
  • 画布原语快路径:整数 alpha 判定 + 行切片;顺带消除两处 expect() panic 分支。

工程化

  • benches/perf.rs 基准套件(PERF_ASSERT=1 时断言预算)
  • GitHub Actions CI(rustfmt / clippy -D warnings / 三平台测试 / ubuntu 全特性)
  • README 徽章、docs.rs all-features 元数据、CHANGELOG

质量

  • 160 个测试用例全绿;axum 端到端集成 2/2;cargo clippy --all-features -- -D warnings 零告警
  • 基准(release):滑块 11.5ms · 点击 9.7ms · 全元素海报 51.9ms · 100 次文字 32.5ms

MIT License · Copyright © 2026 erik erik@erik.xyz · https://erik.xyz

v1.0.0

Choose a tag to compare

@erikwang2013 erikwang2013 released this 07 Oct 03:40

poster-rust 首个正式版本 —— poster-php 的 Rust 移植。

核心能力

  • 验证码:点击(文字 / 11 种程序化图标目标)· 旋转 · 滑块(矩形 / 凹凸拼图)· 随机切换;
    一次性 key、默认 3 次尝试、TTL 300 秒、跨 key 窗口限流、可选行为轨迹校验
  • 海报生成:链式 Builder + 14 种元素(文字/图片/头像/二维码/形状/分割线/水印/表格/图表/日历/艺术字/Emoji/图标/颜文字)
    • JSON 模板({{变量}} 替换,导出往返一致)
  • 集成:原生 Guard 请求守卫 + 8 个框架适配(axum / actix-web / rocket / poem / salvo / warp / bee-rust / e-cat,feature 门控)
  • 存储:Memory / File(原子写)/ Redis(feature)
  • 纯 Rust:无 GD / ImageMagick 等系统库依赖;项目宠物 Posty 随包分发,可画进海报或作缺图占位

安装

cargo add poster-rust

质量

  • 147 个测试用例全绿;cargo clippy --all-features -- -D warnings 零告警
  • 文字渲染与 PHP 版对拍一致(size=48 墨迹高 65px、基线位置一致)
  • 中英双语文档:README、架构设计 / 功能设计 / 请求周期 / 生命周期 SVG 图

MIT License · Copyright © 2026 erik erik@erik.xyz · https://erik.xyz