Skip to content

Commit

Permalink
networks: validate that start, end, gateway ip are in the same subnet
Browse files Browse the repository at this point in the history
  • Loading branch information
yousong committed Jun 9, 2020
1 parent f4a001a commit 0280b6a
Showing 1 changed file with 48 additions and 8 deletions.
56 changes: 48 additions & 8 deletions pkg/compute/models/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -1289,13 +1289,17 @@ func (manager *SNetworkManager) ValidateCreateData(ctx context.Context, userCred

var (
ipRange netutils.IPV4AddrRange
masklen int8
netAddr netutils.IPV4Addr
)
if len(input.GuestIpPrefix) > 0 {
prefix, err := netutils.NewIPV4Prefix(input.GuestIpPrefix)
if err != nil {
return input, httperrors.NewInputParameterError("ip_prefix error: %s", err)
}
ipRange = prefix.ToIPRange()
masklen = prefix.MaskLen
netAddr = prefix.Address.NetAddr(masklen)
input.GuestIpMask = int64(prefix.MaskLen)
// 根据掩码得到合法的GuestIpPrefix
input.GuestIpPrefix = prefix.String()
Expand All @@ -1312,6 +1316,11 @@ func (manager *SNetworkManager) ValidateCreateData(ctx context.Context, userCred
return input, httperrors.NewInputParameterError("invalid end ip: %s %s", input.GuestIpEnd, err)
}
ipRange = netutils.NewIPV4AddrRange(ipStart, ipEnd)
masklen = int8(input.GuestIpMask)
netAddr = ipStart.NetAddr(masklen)
if ipEnd.NetAddr(masklen) != netAddr {
return input, httperrors.NewInputParameterError("start and end ip not in the same subnet")
}
}

if len(input.GuestDns) == 0 {
Expand All @@ -1337,6 +1346,15 @@ func (manager *SNetworkManager) ValidateCreateData(ctx context.Context, userCred
return input, httperrors.NewInputParameterError("%s: Invalid IP address %s", key, ipStr)
}
}
if input.GuestGateway != "" {
addr, err := netutils.NewIPV4Addr(input.GuestGateway)
if err != nil {
return input, httperrors.NewInputParameterError("bad gateway ip: %v", err)
}
if addr.NetAddr(masklen) != netAddr {
return input, httperrors.NewInputParameterError("gateway ip must be in the same subnet as start, end ip")
}
}

var (
wire *SWire
Expand Down Expand Up @@ -1429,8 +1447,23 @@ func (manager *SNetworkManager) ValidateCreateData(ctx context.Context, userCred
}

func (self *SNetwork) validateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.NetworkUpdateInput) (api.NetworkUpdateInput, error) {
var startIp, endIp netutils.IPV4Addr
var err error
var (
startIp netutils.IPV4Addr
endIp netutils.IPV4Addr
netAddr netutils.IPV4Addr
masklen int8
err error
)

if input.GuestIpMask != nil {
maskLen64 := int64(*input.GuestIpMask)
if !isValidMaskLen(maskLen64) {
return input, httperrors.NewInputParameterError("Invalid masklen %d", maskLen64)
}
masklen = int8(maskLen64)
} else {
masklen = int8(self.GuestIpMask)
}

if input.GuestIpStart != "" || input.GuestIpEnd != "" {
if input.GuestIpStart != "" {
Expand Down Expand Up @@ -1481,12 +1514,9 @@ func (self *SNetwork) validateUpdateData(ctx context.Context, userCred mcclient.

input.GuestIpStart = startIp.String()
input.GuestIpEnd = endIp.String()
}

if input.GuestIpMask != nil {
maskLen64 := int64(*input.GuestIpMask)
if !isValidMaskLen(maskLen64) {
return input, httperrors.NewInputParameterError("Invalid masklen %d", maskLen64)
netAddr = startIp.NetAddr(masklen)
if endIp.NetAddr(masklen) != netAddr {
return input, httperrors.NewInputParameterError("start, end ip must be in the same subnet")
}
}

Expand All @@ -1509,6 +1539,16 @@ func (self *SNetwork) validateUpdateData(ctx context.Context, userCred mcclient.
return input, httperrors.NewInputParameterError("%s: Invalid IP address %s", key, ipStr)
}
}
if input.GuestGateway != "" {
addr, err := netutils.NewIPV4Addr(input.GuestGateway)
if err != nil {
return input, httperrors.NewInputParameterError("bad gateway ip: %v", err)
}
if addr.NetAddr(masklen) != netAddr {
return input, httperrors.NewInputParameterError("gateway ip must be in the same subnet as start, end ip")
}
}

return input, nil
}

Expand Down

0 comments on commit 0280b6a

Please sign in to comment.