@@ -4,7 +4,7 @@ import ora from 'ora';
44import { login } from './actions/auth.js' ;
55
66import { updateConfig } from './config.js' ;
7- import { log , error , informUpdate , requiresMfa } from './helpers.js' ;
7+ import { log , error , informUpdate , requiresMfa , getMfaStrategy } from './helpers.js' ;
88
99export async function doLogin ( message ) {
1010 if ( message ) log ( message , 'white' ) ;
@@ -38,16 +38,38 @@ export async function doLogin(message) {
3838 return loginSucceed ( loginLoader , loginBody ) ;
3939 } catch ( e ) {
4040 if ( requiresMfa ( e ) ) {
41- return await loginWith2FA ( loginLoader , credentials ) ;
41+ const mfaStrategy = getMfaStrategy ( e )
42+ return await loginWith2FA ( loginLoader , credentials , mfaStrategy ) ;
4243 } else {
4344 error ( e , loginLoader ) ;
4445 return false ;
4546 }
4647 }
4748}
4849
49- async function loginWith2FA ( loginLoader , credentials ) {
50- loginLoader . info ( 'Your account requires 2 factor authentication.' ) ;
50+ async function loginWith2FA ( loginLoader , credentials , mfaStrategy ) {
51+ loginLoader . info ( `Your account requires 2 factor authentication` ) ;
52+ let mfaType = mfaStrategy . mfaType ;
53+ if ( mfaType === 'AUTHENTICATOR_APP' && mfaStrategy . hasAuthy ) {
54+ const choiceMfa = await selectMfaType ( ) ;
55+ mfaType = choiceMfa . mfaType ;
56+ if ( mfaType === 'AUTHY' ) {
57+ // trigger login again with mfaType to send the prompt
58+ try {
59+ await login ( {
60+ ...credentials ,
61+ mfaType,
62+ requestAdminToken : true ,
63+ } ) ;
64+ } catch ( e ) {
65+ // don't throw error if just an error about missing MFA
66+ if ( ! requiresMfa ( e ) ) {
67+ error ( e , loginLoader ) ;
68+ return false ;
69+ }
70+ }
71+ }
72+ }
5173 try {
5274 const response = await inquirer . prompt ( [
5375 {
@@ -65,6 +87,7 @@ async function loginWith2FA(loginLoader, credentials) {
6587
6688 const loginBody = await login ( {
6789 ...credentials ,
90+ mfaType,
6891 otp : response . otp ,
6992 requestAdminToken : true ,
7093 } ) ;
@@ -75,6 +98,31 @@ async function loginWith2FA(loginLoader, credentials) {
7598 }
7699}
77100
101+ async function selectMfaType ( ) {
102+ const selectedMfa = await inquirer . prompt ( [
103+ {
104+ type : 'list' ,
105+ message : 'Select your preferred MFA' ,
106+ name : 'mfaType' ,
107+ choices : [
108+ {
109+ name : 'Authenticator App' ,
110+ value : 'AUTHENTICATOR_APP'
111+ } ,
112+ {
113+ name : 'SMS/Legacy' ,
114+ value : 'AUTHY'
115+ }
116+ ] ,
117+ validate : ( value ) =>
118+ value . length
119+ ? true
120+ : 'Please choose your preferred MFA' ,
121+ } ,
122+ ] ) ;
123+ return selectedMfa ;
124+ }
125+
78126async function loginSucceed ( loginLoader , loginBody ) {
79127 const { token, data : user } = loginBody ;
80128 loginLoader . succeed ( ) ;
0 commit comments