@@ -36,8 +36,8 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench-dev.html
3636
3737 <!-- Disable pinch zooming -->
3838 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
39- @@ -27 ,9 +27 ,9 @@
40- <meta id="vscode-workbench-builtin-extensions " data-settings="{{WORKBENCH_BUILTIN_EXTENSIONS }}">
39+ @@ -29 ,9 +29 ,9 @@
40+ <meta id="vscode-workbench-css-modules " data-settings="{{WORKBENCH_DEV_CSS_MODULES }}">
4141
4242 <!-- Workbench Icon/Manifest/CSS -->
4343- <link rel="icon" href="/_static/src/browser/media/favicon-dark-support.svg" />
@@ -49,15 +49,15 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench-dev.html
4949 <style id="vscode-css-modules" type="text/css" media="screen"></style>
5050
5151 </head>
52- @@ -39 ,7 +39 ,7 @@
52+ @@ -41 ,7 +41 ,7 @@
5353
5454 <!-- Startup (do not modify order of script tags!) -->
55- <script>
56- - const baseUrl = new URL('{{WORKBENCH_WEB_BASE_URL}}' , window.location.origin).toString();
57- + const baseUrl = new URL('{{WORKBENCH_WEB_BASE_URL}}' , window.location).toString();
55+ <script nonce="{{WORKBENCH_SCRIPT_NONCE}}" >
56+ - const baseUrl = new URL(document.getElementById('vscode-workbench-web-base-url').getAttribute('data-settings') , window.location.origin).toString();
57+ + const baseUrl = new URL(document.getElementById('vscode-workbench-web-base-url').getAttribute('data-settings') , window.location).toString();
5858 globalThis._VSCODE_FILE_ROOT = baseUrl + '/out/';
5959 </script>
60- <script>
60+ <script nonce="{{WORKBENCH_SCRIPT_NONCE}}" >
6161Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.html
6262===================================================================
6363--- code-server.orig/lib/vscode/src/vs/code/browser/workbench/workbench.html
@@ -73,7 +73,7 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.html
7373
7474 <!-- Disable pinch zooming -->
7575 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
76- @@ -24 ,9 +24 ,9 @@
76+ @@ -25 ,9 +25 ,9 @@
7777 <meta id="vscode-workbench-auth-session" data-settings="{{WORKBENCH_AUTH_SESSION}}">
7878
7979 <!-- Workbench Icon/Manifest/CSS -->
@@ -86,15 +86,15 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.html
8686 <link rel="stylesheet" href="{{WORKBENCH_WEB_BASE_URL}}/out/vs/code/browser/workbench/workbench.css">
8787
8888 </head>
89- @@ -36 ,7 +36 ,7 @@
89+ @@ -37 ,7 +37 ,7 @@
9090
9191 <!-- Startup (do not modify order of script tags!) -->
92- <script>
93- - const baseUrl = new URL('{{WORKBENCH_WEB_BASE_URL}}' , window.location.origin).toString();
94- + const baseUrl = new URL('{{WORKBENCH_WEB_BASE_URL}}' , window.location).toString();
92+ <script nonce="{{WORKBENCH_SCRIPT_NONCE}}" >
93+ - const baseUrl = new URL(document.getElementById('vscode-workbench-web-base-url').getAttribute('data-settings') , window.location.origin).toString();
94+ + const baseUrl = new URL(document.getElementById('vscode-workbench-web-base-url').getAttribute('data-settings') , window.location).toString();
9595 globalThis._VSCODE_FILE_ROOT = baseUrl + '/out/';
9696 </script>
97- <script>
97+ <script nonce="{{WORKBENCH_SCRIPT_NONCE}}" >
9898Index: code-server/lib/vscode/src/vs/platform/remote/browser/browserSocketFactory.ts
9999===================================================================
100100--- code-server.orig/lib/vscode/src/vs/platform/remote/browser/browserSocketFactory.ts
@@ -111,21 +111,31 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts
111111===================================================================
112112--- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts
113113+++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts
114- @@ -263,7 +263,9 @@ export class WebClientServer {
114+ @@ -146,7 +146,7 @@ export function createWorkbenchContentSe
115+ 'default-src \'self\';',
116+ 'img-src \'self\' https: data: blob:;',
117+ 'media-src \'self\';',
118+ - `script-src 'self' 'unsafe-eval' ${nlsBaseUrl ?? ''} blob: 'nonce-${scriptNonce}' '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
119+ + `script-src 'self' 'unsafe-eval' ${nlsBaseUrl ?? ''} blob: 'nonce-${scriptNonce}' '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : ``};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
120+ 'child-src \'self\';',
121+ `frame-src 'self' https://*.vscode-cdn.net data:;`,
122+ 'worker-src \'self\' data: blob:;',
123+ @@ -307,8 +307,10 @@ export class WebClientServer {
115124 };
116125
117126 // Prefix routes with basePath for clients
118- - const basePath = getFirstHeader('x-forwarded-prefix') || this._basePath;
119127+ const rootBase = relativeRoot(getOriginalUrl(req))
120128+ const vscodeBase = relativePath(getOriginalUrl(req))
121- + const basePath = vscodeBase || getFirstHeader('x-forwarded-prefix') || this._basePath;
129+ const forwardedPrefix = getFirstHeader('x-forwarded-prefix');
130+ - const basePath = forwardedPrefix && isSafeBasePath(forwardedPrefix) ? forwardedPrefix : this._basePath;
131+ + const basePath = vscodeBase || (forwardedPrefix && isSafeBasePath(forwardedPrefix) ? forwardedPrefix : this._basePath);
122132
123133 const queryConnectionTokens = parsedUrl.searchParams.getAll(connectionTokenQueryName);
124134 if (queryConnectionTokens.length === 1) {
125- @@ -300 ,10 +302 ,14 @@ export class WebClientServer {
135+ @@ -345 ,10 +347 ,14 @@ export class WebClientServer {
126136 };
127137
128- const useTestResolver = (!this._environmentService.isBuilt && this._environmentService.args['use-test-resolver']);
138+ const useTestResolver = (!this._environmentService.isBuilt && !! this._environmentService.args['use-test-resolver']);
129139+ // For now we are getting the remote authority from the client to avoid
130140+ // needing specific configuration for reverse proxies to work. Set this to
131141+ // something invalid to make sure we catch code that is using this value
@@ -138,35 +148,24 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts
138148 );
139149 if (!remoteAuthority) {
140150 return serveError(req, res, 400, `Bad request.`);
141- @@ -350 ,6 +356 ,7 @@ export class WebClientServer {
151+ @@ -395 ,6 +401 ,7 @@ export class WebClientServer {
142152
143153 const productConfiguration: Partial<Mutable<IProductConfiguration>> = {
144154 codeServerVersion: this._productService.codeServerVersion,
145155+ rootEndpoint: rootBase,
146156 embedderIdentifier: 'server-distro',
147157 voiceWsUrl: this._productService.voiceWsUrl,
148158 extensionsGallery: this._webExtensionResourceUrlTemplate && this._productService.extensionsGallery ? {
149- @@ -399,7 +406,9 @@ export class WebClientServer {
150- WORKBENCH_AUTH_SESSION: authSessionInfo ? asJSON(authSessionInfo) : '',
151- WORKBENCH_WEB_BASE_URL: staticRoute,
159+ @@ -447,6 +454,8 @@ export class WebClientServer {
152160 WORKBENCH_NLS_URL,
153- - WORKBENCH_NLS_FALLBACK_URL: `${staticRoute}/out/nls.messages.js`
154- + WORKBENCH_NLS_FALLBACK_URL: `${staticRoute}/out/nls.messages.js`,
161+ WORKBENCH_NLS_FALLBACK_URL: `${staticRoute}/out/nls.messages.js`,
162+ WORKBENCH_SCRIPT_NONCE: scriptNonce
155163+ BASE: rootBase,
156164+ VS_BASE: basePath,
157165 };
158166
159167 // DEV ---------------------------------------------------------------------------------------
160- @@ -436,7 +445,7 @@ export class WebClientServer {
161- 'default-src \'self\';',
162- 'img-src \'self\' https: data: blob:;',
163- 'media-src \'self\';',
164- - `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} blob: 'nonce-1nline-m4p' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
165- + `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} blob: 'nonce-1nline-m4p' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : ``};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
166- 'child-src \'self\';',
167- `frame-src 'self' https://*.vscode-cdn.net data:;`,
168- 'worker-src \'self\' data: blob:;',
169- @@ -509,3 +518,70 @@ export class WebClientServer {
168+ @@ -542,3 +551,70 @@ export class WebClientServer {
170169 return void res.end(data);
171170 }
172171 }
0 commit comments