From 65d0ca8aa96efa785fe9527de992e7efaabc22bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Colomb?= Date: Tue, 19 Nov 2024 12:01:43 +0100 Subject: [PATCH] fix(config): respect GUI address override in fresh default config (fixes #9783) (#9675) ### Purpose When generating a new `config.xml` file with default options, the GUI address is populated with a hard-coded default value of `127.0.0.1:8384`, except for a random free port if that default one is occupied. This is independent from the GUI configuration default address defined in the protobuf description. More importantly, it ignores any `STGUIADDRESS` override given via environment variable or command-line option, thus probing for the default port instead of the one specified via override. The `ProbeFreePorts()` function now respects the override, by reading the `GUIConfiguration.Address()` method instead of using hard-coded defaults. When not calling `ProbeFreePorts()`, the override should still be persisted rather than the default address. This happens only when generating a fresh default `config.xml`, never on an existing one. --- lib/config/config.go | 13 ++++++++++--- lib/syncthing/utils.go | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/config/config.go b/lib/config/config.go index 550a485f3..44f8a3f95 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -49,7 +49,6 @@ var ( "dynamic+https://relays.syncthing.net/endpoint", netutil.AddressURL("quic", net.JoinHostPort("0.0.0.0", strconv.Itoa(DefaultQUICPort))), } - DefaultGUIPort = 8384 // DefaultDiscoveryServersV4 should be substituted when the configuration // contains default-v4. DefaultDiscoveryServersV4 = []string{ @@ -116,11 +115,19 @@ func New(myID protocol.DeviceID) Configuration { } func (cfg *Configuration) ProbeFreePorts() error { - port, err := getFreePort("127.0.0.1", DefaultGUIPort) + guiHost, guiPort, err := net.SplitHostPort(cfg.GUI.Address()) + if err != nil { + return fmt.Errorf("get default port (GUI): %w", err) + } + port, err := strconv.Atoi(guiPort) + if err != nil { + return fmt.Errorf("convert default port (GUI): %w", err) + } + port, err = getFreePort(guiHost, port) if err != nil { return fmt.Errorf("get free port (GUI): %w", err) } - cfg.GUI.RawAddress = fmt.Sprintf("127.0.0.1:%d", port) + cfg.GUI.RawAddress = net.JoinHostPort(guiHost, strconv.Itoa(port)) port, err = getFreePort("0.0.0.0", DefaultTCPPort) if err != nil { diff --git a/lib/syncthing/utils.go b/lib/syncthing/utils.go index 4971da050..15195c334 100644 --- a/lib/syncthing/utils.go +++ b/lib/syncthing/utils.go @@ -63,6 +63,8 @@ func DefaultConfig(path string, myID protocol.DeviceID, evLogger events.Logger, if skipPortProbing { l.Infoln("Using default network port numbers instead of probing for free ports") + // Record address override initially + newCfg.GUI.RawAddress = newCfg.GUI.Address() } else if err := newCfg.ProbeFreePorts(); err != nil { return nil, err }