diff --git a/journal/index.html b/journal/index.html index 70f057e..511d9c2 100644 --- a/journal/index.html +++ b/journal/index.html @@ -49,6 +49,33 @@

Studio log.

+
+
+ AdoptDontShop + 13 Jul 2026 +
+

Security: 2FA hardening, platform data isolation and session integrity.

+

Two-factor authentication codes are now encrypted before storage — a database exposure can no longer produce usable offline bypass codes, and any code accepted once cannot be replayed within its 30-second window. Concurrent saves to a rescue’s adoption policy settings are now conflict-detected rather than silently overwriting each other. Platform-wide user statistics are restricted to platform administrators only — they are no longer visible to rescue staff via the reports dashboard. The list of users who favourited a pet is gated behind a system-only permission not granted to any user-facing role. Document attachment URLs are validated at upload so crafted links cannot reach rescue reviewer interfaces. Session IP address and user agent are now derived from the verified gateway connection, not caller-supplied fields.

+
+ +
+
+ AdoptDontShop + 11 Jul 2026 +
+

Reliability and security: resilient reports, private chat previews and authorisation fixes.

+

Reports no longer fail entirely when one data source is unavailable — each widget now returns its own status, so the rest of the page stays usable. The chat PDF preview no longer routes private attachment URLs through Google’s servers; previews render natively in the browser inside a sandboxed frame, and non-PDF attachments prompt a direct download. Support ticket authorship is now always derived from the authenticated session. Chat sessions verify the relationship between the parties before opening, and closing a conversation is restricted to rescue staff and moderators only.

+
+ +
+
+ AdoptDontShop + 10 Jul 2026 +
+

Security: token theft response, brute-force protection and infrastructure hardening.

+

When a stolen refresh token is detected as reused, every token in that family is now immediately revoked and active access tokens are invalidated, so an attacker can no longer stay logged in after detection. Login attempts are now rate-limited per email address as well as per IP, closing distributed credential-stuffing against individual accounts. The gateway now only trusts its direct upstream proxy for client IP resolution, so a crafted X-Forwarded-For header can no longer bypass rate limiting. Production database and upload backups are now encrypted at rest. Concurrent WebSocket connections per account are capped to limit fan-out from a compromised credential. Production containers run with a read-only filesystem and Grafana access is restricted to Viewer level.

+
+
AdoptDontShop