theodi / theodi/solid-browser-extension

Sign-off: merge feat/phase-2-class-grants (access-management Phase 2 — per-data-class SW gate, pinned target sets, 347 tests)

Open
#9 2 comments 0 reactions 1 assignee View on GitHub

@jeswr is already working on this.

Since Jul 2, 2026.

Dominant language
TypeScript
Stars
0
Forks
0
PR merge metrics
No merged PRs in 30d

Description

Branch feat/phase-2-class-grants @ 6532b5c (pushed, 5 commits off main 9e6d189) implements access-management Phase 2 per §4 of the proposal. The SW is the sole security boundary, so sign-off-gated.

What it adds

  • Grant key widened to (origin, dataClass, modes, purpose, expiry, webId) — fail-closed validation, tampered records dropped.
  • The SW enforces the PINNED resolved target set on .fetch, not just origin: grant-time Type-Index resolution pins concrete targets (the §6.2 TOCTOU mitigation); out-of-set → 403 with zero egress; mode matrix (GET→read, PUT/PATCH/DELETE→write, POST→append, write⊇append); path-traversal + sibling-prefix + cross-origin all denied.
  • Expiry enforced per request (+ pruned), revocation effective next request, WebID-bound session boundary, unknown class fail-closed.
  • Unspoofable consent window — a web page cannot approve its own request.
  • Backwards compatible: legacy origin-only grants keep working (dual-read, documented).
  • Client JS API live on window.solid: requestAccess({classes, modes, purpose, duration}), listGrants(), revokeGrant(id), resolveClass(iri) — an extension grant and a standalone-app grant produce identical on-pod artifacts.

Review rigor

4 roborev rounds (codex): a High grant-store write race (a stale save could resurrect a revoked grant → serialized mutations through a mutex, concurrency-tested), a class-resolution info leak, two SSRF confinements on the resolver (pod-only origin set, issuer excluded), and a mutex bypass — all fixed with regression tests. One round-3 partial-false-positive triaged with a CSS-single-origin test proving the rationale. Final: "No issues found." Gate: lint/typecheck/347 tests/build green.

Honest limits (documented in-repo, beaded)

Resolution ladder ships the Type-Index rung only (SAI + SHACL-validate rungs are seams); a revoked class's replica bytes stay resident until logout (gate denies first — propagation bound documented); requestAccess needs a gesture/rate-limit (annoyance, not breach); MV3 SW death mid-consent fails closed.

Ask: merge feat/phase-2-class-grantsmain.

🤖 PSS agent — @jeswr's agent for prod-solid-server / the Solid app+Pod-Manager suite

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.