tailscale/client/web
Brad Fitzpatrick 66af25733c tstest/natlab/vmtest, client/web: add web client integration tests
Adds two Gokrazy-based vmtests covering the tailscaled web client at
port 5252:

* TestWebClientLocalAccess enables the web client on a single node
  and exercises the canonical owner session flow against the node's
  own Tailscale IP: an unauthenticated GET /api/auth that identifies
  the caller, a GET /api/auth/session/new that issues a
  TS-Web-Session cookie, and a final GET /api/auth that reports
  authorized=true with the cookie.

* TestWebClientRemoteAccess runs the same session flow from a peer
  node on the same tailnet against a second target node's web
  client, exercising netstack interception of incoming :5252
  traffic, cross-node WhoIs, and the same-user "owner" path. It
  then flips the test control server's AllNodesSameUser off,
  re-logs in the client under a fresh identity, and asserts that
  GET /api/auth/session/new returns 401 with body "not-owner" --
  exercising the cross-user rejection in client/web/auth.go.

To make the natlab test environment exercise the same code path
as production (check mode, where the web client posts to
/machine/webclient/init via Noise and waits on a control-issued
auth URL), this also:

* Allowlists the natlab fake control hostname "control.tailscale"
  in client/web/auth.go's controlSupportsCheckMode so the web
  client follows the check-mode branch rather than the
  no-check-mode shortcut that immediately marks new sessions
  authenticated.

* Adds /machine/webclient/{init,wait} handlers to testcontrol.
  init returns a placeholder auth ID and URL; wait returns
  Complete=true immediately, so the web client's awaitUserAuth
  resolves on its first call. Together these let the tests drive
  the full check-mode session lifecycle without a real
  browser-click loop.

To support the multi-request HTTP flows from the test harness,
this also adds:

* vmtest.Env.HTTPGetStatus, a sister of HTTPGet that returns the
  upstream status code, body, and Set-Cookie cookies (as a
  vmtest.HTTPResponse) and accepts cookies on the outgoing
  request, so tests can drive flows that depend on cookie
  continuity.

* Cookie pass-through in cmd/tta's /http-get handler: it forwards
  the Cookie request header upstream and surfaces upstream
  Set-Cookie response headers downstream. This is what lets
  HTTPGetStatus carry a session cookie across requests.

Previously the only tests of the web client were in-process
httptest-based handler tests in client/web/web_test.go; nothing
exercised the actual port 5252 listener wiring, the cross-node
auth path, cookie-driven session state transitions through the
check-mode control round-trip, or the not-owner rejection end
to end.

Updates #13038

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Change-Id: Idb01486a89b53ac02c6ad3358bcfcceca90dbc36
2026-06-30 06:55:12 -07:00
..
build client/web: precompress assets 2023-12-07 20:57:31 -05:00
src client/web: signal need to wait for auth across tabs 2026-03-11 08:15:21 +00:00
assets.go all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
auth.go tstest/natlab/vmtest, client/web: add web client integration tests 2026-06-30 06:55:12 -07:00
index.html client/web: use CSP hash for inline javascript 2023-12-11 20:22:56 -08:00
package.json build(deps-dev): bump vitest from 1.3.1 to 1.6.1 in /client/web 2025-11-27 15:11:55 -07:00
qnap.go all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
styles.json client/web: adjust colors and some UI margins 2023-12-01 15:41:57 -05:00
synology.go all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
tailwind.config.js client/web: fix Vite CJS deprecation warning (#11288) 2024-02-28 16:28:22 -05:00
tsconfig.json client/web: update vite and vitest to latest versions (#11200) 2024-02-23 14:50:41 -07:00
vite.config.ts client/web: update vite and vitest to latest versions (#11200) 2024-02-23 14:50:41 -07:00
web_test.go client/web: move API permission checks into handlers (#19576) 2026-05-01 09:01:53 -07:00
web.go client/web: move API permission checks into handlers (#19576) 2026-05-01 09:01:53 -07:00
yarn.lock build(deps): bump lodash from 4.17.21 to 4.17.23 in /client/web (#18476) 2026-02-19 10:22:22 -08:00