f9cc07926b
* Update Code to 1.76.1 - worker-src already contains blob so we can avoid patching that. - localeService moved. - Remaining changes were just line changes. * Make language extensions installable again Still might want to look into making the native language support work but for now it seems better not to break backwards compatibility since the native implementation is quite different. * Avoid "install in browser" for language packs It will not work. * Import correct locale service I believe before the contributions imported this but now we have to do it here.
169 lines
9.2 KiB
Diff
169 lines
9.2 KiB
Diff
Add VSCODE_PROXY_URI environment variable
|
|
|
|
This can be used by extensions to open a port and access it through the proxy.
|
|
|
|
It is available in the terminal as well.
|
|
|
|
This can be tested using printenv in the terminal and by using the
|
|
codeServerTest.proxyUri command through the test extension (copy it into your
|
|
extensions, use --extensions-dir, or symlink it).
|
|
|
|
This has e2e tests.
|
|
|
|
For the `asExternalUri` changes, you'll need to test manually by:
|
|
1. running code-server with the test extension
|
|
2. Command Palette > code-server: asExternalUri test
|
|
3. input a url like http://localhost:3000
|
|
4. it should show a notification and show output as <code-server>/proxy/3000
|
|
|
|
Do the same thing but set `VSCODE_PROXY_URI: "https://{{port}}-main-workspace-name-user-name.coder.com"`
|
|
and the output should replace `{{port}}` with port used in input url.
|
|
|
|
This also enables the forwared ports view panel by default.
|
|
|
|
Lastly, it adds a tunnelProvider so that ports are forwarded using code-server's
|
|
built-in proxy. You can test this by starting a server i.e. `python3 -m
|
|
http.server` and it should show a notification and show up in the ports panel
|
|
using the /proxy/port.
|
|
|
|
Index: code-server/lib/vscode/src/vs/base/common/product.ts
|
|
===================================================================
|
|
--- code-server.orig/lib/vscode/src/vs/base/common/product.ts
|
|
+++ code-server/lib/vscode/src/vs/base/common/product.ts
|
|
@@ -36,6 +36,7 @@ export interface IProductConfiguration {
|
|
readonly rootEndpoint?: string
|
|
readonly updateEndpoint?: string
|
|
readonly logoutEndpoint?: string
|
|
+ readonly proxyEndpointTemplate?: string
|
|
|
|
readonly version: string;
|
|
readonly date?: string;
|
|
Index: code-server/lib/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts
|
|
===================================================================
|
|
--- code-server.orig/lib/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts
|
|
+++ code-server/lib/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts
|
|
@@ -11,7 +11,7 @@ import { StopWatch } from 'vs/base/commo
|
|
import { URI } from 'vs/base/common/uri';
|
|
import { ILogService } from 'vs/platform/log/common/log';
|
|
import { IProductService } from 'vs/platform/product/common/productService';
|
|
-import { IRemoteAuthorityResolverService, IRemoteConnectionData, ResolvedAuthority, ResolverResult, getRemoteAuthorityPrefix } from 'vs/platform/remote/common/remoteAuthorityResolver';
|
|
+import { IRemoteAuthorityResolverService, IRemoteConnectionData, ResolvedAuthority, ResolvedOptions, ResolverResult, getRemoteAuthorityPrefix } from 'vs/platform/remote/common/remoteAuthorityResolver';
|
|
import { getRemoteServerRootPath, parseAuthorityWithOptionalPort } from 'vs/platform/remote/common/remoteHosts';
|
|
|
|
export class RemoteAuthorityResolverService extends Disposable implements IRemoteAuthorityResolverService {
|
|
@@ -29,7 +29,7 @@ export class RemoteAuthorityResolverServ
|
|
constructor(
|
|
connectionToken: Promise<string> | string | undefined,
|
|
resourceUriProvider: ((uri: URI) => URI) | undefined,
|
|
- @IProductService productService: IProductService,
|
|
+ @IProductService private readonly productService: IProductService,
|
|
@ILogService private readonly _logService: ILogService,
|
|
) {
|
|
super();
|
|
@@ -75,9 +75,14 @@ export class RemoteAuthorityResolverServ
|
|
const connectionToken = await Promise.resolve(this._connectionTokens.get(authority) || this._connectionToken);
|
|
performance.mark(`code/didResolveConnectionToken/${authorityPrefix}`);
|
|
this._logService.info(`Resolved connection token (${authorityPrefix}) after ${sw.elapsed()} ms`);
|
|
+ let options: ResolvedOptions | undefined;
|
|
+ if (this.productService.proxyEndpointTemplate) {
|
|
+ const proxyUrl = new URL(this.productService.proxyEndpointTemplate, window.location.href);
|
|
+ options = { extensionHostEnv: { VSCODE_PROXY_URI: decodeURIComponent(proxyUrl.toString()) }}
|
|
+ }
|
|
const defaultPort = (/^https:/.test(window.location.href) ? 443 : 80);
|
|
const { host, port } = parseAuthorityWithOptionalPort(authority, defaultPort);
|
|
- const result: ResolverResult = { authority: { authority, host: host, port: port, connectionToken } };
|
|
+ const result: ResolverResult = { authority: { authority, host: host, port: port, connectionToken }, options };
|
|
RemoteAuthorities.set(authority, result.authority.host, result.authority.port);
|
|
this._cache.set(authority, result);
|
|
this._onDidChangeConnectionData.fire();
|
|
Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts
|
|
===================================================================
|
|
--- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts
|
|
+++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts
|
|
@@ -314,6 +314,7 @@ export class WebClientServer {
|
|
rootEndpoint: base,
|
|
updateEndpoint: !this._environmentService.args['disable-update-check'] ? base + '/update/check' : undefined,
|
|
logoutEndpoint: this._environmentService.args['auth'] && this._environmentService.args['auth'] !== "none" ? base + '/logout' : undefined,
|
|
+ proxyEndpointTemplate: process.env.VSCODE_PROXY_URI ?? base + '/proxy/{{port}}/',
|
|
embedderIdentifier: 'server-distro',
|
|
extensionsGallery: this._productService.extensionsGallery,
|
|
},
|
|
Index: code-server/lib/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts
|
|
===================================================================
|
|
--- code-server.orig/lib/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts
|
|
+++ code-server/lib/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts
|
|
@@ -383,7 +383,7 @@ export async function createTerminalEnvi
|
|
|
|
// Sanitize the environment, removing any undesirable VS Code and Electron environment
|
|
// variables
|
|
- sanitizeProcessEnvironment(env, 'VSCODE_IPC_HOOK_CLI');
|
|
+ sanitizeProcessEnvironment(env, 'VSCODE_IPC_HOOK_CLI', 'VSCODE_PROXY_URI');
|
|
|
|
// Merge config (settings) and ShellLaunchConfig environments
|
|
mergeEnvironments(env, allowedEnvFromConfig);
|
|
Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts
|
|
===================================================================
|
|
--- code-server.orig/lib/vscode/src/vs/code/browser/workbench/workbench.ts
|
|
+++ code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts
|
|
@@ -21,6 +21,7 @@ import type { ICredentialsProvider } fro
|
|
import type { IURLCallbackProvider } from 'vs/workbench/services/url/browser/urlService';
|
|
import type { IWorkbenchConstructionOptions } from 'vs/workbench/browser/web.api';
|
|
import type { IWorkspace, IWorkspaceProvider } from 'vs/workbench/services/host/browser/browserHostService';
|
|
+import { extractLocalHostUriMetaDataForPortMapping, TunnelOptions, TunnelCreationOptions } from 'vs/platform/tunnel/common/tunnel';
|
|
|
|
interface ICredential {
|
|
service: string;
|
|
@@ -511,6 +512,38 @@ function doCreateUri(path: string, query
|
|
} : undefined,
|
|
workspaceProvider: WorkspaceProvider.create(config),
|
|
urlCallbackProvider: new LocalStorageURLCallbackProvider(config.callbackRoute),
|
|
- credentialsProvider: config.remoteAuthority ? undefined : new LocalStorageCredentialsProvider() // with a remote, we don't use a local credentials provider
|
|
+ credentialsProvider: config.remoteAuthority ? undefined : new LocalStorageCredentialsProvider(), // with a remote, we don't use a local credentials provider
|
|
+ resolveExternalUri: (uri: URI): Promise<URI> => {
|
|
+ let resolvedUri = uri
|
|
+ const localhostMatch = extractLocalHostUriMetaDataForPortMapping(resolvedUri)
|
|
+
|
|
+ if (localhostMatch && resolvedUri.authority !== location.host) {
|
|
+ if (config.productConfiguration && config.productConfiguration.proxyEndpointTemplate) {
|
|
+ resolvedUri = URI.parse(new URL(config.productConfiguration.proxyEndpointTemplate.replace('{{port}}', localhostMatch.port.toString()), window.location.href).toString())
|
|
+ } else {
|
|
+ throw new Error(`Failed to resolve external URI: ${uri.toString()}. Could not determine base url because productConfiguration missing.`)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // If not localhost, return unmodified
|
|
+ return Promise.resolve(resolvedUri)
|
|
+ },
|
|
+ tunnelProvider: {
|
|
+ tunnelFactory: (tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions) => {
|
|
+ const onDidDispose: Emitter<void> = new Emitter();
|
|
+ let isDisposed = false;
|
|
+ return Promise.resolve({
|
|
+ remoteAddress: tunnelOptions.remoteAddress,
|
|
+ localAddress: `localhost:${tunnelOptions.remoteAddress.port}`,
|
|
+ onDidDispose: onDidDispose.event,
|
|
+ dispose: () => {
|
|
+ if (!isDisposed) {
|
|
+ isDisposed = true;
|
|
+ onDidDispose.fire();
|
|
+ }
|
|
+ }
|
|
+ })
|
|
+ }
|
|
+ }
|
|
});
|
|
})();
|
|
Index: code-server/lib/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts
|
|
===================================================================
|
|
--- code-server.orig/lib/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts
|
|
+++ code-server/lib/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts
|
|
@@ -73,7 +73,7 @@ export class ForwardedPortsView extends
|
|
this.contextKeyListener = undefined;
|
|
}
|
|
|
|
- const viewEnabled: boolean = !!forwardedPortsViewEnabled.getValue(this.contextKeyService);
|
|
+ const viewEnabled: boolean = true;
|
|
|
|
if (this.environmentService.remoteAuthority && viewEnabled) {
|
|
const viewContainer = await this.getViewContainer();
|