From 9f4b1464fd6bb2948a812b562d4a3f7eb20c7085 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Tue, 28 Nov 2023 03:54:03 +0530 Subject: [PATCH] fix(ui): login page deadlock --- cmd/run.go | 9 ++++++--- ui/login_form.go | 20 ++++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/cmd/run.go b/cmd/run.go index 1dd7dd1..7ff643d 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -32,13 +32,16 @@ func Run(token string) error { lf := ui.NewLoginForm(cfg) go func() { + // mainFlex must be initialized before opening a new state. mainFlex = newMainFlex() - if err := <-lf.Error; err != nil { + + token := <-lf.Token + if token.Error != nil { app.Stop() - log.Fatal(err) + log.Fatal(token.Error) } - if err := openState(<-lf.Token); err != nil { + if err := openState(token.Value); err != nil { app.Stop() log.Fatal(err) } diff --git a/ui/login_form.go b/ui/login_form.go index f217f67..6a7954d 100644 --- a/ui/login_form.go +++ b/ui/login_form.go @@ -11,17 +11,20 @@ import ( "github.com/zalando/go-keyring" ) +type Token struct { + Value string + Error error +} + type LoginForm struct { *tview.Form - Token chan string - Error chan error + Token chan Token } func NewLoginForm(cfg *config.Config) *LoginForm { lf := &LoginForm{ Form: tview.NewForm(), - Token: make(chan string, 1), - Error: make(chan error), + Token: make(chan Token, 1), } lf.AddInputField("Email", "", 0, nil, nil) @@ -54,7 +57,7 @@ func (lf *LoginForm) onLoginButtonSelected() { // Log in using the provided email and password. lr, err := apiClient.Login(email, password) if err != nil { - lf.Error <- err + lf.Token <- Token{Error: err} return } @@ -62,18 +65,19 @@ func (lf *LoginForm) onLoginButtonSelected() { if lr.MFA && lr.Token == "" { code := lf.GetFormItem(2).(*tview.InputField).GetText() if code == "" { + lf.Token <- Token{Error: errors.New("code required")} return } lr, err = apiClient.TOTP(code, lr.Ticket) if err != nil { - lf.Error <- err + lf.Token <- Token{Error: err} return } } if lr.Token == "" { - lf.Error <- errors.New("token is missing") + lf.Token <- Token{Error: errors.New("missing token")} return } @@ -82,5 +86,5 @@ func (lf *LoginForm) onLoginButtonSelected() { go keyring.Set(constants.Name, "token", lr.Token) } - lf.Token <- lr.Token + lf.Token <- Token{Value: lr.Token} }