From f59ffc8ddde4cb7ad0950ad66576eb4c322fb1c7 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 11 Apr 2023 11:07:22 +0000 Subject: [PATCH] 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 --- lib/model/model.go | 23 +++++++++++++++++++---- 1 file 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, })