mirror of
https://github.com/juanfont/headscale.git
synced 2026-02-07 20:04:00 +01:00
state: set User pointer during tagged→user-owned conversion
processReauthTags sets UserID when converting a tagged node to user-owned, but does not set the User pointer. When the node was registered with a tags-only PreAuthKey (User: nil), the in-memory NodeStore cache holds a node with User=nil. The mapper's generateUserProfiles then calls node.Owner().Model().ID, which dereferences the nil pointer and panics. Set node.User alongside node.UserID in processReauthTags. Also add defensive nil checks in generateUserProfiles to gracefully handle nodes with invalid owners rather than panicking. Fixes #3038
This commit is contained in:
parent
2cbbfc4319
commit
80a34ec3c1
@ -77,11 +77,22 @@ func generateUserProfiles(
|
||||
userMap := make(map[uint]*types.UserView)
|
||||
ids := make([]uint, 0, len(userMap))
|
||||
user := node.Owner()
|
||||
if !user.Valid() {
|
||||
log.Error().
|
||||
Uint64("node.id", node.ID().Uint64()).
|
||||
Str("node.name", node.Hostname()).
|
||||
Msg("node has no valid owner, skipping user profile generation")
|
||||
|
||||
return nil
|
||||
}
|
||||
userID := user.Model().ID
|
||||
userMap[userID] = &user
|
||||
ids = append(ids, userID)
|
||||
for _, peer := range peers.All() {
|
||||
peerUser := peer.Owner()
|
||||
if !peerUser.Valid() {
|
||||
continue
|
||||
}
|
||||
peerUserID := peerUser.Model().ID
|
||||
userMap[peerUserID] = &peerUser
|
||||
ids = append(ids, peerUserID)
|
||||
|
||||
@ -1464,6 +1464,7 @@ func (s *State) processReauthTags(
|
||||
|
||||
node.Tags = []string{}
|
||||
node.UserID = &user.ID
|
||||
node.User = user
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Loading…
Reference in New Issue
Block a user