Config version 3: default to compression=true on nodes

This commit is contained in:
Jakob Borg 2014-08-01 16:48:06 +02:00
parent 43e7435c41
commit 9312e3c7de
2 changed files with 51 additions and 17 deletions

View File

@ -22,7 +22,7 @@ import (
var l = logger.DefaultLogger var l = logger.DefaultLogger
type Configuration struct { type Configuration struct {
Version int `xml:"version,attr" default:"2"` Version int `xml:"version,attr" default:"3"`
Repositories []RepositoryConfiguration `xml:"repository"` Repositories []RepositoryConfiguration `xml:"repository"`
Nodes []NodeConfiguration `xml:"node"` Nodes []NodeConfiguration `xml:"node"`
GUI GUIConfiguration `xml:"gui"` GUI GUIConfiguration `xml:"gui"`
@ -296,6 +296,11 @@ func Load(rd io.Reader, myID protocol.NodeID) (Configuration, error) {
convertV1V2(&cfg) convertV1V2(&cfg)
} }
// Upgrade to v3 configuration if appropriate
if cfg.Version == 2 {
convertV2V3(&cfg)
}
// Hash old cleartext passwords // Hash old cleartext passwords
if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' { if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' {
hash, err := bcrypt.GenerateFromPassword([]byte(cfg.GUI.Password), 0) hash, err := bcrypt.GenerateFromPassword([]byte(cfg.GUI.Password), 0)
@ -342,6 +347,16 @@ func Load(rd io.Reader, myID protocol.NodeID) (Configuration, error) {
return cfg, err return cfg, err
} }
func convertV2V3(cfg *Configuration) {
// In previous versions, compression was always on. When upgrading, enable
// compression on all existing new. New nodes will get compression on by
// default by the GUI.
for i := range cfg.Nodes {
cfg.Nodes[i].Compression = true
}
cfg.Version = 3
}
func convertV1V2(cfg *Configuration) { func convertV1V2(cfg *Configuration) {
// Collect the list of nodes. // Collect the list of nodes.
// Replace node configs inside repositories with only a reference to the nide ID. // Replace node configs inside repositories with only a reference to the nide ID.

View File

@ -91,7 +91,21 @@ func TestNodeConfig(t *testing.T) {
</configuration> </configuration>
`) `)
for i, data := range [][]byte{v1data, v2data} { v3data := []byte(`
<configuration version="3">
<repository id="test" directory="~/Sync" ro="true" ignorePerms="false">
<node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" compression="false"></node>
<node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" compression="false"></node>
</repository>
<node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" name="node one" compression="true">
<address>a</address>
</node>
<node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="true">
<address>b</address>
</node>
</configuration>`)
for i, data := range [][]byte{v1data, v2data, v3data} {
cfg, err := Load(bytes.NewReader(data), node1) cfg, err := Load(bytes.NewReader(data), node1)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
@ -107,20 +121,22 @@ func TestNodeConfig(t *testing.T) {
} }
expectedNodes := []NodeConfiguration{ expectedNodes := []NodeConfiguration{
{ {
NodeID: node1, NodeID: node1,
Name: "node one", Name: "node one",
Addresses: []string{"a"}, Addresses: []string{"a"},
Compression: true,
}, },
{ {
NodeID: node4, NodeID: node4,
Name: "node two", Name: "node two",
Addresses: []string{"b"}, Addresses: []string{"b"},
Compression: true,
}, },
} }
expectedNodeIDs := []protocol.NodeID{node1, node4} expectedNodeIDs := []protocol.NodeID{node1, node4}
if cfg.Version != 2 { if cfg.Version != 3 {
t.Errorf("%d: Incorrect version %d != 2", i, cfg.Version) t.Errorf("%d: Incorrect version %d != 3", i, cfg.Version)
} }
if !reflect.DeepEqual(cfg.Repositories, expectedRepos) { if !reflect.DeepEqual(cfg.Repositories, expectedRepos) {
t.Errorf("%d: Incorrect Repositories\n A: %#v\n E: %#v", i, cfg.Repositories, expectedRepos) t.Errorf("%d: Incorrect Repositories\n A: %#v\n E: %#v", i, cfg.Repositories, expectedRepos)
@ -222,16 +238,19 @@ func TestNodeAddressesDynamic(t *testing.T) {
name, _ := os.Hostname() name, _ := os.Hostname()
expected := []NodeConfiguration{ expected := []NodeConfiguration{
{ {
NodeID: node1, NodeID: node1,
Addresses: []string{"dynamic"}, Addresses: []string{"dynamic"},
Compression: true,
}, },
{ {
NodeID: node2, NodeID: node2,
Addresses: []string{"dynamic"}, Addresses: []string{"dynamic"},
Compression: true,
}, },
{ {
NodeID: node3, NodeID: node3,
Addresses: []string{"dynamic"}, Addresses: []string{"dynamic"},
Compression: true,
}, },
{ {
NodeID: node4, NodeID: node4,
@ -252,7 +271,7 @@ func TestNodeAddressesDynamic(t *testing.T) {
func TestNodeAddressesStatic(t *testing.T) { func TestNodeAddressesStatic(t *testing.T) {
data := []byte(` data := []byte(`
<configuration version="2"> <configuration version="3">
<node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ"> <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ">
<address>192.0.2.1</address> <address>192.0.2.1</address>
<address>192.0.2.2</address> <address>192.0.2.2</address>