diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index f1cc13308..40ae33399 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -654,7 +654,7 @@ func (c *Direct) PollNetMap(ctx context.Context, maxPolls int, cb func(*NetworkM Peers: resp.Peers, LocalPort: localPort, User: resp.Node.User, - UserProfiles: resp.UserProfiles, + UserProfiles: make(map[tailcfg.UserID]tailcfg.UserProfile), Domain: resp.Domain, DNS: resp.DNSConfig, Hostinfo: resp.Node.Hostinfo, @@ -662,6 +662,9 @@ func (c *Direct) PollNetMap(ctx context.Context, maxPolls int, cb func(*NetworkM DERPMap: lastDERPMap, Debug: resp.Debug, } + for _, profile := range resp.UserProfiles { + nm.UserProfiles[profile.ID] = profile + } if resp.Node.MachineAuthorized { nm.MachineStatus = tailcfg.MachineAuthorized } else { diff --git a/control/controlclient/netmap.go b/control/controlclient/netmap.go index 33a1e3eba..05ad6e2e0 100644 --- a/control/controlclient/netmap.go +++ b/control/controlclient/netmap.go @@ -44,9 +44,11 @@ type NetworkMap struct { // ACLs - User tailcfg.UserID - Domain string - UserProfiles []tailcfg.UserProfile + User tailcfg.UserID + Domain string + // TODO(crawshaw): reduce UserProfiles to []tailcfg.UserProfile? + // There are lots of ways to slice this data, leave it up to users. + UserProfiles map[tailcfg.UserID]tailcfg.UserProfile // TODO(crawshaw): Groups []tailcfg.Group // TODO(crawshaw): Capabilities []tailcfg.Capability } diff --git a/ipn/ipnstate/ipnstate.go b/ipn/ipnstate/ipnstate.go index a3c847109..703dca26c 100644 --- a/ipn/ipnstate/ipnstate.go +++ b/ipn/ipnstate/ipnstate.go @@ -112,7 +112,7 @@ func (sb *StatusBuilder) SetSelfStatus(ss *PeerStatus) { } // AddUser adds a user profile to the status. -func (sb *StatusBuilder) AddUser(up tailcfg.UserProfile) { +func (sb *StatusBuilder) AddUser(id tailcfg.UserID, up tailcfg.UserProfile) { sb.mu.Lock() defer sb.mu.Unlock() if sb.locked { @@ -124,7 +124,7 @@ func (sb *StatusBuilder) AddUser(up tailcfg.UserProfile) { sb.st.User = make(map[tailcfg.UserID]tailcfg.UserProfile) } - sb.st.User[up.ID] = up + sb.st.User[id] = up } // AddIP adds a Tailscale IP address to the status. diff --git a/ipn/local.go b/ipn/local.go index 2491b0e31..4306eb263 100644 --- a/ipn/local.go +++ b/ipn/local.go @@ -163,8 +163,8 @@ func (b *LocalBackend) UpdateStatus(sb *ipnstate.StatusBuilder) { // TODO: hostinfo, and its networkinfo // TODO: EngineStatus copy (and deprecate it?) if b.netMap != nil { - for _, up := range b.netMap.UserProfiles { - sb.AddUser(up) + for id, up := range b.netMap.UserProfiles { + sb.AddUser(id, up) } for _, p := range b.netMap.Peers { var lastSeen time.Time