Skip to content

Commit 5769d59

Browse files
committed
feat: include client username and hostname in overlay messages
Added a new `HostInfo` struct to `overlayMessage` to encapsulate the username and hostname of the connecting client. Updated the `Receive` and `Send` handlers to utilize this information. Enhanced connection logs to display the username and hostname, providing more context on incoming connections. Refactored the `ListenOverlaySTUN` and `ListenOverlayDERP` methods to use a new helper `newHelloPacket` for constructing the initial packet with the client's host info.
1 parent ba2af1b commit 5769d59

File tree

3 files changed

+49
-19
lines changed

3 files changed

+49
-19
lines changed

overlay/overlay.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ const (
2828
type overlayMessage struct {
2929
Typ messageType
3030

31-
IP netip.Addr
32-
Node tailcfg.Node
31+
HostInfo HostInfo
32+
IP netip.Addr
33+
Node tailcfg.Node
34+
}
35+
36+
type HostInfo struct {
37+
Username string
38+
Hostname string
3339
}

overlay/receive.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,15 @@ func (r *Receive) handleNextMessage(msg []byte, system string) (resRaw []byte, n
342342
case messageTypeHello:
343343
res.Typ = messageTypeHelloResponse
344344
res.IP = r.assignNextIP()
345-
fmt.Println(cliui.Timestamp(time.Now()), "Received connection request over", system)
345+
username := "unknown"
346+
if u := ovMsg.HostInfo.Username; u != "" {
347+
username = u
348+
}
349+
hostname := "unknown"
350+
if h := ovMsg.HostInfo.Hostname; h != "" {
351+
hostname = h
352+
}
353+
fmt.Println(cliui.Timestamp(time.Now()), "Received connection request over", system, "from", cliui.Keyword(fmt.Sprintf("%s@%s", username, hostname)))
346354
case messageTypeNodeUpdate:
347355
fmt.Println(cliui.Timestamp(time.Now()), "Received updated node from", cliui.Code(ovMsg.Node.Key.String()))
348356
r.in <- &ovMsg.Node

overlay/send.go

+32-16
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"log/slog"
99
"net"
1010
"net/netip"
11+
"os"
12+
"os/user"
1113
"sync"
1214
"time"
1315

@@ -68,19 +70,12 @@ func (s *Send) ListenOverlaySTUN(ctx context.Context) error {
6870
_ = conn.Close()
6971
}()
7072

71-
raw, err := json.Marshal(overlayMessage{
72-
Typ: messageTypeHello,
73-
})
74-
if err != nil {
75-
panic("marshal node: " + err.Error())
76-
}
77-
73+
sealed := s.newHelloPacket()
7874
receiverAddr := s.Auth.ReceiverStunAddr
7975
if s.STUNIPOverride.IsValid() {
8076
receiverAddr = netip.AddrPortFrom(s.STUNIPOverride, s.Auth.ReceiverStunAddr.Port())
8177
}
8278

83-
sealed := s.Auth.OverlayPrivateKey.SealTo(s.Auth.ReceiverPublicKey, raw)
8479
_, err = conn.WriteToUDPAddrPort(sealed, receiverAddr)
8580
if err != nil {
8681
return fmt.Errorf("send overlay hello over STUN: %w", err)
@@ -168,14 +163,7 @@ func (s *Send) ListenOverlayDERP(ctx context.Context) error {
168163
return err
169164
}
170165

171-
raw, err := json.Marshal(overlayMessage{
172-
Typ: messageTypeHello,
173-
})
174-
if err != nil {
175-
panic("marshal node: " + err.Error())
176-
}
177-
178-
sealed := s.Auth.OverlayPrivateKey.SealTo(s.Auth.ReceiverPublicKey, raw)
166+
sealed := s.newHelloPacket()
179167
err = c.Send(s.Auth.ReceiverPublicKey, sealed)
180168
if err != nil {
181169
return fmt.Errorf("send overlay hello over derp: %w", err)
@@ -236,6 +224,34 @@ func (s *Send) ListenOverlayDERP(ctx context.Context) error {
236224
}
237225
}
238226

227+
func (s *Send) newHelloPacket() []byte {
228+
var (
229+
username,
230+
hostname string
231+
)
232+
233+
cu, _ := user.Current()
234+
if cu != nil {
235+
username = cu.Username
236+
}
237+
hostname, _ = os.Hostname()
238+
239+
raw, err := json.Marshal(overlayMessage{
240+
Typ: messageTypeHello,
241+
HostInfo: HostInfo{
242+
Username: username,
243+
Hostname: hostname,
244+
},
245+
})
246+
if err != nil {
247+
panic("marshal node: " + err.Error())
248+
}
249+
250+
fmt.Println("sending", string(raw))
251+
sealed := s.Auth.OverlayPrivateKey.SealTo(s.Auth.ReceiverPublicKey, raw)
252+
return sealed
253+
}
254+
239255
func (s *Send) handleNextMessage(msg []byte) (resRaw []byte, _ error) {
240256
cleartext, ok := s.Auth.OverlayPrivateKey.OpenFrom(s.Auth.ReceiverPublicKey, msg)
241257
if !ok {

0 commit comments

Comments
 (0)