@@ -51,6 +51,7 @@ import {
5151 SsoSession ,
5252 GetMfaCodeParams ,
5353 getMfaCodeRequestType ,
54+ GetMfaCodeResult ,
5455} from '@aws/language-server-runtimes/protocol'
5556import { LanguageClient } from 'vscode-languageclient'
5657import { getLogger } from '../shared/logger/logger'
@@ -59,6 +60,8 @@ import { useDeviceFlow } from './sso/ssoAccessTokenProvider'
5960import { getCacheDir , getCacheFileWatcher , getFlareCacheFileName , getStsCacheDir } from './sso/cache'
6061import { VSCODE_EXTENSION_ID } from '../shared/extensions'
6162import { IamCredentials } from '@aws/language-server-runtimes-types'
63+ import globals from '../shared/extensionGlobals'
64+ import { getMfaSerialFromUser , getMfaTokenFromUser } from './credentials/utils'
6265
6366export const notificationTypes = {
6467 updateIamCredential : new RequestType < UpdateCredentialsParams , ResponseMessage , Error > (
@@ -72,7 +75,6 @@ export const notificationTypes = {
7275 getConnectionMetadata : new RequestType < undefined , ConnectionMetadata , Error > (
7376 getConnectionMetadataRequestType . method
7477 ) ,
75- getMfaCode : new RequestType < GetMfaCodeParams , ResponseMessage , Error > ( getMfaCodeRequestType . method ) ,
7678}
7779
7880export type AuthState = 'notConnected' | 'connected' | 'expired'
@@ -291,6 +293,10 @@ export class LanguageClientAuth {
291293 this . client . onNotification ( stsCredentialChangedRequestType . method , stsCredentialChangedHandler )
292294 }
293295
296+ registerGetMfaCodeHandler ( getMfaCodeHandler : ( params : GetMfaCodeParams ) => Promise < GetMfaCodeResult > ) {
297+ this . client . onRequest ( getMfaCodeRequestType . method , getMfaCodeHandler )
298+ }
299+
294300 registerCacheWatcher ( cacheChangedHandler : ( event : cacheChangedEvent ) => any ) {
295301 this . cacheWatcher . onDidCreate ( ( ) => cacheChangedHandler ( 'create' ) )
296302 this . cacheWatcher . onDidDelete ( ( ) => cacheChangedHandler ( 'delete' ) )
@@ -536,6 +542,7 @@ export class IamLogin extends BaseLogin {
536542 lspAuth . registerStsCredentialChangedHandler ( ( params : StsCredentialChangedParams ) =>
537543 this . stsCredentialChangedHandler ( params )
538544 )
545+ lspAuth . registerGetMfaCodeHandler ( ( params : GetMfaCodeParams ) => this . getMfaCodeHandler ( params ) )
539546 }
540547
541548 async login ( opts : { accessKey : string ; secretKey : string ; sessionToken ?: string ; roleArn ?: string } ) {
@@ -667,4 +674,18 @@ export class IamLogin extends BaseLogin {
667674 }
668675 }
669676 }
677+
678+ private async getMfaCodeHandler ( params : GetMfaCodeParams ) : Promise < GetMfaCodeResult > {
679+ if ( params . mfaSerial ) {
680+ await globals . globalState . update ( 'recentMfaSerial' , { mfaSerial : params . mfaSerial } )
681+ }
682+ const defaultMfaSerial = globals . globalState . tryGet ( 'recentMfaSerial' , Object , {
683+ mfaSerial : '' ,
684+ } ) . mfaSerial
685+ let mfaSerial = await getMfaSerialFromUser ( defaultMfaSerial , params . profileName )
686+ mfaSerial = mfaSerial . trim ( )
687+ await globals . globalState . update ( 'recentMfaSerial' , { mfaSerial : mfaSerial } )
688+ const mfaCode = await getMfaTokenFromUser ( mfaSerial , params . profileName )
689+ return { code : mfaCode ?? '' , mfaSerial : mfaSerial ?? '' }
690+ }
670691}
0 commit comments