Browse Source

normalize cidr on network/egress gateway creation

Matthew R. Kasun 2 years ago
parent
commit
6b42cbe120
3 changed files with 39 additions and 0 deletions
  1. 8 0
      logic/gateway.go
  2. 14 0
      logic/networks.go
  3. 17 0
      logic/util.go

+ 8 - 0
logic/gateway.go

@@ -14,6 +14,14 @@ import (
 
 
 // CreateEgressGateway - creates an egress gateway
 // CreateEgressGateway - creates an egress gateway
 func CreateEgressGateway(gateway models.EgressGatewayRequest) (models.Node, error) {
 func CreateEgressGateway(gateway models.EgressGatewayRequest) (models.Node, error) {
+	for i, cidr := range gateway.Ranges {
+		normalized, err := NormalizeCIDR(cidr)
+		if err != nil {
+			return models.Node{}, nil
+		}
+		gateway.Ranges[i] = normalized
+
+	}
 	node, err := GetNodeByID(gateway.NodeID)
 	node, err := GetNodeByID(gateway.NodeID)
 	if err != nil {
 	if err != nil {
 		return models.Node{}, err
 		return models.Node{}, err

+ 14 - 0
logic/networks.go

@@ -70,6 +70,20 @@ func DeleteNetwork(network string) error {
 // CreateNetwork - creates a network in database
 // CreateNetwork - creates a network in database
 func CreateNetwork(network models.Network) (models.Network, error) {
 func CreateNetwork(network models.Network) (models.Network, error) {
 
 
+	if network.AddressRange != "" {
+		normalizedRange, err := NormalizeCIDR(network.AddressRange)
+		if err != nil {
+			return models.Network{}, err
+		}
+		network.AddressRange = normalizedRange
+	}
+	if network.AddressRange6 != "" {
+		normalizedRange, err := NormalizeCIDR(network.AddressRange6)
+		if err != nil {
+			return models.Network{}, err
+		}
+		network.AddressRange6 = normalizedRange
+	}
 	network.SetDefaults()
 	network.SetDefaults()
 	network.SetNodesLastModified()
 	network.SetNodesLastModified()
 	network.SetNetworkLastModified()
 	network.SetNetworkLastModified()

+ 17 - 0
logic/util.go

@@ -13,6 +13,7 @@ import (
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
+	"github.com/c-robinson/iplib"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
@@ -169,3 +170,19 @@ func ShouldPublishPeerPorts(serverNode *models.Node) bool {
 	}
 	}
 	return false
 	return false
 }
 }
+
+// NormalCidr - returns the first address of CIDR
+func NormalizeCIDR(address string) (string, error) {
+	ip, IPNet, err := net.ParseCIDR(address)
+	if err != nil {
+		return "", err
+	}
+	if ip.To4() == nil {
+		net6 := iplib.Net6FromStr(IPNet.String())
+		IPNet.IP = net6.FirstAddress()
+	} else {
+		net4 := iplib.Net4FromStr(IPNet.String())
+		IPNet.IP = net4.FirstAddress()
+	}
+	return IPNet.String(), nil
+}