Repository navigation
OAUTH-001B10 — Require exact Strava disconnect client confirmation - #611
Conversation
✅ Deploy Preview for luminous-fox-7c393f ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
SELF-REVIEW GO on exact remote head No issue remains in the reviewed scope:
Independent exact-head runtime/security, test, and backup-officer reviews each returned GO. Their earlier documentation STOPs were corrected before commit. PR CI run 30737652078 passed all five jobs; the exact-head Netlify preview is ready and GitHub deployments are empty. No Firebase deploy, Strava/provider action, production-data operation, or live verification occurred. |
|
Post-merge verification complete. Exact main |
Outcome
My Account now hides the connected Strava identity and activity only when the callable fulfills with a value presenting exactly one own enumerable data field,
ok: true. Other fulfilled values use the existing fixed unknown-result view.Officer impact: Source now preserves the connected view when a fulfilled disconnect result is not an exact confirmation. The member still sees the existing instruction to refresh before another attempt.
Officer documentation:
docs/officers/EVENTS_SHOP_MEMBERS.md, existing “Strava disconnect failure privacy — SOURCE ONLY, NOT LIVE” procedure. It now covers both rejected requests and fulfilled non-confirmations, asks for #252/#610 evidence, and preserves the no-terminal refresh/stop/escalate path. No Mermaid update is needed because page structure, data movement, permissions, account ownership, and deployment topology are unchanged.Deployment evidence: Source changed and local tests passed. This PR has not been merged or published. The website and
runmprc.comare not updated; Firebase was not deployed; no Strava setting, account, token, revocation, provider call, or production data was used or changed; live behavior is not verified.Invariant and behavior
ok, whose data value is primitivetrue.{ ok: true }; the received object is never retained.Invalid Strava disconnect response.okaccessor and unknown-field getters are not invoked.Browser JavaScript cannot reliably identify a faithfully transparent nonthrowing Proxy. A value that presents the exact admitted contract is projected into a new frozen confirmation rather than retained. Revoked or throwing reflection is contained. Firebase wire decoding does not ordinarily produce Proxies or accessors.
Trustworthy RED
On exact base
9d8bfaae0a4f9e573053b4035954e933ae626875, a test-only callable fulfillment{ data: { ok: false } }was required to reject with the fixed response error. Old source instead fulfilled{ ok: false }.Test-only binary diff SHA-256:
03e16813248431f9a3f33cf8a6d0a642406ab5f13419ab9f762b05de56e2794aReviewed implementation binary diff SHA-256:
5975d21f867b27fafab901a10f5aa84e99c063f62c94be8c182c32405225566dReviewed head:
4ea0b7f0e1d830f42a5c33c6d4cfed3b5f35c56dVerification
Node.js 20 and Java 21 were used where applicable.
git diff --check: passedSelf-review
{ ok: true }remains accepted; callers receive a narrower safe subtypeIndependent runtime/security, test, and backup-officer reviews returned GO. Two reviewers first stopped overbroad Proxy/accessor documentation wording; those exact findings were corrected and re-reviewed GO before this commit.
Residual risk and exclusions
A transparent Proxy can present the exact contract; same-realm intrinsic tampering is outside this narrow boundary. A compromised server can still return
{ ok: true }, so this does not authenticate provider revocation. Provider serialization/reconciliation, connection-only writers, durable audit/tombstone, IAM/encryption, protected deployment, provider configuration, and live proof remain under #88.Closes #610.
Parent #88 remains open.