Browse Source

Allow node IDs with spaces/dashes in config. Use dashes in GUI. (ref #230)

Jakob Borg 11 years ago
parent
commit
bbefcef53b
5 changed files with 72 additions and 6 deletions
  1. 0 0
      auto/gui.files.go
  2. 16 0
      config/config.go
  3. 50 0
      config/config_test.go
  4. 2 2
      gui/app.js
  5. 4 4
      gui/index.html

File diff suppressed because it is too large
+ 0 - 0
auto/gui.files.go


+ 16 - 0
config/config.go

@@ -9,6 +9,7 @@ import (
 	"reflect"
 	"sort"
 	"strconv"
+	"strings"
 
 	"code.google.com/p/go.crypto/bcrypt"
 	"github.com/calmh/syncthing/logger"
@@ -181,6 +182,14 @@ func Load(rd io.Reader, myID string) (Configuration, error) {
 		cfg.Repositories = []RepositoryConfiguration{}
 	}
 
+	// Sanitize node IDs
+	for i := range cfg.Nodes {
+		node := &cfg.Nodes[i]
+		// Strip spaces and dashes
+		node.NodeID = strings.Replace(node.NodeID, "-", "", -1)
+		node.NodeID = strings.Replace(node.NodeID, " ", "", -1)
+	}
+
 	// Check for missing, bad or duplicate repository ID:s
 	var seenRepos = map[string]*RepositoryConfiguration{}
 	var uniqueCounter int
@@ -196,6 +205,13 @@ func Load(rd io.Reader, myID string) (Configuration, error) {
 			repo.ID = "default"
 		}
 
+		for i := range repo.Nodes {
+			node := &repo.Nodes[i]
+			// Strip spaces and dashes
+			node.NodeID = strings.Replace(node.NodeID, "-", "", -1)
+			node.NodeID = strings.Replace(node.NodeID, " ", "", -1)
+		}
+
 		if seen, ok := seenRepos[repo.ID]; ok {
 			l.Warnf("Multiple repositories with ID %q; disabling", repo.ID)
 

+ 50 - 0
config/config_test.go

@@ -224,3 +224,53 @@ func TestNodeAddresses(t *testing.T) {
 		t.Errorf("Nodes differ;\n  E: %#v\n  A: %#v", expected, cfg.Nodes)
 	}
 }
+
+func TestStripNodeIs(t *testing.T) {
+	data := []byte(`
+<configuration version="2">
+    <node id="AAAA-BBBB-CCCC">
+        <address>dynamic</address>
+    </node>
+    <node id="AAAA BBBB DDDD">
+        <address></address>
+    </node>
+    <node id="AAAABBBBEEEE">
+        <address></address>
+    </node>
+    <repository directory="~/Sync">
+        <node id="AAA ABBB-BCC CC" name=""></node>
+        <node id="AA-AAB BBBD-DDD" name=""></node>
+        <node id="AAA AB-BBB EEE-E" name=""></node>
+    </repository>
+</configuration>
+`)
+
+	expected := []NodeConfiguration{
+		{
+			NodeID:    "AAAABBBBCCCC",
+			Addresses: []string{"dynamic"},
+		},
+		{
+			NodeID:    "AAAABBBBDDDD",
+			Addresses: []string{"dynamic"},
+		},
+		{
+			NodeID:    "AAAABBBBEEEE",
+			Addresses: []string{"dynamic"},
+		},
+	}
+
+	cfg, err := Load(bytes.NewReader(data), "n4")
+	if err != nil {
+		t.Error(err)
+	}
+
+	for i := range expected {
+		if !reflect.DeepEqual(cfg.Nodes[i], expected[i]) {
+			t.Errorf("Nodes[%d] differ;\n  E: %#v\n  A: %#v", i, expected[i], cfg.Nodes[i])
+		}
+		if cfg.Repositories[0].Nodes[i].NodeID != expected[i].NodeID {
+			t.Errorf("Repo nodes[%d] differ;\n  E: %#v\n  A: %#v", i, expected[i].NodeID, cfg.Repositories[0].Nodes[i].NodeID)
+		}
+	}
+}

+ 2 - 2
gui/app.js

@@ -460,7 +460,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
     $scope.init();
 
     setInterval($scope.refresh, refreshInterval);
-    setInterval(heartbeat, 450);
+    setInterval(heartbeat, 650);
 });
 
 function nodeCompare(a, b) {
@@ -581,7 +581,7 @@ syncthing.filter('chunkID', function () {
         var parts = input.match(/.{1,6}/g);
         if (!parts)
             return "";
-        return parts.join(' ');
+        return parts.join('-');
     }
 });
 

+ 4 - 4
gui/index.html

@@ -368,10 +368,10 @@
           <form role="form" name="nodeEditor">
             <div class="form-group" ng-class="{'has-error': nodeEditor.nodeID.$invalid && nodeEditor.nodeID.$dirty}">
               <label for="nodeID">Node ID</label>
-              <input ng-if="!editingExisting" name="nodeID" id="nodeID" class="form-control" type="text" ng-model="currentNode.NodeID" required></input>
-              <div ng-if="editingExisting" class="well well-sm">{{currentNode.NodeID | chunkID}}</div>
+              <input ng-if="!editingExisting" name="nodeID" id="nodeID" class="form-control text-monospace" type="text" ng-model="currentNode.NodeID" required></input>
+              <div ng-if="editingExisting" class="well well-sm text-monospace">{{currentNode.NodeID | chunkID}}</div>
               <p class="help-block">
-                <span ng-if="nodeEditor.nodeID.$valid || nodeEditor.nodeID.$pristine">The node ID to enter here can be found in the "Add Node" dialog on the other node. Spaces are ignored.</span>
+                <span ng-if="nodeEditor.nodeID.$valid || nodeEditor.nodeID.$pristine">The node ID to enter here can be found in the "Add Node" dialog on the other node. Spaces and dashes are optional (ignored).</span>
                 <span ng-if="nodeEditor.nodeID.$error.required && nodeEditor.nodeID.$dirty">The node ID cannot be blank.</span>
               </p>
             </div>
@@ -388,7 +388,7 @@
           </form>
           <div ng-show="!editingExisting">
             When adding a new node, keep in mind that <em>this node</em> must be added on the other side too. The Node ID of this node is:
-            <pre>{{myID | chunkID}}</pre>
+            <div class="well well-sm text-monospace">{{myID | chunkID}}</div>
           </div>
         </div>
         <div class="modal-footer">

Some files were not shown because too many files changed in this diff