From f14dda8f45bfff94e781cc8c37e40a14038e6bb9 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 8 Mar 2023 17:42:31 -0800 Subject: [PATCH] add legacy auth support --- backend/config.go | 22 ++++++++++++---------- backend/servermanager.go | 19 +++++++++++-------- ui/controller/controller.go | 9 +++++---- ui/dialogs/addeditserverdialog.go | 15 ++++++++++----- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/backend/config.go b/backend/config.go index dd26556..ecfce24 100644 --- a/backend/config.go +++ b/backend/config.go @@ -8,11 +8,12 @@ import ( ) type ServerConfig struct { - ID uuid.UUID - Nickname string - Hostname string - Username string - Default bool + ID uuid.UUID + Nickname string + Hostname string + Username string + LegacyAuth bool + Default bool } type AppConfig struct { @@ -124,12 +125,13 @@ func (c *Config) SetDefaultServer(serverID uuid.UUID) { } } -func (c *Config) AddServer(nickname, hostname, username string) *ServerConfig { +func (c *Config) AddServer(nickname, hostname, username string, legacyAuth bool) *ServerConfig { s := &ServerConfig{ - ID: uuid.New(), - Nickname: nickname, - Hostname: hostname, - Username: username, + ID: uuid.New(), + Nickname: nickname, + Hostname: hostname, + Username: username, + LegacyAuth: legacyAuth, } c.Servers = append(c.Servers, s) return s diff --git a/backend/servermanager.go b/backend/servermanager.go index c0a1e0e..bce9938 100644 --- a/backend/servermanager.go +++ b/backend/servermanager.go @@ -25,7 +25,7 @@ func NewServerManager() *ServerManager { } func (s *ServerManager) ConnectToServer(conf *ServerConfig, password string) error { - cli, err := s.testConnectionAndCreateClient(conf.Hostname, conf.Username, password) + cli, err := s.testConnectionAndCreateClient(conf.Hostname, conf.Username, password, conf.LegacyAuth) if err != nil { return err } @@ -37,11 +37,13 @@ func (s *ServerManager) ConnectToServer(conf *ServerConfig, password string) err return nil } -func (s *ServerManager) TestConnectionAndAuth(hostname, username, password string, timeout time.Duration) error { +func (s *ServerManager) TestConnectionAndAuth( + hostname, username, password string, legacyAuth bool, timeout time.Duration, +) error { err := ErrUnreachable done := make(chan bool) go func() { - _, err = s.testConnectionAndCreateClient(hostname, username, password) + _, err = s.testConnectionAndCreateClient(hostname, username, password, legacyAuth) close(done) }() t := time.NewTimer(timeout) @@ -54,12 +56,13 @@ func (s *ServerManager) TestConnectionAndAuth(hostname, username, password strin } } -func (s *ServerManager) testConnectionAndCreateClient(hostname, username, password string) (*subsonic.Client, error) { +func (s *ServerManager) testConnectionAndCreateClient(hostname, username, password string, legacyAuth bool) (*subsonic.Client, error) { cli := &subsonic.Client{ - Client: &http.Client{}, - BaseUrl: hostname, - User: username, - ClientName: "supersonic", + Client: &http.Client{}, + BaseUrl: hostname, + User: username, + PasswordAuth: legacyAuth, + ClientName: "supersonic", } if !cli.Ping() { return nil, ErrUnreachable diff --git a/ui/controller/controller.go b/ui/controller/controller.go index a54201b..de3990e 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -102,7 +102,7 @@ func (m *Controller) PromptForFirstServer() { if m.testConnectionAndUpdateDialogText(d) { // connection is good pop.Hide() - server := m.App.Config.AddServer(d.Nickname, d.Host, d.Username) + server := m.App.Config.AddServer(d.Nickname, d.Host, d.Username, d.LegacyAuth) if err := m.App.ServerManager.SetServerPassword(server, d.Password); err != nil { log.Printf("error setting keyring credentials: %v", err) // TODO: handle? @@ -172,7 +172,7 @@ func (m *Controller) PromptForLoginAndConnect() { d.DisableSubmit() d.SetInfoText("Testing connection...") go func() { - err := m.App.ServerManager.TestConnectionAndAuth(server.Hostname, server.Username, password, 5*time.Second) + err := m.App.ServerManager.TestConnectionAndAuth(server.Hostname, server.Username, password, server.LegacyAuth, 5*time.Second) if err == backend.ErrUnreachable { d.SetErrorText("Server unreachable") } else if err != nil { @@ -197,6 +197,7 @@ func (m *Controller) PromptForLoginAndConnect() { server.Hostname = editD.Host server.Nickname = editD.Nickname server.Username = editD.Username + server.LegacyAuth = editD.LegacyAuth m.trySetPasswordAndConnectToServer(server, editD.Password) } d.EnableSubmit() @@ -226,7 +227,7 @@ func (c *Controller) trySetPasswordAndConnectToServer(server *backend.ServerConf } func (c *Controller) tryConnectToServer(server *backend.ServerConfig, password string) error { - if err := c.App.ServerManager.TestConnectionAndAuth(server.Hostname, server.Username, password, 10*time.Second); err != nil { + if err := c.App.ServerManager.TestConnectionAndAuth(server.Hostname, server.Username, password, server.LegacyAuth, 10*time.Second); err != nil { return err } if err := c.App.ServerManager.ConnectToServer(server, password); err != nil { @@ -238,7 +239,7 @@ func (c *Controller) tryConnectToServer(server *backend.ServerConfig, password s func (c *Controller) testConnectionAndUpdateDialogText(dlg *dialogs.AddEditServerDialog) bool { dlg.SetInfoText("Testing connection...") - err := c.App.ServerManager.TestConnectionAndAuth(dlg.Host, dlg.Username, dlg.Password, 5*time.Second) + err := c.App.ServerManager.TestConnectionAndAuth(dlg.Host, dlg.Username, dlg.Password, dlg.LegacyAuth, 5*time.Second) if err == backend.ErrUnreachable { dlg.SetErrorText("Could not reach server (wrong hostname?)") return false diff --git a/ui/dialogs/addeditserverdialog.go b/ui/dialogs/addeditserverdialog.go index 2417600..3fa95f1 100644 --- a/ui/dialogs/addeditserverdialog.go +++ b/ui/dialogs/addeditserverdialog.go @@ -14,11 +14,12 @@ import ( type AddEditServerDialog struct { widget.BaseWidget - Nickname string - Host string - Username string - Password string - OnSubmit func() + Nickname string + Host string + Username string + Password string + LegacyAuth bool + OnSubmit func() submitBtn *widget.Button promptText *widget.RichText @@ -34,6 +35,7 @@ func NewAddEditServerDialog(title string, prefillServer *backend.ServerConfig) * a.Nickname = prefillServer.Nickname a.Host = prefillServer.Hostname a.Username = prefillServer.Username + a.LegacyAuth = prefillServer.LegacyAuth } titleLabel := widget.NewLabel(title) @@ -53,6 +55,8 @@ func NewAddEditServerDialog(title string, prefillServer *backend.ServerConfig) * a.promptText = widget.NewRichTextWithText("") a.promptText.Hidden = true + legacyAuthCheck := widget.NewCheckWithData("Use legacy authentication", binding.BindBool(&a.LegacyAuth)) + a.container = container.NewVBox( container.NewHBox(layout.NewSpacer(), titleLabel, layout.NewSpacer()), container.New(layout.NewFormLayout(), @@ -65,6 +69,7 @@ func NewAddEditServerDialog(title string, prefillServer *backend.ServerConfig) * widget.NewLabel("Password"), passField, ), + container.NewHBox(layout.NewSpacer(), legacyAuthCheck), widget.NewSeparator(), container.NewHBox( a.promptText,