From 953a3d437a16549cd7e69233f6065b33ef34441c Mon Sep 17 00:00:00 2001 From: Bitcoin Error Log <18273620+BitcoinErrorLog@users.noreply.github.com> Date: Wed, 23 Sep 2026 17:44:27 +0100 Subject: [PATCH 1/4] feat(marketplace): Bitkit purchase bootstrap for grant sign-ins A Bitkit (grant) sign-in has no AuthToken to redeem, so its purchase session comes from a browser bootstrap: the grant session writes a single-use proof document, the Shop BFF runs the CLI verifier's checks and opens a marketplace signin_grant, and after the Bitkit approval the BFF claims the bearer. The result PoP seed is derived from the BFF state key and the challenge id (HKDF key with its own salt and info, two labelled HMACs), so no migration is added and a key rotation inside the challenge window fails closed. The flow is bound to the __Host-shop-marketplace-grant cookie and sealed as a version 2 browser context; CLI routes refuse it, and the CLI verifier refuses a browser challenge row before consume. The connect dialog shows Bitkit copy for the bootstrap, reason codes get static copy, and the inventory, messaging and manual-claim dialogs name their Pubky Ring requirement. --- .../[challengeId]/verify/route.ts | 17 + .../marketplace/bootstrap-challenges/route.ts | 13 + .../bootstrap-flows/[stateId]/cancel/route.ts | 17 + .../bootstrap-flows/[stateId]/status/route.ts | 14 + .../GrantSessionRefusal.tsx | 10 +- .../MarketplaceGrantSessionRefusal.test.tsx | 25 +- .../MarketplaceInventoryGrantDialog.tsx | 8 +- .../MarketplaceMessagingEnableDialog.tsx | 4 +- .../MarketplaceSessionConnectDialog.test.tsx | 45 +- .../MarketplaceSessionConnectDialog.tsx | 54 +- .../marketplace-bootstrap-client.test.ts | 160 ++++ .../marketplace-bootstrap-client.ts | 125 +++ .../useMarketplaceSessionConnect.test.ts | 151 ++++ .../useMarketplaceSessionConnect.ts | 64 +- .../useMarketplaceSessionConnect.types.ts | 6 + src/libs/commerce/failure-messages.test.ts | 39 + src/libs/commerce/failure-messages.ts | 36 + .../marketplace-grant/browser-bff.test.ts | 779 ++++++++++++++++++ src/server/marketplace-grant/browser-bff.ts | 398 +++++++++ src/server/marketplace-grant/cli-bff.ts | 20 +- src/server/marketplace-grant/config.ts | 40 +- src/server/marketplace-grant/crypto.ts | 110 +++ .../MarketplaceSessionConnect.vrt.test.tsx | 23 +- 23 files changed, 2099 insertions(+), 59 deletions(-) create mode 100644 src/app/api/marketplace/bootstrap-challenges/[challengeId]/verify/route.ts create mode 100644 src/app/api/marketplace/bootstrap-challenges/route.ts create mode 100644 src/app/api/marketplace/bootstrap-flows/[stateId]/cancel/route.ts create mode 100644 src/app/api/marketplace/bootstrap-flows/[stateId]/status/route.ts create mode 100644 src/core/services/marketplace/marketplace-bootstrap-client.test.ts create mode 100644 src/core/services/marketplace/marketplace-bootstrap-client.ts create mode 100644 src/server/marketplace-grant/browser-bff.test.ts create mode 100644 src/server/marketplace-grant/browser-bff.ts diff --git a/src/app/api/marketplace/bootstrap-challenges/[challengeId]/verify/route.ts b/src/app/api/marketplace/bootstrap-challenges/[challengeId]/verify/route.ts new file mode 100644 index 000000000..4aa95c8ad --- /dev/null +++ b/src/app/api/marketplace/bootstrap-challenges/[challengeId]/verify/route.ts @@ -0,0 +1,17 @@ +import type { NextRequest } from 'next/server'; +import { BOOTSTRAP_FLOW_COOKIE, verifyBrowserChallenge } from '@/server/marketplace-grant/browser-bff'; +import { grantCookieOptions, grantError, noStoreJson } from '@/server/marketplace-grant/http'; + +export const runtime = 'nodejs'; + +export async function POST(request: NextRequest, context: { params: Promise<{ challengeId: string }> }) { + try { + const { challengeId } = await context.params; + const verified = await verifyBrowserChallenge(request, challengeId); + const response = noStoreJson(verified.response, 201); + response.cookies.set(BOOTSTRAP_FLOW_COOKIE, verified.cookie, { ...grantCookieOptions, maxAge: verified.maxAge }); + return response; + } catch (error) { + return grantError(error); + } +} diff --git a/src/app/api/marketplace/bootstrap-challenges/route.ts b/src/app/api/marketplace/bootstrap-challenges/route.ts new file mode 100644 index 000000000..8d4b50649 --- /dev/null +++ b/src/app/api/marketplace/bootstrap-challenges/route.ts @@ -0,0 +1,13 @@ +import type { NextRequest } from 'next/server'; +import { createBrowserChallenge } from '@/server/marketplace-grant/browser-bff'; +import { grantError, noStoreJson } from '@/server/marketplace-grant/http'; + +export const runtime = 'nodejs'; + +export async function POST(request: NextRequest) { + try { + return noStoreJson(await createBrowserChallenge(request), 201); + } catch (error) { + return grantError(error); + } +} diff --git a/src/app/api/marketplace/bootstrap-flows/[stateId]/cancel/route.ts b/src/app/api/marketplace/bootstrap-flows/[stateId]/cancel/route.ts new file mode 100644 index 000000000..d4e03799d --- /dev/null +++ b/src/app/api/marketplace/bootstrap-flows/[stateId]/cancel/route.ts @@ -0,0 +1,17 @@ +import type { NextRequest } from 'next/server'; +import { BOOTSTRAP_FLOW_COOKIE, cancelBrowserFlow } from '@/server/marketplace-grant/browser-bff'; +import { grantError, noStoreEmpty } from '@/server/marketplace-grant/http'; + +export const runtime = 'nodejs'; + +export async function POST(request: NextRequest, context: { params: Promise<{ stateId: string }> }) { + try { + const { stateId } = await context.params; + await cancelBrowserFlow(request, request.cookies.get(BOOTSTRAP_FLOW_COOKIE)?.value, stateId); + const response = noStoreEmpty(204); + response.cookies.delete(BOOTSTRAP_FLOW_COOKIE); + return response; + } catch (error) { + return grantError(error); + } +} diff --git a/src/app/api/marketplace/bootstrap-flows/[stateId]/status/route.ts b/src/app/api/marketplace/bootstrap-flows/[stateId]/status/route.ts new file mode 100644 index 000000000..ca904b778 --- /dev/null +++ b/src/app/api/marketplace/bootstrap-flows/[stateId]/status/route.ts @@ -0,0 +1,14 @@ +import type { NextRequest } from 'next/server'; +import { BOOTSTRAP_FLOW_COOKIE, pollBrowserFlow } from '@/server/marketplace-grant/browser-bff'; +import { grantError, noStoreJson } from '@/server/marketplace-grant/http'; + +export const runtime = 'nodejs'; + +export async function POST(request: NextRequest, context: { params: Promise<{ stateId: string }> }) { + try { + const { stateId } = await context.params; + return noStoreJson(await pollBrowserFlow(request, request.cookies.get(BOOTSTRAP_FLOW_COOKIE)?.value, stateId)); + } catch (error) { + return grantError(error); + } +} diff --git a/src/components/molecules/GrantSessionRefusal/GrantSessionRefusal.tsx b/src/components/molecules/GrantSessionRefusal/GrantSessionRefusal.tsx index f35defe4b..fc90fca63 100644 --- a/src/components/molecules/GrantSessionRefusal/GrantSessionRefusal.tsx +++ b/src/components/molecules/GrantSessionRefusal/GrantSessionRefusal.tsx @@ -1,7 +1,13 @@ import { Typography } from '@/atoms/Typography/Typography'; +export const GRANT_SESSION_REFUSAL_COPY = { + default: 'Bitkit sign-in does not cover this step yet. Sign in with Pubky Ring to continue.', + inventory: 'Inventory edits need a Pubky Ring sign-in for now.', + messaging: 'Messages need a Pubky Ring sign-in for now.', +} as const; + /** Shown instead of a Pubky Ring approval QR when the Shop session came from a Bitkit sign-in. */ -export function GrantSessionRefusal() { +export function GrantSessionRefusal({ message = GRANT_SESSION_REFUSAL_COPY.default }: { message?: string }) { return (
- {'Bitkit sign-in does not cover this step yet. Sign in with Pubky Ring to continue.'} + {message}
); diff --git a/src/components/organisms/Marketplace/MarketplaceGrantSessionRefusal.test.tsx b/src/components/organisms/Marketplace/MarketplaceGrantSessionRefusal.test.tsx index 3cbc40fa4..dc62bcdf3 100644 --- a/src/components/organisms/Marketplace/MarketplaceGrantSessionRefusal.test.tsx +++ b/src/components/organisms/Marketplace/MarketplaceGrantSessionRefusal.test.tsx @@ -55,17 +55,34 @@ describe('classic Pubky Ring approvals refuse a grant session', () => { state.messagingStart.mockClear(); }); - it('grant session sees refusal not classic qr (inventory grant)', () => { + it('grant session sees inventory refusal', () => { render(); - expect(screen.getByTestId('grant-session-refusal')).toBeInTheDocument(); + expect(screen.getByTestId('grant-session-refusal')).toHaveTextContent( + 'Inventory edits need a Pubky Ring sign-in for now.', + ); + expect(screen.queryByTestId('qr-auth-url')).not.toBeInTheDocument(); expect(state.inventoryStart).not.toHaveBeenCalled(); }); - it('grant session sees refusal not classic qr (messaging enable)', () => { + it('inventory copy names Ring only', () => { + state.isGrantSession = false; + render(); + + expect( + screen.getByText('Approve this grant in Pubky Ring; it does not replace your purchase session.'), + ).toBeInTheDocument(); + expect(screen.queryByText(/Bitkit/)).not.toBeInTheDocument(); + expect(state.inventoryStart).toHaveBeenCalled(); + }); + + it('grant session sees messaging refusal without qr', () => { render(); - expect(screen.getByTestId('grant-session-refusal')).toBeInTheDocument(); + expect(screen.getByTestId('grant-session-refusal')).toHaveTextContent( + 'Messages need a Pubky Ring sign-in for now.', + ); + expect(screen.queryByTestId('qr-auth-url')).not.toBeInTheDocument(); expect(state.messagingStart).not.toHaveBeenCalled(); }); diff --git a/src/components/organisms/Marketplace/MarketplaceInventoryGrantDialog.tsx b/src/components/organisms/Marketplace/MarketplaceInventoryGrantDialog.tsx index 6805c14a7..03cb1f9f8 100644 --- a/src/components/organisms/Marketplace/MarketplaceInventoryGrantDialog.tsx +++ b/src/components/organisms/Marketplace/MarketplaceInventoryGrantDialog.tsx @@ -7,7 +7,7 @@ import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogT import { Typography } from '@/atoms/Typography/Typography'; import { useIsGrantSession } from '@/hooks/useIsGrantSession/useIsGrantSession'; import { useMarketplaceInventoryGrantConnect } from '@/hooks/useMarketplaceInventoryGrantConnect/useMarketplaceInventoryGrantConnect'; -import { GrantSessionRefusal } from '@/molecules/GrantSessionRefusal/GrantSessionRefusal'; +import { GRANT_SESSION_REFUSAL_COPY, GrantSessionRefusal } from '@/molecules/GrantSessionRefusal/GrantSessionRefusal'; import { QrCodeSlot } from '@/molecules/QrCodeSlot/QrCodeSlot'; import { toast } from '@/molecules/Toaster/use-toast'; @@ -68,10 +68,10 @@ export function MarketplaceInventoryGrantDialog({ Approve inventory access - Approve this grant in Bitkit or Pubky Ring; it does not replace your purchase session. + Approve this grant in Pubky Ring; it does not replace your purchase session. {isGrantSession ? ( - + ) : grant.status === 'error' ? (
{grant.errorMessage} @@ -108,7 +108,7 @@ export function MarketplaceInventoryGrantDialog({ disabled={!grant.authorizationUrl || grant.isOpeningSigner} > - Open in Bitkit / Ring + Open in Pubky Ring {session.status === 'awaiting' && (
- Waiting for approval on your signer… + {requestsGrantBootstrap ? 'Waiting for approval in Bitkit…' : 'Waiting for approval on your signer…'}
)} {['creating', 'verifying', 'claiming'].includes(session.status) && (
{session.status === 'creating' - ? 'Preparing secure approval…' + ? requestsGrantBootstrap + ? 'Confirming with your homeserver…' + : 'Preparing secure approval…' : session.status === 'verifying' ? 'Verifying approval…' : 'Connecting marketplace…'} @@ -175,12 +189,16 @@ export function MarketplaceSessionConnectDialog({ )} {session.isOpeningRing - ? requestsGrantReconnect - ? 'Opening signer...' - : 'Opening Pubky Ring...' - : requestsGrantReconnect - ? 'Open in signer' - : 'Open in Pubky Ring'} + ? requestsGrantBootstrap + ? 'Opening Bitkit...' + : requestsGrantReconnect + ? 'Opening signer...' + : 'Opening Pubky Ring...' + : requestsGrantBootstrap + ? 'Open in Bitkit' + : requestsGrantReconnect + ? 'Open in signer' + : 'Open in Pubky Ring'} , +})); + +describe('MarketplaceSessionRequiredCard', () => { + beforeEach(() => { + view.isGrantSession = false; + view.grantEnabled = false; + }); + + it('names Pubky Ring for a Ring sign-in', () => { + render(); + + expect(screen.getByRole('heading', { name: 'Approve purchases in Pubky Ring' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Approve in Pubky Ring' })).toBeInTheDocument(); + }); + + it('names Bitkit for a Bitkit sign-in that can bootstrap', () => { + view.isGrantSession = true; + view.grantEnabled = true; + render(); + + expect(screen.getByRole('heading', { name: 'Approve purchases in Bitkit' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Approve in Bitkit' })).toBeInTheDocument(); + }); + + it('keeps Pubky Ring copy for a Bitkit sign-in when the grant flow is off', () => { + view.isGrantSession = true; + render(); + + expect(screen.getByRole('heading', { name: 'Approve purchases in Pubky Ring' })).toBeInTheDocument(); + }); +}); diff --git a/src/components/organisms/Marketplace/MarketplaceSessionRequiredCard.tsx b/src/components/organisms/Marketplace/MarketplaceSessionRequiredCard.tsx index 31ff99673..06df2aef9 100644 --- a/src/components/organisms/Marketplace/MarketplaceSessionRequiredCard.tsx +++ b/src/components/organisms/Marketplace/MarketplaceSessionRequiredCard.tsx @@ -3,14 +3,18 @@ import { KeyRound } from 'lucide-react'; import { Heading } from '@/atoms/Heading/Heading'; import { Typography } from '@/atoms/Typography/Typography'; +import { useIsGrantSession } from '@/hooks/useIsGrantSession/useIsGrantSession'; +import { getMarketplaceGrantFlowEnabled } from '@/libs/runtime-config/runtime-config'; import { MarketplaceSessionConnectDialog } from './MarketplaceSessionConnectDialog'; /** - * Shows static Pubky Ring approval copy on durable marketplace surfaces when - * the durable transport reports `isMarketplaceSessionRequiredError`. Sandbox - * surfaces never see this card because they do not use the durable transport. + * Shows static approval copy on durable marketplace surfaces when the durable + * transport reports `isMarketplaceSessionRequiredError`: Bitkit for a Bitkit + * (grant) sign-in that can bootstrap, Pubky Ring otherwise. Sandbox surfaces + * never see this card because they do not use the durable transport. */ export function MarketplaceSessionRequiredCard({ onConnected }: { onConnected?: () => void | Promise }) { + const signer = useIsGrantSession() && getMarketplaceGrantFlowEnabled() ? 'Bitkit' : 'Pubky Ring'; return (
- Approve purchases in Pubky Ring + Approve purchases in {signer} One approval lets you buy, bid, and make offers on this marketplace. Nothing is charged until you pay.
- +
); } diff --git a/src/core/services/marketplace/marketplace-bootstrap-client.test.ts b/src/core/services/marketplace/marketplace-bootstrap-client.test.ts index 277a89a21..1f0b20250 100644 --- a/src/core/services/marketplace/marketplace-bootstrap-client.test.ts +++ b/src/core/services/marketplace/marketplace-bootstrap-client.test.ts @@ -38,8 +38,11 @@ function challenge(overrides: Record = {}) { }; } +const BOOTSTRAP_URL = + 'pubkyauth://signin_grant?caps=%2Fpub%2Fpubky.app%2Fmarketplace-service%2Fv1%2F%3Arw&relay=https%3A%2F%2Frelay.example%2Finbox&secret=s&cid=shop.example&cpk=k'; + const verified = { - authorization_url: 'pubkyauth://signin_grant?caps=x', + authorization_url: BOOTSTRAP_URL, expires_at: new Date(Date.now() + 120_000).toISOString(), state_id: STATE_ID, status: 'awaiting', @@ -144,6 +147,26 @@ describe('marketplace purchase bootstrap client', () => { ]); }); + it('refuses and cancels a bootstrap QR that asks Bitkit for more than purchases', async () => { + fetchMock + .mockResolvedValueOnce(jsonResponse(challenge(), 201)) + .mockResolvedValueOnce( + jsonResponse({ + ...verified, + authorization_url: BOOTSTRAP_URL.replace( + 'caps=%2Fpub%2Fpubky.app%2Fmarketplace-service%2Fv1%2F%3Arw', + 'caps=%2Fpub%2Fpubky.app%2F%3Arw', + ), + }), + ) + .mockResolvedValue(new Response(null, { status: 204 })); + + await expect(beginMarketplaceBootstrapFlow({ pubky: PUBKY })).rejects.toThrow('result_denied'); + expect(fetchMock.mock.calls.map((call) => call[0])).toContain( + `/api/marketplace/bootstrap-flows/${STATE_ID}/cancel`, + ); + }); + it('cancel posts to the bootstrap cancel route once', async () => { fetchMock .mockResolvedValueOnce(jsonResponse(challenge(), 201)) diff --git a/src/core/services/marketplace/marketplace-bootstrap-client.ts b/src/core/services/marketplace/marketplace-bootstrap-client.ts index 79c846ae0..ecf21aeab 100644 --- a/src/core/services/marketplace/marketplace-bootstrap-client.ts +++ b/src/core/services/marketplace/marketplace-bootstrap-client.ts @@ -40,6 +40,9 @@ const pollSchema = z.object({ expires_at: z.string().optional(), }); +/** The only capability the marketplace bootstrap grant may ask Bitkit for. */ +export const MARKETPLACE_BOOTSTRAP_CAPABILITIES = '/pub/pubky.app/marketplace-service/v1/:rw'; + function bootstrapFailure(code: string) { return Err.server(ServerErrorCode.SERVICE_UNAVAILABLE, code, { service: ErrorService.Marketplace, @@ -97,6 +100,17 @@ export async function beginMarketplaceBootstrapFlow({ pubky }: { pubky: string } }); } + const cancelFlow = async () => { + await post(`/api/marketplace/bootstrap-flows/${verified.state_id}/cancel`, {}).catch(() => undefined); + }; + // Never show Bitkit a QR that asks for more than purchases. + if ( + new URL(verified.authorization_url).searchParams.getAll('caps').join(',') !== MARKETPLACE_BOOTSTRAP_CAPABILITIES + ) { + await cancelFlow(); + throw bootstrapFailure('result_denied'); + } + let cancelled = false; return { authorizationUrl: verified.authorization_url, @@ -119,7 +133,7 @@ export async function beginMarketplaceBootstrapFlow({ pubky }: { pubky: string } cancel: async () => { if (cancelled) return; cancelled = true; - await post(`/api/marketplace/bootstrap-flows/${verified.state_id}/cancel`, {}).catch(() => undefined); + await cancelFlow(); }, }; } From 3be1ffd84c7d173aa3ecb27482e5623ce5f418f6 Mon Sep 17 00:00:00 2001 From: Bitcoin Error Log <18273620+BitcoinErrorLog@users.noreply.github.com> Date: Thu, 24 Sep 2026 08:17:37 +0100 Subject: [PATCH 3/4] feat(marketplace): caption the Bitkit purchase QR with the client Bitkit shows The bootstrap QR now says which client Bitkit will name and that the request covers marketplace purchases only, read from the authorization URL. A fixture pins the staging bootstrap URL shape (signin_grant with caps, relay, secret, cid, cpk and only the marketplace-service capability), and the client test checks the Shop's capability pin and caption against it. --- .../MarketplaceSessionConnectDialog.test.tsx | 16 ++++++++ .../MarketplaceSessionConnectDialog.tsx | 13 +++++++ .../marketplace-bootstrap-client.test.ts | 37 ++++++++++++++++++- .../marketplace-bootstrap-client.ts | 14 +++++++ .../marketplace-bootstrap-url.staging.json | 8 ++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/test/fixtures/auth/marketplace-bootstrap-url.staging.json diff --git a/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.test.tsx b/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.test.tsx index f68100da7..5b9250dd8 100644 --- a/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.test.tsx +++ b/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.test.tsx @@ -108,6 +108,22 @@ describe('MarketplaceSessionConnectDialog', () => { expect(screen.getByRole('button', { name: 'Open in Bitkit' })).toBeInTheDocument(); expect(screen.queryByRole('button', { name: /open in pubky ring/i })).not.toBeInTheDocument(); expect(screen.getByText('Waiting for approval in Bitkit…')).toBeInTheDocument(); + expect(screen.queryByTestId('bootstrap-approval-caption')).not.toBeInTheDocument(); + }); + + it('bootstrap QR carries the caption naming the client Bitkit will show', () => { + view.status = 'awaiting'; + view.authorizationUrl = + 'pubkyauth://signin_grant?caps=%2Fpub%2Fpubky.app%2Fmarketplace-service%2Fv1%2F%3Arw&relay=r&secret=s&cid=marketplace.staging.shop.pubky.app&cpk=k'; + view.isGrantSession = true; + view.grantEnabled = true; + view.requestsGrantBootstrap = true; + + render(); + + expect(screen.getByTestId('bootstrap-approval-caption')).toHaveTextContent( + 'Bitkit shows this request from marketplace.staging.shop.pubky.app, for marketplace purchases only.', + ); }); it('bootstrap creating state confirms with the homeserver', () => { diff --git a/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.tsx b/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.tsx index 6cdf720bd..1556308f1 100644 --- a/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.tsx +++ b/src/components/organisms/Marketplace/MarketplaceSessionConnectDialog.tsx @@ -12,6 +12,7 @@ import { getMarketplaceGrantFlowEnabled } from '@/libs/runtime-config/runtime-co import { GrantSessionRefusal } from '@/molecules/GrantSessionRefusal/GrantSessionRefusal'; import { QrCodeSlot } from '@/molecules/QrCodeSlot/QrCodeSlot'; import { toast } from '@/molecules/Toaster/use-toast'; +import { bootstrapApprovalCaption } from '@/services/marketplace/marketplace-bootstrap-client'; /** * The in-app UX for establishing a marketplace transaction-service session @@ -80,6 +81,8 @@ export function MarketplaceSessionConnectDialog({ const requestsFullGrant = session.requestsFullGrant; const requestsGrantReconnect = session.requestsGrantReconnect; const requestsGrantBootstrap = session.requestsGrantBootstrap; + const bootstrapCaption = + requestsGrantBootstrap && session.authorizationUrl ? bootstrapApprovalCaption(session.authorizationUrl) : null; return ( @@ -156,6 +159,16 @@ export function MarketplaceSessionConnectDialog({ /> + {bootstrapCaption && ( + + {bootstrapCaption} + + )} + {session.status === 'awaiting' && (
diff --git a/src/core/services/marketplace/marketplace-bootstrap-client.test.ts b/src/core/services/marketplace/marketplace-bootstrap-client.test.ts index 1f0b20250..f754f4a9c 100644 --- a/src/core/services/marketplace/marketplace-bootstrap-client.test.ts +++ b/src/core/services/marketplace/marketplace-bootstrap-client.test.ts @@ -4,7 +4,12 @@ import { AuthErrorCode } from '@/libs/error/error.codes'; import { ErrorCategory, ErrorService } from '@/libs/error/error.types'; import { HttpMethod } from '@/libs/http/http.types'; import { HomeserverService } from '@/services/homeserver/homeserver'; -import { beginMarketplaceBootstrapFlow } from './marketplace-bootstrap-client'; +import captured from '@/test/fixtures/auth/marketplace-bootstrap-url.staging.json'; +import { + beginMarketplaceBootstrapFlow, + bootstrapApprovalCaption, + MARKETPLACE_BOOTSTRAP_CAPABILITIES, +} from './marketplace-bootstrap-client'; vi.mock('@/services/homeserver/homeserver', () => ({ HomeserverService: { request: vi.fn(), delete: vi.fn() }, @@ -167,6 +172,36 @@ describe('marketplace purchase bootstrap client', () => { ); }); + it('bootstrap url matches captured fixture', async () => { + const values: Record = { + caps: captured.caps, + relay: 'https://relay.example/inbox', + secret: 's', + cid: captured.cid, + cpk: 'k', + }; + const url = `${captured.scheme}//${captured.host}?${captured.params + .map((name) => `${name}=${encodeURIComponent(values[name])}`) + .join('&')}`; + expect(captured.caps).toBe(MARKETPLACE_BOOTSTRAP_CAPABILITIES); + expect([...new URL(url).searchParams.keys()]).toEqual(captured.params); + + fetchMock + .mockResolvedValueOnce(jsonResponse(challenge(), 201)) + .mockResolvedValueOnce(jsonResponse({ ...verified, authorization_url: url })); + const flow = await beginMarketplaceBootstrapFlow({ pubky: PUBKY }); + + expect(flow.authorizationUrl).toBe(url); + expect(bootstrapApprovalCaption(url)).toBe( + 'Bitkit shows this request from marketplace.staging.shop.pubky.app, for marketplace purchases only.', + ); + }); + + it('shows no caption for a URL that names no client', () => { + expect(bootstrapApprovalCaption('pubkyauth://signin_grant?caps=x')).toBeNull(); + expect(bootstrapApprovalCaption('not a url')).toBeNull(); + }); + it('cancel posts to the bootstrap cancel route once', async () => { fetchMock .mockResolvedValueOnce(jsonResponse(challenge(), 201)) diff --git a/src/core/services/marketplace/marketplace-bootstrap-client.ts b/src/core/services/marketplace/marketplace-bootstrap-client.ts index ecf21aeab..6711c5d2e 100644 --- a/src/core/services/marketplace/marketplace-bootstrap-client.ts +++ b/src/core/services/marketplace/marketplace-bootstrap-client.ts @@ -43,6 +43,20 @@ const pollSchema = z.object({ /** The only capability the marketplace bootstrap grant may ask Bitkit for. */ export const MARKETPLACE_BOOTSTRAP_CAPABILITIES = '/pub/pubky.app/marketplace-service/v1/:rw'; +/** + * What Bitkit shows for the marketplace approval: the client id it names and + * that the request covers purchases only. Null when the URL names no client. + */ +export function bootstrapApprovalCaption(authorizationUrl: string): string | null { + let cid: string | null; + try { + cid = new URL(authorizationUrl).searchParams.get('cid'); + } catch { + return null; + } + return cid ? `Bitkit shows this request from ${cid}, for marketplace purchases only.` : null; +} + function bootstrapFailure(code: string) { return Err.server(ServerErrorCode.SERVICE_UNAVAILABLE, code, { service: ErrorService.Marketplace, diff --git a/src/test/fixtures/auth/marketplace-bootstrap-url.staging.json b/src/test/fixtures/auth/marketplace-bootstrap-url.staging.json new file mode 100644 index 000000000..7f8c5d006 --- /dev/null +++ b/src/test/fixtures/auth/marketplace-bootstrap-url.staging.json @@ -0,0 +1,8 @@ +{ + "source": "Staging marketplace-service createBootstrapFlow through the Shop BFF (pubky-marketplace-staging), captured 2026-09-23; relay, secret and cpk values omitted", + "scheme": "pubkyauth:", + "host": "signin_grant", + "params": ["caps", "relay", "secret", "cid", "cpk"], + "caps": "/pub/pubky.app/marketplace-service/v1/:rw", + "cid": "marketplace.staging.shop.pubky.app" +} From 6c814e5d5debf02bda6a3a8b0e720651d9878474 Mon Sep 17 00:00:00 2001 From: Bitcoin Error Log <18273620+BitcoinErrorLog@users.noreply.github.com> Date: Thu, 24 Sep 2026 08:27:31 +0100 Subject: [PATCH 4/4] test(vrt): Linux baselines for the Bitkit purchase bootstrap scene --- ...-bitkit-bootstrap-desktop-chromium-linux.png | Bin 0 -> 47158 bytes ...t-bitkit-bootstrap-desktop-firefox-linux.png | Bin 0 -> 42251 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/test/vrt/marketplace/__screenshots__/MarketplaceSessionConnect.vrt.test.tsx/session-connect-bitkit-bootstrap-desktop-chromium-linux.png create mode 100644 src/test/vrt/marketplace/__screenshots__/MarketplaceSessionConnect.vrt.test.tsx/session-connect-bitkit-bootstrap-desktop-firefox-linux.png diff --git a/src/test/vrt/marketplace/__screenshots__/MarketplaceSessionConnect.vrt.test.tsx/session-connect-bitkit-bootstrap-desktop-chromium-linux.png b/src/test/vrt/marketplace/__screenshots__/MarketplaceSessionConnect.vrt.test.tsx/session-connect-bitkit-bootstrap-desktop-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..c2960d798de1b1e90d65fd47bb6aae534114581b GIT binary patch literal 47158 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

6it5LN%8}SAPjrTl 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

p@Aab$gf^;AW254oSLha zRqr{V*uiP5Ct5xBatI6-(Q_OzX0ng{OCJzB%sy!pyh`1BhB4fE{!HwbS{sVKs9)-L z_j>+?hFGfVnR}Na)I-zD3w!r!2At~N!f#ggifJy}J6f?-{HD}k&yp_cs-FJZ?1y)H zvLmm@MR3e{8TRrV-Zn9Zmkj^pn((sH-jCX=A3GJkVP!?i>@05AjrC3j@88>e>D}D} z(^98N?Erq{+<~FJb31@VK+G*)9{m$bLnni&3y!0r5S(}~~eM_xW%X1_1jb0}HN+ETr4*-f_ z>`%H`?EtF3M#vBM1Zbks*VEH(+7-fRF@X#Va9+$~Ukn>k0QfXpDPV#YfKZ|BnPKMU z^(C%)H)x=-+y{&aQ}&lV;9R(uj`_JAg?xrALLRJ-UfyM~-S<^58#3fdCC_D$V2TeV6AggOBZ{Cq&WVgkOQ)9F()7VQX1 z@zfx3Bp(74Q}qA}NppYM_P~%3-`)~uI3)nY3`-?949W!CN6BTmq9scM*^NF z=;wA&L7>_IOoJm7d*}nRTg6UlItHji%(6L((RTobQzJn9T3D=92rQVum#9k^dz6A8 z3I4fa*XLmoZJfod+Fs|SgD{}TThCTEYx#OZCf*F{oUKQxD>J_W$#jM%x?X6YV6x>M z#L_D1>taANNkdOapa$-|kb| zhD-3~wtLiu4Z&C-=$Wh3h77iW4%hlT0&tl!D(5uao`HdM;%m&`p1+MN=~TURczygUqmGU#`$FM??s5&*Blsb?%ZVV_N7fs9z-q}x5< zju18XSrJoYMga&{nPTair9=X7M?JRg<@obhCfH2l+-KM<|x3Zbn%P zf$|C7LZvZ2fU1#J%IscjiR3~~Y?@?t%^%~Vj4{2uGIn7~gDa@Yb8*cuwrEO{Vo8!C z$CbkA@@lQMnRrDq71v}iK%avPhKA6_0&;}O^u< zgP7_WvK$d|QNJKNhua?)FGSZcT+sl=Q@u26AYj}fg-NfV*cHN=vhp%8d-3*D)eaM*YKGek(;0=iJ-ve@cWtK_2|M}Yrf0_9Iz{I~V YwP)OaeJm}dcnt@Un;1%n|{rt@_ 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 JGju%qe*nbP{+s{+ literal 0 HcmV?d00001