44 *--------------------------------------------------------------------------------------------*/
55
66import { Workspace , WorkspaceInstanceStatus_Phase } from '@gitpod/public-api/lib/gitpod/experimental/v1/workspaces_pb' ;
7- import { UserSSHPublicKeyValue , WorkspaceInfo } from '@gitpod/gitpod-protocol' ;
87import * as crypto from 'crypto' ;
98import { utils as sshUtils } from 'ssh2' ;
109import { ParsedKey } from 'ssh2-streams' ;
1110import * as vscode from 'vscode' ;
1211import { Disposable } from './common/dispose' ;
13- import { withServerApi } from './internalApi' ;
1412import { ITelemetryService , UserFlowTelemetryProperties } from './common/telemetry' ;
1513import { addHostToHostFile , checkNewHostInHostkeys } from './ssh/hostfile' ;
1614import { ScopeFeature } from './featureSupport' ;
@@ -33,8 +31,6 @@ export class RemoteConnector extends Disposable {
3331
3432 public static AUTH_COMPLETE_PATH = '/auth-complete' ;
3533
36- private usePublicApi : boolean = false ;
37-
3834 constructor (
3935 private readonly context : vscode . ExtensionContext ,
4036 private readonly sessionService : ISessionService ,
@@ -55,27 +51,21 @@ export class RemoteConnector extends Disposable {
5551 private async getWorkspaceSSHDestination ( { workspaceId, gitpodHost, debugWorkspace } : SSHConnectionParams ) : Promise < { destination : SSHDestination ; password ?: string } > {
5652 const sshKeysSupported = this . sessionService . getScopes ( ) . includes ( ScopeFeature . SSHPublicKeys ) ;
5753
58- const [ workspaceInfo , ownerToken , registeredSSHKeys ] = await withServerApi ( this . sessionService . getGitpodToken ( ) , getServiceURL ( gitpodHost ) , service => Promise . all ( [
59- this . usePublicApi ? this . sessionService . getAPI ( ) . getWorkspace ( workspaceId ) : service . server . getWorkspace ( workspaceId ) ,
60- this . usePublicApi ? this . sessionService . getAPI ( ) . getOwnerToken ( workspaceId ) : service . server . getOwnerToken ( workspaceId ) ,
61- sshKeysSupported ? ( this . usePublicApi ? this . sessionService . getAPI ( ) . getSSHKeys ( ) : service . server . getSSHPublicKeys ( ) ) : undefined
62- ] ) , this . logService ) ;
54+ const [ workspaceInfo , ownerToken , registeredSSHKeys ] = await Promise . all ( [
55+ this . sessionService . getAPI ( ) . getWorkspace ( workspaceId ) ,
56+ this . sessionService . getAPI ( ) . getOwnerToken ( workspaceId ) ,
57+ sshKeysSupported ? ( this . sessionService . getAPI ( ) . getSSHKeys ( ) ) : undefined
58+ ] ) ;
6359
64- const isNotRunning = this . usePublicApi
65- ? ! ( ( workspaceInfo as Workspace ) ?. status ?. instance ) || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPING || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPED
66- : ! ( ( workspaceInfo as WorkspaceInfo ) . latestInstance ) || ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'stopping' || ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'stopped' ;
60+ const isNotRunning = ! ( ( workspaceInfo as Workspace ) ?. status ?. instance ) || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPING || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPED ;
6761 if ( isNotRunning ) {
6862 throw new NoRunningInstanceError (
6963 workspaceId ,
70- this . usePublicApi
71- ? ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ? WorkspaceInstanceStatus_Phase [ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ! ] : undefined
72- : ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase
64+ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ? WorkspaceInstanceStatus_Phase [ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ! ] : undefined
7365 ) ;
7466 }
7567
76- const workspaceUrl = this . usePublicApi
77- ? new URL ( ( workspaceInfo as Workspace ) . status ! . instance ! . status ! . url )
78- : new URL ( ( workspaceInfo as WorkspaceInfo ) . latestInstance ! . ideUrl ) ;
68+ const workspaceUrl = new URL ( ( workspaceInfo as Workspace ) . status ! . instance ! . status ! . url ) ;
7969
8070 const sshHostKeyEndPoint = `https://${ workspaceUrl . host } /_ssh/host_keys` ;
8171 const sshHostKeyResponse = await fetch ( sshHostKeyEndPoint ) ;
@@ -122,18 +112,16 @@ export class RemoteConnector extends Disposable {
122112 let identityKeys = await gatherIdentityFiles ( identityFiles , getAgentSock ( hostConfiguration ) , false , this . logService ) ;
123113
124114 if ( registeredSSHKeys ) {
125- const registeredKeys = this . usePublicApi
126- ? ( registeredSSHKeys as SSHKey [ ] ) . map ( k => {
127- const parsedResult = sshUtils . parseKey ( k . key ) ;
128- if ( parsedResult instanceof Error || ! parsedResult ) {
129- this . logService . error ( `Error while parsing SSH public key ${ k . name } :` , parsedResult ) ;
130- return { name : k . name , fingerprint : '' } ;
131- }
115+ const registeredKeys = ( registeredSSHKeys as SSHKey [ ] ) . map ( k => {
116+ const parsedResult = sshUtils . parseKey ( k . key ) ;
117+ if ( parsedResult instanceof Error || ! parsedResult ) {
118+ this . logService . error ( `Error while parsing SSH public key ${ k . name } :` , parsedResult ) ;
119+ return { name : k . name , fingerprint : '' } ;
120+ }
132121
133- const parsedKey = parsedResult as ParsedKey ;
134- return { name : k . name , fingerprint : crypto . createHash ( 'sha256' ) . update ( parsedKey . getPublicSSH ( ) ) . digest ( 'base64' ) } ;
135- } )
136- : ( registeredSSHKeys as UserSSHPublicKeyValue [ ] ) . map ( k => ( { name : k . name , fingerprint : k . fingerprint } ) ) ;
122+ const parsedKey = parsedResult as ParsedKey ;
123+ return { name : k . name , fingerprint : crypto . createHash ( 'sha256' ) . update ( parsedKey . getPublicSSH ( ) ) . digest ( 'base64' ) } ;
124+ } ) ;
137125 this . logService . trace ( `Registered public keys in Gitpod account:` , registeredKeys . length ? registeredKeys . map ( k => `${ k . name } SHA256:${ k . fingerprint } ` ) . join ( '\n' ) : 'None' ) ;
138126
139127 identityKeys = identityKeys . filter ( k => ! ! registeredKeys . find ( regKey => regKey . fingerprint === k . fingerprint ) ) ;
@@ -151,18 +139,14 @@ export class RemoteConnector extends Disposable {
151139 }
152140
153141 private async getLocalSSHWorkspaceSSHDestination ( { workspaceId, gitpodHost, debugWorkspace } : SSHConnectionParams ) : Promise < { destination : SSHDestination ; password ?: string } > {
154- const workspaceInfo = await withServerApi ( this . sessionService . getGitpodToken ( ) , getServiceURL ( gitpodHost ) , async service => this . usePublicApi ? this . sessionService . getAPI ( ) . getWorkspace ( workspaceId ) : service . server . getWorkspace ( workspaceId ) , this . logService ) ;
142+ const workspaceInfo = await this . sessionService . getAPI ( ) . getWorkspace ( workspaceId ) ;
155143
156- const isNotRunning = this . usePublicApi
157- ? ! ( ( workspaceInfo as Workspace ) ?. status ?. instance ) || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPING || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPED
158- : ! ( ( workspaceInfo as WorkspaceInfo ) . latestInstance ) || ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'stopping' || ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'stopped' ;
144+ const isNotRunning = ! ( ( workspaceInfo as Workspace ) ?. status ?. instance ) || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPING || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPED ;
159145
160146 if ( isNotRunning ) {
161147 throw new NoRunningInstanceError (
162148 workspaceId ,
163- this . usePublicApi
164- ? ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ? WorkspaceInstanceStatus_Phase [ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ! ] : undefined
165- : ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase
149+ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ? WorkspaceInstanceStatus_Phase [ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ! ] : undefined ,
166150 ) ;
167151 }
168152
@@ -271,9 +255,6 @@ export class RemoteConnector extends Disposable {
271255 location : vscode . ProgressLocation . Notification
272256 } ,
273257 async ( ) => {
274- this . usePublicApi = await this . experiments . getUsePublicAPI ( params . gitpodHost ) ;
275- this . logService . info ( `Going to use ${ this . usePublicApi ? 'public' : 'server' } API` ) ;
276-
277258 const openSSHVersion = await getOpenSSHVersion ( ) ;
278259
279260 // Always try to run a local ssh connection collect success metrics
0 commit comments