From af9be460e4ec9b7fbae0413b7e05c43bc608c935 Mon Sep 17 00:00:00 2001 From: Fraser Davidson Date: Fri, 6 Sep 2024 10:59:13 +0100 Subject: [PATCH] v0.0.6 release (#17) * Add support for workload identity federation authentication (#15) * Switch to releases CDN (#16) --- .gitattributes | 1 + CHANGELOG.md | 8 + MAINTAINERS.md | 6 +- README.rst | 18 +- images/extension-icon.png | Bin 10750 -> 16916 bytes images/large-extension-icon.png | Bin 41065 -> 30334 bytes overview.md | 7 +- package-lock.json | 42 +- package.json | 10 +- .../InstallSheriffCLIV0/package-lock.json | 4 +- .../InstallSheriffCLIV0/package.json | 4 +- .../InstallSheriffCLIV0/src/index.js | 6 +- .../InstallSheriffCLIV0/task.json | 4 +- .../SheriffApplyV0/package-lock.json | 448 ++++++++++++++---- .../SheriffApply/SheriffApplyV0/package.json | 8 +- .../SheriffApply/SheriffApplyV0/src/index.js | 39 +- tasks/SheriffApply/SheriffApplyV0/task.json | 4 +- .../SheriffPlanV0/package-lock.json | 448 ++++++++++++++---- tasks/SheriffPlan/SheriffPlanV0/package.json | 8 +- tasks/SheriffPlan/SheriffPlanV0/src/index.js | 39 +- tasks/SheriffPlan/SheriffPlanV0/task.json | 4 +- vss-extension.json | 8 +- 22 files changed, 868 insertions(+), 248 deletions(-) create mode 100755 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/CHANGELOG.md b/CHANGELOG.md index 4414389..3ee7b01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Sheriff Azure DevOps Extension Changelog +## 0.0.7 + +* `InstallSheriffCLI` task updated to download Sheriff from releases.frontierhq.com. + +## 0.0.6 + +* `SheriffPlan` and `SheriffApply` tasks updated to support workload identity federation authentication. + ## 0.0.5 * `InstallSheriffCLI` task updated to download Sheriff from Azure Storage. diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 47088cc..0f8f4c1 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -4,6 +4,6 @@ | Maintainer | GitHub ID | Affiliation | | --------------- | --------- | ----------- | -| Craig Anderson | [cda0](https://github.com/cda0) | [Frontier](https://github.com/gofrontier-com/) | -| Fraser Davidson | [frasdav](https://github.com/frasdav) | [Frontier](https://github.com/gofrontier-com/) | -| Neil Cowlin | [n-cow](https://github.com/n-cow) | [Frontier](https://github.com/gofrontier-com/) | +| Craig Anderson | [cda0](https://github.com/cda0) | [Frontier](https://github.com/frontierhq/) | +| Fraser Davidson | [frasdav](https://github.com/frasdav) | [Frontier](https://github.com/frontierhq/) | +| Neil Cowlin | [n-cow](https://github.com/n-cow) | [Frontier](https://github.com/frontierhq/) | diff --git a/README.rst b/README.rst index 2115772..90157c3 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ -.. image:: https://github.com/gofrontier-com/sheriff-azure-devops-extension/actions/workflows/ci.yml/badge.svg - :target: https://github.com/gofrontier-com/sheriff-azure-devops-extension/actions/workflows/ci.yml -.. image:: https://github.com/gofrontier-com/sheriff-azure-devops-extension/actions/workflows/release.yml/badge.svg - :target: https://github.com/gofrontier-com/sheriff-azure-devops-extension/actions/workflows/release.yml +.. image:: https://github.com/frontierhq/sheriff-azure-devops-extension/actions/workflows/ci.yml/badge.svg + :target: https://github.com/frontierhq/sheriff-azure-devops-extension/actions/workflows/ci.yml +.. image:: https://github.com/frontierhq/sheriff-azure-devops-extension/actions/workflows/release.yml/badge.svg + :target: https://github.com/frontierhq/sheriff-azure-devops-extension/actions/workflows/release.yml | @@ -19,15 +19,15 @@ About ----- This is an Azure DevOps extension that provides tasks for installing and running -`Sheriff `_, a command line tool to -manage Azure role-based access control (Azure RBAC) and Microsoft Entra -Privileged Identity Management (Microsoft Entra PIM) using desired state configuration. +`Sheriff `_, a command line tool to +manage Microsoft Entra Privileged Identity Management (Microsoft Entra PIM) using +desired state configuration. ------------ Installation ------------ -The extension is available in the `Visual Studio Marketplace `_. +The extension is available in the `Visual Studio Marketplace `_. ----- Usage @@ -81,4 +81,4 @@ This task runs Sheriff in apply mode, equivalent to running ``sheriff apply [mod Contributing ------------ -We welcome contributions to this repository. Please see `CONTRIBUTING.md `_ for more information. +We welcome contributions to this repository. Please see `CONTRIBUTING.md `_ for more information. diff --git a/images/extension-icon.png b/images/extension-icon.png index bf572e2a88c4ceeb08f9e30c73619ed614a4ff92..da834247716be59d57d0f17dbbcfa0eb38baa4a6 100644 GIT binary patch literal 16916 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 Hu0mjfo2q<5 literal 10750 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 diff --git a/images/large-extension-icon.png b/images/large-extension-icon.png index e3d2e91d7f7b7ad2190c87c863cf6d381c9250b5..1027962edf9813ba34b3c8115dea37a4e6362ca7 100644 GIT binary patch literal 30334 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

H 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.6.0", "xmlbuilder": "~11.0.0" @@ -6787,9 +6787,9 @@ "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" }, "sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "semver": { "version": "6.3.1", @@ -7123,9 +7123,9 @@ "dev": true }, "tfx-cli": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/tfx-cli/-/tfx-cli-0.15.0.tgz", - "integrity": "sha512-uZ9+vVlfWy39wzfJXVOjaCYeN4q5Cp5ywt4SmiAEhN6/ILTr/ApxZEUo7nTfHwt51p5odD7+mMbvXAigmA5GIg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/tfx-cli/-/tfx-cli-0.17.0.tgz", + "integrity": "sha512-/fFD1qE3FkPglQQZIxbiZ2Hl5itTgLQW1LJ/2qMxGYkzxJx9U/axhg/g6dnYb2qsvWs4oHTbajHCiLKe8mE5LA==", "requires": { "app-root-path": "1.0.0", "archiver": "2.0.3", @@ -7150,7 +7150,7 @@ "uuid": "^3.0.1", "validator": "^13.7.0", "winreg": "0.0.12", - "xml2js": "^0.4.16" + "xml2js": "^0.5.0" }, "dependencies": { "glob": { @@ -7539,9 +7539,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" diff --git a/package.json b/package.json index d0827f3..a5ff22f 100644 --- a/package.json +++ b/package.json @@ -12,20 +12,20 @@ }, "repository": { "type": "git", - "url": "git@github.com:gofrontier-com/sheriff-azure-devops-extension.git" + "url": "git@github.com:frontierhq/sheriff-azure-devops-extension.git" }, - "author": "Frontier Digital Ltd", + "author": "Frontier", "license": "GPL-3.0", "bugs": { - "url": "https://github.com/gofrontier-com/sheriff-azure-devops-extension/issues" + "url": "https://github.com/frontierhq/sheriff-azure-devops-extension/issues" }, - "homepage": "https://github.com/gofrontier-com/sheriff-azure-devops-extension#readme", + "homepage": "https://github.com/frontierhq/sheriff-azure-devops-extension#readme", "dependencies": { "fs-extra": "^11.1.1", "rimraf": "^5.0.1", "shelljs": "^0.8.5", "tempdir": "^2.0.0", - "tfx-cli": "^0.15.0", + "tfx-cli": "^0.17.0", "winston": "^3.10.0" }, "devDependencies": { diff --git a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package-lock.json b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package-lock.json index 74d03d4..4b9f050 100644 --- a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package-lock.json +++ b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package-lock.json @@ -1,12 +1,12 @@ { "name": "install-sheriff-cli-task", - "version": "0.0.3", + "version": "0.0.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "install-sheriff-cli-task", - "version": "0.0.3", + "version": "0.0.4", "license": "GPL-3.0", "dependencies": { "axios": "^1.4.0", diff --git a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package.json b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package.json index 4dfaf43..d70a9ae 100644 --- a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package.json +++ b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/package.json @@ -1,13 +1,13 @@ { "name": "install-sheriff-cli-task", - "version": "0.0.3", + "version": "0.0.4", "description": "", "scripts": { "test": "run-p test:*", "test:js": "eslint .", "test:unit": "mocha test/unit --recursive --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-" }, - "author": "Frontier Digital Ltd", + "author": "Frontier", "license": "GPL-3.0", "dependencies": { "axios": "^1.4.0", diff --git a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/src/index.js b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/src/index.js index f747b4b..82b3ef0 100644 --- a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/src/index.js +++ b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/src/index.js @@ -9,8 +9,6 @@ const { promisify } = require('util'); const finished = promisify(stream.finished); -const sas = 'sp=r&st=2024-01-01T00:00:00Z&se=2049-12-31T23:59:59Z&spr=https&sv=2022-11-02&sr=c&sig=Obnq5FJma2NJlE1k0PykIYlHbBcTA1yeba3YRLV6rmw%3D'; - async function run() { try { const version = tl.getInput('version', true); @@ -43,9 +41,9 @@ async function run() { let downloadUrl; if (version === 'latest') { - downloadUrl = `https://sa0she0prd0uks0releases.blob.core.windows.net/sheriff/latest/sheriff_${os}_${platform}.${fileExtension}?${sas}`; + downloadUrl = `https://releases.frontierhq.com/sheriff/latest/sheriff_${os}_${platform}.${fileExtension}`; } else { - downloadUrl = `https://sa0she0prd0uks0releases.blob.core.windows.net/sheriff/${version}/sheriff_${os}_${platform}.${fileExtension}?${sas}`; + downloadUrl = `https://releases.frontierhq.com/sheriff/${version}/sheriff_${os}_${platform}.${fileExtension}`; } const downloadPath = path.join(agentTempDirectory, `sheriff_${os}_${platform}.${fileExtension}`); const toolDirPath = `${agentToolsDirectory}/sheriff/${version}/${platform}`; diff --git a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/task.json b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/task.json index 84d9798..e2b8f79 100644 --- a/tasks/InstallSheriffCLI/InstallSheriffCLIV0/task.json +++ b/tasks/InstallSheriffCLI/InstallSheriffCLIV0/task.json @@ -5,9 +5,9 @@ "friendlyName": "Install Sheriff CLI", "instanceNameFormat": "Install Sheriff CLI", "description": "Installs the Sheriff CLI", - "helpUrl": "https://github.com/gofrontier-com/sheriff-azure-devops-extension/tasks//InstallSheriffCLIV0/README.md", + "helpUrl": "https://github.com/frontierhq/sheriff-azure-devops-extension/tasks//InstallSheriffCLIV0/README.md", "category": "Utility", - "author": "Frontier Digital Ltd", + "author": "Frontier", "inputs": [ { "name": "version", diff --git a/tasks/SheriffApply/SheriffApplyV0/package-lock.json b/tasks/SheriffApply/SheriffApplyV0/package-lock.json index e0a92fe..13fcf0f 100644 --- a/tasks/SheriffApply/SheriffApplyV0/package-lock.json +++ b/tasks/SheriffApply/SheriffApplyV0/package-lock.json @@ -1,16 +1,18 @@ { "name": "sheriff-apply-task", - "version": "0.0.1", + "version": "0.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sheriff-apply-task", - "version": "0.0.1", + "version": "0.0.3", "license": "GPL-3.0", "dependencies": { "axios": "^1.4.0", - "azure-pipelines-task-lib": "^4.4.0" + "azure-devops-node-api": "^13.0.0", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tasks-artifacts-common": "^2.230.0" }, "devDependencies": { "eslint": "^8.44.0", @@ -167,12 +169,30 @@ "node": ">= 8" } }, + "node_modules/@types/fs-extra": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "node_modules/@types/node": { + "version": "16.18.97", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.97.tgz", + "integrity": "sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg==" + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -422,6 +442,15 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/azure-devops-node-api": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-13.0.0.tgz", + "integrity": "sha512-T/i3pt2Dxb2//1+TJT05Ff5heUmQEWKwa8sdguIhdRYT3Zge9FYw98zpfFvCD7CZsz6AN74SKGgqF3ISVN2TGg==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "node_modules/azure-pipelines-task-lib": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.7.0.tgz", @@ -437,6 +466,37 @@ "uuid": "^3.0.1" } }, + "node_modules/azure-pipelines-tasks-artifacts-common": { + "version": "2.230.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-artifacts-common/-/azure-pipelines-tasks-artifacts-common-2.230.0.tgz", + "integrity": "sha512-FWyRjR+eqNjjVvXwiIJVcfLN+DTmbS3icRgrL6zAGx7iIKJOJn+sjlKOuCIR36TaWU4KOVfDGJujDK6Z+WPY8g==", + "dependencies": { + "@types/fs-extra": "8.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^16.11.39", + "azure-devops-node-api": "12.0.0", + "azure-pipelines-task-lib": "^4.2.0", + "fs-extra": "8.1.0", + "semver": "6.3.0" + } + }, + "node_modules/azure-pipelines-tasks-artifacts-common/node_modules/azure-devops-node-api": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.0.0.tgz", + "integrity": "sha512-S6Il++7dQeMlZDokBDWw7YVoPeb90tWF10pYxnoauRMnkuL91jq9M7SOYRVhtO3FUC5URPkB/qzGa7jTLft0Xw==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-tasks-artifacts-common/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -487,14 +547,18 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -707,17 +771,19 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -834,6 +900,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -1338,6 +1423,19 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1402,16 +1500,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1497,7 +1598,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1508,8 +1608,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -1536,12 +1635,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1551,7 +1649,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -1563,7 +1660,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -2039,6 +2135,14 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2555,7 +2659,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2835,6 +2938,20 @@ "teleport": ">=0.2.0" } }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3078,15 +3195,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3153,14 +3271,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3368,6 +3489,14 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3457,6 +3586,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -3472,6 +3611,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3758,12 +3910,30 @@ "fastq": "^1.6.0" } }, + "@types/fs-extra": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", + "requires": { + "@types/node": "*" + } + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.97", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.97.tgz", + "integrity": "sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg==" + }, "@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -3941,6 +4111,15 @@ "proxy-from-env": "^1.1.0" } }, + "azure-devops-node-api": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-13.0.0.tgz", + "integrity": "sha512-T/i3pt2Dxb2//1+TJT05Ff5heUmQEWKwa8sdguIhdRYT3Zge9FYw98zpfFvCD7CZsz6AN74SKGgqF3ISVN2TGg==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "azure-pipelines-task-lib": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.7.0.tgz", @@ -3956,6 +4135,36 @@ "uuid": "^3.0.1" } }, + "azure-pipelines-tasks-artifacts-common": { + "version": "2.230.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-artifacts-common/-/azure-pipelines-tasks-artifacts-common-2.230.0.tgz", + "integrity": "sha512-FWyRjR+eqNjjVvXwiIJVcfLN+DTmbS3icRgrL6zAGx7iIKJOJn+sjlKOuCIR36TaWU4KOVfDGJujDK6Z+WPY8g==", + "requires": { + "@types/fs-extra": "8.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^16.11.39", + "azure-devops-node-api": "12.0.0", + "azure-pipelines-task-lib": "^4.2.0", + "fs-extra": "8.1.0", + "semver": "6.3.0" + }, + "dependencies": { + "azure-devops-node-api": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.0.0.tgz", + "integrity": "sha512-S6Il++7dQeMlZDokBDWw7YVoPeb90tWF10pYxnoauRMnkuL91jq9M7SOYRVhtO3FUC5URPkB/qzGa7jTLft0Xw==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4000,14 +4209,15 @@ "dev": true }, "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -4157,14 +4367,13 @@ "dev": true }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, "define-properties": { @@ -4260,6 +4469,19 @@ "which-typed-array": "^1.1.13" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -4646,6 +4868,16 @@ "mime-types": "^2.1.12" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4688,11 +4920,11 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -4753,7 +4985,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -4761,8 +4992,7 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graphemer": { "version": "1.4.0", @@ -4783,25 +5013,22 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -5136,6 +5363,14 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5530,8 +5765,7 @@ "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-keys": { "version": "1.1.1", @@ -5726,6 +5960,14 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" }, + "qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "requires": { + "side-channel": "^1.0.6" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5878,15 +6120,16 @@ } }, "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" } }, "set-function-name": { @@ -5932,14 +6175,14 @@ } }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "spdx-correct": { @@ -6099,6 +6342,11 @@ "strip-bom": "^3.0.0" } }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6161,6 +6409,16 @@ "is-typed-array": "^1.1.9" } }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -6173,6 +6431,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/tasks/SheriffApply/SheriffApplyV0/package.json b/tasks/SheriffApply/SheriffApplyV0/package.json index 3afb315..56992e7 100644 --- a/tasks/SheriffApply/SheriffApplyV0/package.json +++ b/tasks/SheriffApply/SheriffApplyV0/package.json @@ -1,17 +1,19 @@ { "name": "sheriff-apply-task", - "version": "0.0.1", + "version": "0.0.3", "description": "", "scripts": { "test": "run-p test:*", "test:js": "eslint .", "test:unit": "mocha test/unit --recursive --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-" }, - "author": "Frontier Digital Ltd", + "author": "Frontier", "license": "GPL-3.0", "dependencies": { "axios": "^1.4.0", - "azure-pipelines-task-lib": "^4.4.0" + "azure-devops-node-api": "^13.0.0", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tasks-artifacts-common": "^2.230.0" }, "devDependencies": { "eslint": "^8.44.0", diff --git a/tasks/SheriffApply/SheriffApplyV0/src/index.js b/tasks/SheriffApply/SheriffApplyV0/src/index.js index 7051b40..f401d9f 100644 --- a/tasks/SheriffApply/SheriffApplyV0/src/index.js +++ b/tasks/SheriffApply/SheriffApplyV0/src/index.js @@ -1,6 +1,30 @@ #!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const { getHandlerFromToken, WebApi } = require('azure-devops-node-api'); const tl = require('azure-pipelines-task-lib/task'); +const { getSystemAccessToken } = require('azure-pipelines-tasks-artifacts-common/webapi'); + +async function getIdToken(connectedService) { + const jobId = tl.getVariable('System.JobId'); + const planId = tl.getVariable('System.PlanId'); + const projectId = tl.getVariable('System.TeamProjectId'); + const hub = tl.getVariable('System.HostType'); + const uri = tl.getVariable('System.CollectionUri'); + const token = getSystemAccessToken(); + + const authHandler = getHandlerFromToken(token); + const connection = new WebApi(uri, authHandler); + const api = await connection.getTaskApi(); + const response = await api.createOidcToken({}, projectId, hub, planId, jobId, connectedService); + if (response == null) { + return null; + } + + return response.oidcToken; +} async function run() { try { @@ -11,6 +35,8 @@ async function run() { let subscriptionId = tl.getInput('subscriptionId', false); + const agentTempDirectory = tl.getVariable('Agent.TempDirectory'); + const env = {}; const authScheme = tl.getEndpointAuthorizationScheme(connectedService, true); @@ -22,7 +48,18 @@ async function run() { if (authScheme.toLowerCase() === 'workloadidentityfederation') { tl.debug('workload identity federation scheme'); - throw new Error('Workload identity federation scheme not implemented'); + const servicePrincipalId = tl.getEndpointAuthorizationParameter(connectedService, 'serviceprincipalid', false); + env.AZURE_CLIENT_ID = servicePrincipalId; + + const tenantId = tl.getEndpointAuthorizationParameter(connectedService, 'tenantid', false); + env.AZURE_TENANT_ID = tenantId; + + const federatedToken = await getIdToken(connectedService); + tl.setSecret(federatedToken); + + const federatedTokenFilePath = path.join(agentTempDirectory, 'azure-identity-token'); + fs.writeFileSync(federatedTokenFilePath, federatedToken); + env.AZURE_FEDERATED_TOKEN_FILE = federatedTokenFilePath; } else if (authScheme.toLowerCase() === 'serviceprincipal') { tl.debug('service principal scheme'); const authType = tl.getEndpointAuthorizationParameter(connectedService, 'authenticationType', false); diff --git a/tasks/SheriffApply/SheriffApplyV0/task.json b/tasks/SheriffApply/SheriffApplyV0/task.json index f1cb06c..48ee4b5 100644 --- a/tasks/SheriffApply/SheriffApplyV0/task.json +++ b/tasks/SheriffApply/SheriffApplyV0/task.json @@ -5,9 +5,9 @@ "friendlyName": "Sheriff apply", "instanceNameFormat": "Sheriff apply", "description": "Runs the apply action on Sheriff", - "helpUrl": "https://github.com/gofrontier-com/sheriff-azure-devops-extension/tasks/SheriffApply/SheriffApplyV0/README.md", + "helpUrl": "https://github.com/frontierhq/sheriff-azure-devops-extension/tasks/SheriffApply/SheriffApplyV0/README.md", "category": "Utility", - "author": "Frontier Digital Ltd", + "author": "Frontier", "inputs": [ { "name": "configDir", diff --git a/tasks/SheriffPlan/SheriffPlanV0/package-lock.json b/tasks/SheriffPlan/SheriffPlanV0/package-lock.json index 10554f6..be8c4de 100644 --- a/tasks/SheriffPlan/SheriffPlanV0/package-lock.json +++ b/tasks/SheriffPlan/SheriffPlanV0/package-lock.json @@ -1,16 +1,18 @@ { "name": "sheriff-plan-task", - "version": "0.0.1", + "version": "0.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sheriff-plan-task", - "version": "0.0.1", + "version": "0.0.3", "license": "GPL-3.0", "dependencies": { "axios": "^1.4.0", - "azure-pipelines-task-lib": "^4.4.0" + "azure-devops-node-api": "^13.0.0", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tasks-artifacts-common": "^2.230.0" }, "devDependencies": { "eslint": "^8.44.0", @@ -167,12 +169,30 @@ "node": ">= 8" } }, + "node_modules/@types/fs-extra": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "node_modules/@types/node": { + "version": "16.18.97", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.97.tgz", + "integrity": "sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg==" + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -422,6 +442,15 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/azure-devops-node-api": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-13.0.0.tgz", + "integrity": "sha512-T/i3pt2Dxb2//1+TJT05Ff5heUmQEWKwa8sdguIhdRYT3Zge9FYw98zpfFvCD7CZsz6AN74SKGgqF3ISVN2TGg==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "node_modules/azure-pipelines-task-lib": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.7.0.tgz", @@ -437,6 +466,37 @@ "uuid": "^3.0.1" } }, + "node_modules/azure-pipelines-tasks-artifacts-common": { + "version": "2.230.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-artifacts-common/-/azure-pipelines-tasks-artifacts-common-2.230.0.tgz", + "integrity": "sha512-FWyRjR+eqNjjVvXwiIJVcfLN+DTmbS3icRgrL6zAGx7iIKJOJn+sjlKOuCIR36TaWU4KOVfDGJujDK6Z+WPY8g==", + "dependencies": { + "@types/fs-extra": "8.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^16.11.39", + "azure-devops-node-api": "12.0.0", + "azure-pipelines-task-lib": "^4.2.0", + "fs-extra": "8.1.0", + "semver": "6.3.0" + } + }, + "node_modules/azure-pipelines-tasks-artifacts-common/node_modules/azure-devops-node-api": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.0.0.tgz", + "integrity": "sha512-S6Il++7dQeMlZDokBDWw7YVoPeb90tWF10pYxnoauRMnkuL91jq9M7SOYRVhtO3FUC5URPkB/qzGa7jTLft0Xw==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-tasks-artifacts-common/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -487,14 +547,18 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -707,17 +771,19 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -834,6 +900,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -1338,6 +1423,19 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1402,16 +1500,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1497,7 +1598,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1508,8 +1608,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -1536,12 +1635,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1551,7 +1649,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -1563,7 +1660,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -2039,6 +2135,14 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2555,7 +2659,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2835,6 +2938,20 @@ "teleport": ">=0.2.0" } }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3078,15 +3195,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3153,14 +3271,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3368,6 +3489,14 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3457,6 +3586,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -3472,6 +3611,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3758,12 +3910,30 @@ "fastq": "^1.6.0" } }, + "@types/fs-extra": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", + "requires": { + "@types/node": "*" + } + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.97", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.97.tgz", + "integrity": "sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg==" + }, "@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -3941,6 +4111,15 @@ "proxy-from-env": "^1.1.0" } }, + "azure-devops-node-api": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-13.0.0.tgz", + "integrity": "sha512-T/i3pt2Dxb2//1+TJT05Ff5heUmQEWKwa8sdguIhdRYT3Zge9FYw98zpfFvCD7CZsz6AN74SKGgqF3ISVN2TGg==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "azure-pipelines-task-lib": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.7.0.tgz", @@ -3956,6 +4135,36 @@ "uuid": "^3.0.1" } }, + "azure-pipelines-tasks-artifacts-common": { + "version": "2.230.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-artifacts-common/-/azure-pipelines-tasks-artifacts-common-2.230.0.tgz", + "integrity": "sha512-FWyRjR+eqNjjVvXwiIJVcfLN+DTmbS3icRgrL6zAGx7iIKJOJn+sjlKOuCIR36TaWU4KOVfDGJujDK6Z+WPY8g==", + "requires": { + "@types/fs-extra": "8.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^16.11.39", + "azure-devops-node-api": "12.0.0", + "azure-pipelines-task-lib": "^4.2.0", + "fs-extra": "8.1.0", + "semver": "6.3.0" + }, + "dependencies": { + "azure-devops-node-api": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.0.0.tgz", + "integrity": "sha512-S6Il++7dQeMlZDokBDWw7YVoPeb90tWF10pYxnoauRMnkuL91jq9M7SOYRVhtO3FUC5URPkB/qzGa7jTLft0Xw==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4000,14 +4209,15 @@ "dev": true }, "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -4157,14 +4367,13 @@ "dev": true }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, "define-properties": { @@ -4260,6 +4469,19 @@ "which-typed-array": "^1.1.13" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -4646,6 +4868,16 @@ "mime-types": "^2.1.12" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4688,11 +4920,11 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -4753,7 +4985,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -4761,8 +4992,7 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graphemer": { "version": "1.4.0", @@ -4783,25 +5013,22 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -5136,6 +5363,14 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5530,8 +5765,7 @@ "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-keys": { "version": "1.1.1", @@ -5726,6 +5960,14 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" }, + "qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "requires": { + "side-channel": "^1.0.6" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5878,15 +6120,16 @@ } }, "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" } }, "set-function-name": { @@ -5932,14 +6175,14 @@ } }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "spdx-correct": { @@ -6099,6 +6342,11 @@ "strip-bom": "^3.0.0" } }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6161,6 +6409,16 @@ "is-typed-array": "^1.1.9" } }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -6173,6 +6431,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/tasks/SheriffPlan/SheriffPlanV0/package.json b/tasks/SheriffPlan/SheriffPlanV0/package.json index 65c6d45..8025c2e 100644 --- a/tasks/SheriffPlan/SheriffPlanV0/package.json +++ b/tasks/SheriffPlan/SheriffPlanV0/package.json @@ -1,17 +1,19 @@ { "name": "sheriff-plan-task", - "version": "0.0.1", + "version": "0.0.3", "description": "", "scripts": { "test": "run-p test:*", "test:js": "eslint .", "test:unit": "mocha test/unit --recursive --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-" }, - "author": "Frontier Digital Ltd", + "author": "Frontier", "license": "GPL-3.0", "dependencies": { "axios": "^1.4.0", - "azure-pipelines-task-lib": "^4.4.0" + "azure-devops-node-api": "^13.0.0", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tasks-artifacts-common": "^2.230.0" }, "devDependencies": { "eslint": "^8.44.0", diff --git a/tasks/SheriffPlan/SheriffPlanV0/src/index.js b/tasks/SheriffPlan/SheriffPlanV0/src/index.js index 3ffc205..4080a97 100644 --- a/tasks/SheriffPlan/SheriffPlanV0/src/index.js +++ b/tasks/SheriffPlan/SheriffPlanV0/src/index.js @@ -1,6 +1,30 @@ #!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const { getHandlerFromToken, WebApi } = require('azure-devops-node-api'); const tl = require('azure-pipelines-task-lib/task'); +const { getSystemAccessToken } = require('azure-pipelines-tasks-artifacts-common/webapi'); + +async function getIdToken(connectedService) { + const jobId = tl.getVariable('System.JobId'); + const planId = tl.getVariable('System.PlanId'); + const projectId = tl.getVariable('System.TeamProjectId'); + const hub = tl.getVariable('System.HostType'); + const uri = tl.getVariable('System.CollectionUri'); + const token = getSystemAccessToken(); + + const authHandler = getHandlerFromToken(token); + const connection = new WebApi(uri, authHandler); + const api = await connection.getTaskApi(); + const response = await api.createOidcToken({}, projectId, hub, planId, jobId, connectedService); + if (response == null) { + return null; + } + + return response.oidcToken; +} async function run() { try { @@ -10,6 +34,8 @@ async function run() { let subscriptionId = tl.getInput('subscriptionId', false); + const agentTempDirectory = tl.getVariable('Agent.TempDirectory'); + const env = {}; const authScheme = tl.getEndpointAuthorizationScheme(connectedService, true); @@ -21,7 +47,18 @@ async function run() { if (authScheme.toLowerCase() === 'workloadidentityfederation') { tl.debug('workload identity federation scheme'); - throw new Error('Workload identity federation scheme not implemented'); + const servicePrincipalId = tl.getEndpointAuthorizationParameter(connectedService, 'serviceprincipalid', false); + env.AZURE_CLIENT_ID = servicePrincipalId; + + const tenantId = tl.getEndpointAuthorizationParameter(connectedService, 'tenantid', false); + env.AZURE_TENANT_ID = tenantId; + + const federatedToken = await getIdToken(connectedService); + tl.setSecret(federatedToken); + + const federatedTokenFilePath = path.join(agentTempDirectory, 'azure-identity-token'); + fs.writeFileSync(federatedTokenFilePath, federatedToken); + env.AZURE_FEDERATED_TOKEN_FILE = federatedTokenFilePath; } else if (authScheme.toLowerCase() === 'serviceprincipal') { tl.debug('service principal scheme'); const authType = tl.getEndpointAuthorizationParameter(connectedService, 'authenticationType', false); diff --git a/tasks/SheriffPlan/SheriffPlanV0/task.json b/tasks/SheriffPlan/SheriffPlanV0/task.json index 52a571e..15af0b9 100644 --- a/tasks/SheriffPlan/SheriffPlanV0/task.json +++ b/tasks/SheriffPlan/SheriffPlanV0/task.json @@ -5,9 +5,9 @@ "friendlyName": "Sheriff plan", "instanceNameFormat": "Sheriff plan", "description": "Runs the plan action on Sheriff", - "helpUrl": "https://github.com/gofrontier-com/sheriff-azure-devops-extension/tasks/SheriffPlan/SheriffPlanV0/README.md", + "helpUrl": "https://github.com/frontierhq/sheriff-azure-devops-extension/tasks/SheriffPlan/SheriffPlanV0/README.md", "category": "Utility", - "author": "Frontier Digital Ltd", + "author": "Frontier", "inputs": [ { "name": "configDir", diff --git a/vss-extension.json b/vss-extension.json index 9d65470..0fc6520 100644 --- a/vss-extension.json +++ b/vss-extension.json @@ -2,7 +2,7 @@ "manifestVersion": 1, "id": "Sheriff", "name": "Sheriff", - "publisher": "gofrontier", + "publisher": "frontierhq", "version": "", "public": false, "targets": [ @@ -13,7 +13,7 @@ "categories": [ "Azure Pipelines" ], - "description": "Provides tasks to operate Sheriff, a command line tool to manage Microsoft Entra Privileged Identity Management (Microsoft Entra PIM) using desired state configuration.", + "description": "Provides tasks to operate Sheriff, a command line tool to configure and operate Microsoft Entra Privileged Identity Management (PIM) in automation.", "tags": [ "Microsoft Azure", "Microsoft Entra ID", @@ -21,7 +21,7 @@ ], "repository": { "type": "git", - "uri": "https://github.com/gofrontier-com/sheriff-azure-devops-extension" + "uri": "https://github.com/frontierhq/sheriff-azure-devops-extension" }, "content": { "details": { @@ -30,7 +30,7 @@ }, "links": { "learn": { - "uri": "https://github.com/gofrontier-com/sheriff" + "uri": "https://frontierhq.com/products/sheriff" } }, "icons": {