diff options
author | Jakob Borg <jakob@kastelo.net> | 2023-04-11 11:07:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-11 13:07:22 +0200 |
commit | f59ffc8ddde4cb7ad0950ad66576eb4c322fb1c7 (patch) | |
tree | e5cc035080cc8d9c46c6bbb61b373eec2d98581b | |
parent | 61444960bce675d7f8d01997b6e41707ed2e04c0 (diff) |
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.go | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/model/model.go b/lib/model/model.go index b5b9cf3e01..2b4a58a618 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, }) |