Jelajahi Sumber

Implement MFA login (#225)

ayntgl 3 tahun lalu
induk
melakukan
3c507d4b34
1 mengubah file dengan 16 tambahan dan 5 penghapusan
  1. 16 5
      ui/login_view.go

+ 16 - 5
ui/login_view.go

@@ -61,6 +61,7 @@ func newEmailView(c *Core) *EmailView {
 
 	v.AddInputField("Email", "", 0, nil, nil)
 	v.AddPasswordField("Password", "", 0, 0, nil)
+	v.AddPasswordField("Code (optional)", "", 0, 0, nil)
 	v.AddButton("Login", v.onLoginButtonSelected)
 
 	return v
@@ -82,17 +83,27 @@ func (v *EmailView) onLoginButtonSelected() {
 		log.Fatal(err)
 	}
 
-	if l.Token != "" && !l.MFA {
-		err = v.core.Run(l.Token)
+	// If the token is not dispatched in the response and the "mfa" field is set as true, login using MFA instead.
+	if l.Token == "" && l.MFA {
+		code := v.GetFormItem(2).(*tview.InputField).GetText()
+		if code == "" {
+			return
+		}
+
+		// Retry logging in with a 2FA token
+		l, err = client.TOTP(code, l.Ticket)
 		if err != nil {
 			log.Fatal(err)
 		}
+	}
 
-		v.core.Draw()
-		go keyring.Set(config.Name, "token", l.Token)
+	err = v.core.Run(l.Token)
+	if err != nil {
+		log.Fatal(err)
 	}
 
-	// TODO: MFA login
+	v.core.Draw()
+	go keyring.Set(config.Name, "token", l.Token)
 }
 
 type TokenView struct {