diff --git a/.mike.yml b/.mike.yml index 9557b23..2b986a4 100644 --- a/.mike.yml +++ b/.mike.yml @@ -2,6 +2,7 @@ version_selector: true title_switch: true versions_file: docs/versions/versions.json versions: + - 4.3.2 - 4.3.1 - 4.3.0 - 4.2.0 @@ -18,4 +19,4 @@ versions: - 0.1.0 - latest aliases: - latest: 4.3.1 + latest: 4.3.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 236158d..3db8474 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,17 @@ Changelog ___ +v4.3.2 (2026-09-26) +------------------- + +Block response Content-Type, guard-core 4.1.0 tracking (v4.3.2) +--------------------------------------------------------------- + +- **Fixed** - Blocked responses now declare `Content-Type: text/plain` (#25): the Flask response factory left Flask's default mimetype in place, so middleware-generated 403/429/400 pages went out without an explicit content type and clients were left guessing. The factory now passes `mimetype="text/plain"`, matching the engine's reference response factory and the fastapi-guard fix (#144). +- **Compatibility** - The `guard-core` floor moves from `>=4.0.0` to `>=4.1.0` in `pyproject.toml` (no upper bound), so this adapter tracks the guard-core 4.1.0 engine (the exempt_ips skip-list, the recon leading-separator gate, the raw-view recon scan, the cross-engine interop harness). The adapter delegates all security behavior to the engine through the unasync-generated sync mirror; no sync API flaskapi-guard uses changed shape. + +___ + v4.3.1 (2026-09-23) ------------------- diff --git a/docs/index.md b/docs/index.md index 5c23020..d1a9116 100644 --- a/docs/index.md +++ b/docs/index.md @@ -106,7 +106,7 @@ You can also download the example app as a Docker container from [GitHub Contain docker pull ghcr.io/rennf93/flaskapi-guard-example:latest # Or pull a specific version (matches library releases) -docker pull ghcr.io/rennf93/flaskapi-guard-example:v4.3.1 +docker pull ghcr.io/rennf93/flaskapi-guard-example:v4.3.2 ``` ___ diff --git a/docs/release-notes.md b/docs/release-notes.md index e329357..5d1a4a7 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -3,6 +3,17 @@ Release Notes ___ +v4.3.2 (2026-09-26) +------------------- + +Block response Content-Type, guard-core 4.1.0 tracking (v4.3.2) +--------------------------------------------------------------- + +- **Fixed** - Blocked responses now declare `Content-Type: text/plain` (#25): the Flask response factory left Flask's default mimetype in place, so middleware-generated 403/429/400 pages went out without an explicit content type and clients were left guessing. The factory now passes `mimetype="text/plain"`, matching the engine's reference response factory and the fastapi-guard fix (#144). +- **Compatibility** - The `guard-core` floor moves from `>=4.0.0` to `>=4.1.0` in `pyproject.toml` (no upper bound), so this adapter tracks the guard-core 4.1.0 engine (the exempt_ips skip-list, the recon leading-separator gate, the raw-view recon scan, the cross-engine interop harness). The adapter delegates all security behavior to the engine through the unasync-generated sync mirror; no sync API flaskapi-guard uses changed shape. + +___ + v4.3.1 (2026-09-23) ------------------- diff --git a/docs/versions/versions.json b/docs/versions/versions.json index 1ed07f9..a345bed 100644 --- a/docs/versions/versions.json +++ b/docs/versions/versions.json @@ -1,4 +1,6 @@ { + "4.3.2": "4.3.2", + "latest": "4.3.2", "4.3.1": "4.3.1", "4.3.0": "4.3.0", "4.2.0": "4.2.0", @@ -12,6 +14,5 @@ "1.1.1": "1.1.1", "1.1.0": "1.1.0", "1.0.0": "1.0.0", - "0.1.0": "0.1.0", - "latest": "4.3.1" + "0.1.0": "0.1.0" } diff --git a/flaskapi_guard/.agents/skills/flaskapi-guard/SKILL.md b/flaskapi_guard/.agents/skills/flaskapi-guard/SKILL.md index 4cae9e1..a90fbc5 100644 --- a/flaskapi_guard/.agents/skills/flaskapi-guard/SKILL.md +++ b/flaskapi_guard/.agents/skills/flaskapi-guard/SKILL.md @@ -56,13 +56,16 @@ from flaskapi_guard import RouteConfig, SecurityDecorator security = SecurityDecorator() + @app.route("/api/sensitive") -@security.configure(RouteConfig( - rate_limit=5, - rate_limit_window=60, - require_https=True, - blocked_countries=["XX"], -)) +@security.configure( + RouteConfig( + rate_limit=5, + rate_limit_window=60, + require_https=True, + blocked_countries=["XX"], + ) +) def sensitive_endpoint(): return {"data": "restricted"} ``` diff --git a/pyproject.toml b/pyproject.toml index 23b7338..0daaa59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "flaskapi_guard" -version = "4.3.1" +version = "4.3.2" description = "A security library for Flask to control IPs, log requests, and detect penetration attempts." authors = [ {name = "Renzo Franceschini", email = "rennf93@users.noreply.github.com"} @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ "flask", - "guard-core>=4.0.0", + "guard-core>=4.1.0", "gunicorn", "werkzeug", ]