From 0e6df420240e6af824e5e50c9a78686889a91e51 Mon Sep 17 00:00:00 2001 From: Robert Brignull <robertbrignull@gmail.com> Date: Tue, 5 May 2020 17:32:58 +0100 Subject: [PATCH] add tests for config-utils --- lib/config-utils.js | 121 +++++++++++------ lib/config-utils.js.map | 2 +- lib/config-utils.test.js | 224 +++++++++++++++++++++++++++++++ lib/config-utils.test.js.map | 1 + lib/util.js | 3 +- lib/util.js.map | 2 +- package.json | 2 +- src/config-utils.test.ts | 253 +++++++++++++++++++++++++++++++++++ src/config-utils.ts | 127 ++++++++++++------ src/util.ts | 5 +- 10 files changed, 647 insertions(+), 93 deletions(-) create mode 100644 lib/config-utils.test.js create mode 100644 lib/config-utils.test.js.map create mode 100644 src/config-utils.test.ts diff --git a/lib/config-utils.js b/lib/config-utils.js index 487ce66c2..13882c5a0 100644 --- a/lib/config-utils.js +++ b/lib/config-utils.js @@ -12,6 +12,7 @@ const io = __importStar(require("@actions/io")); const fs = __importStar(require("fs")); const yaml = __importStar(require("js-yaml")); const path = __importStar(require("path")); +const util = __importStar(require("./util")); class ExternalQuery { constructor(repository, ref) { this.path = ''; @@ -32,27 +33,33 @@ class Config { addQuery(queryUses) { // The logic for parsing the string is based on what actions does for // parsing the 'uses' actions in the workflow file + queryUses = queryUses.trim(); if (queryUses === "") { - throw '"uses" value for queries cannot be blank'; + throw new Error(getQueryUsesBlank()); } + // Check for the local path case before we start trying to parse the repository name if (queryUses.startsWith("./")) { this.additionalQueries.push(queryUses.slice(2)); return; } let tok = queryUses.split('@'); if (tok.length !== 2) { - throw '"uses" value for queries must be a path, or owner/repo@ref \n Found: ' + queryUses; + throw new Error(getQueryUsesIncorrect(queryUses)); } const ref = tok[1]; tok = tok[0].split('/'); // The first token is the owner // The second token is the repo // The rest is a path, if there is more than one token combine them to form the full path + if (tok.length < 2) { + throw new Error(getQueryUsesIncorrect(queryUses)); + } if (tok.length > 3) { tok = [tok[0], tok[1], tok.slice(2).join('/')]; } - if (tok.length < 2) { - throw '"uses" value for queries must be a path, or owner/repo@ref \n Found: ' + queryUses; + // Check none of the parts of the repository name are empty + if (tok[0].trim() === '' || tok[1].trim() === '') { + throw new Error(getQueryUsesIncorrect(queryUses)); } let external = new ExternalQuery(tok[0] + '/' + tok[1], ref); if (tok.length === 3) { @@ -62,62 +69,90 @@ class Config { } } exports.Config = Config; -const configFolder = process.env['RUNNER_WORKSPACE'] || '/tmp/codeql-action'; +function getQueryUsesBlank() { + return '"uses" value for queries cannot be blank'; +} +exports.getQueryUsesBlank = getQueryUsesBlank; +function getQueryUsesIncorrect(queryUses) { + return '"uses" value for queries must be a path, or owner/repo@ref \n Found: ' + queryUses; +} +exports.getQueryUsesIncorrect = getQueryUsesIncorrect; +function getConfigFileOutsideWorkspaceErrorMessage(configFile) { + return 'The configuration file "' + configFile + '" is outside of the workspace'; +} +exports.getConfigFileOutsideWorkspaceErrorMessage = getConfigFileOutsideWorkspaceErrorMessage; +function getConfigFileDoesNotExistErrorMessage(configFile) { + return 'The configuration file "' + configFile + '" does not exist'; +} +exports.getConfigFileDoesNotExistErrorMessage = getConfigFileDoesNotExistErrorMessage; function initConfig() { - const configFile = core.getInput('config-file'); + let configFile = core.getInput('config-file'); const config = new Config(); // If no config file was provided create an empty one if (configFile === '') { core.debug('No configuration file was provided'); return config; } - try { - const parsedYAML = yaml.safeLoad(fs.readFileSync(configFile, 'utf8')); - if (parsedYAML.name && typeof parsedYAML.name === "string") { - config.name = parsedYAML.name; - } - if (parsedYAML['disable-default-queries'] && typeof parsedYAML['disable-default-queries'] === "boolean") { - config.disableDefaultQueries = parsedYAML['disable-default-queries']; - } - const queries = parsedYAML.queries; - if (queries && queries instanceof Array) { - queries.forEach(query => { - if (query.uses && typeof query.uses === "string") { - config.addQuery(query.uses); - } - }); - } - const pathsIgnore = parsedYAML['paths-ignore']; - if (pathsIgnore && pathsIgnore instanceof Array) { - pathsIgnore.forEach(path => { - if (typeof path === "string") { - config.pathsIgnore.push(path); - } - }); - } - const paths = parsedYAML.paths; - if (paths && paths instanceof Array) { - paths.forEach(path => { - if (typeof path === "string") { - config.paths.push(path); - } - }); - } + // Treat the config file as relative to the workspace + const workspacePath = util.getRequiredEnvParam('GITHUB_WORKSPACE'); + configFile = path.resolve(workspacePath, configFile); + // Error if the config file is now outside of the workspace + if (!(configFile + path.sep).startsWith(workspacePath + path.sep)) { + throw new Error(getConfigFileOutsideWorkspaceErrorMessage(configFile)); + } + // Error if the file does not exist + if (!fs.existsSync(configFile)) { + throw new Error(getConfigFileDoesNotExistErrorMessage(configFile)); + } + const parsedYAML = yaml.safeLoad(fs.readFileSync(configFile, 'utf8')); + if (parsedYAML.name && typeof parsedYAML.name === "string") { + config.name = parsedYAML.name; + } + if (parsedYAML['disable-default-queries'] && typeof parsedYAML['disable-default-queries'] === "boolean") { + config.disableDefaultQueries = parsedYAML['disable-default-queries']; } - catch (err) { - core.setFailed(err); + const queries = parsedYAML.queries; + if (queries && queries instanceof Array) { + queries.forEach(query => { + if (typeof query.uses === "string") { + config.addQuery(query.uses); + } + }); + } + const pathsIgnore = parsedYAML['paths-ignore']; + if (pathsIgnore && pathsIgnore instanceof Array) { + pathsIgnore.forEach(path => { + if (typeof path === "string") { + config.pathsIgnore.push(path); + } + }); + } + const paths = parsedYAML.paths; + if (paths && paths instanceof Array) { + paths.forEach(path => { + if (typeof path === "string") { + config.paths.push(path); + } + }); } return config; } +function getConfigFolder() { + return util.getRequiredEnvParam('RUNNER_WORKSPACE'); +} +function getConfigFile() { + return path.join(getConfigFolder(), 'config'); +} +exports.getConfigFile = getConfigFile; async function saveConfig(config) { const configString = JSON.stringify(config); - await io.mkdirP(configFolder); - fs.writeFileSync(path.join(configFolder, 'config'), configString, 'utf8'); + await io.mkdirP(getConfigFolder()); + fs.writeFileSync(getConfigFile(), configString, 'utf8'); core.debug('Saved config:'); core.debug(configString); } async function loadConfig() { - const configFile = path.join(configFolder, 'config'); + const configFile = getConfigFile(); if (fs.existsSync(configFile)) { const configString = fs.readFileSync(configFile, 'utf8'); core.debug('Loaded config:'); diff --git a/lib/config-utils.js.map b/lib/config-utils.js.map index 03a4f653f..46cc1aaa6 100644 --- a/lib/config-utils.js.map +++ b/lib/config-utils.js.map @@ -1 +1 @@ -{"version":3,"file":"config-utils.js","sourceRoot":"","sources":["../src/config-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"config-utils.js","sourceRoot":"","sources":["../src/config-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/config-utils.test.js b/lib/config-utils.test.js new file mode 100644 index 000000000..24197d574 --- /dev/null +++ b/lib/config-utils.test.js @@ -0,0 +1,224 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ava_1 = __importDefault(require("ava")); +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const configUtils = __importStar(require("./config-utils")); +const util = __importStar(require("./util")); +function setInput(name, value) { + // Transformation copied from + // https://github.com/actions/toolkit/blob/05e39f551d33e1688f61b209ab5cdd335198f1b8/packages/core/src/core.ts#L69 + const envVar = `INPUT_${name.replace(/ /g, '_').toUpperCase()}`; + if (value !== undefined) { + process.env[envVar] = value; + } + else { + delete process.env[envVar]; + } +} +ava_1.default("load empty config", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + setInput('config-file', undefined); + const config = await configUtils.loadConfig(); + t.deepEqual(config, new configUtils.Config()); + }); +}); +ava_1.default("loading config saves config", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + const configFile = configUtils.getConfigFile(); + // Sanity check the saved config file does not already exist + t.false(fs.existsSync(configFile)); + const config = await configUtils.loadConfig(); + // The saved config file should now exist + t.true(fs.existsSync(configFile)); + // And the contents should parse correctly to the config that was returned + t.deepEqual(fs.readFileSync(configFile, 'utf8'), JSON.stringify(config)); + }); +}); +ava_1.default("load input outside of workspace", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + setInput('config-file', '../input'); + try { + await configUtils.loadConfig(); + throw new Error('loadConfig did not throw error'); + } + catch (err) { + t.deepEqual(err, new Error(configUtils.getConfigFileOutsideWorkspaceErrorMessage(path.join(tmpDir, '../input')))); + } + }); +}); +ava_1.default("load non-existent input", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + t.false(fs.existsSync(path.join(tmpDir, 'input'))); + setInput('config-file', 'input'); + try { + await configUtils.loadConfig(); + throw new Error('loadConfig did not throw error'); + } + catch (err) { + t.deepEqual(err, new Error(configUtils.getConfigFileDoesNotExistErrorMessage(path.join(tmpDir, 'input')))); + } + }); +}); +ava_1.default("load non-empty input", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + // Just create a generic config object with non-default values for all fields + const inputFileContents = ` + name: my config + disable-default-queries: true + queries: + - uses: ./foo + - uses: foo/bar@dev + paths-ignore: + - a + - b + paths: + - c/d`; + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.name = 'my config'; + expectedConfig.disableDefaultQueries = true; + expectedConfig.additionalQueries.push('foo'); + expectedConfig.externalQueries = [new configUtils.ExternalQuery('foo/bar', 'dev')]; + expectedConfig.pathsIgnore = ['a', 'b']; + expectedConfig.paths = ['c/d']; + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + const actualConfig = await configUtils.loadConfig(); + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); +ava_1.default("load partially invalid input", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + // The valid parts of this config should be parsed correctly. + // The invalid parts should be ignored and left as the default values. + const inputFileContents = ` + name: + - foo: bar + disable-default-queries: 42 + queries: + - name: foo/bar + uses: foo/bar@dev + paths-ignore: + - a + - b + paths: + - c/d`; + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.externalQueries = [new configUtils.ExternalQuery('foo/bar', 'dev')]; + expectedConfig.pathsIgnore = ['a', 'b']; + expectedConfig.paths = ['c/d']; + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + const actualConfig = await configUtils.loadConfig(); + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); +ava_1.default("load invalid input - top level entries", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + // Replace the arrays with strings or numbers. + // The invalid parts should be ignored and left as the default values. + const inputFileContents = ` + name: my config + disable-default-queries: true + queries: foo + paths-ignore: bar + paths: 123`; + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.name = 'my config'; + expectedConfig.disableDefaultQueries = true; + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + const actualConfig = await configUtils.loadConfig(); + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); +ava_1.default("load invalid input - queries field type", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + // Invalid contents of the "queries" array. + // The invalid parts should be ignored and left as the default values. + const inputFileContents = ` + name: my config + disable-default-queries: true + queries: + - name: foo + uses: + - hello: world + - name: bar + uses: github/bar@master`; + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.name = 'my config'; + expectedConfig.disableDefaultQueries = true; + expectedConfig.externalQueries.push(new configUtils.ExternalQuery("github/bar", "master")); + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + const actualConfig = await configUtils.loadConfig(); + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); +// Various "uses" fields, and the errors they should produce +const testInputs = { + "''": configUtils.getQueryUsesBlank(), + "foo/bar": configUtils.getQueryUsesIncorrect("foo/bar"), + "foo/bar@v1@v2": configUtils.getQueryUsesIncorrect("foo/bar@v1@v2"), + "foo@master": configUtils.getQueryUsesIncorrect("foo@master"), + "https://github.com/foo/bar@master": configUtils.getQueryUsesIncorrect("https://github.com/foo/bar@master") +}; +for (const [input, result] of Object.entries(testInputs)) { + ava_1.default("load invalid input - queries uses \"" + input + "\"", async (t) => { + return await util.withTmpDir(async (tmpDir) => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + // Invalid contents of a "queries.uses" field. + // Should fail with the expected error message + const inputFileContents = ` + name: my config + queries: + - name: foo + uses: ` + input; + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + try { + await configUtils.loadConfig(); + throw new Error('loadConfig did not throw error'); + } + catch (err) { + t.deepEqual(err, new Error(result)); + } + }); + }); +} +//# sourceMappingURL=config-utils.test.js.map \ No newline at end of file diff --git a/lib/config-utils.test.js.map b/lib/config-utils.test.js.map new file mode 100644 index 000000000..6aa5421e0 --- /dev/null +++ b/lib/config-utils.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"config-utils.test.js","sourceRoot":"","sources":["../src/config-utils.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/util.js b/lib/util.js index 0e0974a68..16cd362f9 100644 --- a/lib/util.js +++ b/lib/util.js @@ -337,8 +337,9 @@ exports.getToolNames = getToolNames; // Mostly intended for use within tests. async function withTmpDir(body) { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codeql-action-')); - await body(tmpDir); + const result = await body(tmpDir); fs.rmdirSync(tmpDir, { recursive: true }); + return result; } exports.withTmpDir = withTmpDir; //# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/lib/util.js.map b/lib/util.js.map index d2b9690c1..6e83d9e68 100644 --- a/lib/util.js.map +++ b/lib/util.js.map @@ -1 +1 @@ -{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 84b645ef1..c82926125 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "CodeQL action", "scripts": { "build": "tsc", - "test": "ava src/**", + "test": "ava src/** --serial", "lint": "tslint -p . -c tslint.json 'src/**/*.ts'", "removeNPMAbsolutePaths": "removeNPMAbsolutePaths . --force" }, diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts new file mode 100644 index 000000000..779851118 --- /dev/null +++ b/src/config-utils.test.ts @@ -0,0 +1,253 @@ +import test from 'ava'; +import * as fs from 'fs'; +import * as path from 'path'; + +import * as configUtils from './config-utils'; +import * as util from './util'; + +function setInput(name: string, value: string | undefined) { + // Transformation copied from + // https://github.com/actions/toolkit/blob/05e39f551d33e1688f61b209ab5cdd335198f1b8/packages/core/src/core.ts#L69 + const envVar = `INPUT_${name.replace(/ /g, '_').toUpperCase()}`; + if (value !== undefined) { + process.env[envVar] = value; + } else { + delete process.env[envVar]; + } +} + +test("load empty config", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + setInput('config-file', undefined); + + const config = await configUtils.loadConfig(); + + t.deepEqual(config, new configUtils.Config()); + }); +}); + +test("loading config saves config", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + const configFile = configUtils.getConfigFile(); + // Sanity check the saved config file does not already exist + t.false(fs.existsSync(configFile)); + + const config = await configUtils.loadConfig(); + + // The saved config file should now exist + t.true(fs.existsSync(configFile)); + + // And the contents should parse correctly to the config that was returned + t.deepEqual(fs.readFileSync(configFile, 'utf8'), JSON.stringify(config)); + }); +}); + +test("load input outside of workspace", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + setInput('config-file', '../input'); + + try { + await configUtils.loadConfig(); + throw new Error('loadConfig did not throw error'); + } catch (err) { + t.deepEqual(err, new Error(configUtils.getConfigFileOutsideWorkspaceErrorMessage(path.join(tmpDir, '../input')))); + } + }); +}); + +test("load non-existent input", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + t.false(fs.existsSync(path.join(tmpDir, 'input'))); + setInput('config-file', 'input'); + + try { + await configUtils.loadConfig(); + throw new Error('loadConfig did not throw error'); + } catch (err) { + t.deepEqual(err, new Error(configUtils.getConfigFileDoesNotExistErrorMessage(path.join(tmpDir, 'input')))); + } + }); +}); + +test("load non-empty input", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + // Just create a generic config object with non-default values for all fields + const inputFileContents = ` + name: my config + disable-default-queries: true + queries: + - uses: ./foo + - uses: foo/bar@dev + paths-ignore: + - a + - b + paths: + - c/d`; + + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.name = 'my config'; + expectedConfig.disableDefaultQueries = true; + expectedConfig.additionalQueries.push('foo'); + expectedConfig.externalQueries = [new configUtils.ExternalQuery('foo/bar', 'dev')]; + expectedConfig.pathsIgnore = ['a', 'b']; + expectedConfig.paths = ['c/d']; + + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + + const actualConfig = await configUtils.loadConfig(); + + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); + +test("load partially invalid input", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + // The valid parts of this config should be parsed correctly. + // The invalid parts should be ignored and left as the default values. + const inputFileContents = ` + name: + - foo: bar + disable-default-queries: 42 + queries: + - name: foo/bar + uses: foo/bar@dev + paths-ignore: + - a + - b + paths: + - c/d`; + + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.externalQueries = [new configUtils.ExternalQuery('foo/bar', 'dev')]; + expectedConfig.pathsIgnore = ['a', 'b']; + expectedConfig.paths = ['c/d']; + + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + + const actualConfig = await configUtils.loadConfig(); + + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); + +test("load invalid input - top level entries", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + // Replace the arrays with strings or numbers. + // The invalid parts should be ignored and left as the default values. + const inputFileContents = ` + name: my config + disable-default-queries: true + queries: foo + paths-ignore: bar + paths: 123`; + + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.name = 'my config'; + expectedConfig.disableDefaultQueries = true; + + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + + const actualConfig = await configUtils.loadConfig(); + + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); + +test("load invalid input - queries field type", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + // Invalid contents of the "queries" array. + // The invalid parts should be ignored and left as the default values. + const inputFileContents = ` + name: my config + disable-default-queries: true + queries: + - name: foo + uses: + - hello: world + - name: bar + uses: github/bar@master`; + + // And the config we expect it to parse to + const expectedConfig = new configUtils.Config(); + expectedConfig.name = 'my config'; + expectedConfig.disableDefaultQueries = true; + expectedConfig.externalQueries.push(new configUtils.ExternalQuery("github/bar", "master")); + + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + + const actualConfig = await configUtils.loadConfig(); + + // Should exactly equal the object we constructed earlier + t.deepEqual(actualConfig, expectedConfig); + }); +}); + +// Various "uses" fields, and the errors they should produce +const testInputs = { + "''": configUtils.getQueryUsesBlank(), + "foo/bar": configUtils.getQueryUsesIncorrect("foo/bar"), + "foo/bar@v1@v2": configUtils.getQueryUsesIncorrect("foo/bar@v1@v2"), + "foo@master": configUtils.getQueryUsesIncorrect("foo@master"), + "https://github.com/foo/bar@master": configUtils.getQueryUsesIncorrect("https://github.com/foo/bar@master") +}; + +for (const [input, result] of Object.entries(testInputs)) { + test("load invalid input - queries uses \"" + input + "\"", async t => { + return await util.withTmpDir(async tmpDir => { + process.env['RUNNER_WORKSPACE'] = tmpDir; + process.env['GITHUB_WORKSPACE'] = tmpDir; + + // Invalid contents of a "queries.uses" field. + // Should fail with the expected error message + const inputFileContents = ` + name: my config + queries: + - name: foo + uses: ` + input; + + fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); + setInput('config-file', 'input'); + + try { + await configUtils.loadConfig(); + throw new Error('loadConfig did not throw error'); + } catch (err) { + t.deepEqual(err, new Error(result)); + } + }); + }); +} diff --git a/src/config-utils.ts b/src/config-utils.ts index 2c31495cd..ab2a67bb4 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -4,6 +4,8 @@ import * as fs from 'fs'; import * as yaml from 'js-yaml'; import * as path from 'path'; +import * as util from './util'; + export class ExternalQuery { public repository: string; public ref: string; @@ -26,11 +28,12 @@ export class Config { public addQuery(queryUses: string) { // The logic for parsing the string is based on what actions does for // parsing the 'uses' actions in the workflow file - + queryUses = queryUses.trim(); if (queryUses === "") { - throw '"uses" value for queries cannot be blank'; + throw new Error(getQueryUsesBlank()); } + // Check for the local path case before we start trying to parse the repository name if (queryUses.startsWith("./")) { this.additionalQueries.push(queryUses.slice(2)); return; @@ -38,7 +41,7 @@ export class Config { let tok = queryUses.split('@'); if (tok.length !== 2) { - throw '"uses" value for queries must be a path, or owner/repo@ref \n Found: ' + queryUses; + throw new Error(getQueryUsesIncorrect(queryUses)); } const ref = tok[1]; @@ -46,12 +49,16 @@ export class Config { // The first token is the owner // The second token is the repo // The rest is a path, if there is more than one token combine them to form the full path + if (tok.length < 2) { + throw new Error(getQueryUsesIncorrect(queryUses)); + } if (tok.length > 3) { tok = [tok[0], tok[1], tok.slice(2).join('/')]; } - if (tok.length < 2) { - throw '"uses" value for queries must be a path, or owner/repo@ref \n Found: ' + queryUses; + // Check none of the parts of the repository name are empty + if (tok[0].trim() === '' || tok[1].trim() === '') { + throw new Error(getQueryUsesIncorrect(queryUses)); } let external = new ExternalQuery(tok[0] + '/' + tok[1], ref); @@ -62,10 +69,24 @@ export class Config { } } -const configFolder = process.env['RUNNER_WORKSPACE'] || '/tmp/codeql-action'; +export function getQueryUsesBlank(): string { + return '"uses" value for queries cannot be blank'; +} + +export function getQueryUsesIncorrect(queryUses: string): string { + return '"uses" value for queries must be a path, or owner/repo@ref \n Found: ' + queryUses; +} + +export function getConfigFileOutsideWorkspaceErrorMessage(configFile: string): string { + return 'The configuration file "' + configFile + '" is outside of the workspace'; +} + +export function getConfigFileDoesNotExistErrorMessage(configFile: string): string { + return 'The configuration file "' + configFile + '" does not exist'; +} function initConfig(): Config { - const configFile = core.getInput('config-file'); + let configFile = core.getInput('config-file'); const config = new Config(); @@ -75,60 +96,78 @@ function initConfig(): Config { return config; } - try { - const parsedYAML = yaml.safeLoad(fs.readFileSync(configFile, 'utf8')); + // Treat the config file as relative to the workspace + const workspacePath = util.getRequiredEnvParam('GITHUB_WORKSPACE'); + configFile = path.resolve(workspacePath, configFile); - if (parsedYAML.name && typeof parsedYAML.name === "string") { - config.name = parsedYAML.name; - } + // Error if the config file is now outside of the workspace + if (!(configFile + path.sep).startsWith(workspacePath + path.sep)) { + throw new Error(getConfigFileOutsideWorkspaceErrorMessage(configFile)); + } - if (parsedYAML['disable-default-queries'] && typeof parsedYAML['disable-default-queries'] === "boolean") { - config.disableDefaultQueries = parsedYAML['disable-default-queries']; - } + // Error if the file does not exist + if (!fs.existsSync(configFile)) { + throw new Error(getConfigFileDoesNotExistErrorMessage(configFile)); + } - const queries = parsedYAML.queries; - if (queries && queries instanceof Array) { - queries.forEach(query => { - if (query.uses && typeof query.uses === "string") { - config.addQuery(query.uses); - } - }); - } + const parsedYAML = yaml.safeLoad(fs.readFileSync(configFile, 'utf8')); - const pathsIgnore = parsedYAML['paths-ignore']; - if (pathsIgnore && pathsIgnore instanceof Array) { - pathsIgnore.forEach(path => { - if (typeof path === "string") { - config.pathsIgnore.push(path); - } - }); - } + if (parsedYAML.name && typeof parsedYAML.name === "string") { + config.name = parsedYAML.name; + } - const paths = parsedYAML.paths; - if (paths && paths instanceof Array) { - paths.forEach(path => { - if (typeof path === "string") { - config.paths.push(path); - } - }); - } - } catch (err) { - core.setFailed(err); + if (parsedYAML['disable-default-queries'] && typeof parsedYAML['disable-default-queries'] === "boolean") { + config.disableDefaultQueries = parsedYAML['disable-default-queries']; + } + + const queries = parsedYAML.queries; + if (queries && queries instanceof Array) { + queries.forEach(query => { + if (typeof query.uses === "string") { + config.addQuery(query.uses); + } + }); + } + + const pathsIgnore = parsedYAML['paths-ignore']; + if (pathsIgnore && pathsIgnore instanceof Array) { + pathsIgnore.forEach(path => { + if (typeof path === "string") { + config.pathsIgnore.push(path); + } + }); + } + + const paths = parsedYAML.paths; + if (paths && paths instanceof Array) { + paths.forEach(path => { + if (typeof path === "string") { + config.paths.push(path); + } + }); } return config; } +function getConfigFolder(): string { + return util.getRequiredEnvParam('RUNNER_WORKSPACE'); +} + +export function getConfigFile(): string { + return path.join(getConfigFolder(), 'config'); +} + async function saveConfig(config: Config) { const configString = JSON.stringify(config); - await io.mkdirP(configFolder); - fs.writeFileSync(path.join(configFolder, 'config'), configString, 'utf8'); + await io.mkdirP(getConfigFolder()); + fs.writeFileSync(getConfigFile(), configString, 'utf8'); core.debug('Saved config:'); core.debug(configString); } export async function loadConfig(): Promise<Config> { - const configFile = path.join(configFolder, 'config'); + const configFile = getConfigFile(); if (fs.existsSync(configFile)) { const configString = fs.readFileSync(configFile, 'utf8'); core.debug('Loaded config:'); diff --git a/src/util.ts b/src/util.ts index bde0fa0e3..a236216b8 100644 --- a/src/util.ts +++ b/src/util.ts @@ -377,8 +377,9 @@ export function getToolNames(sarifContents: string): string[] { // Creates a random temporary directory, runs the given body, and then deletes the directory. // Mostly intended for use within tests. -export async function withTmpDir(body: (tmpDir: string) => Promise<void>) { +export async function withTmpDir<T>(body: (tmpDir: string) => Promise<T>): Promise<T> { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codeql-action-')); - await body(tmpDir); + const result = await body(tmpDir); fs.rmdirSync(tmpDir, { recursive: true }); + return result; }