Skip to content

WEB-PRIVACY-001A — Redact public Shop catalog-load failures #254

Description

@daliu

Outcome

The public /shop page must show one fixed, plain retry message when its product catalog cannot load. It must never inspect, render, or log a rejected Firestore, SDK, provider, or exception value to an anonymous visitor.

Fixed public message:

We could not load the shop right now. Please try again later.

Current defect

src/pages/shop/Shop.tsx catches the rejected catalog request and renders err.message directly. The route is public, so a crawler or anonymous visitor can receive provider diagnostics, project identifiers, paths, or other private detail.

Invariant

  • do not capture or inspect the rejection
  • stop the loading state and show exactly one accessible fixed result
  • do not emit the rejection through browser console output
  • preserve the existing empty-catalog and successful product projections
  • make no Firebase/provider call in tests and use no real visitor, member, product, or order data

Exact scope

  1. src/pages/shop/Shop.tsx
    • only the catalog rejection hunk and error paragraph accessibility attributes
  2. src/App.test.jsx
    • additive Shop imports/mocks, service-locator mock control, and one focused actual-Shop describe
  3. docs/officers/EVENTS_SHOP_MEMBERS.md
    • separately named Public Shop catalog failure privacy — SOURCE ONLY, NOT LIVE section only

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

Acceptance

  • Old-source test exposes a synthetic private canary, then passes after correction.
  • Rejection shows exactly the fixed accessible result and ends Loading.
  • No rejected detail reaches DOM or five console methods.
  • A hostile throwing message getter is never accessed.
  • Empty synthetic catalog still shows the existing no-items sentence.
  • Synthetic success still shows the existing product link and formatted price.
  • Focused and full frontend checks, typecheck, lint safety, SPA/release/artifact guards, build, diff review, and independent security/accessibility/officer reviews 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, Stripe, or another provider; inspect a real account/order/catalog; change provider configuration; or use production data. Source, tests, merge, preview, and green CI do not prove the website, Firebase, provider, or live behavior changed.

Metadata

Metadata

Assignees

Labels

area:firebaseFirebase services and dataarea:privacyPersonal data, consent, minimization, retention, and privacy operationsarea: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