@@ -50,6 +50,7 @@ import {
5050 Profile ,
5151 SsoSession ,
5252 GetMfaCodeParams ,
53+ GetMfaCodeResult ,
5354 getMfaCodeRequestType ,
5455} from '@aws/language-server-runtimes/protocol'
5556import { LanguageClient } from 'vscode-languageclient'
@@ -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' ) )
@@ -541,6 +547,7 @@ export class IamLogin extends BaseLogin {
541547 lspAuth . registerStsCredentialChangedHandler ( ( params : StsCredentialChangedParams ) =>
542548 this . stsCredentialChangedHandler ( params )
543549 )
550+ lspAuth . registerGetMfaCodeHandler ( ( params : GetMfaCodeParams ) => this . getMfaCodeHandler ( params ) )
544551 }
545552
546553 async login ( opts : { accessKey : string ; secretKey : string ; sessionToken ?: string ; roleArn ?: string } ) {
@@ -680,4 +687,18 @@ export class IamLogin extends BaseLogin {
680687 }
681688 }
682689 }
690+
691+ private async getMfaCodeHandler ( params : GetMfaCodeParams ) : Promise < GetMfaCodeResult > {
692+ if ( params . mfaSerial ) {
693+ await globals . globalState . update ( 'recentMfaSerial' , { mfaSerial : params . mfaSerial } )
694+ }
695+ const defaultMfaSerial = globals . globalState . tryGet ( 'recentMfaSerial' , Object , {
696+ mfaSerial : '' ,
697+ } ) . mfaSerial
698+ let mfaSerial = await getMfaSerialFromUser ( defaultMfaSerial , params . profileName )
699+ mfaSerial = mfaSerial . trim ( )
700+ await globals . globalState . update ( 'recentMfaSerial' , { mfaSerial : mfaSerial } )
701+ const mfaCode = await getMfaTokenFromUser ( mfaSerial , params . profileName )
702+ return { code : mfaCode ?? '' , mfaSerial : mfaSerial ?? '' }
703+ }
683704}
0 commit comments