2828 *
2929 * Environment (actions):
3030 * GITHUB_TOKEN - Required (issues:write + pull-requests:write).
31+ * WORKFLOW_RUN_HEAD_OWNER - Required. workflow_run.head_repository.owner.login
32+ * WORKFLOW_RUN_HEAD_REPO_ID - Required. workflow_run.head_repository.id
33+ * WORKFLOW_RUN_HEAD_BRANCH - Required. workflow_run.head_branch
34+ * WORKFLOW_RUN_HEAD_SHA - Required. workflow_run.head_sha
3135 */
3236import * as fs from "node:fs" ;
3337import * as util from "node:util" ;
@@ -39,6 +43,7 @@ import {
3943 createPrComment ,
4044 getPrComments ,
4145 getPrFiles ,
46+ getWorkflowRunPrNumber ,
4247 removePrLabel ,
4348 updatePrComment ,
4449} from "./utils/github.ts" ;
@@ -344,7 +349,9 @@ async function runActions() {
344349 return ;
345350 }
346351
347- let { prNumber, actions } = JSON . parse ( fs . readFileSync ( filename , "utf8" ) ) as {
352+ let { prNumber : artifactPrNumber , actions } = JSON . parse (
353+ fs . readFileSync ( filename , "utf8" ) ,
354+ ) as {
348355 prNumber : number ;
349356 actions : Action [ ] ;
350357 } ;
@@ -354,6 +361,25 @@ async function runActions() {
354361 return ;
355362 }
356363
364+ let headRepositoryId = Number ( requireEnv ( "WORKFLOW_RUN_HEAD_REPO_ID" ) ) ;
365+ if ( ! Number . isSafeInteger ( headRepositoryId ) || headRepositoryId <= 0 ) {
366+ throw new Error ( "WORKFLOW_RUN_HEAD_REPO_ID must be a positive integer" ) ;
367+ }
368+
369+ // The artifact is PR-controlled. Resolve its only permitted target from the
370+ // trusted workflow_run event and reject stale or cross-PR instructions.
371+ let prNumber = await getWorkflowRunPrNumber ( {
372+ headOwner : requireEnv ( "WORKFLOW_RUN_HEAD_OWNER" ) ,
373+ headRepositoryId,
374+ headBranch : requireEnv ( "WORKFLOW_RUN_HEAD_BRANCH" ) ,
375+ headSha : requireEnv ( "WORKFLOW_RUN_HEAD_SHA" ) ,
376+ } ) ;
377+ if ( artifactPrNumber !== prNumber ) {
378+ throw new Error (
379+ `Artifact targets PR #${ String ( artifactPrNumber ) } , but workflow run belongs to PR #${ prNumber } ` ,
380+ ) ;
381+ }
382+
357383 console . log ( actions ) ;
358384
359385 for ( let action of actions ) {
0 commit comments