Skip to content

OAUTH-001B2 — Redact ambiguous Strava disconnect browser failures #252

Description

@daliu

Parent: #88
Predecessors: #235 and #250 are complete and released.

Outcome

When the signed-in Account page cannot confirm a requested Strava disconnect, show one fixed, plain refresh-before-retry message. Never inspect, render, or log the rejected provider, callable, SDK, or exception value.

This is immediate browser leak containment only. It does not claim that revocation is retry-safe, that Strava accepted a revoke, that local records were deleted, or that any source change is live.

Invariant

A rejected disconnect result is ambiguous. The browser must preserve the current connected athlete and activity view, end the busy state, and ask the member to refresh so the authoritative connection record is read again. It must not blindly claim success or encourage an immediate repeat.

Fixed public message:

We could not confirm the Strava disconnect. Please refresh this page before trying again.

Exact scope

  1. src/pages/account/StravaSection.tsx
    • only the handleDisconnect rejection hunk
    • argument-free catch and fixed message
    • preserve confirmation, one callable request, rejection state, busy cleanup, and success transition
  2. src/pages/account/Account.test.tsx
    • additive stravaDisconnect mock/import and one focused actual-component disconnect describe
  3. docs/officers/EVENTS_SHOP_MEMBERS.md
    • separately named Strava disconnect failure privacy — SOURCE ONLY, NOT LIVE section only

Everything else is excluded, including service/Functions/Rules/root docs/lint/workflows/packages/provider/deploy/data and all #249/#246 commerce paths.

Acceptance

  • Old source test exposes a synthetic private canary, then passes after the correction.
  • Rejection shows exactly the fixed atomic alert and no rejected detail reaches DOM or five console methods.
  • A hostile throwing message getter is never accessed.
  • Connected athlete/activity remain visible and Disconnect becomes enabled after rejection.
  • Cancel makes no callable request and shows no alert.
  • Synthetic success still calls once, switches to the disconnected view, clears activity, and shows no alert.
  • Focused and full frontend checks, typecheck, lint safety, SPA/workflow/release/artifact checks, build, diff review, and independent security/accessibility/officer review pass.
  • Officer impact, officer documentation, and exact deployment truth are recorded.

Safety and deployment truth

Tests use only made-up values and mocks. Do not contact Firebase or Strava, inspect a real account, change provider configuration, or use production data. Source, tests, merge, and green CI do not prove the website, Firebase, provider, or live behavior changed.

Metadata

Metadata

Assignees

Labels

area:authAuthentication and authorizationarea:stravaStrava integrationarea:webWeb application and hostingpriority:P0Launch blocker or urgent security risksize:XSOwner decision or very narrow changetype:securitySecurity or privacy boundarytype:testingTest infrastructure and quality gates

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions