Skip to content

Commit e7dc558

Browse files
committed
Block joining backbone network, validate max_members bounds
Reject join_network on backbone (netID=0). Validate max_members accepts only integers 0-10000, rejecting fractional, negative, and overflow values. Add tests for both.
1 parent 0d4b84d commit e7dc558

2 files changed

Lines changed: 88 additions & 2 deletions

File tree

pkg/registry/server.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,10 @@ func (s *Server) handleJoinNetwork(msg map[string]interface{}) (map[string]inter
18581858
netID := jsonUint16(msg, "network_id")
18591859
token, _ := msg["token"].(string)
18601860

1861+
if netID == 0 {
1862+
return nil, fmt.Errorf("cannot join the backbone network")
1863+
}
1864+
18611865
// Auth: signature (daemon) or admin token (console)
18621866
s.mu.RLock()
18631867
node, ok := s.nodes[nodeID]
@@ -3270,8 +3274,8 @@ func (s *Server) handleSetNetworkPolicy(msg map[string]interface{}) (map[string]
32703274
policy := network.Policy
32713275

32723276
if v, ok := msg["max_members"].(float64); ok {
3273-
if v < 0 {
3274-
return nil, fmt.Errorf("max_members must be >= 0")
3277+
if v < 0 || v > 10000 || v != float64(int(v)) {
3278+
return nil, fmt.Errorf("invalid max_members (must be integer 0-10000)")
32753279
}
32763280
newMax := int(v)
32773281
if newMax > 0 && len(network.Members) > newMax {

tests/enterprise_gate_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3787,3 +3787,85 @@ func TestNetworkRenameValidation(t *testing.T) {
37873787

37883788
t.Log("network rename validation works correctly")
37893789
}
3790+
3791+
// TestJoinBackboneRejected verifies that joining the backbone network (ID 0) is rejected.
3792+
func TestJoinBackboneRejected(t *testing.T) {
3793+
t.Parallel()
3794+
rc, _, cleanup := startTestRegistryWithAdmin(t)
3795+
defer cleanup()
3796+
3797+
nodeID, _ := registerTestNode(t, rc)
3798+
3799+
_, err := rc.JoinNetwork(nodeID, 0, "", 0, TestAdminToken)
3800+
if err == nil {
3801+
t.Fatal("expected error when joining backbone network")
3802+
}
3803+
if !strings.Contains(err.Error(), "cannot") {
3804+
t.Errorf("unexpected error: %v", err)
3805+
}
3806+
t.Logf("backbone join correctly rejected: %v", err)
3807+
}
3808+
3809+
// TestMaxMembersValidation verifies that max_members rejects overflow, fractional, and out-of-range values.
3810+
func TestMaxMembersValidation(t *testing.T) {
3811+
t.Parallel()
3812+
rc, _, cleanup := startTestRegistryWithAdmin(t)
3813+
defer cleanup()
3814+
3815+
ownerID, ownerIdentity := registerTestNode(t, rc)
3816+
setClientSigner(rc, ownerIdentity)
3817+
3818+
resp, err := rc.CreateNetwork(ownerID, "maxmem-test", "open", "", TestAdminToken, true)
3819+
if err != nil {
3820+
t.Fatalf("create network: %v", err)
3821+
}
3822+
netID := uint16(resp["network_id"].(float64))
3823+
3824+
// Fractional max_members should fail
3825+
_, err = rc.SetNetworkPolicy(netID, map[string]interface{}{
3826+
"max_members": 5.5,
3827+
}, TestAdminToken)
3828+
if err == nil {
3829+
t.Error("expected error for fractional max_members")
3830+
} else {
3831+
t.Logf("fractional max_members rejected: %v", err)
3832+
}
3833+
3834+
// Negative max_members should fail
3835+
_, err = rc.SetNetworkPolicy(netID, map[string]interface{}{
3836+
"max_members": float64(-1),
3837+
}, TestAdminToken)
3838+
if err == nil {
3839+
t.Error("expected error for negative max_members")
3840+
} else {
3841+
t.Logf("negative max_members rejected: %v", err)
3842+
}
3843+
3844+
// Overflow max_members (>10000) should fail
3845+
_, err = rc.SetNetworkPolicy(netID, map[string]interface{}{
3846+
"max_members": float64(10001),
3847+
}, TestAdminToken)
3848+
if err == nil {
3849+
t.Error("expected error for overflow max_members")
3850+
} else {
3851+
t.Logf("overflow max_members rejected: %v", err)
3852+
}
3853+
3854+
// Valid max_members should succeed
3855+
_, err = rc.SetNetworkPolicy(netID, map[string]interface{}{
3856+
"max_members": float64(100),
3857+
}, TestAdminToken)
3858+
if err != nil {
3859+
t.Fatalf("valid max_members should succeed: %v", err)
3860+
}
3861+
3862+
// Zero max_members (unlimited) should succeed
3863+
_, err = rc.SetNetworkPolicy(netID, map[string]interface{}{
3864+
"max_members": float64(0),
3865+
}, TestAdminToken)
3866+
if err != nil {
3867+
t.Fatalf("zero max_members (unlimited) should succeed: %v", err)
3868+
}
3869+
3870+
t.Log("max_members validation works correctly")
3871+
}

0 commit comments

Comments
 (0)