Skip to content

Commit

Permalink
make it harder to insert invalid routes (#2371)
Browse files Browse the repository at this point in the history
* make it harder to insert invalid routes

Signed-off-by: Kristoffer Dalby <[email protected]>

* dont panic if node is not available for route

Signed-off-by: Kristoffer Dalby <[email protected]>

* update changelog

Signed-off-by: Kristoffer Dalby <[email protected]>

---------

Signed-off-by: Kristoffer Dalby <[email protected]>
  • Loading branch information
kradalby committed Jan 23, 2025
1 parent 479f799 commit 5164b27
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

- Relax username validation to allow emails
[#2364](https://github.com/juanfont/headscale/pull/2364)
- Remove invalid routes and add stronger constraints for routes to avoid API panic
[#2371](https://github.com/juanfont/headscale/pull/2371)

## 0.24.0 (2025-01-17)

Expand Down
7 changes: 6 additions & 1 deletion cmd/headscale/cli/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,15 @@ func routesToPtables(routes []*v1.Route) pterm.TableData {
isPrimaryStr = strconv.FormatBool(route.GetIsPrimary())
}

var nodeName string
if route.GetNode() != nil {
nodeName = route.GetNode().GetGivenName()
}

tableData = append(tableData,
[]string{
strconv.FormatUint(route.GetId(), Base10),
route.GetNode().GetGivenName(),
nodeName,
route.GetPrefix(),
strconv.FormatBool(route.GetAdvertised()),
strconv.FormatBool(route.GetEnabled()),
Expand Down
21 changes: 21 additions & 0 deletions hscontrol/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,27 @@ func NewHeadscaleDatabase(
},
Rollback: func(db *gorm.DB) error { return nil },
},
{
// Add a constraint to routes ensuring they cannot exist without a node.
ID: "202501221827",
Migrate: func(tx *gorm.DB) error {
// Remove any invalid routes associated with a node that does not exist.
if tx.Migrator().HasTable(&types.Route{}) && tx.Migrator().HasTable(&types.Node{}) {
err := tx.Exec("delete from routes where node_id not in (select id from nodes)").Error
if err != nil {
return err
}
}

err := tx.AutoMigrate(&types.Route{})
if err != nil {
return err
}

return nil
},
Rollback: func(db *gorm.DB) error { return nil },
},
},
)

Expand Down
7 changes: 5 additions & 2 deletions hscontrol/types/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
type Route struct {
gorm.Model

NodeID uint64
NodeID uint64 `gorm:"not null"`
Node *Node

// TODO(kradalby): change this custom type to netip.Prefix
Expand Down Expand Up @@ -79,7 +79,6 @@ func (rs Routes) Proto() []*v1.Route {
for _, route := range rs {
protoRoute := v1.Route{
Id: uint64(route.ID),
Node: route.Node.Proto(),
Prefix: route.Prefix.String(),
Advertised: route.Advertised,
Enabled: route.Enabled,
Expand All @@ -88,6 +87,10 @@ func (rs Routes) Proto() []*v1.Route {
UpdatedAt: timestamppb.New(route.UpdatedAt),
}

if route.Node != nil {
protoRoute.Node = route.Node.Proto()
}

if route.DeletedAt.Valid {
protoRoute.DeletedAt = timestamppb.New(route.DeletedAt.Time)
}
Expand Down

0 comments on commit 5164b27

Please sign in to comment.