4
4
*--------------------------------------------------------------------------------------------*/
5
5
6
6
import { Workspace , WorkspaceInstanceStatus_Phase } from '@gitpod/public-api/lib/gitpod/experimental/v1/workspaces_pb' ;
7
- import { UserSSHPublicKeyValue , WorkspaceInfo } from '@gitpod/gitpod-protocol' ;
8
7
import * as crypto from 'crypto' ;
9
8
import { utils as sshUtils } from 'ssh2' ;
10
9
import { ParsedKey } from 'ssh2-streams' ;
11
10
import * as vscode from 'vscode' ;
12
11
import { Disposable } from './common/dispose' ;
13
- import { withServerApi } from './internalApi' ;
14
12
import { ITelemetryService , UserFlowTelemetryProperties } from './common/telemetry' ;
15
13
import { addHostToHostFile , checkNewHostInHostkeys } from './ssh/hostfile' ;
16
14
import { ScopeFeature } from './featureSupport' ;
@@ -33,8 +31,6 @@ export class RemoteConnector extends Disposable {
33
31
34
32
public static AUTH_COMPLETE_PATH = '/auth-complete' ;
35
33
36
- private usePublicApi : boolean = false ;
37
-
38
34
constructor (
39
35
private readonly context : vscode . ExtensionContext ,
40
36
private readonly sessionService : ISessionService ,
@@ -55,27 +51,21 @@ export class RemoteConnector extends Disposable {
55
51
private async getWorkspaceSSHDestination ( { workspaceId, gitpodHost, debugWorkspace } : SSHConnectionParams ) : Promise < { destination : SSHDestination ; password ?: string } > {
56
52
const sshKeysSupported = this . sessionService . getScopes ( ) . includes ( ScopeFeature . SSHPublicKeys ) ;
57
53
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
+ ] ) ;
63
59
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 ;
67
61
if ( isNotRunning ) {
68
62
throw new NoRunningInstanceError (
69
63
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
73
65
) ;
74
66
}
75
67
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 ) ;
79
69
80
70
const sshHostKeyEndPoint = `https://${ workspaceUrl . host } /_ssh/host_keys` ;
81
71
const sshHostKeyResponse = await fetch ( sshHostKeyEndPoint ) ;
@@ -122,18 +112,16 @@ export class RemoteConnector extends Disposable {
122
112
let identityKeys = await gatherIdentityFiles ( identityFiles , getAgentSock ( hostConfiguration ) , false , this . logService ) ;
123
113
124
114
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
+ }
132
121
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
+ } ) ;
137
125
this . logService . trace ( `Registered public keys in Gitpod account:` , registeredKeys . length ? registeredKeys . map ( k => `${ k . name } SHA256:${ k . fingerprint } ` ) . join ( '\n' ) : 'None' ) ;
138
126
139
127
identityKeys = identityKeys . filter ( k => ! ! registeredKeys . find ( regKey => regKey . fingerprint === k . fingerprint ) ) ;
@@ -151,18 +139,14 @@ export class RemoteConnector extends Disposable {
151
139
}
152
140
153
141
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 ) ;
155
143
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 ;
159
145
160
146
if ( isNotRunning ) {
161
147
throw new NoRunningInstanceError (
162
148
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 ,
166
150
) ;
167
151
}
168
152
@@ -271,9 +255,6 @@ export class RemoteConnector extends Disposable {
271
255
location : vscode . ProgressLocation . Notification
272
256
} ,
273
257
async ( ) => {
274
- this . usePublicApi = await this . experiments . getUsePublicAPI ( params . gitpodHost ) ;
275
- this . logService . info ( `Going to use ${ this . usePublicApi ? 'public' : 'server' } API` ) ;
276
-
277
258
const openSSHVersion = await getOpenSSHVersion ( ) ;
278
259
279
260
// Always try to run a local ssh connection collect success metrics
0 commit comments