Skip to content

Commit 44ed068

Browse files
author
SESA826635
committed
feat: allow OTP to be passed via MFAToken parameter
1 parent 7574f61 commit 44ed068

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

pkg/provider/pingfed/pingfed.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,12 @@ func (ac *Client) handleCheckWebAuthn(ctx context.Context, doc *goquery.Document
179179
return ctx, req, err
180180
}
181181

182+
// Improved OTP handling in handleOTP function
182183
func (ac *Client) handleOTP(ctx context.Context, doc *goquery.Document, requestURL *url.URL) (context.Context, *http.Request, error) {
184+
loginDetails, ok := ctx.Value(ctxKey("login")).(*creds.LoginDetails)
185+
if !ok {
186+
return ctx, nil, fmt.Errorf("no context value for 'login'")
187+
}
183188
form, err := page.NewFormFromDocument(doc, "#otp-form")
184189
if err != nil {
185190
return ctx, nil, errors.Wrap(err, "error extracting OTP form")
@@ -191,9 +196,20 @@ func (ac *Client) handleOTP(ctx context.Context, doc *goquery.Document, requestU
191196
break
192197
}
193198
}
194-
195-
token := prompter.StringRequired("Enter passcode")
196-
form.Values.Set("otp", token)
199+
// Improved MFA token handling with retry capability
200+
var mfaToken string
201+
if loginDetails.MFAToken != "" {
202+
mfaToken = loginDetails.MFAToken
203+
// Clear the token to allow for retry on failure
204+
loginDetails.MFAToken = ""
205+
} else {
206+
mfaToken = prompter.StringRequired("Enter passcode")
207+
if mfaToken == "" {
208+
// User cancelled (Ctrl+C) or provided empty input
209+
return ctx, nil, fmt.Errorf("OTP entry cancelled by user")
210+
}
211+
}
212+
form.Values.Set("otp", mfaToken)
197213
req, err := form.BuildRequest()
198214
return ctx, req, err
199215
}

0 commit comments

Comments
 (0)