From 3f9a400ed6ace656781d54b7a035038061badf87 Mon Sep 17 00:00:00 2001 From: Ilona Shishov Date: Mon, 12 Feb 2024 12:30:52 +0200 Subject: [PATCH 1/7] chore: fix source string out of view in View Problem panel bug and remove onDidChangeTextDocument CA trigger Signed-off-by: Ilona Shishov --- .github/workflows/stage.yml | 7 ++----- package-lock.json | 8 ++++---- package.json | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml index f64eb6f5e..5183a503d 100644 --- a/.github/workflows/stage.yml +++ b/.github/workflows/stage.yml @@ -88,13 +88,10 @@ jobs: else echo "version=$version" >> "$GITHUB_OUTPUT" - notes="${notes//$''/%27}" - notes="${notes//$''/%60}" - notes="${notes//'%'/'%25'}" - notes="${notes//$'\n'/'%0A'}" - notes="${notes//$'\r'/'%0D'}" + notes="${notes//$'`'/%60}" delimiter="$(openssl rand -hex 8)" echo "notes<<${delimiter}" >> "$GITHUB_OUTPUT" + echo "## Changelog" >> "$GITHUB_OUTPUT" echo "$notes" >> "$GITHUB_OUTPUT" echo "${delimiter}" >> "$GITHUB_OUTPUT" fi diff --git a/package-lock.json b/package-lock.json index e570fb875..f2d27216f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.9.2", "license": "Apache-2.0", "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.1-ea.0", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.3", "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "fs": "^0.0.1-security", @@ -567,9 +567,9 @@ } }, "node_modules/@fabric8-analytics/fabric8-analytics-lsp-server": { - "version": "0.9.1-ea.0", - "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.9.1-ea.0/edf47ce3bd53a1d8e6fd51b716636f36ee9b72ef", - "integrity": "sha512-u12C2ZfXKu6K/9JPp20nQHtwcu+tSXsG1Ym7xZZurce6SBV73FHCVHDGTRmwploKF62fTm5j/ylPZ85iuIt42Q==", + "version": "0.9.3", + "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.9.3/7032ee5390644c734c78d171a8b6164cc348854d", + "integrity": "sha512-t1U8escvm580KY2vttmPQyMtmf/9xftPpVkB7z56nf1ZoUc9PJJJBQaNKeI+pHKsH1YE0OISFzm1A8AFUCmGbg==", "license": "Apache-2.0", "dependencies": { "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", diff --git a/package.json b/package.json index afe2b8fea..8f72511df 100644 --- a/package.json +++ b/package.json @@ -278,11 +278,11 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.1-ea.0", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.3", "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "fs": "^0.0.1-security", "path": "^0.12.7", "vscode-languageclient": "^8.1.0" } -} +} \ No newline at end of file From cd7ed87cf3c8260e7837815ffc1742d27f2a2739 Mon Sep 17 00:00:00 2001 From: Ilona Shishov Date: Mon, 26 Feb 2024 13:10:33 +0200 Subject: [PATCH 2/7] fix: filter out empty provider statuses from diagnostic message Signed-off-by: Ilona Shishov --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f2d27216f..a54b0c612 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.9.2", "license": "Apache-2.0", "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.3", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.4-ea.1", "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "fs": "^0.0.1-security", @@ -567,9 +567,9 @@ } }, "node_modules/@fabric8-analytics/fabric8-analytics-lsp-server": { - "version": "0.9.3", - "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.9.3/7032ee5390644c734c78d171a8b6164cc348854d", - "integrity": "sha512-t1U8escvm580KY2vttmPQyMtmf/9xftPpVkB7z56nf1ZoUc9PJJJBQaNKeI+pHKsH1YE0OISFzm1A8AFUCmGbg==", + "version": "0.9.4-ea.1", + "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.9.4-ea.1/bb9fcfb314cd43801691f28cbb24f89f19e084dd", + "integrity": "sha512-jCyN3d9iED3GIUjkHE9U2Borz3ZKdG1glLoDMANX43OF3++5J32igwR5p5PRbHjj9OLGzU4q24zeJycBDo6irQ==", "license": "Apache-2.0", "dependencies": { "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", diff --git a/package.json b/package.json index 8f72511df..7515cb20c 100644 --- a/package.json +++ b/package.json @@ -278,11 +278,11 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.3", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.4-ea.1", "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "fs": "^0.0.1-security", "path": "^0.12.7", "vscode-languageclient": "^8.1.0" } -} \ No newline at end of file +} From c81f4472af304aeb2117b0dc8905bd15d5d04e0c Mon Sep 17 00:00:00 2001 From: Ilona Shishov Date: Mon, 26 Feb 2024 13:16:07 +0200 Subject: [PATCH 3/7] test: use rewire to test exhort services (#685) Signed-off-by: Ilona Shishov --- package-lock.json | 177 ++++++++++++++++--------------- package.json | 3 +- src/config.ts | 2 + src/dependencyReportPanel.ts | 2 + src/exhortServices.ts | 2 +- src/stackAnalysis.ts | 2 + test/caStatusBarProvider.test.ts | 1 - test/exhortServices.test.ts | 104 ++++++++++++++++++ test/index.ts | 3 +- test/redhatTelemetry.test.ts | 64 +++++++++++ test/utils.ts | 37 +++++++ webpack.config.ts | 6 -- 12 files changed, 308 insertions(+), 95 deletions(-) create mode 100644 test/exhortServices.test.ts create mode 100644 test/redhatTelemetry.test.ts create mode 100644 test/utils.ts diff --git a/package-lock.json b/package-lock.json index a54b0c612..a20c6e91b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "@typescript-eslint/eslint-plugin": "^6.8.0", "@typescript-eslint/parser": "^6.8.0", "@vscode/test-electron": "^2.3.5", + "babel-plugin-rewire": "^1.2.0", "chai": "^4.3.10", "decache": "^4.6.2", "eslint": "^8.51.0", @@ -81,11 +82,11 @@ }, "../fabric8-analytics-lsp-server": { "name": "@fabric8-analytics/fabric8-analytics-lsp-server", - "version": "0.9.0", + "version": "0.9.2", "extraneous": true, "license": "Apache-2.0", "dependencies": { - "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.5", + "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "@xml-tools/ast": "^5.0.5", "@xml-tools/parser": "^1.0.11", "json-to-ast": "^2.1.0", @@ -135,11 +136,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -147,28 +148,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -184,11 +185,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -198,13 +199,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -255,9 +256,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -295,9 +296,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } @@ -311,30 +312,30 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -345,9 +346,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -356,32 +357,32 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -389,11 +390,11 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1996,6 +1997,12 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-plugin-rewire": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz", + "integrity": "sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==", + "dev": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2048,9 +2055,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "funding": [ { "type": "opencollective", @@ -2066,9 +2073,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -2127,9 +2134,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001558", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001558.tgz", - "integrity": "sha512-/Et7DwLqpjS47JPEcz6VnxU9PwcIdVi0ciLXRWBQdj1XFye68pSQYpV0QtPTfUKWuOaEig+/Vez2l74eDc1tPQ==", + "version": "1.0.30001584", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", + "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", "funding": [ { "type": "opencollective", @@ -2548,9 +2555,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.569", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz", - "integrity": "sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==" + "version": "1.4.657", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.657.tgz", + "integrity": "sha512-On2ymeleg6QbRuDk7wNgDdXtNqlJLM2w4Agx1D/RiTmItiL+a9oq5p7HUa2ZtkAtGBe/kil2dq/7rPfkbe0r5w==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -4700,9 +4707,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nopt": { "version": "5.0.0", diff --git a/package.json b/package.json index 7515cb20c..8a279c82f 100644 --- a/package.json +++ b/package.json @@ -262,6 +262,7 @@ "@typescript-eslint/eslint-plugin": "^6.8.0", "@typescript-eslint/parser": "^6.8.0", "@vscode/test-electron": "^2.3.5", + "babel-plugin-rewire": "^1.2.0", "chai": "^4.3.10", "decache": "^4.6.2", "eslint": "^8.51.0", @@ -285,4 +286,4 @@ "path": "^0.12.7", "vscode-languageclient": "^8.1.0" } -} +} \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index b9d7f3809..e64f6aace 100644 --- a/src/config.ts +++ b/src/config.ts @@ -62,8 +62,10 @@ class Config { this.triggerRHRepositoryRecommendationNotification = commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION; this.utmSource = GlobalState.UTM_SOURCE; this.exhortSnykToken = rhdaConfig.exhortSnykToken; + /* istanbul ignore next */ this.matchManifestVersions = rhdaConfig.matchManifestVersions ? 'true' : 'false'; this.vulnerabilityAlertSeverity = rhdaConfig.vulnerabilityAlertSeverity; + /* istanbul ignore next */ this.rhdaReportFilePath = rhdaConfig.reportFilePath || defaultRhdaReportFilePath; this.exhortMvnPath = rhdaConfig.mvn.executable.path || this.DEFAULT_MVN_EXECUTABLE; this.exhortNpmPath = rhdaConfig.npm.executable.path || this.DEFAULT_NPM_EXECUTABLE; diff --git a/src/dependencyReportPanel.ts b/src/dependencyReportPanel.ts index 81e47606f..51e4d14cc 100644 --- a/src/dependencyReportPanel.ts +++ b/src/dependencyReportPanel.ts @@ -26,6 +26,7 @@ export class DependencyReportPanel { * Creates or shows the webview panel. */ public static createOrShowWebviewPanel() { + /* istanbul ignore next */ const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; @@ -113,6 +114,7 @@ export class DependencyReportPanel { DependencyReportPanel.data = null; while (this._disposables.length) { const x = this._disposables.pop(); + /* istanbul ignore else */ if (x) { x.dispose(); } diff --git a/src/exhortServices.ts b/src/exhortServices.ts index f7d5fc325..984908361 100644 --- a/src/exhortServices.ts +++ b/src/exhortServices.ts @@ -57,7 +57,7 @@ async function tokenValidationService(options, source) { vscode.window.showWarningMessage(`Failed to validate token. Status: ${tokenValidationStatus}`); } } catch (error) { - vscode.window.showErrorMessage(`Failed to validate token, Error: ${error}`); + vscode.window.showErrorMessage(`Failed to validate token, Error: ${error.message}`); } } diff --git a/src/stackAnalysis.ts b/src/stackAnalysis.ts index d901fbd14..bcbd210ae 100644 --- a/src/stackAnalysis.ts +++ b/src/stackAnalysis.ts @@ -21,6 +21,7 @@ const supportedFiles = [ * @param data The data to update the panel with. */ function updateWebviewPanel(data) { + /* istanbul ignore else */ if (DependencyReportPanel.currentPanel) { DependencyReportPanel.currentPanel.doUpdatePanel(data); } @@ -133,6 +134,7 @@ async function generateRHDAReport(context, uri) { await triggerWebviewPanel(context); const resp = await executeStackAnalysis(uri.fsPath); + /* istanbul ignore else */ if (DependencyReportPanel.currentPanel) { await writeReportToFile(resp); } diff --git a/test/caStatusBarProvider.test.ts b/test/caStatusBarProvider.test.ts index d381a8911..683339b45 100644 --- a/test/caStatusBarProvider.test.ts +++ b/test/caStatusBarProvider.test.ts @@ -26,7 +26,6 @@ suite('CAStatusBarProvider module', () => { const uri = 'file:///mock/path'; caStatusBarProvider.showSummary(text, uri); - console.log(caStatusBarProvider['statusBarItem'].command); expect(caStatusBarProvider['statusBarItem'].text).to.equal(text); expect(caStatusBarProvider['statusBarItem'].tooltip).to.equal(PromptText.FULL_STACK_PROMPT_TEXT); diff --git a/test/exhortServices.test.ts b/test/exhortServices.test.ts new file mode 100644 index 000000000..6e68f327d --- /dev/null +++ b/test/exhortServices.test.ts @@ -0,0 +1,104 @@ +import * as chai from 'chai'; +import * as sinon from 'sinon'; +import * as sinonChai from 'sinon-chai'; +import { rewireModule, cleanupRewireFiles } from './utils'; + +const expect = chai.expect; +chai.use(sinonChai); + +suite('ExhortServices module', async () => { + let sandbox: sinon.SinonSandbox; + + const compiledFilePath = 'out/src/exhortServices'; + const stackAnalysisReportHtmlMock = 'RHDA Report Mock'; + + let exhortMock = { + default: { + stackAnalysis: async () => stackAnalysisReportHtmlMock, + validateToken: async (statusCode) => statusCode, + } + }; + + let vscodeMock = { + window: { + showInformationMessage: sinon.spy(), + showWarningMessage: sinon.spy(), + showErrorMessage: sinon.spy(), + } + }; + + let exhortServicesRewire; + + setup(async () => { + sandbox = sinon.createSandbox(); + exhortServicesRewire = await rewireModule(compiledFilePath); + exhortServicesRewire.__Rewire__('exhort_javascript_api_1', exhortMock); + exhortServicesRewire.__Rewire__('vscode', vscodeMock); + }); + + teardown(() => { + sandbox.restore(); + cleanupRewireFiles(compiledFilePath); + }); + + test('should generate RHDA report HTML from Exhort Stack Analysis service', async () => { + await exhortServicesRewire.stackAnalysisService('mock/path/to/manifest', {}) + .then((result) => { + expect(result).to.equal(stackAnalysisReportHtmlMock); + }) + }); + + test('should perform token validation with Exhort Validate Token service', async () => { + await exhortServicesRewire.tokenValidationService(200, 'provider'); + await exhortServicesRewire.tokenValidationService(400, 'provider'); + await exhortServicesRewire.tokenValidationService(401, 'provider'); + await exhortServicesRewire.tokenValidationService(403, 'provider'); + await exhortServicesRewire.tokenValidationService(429, 'provider'); + await exhortServicesRewire.tokenValidationService(500, 'provider'); + + expect(vscodeMock.window.showInformationMessage).to.have.been.calledWith('provider Token Validated Successfully'); + expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Missing token. Please provide a valid provider Token in the extension workspace settings. Status: 400'); + expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Invalid token. Please provide a valid provider Token in the extension workspace settings. Status: 401'); + expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Forbidden. The token does not have permissions. Please provide a valid provider Token in the extension workspace settings. Status: 403'); + expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Too many requests. Rate limit exceeded. Please try again in a little while. Status: 429'); + expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Failed to validate token. Status: 500'); + }); + + test('should fail to generate RHDA report HTML from Exhort Stack Analysis service and reject with error', async () => { + + let exhortMock = { + default: { + stackAnalysis: async () => { + throw new Error('Analysis Error'); + }, + } + }; + + exhortServicesRewire.__Rewire__('exhort_javascript_api_1', exhortMock); + + await exhortServicesRewire.stackAnalysisService('mock/path/to/manifest', {}) + .then(() => { + throw new Error('should have thrown Analysis Error') + }) + .catch((error) => { + expect(error.message).to.equal('Analysis Error'); + }) + }); + + test('should fail to perform token validation with Exhort Validate Token service and display error message', async () => { + + let exhortMock = { + default: { + validateToken: async () => { + throw new Error('Validation Error'); + }, + } + }; + + exhortServicesRewire.__Rewire__('exhort_javascript_api_1', exhortMock); + + await exhortServicesRewire.tokenValidationService(500, 'provider'); + + expect(vscodeMock.window.showErrorMessage).to.have.been.calledWith('Failed to validate token, Error: Validation Error'); + }); +}); \ No newline at end of file diff --git a/test/index.ts b/test/index.ts index 7d5c97373..7fa7eda43 100644 --- a/test/index.ts +++ b/test/index.ts @@ -25,6 +25,7 @@ export async function run(): Promise { hookRunInThisContext: true, reportDir: join(__dirname, "..", "..", 'coverage'), // remove attribute for report to be saved in ./out/src/ tempDir: join(__dirname, "..", "..", '.nyc_output'), // remove attribute for output to be saved in ./out/src/ + exclude: ['exhortServices.js', 'exhortServices_rewire.js', 'redhatTelemetry.js', 'redhatTelemetry_rewire.js'] }) await nyc.wrap() @@ -39,7 +40,7 @@ export async function run(): Promise { }) // Add all files to the test suite - const files = sync("**/**.test.js", { cwd: testsRoot, ignore: ['**/stackAnalysisService.test.js'] }) + const files = sync("**/**.test.js", { cwd: testsRoot }) files.forEach(f => mocha.addFile(resolve(testsRoot, f))) const failures: number = await new Promise(executor => mocha.run(executor)) diff --git a/test/redhatTelemetry.test.ts b/test/redhatTelemetry.test.ts new file mode 100644 index 000000000..9c7bc6d05 --- /dev/null +++ b/test/redhatTelemetry.test.ts @@ -0,0 +1,64 @@ +import * as chai from 'chai'; +import * as sinon from 'sinon'; +import * as sinonChai from 'sinon-chai'; +import { rewireModule, cleanupRewireFiles } from './utils'; + +const expect = chai.expect; +chai.use(sinonChai); + +suite('RedhatTelemetry module', async () => { + let sandbox: sinon.SinonSandbox; + + const compiledFilePath = 'out/src/redhatTelemetry'; + const redHatUUIDMock = 'Mock UUID'; + + let getRedHatUUIDMock = { + getRedHatUUID: async () => redHatUUIDMock + } + + let sendEventMock = { + sendStartupEvent: sinon.spy(), + send: sinon.spy() + } + + let getIdProviderMock = { + getIdProvider: async () => getRedHatUUIDMock, + getTelemetryService: async () => sendEventMock + } + + let getRedHatServiceMock = { + getRedHatService: async () => getIdProviderMock + }; + + let redhatTelemetryRewire; + + setup(async () => { + sandbox = sinon.createSandbox(); + redhatTelemetryRewire = await rewireModule(compiledFilePath); + redhatTelemetryRewire.__Rewire__('vscode_redhat_telemetry_1', getRedHatServiceMock); + }); + + teardown(() => { + sandbox.restore(); + cleanupRewireFiles(compiledFilePath); + }); + + test('should get UUID from vscode redhat telemetry service', async () => { + let telemetryId = await redhatTelemetryRewire.getTelemetryId({}) + expect(telemetryId).to.equal(redHatUUIDMock); + }); + + test('should send statup telemetry event', async () => { + await redhatTelemetryRewire.startUp({}) + expect(sendEventMock.sendStartupEvent).to.have.been.calledOnce; + }); + + test('should record telemetry event', async () => { + await redhatTelemetryRewire.record({}, 'telemetry_event_mock', { mockProp: 'mockValue' }) + expect(sendEventMock.send).to.have.been.calledWith({ + type: 'track', + name: 'telemetry_event_mock', + properties: { mockProp: 'mockValue' } + }); + }); +}); \ No newline at end of file diff --git a/test/utils.ts b/test/utils.ts new file mode 100644 index 000000000..ecdfd236f --- /dev/null +++ b/test/utils.ts @@ -0,0 +1,37 @@ +import * as babelCore from "@babel/core"; +import * as fs from "fs"; + +/** + * Asynchronously imports a module. + * + * @param filepath Path to the module to be imported. + * @returns A promise that resolves to the module's exports. + */ +async function dynamicImportProvider(filepath) { + return await import(filepath) +} + +/** + * Rewires a module for testing purposes. + * @param filepath path to the compiled JavaScript file of the tested module. + * @return A module instance that exposes private methods/functions/properties to be mocked/stubbed. + */ +export function rewireModule(filepath) { + let moduleBuffeer = fs.readFileSync(filepath + ".js") + let moduleSource = babelCore.transform(moduleBuffeer, { plugins: ["babel-plugin-rewire"] }).code; + fs.writeFileSync(filepath + "_rewire.js", moduleSource) + return dynamicImportProvider("../../" + filepath + "_rewire.js") +} + +/** + * Removes rewired modules from file system. + * @param filepath path to the compiled JavaScript file of the tested module. + */ +export function cleanupRewireFiles(filepath) { + const fileToRemove = filepath + "_rewire.js" + try { + fs.unlinkSync(fileToRemove); + } catch (err) { + console.error(`Error deleting rewire module ${fileToRemove}: ${err.message}`); + } +} \ No newline at end of file diff --git a/webpack.config.ts b/webpack.config.ts index a865ab04c..c9ec7b450 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -41,14 +41,8 @@ module.exports = (env, argv) => { }, { test: /\.ts$/, - exclude: /node_modules/, use: [{ loader: 'ts-loader', - options: { - compilerOptions: { - "module": "es6" // override `tsconfig.json` so that TypeScript emits native JavaScript modules. - } - } }] }] }, From 45116ccb4728cf80a98f75027238c088f29492cf Mon Sep 17 00:00:00 2001 From: Ilona Shishov Date: Thu, 29 Feb 2024 10:58:03 +0200 Subject: [PATCH 4/7] chore: integrate secret storage (#689) * feat: save RHDA Snyk Token configuration in VSCode Secret Storage Signed-off-by: Ilona Shishov * chore: updated the names of commands in the package.json file Signed-off-by: Ilona Shishov * test: updated unit tests Signed-off-by: Ilona Shishov --------- Signed-off-by: Ilona Shishov --- package-lock.json | 10 +- package.json | 58 ++++++----- src/caStatusBarProvider.ts | 4 +- src/commands.ts | 15 +-- src/config.ts | 82 ++++++++++++--- src/constants.ts | 18 ++-- src/exhortServices.ts | 19 ++-- src/extension.ts | 54 +++++++--- src/stackAnalysis.ts | 6 +- src/tokenValidation.ts | 18 ++-- test/caStatusBarProvider.test.ts | 4 +- test/config.test.ts | 159 +++++++++++++++++++++++++++-- test/dependencyReportPanel.test.ts | 6 +- test/exhortServices.test.ts | 32 ++---- test/extension.test.ts | 12 +-- test/stackAnalysis.test.ts | 12 ++- test/tokenValidation.test.ts | 16 +-- 17 files changed, 364 insertions(+), 161 deletions(-) diff --git a/package-lock.json b/package-lock.json index a20c6e91b..45c6b9e6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.9.2", "license": "Apache-2.0", "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.4-ea.1", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.4-ea.2", "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "fs": "^0.0.1-security", @@ -82,7 +82,7 @@ }, "../fabric8-analytics-lsp-server": { "name": "@fabric8-analytics/fabric8-analytics-lsp-server", - "version": "0.9.2", + "version": "0.9.4-ea.1", "extraneous": true, "license": "Apache-2.0", "dependencies": { @@ -568,9 +568,9 @@ } }, "node_modules/@fabric8-analytics/fabric8-analytics-lsp-server": { - "version": "0.9.4-ea.1", - "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.9.4-ea.1/bb9fcfb314cd43801691f28cbb24f89f19e084dd", - "integrity": "sha512-jCyN3d9iED3GIUjkHE9U2Borz3ZKdG1glLoDMANX43OF3++5J32igwR5p5PRbHjj9OLGzU4q24zeJycBDo6irQ==", + "version": "0.9.4-ea.2", + "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.9.4-ea.2/ca0ace6cc0f37bdf19993529aa18ce9094654801", + "integrity": "sha512-mdIiga72ISXBzAa0XNtwWLdMOjukGHZXDPpGABvP4E3NyTdfL9wGti3mV2S9oyU5wUy3LsWZBgkLXLDYrboBfA==", "license": "Apache-2.0", "dependencies": { "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", diff --git a/package.json b/package.json index 8a279c82f..e239d50f3 100644 --- a/package.json +++ b/package.json @@ -48,12 +48,12 @@ "contributes": { "commands": [ { - "command": "fabric8.stackAnalysis", + "command": "rhda.stackAnalysis", "title": "Red Hat Dependency Analytics Report...", "category": "Red Hat Dependency Analytics" }, { - "command": "fabric8.stackAnalysisFromPieBtn", + "command": "rhda.stackAnalysisFromPieBtn", "title": "Open Red Hat Dependency Analytics Report", "icon": { "light": "icon/report-icon.png", @@ -61,89 +61,94 @@ } }, { - "command": "fabric8.stackAnalysisFromEditor", + "command": "rhda.stackAnalysisFromEditor", "title": "Red Hat Dependency Analytics Report..." }, { - "command": "fabric8.stackAnalysisFromExplorer", + "command": "rhda.stackAnalysisFromExplorer", "title": "Red Hat Dependency Analytics Report..." }, { - "command": "fabric8.fabric8AnalyticsStackLogs", + "command": "rhda.stackLogs", "title": "Debug logs", "category": "Red Hat Dependency Analytics" + }, + { + "command": "rhda.setSnykToken", + "title": "Set Snyk Token", + "category": "Red Hat Dependency Analytics" } ], "menus": { "editor/title": [ { - "command": "fabric8.stackAnalysisFromPieBtn", + "command": "rhda.stackAnalysisFromPieBtn", "when": "resourceFilename == pom.xml", "group": "navigation" }, { - "command": "fabric8.stackAnalysisFromPieBtn", + "command": "rhda.stackAnalysisFromPieBtn", "when": "resourceFilename == package.json", "group": "navigation" }, { - "command": "fabric8.stackAnalysisFromPieBtn", + "command": "rhda.stackAnalysisFromPieBtn", "when": "resourceFilename == go.mod", "group": "navigation" }, { - "command": "fabric8.stackAnalysisFromPieBtn", + "command": "rhda.stackAnalysisFromPieBtn", "when": "resourceFilename == requirements.txt", "group": "navigation" } ], "explorer/context": [ { - "command": "fabric8.stackAnalysisFromExplorer", + "command": "rhda.stackAnalysisFromExplorer", "when": "resourceFilename == package.json" }, { - "command": "fabric8.stackAnalysisFromExplorer", + "command": "rhda.stackAnalysisFromExplorer", "when": "resourceFilename == pom.xml" }, { - "command": "fabric8.stackAnalysisFromExplorer", + "command": "rhda.stackAnalysisFromExplorer", "when": "resourceFilename == go.mod" }, { - "command": "fabric8.stackAnalysisFromExplorer", + "command": "rhda.stackAnalysisFromExplorer", "when": "resourceFilename == requirements.txt" } ], "editor/context": [ { - "command": "fabric8.stackAnalysisFromEditor", + "command": "rhda.stackAnalysisFromEditor", "when": "resourceFilename == package.json" }, { - "command": "fabric8.stackAnalysisFromEditor", + "command": "rhda.stackAnalysisFromEditor", "when": "resourceFilename == pom.xml" }, { - "command": "fabric8.stackAnalysisFromEditor", + "command": "rhda.stackAnalysisFromEditor", "when": "resourceFilename == go.mod" }, { - "command": "fabric8.stackAnalysisFromEditor", + "command": "rhda.stackAnalysisFromEditor", "when": "resourceFilename == requirements.txt" } ], "commandPalette": [ { - "command": "fabric8.stackAnalysisFromPieBtn", + "command": "rhda.stackAnalysisFromPieBtn", "when": "false" }, { - "command": "fabric8.stackAnalysisFromEditor", + "command": "rhda.stackAnalysisFromEditor", "when": "false" }, { - "command": "fabric8.stackAnalysisFromExplorer", + "command": "rhda.stackAnalysisFromExplorer", "when": "false" } ] @@ -168,10 +173,13 @@ "default": "off", "description": "Traces the communication between VSCode and the Red Hat Dependency Analytics Language Server." }, - "redHatDependencyAnalytics.exhortSnykToken": { + "redHatDependencyAnalytics.snykTokenStorage": { "type": "string", - "default": "", - "description": "Red Hat Dependency Analytics authentication token for Snyk.", + "enum": [ + "Always use VS Code's secret storage" + ], + "default": "Always use VS Code's secret storage", + "markdownDescription": "Red Hat Dependency Analytics uses VS Code's [secret storage](https://code.visualstudio.com/api/references/vscode-api#SecretStorage) to safely store the authentication token for Snyk. To set the token, run the VS Code command [RHDA: Set Snyk Token](command:rhda.setSnykToken).", "scope": "window" }, "redHatDependencyAnalytics.matchManifestVersions": { @@ -279,11 +287,11 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.4-ea.1", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.9.4-ea.2", "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", "@RHEcosystemAppEng/exhort-javascript-api": "^0.1.1-ea.14", "fs": "^0.0.1-security", "path": "^0.12.7", "vscode-languageclient": "^8.1.0" } -} \ No newline at end of file +} diff --git a/src/caStatusBarProvider.ts b/src/caStatusBarProvider.ts index a47eec172..eee8d4042 100644 --- a/src/caStatusBarProvider.ts +++ b/src/caStatusBarProvider.ts @@ -27,7 +27,7 @@ class CAStatusBarProvider implements Disposable { this.statusBarItem.text = text; this.statusBarItem.command = { title: PromptText.FULL_STACK_PROMPT_TEXT, - command: commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, + command: commands.STACK_ANALYSIS_FROM_STATUS_BAR_COMMAND, arguments: [Uri.parse(uri)] }; this.statusBarItem.tooltip = PromptText.FULL_STACK_PROMPT_TEXT; @@ -41,7 +41,7 @@ class CAStatusBarProvider implements Disposable { this.statusBarItem.text = `$(error) RHDA analysis has failed`; this.statusBarItem.command = { title: PromptText.LSP_FAILURE_TEXT, - command: commands.TRIGGER_STACK_LOGS, + command: commands.STACK_LOGS_COMMAND, }; } diff --git a/src/commands.ts b/src/commands.ts index d3600da01..1ab8c88b9 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -3,10 +3,11 @@ /** * Commonly used commands to trigger Stack Analysis and supporting actions */ -export const TRIGGER_FULL_STACK_ANALYSIS = 'fabric8.stackAnalysis'; -export const TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR = 'fabric8.stackAnalysisFromStatusBar'; -export const TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER = 'fabric8.stackAnalysisFromExplorer'; -export const TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN = 'fabric8.stackAnalysisFromPieBtn'; -export const TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR = 'fabric8.stackAnalysisFromEditor'; -export const TRIGGER_STACK_LOGS = 'fabric8.fabric8AnalyticsStackLogs'; -export const TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION = 'fabric8.RHRepositoryRecommendationNotification'; \ No newline at end of file +export const STACK_ANALYSIS_COMMAND = 'rhda.stackAnalysis'; +export const STACK_ANALYSIS_FROM_STATUS_BAR_COMMAND = 'rhda.stackAnalysisFromStatusBar'; +export const STACK_ANALYSIS_FROM_EXPLORER_COMMAND = 'rhda.stackAnalysisFromExplorer'; +export const STACK_ANALYSIS_FROM_PIE_BTN_COMMAND = 'rhda.stackAnalysisFromPieBtn'; +export const STACK_ANALYSIS_FROM_EDITOR_COMMAND = 'rhda.stackAnalysisFromEditor'; +export const STACK_LOGS_COMMAND = 'rhda.stackLogs'; +export const REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND = 'rhda.rhRepositoryRecommendationNotification'; +export const SET_SNYK_TOKEN_COMMAND = 'rhda.setSnykToken'; \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index e64f6aace..f554b6b87 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,7 +2,7 @@ import * as vscode from 'vscode'; -import { GlobalState, defaultRhdaReportFilePath } from './constants'; +import { GlobalState, DEFAULT_RHDA_REPORT_FILE_PATH, SNYK_TOKEN_KEY } from './constants'; import * as commands from './commands'; import { getTelemetryId } from './redhatTelemetry'; @@ -11,10 +11,9 @@ import { getTelemetryId } from './redhatTelemetry'; */ class Config { telemetryId: string; - triggerFullStackAnalysis: string; - triggerRHRepositoryRecommendationNotification: string; + stackAnalysisCommand: string; + rhRepositoryRecommendationNotificationCommand: string; utmSource: string; - exhortSnykToken: string; matchManifestVersions: string; vulnerabilityAlertSeverity: string; exhortMvnPath: string; @@ -25,6 +24,7 @@ class Config { exhortPythonPath: string; exhortPipPath: string; rhdaReportFilePath: string; + secrets: vscode.SecretStorage; private readonly DEFAULT_MVN_EXECUTABLE = 'mvn'; private readonly DEFAULT_NPM_EXECUTABLE = 'npm'; @@ -40,7 +40,6 @@ class Config { */ constructor() { this.loadData(); - this.setProcessEnv(); } /** @@ -58,15 +57,14 @@ class Config { loadData() { const rhdaConfig = this.getRhdaConfig(); - this.triggerFullStackAnalysis = commands.TRIGGER_FULL_STACK_ANALYSIS; - this.triggerRHRepositoryRecommendationNotification = commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION; + this.stackAnalysisCommand = commands.STACK_ANALYSIS_COMMAND; + this.rhRepositoryRecommendationNotificationCommand = commands.REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND; this.utmSource = GlobalState.UTM_SOURCE; - this.exhortSnykToken = rhdaConfig.exhortSnykToken; /* istanbul ignore next */ this.matchManifestVersions = rhdaConfig.matchManifestVersions ? 'true' : 'false'; this.vulnerabilityAlertSeverity = rhdaConfig.vulnerabilityAlertSeverity; /* istanbul ignore next */ - this.rhdaReportFilePath = rhdaConfig.reportFilePath || defaultRhdaReportFilePath; + this.rhdaReportFilePath = rhdaConfig.reportFilePath || DEFAULT_RHDA_REPORT_FILE_PATH; this.exhortMvnPath = rhdaConfig.mvn.executable.path || this.DEFAULT_MVN_EXECUTABLE; this.exhortNpmPath = rhdaConfig.npm.executable.path || this.DEFAULT_NPM_EXECUTABLE; this.exhortGoPath = rhdaConfig.go.executable.path || this.DEFAULT_GO_EXECUTABLE; @@ -80,11 +78,10 @@ class Config { * Sets process environment variables based on configuration settings. * @private */ - private setProcessEnv() { - process.env['VSCEXT_TRIGGER_FULL_STACK_ANALYSIS'] = this.triggerFullStackAnalysis; - process.env['VSCEXT_TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION'] = this.triggerRHRepositoryRecommendationNotification; + private async setProcessEnv(): Promise { + process.env['VSCEXT_STACK_ANALYSIS_COMMAND'] = this.stackAnalysisCommand; + process.env['VSCEXT_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND'] = this.rhRepositoryRecommendationNotificationCommand; process.env['VSCEXT_UTM_SOURCE'] = this.utmSource; - process.env['VSCEXT_EXHORT_SNYK_TOKEN'] = this.exhortSnykToken; process.env['VSCEXT_MATCH_MANIFEST_VERSIONS'] = this.matchManifestVersions; process.env['VSCEXT_VULNERABILITY_ALERT_SEVERITY'] = this.vulnerabilityAlertSeverity; process.env['VSCEXT_EXHORT_MVN_PATH'] = this.exhortMvnPath; @@ -94,15 +91,70 @@ class Config { process.env['VSCEXT_EXHORT_PIP3_PATH'] = this.exhortPip3Path; process.env['VSCEXT_EXHORT_PYTHON_PATH'] = this.exhortPythonPath; process.env['VSCEXT_EXHORT_PIP_PATH'] = this.exhortPipPath; + process.env['VSCEXT_TELEMETRY_ID'] = this.telemetryId; + + const token = await this.getSnykToken(); + process.env['VSCEXT_EXHORT_SNYK_TOKEN'] = token; } /** * Authorizes the RHDA (Red Hat Dependency Analytics) service. * @param context The extension context for authorization. */ - async authorizeRHDA(context) { + async authorizeRHDA(context): Promise { this.telemetryId = await getTelemetryId(context); - process.env['VSCEXT_TELEMETRY_ID'] = this.telemetryId; + await this.setProcessEnv(); + } + + /** + * Links the secret storage to the configuration object. + * @param context The extension context. + */ + linkToSecretStorage(context) { + this.secrets = context.secrets; + } + + /** + * Sets the Snyk token. + * @param token The Snyk token. + * @returns A Promise that resolves when the token is set. + */ + async setSnykToken(token: string | undefined): Promise { + if (!token) { return; } + + try { + await this.secrets.store(SNYK_TOKEN_KEY, token); + } catch (error) { + vscode.window.showErrorMessage(`Failed to save Snyk token to VSCode Secret Storage, Error: ${error.message}`); + } + } + + /** + * Gets the Snyk token. + * @returns A Promise that resolves with the Snyk token. + */ + async getSnykToken(): Promise { + try { + const token = await this.secrets.get(SNYK_TOKEN_KEY); + return token || ''; + } catch (error) { + vscode.window.showErrorMessage(`Failed to get Snyk token from VSCode Secret Storage, Error: ${error.message}`); + await this.clearSnykToken(); + return ''; + } + } + + /** + * Clears the Snyk token. + * @returns A Promise that resolves when the token is cleared. + * @private + */ + private async clearSnykToken(): Promise { + try { + await this.secrets.delete(SNYK_TOKEN_KEY); + } catch (error) { + console.error(`Error while deleting Snyk token from VSCode Secret Storage, Error: ${error.message}`); + } } } diff --git a/src/constants.ts b/src/constants.ts index 9000cc88d..c38131913 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -19,7 +19,7 @@ export enum StatusMessages { } export enum PromptText { - FULL_STACK_PROMPT_TEXT = `Open detailed vulnerability report`, + FULL_STACK_PROMPT_TEXT = `Open Red Hat Dependency Analytics Report`, LSP_FAILURE_TEXT = `Open the output window`, } @@ -29,16 +29,18 @@ export enum Titles { } // Refer `name` from package.json -export const extensionId = 'fabric8-analytics'; +export const EXTENSION_ID = 'fabric8-analytics'; // publisher.name from package.json -export const extensionQualifiedId = `redhat.${extensionId}`; +export const EXTENSION_QUALIFIED_ID = `redhat.${EXTENSION_ID}`; // UTM -export const registrationURL = 'https://app.snyk.io/signup/?utm_medium=Partner&utm_source=RedHat&utm_campaign=Code-Ready-Analytics-2020&utm_content=Register'; +export const REGISTRATION_URL = 'https://app.snyk.io/signup/?utm_medium=Partner&utm_source=RedHat&utm_campaign=Code-Ready-Analytics-2020&utm_content=Register'; +// Key for Snyk token secret +export const SNYK_TOKEN_KEY = 'rhda.snykToken'; // URL to Snyk webpage -export const snykURL = 'https://app.snyk.io/login?utm_campaign=Code-Ready-Analytics-2020&utm_source=code_ready&code_ready=FF1B53D9-57BE-4613-96D7-1D06066C38C9'; +export const SNYK_URL = 'https://app.snyk.io/login?utm_campaign=Code-Ready-Analytics-2020&utm_source=code_ready&code_ready=FF1B53D9-57BE-4613-96D7-1D06066C38C9'; // default Redhat Dependency Analytics report file path -export const defaultRhdaReportFilePath = '/tmp/redhatDependencyAnalyticsReport.html'; +export const DEFAULT_RHDA_REPORT_FILE_PATH = '/tmp/redhatDependencyAnalyticsReport.html'; // Red Hat GA Repository -export const redhatMavenRepository = 'https://maven.repository.redhat.com/ga/'; +export const REDHAT_MAVEN_REPOSITORY = 'https://maven.repository.redhat.com/ga/'; // Red Hat GA Repository documentation -export const redhatMavenRepositoryDocumentationURL = 'https://access.redhat.com/maven-repository'; +export const REDHAT_MAVEN_REPOSITORY_DOCUMENTATION_URL = 'https://access.redhat.com/maven-repository'; diff --git a/src/exhortServices.ts b/src/exhortServices.ts index 984908361..d2d688d3a 100644 --- a/src/exhortServices.ts +++ b/src/exhortServices.ts @@ -1,6 +1,5 @@ 'use strict'; -import * as vscode from 'vscode'; import exhort from '@RHEcosystemAppEng/exhort-javascript-api'; /** @@ -9,7 +8,7 @@ import exhort from '@RHEcosystemAppEng/exhort-javascript-api'; * @param options Additional options for the analysis. * @returns A promise resolving to the stack analysis report in HTML format. */ -function stackAnalysisService(pathToManifest, options) { +function stackAnalysisService(pathToManifest, options): Promise { return new Promise(async (resolve, reject) => { try { // Get stack analysis in HTML format @@ -27,7 +26,7 @@ function stackAnalysisService(pathToManifest, options) { * @param source The source for which the token is being validated. Example values: 'Snyk', 'OSS Index'. * @returns A promise resolving after validating the token. */ -async function tokenValidationService(options, source) { +async function tokenValidationService(options, source): Promise { try { // Get token validation status code @@ -36,28 +35,28 @@ async function tokenValidationService(options, source) { if ( tokenValidationStatus === 200 ) { - vscode.window.showInformationMessage(`${source} Token Validated Successfully`); + return; } else if ( tokenValidationStatus === 400 ) { - vscode.window.showWarningMessage(`Missing token. Please provide a valid ${source} Token in the extension workspace settings. Status: ${tokenValidationStatus}`); + return `Missing token. Please provide a valid ${source} Token in the extension workspace settings. Status: ${tokenValidationStatus}`; } else if ( tokenValidationStatus === 401 ) { - vscode.window.showWarningMessage(`Invalid token. Please provide a valid ${source} Token in the extension workspace settings. Status: ${tokenValidationStatus}`); + return `Invalid token. Please provide a valid ${source} Token in the extension workspace settings. Status: ${tokenValidationStatus}`; } else if ( tokenValidationStatus === 403 ) { - vscode.window.showWarningMessage(`Forbidden. The token does not have permissions. Please provide a valid ${source} Token in the extension workspace settings. Status: ${tokenValidationStatus}`); + return `Forbidden. The token does not have permissions. Please provide a valid ${source} Token in the extension workspace settings. Status: ${tokenValidationStatus}`; } else if ( tokenValidationStatus === 429 ) { - vscode.window.showWarningMessage(`Too many requests. Rate limit exceeded. Please try again in a little while. Status: ${tokenValidationStatus}`); + return `Too many requests. Rate limit exceeded. Please try again in a little while. Status: ${tokenValidationStatus}`; } else { - vscode.window.showWarningMessage(`Failed to validate token. Status: ${tokenValidationStatus}`); + return `Failed to validate token. Status: ${tokenValidationStatus}`; } } catch (error) { - vscode.window.showErrorMessage(`Failed to validate token, Error: ${error.message}`); + return `Failed to validate token, Error: ${error.message}`; } } diff --git a/src/extension.ts b/src/extension.ts index 3f0a17086..3f7031164 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -10,7 +10,7 @@ import { } from 'vscode-languageclient/node'; import * as commands from './commands'; -import { GlobalState, extensionQualifiedId, redhatMavenRepository, redhatMavenRepositoryDocumentationURL } from './constants'; +import { GlobalState, EXTENSION_QUALIFIED_ID, REDHAT_MAVEN_REPOSITORY, REDHAT_MAVEN_REPOSITORY_DOCUMENTATION_URL, SNYK_TOKEN_KEY } from './constants'; import { generateRHDAReport } from './stackAnalysis'; import { globalConfig } from './config'; import { StatusMessages, PromptText } from './constants'; @@ -29,13 +29,15 @@ export let outputChannelDep: DepOutputChannel; * @param context - The extension context. */ export function activate(context: vscode.ExtensionContext) { + globalConfig.linkToSecretStorage(context); + startUp(context); // show welcome message after first install or upgrade showUpdateNotification(context); const disposableStackAnalysisCommand = vscode.commands.registerCommand( - commands.TRIGGER_FULL_STACK_ANALYSIS, + commands.STACK_ANALYSIS_COMMAND, async (uri: vscode.Uri) => { // uri will be null in case the user has used the context menu/file explorer const fileUri = uri ? uri : vscode.window.activeTextEditor.document.uri; @@ -50,7 +52,7 @@ export function activate(context: vscode.ExtensionContext) { ); const disposableStackLogsCommand = vscode.commands.registerCommand( - commands.TRIGGER_STACK_LOGS, + commands.STACK_LOGS_COMMAND, () => { if (outputChannelDep) { outputChannelDep.showOutputChannel(); @@ -61,16 +63,31 @@ export function activate(context: vscode.ExtensionContext) { ); const rhRepositoryRecommendationNotification = vscode.commands.registerCommand( - commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION, + commands.REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND, () => { const msg = `Important: If you apply Red Hat Dependency Analytics recommendations, - make sure the Red Hat GA Repository (${redhatMavenRepository}) has been added to your project configuration. + make sure the Red Hat GA Repository (${REDHAT_MAVEN_REPOSITORY}) has been added to your project configuration. This ensures that the applied dependencies work correctly. - Learn how to add the repository: [Click here](${redhatMavenRepositoryDocumentationURL})`; + Learn how to add the repository: [Click here](${REDHAT_MAVEN_REPOSITORY_DOCUMENTATION_URL})`; vscode.window.showWarningMessage(msg); } ); + const disposableSetSnykToken = vscode.commands.registerCommand( + commands.SET_SNYK_TOKEN_COMMAND, + async () => { + const token = await vscode.window.showInputBox({ + prompt: 'Please enter your Snyk Token:', + placeHolder: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + password: true, + validateInput: validateSnykToken + }); + + if (!token) { return; } + await globalConfig.setSnykToken(token); + } + ); + registerStackAnalysisCommands(context); globalConfig.authorizeRHDA(context) @@ -115,12 +132,13 @@ export function activate(context: vscode.ExtensionContext) { serverOptions, clientOptions ); + lspClient.start().then(() => { const showVulnerabilityFoundPrompt = async (msg: string, fileName: string) => { const selection = await vscode.window.showWarningMessage(`${msg}`, PromptText.FULL_STACK_PROMPT_TEXT); if (selection === PromptText.FULL_STACK_PROMPT_TEXT) { - vscode.commands.executeCommand(commands.TRIGGER_FULL_STACK_ANALYSIS); + vscode.commands.executeCommand(commands.STACK_ANALYSIS_COMMAND); record(context, TelemetryActions.vulnerabilityReportPopupOpened, { manifest: fileName, fileName: fileName }); } else { @@ -148,10 +166,12 @@ export function activate(context: vscode.ExtensionContext) { record(context, TelemetryActions.componentAnalysisFailed, { manifest: path.basename(notification.origin()), fileName: path.basename(notification.origin()), error: notification.errorMsg() }); }); }); + context.subscriptions.push( disposableStackAnalysisCommand, disposableStackLogsCommand, rhRepositoryRecommendationNotification, + disposableSetSnykToken, caStatusBarProvider, ); }) @@ -160,12 +180,14 @@ export function activate(context: vscode.ExtensionContext) { throw (error); }); - vscode.workspace.onDidChangeConfiguration((event) => { - + vscode.workspace.onDidChangeConfiguration(() => { globalConfig.loadData(); + }); - if (event.affectsConfiguration('redHatDependencyAnalytics.exhortSnykToken')) { - validateSnykToken(); + context.secrets.onDidChange(async (e) => { + if (e.key === SNYK_TOKEN_KEY) { + const token = await globalConfig.getSnykToken(); + lspClient.sendNotification('snykTokenModified', token); } }); } @@ -188,7 +210,7 @@ export function deactivate(): Thenable { */ async function showUpdateNotification(context: vscode.ExtensionContext) { - const packageJSON = vscode.extensions.getExtension(extensionQualifiedId).packageJSON; + const packageJSON = vscode.extensions.getExtension(EXTENSION_QUALIFIED_ID).packageJSON; const version = packageJSON.version; const previousVersion = context.globalState.get(GlobalState.VERSION); @@ -240,10 +262,10 @@ function registerStackAnalysisCommands(context: vscode.ExtensionContext) { }; const stackAnalysisCommands = [ - registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR, TelemetryActions.vulnerabilityReportEditor), - registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER, TelemetryActions.vulnerabilityReportExplorer), - registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN, TelemetryActions.vulnerabilityReportPieBtn), - registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, TelemetryActions.vulnerabilityReportStatusBar), + registerCommand(commands.STACK_ANALYSIS_FROM_EDITOR_COMMAND, TelemetryActions.vulnerabilityReportEditor), + registerCommand(commands.STACK_ANALYSIS_FROM_EXPLORER_COMMAND, TelemetryActions.vulnerabilityReportExplorer), + registerCommand(commands.STACK_ANALYSIS_FROM_PIE_BTN_COMMAND, TelemetryActions.vulnerabilityReportPieBtn), + registerCommand(commands.STACK_ANALYSIS_FROM_STATUS_BAR_COMMAND, TelemetryActions.vulnerabilityReportStatusBar), ]; context.subscriptions.push(...stackAnalysisCommands); diff --git a/src/stackAnalysis.ts b/src/stackAnalysis.ts index bcbd210ae..8e0ed33ae 100644 --- a/src/stackAnalysis.ts +++ b/src/stackAnalysis.ts @@ -78,8 +78,10 @@ async function executeStackAnalysis(manifestFilePath): Promise { 'EXHORT_PIP_PATH': globalConfig.exhortPipPath }; - if (globalConfig.exhortSnykToken !== '') { - options['EXHORT_SNYK_TOKEN'] = globalConfig.exhortSnykToken; + const snykToken = await globalConfig.getSnykToken(); + /* istanbul ignore else */ + if (snykToken !== '') { + options['EXHORT_SNYK_TOKEN'] = snykToken; } // execute stack analysis diff --git a/src/tokenValidation.ts b/src/tokenValidation.ts index 6dc1452fc..db0931636 100644 --- a/src/tokenValidation.ts +++ b/src/tokenValidation.ts @@ -1,33 +1,33 @@ 'use strict'; -import * as vscode from 'vscode'; - import { globalConfig } from './config'; -import { snykURL } from './constants'; +import { SNYK_URL } from './constants'; import { tokenValidationService } from './exhortServices'; /** * Validates the Snyk token using the Exhort token validation service. * @returns A Promise that resolves when token has been validated. */ -async function validateSnykToken() { - if (globalConfig.exhortSnykToken !== '') { +async function validateSnykToken(token: string): Promise { + if (token !== '') { // set up configuration options for the token validation request const options = { 'RHDA_TOKEN': globalConfig.telemetryId, 'RHDA_SOURCE': globalConfig.utmSource, - 'EXHORT_SNYK_TOKEN': globalConfig.exhortSnykToken + 'EXHORT_SNYK_TOKEN': token }; // execute token validation - tokenValidationService(options, 'Snyk'); + const response = await tokenValidationService(options, 'Snyk'); + + return response; } else { - vscode.window.showInformationMessage(`Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, + return `Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, Snyk vulnerabilities will not be displayed. - To resolve this issue, please obtain a valid token from the following link: [here](${snykURL}).`); + To resolve this issue, please obtain a valid token from the following link: [here](${SNYK_URL}).`; } } diff --git a/test/caStatusBarProvider.test.ts b/test/caStatusBarProvider.test.ts index 683339b45..8859977f3 100644 --- a/test/caStatusBarProvider.test.ts +++ b/test/caStatusBarProvider.test.ts @@ -31,7 +31,7 @@ suite('CAStatusBarProvider module', () => { expect(caStatusBarProvider['statusBarItem'].tooltip).to.equal(PromptText.FULL_STACK_PROMPT_TEXT); expect(caStatusBarProvider['statusBarItem'].command).to.deep.equal({ title: PromptText.FULL_STACK_PROMPT_TEXT, - command: commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, + command: commands.STACK_ANALYSIS_FROM_STATUS_BAR_COMMAND, arguments: [vscode.Uri.parse(uri)] }); }); @@ -42,7 +42,7 @@ suite('CAStatusBarProvider module', () => { expect(caStatusBarProvider['statusBarItem'].text).to.equal('$(error) RHDA analysis has failed'); expect(caStatusBarProvider['statusBarItem'].command).to.deep.equal({ title: PromptText.LSP_FAILURE_TEXT, - command: commands.TRIGGER_STACK_LOGS, + command: commands.STACK_LOGS_COMMAND, }); }); diff --git a/test/config.test.ts b/test/config.test.ts index 3533bca31..8ea5ba7c4 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -1,9 +1,10 @@ import * as chai from 'chai'; import * as sinon from 'sinon'; import * as sinonChai from 'sinon-chai'; +import * as vscode from 'vscode'; import { globalConfig } from '../src/config'; -import { GlobalState } from '../src/constants'; +import { GlobalState, SNYK_TOKEN_KEY } from '../src/constants'; import * as commands from '../src/commands'; import * as redhatTelemetry from '../src/redhatTelemetry'; import { context } from './vscontext.mock'; @@ -14,6 +15,10 @@ chai.use(sinonChai); suite('Config module', () => { let sandbox: sinon.SinonSandbox; + const mockToken = 'mockToken'; + const mockId = 'mockId'; + const mockedError = new Error('Mock Error Message'); + setup(() => { sandbox = sinon.createSandbox(); }); @@ -24,10 +29,9 @@ suite('Config module', () => { test('should initialize Config properties with default extension settings', async () => { - expect(globalConfig.triggerFullStackAnalysis).to.eq(commands.TRIGGER_FULL_STACK_ANALYSIS); - expect(globalConfig.triggerRHRepositoryRecommendationNotification).to.eq(commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION); + expect(globalConfig.stackAnalysisCommand).to.eq(commands.STACK_ANALYSIS_COMMAND); + expect(globalConfig.rhRepositoryRecommendationNotificationCommand).to.eq(commands.REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND); expect(globalConfig.utmSource).to.eq(GlobalState.UTM_SOURCE); - expect(globalConfig.exhortSnykToken).to.eq(''); expect(globalConfig.matchManifestVersions).to.eq('true'); expect(globalConfig.vulnerabilityAlertSeverity).to.eq('Error'); expect(globalConfig.rhdaReportFilePath).to.eq('/tmp/redhatDependencyAnalyticsReport.html'); @@ -38,9 +42,25 @@ suite('Config module', () => { expect(globalConfig.exhortPip3Path).to.eq('pip3'); expect(globalConfig.exhortPythonPath).to.eq('python'); expect(globalConfig.exhortPipPath).to.eq('pip'); + }); + + test('should retrieve telemetry parameters from getTelemetryId and set process environment variables', async () => { + sandbox.stub(redhatTelemetry, 'getTelemetryId').resolves(mockId); + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => '', + delete: () => sandbox.stub() + } + }) + + await globalConfig.authorizeRHDA(context); + + expect(globalConfig.telemetryId).to.equal(mockId); - expect(process.env['VSCEXT_TRIGGER_FULL_STACK_ANALYSIS']).to.eq(commands.TRIGGER_FULL_STACK_ANALYSIS); - expect(process.env['VSCEXT_TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION']).to.eq(commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION); + expect(process.env['VSCEXT_STACK_ANALYSIS_COMMAND']).to.eq(commands.STACK_ANALYSIS_COMMAND); + expect(process.env['VSCEXT_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND']).to.eq(commands.REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION_COMMAND); expect(process.env['VSCEXT_UTM_SOURCE']).to.eq(GlobalState.UTM_SOURCE); expect(process.env['VSCEXT_EXHORT_SNYK_TOKEN']).to.eq(''); expect(process.env['VSCEXT_MATCH_MANIFEST_VERSIONS']).to.eq('true'); @@ -52,14 +72,131 @@ suite('Config module', () => { expect(process.env['VSCEXT_EXHORT_PIP3_PATH']).to.eq('pip3'); expect(process.env['VSCEXT_EXHORT_PYTHON_PATH']).to.eq('python'); expect(process.env['VSCEXT_EXHORT_PIP_PATH']).to.eq('pip'); + expect(process.env['VSCEXT_TELEMETRY_ID']).to.equal(mockId); + expect(process.env['VSCEXT_EXHORT_SNYK_TOKEN']).to.equal(''); }); - test('should call retrieve telemetry parameters from getTelemetryId', async () => { - sandbox.stub(redhatTelemetry, 'getTelemetryId').resolves('mockId'); + test('should set Snyk token in VSCode SecretStorage', async () => { - await globalConfig.authorizeRHDA(context); + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => '', + delete: () => sandbox.stub() + } + }); + + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); + const storeSecretSpy = sandbox.spy(globalConfig.secrets, 'store'); + + await globalConfig.setSnykToken(mockToken); + + expect(storeSecretSpy).to.have.been.calledWith(SNYK_TOKEN_KEY, mockToken); + expect(showErrorMessageSpy.called).to.be.false; + }); + + test('should fail to set Snyk token in VSCode SecretStorage', async () => { + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage') + + globalConfig.linkToSecretStorage({ + secrets: { + store: async () => { + throw mockedError; + }, + get: () => '', + delete: () => sandbox.stub() + } + }); + + await globalConfig.setSnykToken(mockToken); + + expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to save Snyk token to VSCode Secret Storage, Error: ${mockedError.message}`); + }); + + test('should not set Snyk token in VSCode SecretStorage when token is undefined', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => '', + delete: () => sandbox.stub() + } + }); + + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); + const storeSecretSpy = sandbox.spy(globalConfig.secrets, 'store'); + + await globalConfig.setSnykToken(undefined); + + expect(storeSecretSpy.called).to.be.false; + expect(showErrorMessageSpy.called).to.be.false; + }); + + test('should get Snyk token from VSCode SecretStorage', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => mockToken, + delete: () => sandbox.stub() + } + }); + + expect(await globalConfig.getSnykToken()).to.equal(mockToken); + }); + + test('should get Snyk token from VSCode SecretStorage and return empty string if token is undefined', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => undefined, + delete: () => sandbox.stub() + } + }); + + expect(await globalConfig.getSnykToken()).to.equal(''); + }); + + test('should fail to get Snyk token from VSCode SecretStorage', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: async () => { + throw mockedError; + }, + delete: () => sandbox.stub() + } + }); + + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); + sandbox.spy(globalConfig.secrets, 'delete'); + + expect(await globalConfig.getSnykToken()).to.equal(''); + expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to get Snyk token from VSCode Secret Storage, Error: ${mockedError.message}`); + expect(globalConfig.secrets.delete).to.be.called; + }); + + test('should fail to delete Snyk token from VSCode SecretStorage', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: async () => { + throw mockedError; + }, + delete: async () => { + throw mockedError; + }, + } + }); + + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); + sandbox.spy(globalConfig.secrets, 'delete'); - expect(globalConfig.telemetryId).to.equal('mockId'); - expect(process.env['VSCEXT_TELEMETRY_ID']).to.equal('mockId'); + expect(await globalConfig.getSnykToken()).to.equal(''); + expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to get Snyk token from VSCode Secret Storage, Error: ${mockedError.message}`); + expect(globalConfig.secrets.delete).to.be.called; }); }); diff --git a/test/dependencyReportPanel.test.ts b/test/dependencyReportPanel.test.ts index a1df5b3fe..075ca05a9 100644 --- a/test/dependencyReportPanel.test.ts +++ b/test/dependencyReportPanel.test.ts @@ -6,7 +6,7 @@ import * as fs from 'fs'; import { DependencyReportPanel } from '../src/dependencyReportPanel'; import * as Templates from '../src/template'; -import { defaultRhdaReportFilePath } from '../src/constants'; +import { DEFAULT_RHDA_REPORT_FILE_PATH } from '../src/constants'; const expect = chai.expect; chai.use(sinonChai); @@ -86,8 +86,8 @@ suite('DependencyReportPanel Modules', () => { DependencyReportPanel.currentPanel.dispose(); - expect(existsSyncStub).to.be.calledWith(defaultRhdaReportFilePath); - expect(unlinkSyncStub).to.be.calledWith(defaultRhdaReportFilePath); + expect(existsSyncStub).to.be.calledWith(DEFAULT_RHDA_REPORT_FILE_PATH); + expect(unlinkSyncStub).to.be.calledWith(DEFAULT_RHDA_REPORT_FILE_PATH); expect(DependencyReportPanel.data).equals(null); expect(DependencyReportPanel.currentPanel).equals(undefined); }); diff --git a/test/exhortServices.test.ts b/test/exhortServices.test.ts index 6e68f327d..a86a6a03d 100644 --- a/test/exhortServices.test.ts +++ b/test/exhortServices.test.ts @@ -19,21 +19,12 @@ suite('ExhortServices module', async () => { } }; - let vscodeMock = { - window: { - showInformationMessage: sinon.spy(), - showWarningMessage: sinon.spy(), - showErrorMessage: sinon.spy(), - } - }; - let exhortServicesRewire; setup(async () => { sandbox = sinon.createSandbox(); exhortServicesRewire = await rewireModule(compiledFilePath); exhortServicesRewire.__Rewire__('exhort_javascript_api_1', exhortMock); - exhortServicesRewire.__Rewire__('vscode', vscodeMock); }); teardown(() => { @@ -49,19 +40,12 @@ suite('ExhortServices module', async () => { }); test('should perform token validation with Exhort Validate Token service', async () => { - await exhortServicesRewire.tokenValidationService(200, 'provider'); - await exhortServicesRewire.tokenValidationService(400, 'provider'); - await exhortServicesRewire.tokenValidationService(401, 'provider'); - await exhortServicesRewire.tokenValidationService(403, 'provider'); - await exhortServicesRewire.tokenValidationService(429, 'provider'); - await exhortServicesRewire.tokenValidationService(500, 'provider'); - - expect(vscodeMock.window.showInformationMessage).to.have.been.calledWith('provider Token Validated Successfully'); - expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Missing token. Please provide a valid provider Token in the extension workspace settings. Status: 400'); - expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Invalid token. Please provide a valid provider Token in the extension workspace settings. Status: 401'); - expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Forbidden. The token does not have permissions. Please provide a valid provider Token in the extension workspace settings. Status: 403'); - expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Too many requests. Rate limit exceeded. Please try again in a little while. Status: 429'); - expect(vscodeMock.window.showWarningMessage).to.have.been.calledWith('Failed to validate token. Status: 500'); + expect(await exhortServicesRewire.tokenValidationService(200, 'provider')).to.equal(undefined); + expect(await exhortServicesRewire.tokenValidationService(400, 'provider')).to.equal('Missing token. Please provide a valid provider Token in the extension workspace settings. Status: 400'); + expect(await exhortServicesRewire.tokenValidationService(401, 'provider')).to.equal('Invalid token. Please provide a valid provider Token in the extension workspace settings. Status: 401'); + expect(await exhortServicesRewire.tokenValidationService(403, 'provider')).to.equal('Forbidden. The token does not have permissions. Please provide a valid provider Token in the extension workspace settings. Status: 403'); + expect(await exhortServicesRewire.tokenValidationService(429, 'provider')).to.equal('Too many requests. Rate limit exceeded. Please try again in a little while. Status: 429'); + expect(await exhortServicesRewire.tokenValidationService(500, 'provider')).to.equal('Failed to validate token. Status: 500'); }); test('should fail to generate RHDA report HTML from Exhort Stack Analysis service and reject with error', async () => { @@ -97,8 +81,6 @@ suite('ExhortServices module', async () => { exhortServicesRewire.__Rewire__('exhort_javascript_api_1', exhortMock); - await exhortServicesRewire.tokenValidationService(500, 'provider'); - - expect(vscodeMock.window.showErrorMessage).to.have.been.calledWith('Failed to validate token, Error: Validation Error'); + expect(await exhortServicesRewire.tokenValidationService(500, 'provider')).to.equal('Failed to validate token, Error: Validation Error'); }); }); \ No newline at end of file diff --git a/test/extension.test.ts b/test/extension.test.ts index 32b436cd6..0056c4f7b 100644 --- a/test/extension.test.ts +++ b/test/extension.test.ts @@ -17,12 +17,12 @@ suite('Fabric8 Analytics Extension', () => { test('should register all fabric8 commands', async function () { const FABRIC8_COMMANDS: string[] = [ - Commands.TRIGGER_FULL_STACK_ANALYSIS, - Commands.TRIGGER_STACK_LOGS, - Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR, - Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER, - Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN, - Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR + Commands.STACK_ANALYSIS_COMMAND, + Commands.STACK_LOGS_COMMAND, + Commands.STACK_ANALYSIS_FROM_EDITOR_COMMAND, + Commands.STACK_ANALYSIS_FROM_EXPLORER_COMMAND, + Commands.STACK_ANALYSIS_FROM_PIE_BTN_COMMAND, + Commands.STACK_ANALYSIS_FROM_STATUS_BAR_COMMAND ]; // @ts-ignore assert.ok((await vscode.commands.getCommands(true)).includes(...FABRIC8_COMMANDS)); diff --git a/test/stackAnalysis.test.ts b/test/stackAnalysis.test.ts index b140a6cfe..8fa706249 100644 --- a/test/stackAnalysis.test.ts +++ b/test/stackAnalysis.test.ts @@ -21,6 +21,14 @@ suite('StackAnalysis module', () => { setup(() => { sandbox = sinon.createSandbox(); + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => 'mockToken', + delete: () => sandbox.stub() + } + }); }); teardown(() => { @@ -48,8 +56,6 @@ suite('StackAnalysis module', () => { callback(null); }); - globalConfig.exhortSnykToken = 'mockToken'; - await generateRHDAReport(context, MockUri); expect(authorizeRHDAStub.calledOnce).to.be.true; @@ -63,8 +69,6 @@ suite('StackAnalysis module', () => { const authorizeRHDAStub = sandbox.stub(globalConfig, 'authorizeRHDA').resolves(); const stackAnalysisServiceStub = sandbox.stub(exhortServices, 'stackAnalysisService').rejects(new Error('Mock Error')); - globalConfig.exhortSnykToken = ''; - await generateRHDAReport(context, MockUri) .then(() => { throw (new Error('should have thrown error')) diff --git a/test/tokenValidation.test.ts b/test/tokenValidation.test.ts index d03be7b4f..f981a1ece 100644 --- a/test/tokenValidation.test.ts +++ b/test/tokenValidation.test.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import { globalConfig } from '../src/config'; import { validateSnykToken } from '../src/tokenValidation' import * as exhortServices from '../src/exhortServices' -import { snykURL } from '../src/constants'; +import { SNYK_URL } from '../src/constants'; const expect = chai.expect; chai.use(sinonChai); @@ -23,7 +23,6 @@ suite('TokenValidation module', () => { }); test('should validate non-empty Snyk token', async () => { - globalConfig.exhortSnykToken = 'mockToken'; globalConfig.telemetryId = 'mockId'; const options = { 'RHDA_TOKEN': 'mockId', @@ -33,21 +32,16 @@ suite('TokenValidation module', () => { const exhortServicesStub = sandbox.stub(exhortServices, 'tokenValidationService'); - await validateSnykToken(); + await validateSnykToken('mockToken'); expect(exhortServicesStub.calledOnceWithExactly(options, 'Snyk')).to.be.true; }); test('should validate empty Snyk token', async () => { - globalConfig.exhortSnykToken = ''; - const expectedMsg = `Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, Snyk vulnerabilities will not be displayed. To resolve this issue, please obtain a valid token from the following link: [here](${snykURL}).`; + const expectedMsg = `Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, Snyk vulnerabilities will not be displayed. To resolve this issue, please obtain a valid token from the following link: [here](${SNYK_URL}).`; - const showInformationMessageStub = sandbox.stub(vscode.window, 'showInformationMessage'); + const message = await validateSnykToken(''); - await validateSnykToken(); - - const showInformationMessageCall = showInformationMessageStub.getCall(0); - const showInformationMessageMsg = showInformationMessageCall.args[0]; - expect(showInformationMessageMsg.replace(/\s+/g, ' ').replace(/\n/g, ' ')).to.equal(expectedMsg); + expect(message.replace(/\s+/g, ' ').replace(/\n/g, ' ')).to.equal(expectedMsg); }); }); \ No newline at end of file From 8d68fd94b12f28fbd88a651fd62b6232c7bc327d Mon Sep 17 00:00:00 2001 From: Ilona Shishov Date: Thu, 29 Feb 2024 14:44:06 +0200 Subject: [PATCH 5/7] chore: add feedback notifications Signed-off-by: Ilona Shishov --- src/config.ts | 17 +++++++-- src/exhortServices.ts | 2 + src/extension.ts | 9 ++++- src/tokenValidation.ts | 7 +++- test/config.test.ts | 74 +++++++++++++++++++++++++++++------- test/exhortServices.test.ts | 5 +++ test/redhatTelemetry.test.ts | 4 +- test/tokenValidation.test.ts | 8 +++- 8 files changed, 100 insertions(+), 26 deletions(-) diff --git a/src/config.ts b/src/config.ts index f554b6b87..ec4bd3f6a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -124,6 +124,7 @@ class Config { try { await this.secrets.store(SNYK_TOKEN_KEY, token); + vscode.window.showInformationMessage('Snyk token has been saved successfully'); } catch (error) { vscode.window.showErrorMessage(`Failed to save Snyk token to VSCode Secret Storage, Error: ${error.message}`); } @@ -139,7 +140,7 @@ class Config { return token || ''; } catch (error) { vscode.window.showErrorMessage(`Failed to get Snyk token from VSCode Secret Storage, Error: ${error.message}`); - await this.clearSnykToken(); + await this.clearSnykToken(false); return ''; } } @@ -147,13 +148,21 @@ class Config { /** * Clears the Snyk token. * @returns A Promise that resolves when the token is cleared. - * @private */ - private async clearSnykToken(): Promise { + async clearSnykToken(notify: boolean): Promise { try { await this.secrets.delete(SNYK_TOKEN_KEY); + if (notify) { + vscode.window.showInformationMessage('Snyk token has been removed successfully'); + } } catch (error) { - console.error(`Error while deleting Snyk token from VSCode Secret Storage, Error: ${error.message}`); + const errorMsg = `Failed to delete Snyk token from VSCode Secret Storage, Error: ${error.message}`; + if (notify) { + vscode.window.showErrorMessage(errorMsg); + } else { + console.error(errorMsg); + } + } } } diff --git a/src/exhortServices.ts b/src/exhortServices.ts index d2d688d3a..331ee78a7 100644 --- a/src/exhortServices.ts +++ b/src/exhortServices.ts @@ -1,5 +1,6 @@ 'use strict'; +import * as vscode from 'vscode'; import exhort from '@RHEcosystemAppEng/exhort-javascript-api'; /** @@ -35,6 +36,7 @@ async function tokenValidationService(options, source): Promise { if ( tokenValidationStatus === 200 ) { + vscode.window.showInformationMessage(`${source} token validated successfully`); return; } else if ( tokenValidationStatus === 400 diff --git a/src/extension.ts b/src/extension.ts index 3f7031164..7d0e1308a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -83,8 +83,13 @@ export function activate(context: vscode.ExtensionContext) { validateInput: validateSnykToken }); - if (!token) { return; } - await globalConfig.setSnykToken(token); + if (token === undefined) { + return; + } else if (token === '') { + await globalConfig.clearSnykToken(true); + } else { + await globalConfig.setSnykToken(token); + } } ); diff --git a/src/tokenValidation.ts b/src/tokenValidation.ts index db0931636..908005c42 100644 --- a/src/tokenValidation.ts +++ b/src/tokenValidation.ts @@ -1,5 +1,7 @@ 'use strict'; +import * as vscode from 'vscode'; + import { globalConfig } from './config'; import { SNYK_URL } from './constants'; import { tokenValidationService } from './exhortServices'; @@ -25,9 +27,10 @@ async function validateSnykToken(token: string): Promise { } else { - return `Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, + vscode.window.showInformationMessage(`Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, Snyk vulnerabilities will not be displayed. - To resolve this issue, please obtain a valid token from the following link: [here](${SNYK_URL}).`; + To resolve this issue, please obtain a valid token from the following link: [here](${SNYK_URL}).`); + return; } } diff --git a/test/config.test.ts b/test/config.test.ts index 8ea5ba7c4..e951ed099 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -85,18 +85,18 @@ suite('Config module', () => { delete: () => sandbox.stub() } }); - - const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); const storeSecretSpy = sandbox.spy(globalConfig.secrets, 'store'); + const showInformationMessageSpy = sandbox.spy(vscode.window, 'showInformationMessage'); + sandbox.spy(vscode.window, 'showErrorMessage'); await globalConfig.setSnykToken(mockToken); expect(storeSecretSpy).to.have.been.calledWith(SNYK_TOKEN_KEY, mockToken); - expect(showErrorMessageSpy.called).to.be.false; + expect(showInformationMessageSpy).to.have.been.calledWith('Snyk token has been saved successfully'); + expect(vscode.window.showErrorMessage).to.not.be.called; }); test('should fail to set Snyk token in VSCode SecretStorage', async () => { - const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage') globalConfig.linkToSecretStorage({ secrets: { @@ -107,9 +107,12 @@ suite('Config module', () => { delete: () => sandbox.stub() } }); + sandbox.spy(vscode.window, 'showInformationMessage'); + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage') await globalConfig.setSnykToken(mockToken); + expect(vscode.window.showInformationMessage).to.not.be.called; expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to save Snyk token to VSCode Secret Storage, Error: ${mockedError.message}`); }); @@ -122,14 +125,15 @@ suite('Config module', () => { delete: () => sandbox.stub() } }); - - const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); - const storeSecretSpy = sandbox.spy(globalConfig.secrets, 'store'); + sandbox.spy(globalConfig.secrets, 'store'); + sandbox.spy(vscode.window, 'showInformationMessage'); + sandbox.spy(vscode.window, 'showErrorMessage'); await globalConfig.setSnykToken(undefined); - expect(storeSecretSpy.called).to.be.false; - expect(showErrorMessageSpy.called).to.be.false; + expect(globalConfig.secrets.store).to.not.be.called; + expect(vscode.window.showInformationMessage).to.not.be.called; + expect(vscode.window.showErrorMessage).to.not.be.called; }); test('should get Snyk token from VSCode SecretStorage', async () => { @@ -169,16 +173,16 @@ suite('Config module', () => { delete: () => sandbox.stub() } }); - - const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); sandbox.spy(globalConfig.secrets, 'delete'); + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); expect(await globalConfig.getSnykToken()).to.equal(''); + expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to get Snyk token from VSCode Secret Storage, Error: ${mockedError.message}`); expect(globalConfig.secrets.delete).to.be.called; }); - test('should fail to delete Snyk token from VSCode SecretStorage', async () => { + test('should fail to get and delete Snyk token from VSCode SecretStorage', async () => { globalConfig.linkToSecretStorage({ secrets: { @@ -191,12 +195,54 @@ suite('Config module', () => { }, } }); - - const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); sandbox.spy(globalConfig.secrets, 'delete'); + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); expect(await globalConfig.getSnykToken()).to.equal(''); + expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to get Snyk token from VSCode Secret Storage, Error: ${mockedError.message}`); expect(globalConfig.secrets.delete).to.be.called; }); + + test('should delete Snyk token from VSCode SecretStorage', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => '', + delete: () => sandbox.stub() + } + }); + const deleteSecretSpy = sandbox.spy(globalConfig.secrets, 'delete'); + const showInformationMessageSpy = sandbox.spy(vscode.window, 'showInformationMessage'); + sandbox.spy(vscode.window, 'showErrorMessage'); + + await globalConfig.clearSnykToken(true); + + expect(deleteSecretSpy).to.have.been.calledWith(SNYK_TOKEN_KEY); + expect(showInformationMessageSpy).to.have.been.calledWith('Snyk token has been removed successfully'); + expect(vscode.window.showErrorMessage).to.not.be.called; + }); + + test('should fail to delete Snyk token from VSCode SecretStorage', async () => { + + globalConfig.linkToSecretStorage({ + secrets: { + store: () => sandbox.stub(), + get: () => '', + delete: async () => { + throw mockedError; + }, + } + }); + const deleteSecretSpy = sandbox.spy(globalConfig.secrets, 'delete'); + sandbox.spy(vscode.window, 'showInformationMessage'); + const showErrorMessageSpy = sandbox.spy(vscode.window, 'showErrorMessage'); + + await globalConfig.clearSnykToken(true); + + expect(deleteSecretSpy).to.have.been.calledWith(SNYK_TOKEN_KEY); + expect(vscode.window.showInformationMessage).to.not.be.called; + expect(showErrorMessageSpy).to.have.been.calledWith(`Failed to delete Snyk token from VSCode Secret Storage, Error: ${mockedError.message}`); + }); }); diff --git a/test/exhortServices.test.ts b/test/exhortServices.test.ts index a86a6a03d..45d4a6379 100644 --- a/test/exhortServices.test.ts +++ b/test/exhortServices.test.ts @@ -2,6 +2,7 @@ import * as chai from 'chai'; import * as sinon from 'sinon'; import * as sinonChai from 'sinon-chai'; import { rewireModule, cleanupRewireFiles } from './utils'; +import * as vscode from 'vscode'; const expect = chai.expect; chai.use(sinonChai); @@ -40,7 +41,11 @@ suite('ExhortServices module', async () => { }); test('should perform token validation with Exhort Validate Token service', async () => { + sandbox.spy(vscode.window, 'showInformationMessage'); + expect(await exhortServicesRewire.tokenValidationService(200, 'provider')).to.equal(undefined); + expect(vscode.window.showInformationMessage).to.have.been.calledWith('provider token validated successfully'); + expect(await exhortServicesRewire.tokenValidationService(400, 'provider')).to.equal('Missing token. Please provide a valid provider Token in the extension workspace settings. Status: 400'); expect(await exhortServicesRewire.tokenValidationService(401, 'provider')).to.equal('Invalid token. Please provide a valid provider Token in the extension workspace settings. Status: 401'); expect(await exhortServicesRewire.tokenValidationService(403, 'provider')).to.equal('Forbidden. The token does not have permissions. Please provide a valid provider Token in the extension workspace settings. Status: 403'); diff --git a/test/redhatTelemetry.test.ts b/test/redhatTelemetry.test.ts index 9c7bc6d05..c032fee99 100644 --- a/test/redhatTelemetry.test.ts +++ b/test/redhatTelemetry.test.ts @@ -17,8 +17,8 @@ suite('RedhatTelemetry module', async () => { } let sendEventMock = { - sendStartupEvent: sinon.spy(), - send: sinon.spy() + sendStartupEvent: sandbox.spy(), + send: sandbox.spy() } let getIdProviderMock = { diff --git a/test/tokenValidation.test.ts b/test/tokenValidation.test.ts index f981a1ece..c1e965bc7 100644 --- a/test/tokenValidation.test.ts +++ b/test/tokenValidation.test.ts @@ -40,8 +40,12 @@ suite('TokenValidation module', () => { test('should validate empty Snyk token', async () => { const expectedMsg = `Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, Snyk vulnerabilities will not be displayed. To resolve this issue, please obtain a valid token from the following link: [here](${SNYK_URL}).`; - const message = await validateSnykToken(''); + const showInformationMessageStub = sandbox.stub(vscode.window, 'showInformationMessage'); - expect(message.replace(/\s+/g, ' ').replace(/\n/g, ' ')).to.equal(expectedMsg); + await validateSnykToken(''); + + const showInformationMessageCall = showInformationMessageStub.getCall(0); + const showInformationMessageMsg = showInformationMessageCall.args[0]; + expect(showInformationMessageMsg.replace(/\s+/g, ' ').replace(/\n/g, ' ')).to.equal(expectedMsg); }); }); \ No newline at end of file From fb7e79a3425571b83a05c622b65d82828cd0750d Mon Sep 17 00:00:00 2001 From: ritz303 Date: Tue, 5 Mar 2024 03:00:25 -0600 Subject: [PATCH 6/7] docs: Updates to the change log and readme files (#687) * 2/21/24 - ritz303 : Updates to the readme and change log * ritz303 - 2/22/24 : Moved data source info to the intro * 2/27/24 - ritz303 : Minor edit from SME review * 2/27/24 - ritz303 : Minor edit from personal review * 2/29/24 - gunnage : Minor edit from SME review * 3/4/24 - ritz303 : Added VS Code Secret Storage content --------- Co-authored-by: Aron Gunn --- CHANGELOG.md | 6 +++++ README.md | 25 +++++++++++------- .../screenshots/RHDA_Invalid_Snyk_Token.png | Bin 0 -> 10198 bytes .../RHDA_Snyk_Token_Storage_Setting.png | Bin 0 -> 24902 bytes .../RHDA_Snyk_Token_dialog_box.png | Bin 0 -> 7356 bytes 5 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 images/screenshots/RHDA_Invalid_Snyk_Token.png create mode 100644 images/screenshots/RHDA_Snyk_Token_Storage_Setting.png create mode 100644 images/screenshots/RHDA_Snyk_Token_dialog_box.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 210955ba6..b6c492fde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ # Change Log +## 0.9.3 (?) +- enhancement - Red Hat Dependency Analytics reporting has integrated the ONGuard service by using [Open Source Vulnerability (OSV)](https://google.github.io/osv.dev/) and the [National Vulnerability Database (NVD)](https://nvd.nist.gov/) data sources for additional vulnerability information. +- enhancement - Integrated VS Code's [Secret Storage](https://code.visualstudio.com/api/references/vscode-api#SecretStorage) feature for securing the Snyk token. See [PR689](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/pull/689) for details. +- fixes - Fixed an issue with displaying wrong data when the event handler for Component Analysis was triggered on a unsaved manifest file. Component Analysis is no longer triggered on unsaved manifest files. See [PR#239](https://github.com/fabric8-analytics/fabric8-analytics-lsp-server/pull/239) for details. +- fixes - Fixed an issue where the diagnostic source name is being obscured in the View Problem panel from an inline analysis. See [PR#239](https://github.com/fabric8-analytics/fabric8-analytics-lsp-server/pull/239) for details. +- informational - The naming convention for VS Code commands has changed from `fabric8` to `rhda`. For example, `fabric8.stackAnalysis` is now `rhda.stackAnalysis`. ## 0.9.2 (Feb 5th 2024) - informational - The `redHatDependencyAnalyticsReportFilePath` setting name has changed to `reportFilePath`. If you had a custom file path set for `redHatDependencyAnalyticsReportFilePath`, then you need to add your custom file path to the `reportFilePath` setting. - enhancement - Added a vulnerability severity alert level setting for the user to receive inline notifications for just errors or warnings. See [PR#674](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/pull/674) for details. diff --git a/README.md b/README.md index a0910af91..c39baf9a8 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,11 @@ ![CI](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/workflows/CI/badge.svg?branch=master) [![Codecov](https://codecov.io/gh/fabric8-analytics/fabric8-analytics-vscode-extension/branch/master/graph/badge.svg?token=rHIO4KNlJ0)](https://codecov.io/gh/fabric8-analytics/fabric8-analytics-vscode-extension) -Red Hat's Dependency Analytics (RHDA) extension gives you awareness to security concerns within your software supply chain while you build your application. -The Red Hat Dependency Analytics extension uses the Snyk REST API to query [Snyk's Vulnerability Database](https://snyk.io/product/vulnerability-database/) for the most up-to-date vulnerability information available. -Snyk uses industry-leading security intelligence by pulling from many data sources to give you exact vulnerability information. +Red Hat's Dependency Analytics (RHDA) extension gives you awareness to security concerns within your software supply chain while you code your application. +The Red Hat Dependency Analytics extension uses the following data sources for the most up-to-date vulnerability information available: + +- [Snyk's Vulnerability Database](https://snyk.io/product/vulnerability-database/) is an industry-leading security intelligence service. Red Hat Dependency Analytics uses Snyk's REST API to query for the latest vulnerability information available. +- The [ONGuard](https://github.com/RHEcosystemAppEng/ONguard) service, integrates the [Open Source Vulnerability (OSV)](https://google.github.io/osv.dev/) and the [National Vulnerability Database (NVD)](https://nvd.nist.gov/) data sources. When given a set of packages to the ONGuard service, a query to OSV retrieves the associated vulnerability information, and then a query to NVD for public Common Vulnerability and Exposures (CVE) information. **NOTE:**
The Red Hat Dependency Analytics extension is an online service hosted and maintained by Red Hat. @@ -83,11 +85,16 @@ The Red Hat Dependency Analytics extension has some configurable parameters that
The Snyk token allows Exhort to authenticate with the Snyk Vulnerability Database. If a Snyk token is not provided, Snyk vulnerability information is not displayed. -If you leave this field blank, the following informational message is displayed. -
![ Screenshot of the empty token dialog box ](images/screenshots/empty-token.png) +To securely store your Snyk token, RHDA uses VS Code's [Secret Storage](https://code.visualstudio.com/api/references/vscode-api#SecretStorage) feature. +From VS Code's Command Palette, enter `RHDA: Set Snyk Token`. +Next, enter your Snyk token. +
![ Screenshot of the Snyk token dialog box](images/screenshots/RHDA_Snyk_Token_dialog_box.png) + +If you enter a invalid Snyk token, the dialog box alerts you that your Snyk token is not valid. +
![ Screenshot of the invalid Snyk token dialog box ](images/screenshots/RHDA_Invalid_Snyk_Token.png) -If you enter a invalid Snyk token, a pop-up message alerts you that your Snyk token is not valid. -
![ Screenshot of the invalid token dialog box ](images/screenshots/invalid-token.png) +In the extension settings, you can set RHDA to always use VS Code's Secret Storage. +
![ Screenshot of the RHDA Snyk token storage setting](images/screenshots/RHDA_Snyk_Token_Storage_Setting.png) If you need a new Snyk token, you can generate a new token [here](https://app.snyk.io/login?utm_campaign=Code-Ready-Analytics-2020&utm_source=code_ready&code_ready=FF1B53D9-57BE-4613-96D7-1D06066C38C9). @@ -106,7 +113,7 @@ The default path is `/tmp/redhatDependencyAnalyticsReport.html`. - **Component analysis**
Upon opening a manifest file, such as a `pom.xml`, `package.json`, `go.mod` or `requirements.txt` file, a scan starts the analysis process. The scan provides immediate inline feedback on detected security vulnerabilities for your application's dependencies. - Such dependencies are appropriately underlined in red, and hovering over it gives you a short summary of the security concern from Snyk. + Such dependencies are appropriately underlined in red, and hovering over it gives you a short summary of the security concern from the available data sources. The summary has the full package name, version number, the amount of known security vulnerabilities, and the highest severity status of said vulnerabilities. **NOTE:** Add the `target` folder to your `.gitignore` file to exclude it from Git monitoring. @@ -122,7 +129,7 @@ The default path is `/tmp/redhatDependencyAnalyticsReport.html`.
**IMPORTANT:** For Maven projects only, when analyzing a `pom.xml` file. You must configure Red Hat's generally available (GA) repository to use the recommendations or remediations. Add this repository, `https://maven.repository.redhat.com/ga/`, to your project's configuration. - + - **Excluding dependencies with `exhortignore`**
You can exclude a package from analysis by marking the package for exclusion. If you wish to ignore vulnerabilities for a dependency in a `pom.xml` file, you must add `exhortignore` as a comment against the dependency, group id, artifact id, or version scopes of that particular dependency in the manifest file. diff --git a/images/screenshots/RHDA_Invalid_Snyk_Token.png b/images/screenshots/RHDA_Invalid_Snyk_Token.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7e3a9369c36947f1795c4618d255a4f6d2179b GIT binary patch literal 10198 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 bwq78^)9G*xe5XDClhjFzD~Oed82J4k*a`w9 literal 0 HcmV?d00001 diff --git a/images/screenshots/RHDA_Snyk_Token_Storage_Setting.png b/images/screenshots/RHDA_Snyk_Token_Storage_Setting.png new file mode 100644 index 0000000000000000000000000000000000000000..ff91f17183a6ab2be802ac639da1d3b117073c94 GIT binary patch literal 24902 zcmcHhbyQVh+Xo1PNJ%M5r?j+mBS@!ohje$>K@gDcF6jp829fUW?(XindEWP#`Tm%1 zt@&eSEmY(j_da{?>%OjE-3ES>5k+}}`vwXM3PoH@NFE9bh68*bjQ|IJ7i?`}0)HUd zh^g5_L7{fM{DO|9LB)fDB8Czd5>RwWIaqXdQJ8%Gd+I#Kvb#hV6DM~S$JC!j=YAYY zf+q}llj-wo?TgSi9IKd5?%YtbS$-Ajzl-B)K5&gCI*^-2EfZyAWV}y2<1O1hb!Du- zUa*%Ls^9iH;=EQ~J3h9Sl9m>J`&!^XU#qP$cg4)a2tNPwbyD{WO7wqU`-$a`VDrCk z6L9(d|KbZhX&2BNY&EiXZ~ynS#1Gvj_V#IF4SI0@-=F>e*@YZ@XS*V}BGddD|3hcx+@y~G>TU`u&H<54QR{}Vma-LQVA$zT18xbr<<%zx_ZnK>w} zt^AB!SCwdPs#w@E&n}zw+|YA_PE)<9FQr%Oggh*Z->WSsT0ExcAeeW=WdqM;@y%A5 zWm`DiNFuK}W-PVRYhrHhqS@X7o{;Nxp? zIqMxYp^1x&e_|z&MMK-0D(R2R5|!jZ^=>mEqhXFtj+8s#xAETD+3A*#dnR|PsquK4 z&Fe8>!h}@+?8(nJjzTL?l&CG$y4_w8V8KO!N=#Jy>E{<25pg3FR*=sefo3F|Yfh?@ zVt^a-c^gst8TPm&^vk(W*bP(>S5v({o`TtjOGEs9?cL6YXjyVfLwP;VSysIbG6)Go zOW0_WmvjMdjm(fHDrj(v=n8*KoH<{GL!|2oY z)S&K#m5v$vLDx*6Wqr;1DJ%z6qMDk;Yy$?oJN#UYWqZ-O&T6Hf&RZ<3YX*5{zLpS- zEX#Q|7L$?RGfz z`JyL}PNxCKQwf!4wa9g`H|x7jDU$$$U#&hk=eVCf09}H6y0r$2Oi$F?QmtdJw*J#P zl`EpegR2e2n=h<=*;C3t@0BJDHh%#@P{d_1#|L;<>QW(I{x)gT%gqlrZ>(GP`iHrN zz5i3)&yHx9NjsTpq_ve@b9P-K*p%&ucXg^HyXs5Wy|R?^!;sW!Gw zTSJSD7PA$xI|&qXO=O*z+H4tcf%)2iGZK(vpjL(o-s!}x&RlRKEayHt&5b!64i)m7m(sD4hXbiOsX zGg(O~6BhO}jaO1zJ5Bg$QBwanK?af5WqU3a!7edY|1>Vu^p$lyV`~MyPfX!>hHnz zQupMfAGlnD{wYg*9tVVaO_}ATX4A23L?@>js@UF#ll5@2Pq7!r)A2@wN#Bi)Mcv%E z;87piL8T?~SyB(l40+t$ZexeS`bY`07T$VO7+@UJ%?0iKc$o6^#N+nwE;pzTLe28c z*U%25Hshz+8v3p^hoF3%<_EdKav*99;_xnvo~`qQbNsqBa;VZ@l`=P|cR3b+iu{;> zSXQzf#AzjG?{(}p1T$fqIb3vT6Erv6pyPWCuO<_Uefz{6a;yrk150I%Z+OT~RDNb+ zm%$|>7aA!EG1Lx5o@!266 z@wlhgyKMTBQoJ(APvW9L)E2b_qlyFDvS{?#THX3pp_?~#*g3?rdpo#hiT^2rrioui z{J2(h&AK&wH+B2%f(cWwF=|I^6lL1g?~s|{VWQ#H_~2X~*P7(EyyI}PzbawWdi?wW zE+<xxaM≧FH<+eL73lHzpk@T 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 z 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 literal 0 HcmV?d00001 diff --git a/images/screenshots/RHDA_Snyk_Token_dialog_box.png b/images/screenshots/RHDA_Snyk_Token_dialog_box.png new file mode 100644 index 0000000000000000000000000000000000000000..b0bada53637659030604ecae1afe7f77f9a35643 GIT binary patch literal 7356 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 yWmKx6usM Date: Tue, 5 Mar 2024 11:43:52 +0200 Subject: [PATCH 7/7] docs: update README Signed-off-by: Ilona Shishov --- README.md | 9 ++++----- ...ndency-analysis-in-progress-status-bar.png | Bin 3470 -> 0 bytes .../extension-workspace-settings.png | Bin 104498 -> 69652 bytes images/screenshots/found-vulns-status-bar.png | Bin 2610 -> 0 bytes images/screenshots/invalid-token.png | Bin 14280 -> 0 bytes 5 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 images/screenshots/dependency-analysis-in-progress-status-bar.png delete mode 100644 images/screenshots/found-vulns-status-bar.png delete mode 100644 images/screenshots/invalid-token.png diff --git a/README.md b/README.md index c39baf9a8..1f9c2fd42 100644 --- a/README.md +++ b/README.md @@ -61,10 +61,9 @@ Click the **Workspace** tab, search for the word _executable_, and specify the a 7. (OPTIONAL) You can link your Snyk account to Red Hat Dependency Analytics by doing the following: 1. Log into your [Snyk account](https://app.snyk.io/login?utm_campaign=Code-Ready-Analytics-2020&utm_source=code_ready&code_ready=FF1B53D9-57BE-4613-96D7-1D06066C38C9). 2. On the account landing page, you can find your Snyk Token, copy the token. - 3. Open the Red Hat Dependency Analytics extension settings. - 4. Click the **Workspace** tab. - 5. Paste the Snyk token in the **Exhort Snyk Token** field. - 6. After adding your Snyk token, the vulnerability report gives you detailed information about security vulnerabilities unique to Snyk, and vulnerabilities that have publicly known exploits. + 3. From VS Code's Command Palette, enter `RHDA: Set Snyk Token`. + 4. Paste the Snyk token into the input field. + 4. After adding your Snyk token, the vulnerability report gives you detailed information about security vulnerabilities unique to Snyk, and vulnerabilities that have publicly known exploits. ## Configuration @@ -81,7 +80,7 @@ The Red Hat Dependency Analytics extension has some configurable parameters that ### Configurable parameters -**Exhort Snyk Token** : +**Snyk Token Storage** :
The Snyk token allows Exhort to authenticate with the Snyk Vulnerability Database. If a Snyk token is not provided, Snyk vulnerability information is not displayed. diff --git a/images/screenshots/dependency-analysis-in-progress-status-bar.png b/images/screenshots/dependency-analysis-in-progress-status-bar.png deleted file mode 100644 index bd5e721e0c256c5113cdb720e252effeed775c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3470 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 diff --git a/images/screenshots/extension-workspace-settings.png b/images/screenshots/extension-workspace-settings.png index d0dd28155f0dabfa44c2b4938d02d37ac4743b78..a0f831cfff4decb68919e081cb23dd7dc6afa1c5 100644 GIT binary patch literal 69652 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 TZlC5M@1>fzcy9LW)w}-zhn-a# literal 104498 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 UPM0snt^fc407*qoM6N<$f^UTKTmS$7 diff --git a/images/screenshots/invalid-token.png b/images/screenshots/invalid-token.png deleted file mode 100644 index f4881ded0bd9fa1046ed93b3c05f970bc0ad0941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14280 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≯jvPC)s%+Jc+}c_&C$IW2Yx;`ZWQrc05(Gej>K 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 VYmJ%lt27TFAtEbWDX1U#UjSp#r-1+f