Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,18 @@

All notable changes to this project.

Unreleased
----------
v2.0.0 (2026-10-16)
-------------------

The reference-parity release, training with the 4.4.0 engine: route country rules and the unknown client identity, live dynamic rules, validated config, strict routes, the body read timeout and the agent from config (v2.0.0)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

### Breaking

- `GuardConfigError` gains the `Config` variant (the engine now runs `SecurityConfig::validate` before wiring) and the `Agent` variant (an agent built from the `agent_*` fields that fails under `agent_strict`), so an exhaustive `match` over it needs arms for both.
- Trains with the engine: the `guard-core-engine` and `guard-core-rs` floors move to 4.4.0, and the optional `guard-agent-rs` to 3.2.4. `SecurityConfig` gains public fields, so a struct literal needs `..Default::default()`; an invalid IP list entry is now reported as `Config` instead of `IpGate`.
- Behavior to know before upgrading: a route whitelist match no longer overrides a blocked country, the unknown client identity is denied on a route with an `ip_whitelist` or `whitelist_countries`, route usage rules run after the security pipeline, each dynamic rule version applies over the base config instead of stacking, a request body that does not arrive within `body_read_timeout` is answered 408, and `route_resolution_strict` answers an unresolved route with 500.


The parity release: the reference `exclude_paths`, client and response-pass semantics, and the whole `SecurityConfig` through the facade's `Wiring`.

Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ members = ["examples/simple_app", "examples/advanced_app"]

[package]
name = "rocket-guard-rs"
version = "1.5.0"
version = "2.0.0"
edition = "2024"
rust-version = "1.92"
description = "Application-layer security Fairing for Rocket, powered by the guard-core-rs engine. Part of the guard ecosystem."
Expand All @@ -21,13 +21,13 @@ name = "rocket_guard_rs"
# engine crate inside a sibling guard-core-rs checkout so local builds and CI
# (see .github/workflows/ci.yml) exercise the engine from source. The version
# pin stays in lockstep with the published engine release.
guard-core-engine = { path = "../guard-core-rs/crates/guard-core-engine", version = "4.3.2" }
guard-core-engine = { path = "../guard-core-rs/crates/guard-core-engine", version = "4.4.0" }
# The engine facade (the event bus, observability knobs, the on_block hook,
# custom error responses, and the rate-limit stage the fairing delegates to).
# Path points at the sibling guard-core-rs checkout so local builds and CI
# exercise it from source; the version pin stays in lockstep with the
# published facade release.
guard-core-rs = { path = "../guard-core-rs/crates/guard-core-rs", version = "4.3.2" }
guard-core-rs = { path = "../guard-core-rs/crates/guard-core-rs", version = "4.4.0" }
rocket = { version = "0.5.1", default-features = false }
rocket_ws = { version = "0.1.1", features = ["tokio-tungstenite"] }
serde_json = "1"
Expand All @@ -38,7 +38,7 @@ chrono = "0.4"
# depends on the guard-core-rs facade (its `guard-core` feature), never the
# reverse, so the facade cannot own this and each adapter does. The runtime
# handle the agent's async tasks run on comes from the caller's tokio runtime.
guard-agent-rs = { version = "3.2.3", optional = true, default-features = false, features = ["guard-core"] }
guard-agent-rs = { version = "3.2.4", optional = true, default-features = false, features = ["guard-core"] }
tokio = { version = "1", optional = true, default-features = false, features = ["rt"] }

[features]
Expand Down
2 changes: 1 addition & 1 deletion examples/advanced_app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description = "Production-shaped rocket-guard-rs example service."

[dependencies]
rocket = { version = "0.5.1", default-features = false, features = ["json"] }
rocket-guard-rs = { path = "../..", version = "1.5.0" }
rocket-guard-rs = { path = "../..", version = "2.0.0" }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

[lints.rust]
Expand Down
2 changes: 1 addition & 1 deletion examples/simple_app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description = "Minimal rocket-guard-rs example service."

[dependencies]
rocket = { version = "0.5.1", default-features = false, features = ["json"] }
rocket-guard-rs = { path = "../..", version = "1.5.0" }
rocket-guard-rs = { path = "../..", version = "2.0.0" }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

[lints.rust]
Expand Down
Loading