Skip to content

feat(sh1pt.com): Sign in with CoinPay - #1053

Merged
sh1pt-actions-fleet[bot] merged 1 commit into
masterfrom
feat/coinpay-signin
Oct 29, 2026
Merged

sh1pt-actions-fleet[bot] merged 1 commit into
masterfrom
feat/coinpay-signin

Conversation

@sh1pt-actions-fleet

Copy link
Copy Markdown
Contributor

CoinPay is the fleet's master account: this adds Sign in with CoinPay to sh1pt.com.

  • /login: "Sign in with CoinPay" first; magic link unchanged. /waitlist: "Sign up with CoinPay" above the form.
  • /dashboard#coinpay: Connect / Disconnect CoinPay. Disconnect refused when CoinPay is the only way in.
  • Flow (@profullstack/coinpay-onboard 0.3.1): auth code + PKCE S256 + state + nonce, exact redirect https://sh1pt.com/api/v1/coinpay/oauth/callback, client secret on the code exchange, id_token iss/aud/exp/nonce check, userinfo sub match. State pinned to the browser by an httpOnly cookie and spent from a server-side single-use coinpay_pending row.
  • STANDING sub rule: accounts bind to the CoinPay sub (public.coinpay_identities, RLS on, service role only). A CoinPay email matching an existing account never signs into it: a new auth user on a @coinpay-users.sh1pt.com placeholder is created and the CoinPay email kept as contact info. Session is minted server side (admin generateLink hash + verifyOtp), the crawlproof feat(cloud): add Linode / Akamai cloud adapter #405 pattern.
  • No Pro from CoinPay: bonusVerdict denies invite bonuses to a placeholder account (no_proven_email), and a CoinPay-created account does not accept an invite on first login.
  • CLI: sh1pt login pairs through /cli/login, which uses the web session, so it inherits CoinPay.
  • Migration 20261029063000_coinpay_identities.sql (already applied on dev2 by hand + notify pgrst).

Tests: sites/sh1pt.com/lib/coinpay-signin.test.ts (email collision, connect needs the same user, forged/missing/replayed/expired state, disconnect guard, invite bonus). Site lib suites 45/45, tsc --noEmit clean.

🤖 Generated with Claude Code

CoinPay is the fleet's master account. Adds "Sign in with CoinPay" first on
/login and "Sign up with CoinPay" on /waitlist, and a CoinPay card on the
dashboard (Connect / Disconnect), via @profullstack/coinpay-onboard 0.3.1:
auth code + PKCE S256 + state + nonce, client secret on the exchange,
id_token iss/aud/exp/nonce and userinfo sub checks.

- Bound by the CoinPay sub (public.coinpay_identities), never by email. A
  CoinPay email matching an existing account gets a new account on a
  placeholder auth email; the CoinPay email is contact info only.
- State pinned to the browser by an httpOnly cookie, spent from a
  server-side coinpay_pending row (single use, 10 minutes).
- Connect needs the signed-in user who started it to finish it.
- Disconnect is refused when CoinPay is the only way in.
- Session minted server side (generateLink hash + verifyOtp), as crawlproof.
- Invite bonuses are never paid to a CoinPay-made account (no proven
  mailbox), and its first login does not accept an invite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

54 finding(s)

HIGH/CRITICAL: 1 | MEDIUM: 18 | LOW: 35

Severity Rule Location
HIGH js-host-header-trust packages/bots/wechat/src/index.ts:405
MEDIUM redos-nested-quantifier packages/actions-fleet-core/src/action-pack/schema.ts:3
MEDIUM redos-nested-quantifier packages/core/src/setup-helpers.ts:583
MEDIUM sql-template-interpolation packages/migrate/src/engines/mysql.ts:133
MEDIUM sql-template-interpolation packages/migrate/src/engines/postgres.ts:276
MEDIUM sql-template-interpolation packages/migrate/src/transforms.ts:178
MEDIUM redos-nested-quantifier packages/policy/src/rules/bundle-id.ts:3
MEDIUM sql-string-concatenation packages/targets/deploy-wordpress/src/index.ts:154
MEDIUM redos-nested-quantifier packages/targets/desktop-linux/src/index.ts:19
MEDIUM redos-nested-quantifier packages/targets/desktop-mac/src/index.ts:15
MEDIUM redos-nested-quantifier packages/targets/desktop-steamos/src/index.ts:28
MEDIUM redos-nested-quantifier packages/targets/mobile-android/src/index.ts:9
MEDIUM redos-nested-quantifier packages/targets/mobile-ios/src/index.ts:11
MEDIUM redos-nested-quantifier packages/targets/tv-androidtv/src/index.ts:14
MEDIUM redos-nested-quantifier packages/targets/tv-firetv/src/index.ts:13
MEDIUM redos-nested-quantifier packages/targets/tv-tvos/src/index.ts:14
MEDIUM redos-nested-quantifier packages/targets/tv-webos/src/index.ts:26
MEDIUM js-unescaped-html-sink sites/sh1pt.com/app/blog/[slug]/page.tsx:88
MEDIUM js-unescaped-html-sink sites/sh1pt.com/app/components/PitFooter.tsx:17
LOW secret-generic-credential packages/affiliates/skimlinks/src/index.test.ts:25
LOW secret-generic-credential packages/affiliates/skimlinks/src/index.test.ts:71
LOW secret-generic-api-key packages/affiliates/sovrn/src/index.ts:28
LOW secret-generic-credential packages/agent-providers/opencode/src/__tests__/opencode.test.ts:99
LOW js-nosql-injection packages/ai/amazon-bedrock/src/index.test.ts:121
LOW secret-generic-credential packages/ai/amazon-bedrock/src/index.ts:9
LOW secret-generic-credential packages/ai/amazon-bedrock/src/index.ts:10
LOW secret-generic-credential packages/ai/amazon-bedrock/src/index.ts:11
LOW secret-generic-credential packages/bridges/matrix/src/index.ts:58
LOW secret-generic-credential packages/bridges/matrix/src/index.ts:59
LOW secret-generic-credential packages/bridges/slack/src/index.test.ts:259
LOW secret-generic-credential packages/captcha/captchasolver/src/index.ts:34
LOW secret-generic-credential packages/cli/src/commands/secrets.ts:189
LOW secret-generic-credential packages/cloud/linode/src/index.ts:15
LOW secret-generic-credential packages/migrate/src/platforms/index.test.ts:116
LOW secret-generic-credential packages/observability/sentry/src/index.ts:15
LOW secret-generic-credential packages/outreach/producthunt/src/index.ts:103
LOW secret-generic-credential packages/promo/posthog/src/index.ts:23
LOW secret-generic-credential packages/scanners/threatcrush/test/scan-output.txt:35
LOW secret-generic-credential packages/scanners/threatcrush/test/scan-output.txt:40
LOW secret-database-url packages/scanners/threatcrush/test/scan-output.txt:54
LOW secret-generic-credential packages/security/snyk/src/index.ts:26
LOW secret-generic-credential packages/social/hashnode/src/index.ts:4
LOW secret-generic-credential packages/social/linkedin/src/index.ts:3
LOW secret-generic-credential packages/social/linkedin/src/index.ts:4
LOW secret-generic-credential packages/social/medium/src/index.ts:4
LOW secret-generic-credential packages/social/snapchat/src/index.ts:5
LOW secret-generic-credential packages/social/tiktok/src/index.ts:5
LOW secret-generic-credential packages/targets/plugin-vscode/src/index.test.ts:115
LOW secret-generic-credential packages/targets/registry-ans/src/index.test.ts:79
LOW secret-generic-credential packages/targets/registry-ans/src/index.ts:49

…and 4 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​profullstack/​coinpay-onboard@​0.3.17610010093100
Updatednpm/​@​profullstack/​footer@​0.4.0 ⏵ 0.5.083 +5100100 +195 +1100

View full report

@sh1pt-actions-fleet
sh1pt-actions-fleet Bot merged commit 0bb0267 into master Oct 29, 2026
8 checks passed
@sh1pt-actions-fleet
sh1pt-actions-fleet Bot deleted the feat/coinpay-signin branch October 29, 2026 06:23
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