// clusterConfig returns a ClusterConfigMessage that is correct for the given peer device func (m *Model) clusterConfig(device protocol.DeviceID) protocol.ClusterConfigMessage { cm := protocol.ClusterConfigMessage{ ClientName: m.clientName, ClientVersion: m.clientVersion, Options: []protocol.Option{ { Key: "name", Value: m.deviceName, }, }, } m.fmut.RLock() for _, folder := range m.deviceFolders[device] { cr := protocol.Folder{ ID: folder, } for _, device := range m.folderDevices[folder] { // DeviceID is a value type, but with an underlying array. Copy it // so we don't grab aliases to the same array later on in device[:] device := device // TODO: Set read only bit when relevant cn := protocol.Device{ ID: device[:], Flags: protocol.FlagShareTrusted, } if deviceCfg := m.cfg.Devices()[device]; deviceCfg.Introducer { cn.Flags |= protocol.FlagIntroducer } cr.Devices = append(cr.Devices, cn) } cm.Folders = append(cm.Folders, cr) } m.fmut.RUnlock() return cm }