aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Borg <jakob@kastelo.net>2023-04-11 11:07:22 +0000
committerGitHub <noreply@github.com>2023-04-11 13:07:22 +0200
commitf59ffc8ddde4cb7ad0950ad66576eb4c322fb1c7 (patch)
treee5cc035080cc8d9c46c6bbb61b373eec2d98581b
parent61444960bce675d7f8d01997b6e41707ed2e04c0 (diff)
downloadsyncthing-f59ffc8ddde4cb7ad0950ad66576eb4c322fb1c7.tar.gz
syncthing-f59ffc8ddde4cb7ad0950ad66576eb4c322fb1c7.zip
lib/model: Improve path generation for auto accepted folders (fixes #8859) (#8860)
- Make sure we don't try to use empty last path components - Create the directory to "reserve" it once we've decided to use it
-rw-r--r--lib/model/model.go23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/model/model.go b/lib/model/model.go
index b5b9cf3e0..2b4a58a61 100644
--- a/lib/model/model.go
+++ b/lib/model/model.go
@@ -1667,16 +1667,31 @@ func (*model) handleDeintroductions(introducerCfg config.DeviceConfiguration, fo
func (m *model) handleAutoAccepts(deviceID protocol.DeviceID, folder protocol.Folder, ccDeviceInfos *clusterConfigDeviceInfo, cfg config.FolderConfiguration, haveCfg bool, defaultPath string) (config.FolderConfiguration, bool) {
if !haveCfg {
defaultPathFs := fs.NewFilesystem(fs.FilesystemTypeBasic, defaultPath)
- pathAlternatives := []string{
- fs.SanitizePath(folder.Label),
- fs.SanitizePath(folder.ID),
+ var pathAlternatives []string
+ if alt := fs.SanitizePath(folder.Label); alt != "" {
+ pathAlternatives = append(pathAlternatives, alt)
+ }
+ if alt := fs.SanitizePath(folder.ID); alt != "" {
+ pathAlternatives = append(pathAlternatives, alt)
+ }
+ if len(pathAlternatives) == 0 {
+ l.Infof("Failed to auto-accept folder %s from %s due to lack of path alternatives", folder.Description(), deviceID)
+ return config.FolderConfiguration{}, false
}
for _, path := range pathAlternatives {
+ // Make sure the folder path doesn't already exist.
if _, err := defaultPathFs.Lstat(path); !fs.IsNotExist(err) {
continue
}
- fcfg := newFolderConfiguration(m.cfg, folder.ID, folder.Label, fs.FilesystemTypeBasic, filepath.Join(defaultPath, path))
+ // Attempt to create it to make sure it does, now.
+ fullPath := filepath.Join(defaultPath, path)
+ if err := defaultPathFs.MkdirAll(path, 0o700); err != nil {
+ l.Warnf("Failed to create path for auto-accepted folder %s at path %s: %v", folder.Description(), fullPath, err)
+ continue
+ }
+
+ fcfg := newFolderConfiguration(m.cfg, folder.ID, folder.Label, fs.FilesystemTypeBasic, fullPath)
fcfg.Devices = append(fcfg.Devices, config.FolderDeviceConfiguration{
DeviceID: deviceID,
})