Skip to content

Legal pages update, child safety, and marketplace seller acknowledgment#243

Merged
spe1020 merged 4 commits intomainfrom
update/legal-pages-and-marketplace-ack
Mar 13, 2026
Merged

Legal pages update, child safety, and marketplace seller acknowledgment#243
spe1020 merged 4 commits intomainfrom
update/legal-pages-and-marketplace-ack

Conversation

@spe1020
Copy link
Copy Markdown
Contributor

@spe1020 spe1020 commented Mar 13, 2026

Summary

  • Privacy Policy — Comprehensive update covering payment processing (Stripe, Lightning), marketplace activity, community relays (The Garden, The Pantry), Cloudflare analytics, third-party wallets, international use, and user choices
  • Child Safety Standards — New /child-safety page with CSAE zero-tolerance policy, age requirements, architecture context, moderation practices, NCMEC compliance, and reporting workflows. Linked from ToS Section 4
  • Sponsorship Disclosure — Updated with structured sections for disclosure labels (Sponsored, Boosted, Promoted), marketplace promotion disclaimers, and disclosure integrity requirements
  • Seller Acknowledgment Modal — First-time sellers must accept marketplace ToS (Section 7) before creating a listing or store. Acceptance stored in localStorage with timestamp + npub
  • Buyer Disclaimer Banner — Persistent dismissible banner on /market, /market/products, and kitchen detail pages warning that transactions are peer-to-peer. Dismissible per session via sessionStorage

Test plan

  • Verify /privacy renders all 14 sections correctly
  • Verify /child-safety renders with proper headings, NCMEC links work
  • Verify /disclosure renders with updated label definitions and links
  • Create a new listing as first-time seller — acknowledgment modal appears
  • Accept modal, verify localStorage has zc_seller_ack record
  • Create another listing — modal does not appear again
  • Edit existing store — modal does not appear
  • Visit /market — buyer banner appears
  • Dismiss banner, navigate to /market/products — banner stays dismissed
  • New session — banner reappears

🤖 Generated with Claude Code

spe1020 and others added 4 commits March 13, 2026 17:51
…nalytics provisions

Comprehensive privacy policy update covering payment processing (Stripe,
Lightning), marketplace activity, community-managed relays (The Garden,
The Pantry), Cloudflare analytics, third-party wallets, international use,
and user choices. Updated children's privacy to reflect 13+ general / 18+
marketplace eligibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New /child-safety route covering CSAE zero-tolerance policy, age requirements,
architecture context, moderation practices, reporting workflows, NCMEC
compliance, and marketplace child safety provisions. Linked from the
prohibited conduct section of the Terms of Service.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…and label definitions

Adds structured sections for disclosure labels (Sponsored, Boosted, Promoted),
clarifies that promotion does not constitute endorsement of marketplace goods,
adds disclosure integrity requirements and links to Sponsor Terms and ToS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…r banner

First-time sellers see an interstitial requiring ToS acceptance before creating
a listing or store. Acceptance is stored in localStorage with timestamp + npub.
Existing store edits skip the modal.

Buyer-side banner on /market, /market/products, and kitchen detail pages warns
that transactions are peer-to-peer with no Zap Cooking involvement. Dismissible
per session via sessionStorage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@cloudflare-workers-and-pages
Copy link
Copy Markdown

Deploying frontend with  Cloudflare Pages  Cloudflare Pages

Latest commit: f34cd4d
Status: ✅  Deploy successful!
Preview URL: https://1236f0b1.frontend-hvd.pages.dev
Branch Preview URL: https://update-legal-pages-and-marke.frontend-hvd.pages.dev

View logs

@spe1020 spe1020 merged commit 5790ec5 into main Mar 13, 2026
2 checks passed
@spe1020 spe1020 deleted the update/legal-pages-and-marketplace-ack branch March 13, 2026 21:55
spe1020 pushed a commit that referenced this pull request May 1, 2026
…only [refs #243]

Audit follow-up on PR #370. The four sinks routing through sanitizeHTML
all render in browser-side contexts, and Cloudflare Workers (production
runtime) doesn't reliably support jsdom even with nodejs_compat — at
best a heavy bundle, at worst an SSR runtime crash. Switch to plain
`dompurify` and return empty on SSR rather than raw, which is strictly
safer than the prior `browser ? sanitize : raw` patterns this PR replaced.

Also adds a comment about the hook leak on DOMPurify's shared singleton
so future imports of `dompurify` directly inherit the rel-link policy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
spe1020 added a commit that referenced this pull request May 1, 2026
…inks (#370)

* security(dompurify): centralize sanitizer wrapper [refs #213 #243 #245 #247]

Made-with: Cursor

* security(dompurify): sanitize translated recipe HTML [refs #243]

Made-with: Cursor

* security(dompurify): sanitize share card HTML [refs #243]

Made-with: Cursor

* security(dompurify): make longform sanitizer SSR-safe [refs #243]

Made-with: Cursor

* security(dompurify): drop isomorphic-dompurify, sanitizer is browser-only [refs #243]

Audit follow-up on PR #370. The four sinks routing through sanitizeHTML
all render in browser-side contexts, and Cloudflare Workers (production
runtime) doesn't reliably support jsdom even with nodejs_compat — at
best a heavy bundle, at worst an SSR runtime crash. Switch to plain
`dompurify` and return empty on SSR rather than raw, which is strictly
safer than the prior `browser ? sanitize : raw` patterns this PR replaced.

Also adds a comment about the hook leak on DOMPurify's shared singleton
so future imports of `dompurify` directly inherit the rel-link policy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: spe1020 <sethsager@Seths-MacBook-Air.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
spe1020 added a commit that referenced this pull request May 1, 2026
…p, regression tests (#371)

* security(dompurify): sanitize DM bubble output [refs #213]

Made-with: Cursor

* security(dompurify): sanitize mention composer output [refs #213]

Made-with: Cursor

* security(dompurify): bump dompurify [closes #213 #243 #245 #247]

Made-with: Cursor

* security(dompurify): add sanitizer regression tests [refs #213 #243 #245 #247]

Made-with: Cursor

* test(security): fix sanitize regression test typecheck harness

Made-with: Cursor

* test(security): address copilot review on sanitizer regression tests

- Import sanitizeHTML at top of file for the 7 tests that don't need a
  fresh module evaluation. Down from 8 module re-imports + hook
  registrations per file run to 2, addressing the hook-accumulation
  concern raised in PR #371 review.
- Preserve original Object.prototype descriptors for tagNameCheck /
  attributeNameCheck via getOwnPropertyDescriptor and restore them
  exactly (or Reflect.deleteProperty when originally absent), instead
  of unconditionally `delete`-ing in finally.
- Same pattern for the SSR test's globalThis.window override: capture
  the full original descriptor and restore it precisely.
- Inline rationale on why the prototype-pollution test does NOT need
  module re-evaluation (dompurify resolves CUSTOM_ELEMENT_HANDLING
  config at sanitize-call time, not at module init).

---------

Co-authored-by: spe1020 <sethsager@Seths-MacBook-Air.local>
spe1020 added a commit that referenced this pull request May 1, 2026
… advisories (#372)

* security(dompurify): sanitize DM bubble output [refs #213]

Made-with: Cursor

* security(dompurify): sanitize mention composer output [refs #213]

Made-with: Cursor

* security(dompurify): bump dompurify [closes #213 #243 #245 #247]

Made-with: Cursor

* security(dompurify): add sanitizer regression tests [refs #213 #243 #245 #247]

Made-with: Cursor

* test(security): fix sanitize regression test typecheck harness

Made-with: Cursor

* test(security): address copilot review on sanitizer regression tests

- Import sanitizeHTML at top of file for the 7 tests that don't need a
  fresh module evaluation. Down from 8 module re-imports + hook
  registrations per file run to 2, addressing the hook-accumulation
  concern raised in PR #371 review.
- Preserve original Object.prototype descriptors for tagNameCheck /
  attributeNameCheck via getOwnPropertyDescriptor and restore them
  exactly (or Reflect.deleteProperty when originally absent), instead
  of unconditionally `delete`-ing in finally.
- Same pattern for the SSR test's globalThis.window override: capture
  the full original descriptor and restore it precisely.
- Inline rationale on why the prototype-pollution test does NOT need
  module re-evaluation (dompurify resolves CUSTOM_ELEMENT_HANDLING
  config at sanitize-call time, not at module init).

* security: rewrite pnpm.overrides to use range floors [closes GHSA-2mjp-6q6p-2qxm GHSA-34x7-hfp2-rc4v GHSA-3v7f-55p6-f55p GHSA-4992-7rv2-5pvq GHSA-737v-mqg7-c878 GHSA-83g3-92jg-28cx GHSA-8qm3-746x-r74r GHSA-8qq5-rm4j-mr97 GHSA-9ppj-qmqm-q256 GHSA-cfw5-2vxh-hr84 GHSA-f23m-r3pf-42rh GHSA-f269-vfmq-vjvj GHSA-mwv9-gp5h-frr4 GHSA-qffp-2rhf-9h96 GHSA-qx2v-qp2m-jg93 GHSA-r5fr-rjxr-66jc GHSA-r6q2-hw4h-h46w GHSA-xxjr-mmjv-4gpg]

Made-with: Cursor

* security(overrides): tighten range floors to caret-bounded majors

Address PR #372 copilot review:

1. Open-ended `>=X.Y.Z` floors could allow a future major release to
   resolve in during a lockfile regen, potentially breaking builds or
   runtime behavior. Convert all `pnpm.overrides` to `^X.Y.Z` to keep
   the security floor while pinning to the current major. Resolved
   versions in pnpm-lock.yaml are unchanged (tar@7.5.13, dompurify@3.4.2,
   picomatch@4.0.4, minimatch@10.2.5, etc.).

2. Aligns the dompurify override (`^3.4.2`) with the direct
   devDependency declaration so the lockfile importer specifier and
   package.json declaration are consistent — addresses the confusing
   `>=3.4.2` vs `^3.4.2` mismatch flagged on pnpm-lock.yaml.

Verified: pnpm install clean, pnpm test 85/85 pass, pnpm run check 0
errors, pnpm run build succeeds, audit shows no regression.

---------

Co-authored-by: spe1020 <sethsager@Seths-MacBook-Air.local>
spe1020 added a commit that referenced this pull request May 1, 2026
* security(dompurify): sanitize DM bubble output [refs #213]

Made-with: Cursor

* security(dompurify): sanitize mention composer output [refs #213]

Made-with: Cursor

* security(dompurify): bump dompurify [closes #213 #243 #245 #247]

Made-with: Cursor

* security(dompurify): add sanitizer regression tests [refs #213 #243 #245 #247]

Made-with: Cursor

* test(security): fix sanitize regression test typecheck harness

Made-with: Cursor

* test(security): address copilot review on sanitizer regression tests

- Import sanitizeHTML at top of file for the 7 tests that don't need a
  fresh module evaluation. Down from 8 module re-imports + hook
  registrations per file run to 2, addressing the hook-accumulation
  concern raised in PR #371 review.
- Preserve original Object.prototype descriptors for tagNameCheck /
  attributeNameCheck via getOwnPropertyDescriptor and restore them
  exactly (or Reflect.deleteProperty when originally absent), instead
  of unconditionally `delete`-ing in finally.
- Same pattern for the SSR test's globalThis.window override: capture
  the full original descriptor and restore it precisely.
- Inline rationale on why the prototype-pollution test does NOT need
  module re-evaluation (dompurify resolves CUSTOM_ELEMENT_HANDLING
  config at sanitize-call time, not at module init).

* security: rewrite pnpm.overrides to use range floors [closes GHSA-2mjp-6q6p-2qxm GHSA-34x7-hfp2-rc4v GHSA-3v7f-55p6-f55p GHSA-4992-7rv2-5pvq GHSA-737v-mqg7-c878 GHSA-83g3-92jg-28cx GHSA-8qm3-746x-r74r GHSA-8qq5-rm4j-mr97 GHSA-9ppj-qmqm-q256 GHSA-cfw5-2vxh-hr84 GHSA-f23m-r3pf-42rh GHSA-f269-vfmq-vjvj GHSA-mwv9-gp5h-frr4 GHSA-qffp-2rhf-9h96 GHSA-qx2v-qp2m-jg93 GHSA-r5fr-rjxr-66jc GHSA-r6q2-hw4h-h46w GHSA-xxjr-mmjv-4gpg]

Made-with: Cursor

* security(overrides): tighten range floors to caret-bounded majors

Address PR #372 copilot review:

1. Open-ended `>=X.Y.Z` floors could allow a future major release to
   resolve in during a lockfile regen, potentially breaking builds or
   runtime behavior. Convert all `pnpm.overrides` to `^X.Y.Z` to keep
   the security floor while pinning to the current major. Resolved
   versions in pnpm-lock.yaml are unchanged (tar@7.5.13, dompurify@3.4.2,
   picomatch@4.0.4, minimatch@10.2.5, etc.).

2. Aligns the dompurify override (`^3.4.2`) with the direct
   devDependency declaration so the lockfile importer specifier and
   package.json declaration are consistent — addresses the confusing
   `>=3.4.2` vs `^3.4.2` mismatch flagged on pnpm-lock.yaml.

Verified: pnpm install clean, pnpm test 85/85 pass, pnpm run check 0
errors, pnpm run build succeeds, audit shows no regression.

* security: bump vite to ^5.4.21 [closes #235 #236]

Made-with: Cursor

* security: bump @sveltejs/kit [closes #106]

Made-with: Cursor

* chore: bump @sveltejs/adapter-cloudflare for vite 6 compat

Made-with: Cursor

* security: bump wrangler [closes #74]

Made-with: Cursor

* security: bump markdown-it to ^14.1.1 [refs #84 #86 — defensive timeout in follow-up]

Made-with: Cursor

* security: override js-yaml to patched line [closes #51]

Made-with: Cursor

* security: bump @sveltejs/adapter-vercel [closes #95]

Made-with: Cursor

* chore: migrate _routes.json config to adapter-cloudflare 7.x format

Made-with: Cursor

---------

Co-authored-by: spe1020 <sethsager@Seths-MacBook-Air.local>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant