3.1 KiB
RustProxy 0.25.3 release audit
RustProxy 0.25.3 adds request-method policy, location-scoped access controls, end-to-end request correlation and retained manual-configuration history. SQLite moves from schema 7 to schema 8 through an additive migration.
Access policy
| Requirement | Status | Evidence |
|---|---|---|
| Allow/block HTTP methods per vhost | IMPLEMENTED | Vhost.method_policy validates normalized HTTP methods; the request path returns 405 before origin work when the host policy denies a method. |
| Allow/block HTTP methods per Custom location | IMPLEMENTED | PathRoute.method_policy is compiled and enforced after route selection and before authentication/upstream selection. |
| Reuse ACL profiles per Custom location | IMPLEMENTED | Locations accept acl_profile_id; profile IP and country policies are resolved during configuration compilation. |
| Add inline location IP/country policy | IMPLEMENTED | Location inline CIDR ACL and country allow/block policy compose with vhost/profile policy and fail before origin work. |
| Preserve additive security semantics | IMPLEMENTED | A location cannot weaken a denial made by vhost/profile policy; all applicable policies must allow the request. |
Request correlation
Each accepted exchange receives a fresh 64-hex-character SHA-256 request identifier derived from an internal sequence plus cryptographic OS randomness. RustProxy overwrites the protected X-Request-ID request header with that value before origin forwarding. The same value is available to diagnostic response headers when enabled and to access logging as request_id.
Manual configuration history
SQLite schema 8 adds configuration_history. On upgrade, the current configuration is seeded if no history row exists. Each successful CAS configuration replacement records revision, timestamp, actor and document in the same transaction and trims retained history to the newest 512 rows.
The authenticated GET /api/config/history endpoint returns retained revision metadata or a selected revision with its previous retained document. The Manual config dashboard provides a revision-history dialog grouped by month/day; selecting a revision renders actor/time metadata and bounded path-level before/after changes. The endpoint uses the existing administrator session guard.
Compatibility and release gates
Missing new policy fields deserialize to disabled/default behavior. Existing schema-7 databases upgrade automatically. Old binaries may reject a configuration saved with new fields, so rollback should restore both the old source and the pre-upgrade data backup.
Rust-independent source, documentation, language, UI and release-smoke checks are part of the release tree. A follow-up compiler run outside this packaging workspace found and prompted correction of the history-capacity module visibility plus a dead location GeoIP assignment; the corrected source uses history::CONFIG_HISTORY_CAPACITY with parent-module visibility and no redundant assignment. Compiler-enabled cargo fmt --all, cargo check --locked --all-targets and cargo test --locked --all-targets remain mandatory on a release host with Rust installed.