@@ -7,7 +7,6 @@ import * as crypto from 'crypto';
77import * as fs from 'fs' ;
88import * as http from 'http' ;
99import * as net from 'net' ;
10- import * as os from 'os' ;
1110import * as path from 'path' ;
1211import * as url from 'url' ;
1312import { RunOnceScheduler } from 'vs/base/common/async' ;
@@ -33,9 +32,7 @@ import { ConfigurationService } from 'vs/platform/configuration/common/configura
3332import { ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc' ;
3433import { IDownloadService } from 'vs/platform/download/common/download' ;
3534import { DownloadService } from 'vs/platform/download/common/downloadService' ;
36- import { NativeParsedArgs } from 'vs/platform/environment/common/argv' ;
3735import { IEnvironmentService , INativeEnvironmentService } from 'vs/platform/environment/common/environment' ;
38- import { OptionDescriptions , OPTIONS , parseArgs } from 'vs/platform/environment/node/argv' ;
3936import { NativeEnvironmentService } from 'vs/platform/environment/node/environmentService' ;
4037import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService' ;
4138import { IExtensionGalleryService , IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement' ;
@@ -62,6 +59,7 @@ import { RequestChannel } from 'vs/platform/request/common/requestIpc';
6259import { RequestService } from 'vs/platform/request/node/requestService' ;
6360import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
6461import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils' ;
62+ import { args } from 'vs/server/node/args' ;
6563import { IFileChangeDto } from 'vs/workbench/api/common/extHost.protocol' ;
6664import { IExtHostReadyMessage , IExtHostSocketMessage } from 'vs/workbench/services/extensions/common/extensionHostProtocol' ;
6765import { Logger } from 'vs/workbench/services/extensions/common/extensionPoints' ;
@@ -73,7 +71,7 @@ import { RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/
7371export type IRawURITransformerFactory = ( remoteAuthority : string ) => IRawURITransformer ;
7472export const IRawURITransformerFactory = createDecorator < IRawURITransformerFactory > ( 'rawURITransformerFactory' ) ;
7573
76- const APP_ROOT = path . join ( __dirname , '..' , '..' , '..' , '..' ) ;
74+ export const APP_ROOT = path . join ( __dirname , '..' , '..' , '..' , '..' ) ;
7775const uriTransformerPath = path . join ( APP_ROOT , 'out/serverUriTransformer' ) ;
7876const rawURITransformerFactory : IRawURITransformerFactory = < any > require . __$__nodeRequire ( uriTransformerPath ) ;
7977
@@ -226,14 +224,6 @@ async function handleRoot(req: http.IncomingMessage, resp: http.ServerResponse,
226224 return resp . end ( entryPointContent ) ;
227225}
228226
229- interface ServerParsedArgs extends NativeParsedArgs {
230- port ?: string
231- }
232- const SERVER_OPTIONS : OptionDescriptions < Required < ServerParsedArgs > > = {
233- ...OPTIONS ,
234- port : { type : 'string' }
235- } ;
236-
237227export interface IStartServerResult {
238228 installingInitialExtensions ?: Promise < void >
239229}
@@ -249,17 +239,16 @@ export interface IServerOptions {
249239 configureExtensionHostForkOptions ?( opts : cp . ForkOptions , accessor : ServicesAccessor , channelServer : IPCServer < RemoteAgentConnectionContext > ) : void ;
250240 configureExtensionHostProcess ?( extensionHost : cp . ChildProcess , accessor : ServicesAccessor , channelServer : IPCServer < RemoteAgentConnectionContext > ) : IDisposable ;
251241
242+ verifyRequest ?( req : http . IncomingMessage , res : http . ServerResponse | undefined , accessor : ServicesAccessor ) : Promise < boolean > ;
252243 handleRequest ?( pathname : string | null , req : http . IncomingMessage , res : http . ServerResponse , accessor : ServicesAccessor , channelServer : IPCServer < RemoteAgentConnectionContext > ) : Promise < boolean > ;
253244}
254245
255246export async function main ( options : IServerOptions ) : Promise < void > {
256247 const devMode = ! ! process . env [ 'VSCODE_DEV' ] ;
257248 const connectionToken = generateUuid ( ) ;
258249
259- const parsedArgs = parseArgs ( process . argv , SERVER_OPTIONS ) ;
260- parsedArgs [ 'user-data-dir' ] = URI . file ( path . join ( os . homedir ( ) , product . dataFolderName ) ) . fsPath ;
261250 const productService = { _serviceBrand : undefined , ...product } ;
262- const environmentService = new NativeEnvironmentService ( parsedArgs , productService ) ;
251+ const environmentService = new NativeEnvironmentService ( args , productService ) ;
263252
264253 // see src/vs/code/electron-main/main.ts#142
265254 const bufferLogService = new BufferLogService ( ) ;
@@ -593,10 +582,12 @@ export async function main(options: IServerOptions): Promise<void> {
593582 const parsedUrl = url . parse ( req . url , true ) ;
594583 const pathname = parsedUrl . pathname ;
595584
585+ if ( options . verifyRequest && ! await instantiationService . invokeFunction ( accessor => options . verifyRequest ! ( req , res , accessor ) ) ) {
586+ return ;
587+ }
596588 if ( options . handleRequest && await instantiationService . invokeFunction ( accessor => options . handleRequest ! ( pathname , req , res , accessor , channelServer ) ) ) {
597589 return ;
598590 }
599-
600591 //#region headless
601592 if ( pathname === '/vscode-remote-resource' ) {
602593 const filePath = parsedUrl . query [ 'path' ] ;
@@ -643,12 +634,16 @@ export async function main(options: IServerOptions): Promise<void> {
643634 }
644635 } ) ;
645636 server . on ( 'error' , e => logService . error ( e ) ) ;
646- server . on ( 'upgrade' , ( req : http . IncomingMessage , socket : net . Socket ) => {
637+ server . on ( 'upgrade' , async ( req : http . IncomingMessage , socket : net . Socket ) => {
647638 if ( req . headers [ 'upgrade' ] !== 'websocket' || ! req . url ) {
648639 logService . error ( `failed to upgrade for header "${ req . headers [ 'upgrade' ] } " and url: "${ req . url } ".` ) ;
649640 socket . end ( 'HTTP/1.1 400 Bad Request' ) ;
650641 return ;
651642 }
643+ if ( options . verifyRequest && ! await instantiationService . invokeFunction ( accessor => options . verifyRequest ! ( req , undefined , accessor ) ) ) {
644+ socket . end ( 'HTTP/1.1 401 Unauthorized' ) ;
645+ return ;
646+ }
652647 const { query } = url . parse ( req . url , true ) ;
653648 // /?reconnectionToken=c0e3a8af-6838-44fb-851b-675401030831&reconnection=false&skipWebSocketFrames=false
654649 const reconnection = 'reconnection' in query && query [ 'reconnection' ] === 'true' ;
@@ -758,7 +753,7 @@ export async function main(options: IServerOptions): Promise<void> {
758753 logService . info ( `[${ token } ] Management connection is connected.` ) ;
759754 } else {
760755 if ( ! client . management ) {
761- logService . error ( `[${ token } ] Failed to reconnect: management connection is not running.` ) ;
756+ logService . error ( `[${ token } ] Failed to reconnect: management connection is not running.` ) ;
762757 protocol . sendControl ( VSBuffer . fromString ( JSON . stringify ( { type : 'error' , reason : 'Management connection is not running.' } as ErrorMessage ) ) ) ;
763758 safeDisposeProtocolAndSocket ( protocol ) ;
764759 return ;
@@ -848,17 +843,17 @@ export async function main(options: IServerOptions): Promise<void> {
848843 socket . end ( ) ;
849844 extensionHost . kill ( ) ;
850845 client . extensionHost = undefined ;
851- logService . info ( `[${ token } ] Extension host is disconnected.` ) ;
846+ logService . info ( `[${ token } ] Extension host is disconnected.` ) ;
852847 }
853848
854849 extensionHost . on ( 'error' , err => {
855850 dispose ( ) ;
856- logService . error ( `[${ token } ] Extension host failed with: ` , err ) ;
851+ logService . error ( `[${ token } ] Extension host failed with: ` , err ) ;
857852 } ) ;
858853 extensionHost . on ( 'exit' , ( code : number , signal : string ) => {
859854 dispose ( ) ;
860855 if ( code !== 0 && signal !== 'SIGTERM' ) {
861- logService . error ( `[${ token } ] Extension host exited with code: ${ code } and signal: ${ signal } .` ) ;
856+ logService . error ( `[${ token } ] Extension host exited with code: ${ code } and signal: ${ signal } .` ) ;
862857 }
863858 } ) ;
864859
@@ -873,7 +868,7 @@ export async function main(options: IServerOptions): Promise<void> {
873868 permessageDeflate,
874869 inflateBytes
875870 } as IExtHostSocketMessage , socket ) ;
876- logService . info ( `[${ token } ] Extension host is connected.` ) ;
871+ logService . info ( `[${ token } ] Extension host is connected.` ) ;
877872 }
878873 } ;
879874 extensionHost . on ( 'message' , readyListener ) ;
@@ -882,13 +877,13 @@ export async function main(options: IServerOptions): Promise<void> {
882877 toDispose = instantiationService . invokeFunction ( accessor => options . configureExtensionHostProcess ! ( extensionHost , accessor , channelServer ) ) ;
883878 }
884879 client . extensionHost = extensionHost ;
885- logService . info ( `[${ token } ] Extension host is started.` ) ;
880+ logService . info ( `[${ token } ] Extension host is started.` ) ;
886881 } catch ( e ) {
887- logService . error ( `[${ token } ] Failed to start the extension host process: ` , e ) ;
882+ logService . error ( `[${ token } ] Failed to start the extension host process: ` , e ) ;
888883 }
889884 } else {
890885 if ( ! client . extensionHost ) {
891- logService . error ( `[${ token } ] Failed to reconnect: extension host is not running.` ) ;
886+ logService . error ( `[${ token } ] Failed to reconnect: extension host is not running.` ) ;
892887 protocol . sendControl ( VSBuffer . fromString ( JSON . stringify ( { type : 'error' , reason : 'Extension host is not running.' } as ErrorMessage ) ) ) ;
893888 safeDisposeProtocolAndSocket ( protocol ) ;
894889 return ;
@@ -908,7 +903,7 @@ export async function main(options: IServerOptions): Promise<void> {
908903 permessageDeflate,
909904 inflateBytes
910905 } as IExtHostSocketMessage , socket ) ;
911- logService . info ( `[${ token } ] Extension host is reconnected.` ) ;
906+ logService . info ( `[${ token } ] Extension host is reconnected.` ) ;
912907 }
913908 } else {
914909 logService . error ( `[${ token } ] Unexpected connection type:` , msg . desiredConnectionType ) ;
@@ -921,8 +916,8 @@ export async function main(options: IServerOptions): Promise<void> {
921916 } ) ;
922917 } ) ;
923918 let port = 3000 ;
924- if ( parsedArgs . port ) {
925- port = Number ( parsedArgs . port ) ;
919+ if ( args . port ) {
920+ port = Number ( args . port ) ;
926921 } else if ( typeof options . port === 'number' ) {
927922 port = options . port ;
928923 }
0 commit comments