From a5bc5249cba90c214ab5e247ec9a0ec812acad8d Mon Sep 17 00:00:00 2001 From: Priyagupta108 Date: Tue, 25 Feb 2025 16:01:26 +0530 Subject: [PATCH] Fix self-hosted environment check --- .licenses/npm/undici.dep.yml | Bin 1396 -> 1396 bytes __tests__/utils.test.ts | 52 +++++++++++++++++++++++++++++++++++ dist/cache-save/index.js | 18 +++++++++++- dist/setup/index.js | 32 ++++++++++++++++++--- package-lock.json | 7 +++-- src/installer.ts | 8 ++---- src/utils.ts | 10 +++++++ 7 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 __tests__/utils.test.ts diff --git a/.licenses/npm/undici.dep.yml b/.licenses/npm/undici.dep.yml index cc74a6d2dafa7bc3a78a6bc451e5b57672ac0514..961089c6539002815e4cb02802c7de40242b34f4 100644 GIT binary patch delta 12 Tcmeyu^@VGKJfrDGg%DN%AO!>r delta 12 Tcmeyu^@VGKJfq1*g%DN%AOHjl diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts new file mode 100644 index 0000000..4b40f33 --- /dev/null +++ b/__tests__/utils.test.ts @@ -0,0 +1,52 @@ +import {isSelfHosted} from '../src/utils'; + +describe('utils', () => { + describe('isSelfHosted', () => { + let AGENT_ISSELFHOSTED: string | undefined; + let RUNNER_ENVIRONMENT: string | undefined; + + beforeEach(() => { + AGENT_ISSELFHOSTED = process.env['AGENT_ISSELFHOSTED']; + delete process.env['AGENT_ISSELFHOSTED']; + RUNNER_ENVIRONMENT = process.env['RUNNER_ENVIRONMENT']; + delete process.env['RUNNER_ENVIRONMENT']; + }); + + afterEach(() => { + if (AGENT_ISSELFHOSTED === undefined) { + delete process.env['AGENT_ISSELFHOSTED']; + } else { + process.env['AGENT_ISSELFHOSTED'] = AGENT_ISSELFHOSTED; + } + if (RUNNER_ENVIRONMENT === undefined) { + delete process.env['RUNNER_ENVIRONMENT']; + } else { + process.env['RUNNER_ENVIRONMENT'] = RUNNER_ENVIRONMENT; + } + }); + + it('isSelfHosted should be true if no environment variables set', () => { + expect(isSelfHosted()).toBeTruthy(); + }); + + it('isSelfHosted should be true if environment variable is not set to denote GitHub hosted', () => { + process.env['RUNNER_ENVIRONMENT'] = 'some'; + expect(isSelfHosted()).toBeTruthy(); + }); + + it('isSelfHosted should be true if environment variable set to denote Azure Pipelines self hosted', () => { + process.env['AGENT_ISSELFHOSTED'] = '1'; + expect(isSelfHosted()).toBeTruthy(); + }); + + it('isSelfHosted should be false if environment variable set to denote GitHub hosted', () => { + process.env['RUNNER_ENVIRONMENT'] = 'github-hosted'; + expect(isSelfHosted()).toBeFalsy(); + }); + + it('isSelfHosted should be false if environment variable is not set to denote Azure Pipelines self hosted', () => { + process.env['AGENT_ISSELFHOSTED'] = 'some'; + expect(isSelfHosted()).toBeFalsy(); + }); + }); +}); diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js index b1e02fc..b7d636c 100644 --- a/dist/cache-save/index.js +++ b/dist/cache-save/index.js @@ -68310,6 +68310,14 @@ const { isUint8Array, isArrayBuffer } = __nccwpck_require__(9830) const { File: UndiciFile } = __nccwpck_require__(8511) const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) +let random +try { + const crypto = __nccwpck_require__(6005) + random = (max) => crypto.randomInt(0, max) +} catch { + random = (max) => Math.floor(Math.random(max)) +} + let ReadableStream = globalThis.ReadableStream /** @type {globalThis['File']} */ @@ -68395,7 +68403,7 @@ function extractBody (object, keepalive = false) { // Set source to a copy of the bytes held by object. source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}` const prefix = `--${boundary}\r\nContent-Disposition: form-data` /*! formdata-polyfill. MIT License. Jimmy Wärting */ @@ -89750,6 +89758,14 @@ module.exports = require("net"); /***/ }), +/***/ 6005: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:crypto"); + +/***/ }), + /***/ 5673: /***/ ((module) => { diff --git a/dist/setup/index.js b/dist/setup/index.js index ee9eac7..432128d 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -74598,6 +74598,14 @@ const { isUint8Array, isArrayBuffer } = __nccwpck_require__(9830) const { File: UndiciFile } = __nccwpck_require__(8511) const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) +let random +try { + const crypto = __nccwpck_require__(6005) + random = (max) => crypto.randomInt(0, max) +} catch { + random = (max) => Math.floor(Math.random(max)) +} + let ReadableStream = globalThis.ReadableStream /** @type {globalThis['File']} */ @@ -74683,7 +74691,7 @@ function extractBody (object, keepalive = false) { // Set source to a copy of the bytes held by object. source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}` const prefix = `--${boundary}\r\nContent-Disposition: form-data` /*! formdata-polyfill. MIT License. Jimmy Wärting */ @@ -96121,8 +96129,7 @@ function cacheWindowsDir(extPath, tool, version, arch) { if (os_1.default.platform() !== 'win32') return false; // make sure the action runs in the hosted environment - if (process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' && - process.env['AGENT_ISSELFHOSTED'] === '1') + if ((0, utils_1.isSelfHosted)()) return false; const defaultToolCacheRoot = process.env['RUNNER_TOOL_CACHE']; if (!defaultToolCacheRoot) @@ -96629,12 +96636,21 @@ exports.getArch = getArch; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StableReleaseAlias = void 0; +exports.isSelfHosted = exports.StableReleaseAlias = void 0; var StableReleaseAlias; (function (StableReleaseAlias) { StableReleaseAlias["Stable"] = "stable"; StableReleaseAlias["OldStable"] = "oldstable"; })(StableReleaseAlias || (exports.StableReleaseAlias = StableReleaseAlias = {})); +const isSelfHosted = () => process.env['AGENT_ISSELFHOSTED'] === '1' || + (process.env['AGENT_ISSELFHOSTED'] === undefined && + process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted'); +exports.isSelfHosted = isSelfHosted; +/* the above is simplified from: + process.env['RUNNER_ENVIRONMENT'] === undefined && process.env['AGENT_ISSELFHOSTED'] === '1' + || + process.env['AGENT_ISSELFHOSTED'] === undefined && process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' + */ /***/ }), @@ -96751,6 +96767,14 @@ module.exports = require("net"); /***/ }), +/***/ 6005: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:crypto"); + +/***/ }), + /***/ 5673: /***/ ((module) => { diff --git a/package-lock.json b/package-lock.json index f825bfe..70aa25b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5892,9 +5892,10 @@ } }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", + "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, diff --git a/src/installer.ts b/src/installer.ts index cc0f2dc..fa1c853 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -6,7 +6,7 @@ import * as httpm from '@actions/http-client'; import * as sys from './system'; import fs from 'fs'; import os from 'os'; -import {StableReleaseAlias} from './utils'; +import {StableReleaseAlias, isSelfHosted} from './utils'; const MANIFEST_REPO_OWNER = 'actions'; const MANIFEST_REPO_NAME = 'go-versions'; @@ -180,11 +180,7 @@ async function cacheWindowsDir( if (os.platform() !== 'win32') return false; // make sure the action runs in the hosted environment - if ( - process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' && - process.env['AGENT_ISSELFHOSTED'] === '1' - ) - return false; + if (isSelfHosted()) return false; const defaultToolCacheRoot = process.env['RUNNER_TOOL_CACHE']; if (!defaultToolCacheRoot) return false; diff --git a/src/utils.ts b/src/utils.ts index 79d03bc..a5301be 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -2,3 +2,13 @@ export enum StableReleaseAlias { Stable = 'stable', OldStable = 'oldstable' } + +export const isSelfHosted = (): boolean => + process.env['AGENT_ISSELFHOSTED'] === '1' || + (process.env['AGENT_ISSELFHOSTED'] === undefined && + process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted'); +/* the above is simplified from: + process.env['RUNNER_ENVIRONMENT'] === undefined && process.env['AGENT_ISSELFHOSTED'] === '1' + || + process.env['AGENT_ISSELFHOSTED'] === undefined && process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' + */