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
{{ message }}
Repository navigation
Commit a76b22b
Browse filesBrowse the repository at this point in the historyBrowse files
Scope the OpenAPI credential to the proxy operations; test a keyed preflight
From the verification round on e65ea8a, which found both fixes closed
and no regression:
- The optional credential moves from the document root onto the two
proxy operations. /v1/node-info is served by nvpair-node-info, which
has no key gate.
- A preflight that carries a valid key is tested: routed like any
authenticated request, with the key stripped.
- The key-file refusal names group access and points at
NVPAIR_PROXY_API_KEYS, and the package doc, SECURITY.md and the
troubleshooting page say group-readable rather than only
other-readable. SECURITY.md reconciles "prefer the file" with the
Kubernetes guidance, and troubleshooting lists a malformed inline
key or allowlist entry as a cause of 403 loopback-only.
- The proxy README scopes its preflight description to loopback
callers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSXRLJk5knQd4rNnn7XH1S
Signed-off-by: Aaron K. Clark <cryptojones@owasp.org>
Copy file name to clipboardExpand all lines: services/nvpair-proxy/README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -151,7 +151,7 @@ sit on the engine's own port. The stored value predates the current default.
151
151
152
152
**Browser clients (CORS).** PAIR does not enable CORS or add default browser permissions. Configure origins through the engine; its built-in defaults and user configuration remain authoritative. Ordinary forwarded responses preserve the upstream status, body, and CORS headers, including missing headers. A denial is never replaced with a successful OPTIONS response or retried to find permission elsewhere. Proxy-generated errors carry their actual status without CORS permission headers, so browser JavaScript may see a generic CORS failure while curl and diagnostics show the real error.
153
153
154
-
A browser preflight (OPTIONS with Origin and Access-Control-Request-Method) queries every currently routable target, with concurrency eight, a ten-second query deadline, and no redirects. A single target's response is relayed. Multiple responding targets must all permit the requested origin, method, and headers; PAIR grants only their shared permissions. Credentials require unanimous explicit support. Synthesized preflights allow browsers to cache the result for 60 seconds; PAIR itself does not cache decisions. A policy denial returns 403. Unavailable targets are skipped; if none can answer, the proxy returns 502. Ordinary OPTIONS requests retain normal routing. Preflights do not create inference jobs or reserve scheduler capacity. Paired ingress forwards only to its local engine.
154
+
A browser preflight (OPTIONS with Origin and Access-Control-Request-Method) from a loopback caller queries every currently routable target, with concurrency eight, a ten-second query deadline, and no redirects. A single target's response is relayed. Multiple responding targets must all permit the requested origin, method, and headers; PAIR grants only their shared permissions. Credentials require unanimous explicit support. Synthesized preflights allow browsers to cache the result for 60 seconds; PAIR itself does not cache decisions. A policy denial returns 403. Unavailable targets are skipped; if none can answer, the proxy returns 502. Ordinary OPTIONS requests retain normal routing. Preflights do not create inference jobs or reserve scheduler capacity. Paired ingress forwards only to its local engine. A preflight from another machine gets no exemption from the API-key gate: without a key it is refused with 401 before any target is queried, so a web page on another machine is not a supported client.
155
155
156
156
Combined model lists forward the caller's origin and end-to-end headers, excluding Authorization and Cookie so credentials are not shared across engines. Multi-target preflights apply the same credential filtering. With an Origin header, every responding engine must return a valid list and permit sharing: one denial returns 403 and one invalid list returns 502, without partial inventory. An invalid-list error retains the combined CORS permissions when every responding engine allows the origin. Unavailable engines are skipped, with 502 returned when none can answer. Successful lists combine origin/credential permissions and Vary requirements. Requests without Origin retain partial aggregation when some inventories are unavailable. Engines without CORS support remain unavailable to cross-origin browser clients through PAIR.
0 commit comments