From 9c5ad1505b96dd31ac87fd925a421d0fb0c40887 Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:24:09 -0700 Subject: [PATCH 1/8] Normalized extension root path before usage. --- src/extensions/extensionsHelper.ts | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/extensions/extensionsHelper.ts b/src/extensions/extensionsHelper.ts index b61073423f5..da2673cc817 100644 --- a/src/extensions/extensionsHelper.ts +++ b/src/extensions/extensionsHelper.ts @@ -408,24 +408,17 @@ export async function promptForValidRepoURI(): Promise { } /** - * Prompts for a valid extension root. + * Prompts for an extension root. * * @param defaultRoot the default extension root */ -export async function promptForValidExtensionRoot(defaultRoot: string): Promise { - let rootIsValid = false; - let extensionRoot = ""; - while (!rootIsValid) { - extensionRoot = await promptOnce({ - type: "input", - message: - "Enter this extension's root directory in the repo (defaults to previous root if set):", - default: defaultRoot, - }); - // TODO: Add real directory path validation. - rootIsValid = true; - } - return extensionRoot; +export async function promptForExtensionRoot(defaultRoot: string): Promise { + return await promptOnce({ + type: "input", + message: + "Enter this extension's root directory in the repo (defaults to previous root if set):", + default: defaultRoot, + }); } /** @@ -817,11 +810,15 @@ export async function uploadExtensionVersionFromGitHubSource(args: { if (!extensionRoot) { const defaultRoot = "/"; if (!args.nonInteractive) { - extensionRoot = await promptForValidExtensionRoot(defaultRoot); + extensionRoot = await promptForExtensionRoot(defaultRoot); } else { extensionRoot = defaultRoot; } } + extensionRoot = + extensionRoot !== "/" + ? path.join(extensionRoot).replaceAll(/^[.\/]*|[\/]*$/g, "") + : extensionRoot; // Prompt for source ref and default to HEAD. let sourceRef = args.sourceRef; From a17864e1e8b8e720387579e5d3c1d2b9373cdaab Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:25:00 -0700 Subject: [PATCH 2/8] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ddb4feca9c..d683d3351de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2 +1,3 @@ - Increased extension instance create poll timeout to 1h to match backend (#5969). - Refactored `ext:install` to use the latest extension metadata. (#5997) +- Normalized extension root path before usage in `ext:dev:upload`. (#6054) \ No newline at end of file From 91b81ace7c9fa9ee2a13c4a7882cb55915819e82 Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:27:18 -0700 Subject: [PATCH 3/8] Update publisherApi.ts --- src/extensions/publisherApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/publisherApi.ts b/src/extensions/publisherApi.ts index 877ccac7198..b1caa6f177f 100644 --- a/src/extensions/publisherApi.ts +++ b/src/extensions/publisherApi.ts @@ -205,7 +205,7 @@ export async function createExtensionVersionFromGitHubSource(args: { ExtensionVersion >(`/${refs.toExtensionName(ref)}/versions:createFromSource`, { versionId: ref.version, - extensionRoot: args.extensionRoot ?? "/", + extensionRoot: args.extensionRoot || "/", githubRepositorySource: { uri: args.repoUri, sourceRef: args.sourceRef, From 9f3c9844c83f319e44530c1a949b62c9c69122d1 Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:29:38 -0700 Subject: [PATCH 4/8] Update extensionsHelper.ts --- src/extensions/extensionsHelper.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/extensions/extensionsHelper.ts b/src/extensions/extensionsHelper.ts index da2673cc817..812e15408fb 100644 --- a/src/extensions/extensionsHelper.ts +++ b/src/extensions/extensionsHelper.ts @@ -815,10 +815,8 @@ export async function uploadExtensionVersionFromGitHubSource(args: { extensionRoot = defaultRoot; } } - extensionRoot = - extensionRoot !== "/" - ? path.join(extensionRoot).replaceAll(/^[.\/]*|[\/]*$/g, "") - : extensionRoot; + const normalizedRoot = path.join(extensionRoot).replaceAll(/^[.\/]*|[\/]*$/g, ""); + extensionRoot = normalizedRoot ? normalizedRoot : "/"; // Prompt for source ref and default to HEAD. let sourceRef = args.sourceRef; From 4cf3f3648f7d223790751ebbfb98e21c5f2874f6 Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:33:24 -0700 Subject: [PATCH 5/8] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d683d3351de..5484a42cfb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,3 @@ - Increased extension instance create poll timeout to 1h to match backend (#5969). - Refactored `ext:install` to use the latest extension metadata. (#5997) -- Normalized extension root path before usage in `ext:dev:upload`. (#6054) \ No newline at end of file +- Normalized extension root path before usage in `ext:dev:upload`. (#6054) From 581dd5f31c5bf9765672b6f2daeb887ed23bf5bf Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:52:50 -0700 Subject: [PATCH 6/8] Replaced join() with normalize() and fixed regex. --- src/extensions/extensionsHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/extensionsHelper.ts b/src/extensions/extensionsHelper.ts index 812e15408fb..074322a777b 100644 --- a/src/extensions/extensionsHelper.ts +++ b/src/extensions/extensionsHelper.ts @@ -815,7 +815,7 @@ export async function uploadExtensionVersionFromGitHubSource(args: { extensionRoot = defaultRoot; } } - const normalizedRoot = path.join(extensionRoot).replaceAll(/^[.\/]*|[\/]*$/g, ""); + const normalizedRoot = path.normalize(extensionRoot).replaceAll(/^(\.\.\/)*|(\/$)/g, ""); extensionRoot = normalizedRoot ? normalizedRoot : "/"; // Prompt for source ref and default to HEAD. From 81b6d55f6baeea89eb49936080fe84583412b8cc Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 10:57:51 -0700 Subject: [PATCH 7/8] Update extensionsHelper.ts --- src/extensions/extensionsHelper.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/extensions/extensionsHelper.ts b/src/extensions/extensionsHelper.ts index 074322a777b..7e13d0aa0b9 100644 --- a/src/extensions/extensionsHelper.ts +++ b/src/extensions/extensionsHelper.ts @@ -815,7 +815,11 @@ export async function uploadExtensionVersionFromGitHubSource(args: { extensionRoot = defaultRoot; } } - const normalizedRoot = path.normalize(extensionRoot).replaceAll(/^(\.\.\/)*|(\/$)/g, ""); + // Normalize root path and strip leading and trailing slashes and all `../`. + const normalizedRoot = path + .normalize(extensionRoot) + .replaceAll(/^\/|\/$/g, "") + .replaceAll(/^(\.\.\/)*/g, ""); extensionRoot = normalizedRoot ? normalizedRoot : "/"; // Prompt for source ref and default to HEAD. From 4344f422f925d2ca3bbd59a0d2fd426e11549b3d Mon Sep 17 00:00:00 2001 From: Alex Pascal Date: Wed, 28 Jun 2023 11:37:46 -0700 Subject: [PATCH 8/8] Update extensionsHelper.ts --- src/extensions/extensionsHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/extensionsHelper.ts b/src/extensions/extensionsHelper.ts index 7e13d0aa0b9..a5025142fe7 100644 --- a/src/extensions/extensionsHelper.ts +++ b/src/extensions/extensionsHelper.ts @@ -820,7 +820,7 @@ export async function uploadExtensionVersionFromGitHubSource(args: { .normalize(extensionRoot) .replaceAll(/^\/|\/$/g, "") .replaceAll(/^(\.\.\/)*/g, ""); - extensionRoot = normalizedRoot ? normalizedRoot : "/"; + extensionRoot = normalizedRoot || "/"; // Prompt for source ref and default to HEAD. let sourceRef = args.sourceRef;