Skip to content

Commit b11ca68

Browse files
committed
chore(release): 0.4.4
Prune unused WASM and relay dependencies while preserving WAF behavior. Harden supply-chain, CI, security policy, packaging, and release metadata for v0.4.4.
1 parent d8a512b commit b11ca68

31 files changed

Lines changed: 195 additions & 149 deletions

.github/workflows/bench.yml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ name: bench
22
on:
33
pull_request:
44
paths:
5+
- 'Cargo.toml'
6+
- 'Cargo.lock'
7+
- 'rust-toolchain.toml'
58
- 'crates/purple-wolf-core/**'
69
- '.github/workflows/bench.yml'
710

@@ -15,13 +18,20 @@ jobs:
1518
- uses: Swatinem/rust-cache@v2
1619
- name: Establish baseline from main
1720
run: |
21+
set -euo pipefail
1822
git fetch origin main
19-
git checkout origin/main -- crates/purple-wolf-core
20-
cargo bench -p purple-wolf-core --bench pipeline -- --save-baseline main
21-
git checkout HEAD -- crates/purple-wolf-core
23+
baseline_dir="$RUNNER_TEMP/purple-wolf-main"
24+
git worktree add --detach "$baseline_dir" origin/main
25+
trap 'git worktree remove --force "$baseline_dir"' EXIT
26+
(
27+
cd "$baseline_dir"
28+
CARGO_TARGET_DIR="$GITHUB_WORKSPACE/target" \
29+
cargo bench --locked -p purple-wolf-core --bench pipeline -- \
30+
--save-baseline main
31+
)
2232
- name: Compare PR against baseline (fail >10% regression)
2333
run: |
24-
cargo bench -p purple-wolf-core --bench pipeline -- --baseline main \
34+
cargo bench --locked -p purple-wolf-core --bench pipeline -- --baseline main \
2535
--noise-threshold 0.10 --significance-level 0.05 2>&1 | tee bench.txt
2636
# criterion exits 0 even on regression; parse the report and gate.
2737
if grep -E 'Performance has regressed' bench.txt; then

.github/workflows/ci.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ jobs:
3939
with: { components: "rustfmt,clippy" }
4040
- run: cargo fmt --all --check
4141
- run: cargo clippy --workspace --all-targets -- -D warnings
42+
- name: Test core without optional TOML support
43+
run: cargo test -p purple-wolf-core --lib --no-default-features
44+
- name: Document core without optional TOML support
45+
env:
46+
RUSTDOCFLAGS: "-D warnings"
47+
run: cargo doc -p purple-wolf-core --no-default-features --no-deps
4248

4349
supply-chain:
4450
runs-on: ubuntu-latest
@@ -60,7 +66,7 @@ jobs:
6066
- name: Install wasi-sdk
6167
run: |
6268
curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-22/wasi-sdk-22.0-linux.tar.gz | tar xz -C /opt
63-
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> $GITHUB_ENV
69+
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> "$GITHUB_ENV"
6470
- uses: Swatinem/rust-cache@v2
6571
- run: cargo build -p purple-wolf-traefik --target wasm32-wasip1 --release
6672
- run: ls -lh target/wasm32-wasip1/release/purple_wolf_traefik.wasm
@@ -127,7 +133,7 @@ jobs:
127133
- name: Install wasi-sdk
128134
run: |
129135
curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-22/wasi-sdk-22.0-linux.tar.gz | tar xz -C /opt
130-
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> $GITHUB_ENV
136+
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> "$GITHUB_ENV"
131137
- uses: Swatinem/rust-cache@v2
132138
- name: Build release WASM
133139
run: cargo build -p purple-wolf-traefik --target wasm32-wasip1 --release
@@ -157,7 +163,7 @@ jobs:
157163
- name: Install wasi-sdk
158164
run: |
159165
curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-22/wasi-sdk-22.0-linux.tar.gz | tar xz -C /opt
160-
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> $GITHUB_ENV
166+
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> "$GITHUB_ENV"
161167
- uses: Swatinem/rust-cache@v2
162168
- name: Build release WASM + debug relay
163169
run: |

.github/workflows/publish-image-aliases.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
workflow_dispatch:
55
inputs:
66
release_tag:
7-
description: Existing release tag to alias, for example v0.4.3
7+
description: Existing release tag to alias, for example v0.4.4
88
required: true
99
type: string
1010

.github/workflows/publish-images.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ jobs:
3333
- name: Install wasi-sdk
3434
run: |
3535
curl -sSL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-22/wasi-sdk-22.0-linux.tar.gz | tar xz -C /opt
36-
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> $GITHUB_ENV
36+
echo "WASI_SDK_PATH=/opt/wasi-sdk-22.0" >> "$GITHUB_ENV"
3737
- uses: Swatinem/rust-cache@v2
3838
- name: Build release wasm
39-
run: cargo build -p purple-wolf-traefik --target wasm32-wasip1 --release
39+
run: cargo build --locked -p purple-wolf-traefik --target wasm32-wasip1 --release
4040
- name: Stage wasm next to its Dockerfile
4141
run: cp target/wasm32-wasip1/release/purple_wolf_traefik.wasm crates/purple-wolf-traefik/purple_wolf_traefik.wasm
4242
- uses: docker/login-action@v3

.github/workflows/release.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ jobs:
5656
- name: Build release WASM and relay
5757
run: |
5858
set -euo pipefail
59-
cargo build -p purple-wolf-traefik --target wasm32-wasip1 --release
60-
cargo build --release -p purple-wolf-relay
59+
cargo build --locked -p purple-wolf-traefik --target wasm32-wasip1 --release
60+
cargo build --locked --release -p purple-wolf-relay
6161
mkdir -p dist
6262
cp target/wasm32-wasip1/release/purple_wolf_traefik.wasm dist/purple_wolf_traefik.wasm
6363
cp target/release/purple-wolf-relay dist/purple-wolf-relay-linux-amd64
@@ -196,7 +196,7 @@ jobs:
196196
TARGET: ${{ matrix.target }}
197197
run: |
198198
set -euo pipefail
199-
cargo build --release -p purple-wolf-relay --target "$TARGET"
199+
cargo build --locked --release -p purple-wolf-relay --target "$TARGET"
200200
mkdir -p dist
201201
out="purple-wolf-relay-${TARGET}"
202202
cp "target/${TARGET}/release/purple-wolf-relay" "dist/${out}"

CHANGELOG.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
66

77
## [Unreleased]
88

9+
## [0.4.4] - 2026-07-10
10+
11+
### Security
12+
13+
- Update `quinn-proto` to 0.11.15 in the workspace and fuzz lockfiles,
14+
resolving `RUSTSEC-2026-0185`, and synchronize the fuzz lockfile with the
15+
existing `anyhow` 1.0.103 fix. Replace the placeholder vulnerability-reporting
16+
address with Guara Cloud's published contact, retain private GitHub Security
17+
Advisories as the preferred channel, and correct the supported release line
18+
and signed WASM artifact name.
19+
20+
### Performance
21+
22+
- Make TOML parsing a default-on `purple-wolf-core` feature and disable it for
23+
the JSON-only Traefik guest, removing the TOML parser stack from WASM builds.
24+
Default users retain `Config::parse`; embedders that disable default features
25+
must enable `toml-config` when they need that method.
26+
- Avoid a heap allocation while deriving SQLi suffix probes from ordinary
27+
browser User-Agent values, preserving the existing candidate order and
28+
deduplication behavior.
29+
- Remove the relay's unused dependency on `purple-wolf-core` and compile only
30+
the Tokio/Hyper features its HTTP/1 admin server and subscriber client use.
31+
32+
### Reliability
33+
34+
- Test and document the core crate with optional TOML support disabled in CI.
35+
Build benchmark baselines from an isolated `origin/main` worktree, include
36+
root manifest, lockfile, and toolchain changes in benchmark triggers, and use
37+
locked graphs. Require the committed lockfile in release, dev-image, and
38+
production relay-container builds.
39+
- Add crates.io keywords/categories for publishable packages and remove an
40+
unmatched license allowance from `cargo-deny` configuration. Complete the
41+
Helm chart metadata, make workflow environment-file writes shell-safe, and
42+
validate the workflow set with `actionlint`.
43+
944
## [0.4.3] - 2026-07-10
1045

1146
### Security

Cargo.lock

Lines changed: 5 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ members = [
88
exclude = ["fuzz", "tests/relay_integration", "tests/traefik_integration"]
99

1010
[workspace.package]
11-
version = "0.4.3"
11+
version = "0.4.4"
1212
edition = "2021"
1313
# v0.3 bumps MSRV from 1.75 to 1.88. The relay's dep tree pulls in
1414
# icu_* / idna (via reqwest's URL stack) which require 1.86, and
@@ -20,6 +20,8 @@ license = "MIT OR Apache-2.0"
2020
repository = "https://github.com/guaracloud/purple-wolf"
2121
homepage = "https://github.com/guaracloud/purple-wolf"
2222
readme = "README.md"
23+
keywords = ["waf", "security", "traefik", "webassembly", "observability"]
24+
categories = ["web-programming", "network-programming"]
2325

2426
[workspace.dependencies]
2527
serde = { version = "1", features = ["derive"] }
@@ -29,7 +31,7 @@ percent-encoding = "2"
2931
# Workspace-level path+version pin for the core crate. Member
3032
# manifests reference this via `purple-wolf-core.workspace = true`,
3133
# so a `cargo release` bump propagates atomically.
32-
purple-wolf-core = { path = "crates/purple-wolf-core", version = "0.4.3" }
34+
purple-wolf-core = { path = "crates/purple-wolf-core", version = "0.4.4", default-features = false }
3335

3436
# Size-optimised release for the WASM plugin artifact.
3537
[profile.release]

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33
A fast, low-memory Web Application Firewall delivered as a Traefik plugin.
44

5-
**Status:** v0.4.3 released. The current release includes audit labels,
5+
**Status:** v0.4.4 released. The current release includes audit labels,
66
webhook relay delivery, signed artifacts, SBOMs, Helm OCI packaging,
77
Kustomize overlays, an O(1) reputation limiter, bounded
88
percent-decode-to-fixpoint normalization, an expanded signature pack,
99
User-Agent SQLi suffix probing, over-cap body-prefix inspection, an offline
1010
config validator, relay SSRF hardening, optional relay admin auth, and new
11-
fuzz targets. v0.4.3 selectively optimizes the WAF engine and matcher, removes
12-
common http-wasm and relay-parser allocations, clamps impossible body limits,
13-
pins active Traefik deployments, and hardens cross-platform integration tests. See
11+
fuzz targets. v0.4.4 keeps WAF behavior compatible while removing the TOML
12+
parser from the JSON-only guest, pruning unused core and HTTP/2 code from the
13+
relay, eliminating a User-Agent suffix-probe allocation, and tightening CI,
14+
supply-chain, crate metadata, and vulnerability-reporting quality. See
1415
[CHANGELOG.md](CHANGELOG.md) for the full list,
1516
[THREAT_MODEL.md](THREAT_MODEL.md) for what the WAF is and is not designed
1617
to catch, and [docs/configuration.md](docs/configuration.md) for the
@@ -76,7 +77,7 @@ Install the OCI Helm chart in monitor mode:
7677

7778
```bash
7879
helm install purple-wolf oci://ghcr.io/guaracloud/charts/purple-wolf \
79-
--version 0.4.3 \
80+
--version 0.4.4 \
8081
-f charts/purple-wolf/values.monitor.yaml
8182
```
8283

@@ -96,7 +97,7 @@ Before production use, verify checksums, Cosign signatures, SBOMs, image
9697
digests, and the release manifest:
9798

9899
```bash
99-
gh release download v0.4.3 --repo guaracloud/purple-wolf --dir purple-wolf-release
100+
gh release download v0.4.4 --repo guaracloud/purple-wolf --dir purple-wolf-release
100101
```
101102

102103
Follow [`docs/release-verification.md`](docs/release-verification.md) and deploy

SECURITY.md

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,30 @@
55
Only the latest released `v0.x` line receives security updates during
66
the v0.x stream. Older patch versions are not backported.
77

8-
| Version | Supported |
9-
| ------- | ------------------ |
10-
| 0.2.x | :white_check_mark: |
11-
| 0.1.x | :x: (pre-release; superseded) |
8+
| Version | Supported |
9+
| ------- | --------- |
10+
| Latest 0.4.x patch | :white_check_mark: |
11+
| 0.3.x and earlier | :x: (superseded) |
1212

1313
## Reporting a vulnerability
1414

1515
**Please do not file a public GitHub issue for a vulnerability.**
1616
Public issues are indexed by scanners and visible to attackers before
1717
maintainers can ship a fix.
1818

19-
Use one of the following private channels instead:
19+
Use one of these private channels:
2020

2121
1. **GitHub Security Advisories (preferred):**
2222
<https://github.com/guaracloud/purple-wolf/security/advisories/new>
23-
This opens a private draft that only repo admins can see; it has
24-
a built-in CVE-request workflow once a fix is ready.
23+
This opens a private draft visible only to repository administrators and
24+
supports coordinated disclosure and CVE requests.
25+
2. **Email:** **`contact@guaracloud.com`**, with a subject beginning
26+
`[purple-wolf security]`. This is the contact address published on the
27+
[Guara Cloud GitHub organization](https://github.com/guaracloud).
2528

26-
2. **Email:** `security@guaracloud.example`
27-
PGP fingerprint: *(to be published before v0.2.0 stable release;
28-
until then prefer the GitHub Security Advisory path)*.
29+
The project does not currently publish a PGP key. If an email report contains
30+
sensitive production data, send a high-level description first and ask the
31+
maintainers to arrange an encrypted exchange.
2932

3033
Please include:
3134
- Affected version (`cargo pkgid purple-wolf-core` or the GitHub
@@ -44,9 +47,9 @@ Please include:
4447
acknowledgement, as recommended by Google Project Zero. Critical
4548
vulnerabilities with active exploitation get an expedited path.
4649

47-
If you don't hear back within those windows, please ping
48-
`security@guaracloud.example` again - the most likely cause is that
49-
the report was lost in transit, not ignored.
50+
If you don't hear back within those windows, follow up through the same private
51+
channel. Please do not switch to a public issue while the report is under
52+
embargo.
5053

5154
## Scope
5255

@@ -95,16 +98,16 @@ fix ships, but no later than 90 days from acknowledgement".
9598

9699
## Cosign signature verification
97100

98-
Every `purple-wolf.wasm` release artifact attached to a GitHub Release
101+
Every `purple_wolf_traefik.wasm` release artifact attached to a GitHub Release
99102
is cosign-keyless-signed. To verify before deployment:
100103

101104
```bash
102105
cosign verify-blob \
103-
--signature purple-wolf.wasm.sig \
104-
--certificate purple-wolf.wasm.pem \
106+
--signature purple_wolf_traefik.wasm.sig \
107+
--certificate purple_wolf_traefik.wasm.pem \
105108
--certificate-identity-regexp '^https://github\.com/guaracloud/purple-wolf/' \
106109
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
107-
purple-wolf.wasm
110+
purple_wolf_traefik.wasm
108111
```
109112

110113
The release workflow also runs `cosign verify-blob` against its own

0 commit comments

Comments
 (0)