Skip to content

Unauthenticated deep routes recurse /login indefinitely; plain HTTP triggers reliably #1

Description

@Vonng

Environment

  • SILO Console v2.0.0 at b952a1202869b89e5cc7b821a0b5651f74e09d08
  • SILO server RELEASE.2026-08-04T00-00-00Z
  • Chrome, tested against m.pigsty on 2026-08-05
  • Both HTTP and HTTPS currently serve the SPA fallback with 200 OK; an unauthenticated GET /api/v1/session returns 403

Reproduction

  1. Use an origin without a Console session. Opening the plain-HTTP origin is a reliable way to reproduce because the HTTPS session is not available there.
  2. Open http://m.pigsty/browser (or another protected deep route).
  3. Watch the address bar.

Actual result

The relative login path is appended repeatedly:

/browser/login
/browser/login/login
/browser/login/login/login
...

Starting at the root produces /login/login/.... In the live test the path gained hundreds of segments in about two seconds. Access logs have shown roughly 1,300 login segments / 7.8 KiB request targets before nginx eventually returns 414 Request-URI Too Large.

Expected result

An unauthenticated protected route should navigate once to the absolute, base-path-aware login URL. The original protected path should be saved once for the post-login return.

Root cause and regression window

ProtectedRoutes.tsx currently redirects to the relative pathname login. The wildcard protected route then catches the newly nested path again in MainRouter.tsx.

The relative redirect was introduced upstream on 2022-07-20 by cdb1659. It became an active SILO regression on 2026-08-04 in 23ae6e8, which upgraded react-router-dom from 6.30.3 to 7.18.2. In other words: the unsafe relative redirect is old, but the v2.0.0 behavior was introduced on 2026-08-04.

The existing nginx subpath test covers only the exact root URL, not a protected deep link: test-unauthenticated-user.ts.

Acceptance criteria

  • Use a single absolute/base-path-aware login destination.
  • /, /browser, /tools/metrics, and a nested protected URL do not gain repeated login segments.
  • Add unauthenticated deep-link coverage, including the subpath deployment case.
  • The saved return path is not overwritten by each login navigation.
  • Preferably redirect HTTP to HTTPS at the edge as defense in depth; the client-side redirect must still be correct when an HTTPS session is absent.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

Status
Done

Relationships

None yet

Development

No branches or pull requests

Issue actions