Repository navigation
Pro app access gate: PIN/password lock on every host - #107
Merged
Merged
Conversation
Owner-only MCP set_access {app, mode, secret?} (Pro; open always
allowed), enforced by the app proxy before any wake or forward:
locked navigations get a 401 Outer-served page (app name, one
input, Unlock, strict CSP), everything else 401 plain text.
Unlock is POST /.outer/unlock (same-origin checked, rate-limited
10/IP/app/15min and 100/app/hour through rate_limit_events,
Argon2id verify off the async runtime), setting a 30-day
__Host-outer-access cookie (HMAC, app+version+expiry bound) that
the proxy strips before forwarding. Look-token renders, the
celld health gate, loopback crawls/wakes and the disallowing
robots answer bypass the gate; a forged header never does.
Console Settings gains a Visitor access card (Pro-gated, audited
without the secret); get_app and console detail show
access open|pin|password, never the hash. Downgrade leaves a set
gate enforced. Tool count 61 -> 62; tools.md regenerated.
…rip, next, budgets, host binding, CSRF)
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 2 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Owner request (2026-10-27): Pro owners can set a PIN or password on an app. Platform-enforced in the proxy; not app code.
access_modeopen/pin/password + Argon2id hash + version (migration 0021). Owner-onlyset_access {app, mode, secret?}(62 tools); PIN/password is Pro, opening is always allowed; the gate stays enforced after a downgrade. Console "Visitor access" card, same gates, audited without the secret.X-Robots-Tag: noindexeverywhere, gated robots disallows all.POST /.outer/unlock(same-origin required) sets a 30-day__Host-outer_accessHMAC cookie (v2.<app_id>.<version>.<expiry>.<host_hash>.<mac>, HKDF from OUTER_SECRET), 303 to a sanitizednext.no-storeon all refusals.private, no-store+Vary: Cookie;set_accesspurges the app's live, preview and custom-domain cache. App-health path answers synthetic200 okwithout waking or proxying.look_at_app(single-use host-bound token claimed before the gate), the moderation crawl, deploy health checks, wake/keep-warm (all loopback-direct; no client header trusted).next, PIN budget + Argon2 bound), 2 Low (host-bound cookie, unlock CSRF), all fixed with failing-before tests. Verified correct: MAC/key separation, version/expiry/app binding, look-token single-use, owner-only authz, no secret in logs/audit,/.outer/prefix matching, migration + preview copy.Live on prod (
outer:188cf07, throwaway Pro account, deleted after):set_access pin: locked HTML 401 with the form, favicon 401no-store, health synthetic 200, report reachable, no-Origin/cross-origin 403 with no ledger row, wrong PIN 401, unlock 303 + cookie flags, unlocked assetprivate, no-store+Vary: Cookie, anon stays 401, live cookie rejected on preview host, robots disallow.set_accesschange (host log lines).fmt, clippy,
cargo test(1102) green;bun test pages/consolegreen. One known flake (preview_commit_promote_discard_round_tripfails under parallel load, passes alone; untouched by this change).