diff --git a/backend/services/local_jwt.py b/backend/services/local_jwt.py index aff8b9b..0f3d759 100644 --- a/backend/services/local_jwt.py +++ b/backend/services/local_jwt.py @@ -32,14 +32,17 @@ def decode_token(token: str) -> dict[str, Any] | None: secret = settings.auth_jwt_secret if not secret: return None - try: - return jwt.decode( - token, - secret, - algorithms=[ALGORITHM], - issuer="periscope-local", - options={"verify_aud": False}, - leeway=10, - ) - except jwt.PyJWTError: - return None + # Accept pre-rebrand issuer so existing sessions keep working. + for issuer in ("periscope-local", "pinscope-local"): + try: + return jwt.decode( + token, + secret, + algorithms=[ALGORITHM], + issuer=issuer, + options={"verify_aud": False}, + leeway=10, + ) + except jwt.PyJWTError: + continue + return None diff --git a/frontend/content/changelog.md b/frontend/content/changelog.md index 1a4b1ca..332ca04 100644 --- a/frontend/content/changelog.md +++ b/frontend/content/changelog.md @@ -2,6 +2,14 @@ What's new in Periscope. +## 2.29.1 — 2026-09-13 — Fix sign-in /login 404 after rebrand + +Landing CTAs pointed at `/login`, which did not exist (page is `/sign-in`). Added redirects, accepted legacy JWT issuer `pinscope-local`, and CORS for both Periscope and Pinscope hosts. + +- [Fixed] `/login` → `/sign-in`, `/register` → `/sign-up`; marketing links updated. +- [Fixed] JWT decode accepts `pinscope-local` issuer from pre-rebrand sessions. +- [Fixed] Deploy script CORS includes both public hostnames. + ## 2.29.0 — 2026-09-13 — Rebrand to Periscope Product name, package (`periscopex`), Docker containers, deploy script, and default site URL are now **Periscope** (`https://periscope.michelebigi.it`). Deterministic finding IDs use the `PE-*` prefix. Existing project.json `pinscope_version` and browser storage keys are still read. diff --git a/frontend/next.config.ts b/frontend/next.config.ts index 5e872b2..80eaadd 100644 --- a/frontend/next.config.ts +++ b/frontend/next.config.ts @@ -27,6 +27,12 @@ const nextConfig: NextConfig = { canvas: { browser: "" }, }, }, + async redirects() { + return [ + { source: "/login", destination: "/sign-in", permanent: false }, + { source: "/register", destination: "/sign-up", permanent: false }, + ]; + }, async headers() { return [ { diff --git a/frontend/src/app/(marketing)/contact/nav.tsx b/frontend/src/app/(marketing)/contact/nav.tsx index 3be5a69..a293e85 100644 --- a/frontend/src/app/(marketing)/contact/nav.tsx +++ b/frontend/src/app/(marketing)/contact/nav.tsx @@ -44,12 +44,12 @@ export function Nav() { ) : ( <> - + - + - +