Read-only mirror — the public repositories of the Forgejo instance, refreshed every 10 minutes. The live instance (fg.dieschoenewolke.de) is reachable only over the VPN; clone here with https://git.dieschoenewolke.de/git/<owner>/<repo>.git.
summaryrefslogtreecommitdiff
path: root/dist
diff options
context:
space:
mode:
authorAiqiao Yan <55104035+aiqiaoy@users.noreply.github.com>2026-07-07 16:34:58 -0400
committerGitHub <noreply@github.com>2026-07-07 16:34:58 -0400
commit5e10bc06cdae3afdf6b3ca935b8a85b820c48464 (patch)
tree9f7b49de0b077e478357a3c75396b63a4dab1621 /dist
parent97f96ee32be4d5c8097845c86d6d8b15d254bb62 (diff)
backport `allow-unsafe-pr-checkout` to v6 (#2500)
* block checking out fork pr for pull_request_target and workflow_run (#2454) * block checking out fork pr for some events * address copilot and reviewer feedback * run prettier formatting * build * update urls * update readme * update description and url again * edit url one more time * update error wording (#2467)
Diffstat (limited to 'dist')
-rw-r--r--dist/index.js112
1 files changed, 112 insertions, 0 deletions
diff --git a/dist/index.js b/dist/index.js
index 906b59a..5fc2806 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -2023,6 +2023,7 @@ const core = __importStar(__nccwpck_require__(2186));
const fsHelper = __importStar(__nccwpck_require__(7219));
const github = __importStar(__nccwpck_require__(5438));
const path = __importStar(__nccwpck_require__(1017));
+const unsafePrCheckoutHelper = __importStar(__nccwpck_require__(843));
const workflowContextHelper = __importStar(__nccwpck_require__(9568));
function getInputs() {
return __awaiter(this, void 0, void 0, function* () {
@@ -2144,6 +2145,17 @@ function getInputs() {
// Determine the GitHub URL that the repository is being hosted from
result.githubServerUrl = core.getInput('github-server-url');
core.debug(`GitHub Host URL = ${result.githubServerUrl}`);
+ // Allow unsafe PR checkout (opt-in for pull_request_target / workflow_run fork PRs)
+ result.allowUnsafePrCheckout =
+ (core.getInput('allow-unsafe-pr-checkout') || 'false').toUpperCase() ===
+ 'TRUE';
+ core.debug(`allow unsafe PR checkout = ${result.allowUnsafePrCheckout}`);
+ unsafePrCheckoutHelper.assertSafePrCheckout({
+ qualifiedRepository,
+ ref: result.ref,
+ commit: result.commit,
+ allowUnsafePrCheckout: result.allowUnsafePrCheckout
+ });
return result;
});
}
@@ -2284,6 +2296,7 @@ exports.getRefSpecForAllHistory = getRefSpecForAllHistory;
exports.getRefSpec = getRefSpec;
exports.testRef = testRef;
exports.checkCommitInfo = checkCommitInfo;
+exports.fromPayload = fromPayload;
const core = __importStar(__nccwpck_require__(2186));
const github = __importStar(__nccwpck_require__(5438));
const url_helper_1 = __nccwpck_require__(9437);
@@ -2734,6 +2747,105 @@ if (!exports.IsPost) {
/***/ }),
+/***/ 843:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.assertSafePrCheckout = assertSafePrCheckout;
+const github = __importStar(__nccwpck_require__(5438));
+const ref_helper_1 = __nccwpck_require__(8601);
+const PR_REF_PATTERN = /^refs\/pull\/[0-9]+\/(?:head|merge)$/;
+function assertSafePrCheckout(input) {
+ if (input.allowUnsafePrCheckout) {
+ return;
+ }
+ const eventName = github.context.eventName;
+ if (eventName !== 'pull_request_target' && eventName !== 'workflow_run') {
+ return;
+ }
+ const baseRepoId = (0, ref_helper_1.fromPayload)('repository.id');
+ if (typeof baseRepoId !== 'number') {
+ return;
+ }
+ let prHeadRepoId;
+ let prHeadRepoFullName;
+ const prShas = [];
+ if (eventName === 'pull_request_target') {
+ prHeadRepoId = (0, ref_helper_1.fromPayload)('pull_request.head.repo.id');
+ prHeadRepoFullName = (0, ref_helper_1.fromPayload)('pull_request.head.repo.full_name');
+ pushIfSha(prShas, (0, ref_helper_1.fromPayload)('pull_request.head.sha'));
+ pushIfSha(prShas, (0, ref_helper_1.fromPayload)('pull_request.merge_commit_sha'));
+ }
+ else {
+ const wrEvent = (0, ref_helper_1.fromPayload)('workflow_run.event');
+ if (typeof wrEvent !== 'string' || !wrEvent.startsWith('pull_request')) {
+ return;
+ }
+ prHeadRepoId = (0, ref_helper_1.fromPayload)('workflow_run.head_repository.id');
+ prHeadRepoFullName = (0, ref_helper_1.fromPayload)('workflow_run.head_repository.full_name');
+ pushIfSha(prShas, (0, ref_helper_1.fromPayload)('workflow_run.head_commit.id'));
+ // For `pull_request_target`-triggered workflow_run, `head_sha` is the base
+ // default branch SHA (not the PR head)
+ if (wrEvent !== 'pull_request_target') {
+ pushIfSha(prShas, (0, ref_helper_1.fromPayload)('workflow_run.head_sha'));
+ }
+ }
+ // (A) Fork PR?
+ if (typeof prHeadRepoId !== 'number' || prHeadRepoId === baseRepoId) {
+ return;
+ }
+ // (B) We cannot check for all fork PR refs so check to see
+ // if the resolved input points to the fork PR sha we have in the payload
+ const repositoryMatchesPrHead = typeof prHeadRepoFullName === 'string' &&
+ input.qualifiedRepository.toLowerCase() === prHeadRepoFullName.toLowerCase();
+ const refMatchesPullPattern = PR_REF_PATTERN.test(input.ref);
+ const commitMatchesPrHeadSha = !!input.commit && prShas.includes(input.commit.toLowerCase());
+ if (!repositoryMatchesPrHead &&
+ !refMatchesPullPattern &&
+ !commitMatchesPrHeadSha) {
+ return;
+ }
+ throw new Error(`Refusing to check out fork pull request code from a '${eventName}' workflow. ` +
+ `This workflow runs with the base repository's GITHUB_TOKEN, secrets, default-branch ` +
+ `cache scope, and runner access. Fetching and executing a fork's code in that trusted ` +
+ `context commonly leads to "pwn request" vulnerabilities. To opt in, review the risks ` +
+ `at https://gh.io/securely-using-pull_request_target and set 'allow-unsafe-pr-checkout: true' ` +
+ `on the actions/checkout step.`);
+}
+function pushIfSha(target, value) {
+ if (typeof value === 'string' && value.length > 0) {
+ target.push(value.toLowerCase());
+ }
+}
+
+
+/***/ }),
+
/***/ 9437:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {