@ -59,7 +59,6 @@ var addH2C func(*http.Server)
type peerAPIServer struct {
b * LocalBackend
rootDir string // empty means file receiving unavailable
selfNode * tailcfg . Node
knownEmpty atomic . Bool
resolver * resolver . Resolver
@ -513,10 +512,17 @@ func (pln *peerAPIListener) ServeConn(src netip.AddrPort, c net.Conn) {
c . Close ( )
return
}
nm := pln . lb . NetMap ( )
if nm == nil || nm . SelfNode == nil {
logf ( "peerapi: no netmap" )
c . Close ( )
return
}
h := & peerAPIHandler {
ps : pln . ps ,
isSelf : pln . ps . selfNode . User == peerNode . User ,
isSelf : nm. S elfNode. User == peerNode . User ,
remoteAddr : src ,
selfNode : nm . SelfNode ,
peerNode : peerNode ,
peerUser : peerUser ,
}
@ -534,6 +540,7 @@ type peerAPIHandler struct {
ps * peerAPIServer
remoteAddr netip . AddrPort
isSelf bool // whether peerNode is owned by same user as this node
selfNode * tailcfg . Node // this node; always non-nil
peerNode * tailcfg . Node // peerNode is who's making the request
peerUser tailcfg . UserProfile // profile of peerNode
}
@ -551,7 +558,7 @@ func (h *peerAPIHandler) validateHost(r *http.Request) error {
return err
}
hostIPPfx := netip . PrefixFrom ( ap . Addr ( ) , ap . Addr ( ) . BitLen ( ) )
if ! slices . Contains ( h . ps. selfNode. Addresses , hostIPPfx ) {
if ! slices . Contains ( h . selfNode. Addresses , hostIPPfx ) {
return fmt . Errorf ( "%v not found in self addresses" , hostIPPfx )
}
return nil
@ -717,14 +724,7 @@ func (h *peerAPIHandler) canPutFile() bool {
// canDebug reports whether h can debug this node (goroutines, metrics,
// magicsock internal state, etc).
func ( h * peerAPIHandler ) canDebug ( ) bool {
// Reread the selfNode as it may have changed since the peerAPIServer
// was created.
// TODO(maisem): handle this in other places too.
nm := h . ps . b . NetMap ( )
if nm == nil || nm . SelfNode == nil {
return false
}
if ! slices . Contains ( nm . SelfNode . Capabilities , tailcfg . CapabilityDebug ) {
if ! slices . Contains ( h . selfNode . Capabilities , tailcfg . CapabilityDebug ) {
// This node does not expose debug info.
return false
}