From 99d8d3efd97b2501f3d4bcab6b6fa5dba5a2ed79 Mon Sep 17 00:00:00 2001 From: Asher Date: Wed, 10 Nov 2021 22:43:03 +0000 Subject: [PATCH 1/2] Add back support for unencoded folder/workspace query params Fixes https://github.com/cdr/code-server/issues/4484. --- src/vs/code/browser/workbench/workbench.ts | 34 ++++++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts index ac9c19e2597b2..5781361b29e81 100644 --- a/src/vs/code/browser/workbench/workbench.ts +++ b/src/vs/code/browser/workbench/workbench.ts @@ -37,6 +37,16 @@ function doCreateUri(path: string, queryValues: Map): URI { return URI.parse(window.location.href).with({ path, query }); } +/** + * Encode a path for opening via the folder or workspace query parameter. This + * preserves slashes so it can be edited by hand more easily. + * + * @remark coder + */ +export const encodePath = (path: string): string => { + return path.split('/').map((p) => encodeURIComponent(p)).join('/'); +}; + interface ICredential { service: string; account: string; @@ -319,13 +329,21 @@ class WorkspaceProvider implements IWorkspaceProvider { } // Folder + // NOTE@coder: Modified to print as a human-readable string for file paths. else if (isFolderToOpen(workspace)) { - targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${encodeURIComponent(workspace.folderUri.toString())}`; + const target = workspace.folderUri.scheme === Schemas.vscodeRemote + ? encodePath(workspace.folderUri.path) + : encodeURIComponent(workspace.folderUri.toString()); + targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${target}`; } // Workspace + // NOTE@coder: Modified to print as a human-readable string for file paths. else if (isWorkspaceToOpen(workspace)) { - targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${encodeURIComponent(workspace.workspaceUri.toString())}`; + const target = workspace.workspaceUri.scheme === Schemas.vscodeRemote + ? encodePath(workspace.workspaceUri.path) + : encodeURIComponent(workspace.workspaceUri.toString()); + targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${target}`; } // Append payload if any @@ -423,18 +441,28 @@ class WindowIndicator implements IWindowIndicator { let payload = Object.create(null); let logLevel: string | undefined = undefined; + // NOTE@coder: If the value begins with a slash assume it is a file path and + // convert it to use the vscode-remote scheme. + const toRemote = (value: string): string => { + if (value.startsWith("/")) { + return "vscode-remote://" + value; + } + return value + } + const query = new URL(document.location.href).searchParams; query.forEach((value, key) => { switch (key) { - // Folder case WorkspaceProvider.QUERY_PARAM_FOLDER: + value = toRemote(value); // NOTE@coder: See above. workspace = { folderUri: URI.parse(value) }; foundWorkspace = true; break; // Workspace case WorkspaceProvider.QUERY_PARAM_WORKSPACE: + value = toRemote(value); // NOTE@coder: See above. workspace = { workspaceUri: URI.parse(value) }; foundWorkspace = true; break; From d93312920e006cfd3e77f749aa1f2cf22759db16 Mon Sep 17 00:00:00 2001 From: Asher Date: Fri, 12 Nov 2021 17:21:37 +0000 Subject: [PATCH 2/2] Standardize on @author for marking our changes --- src/vs/code/browser/workbench/workbench.ts | 34 +++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts index 5781361b29e81..b9835abecea22 100644 --- a/src/vs/code/browser/workbench/workbench.ts +++ b/src/vs/code/browser/workbench/workbench.ts @@ -41,7 +41,7 @@ function doCreateUri(path: string, queryValues: Map): URI { * Encode a path for opening via the folder or workspace query parameter. This * preserves slashes so it can be edited by hand more easily. * - * @remark coder + * @author coder */ export const encodePath = (path: string): string => { return path.split('/').map((p) => encodeURIComponent(p)).join('/'); @@ -329,7 +329,10 @@ class WorkspaceProvider implements IWorkspaceProvider { } // Folder - // NOTE@coder: Modified to print as a human-readable string for file paths. + /** + * Modified to print as a human-readable string for file paths. + * @author coder + */ else if (isFolderToOpen(workspace)) { const target = workspace.folderUri.scheme === Schemas.vscodeRemote ? encodePath(workspace.folderUri.path) @@ -338,7 +341,10 @@ class WorkspaceProvider implements IWorkspaceProvider { } // Workspace - // NOTE@coder: Modified to print as a human-readable string for file paths. + /** + * Modified to print as a human-readable string for file paths. + * @author coder + */ else if (isWorkspaceToOpen(workspace)) { const target = workspace.workspaceUri.scheme === Schemas.vscodeRemote ? encodePath(workspace.workspaceUri.path) @@ -441,8 +447,12 @@ class WindowIndicator implements IWindowIndicator { let payload = Object.create(null); let logLevel: string | undefined = undefined; - // NOTE@coder: If the value begins with a slash assume it is a file path and - // convert it to use the vscode-remote scheme. + /** + * If the value begins with a slash assume it is a file path and convert it to + * use the vscode-remote scheme. + * + * @author coder + */ const toRemote = (value: string): string => { if (value.startsWith("/")) { return "vscode-remote://" + value; @@ -455,14 +465,24 @@ class WindowIndicator implements IWindowIndicator { switch (key) { // Folder case WorkspaceProvider.QUERY_PARAM_FOLDER: - value = toRemote(value); // NOTE@coder: See above. + /** + * Handle URIs that we previously left unencoded and de-schemed. + * + * @author coder + */ + value = toRemote(value); workspace = { folderUri: URI.parse(value) }; foundWorkspace = true; break; // Workspace case WorkspaceProvider.QUERY_PARAM_WORKSPACE: - value = toRemote(value); // NOTE@coder: See above. + /** + * Handle URIs that we previously left unencoded and de-schemed. + * + * @author coder + */ + value = toRemote(value); workspace = { workspaceUri: URI.parse(value) }; foundWorkspace = true; break;