open-standards/joule-code/joule-code-rs/crates/joule-moq-web/web/room
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science cb766e7166 room page: take the endpoints a link names only on the page's own origin
The room client took its relay, room service, fixture, WebTransport URL,
certificate hashes and issuer directory from its query string as given, and
followed a relay's GOAWAY to any URI. A crafted link and a press of Join would
send a joiner's camera and microphone to another origin.

- web/room/endpoint.js: an endpoint is taken only on the page's own origin
  (`https://<host>`, or `wss://<host>` for a relay), never with user
  information; a page served from the loopback interface (a fixture page, the
  e2e harness) takes loopback addresses alone.
- app.js: `service`, `ws`, `wt`, `fixture` and `issuer_directory` are held to
  it; `hashes` only on a loopback page. A refused endpoint is recorded
  (`snapshot().refused`) and shown, Join stays off, and the page connects to
  nothing: `enter()` checks the relay before it asks for the camera, a grant or
  a session. A GOAWAY naming another origin is refused: the page closes its
  session and says so.
- web/room/endpoint.test.mjs (run by e2e/run.sh): own origin, another origin,
  scheme-relative, the page's host as user information, javascript:, a plain
  scheme on a secure page, an HTTP page, and loopback for the harness.
- e2e scenario `origin`: a foreign `?ws=` is refused at Join and nothing
  connects (no WebSocket, request, grant or camera); a foreign `?service=`,
  scheme-relative, behind user information or as javascript:, is refused with
  Join off; a GOAWAY to another origin is refused and the session ends. The
  `service` scenario checks that every request and WebSocket of every page
  stays on the page's origin, as the production `connect-src` requires.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 12:38:31 -04:00
..
app.js room page: take the endpoints a link names only on the page's own origin 2026-10-22 12:38:31 -04:00
binding.js joule-moq-web: frames bound to the objects they came from, routes before decode, and the binding page 2026-10-21 15:21:58 -04:00
binding.test.mjs joule-moq-web: frames bound to the objects they came from, routes before decode, and the binding page 2026-10-21 15:21:58 -04:00
co.js co-performance: the commitment's magic is WPK1, not WPC1 (taken by ad-presentation) 2026-10-22 04:11:30 -04:00
compose.js joule-moq-web: frames bound to the objects they came from, routes before decode, and the binding page 2026-10-21 15:21:58 -04:00
cowatch.js cowatch e2e: each step waits for its control's instant on every page's room clock 2026-10-22 03:40:56 -04:00
cowatch.test.mjs joule-moq-room: watch rooms (WAI co-watch); joule-moq-web: the page's co-watch module 2026-10-22 03:26:41 -04:00
e2ee.js joule-moq-web: the room page in an end-to-end encrypted room, and the e2ee scenario (WIP) 2026-10-20 08:43:46 -04:00
endpoint.js room page: take the endpoints a link names only on the page's own origin 2026-10-22 12:38:31 -04:00
endpoint.test.mjs room page: take the endpoints a link names only on the page's own origin 2026-10-22 12:38:31 -04:00
index.html room page: close the co-performance section, and test the page's markup 2026-10-22 06:50:13 -04:00
markup.test.mjs room page: close the co-performance section, and test the page's markup 2026-10-22 06:50:13 -04:00
privacy-pass.js The room page's Privacy Pass client (RFC 9577, RFC 9578 §6) and ratings on its tracks; every grant request in a room that admits by age carries a token 2026-10-21 19:15:49 -04:00
privacy-pass.test.mjs The room page's Privacy Pass client (RFC 9577, RFC 9578 §6) and ratings on its tracks; every grant request in a room that admits by age carries a token 2026-10-21 19:15:49 -04:00
worklet.js joule-moq-web: the browser client, its test pages and its end-to-end harness 2026-10-18 13:44:37 -04:00