You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Surfaced reviewing #607. Both the plugin entry-prefix exemption (#582) and literal reservePath claims mark a URL subtree WAC-exempt, but the LDP write wildcards (PUT/POST/PATCH/DELETE '/*') sit beneath them. So a request under an exempt subtree that the plugin did not register a handler for falls through to the LDP layer with WAC already skipped.
Core already recognizes this exact class for /.well-known/* and installs explicit 405 blocks (src/server.js ~850–895): "without these blocks the wildcard write handlers would still accept unauthenticated writes under this namespace." The app-subtree mechanisms don't have the equivalent guard.
#607 method-gates reservePath (read-only by default), which closes the unlisted-method vector: a PUT under a read-only /xrpc is now WAC-guarded. Verified.
Residual, not yet closed:
A widened method at an unhandled path (PUT /api/unhandled when a shim reserved /api with methods:['PUT'] but only handles /api/echo) still routes into the WAC-skipped LDP layer. In a bare pod it 500s (no container) rather than writing, but that's environment-dependent, not a guarantee.
Register a scoped fallback under each exempt subtree — ALL <prefix> + ALL <prefix>/* → 404/405 — so unhandled requests resolve inside the app's namespace instead of reaching /*. Plugin-registered specific routes stay more specific and win; needs care around plugins that register their own wildcard under the prefix (potential FST_ERR_DUPLICATED_ROUTE). Belongs in its own PR because it changes the #582 mechanism, not just reservePath.
Surfaced reviewing #607. Both the plugin entry-prefix exemption (#582) and literal reservePath claims mark a URL subtree WAC-exempt, but the LDP write wildcards (
PUT/POST/PATCH/DELETE '/*') sit beneath them. So a request under an exempt subtree that the plugin did not register a handler for falls through to the LDP layer with WAC already skipped.Core already recognizes this exact class for
/.well-known/*and installs explicit 405 blocks (src/server.js~850–895): "without these blocks the wildcard write handlers would still accept unauthenticated writes under this namespace." The app-subtree mechanisms don't have the equivalent guard.Status after #607
#607 method-gates reservePath (read-only by default), which closes the unlisted-method vector: a
PUTunder a read-only/xrpcis now WAC-guarded. Verified.Residual, not yet closed:
PUT /api/unhandledwhen a shim reserved/apiwithmethods:['PUT']but only handles/api/echo) still routes into the WAC-skipped LDP layer. In a bare pod it 500s (no container) rather than writing, but that's environment-dependent, not a guarantee./myappthat doesn't handlePUT /myapp/xfalls straight through.Suggested fix
Register a scoped fallback under each exempt subtree —
ALL <prefix>+ALL <prefix>/*→ 404/405 — so unhandled requests resolve inside the app's namespace instead of reaching/*. Plugin-registered specific routes stay more specific and win; needs care around plugins that register their own wildcard under the prefix (potentialFST_ERR_DUPLICATED_ROUTE). Belongs in its own PR because it changes the #582 mechanism, not just reservePath.Refs #607, #582.