From f7c8efd93c49ad0bb865b117b5b3d244622a5712 Mon Sep 17 00:00:00 2001 From: Tommy van der Vorst Date: Fri, 4 Apr 2025 18:46:12 +0200 Subject: [PATCH] fix(config): properly apply defaults when reading folder configuration (#10034) --- lib/config/config_test.go | 12 ++++++++---- lib/config/folderconfiguration.go | 25 ++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/config/config_test.go b/lib/config/config_test.go index b4d61fab4..1c2d8071b 100644 --- a/lib/config/config_test.go +++ b/lib/config/config_test.go @@ -101,7 +101,7 @@ func TestDefaultValues(t *testing.T) { Defaults: Defaults{ Folder: FolderConfiguration{ FilesystemType: FilesystemTypeBasic, - Path: "~", + Path: "", Type: FolderTypeSendReceive, Devices: []FolderDeviceConfiguration{{DeviceID: device1}}, RescanIntervalS: 3600, @@ -181,7 +181,7 @@ func TestDeviceConfig(t *testing.T) { Devices: []FolderDeviceConfiguration{{DeviceID: device1}, {DeviceID: device4}}, Type: FolderTypeSendOnly, RescanIntervalS: 600, - FSWatcherEnabled: false, + FSWatcherEnabled: true, FSWatcherDelayS: 10, Copiers: 0, Hashers: 0, @@ -189,14 +189,18 @@ func TestDeviceConfig(t *testing.T) { MinDiskFree: Size{1, "%"}, MaxConflicts: -1, Versioning: VersioningConfiguration{ - Params: map[string]string{}, + CleanupIntervalS: 3600, + FSType: FilesystemTypeBasic, + Params: map[string]string{}, }, WeakHashThresholdPct: 25, MarkerName: DefaultMarkerName, JunctionsAsDirs: true, MaxConcurrentWrites: maxConcurrentWritesDefault, XattrFilter: XattrFilter{ - Entries: []XattrFilterEntry{}, + MaxSingleEntrySize: 1024, + MaxTotalSize: 4096, + Entries: []XattrFilterEntry{}, }, }, } diff --git a/lib/config/folderconfiguration.go b/lib/config/folderconfiguration.go index 786be1f8d..715bff8c9 100644 --- a/lib/config/folderconfiguration.go +++ b/lib/config/folderconfiguration.go @@ -9,6 +9,8 @@ package config import ( "bytes" "crypto/sha256" + "encoding/json" + "encoding/xml" "errors" "fmt" "path" @@ -23,6 +25,7 @@ import ( "github.com/syncthing/syncthing/lib/db" "github.com/syncthing/syncthing/lib/fs" "github.com/syncthing/syncthing/lib/protocol" + "github.com/syncthing/syncthing/lib/structutil" ) var ( @@ -48,7 +51,7 @@ type FolderConfiguration struct { ID string `json:"id" xml:"id,attr" nodefault:"true"` Label string `json:"label" xml:"label,attr" restart:"false"` FilesystemType FilesystemType `json:"filesystemType" xml:"filesystemType" default:"basic"` - Path string `json:"path" xml:"path,attr" default:"~"` + Path string `json:"path" xml:"path,attr"` Type FolderType `json:"type" xml:"type,attr"` Devices []FolderDeviceConfiguration `json:"devices" xml:"device"` RescanIntervalS int `json:"rescanIntervalS" xml:"rescanIntervalS,attr" default:"3600"` @@ -399,3 +402,23 @@ func (f XattrFilter) GetMaxSingleEntrySize() int { func (f XattrFilter) GetMaxTotalSize() int { return f.MaxTotalSize } + +func (f *FolderConfiguration) UnmarshalJSON(data []byte) error { + structutil.SetDefaults(f) + + // avoid recursing into this method + type noCustomUnmarshal FolderConfiguration + ptr := (*noCustomUnmarshal)(f) + + return json.Unmarshal(data, ptr) +} + +func (f *FolderConfiguration) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + structutil.SetDefaults(f) + + // avoid recursing into this method + type noCustomUnmarshal FolderConfiguration + ptr := (*noCustomUnmarshal)(f) + + return d.DecodeElement(ptr, &start) +}