diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index d95ee976f6a..61c900c4b76 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -195,7 +195,7 @@ export function activate(context: vscode.ExtensionContext) { proxyServer.listen(0, () => { const port = (proxyServer.address()).port; outputChannel.appendLine(`Going through proxy at port ${port}`); - res({ host: '127.0.0.1', port }); + res(new vscode.ResolvedAuthority('127.0.0.1', port)); }); context.subscriptions.push({ dispose: () => { diff --git a/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts b/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts index cfe1929acff..3d5d29b8e00 100644 --- a/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts +++ b/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts @@ -17,11 +17,13 @@ export class RemoteAuthorityResolverService extends Disposable implements IRemot public readonly onDidChangeConnectionData = this._onDidChangeConnectionData.event; private readonly _cache: Map; + private readonly _connectionToken: string | undefined; private readonly _connectionTokens: Map; - constructor(resourceUriProvider: ((uri: URI) => URI) | undefined) { + constructor(connectionToken: string | undefined, resourceUriProvider: ((uri: URI) => URI) | undefined) { super(); this._cache = new Map(); + this._connectionToken = connectionToken; this._connectionTokens = new Map(); if (resourceUriProvider) { RemoteAuthorities.setDelegate(resourceUriProvider); @@ -43,7 +45,7 @@ export class RemoteAuthorityResolverService extends Disposable implements IRemot return null; } const resolverResult = this._cache.get(authority)!; - const connectionToken = this._connectionTokens.get(authority); + const connectionToken = this._connectionTokens.get(authority) || this._connectionToken; return { host: resolverResult.authority.host, port: resolverResult.authority.port, @@ -52,11 +54,12 @@ export class RemoteAuthorityResolverService extends Disposable implements IRemot } private _doResolveAuthority(authority: string): ResolverResult { + const connectionToken = this._connectionTokens.get(authority) || this._connectionToken; if (authority.indexOf(':') >= 0) { const pieces = authority.split(':'); - return { authority: { authority, host: pieces[0], port: parseInt(pieces[1], 10) } }; + return { authority: { authority, host: pieces[0], port: parseInt(pieces[1], 10), connectionToken } }; } - return { authority: { authority, host: authority, port: 80 } }; + return { authority: { authority, host: authority, port: 80, connectionToken } }; } _clearResolvedAuthority(authority: string): void { diff --git a/src/vs/platform/remote/common/remoteAgentConnection.ts b/src/vs/platform/remote/common/remoteAgentConnection.ts index 9cf0fa98ef8..fdd5890c69f 100644 --- a/src/vs/platform/remote/common/remoteAgentConnection.ts +++ b/src/vs/platform/remote/common/remoteAgentConnection.ts @@ -70,6 +70,7 @@ interface ISimpleConnectionOptions { commit: string | undefined; host: string; port: number; + connectionToken: string | undefined; reconnectionToken: string; reconnectionProtocol: PersistentProtocol | null; socketFactory: ISocketFactory; @@ -169,10 +170,9 @@ async function connectToRemoteExtensionHostAgent(options: ISimpleConnectionOptio }); options.logService.trace(`${logPrefix} 3/6. sending AuthRequest control message.`); - // TODO@vs-remote: use real nonce here const authRequest: AuthRequest = { type: 'auth', - auth: '00000000000000000000' + auth: options.connectionToken || '00000000000000000000' }; protocol.sendControl(VSBuffer.fromString(JSON.stringify(authRequest))); }); @@ -254,11 +254,12 @@ export interface IConnectionOptions { } async function resolveConnectionOptions(options: IConnectionOptions, reconnectionToken: string, reconnectionProtocol: PersistentProtocol | null): Promise { - const { host, port } = await options.addressProvider.getAddress(); + const { host, port, connectionToken } = await options.addressProvider.getAddress(); return { commit: options.commit, host: host, port: port, + connectionToken: connectionToken, reconnectionToken: reconnectionToken, reconnectionProtocol: reconnectionProtocol, socketFactory: options.socketFactory, @@ -270,6 +271,7 @@ async function resolveConnectionOptions(options: IConnectionOptions, reconnectio export interface IAddress { host: string; port: number; + connectionToken: string | undefined; } export interface IAddressProvider { diff --git a/src/vs/platform/remote/common/remoteAuthorityResolver.ts b/src/vs/platform/remote/common/remoteAuthorityResolver.ts index f50b3a60e0a..d2f056af402 100644 --- a/src/vs/platform/remote/common/remoteAuthorityResolver.ts +++ b/src/vs/platform/remote/common/remoteAuthorityResolver.ts @@ -12,6 +12,7 @@ export interface ResolvedAuthority { readonly authority: string; readonly host: string; readonly port: number; + readonly connectionToken: string | undefined; } export interface ResolvedOptions { diff --git a/src/vs/platform/remote/electron-sandbox/remoteAuthorityResolverService.ts b/src/vs/platform/remote/electron-sandbox/remoteAuthorityResolverService.ts index 9c24344cd2e..41529a21aee 100644 --- a/src/vs/platform/remote/electron-sandbox/remoteAuthorityResolverService.ts +++ b/src/vs/platform/remote/electron-sandbox/remoteAuthorityResolverService.ts @@ -87,6 +87,9 @@ export class RemoteAuthorityResolverService extends Disposable implements IRemot if (this._resolveAuthorityRequests.has(resolvedAuthority.authority)) { const request = this._resolveAuthorityRequests.get(resolvedAuthority.authority)!; RemoteAuthorities.set(resolvedAuthority.authority, resolvedAuthority.host, resolvedAuthority.port); + if (resolvedAuthority.connectionToken) { + RemoteAuthorities.setConnectionToken(resolvedAuthority.authority, resolvedAuthority.connectionToken); + } request.resolve({ authority: resolvedAuthority, options }); this._onDidChangeConnectionData.fire(); } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b78140e7052..4076358f42f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -181,8 +181,9 @@ declare module 'vscode' { export class ResolvedAuthority { readonly host: string; readonly port: number; + readonly connectionToken: string | undefined; - constructor(host: string, port: number); + constructor(host: string, port: number, connectionToken?: string); } export interface ResolvedOptions { diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 06aa1bf480d..328b9327207 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -651,7 +651,8 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme const authority: ResolvedAuthority = { authority: remoteAuthority, host: result.host, - port: result.port + port: result.port, + connectionToken: result.connectionToken }; const options: ResolvedOptions = { extensionHostEnv: result.extensionHostEnv diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 7efc87cf152..6eb858eee84 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -433,16 +433,23 @@ export class Selection extends Range { export class ResolvedAuthority { readonly host: string; readonly port: number; + readonly connectionToken: string | undefined; - constructor(host: string, port: number) { + constructor(host: string, port: number, connectionToken?: string) { if (typeof host !== 'string' || host.length === 0) { throw illegalArgument('host'); } if (typeof port !== 'number' || port === 0 || Math.round(port) !== port) { throw illegalArgument('port'); } + if (typeof connectionToken !== 'undefined') { + if (typeof connectionToken !== 'string' || connectionToken.length === 0 || !/^[0-9A-Za-z\-]+$/.test(connectionToken)) { + throw illegalArgument('connectionToken'); + } + } this.host = host; this.port = Math.round(port); + this.connectionToken = connectionToken; } } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 5403acecdcb..80544aab34c 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -179,12 +179,14 @@ class BrowserMain extends Disposable { const logService = new BufferLogService(getLogLevel(environmentService)); serviceCollection.set(ILogService, logService); + const connectionToken = environmentService.options.connectionToken || this.getCookieValue('vscode-tkn'); + // Remote - const remoteAuthorityResolverService = new RemoteAuthorityResolverService(this.configuration.resourceUriProvider); + const remoteAuthorityResolverService = new RemoteAuthorityResolverService(connectionToken, this.configuration.resourceUriProvider); serviceCollection.set(IRemoteAuthorityResolverService, remoteAuthorityResolverService); // Signing - const signService = new SignService(environmentService.options.connectionToken || this.getCookieValue('vscode-tkn')); + const signService = new SignService(connectionToken); serviceCollection.set(ISignService, signService); // Remote Agent diff --git a/src/vs/workbench/services/extensions/common/extensionHostManager.ts b/src/vs/workbench/services/extensions/common/extensionHostManager.ts index c8520587bc1..b25ff919d24 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostManager.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostManager.ts @@ -265,7 +265,8 @@ export class ExtensionHostManager extends Disposable { authority: { authority: remoteAuthority, host: pieces[0], - port: parseInt(pieces[1], 10) + port: parseInt(pieces[1], 10), + connectionToken: undefined } }); } diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts index 9f03d2be9e6..eddbd5f010d 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts @@ -92,7 +92,7 @@ export class RemoteExtensionHost extends Disposable implements IExtensionHost { addressProvider: { getAddress: async () => { const { authority } = await this.remoteAuthorityResolverService.resolveAuthority(this._initDataProvider.remoteAuthority); - return { host: authority.host, port: authority.port }; + return { host: authority.host, port: authority.port, connectionToken: authority.connectionToken }; } }, signService: this._signService, diff --git a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts index ec221545d26..80662202397 100644 --- a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts @@ -183,7 +183,7 @@ export class RemoteAgentConnection extends Disposable implements IRemoteAgentCon this._onReconnecting.fire(undefined); } const { authority } = await this._remoteAuthorityResolverService.resolveAuthority(this.remoteAuthority); - return { host: authority.host, port: authority.port }; + return { host: authority.host, port: authority.port, connectionToken: authority.connectionToken }; } }, signService: this._signService,