Просмотр исходного кода

tailcfg, control/controlclient: allow empty MapResponse.Domain (mapver17)

Signed-off-by: Brad Fitzpatrick <[email protected]>
Brad Fitzpatrick 4 лет назад
Родитель
Сommit
3739cf22b0
3 измененных файлов с 29 добавлено и 3 удалено
  1. 5 1
      control/controlclient/map.go
  2. 20 0
      control/controlclient/map_test.go
  3. 4 2
      tailcfg/tailcfg.go

+ 5 - 1
control/controlclient/map.go

@@ -38,6 +38,7 @@ type mapSession struct {
 	lastParsedPacketFilter []filter.Match
 	collectServices        bool
 	previousPeers          []*tailcfg.Node // for delta-purposes
+	lastDomain             string
 
 	// netMapBuilding is non-nil during a netmapForResponse call,
 	// containing the value to be returned, once fully populated.
@@ -96,6 +97,9 @@ func (ms *mapSession) netmapForResponse(resp *tailcfg.MapResponse) *netmap.Netwo
 	if v, ok := resp.CollectServices.Get(); ok {
 		ms.collectServices = v
 	}
+	if resp.Domain != "" {
+		ms.lastDomain = resp.Domain
+	}
 
 	nm := &netmap.NetworkMap{
 		SelfNode:        resp.Node,
@@ -108,7 +112,7 @@ func (ms *mapSession) netmapForResponse(resp *tailcfg.MapResponse) *netmap.Netwo
 		Peers:           resp.Peers,
 		User:            resp.Node.User,
 		UserProfiles:    make(map[tailcfg.UserID]tailcfg.UserProfile),
-		Domain:          resp.Domain,
+		Domain:          ms.lastDomain,
 		DNS:             *ms.lastDNSConfig,
 		Hostinfo:        resp.Node.Hostinfo,
 		PacketFilter:    ms.lastParsedPacketFilter,

+ 20 - 0
control/controlclient/map_test.go

@@ -256,4 +256,24 @@ func TestNetmapForResponse(t *testing.T) {
 		})
 		wantCollect(true)
 	})
+	t.Run("implicit_domain", func(t *testing.T) {
+		ms := newTestMapSession(t)
+		var nm *netmap.NetworkMap
+		want := func(v string) {
+			t.Helper()
+			if nm.Domain != v {
+				t.Errorf("netmap.Domain = %q; want %q", nm.Domain, v)
+			}
+		}
+		nm = ms.netmapForResponse(&tailcfg.MapResponse{
+			Node:   new(tailcfg.Node),
+			Domain: "foo.com",
+		})
+		want("foo.com")
+
+		nm = ms.netmapForResponse(&tailcfg.MapResponse{
+			Node: new(tailcfg.Node),
+		})
+		want("foo.com")
+	})
 }

+ 4 - 2
tailcfg/tailcfg.go

@@ -39,7 +39,8 @@ import (
 //    14: 2021-04-07: client understands DNSConfig.Routes and DNSConfig.Resolvers
 //    15: 2021-04-12: client treats nil MapResponse.DNSConfig as meaning unchanged
 //    16: 2021-04-15: client understands Node.Online, MapResponse.OnlineChange
-const CurrentMapRequestVersion = 16
+//    17: 2021-04-18: MapResponse.Domain empty means unchanged
+const CurrentMapRequestVersion = 17
 
 type StableID string
 
@@ -939,7 +940,8 @@ type MapResponse struct {
 	// "[email protected]" (for siloed users on shared email
 	// providers). Its exact form should not be depended on; new
 	// forms are coming later.
-	Domain string
+	// If empty, the value is unchanged.
+	Domain string `json:",omitempty"`
 
 	// CollectServices reports whether this node's Tailnet has
 	// requested that info about services be included in HostInfo.