From 85a05efb4ddaa3339fe40605b5d3147118d7eb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 17 Jul 2026 17:30:54 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.29.5=20=E2=80=94=20OIDC=20?= =?UTF-8?q?redirect=20base=20+=20same-origin=20redirect=20hardening?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 22 ++++++++++++++++++++++ docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ea5ffed1..399a2a5e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,28 @@ ## [Unreleased] +## [1.29.5] — 2026-07-17 + +### Security + +- **Hardened the same-origin redirect guard.** A crafted relative + post-login `next` path (e.g. `/..//evil.com`) passed the same-origin + check but left a protocol-relative pathname that could re-resolve to a + foreign origin when re-used in a redirect or client navigation. The + guard now re-verifies the reconstructed path resolves on-origin and + rejects it otherwise. Covers the OIDC callback and the password/passkey + login redirect. + +### Fixed + +- **OIDC login redirects use the operator app URL, not the request URL.** + Behind a reverse proxy that does not forward the original host, the + login and callback routes built their browser redirects from the + address the app was reached at inside the container, sending users to + an unreachable internal URL after login. Every OIDC redirect is now + built from the operator-set `NEXT_PUBLIC_APP_URL`, matching the + convention the other integrations already use. + ## [1.29.4] — 2026-07-17 - **The workouts list shows the most recent first.** The list was ordered diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index db9fade75..183eb5ea8 100644 --- a/docs/api/openapi.yaml +++ b/docs/api/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: HealthLog API - version: 1.29.4 + version: 1.29.5 description: >- Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest. diff --git a/package.json b/package.json index 068f91e17..371f4d0b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.29.4", + "version": "1.29.5", "description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.", "license": "PolyForm-Noncommercial-1.0.0", "homepage": "https://healthlog.dev", diff --git a/public/sw.js b/public/sw.js index bbd60981a..d91e5e259 100644 --- a/public/sw.js +++ b/public/sw.js @@ -36,7 +36,7 @@ try { // v1.4.38.4 → v1.4.42. Do not hand-edit; bump `package.json` and rebuild. const CACHE_VERSION = (typeof self !== "undefined" && self.__APP_VERSION__) || - /* @sw-version-fallback */ "v1.29.4"; + /* @sw-version-fallback */ "v1.29.5"; const STATIC_CACHE = `healthlog-static-${CACHE_VERSION}`; const PAGE_CACHE = `healthlog-pages-${CACHE_VERSION}`; // v1.18.6 — read-only data cache for a curated allowlist of safe GET `/api/*`