Bläddra i källkod

lib/model: Don't include unshared folders in ClusterConfig (fixes #4926)

Also fixes a data race where ClusterConfig would access folderFiles
without a lock. Tweaked the ClusterConfig unit test to verify the
behavior.
Jakob Borg 7 år sedan
förälder
incheckning
2343c82c33
2 ändrade filer med 28 tillägg och 9 borttagningar
  1. 16 6
      lib/model/model.go
  2. 12 3
      lib/model/model_test.go

+ 16 - 6
lib/model/model.go

@@ -2207,12 +2207,21 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
 	var message protocol.ClusterConfig
 
 	m.fmut.RLock()
-	folderFiles := m.folderFiles
-	m.fmut.RUnlock()
-
-	var fs *db.FileSet
+	defer m.fmut.RUnlock()
 
 	for _, folderCfg := range m.cfg.FolderList() {
+		isShared := false
+		for _, sharedWith := range folderCfg.Devices {
+			if sharedWith.DeviceID == device {
+				isShared = true
+				break
+			}
+		}
+
+		if !isShared {
+			continue
+		}
+
 		protocolFolder := protocol.Folder{
 			ID:                 folderCfg.ID,
 			Label:              folderCfg.Label,
@@ -2223,8 +2232,9 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
 			Paused:             folderCfg.Paused,
 		}
 
+		var fs *db.FileSet
 		if !folderCfg.Paused {
-			fs = folderFiles[folderCfg.ID]
+			fs = m.folderFiles[folderCfg.ID]
 		}
 
 		for _, device := range folderCfg.Devices {
@@ -2239,7 +2249,7 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
 				Introducer:  deviceCfg.Introducer,
 			}
 
-			if !folderCfg.Paused {
+			if fs != nil {
 				if deviceCfg.DeviceID == m.id {
 					protocolDevice.IndexID = fs.IndexID(protocol.LocalDeviceID)
 					protocolDevice.MaxSequence = fs.Sequence(protocol.LocalDeviceID)

+ 12 - 3
lib/model/model_test.go

@@ -607,20 +607,29 @@ func TestClusterConfig(t *testing.T) {
 	cfg.Folders = []config.FolderConfiguration{
 		{
 			ID:   "folder1",
-			Path: "testdata",
+			Path: "testdata1",
 			Devices: []config.FolderDeviceConfiguration{
 				{DeviceID: device1},
 				{DeviceID: device2},
 			},
 		},
 		{
-			ID:   "folder2",
-			Path: "testdata",
+			ID:     "folder2",
+			Path:   "testdata2",
+			Paused: true, // should still be included
 			Devices: []config.FolderDeviceConfiguration{
 				{DeviceID: device1},
 				{DeviceID: device2},
 			},
 		},
+		{
+			ID:   "folder3",
+			Path: "testdata3",
+			Devices: []config.FolderDeviceConfiguration{
+				{DeviceID: device1},
+				// should not be included, does not include device2
+			},
+		},
 	}
 
 	db := db.OpenMemory()