From e5a1c4df49959454dd12041aa47ffd357ce95b62 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 14 Feb 2023 17:52:53 -0800 Subject: [PATCH] test connection before dismissing LoginDialog --- ui/controller/controller.go | 11 +++++++++-- ui/dialogs/logindialog.go | 23 +++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/ui/controller/controller.go b/ui/controller/controller.go index f545b64..4fcd49a 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -103,8 +103,15 @@ func (m Controller) PromptForLoginAndConnect() { d := dialogs.NewLoginDialog(m.App.Config.Servers) pop := widget.NewModalPopUp(d, m.MainWindow.Canvas()) d.OnSubmit = func(server *backend.ServerConfig, password string) { - pop.Hide() - m.trySetPasswordAndConnectToServer(server, password) + err := m.App.ServerManager.TestConnectionAndAuth(server.Hostname, server.Username, password) + if err == backend.ErrUnreachable { + d.SetErrorText("Server unreachable") + } else if err != nil { + d.SetErrorText("Authentication failed") + } else { + pop.Hide() + m.trySetPasswordAndConnectToServer(server, password) + } } d.OnEditServer = func(server *backend.ServerConfig) { pop.Hide() diff --git a/ui/dialogs/logindialog.go b/ui/dialogs/logindialog.go index 3f6d714..08c087e 100644 --- a/ui/dialogs/logindialog.go +++ b/ui/dialogs/logindialog.go @@ -16,9 +16,10 @@ type LoginDialog struct { OnSubmit func(server *backend.ServerConfig, password string) OnEditServer func(server *backend.ServerConfig) - servers []*backend.ServerConfig - serverSelect *widget.Select - passField *widget.Entry + servers []*backend.ServerConfig + serverSelect *widget.Select + passField *widget.Entry + errPromptText *widget.RichText container *fyne.Container } @@ -40,6 +41,10 @@ func NewLoginDialog(servers []*backend.ServerConfig) *LoginDialog { l.passField = widget.NewPasswordEntry() okBtn := widget.NewButton("OK", l.onSubmit) + l.errPromptText = widget.NewRichTextWithText("") + l.errPromptText.Segments[0].(*widget.TextSegment).Style.ColorName = theme.ColorNameError + l.errPromptText.Hidden = true + l.container = container.NewVBox( container.NewHBox(layout.NewSpacer(), titleLabel, layout.NewSpacer()), container.New(layout.NewFormLayout(), @@ -48,11 +53,21 @@ func NewLoginDialog(servers []*backend.ServerConfig) *LoginDialog { widget.NewLabel("Password"), l.passField), widget.NewSeparator(), - container.NewHBox(layout.NewSpacer(), okBtn), + container.NewHBox(l.errPromptText, layout.NewSpacer(), okBtn), ) return l } +func (l *LoginDialog) SetErrorText(text string) { + l.errPromptText.Segments[0].(*widget.TextSegment).Text = text + if text != "" { + l.errPromptText.Show() + } else { + l.errPromptText.Hide() + } + l.errPromptText.Refresh() +} + func (l *LoginDialog) CreateRenderer() fyne.WidgetRenderer { return widget.NewSimpleRenderer(l.container) }