Skip to content

Commit 310f0fd

Browse files
committed
Fix type checks for AuthUtil sessions
1 parent 6c54928 commit 310f0fd

File tree

3 files changed

+34
-33
lines changed

3 files changed

+34
-33
lines changed

packages/amazonq/test/unit/codewhisperer/util/authUtil.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ describe('AuthUtil', async function () {
483483
await auth.getIamCredential()
484484
assert.fail('Should have thrown an error')
485485
} catch (err) {
486-
assert.strictEqual((err as Error).message, 'Cannot get credential with SSO session')
486+
assert.strictEqual((err as Error).message, 'Cannot get credential without logging in with IAM.')
487487
}
488488
})
489489

@@ -494,7 +494,7 @@ describe('AuthUtil', async function () {
494494
await auth.getIamCredential()
495495
assert.fail('Should have thrown an error')
496496
} catch (err) {
497-
assert.strictEqual((err as Error).message, 'Cannot get credential without logging in.')
497+
assert.strictEqual((err as Error).message, 'Cannot get credential without logging in with IAM.')
498498
}
499499
})
500500
})

packages/core/src/codewhisperer/ui/codeWhispererNodes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export function createManageSubscription(): DataQuickPickItem<'manageSubscriptio
192192
export function createSignout(): DataQuickPickItem<'signout'> {
193193
const label = localize('AWS.codewhisperer.signoutNode.label', 'Sign Out')
194194
const icon = getIcon('vscode-export')
195-
const connection = AuthUtil.instance.isIamConnection()
195+
const connection = AuthUtil.instance.isIamSession()
196196
? 'IAM Credentials'
197197
: AuthUtil.instance.isBuilderIdConnection()
198198
? 'AWS Builder ID'

packages/core/src/codewhisperer/util/authUtil.ts

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,16 @@ import { showAmazonQWalkthroughOnce } from '../../amazonq/onboardingPage/walkthr
3030
import { setContext } from '../../shared/vscode/setContext'
3131
import { openUrl } from '../../shared/utilities/vsCodeUtils'
3232
import { telemetry } from '../../shared/telemetry/telemetry'
33-
import { AuthStateEvent, cacheChangedEvent, LanguageClientAuth, Login, SsoLogin, IamLogin } from '../../auth/auth2'
33+
import {
34+
AuthStateEvent,
35+
cacheChangedEvent,
36+
LanguageClientAuth,
37+
Login,
38+
SsoLogin,
39+
IamLogin,
40+
AuthState,
41+
LoginTypes,
42+
} from '../../auth/auth2'
3443
import { builderIdStartUrl, internalStartUrl } from '../../auth/sso/constants'
3544
import { VSCODE_EXTENSION_ID } from '../../shared/extensions'
3645
import { RegionProfileManager } from '../region/regionProfileManager'
@@ -108,11 +117,11 @@ export class AuthUtil implements IAuthProvider {
108117
}
109118

110119
isSsoSession(): boolean {
111-
return this.session instanceof SsoLogin
120+
return this.session?.loginType === LoginTypes.SSO
112121
}
113122

114123
isIamSession(): boolean {
115-
return this.session instanceof IamLogin
124+
return this.session?.loginType === LoginTypes.IAM
116125
}
117126

118127
/**
@@ -204,36 +213,30 @@ export class AuthUtil implements IAuthProvider {
204213
}
205214

206215
async getToken() {
207-
if (this.session) {
208-
const token = (await this.session.getCredential()).credential
209-
if (typeof token !== 'string') {
210-
throw new ToolkitError('Cannot get token with IAM session')
211-
}
212-
return token
216+
if (this.isSsoSession()) {
217+
const response = await this.session!.getCredential()
218+
return response.credential as string
213219
} else {
214-
throw new ToolkitError('Cannot get credential without logging in.')
220+
throw new ToolkitError('Cannot get credential without logging in with SSO.')
215221
}
216222
}
217223

218224
async getIamCredential() {
219-
if (this.session) {
220-
const credential = (await this.session.getCredential()).credential
221-
if (typeof credential !== 'object') {
222-
throw new ToolkitError('Cannot get credential with SSO session')
223-
}
224-
return credential
225+
if (this.isIamSession()) {
226+
const response = await this.session!.getCredential()
227+
return response.credential as IamCredentials
225228
} else {
226-
throw new ToolkitError('Cannot get credential without logging in.')
229+
throw new ToolkitError('Cannot get credential without logging in with IAM.')
227230
}
228231
}
229232

230233
get connection() {
231234
return this.session?.data
232235
}
233236

234-
getAuthState() {
235-
if (this.session) {
236-
return this.session.getConnectionState()
237+
getAuthState(): AuthState {
238+
if (this.isSsoSession() || this.isIamSession()) {
239+
return this.session!.getConnectionState()
237240
} else {
238241
return 'notConnected'
239242
}
@@ -255,10 +258,6 @@ export class AuthUtil implements IAuthProvider {
255258
return Boolean(this.connection?.startUrl && this.connection?.startUrl !== builderIdStartUrl)
256259
}
257260

258-
isIamConnection() {
259-
return Boolean(this.connection?.accessKey && this.connection?.secretKey)
260-
}
261-
262261
isInternalAmazonUser(): boolean {
263262
return this.isConnected() && this.connection?.startUrl === internalStartUrl
264263
}
@@ -360,11 +359,12 @@ export class AuthUtil implements IAuthProvider {
360359

361360
private async stateChangeHandler(e: AuthStateEvent) {
362361
if (e.state === 'refreshed') {
363-
const params = this.session ? (await this.session.getCredential()).updateCredentialsParams : undefined
364362
if (this.isSsoSession()) {
365-
await this.lspAuth.updateBearerToken(params)
363+
const params = await this.session!.getCredential()
364+
await this.lspAuth.updateBearerToken(params.updateCredentialsParams)
366365
} else if (this.isIamSession()) {
367-
await this.lspAuth.updateIamCredential(params)
366+
const params = await this.session!.getCredential()
367+
await this.lspAuth.updateIamCredential(params.updateCredentialsParams)
368368
}
369369
} else {
370370
this.logger.info(`codewhisperer: connection changed to ${e.state}`)
@@ -387,11 +387,12 @@ export class AuthUtil implements IAuthProvider {
387387
this.session = undefined
388388
}
389389
if (state === 'connected') {
390-
const params = this.session ? (await this.session.getCredential()).updateCredentialsParams : undefined
391390
if (this.isSsoSession()) {
392-
await this.lspAuth.updateBearerToken(params)
391+
const params = await this.session!.getCredential()
392+
await this.lspAuth.updateBearerToken(params.updateCredentialsParams)
393393
} else if (this.isIamSession()) {
394-
await this.lspAuth.updateIamCredential(params)
394+
const params = await this.session!.getCredential()
395+
await this.lspAuth.updateIamCredential(params.updateCredentialsParams)
395396
}
396397

397398
if (this.isIdcConnection()) {

0 commit comments

Comments
 (0)