|
|
|
@ -18,6 +18,7 @@ import (
|
|
|
|
|
"math/rand"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/url"
|
|
|
|
|
"sort"
|
|
|
|
|
"strings"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
@ -167,6 +168,18 @@ func (s *Server) Node(nodeKey tailcfg.NodeKey) *tailcfg.Node {
|
|
|
|
|
return s.nodes[nodeKey].Clone()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) AllNodes() (nodes []*tailcfg.Node) {
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
for _, n := range s.nodes {
|
|
|
|
|
nodes = append(nodes, n.Clone())
|
|
|
|
|
}
|
|
|
|
|
sort.Slice(nodes, func(i, j int) bool {
|
|
|
|
|
return nodes[i].StableID < nodes[j].StableID
|
|
|
|
|
})
|
|
|
|
|
return nodes
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) getUser(nodeKey tailcfg.NodeKey) (*tailcfg.User, *tailcfg.Login) {
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
@ -366,6 +379,21 @@ func sendUpdate(dst chan<- updateType, updateType updateType) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) UpdateNode(n *tailcfg.Node) (peersToUpdate []tailcfg.NodeID) {
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
if n.Key.IsZero() {
|
|
|
|
|
panic("zero nodekey")
|
|
|
|
|
}
|
|
|
|
|
s.nodes[n.Key] = n.Clone()
|
|
|
|
|
for _, n2 := range s.nodes {
|
|
|
|
|
if n.ID != n2.ID {
|
|
|
|
|
peersToUpdate = append(peersToUpdate, n2.ID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return peersToUpdate
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) serveMap(w http.ResponseWriter, r *http.Request, mkey tailcfg.MachineKey) {
|
|
|
|
|
ctx := r.Context()
|
|
|
|
|
|
|
|
|
@ -391,10 +419,8 @@ func (s *Server) serveMap(w http.ResponseWriter, r *http.Request, mkey tailcfg.M
|
|
|
|
|
if !req.ReadOnly {
|
|
|
|
|
endpoints := filterInvalidIPv6Endpoints(req.Endpoints)
|
|
|
|
|
node.Endpoints = endpoints
|
|
|
|
|
// TODO: more
|
|
|
|
|
// TODO: register node,
|
|
|
|
|
//s.UpdateEndpoint(mkey, req.NodeKey,
|
|
|
|
|
// XXX
|
|
|
|
|
node.DiscoKey = req.DiscoKey
|
|
|
|
|
peersToUpdate = s.UpdateNode(node)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nodeID := node.ID
|
|
|
|
@ -501,6 +527,12 @@ func (s *Server) MapResponse(req *tailcfg.MapRequest) (res *tailcfg.MapResponse,
|
|
|
|
|
CollectServices: "true",
|
|
|
|
|
PacketFilter: tailcfg.FilterAllowAll,
|
|
|
|
|
}
|
|
|
|
|
for _, p := range s.AllNodes() {
|
|
|
|
|
if p.StableID != node.StableID {
|
|
|
|
|
res.Peers = append(res.Peers, p)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res.Node.Addresses = []netaddr.IPPrefix{
|
|
|
|
|
netaddr.MustParseIPPrefix(fmt.Sprintf("100.64.%d.%d/32", uint8(node.ID>>8), uint8(node.ID))),
|
|
|
|
|
}
|
|
|
|
|