Explorar o código

Merge branch 'develop' of https://github.com/gravitl/netmaker into NM-103

abhishek9686 hai 3 días
pai
achega
2dc344115b
Modificáronse 9 ficheiros con 70 adicións e 10 borrados
  1. 8 0
      controllers/dns.go
  2. 1 1
      controllers/ext_client.go
  3. 1 1
      controllers/network.go
  4. 4 1
      controllers/node.go
  5. 10 2
      logic/auth.go
  6. 12 0
      logic/dns.go
  7. 4 4
      logic/extpeers.go
  8. 1 1
      logic/gateway.go
  9. 29 0
      migrate/migrate.go

+ 8 - 0
controllers/dns.go

@@ -87,6 +87,9 @@ func createNs(w http.ResponseWriter, r *http.Request) {
 	if req.Tags == nil {
 	if req.Tags == nil {
 		req.Tags = make(datatypes.JSONMap)
 		req.Tags = make(datatypes.JSONMap)
 	}
 	}
+	if req.Nodes == nil {
+		req.Nodes = make(datatypes.JSONMap)
+	}
 	if gNs, ok := logic.GlobalNsList[req.Name]; ok {
 	if gNs, ok := logic.GlobalNsList[req.Name]; ok {
 		req.Servers = gNs.IPs
 		req.Servers = gNs.IPs
 	}
 	}
@@ -107,6 +110,7 @@ func createNs(w http.ResponseWriter, r *http.Request) {
 		MatchDomains: req.MatchDomains,
 		MatchDomains: req.MatchDomains,
 		Servers:      req.Servers,
 		Servers:      req.Servers,
 		Tags:         req.Tags,
 		Tags:         req.Tags,
+		Nodes:        req.Nodes,
 		Status:       true,
 		Status:       true,
 		CreatedBy:    r.Header.Get("user"),
 		CreatedBy:    r.Header.Get("user"),
 		CreatedAt:    time.Now().UTC(),
 		CreatedAt:    time.Now().UTC(),
@@ -198,6 +202,9 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
 	if updateNs.Tags == nil {
 	if updateNs.Tags == nil {
 		updateNs.Tags = make(datatypes.JSONMap)
 		updateNs.Tags = make(datatypes.JSONMap)
 	}
 	}
+	if updateNs.Nodes == nil {
+		updateNs.Nodes = make(datatypes.JSONMap)
+	}
 
 
 	ns := schema.Nameserver{ID: updateNs.ID}
 	ns := schema.Nameserver{ID: updateNs.ID}
 	err = ns.Get(db.WithContext(r.Context()))
 	err = ns.Get(db.WithContext(r.Context()))
@@ -239,6 +246,7 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
 	ns.MatchAll = updateNs.MatchAll
 	ns.MatchAll = updateNs.MatchAll
 	ns.Description = updateNs.Description
 	ns.Description = updateNs.Description
 	ns.Name = updateNs.Name
 	ns.Name = updateNs.Name
+	ns.Nodes = updateNs.Nodes
 	ns.Status = updateNs.Status
 	ns.Status = updateNs.Status
 	ns.UpdatedAt = time.Now().UTC()
 	ns.UpdatedAt = time.Now().UTC()
 
 

+ 1 - 1
controllers/ext_client.go

@@ -908,7 +908,7 @@ func updateExtClient(w http.ResponseWriter, r *http.Request) {
 		update.Location = logic.GetHostLocInfo(logic.GetClientIP(r), os.Getenv("IP_INFO_TOKEN"))
 		update.Location = logic.GetHostLocInfo(logic.GetClientIP(r), os.Getenv("IP_INFO_TOKEN"))
 	}
 	}
 	newclient := logic.UpdateExtClient(&oldExtClient, &update)
 	newclient := logic.UpdateExtClient(&oldExtClient, &update)
-	if err := logic.DeleteExtClient(oldExtClient.Network, oldExtClient.ClientID); err != nil {
+	if err := logic.DeleteExtClient(oldExtClient.Network, oldExtClient.ClientID, true); err != nil {
 		slog.Error(
 		slog.Error(
 			"failed to delete ext client",
 			"failed to delete ext client",
 			"user",
 			"user",

+ 1 - 1
controllers/network.go

@@ -330,7 +330,7 @@ func updateNetworkACLv2(w http.ResponseWriter, r *http.Request) {
 	if servercfg.IsPro {
 	if servercfg.IsPro {
 		for _, client := range networkClientsMap {
 		for _, client := range networkClientsMap {
 			client := client
 			client := client
-			err := logic.DeleteExtClient(client.Network, client.ClientID)
+			err := logic.DeleteExtClient(client.Network, client.ClientID, true)
 			if err != nil {
 			if err != nil {
 				slog.Error(
 				slog.Error(
 					"failed to delete client during update",
 					"failed to delete client during update",

+ 4 - 1
controllers/node.go

@@ -683,8 +683,11 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 		logic.SetInternetGw(newNode, newNode.InetNodeReq)
 		logic.SetInternetGw(newNode, newNode.InetNodeReq)
 	}
 	}
 	if currentNode.IsInternetGateway && newNode.IsInternetGateway {
 	if currentNode.IsInternetGateway && newNode.IsInternetGateway {
+		// logic.UnsetInternetGw resets newNode.InetNodeReq.
+		// So, keeping a copy to pass into logic.SetInternetGw.
+		req := newNode.InetNodeReq
 		logic.UnsetInternetGw(newNode)
 		logic.UnsetInternetGw(newNode)
-		logic.SetInternetGw(newNode, newNode.InetNodeReq)
+		logic.SetInternetGw(newNode, req)
 	}
 	}
 	if !newNode.IsInternetGateway {
 	if !newNode.IsInternetGateway {
 		logic.UnsetInternetGw(newNode)
 		logic.UnsetInternetGw(newNode)

+ 10 - 2
logic/auth.go

@@ -309,9 +309,17 @@ func UpdateUser(userchange, user *models.User) (*models.User, error) {
 
 
 		user.Password = userchange.Password
 		user.Password = userchange.Password
 	}
 	}
-	if err := IsGroupsValid(userchange.UserGroups); err != nil {
-		return userchange, errors.New("invalid groups: " + err.Error())
+
+	validUserGroups := make(map[models.UserGroupID]struct{})
+	for userGroupID := range userchange.UserGroups {
+		_, err := GetUserGroup(userGroupID)
+		if err == nil {
+			validUserGroups[userGroupID] = struct{}{}
+		}
 	}
 	}
+
+	userchange.UserGroups = validUserGroups
+
 	if err := IsNetworkRolesValid(userchange.NetworkRoles); err != nil {
 	if err := IsNetworkRolesValid(userchange.NetworkRoles); err != nil {
 		return userchange, errors.New("invalid network roles: " + err.Error())
 		return userchange, errors.New("invalid network roles: " + err.Error())
 	}
 	}

+ 12 - 0
logic/dns.go

@@ -418,6 +418,18 @@ func validateNameserverReq(ns schema.Nameserver) error {
 			}
 			}
 		}
 		}
 	}
 	}
+	// check if valid broadcast peers are added
+	if len(ns.Nodes) > 0 {
+		for nodeID := range ns.Nodes {
+			node, err := GetNodeByID(nodeID)
+			if err != nil {
+				return errors.New("invalid node")
+			}
+			if node.Network != ns.NetworkID {
+				return errors.New("invalid network node")
+			}
+		}
+	}
 
 
 	return nil
 	return nil
 }
 }

+ 4 - 4
logic/extpeers.go

@@ -123,7 +123,7 @@ func UniqueIPNetStrList(ipnets []string) []string {
 }
 }
 
 
 // DeleteExtClient - deletes an existing ext client
 // DeleteExtClient - deletes an existing ext client
-func DeleteExtClient(network string, clientid string) error {
+func DeleteExtClient(network string, clientid string, isUpdate bool) error {
 	key, err := GetRecordKey(clientid, network)
 	key, err := GetRecordKey(clientid, network)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -146,7 +146,7 @@ func DeleteExtClient(network string, clientid string) error {
 		}
 		}
 		deleteExtClientFromCache(key)
 		deleteExtClientFromCache(key)
 	}
 	}
-	if extClient.RemoteAccessClientID != "" {
+	if !isUpdate && extClient.RemoteAccessClientID != "" {
 		LogEvent(&models.Event{
 		LogEvent(&models.Event{
 			Action: models.Disconnect,
 			Action: models.Disconnect,
 			Source: models.Subject{
 			Source: models.Subject{
@@ -173,7 +173,7 @@ func DeleteExtClient(network string, clientid string) error {
 func DeleteExtClientAndCleanup(extClient models.ExtClient) error {
 func DeleteExtClientAndCleanup(extClient models.ExtClient) error {
 
 
 	//delete extClient record
 	//delete extClient record
-	err := DeleteExtClient(extClient.Network, extClient.ClientID)
+	err := DeleteExtClient(extClient.Network, extClient.ClientID, false)
 	if err != nil {
 	if err != nil {
 		slog.Error("DeleteExtClientAndCleanup-remove extClient record: ", "Error", err.Error())
 		slog.Error("DeleteExtClientAndCleanup-remove extClient record: ", "Error", err.Error())
 		return err
 		return err
@@ -511,7 +511,7 @@ func ToggleExtClientConnectivity(client *models.ExtClient, enable bool) (models.
 
 
 	// update in DB
 	// update in DB
 	newClient := UpdateExtClient(client, &update)
 	newClient := UpdateExtClient(client, &update)
-	if err := DeleteExtClient(client.Network, client.ClientID); err != nil {
+	if err := DeleteExtClient(client.Network, client.ClientID, true); err != nil {
 		slog.Error("failed to delete ext client during update", "id", client.ClientID, "network", client.Network, "error", err)
 		slog.Error("failed to delete ext client during update", "id", client.ClientID, "network", client.Network, "error", err)
 		return newClient, err
 		return newClient, err
 	}
 	}

+ 1 - 1
logic/gateway.go

@@ -298,7 +298,7 @@ func DeleteGatewayExtClients(gatewayID string, networkName string) error {
 	}
 	}
 	for _, extClient := range currentExtClients {
 	for _, extClient := range currentExtClients {
 		if extClient.IngressGatewayID == gatewayID {
 		if extClient.IngressGatewayID == gatewayID {
-			if err = DeleteExtClient(networkName, extClient.ClientID); err != nil {
+			if err = DeleteExtClient(networkName, extClient.ClientID, false); err != nil {
 				logger.Log(1, "failed to remove ext client", extClient.ClientID)
 				logger.Log(1, "failed to remove ext client", extClient.ClientID)
 				continue
 				continue
 			}
 			}

+ 29 - 0
migrate/migrate.go

@@ -41,6 +41,7 @@ func Run() {
 	updateNetworks()
 	updateNetworks()
 	migrateNameservers()
 	migrateNameservers()
 	resync()
 	resync()
+	deleteOldExtclients()
 }
 }
 
 
 func updateNetworks() {
 func updateNetworks() {
@@ -807,3 +808,31 @@ func migrateSettings() {
 	}
 	}
 	logic.UpsertServerSettings(settings)
 	logic.UpsertServerSettings(settings)
 }
 }
+
+func deleteOldExtclients() {
+	extclients, _ := logic.GetAllExtClients()
+	userExtclientMap := make(map[string][]models.ExtClient)
+	for _, extclient := range extclients {
+		if extclient.RemoteAccessClientID == "" {
+			continue
+		}
+
+		if extclient.Enabled {
+			continue
+		}
+
+		if _, ok := userExtclientMap[extclient.OwnerID]; !ok {
+			userExtclientMap[extclient.OwnerID] = make([]models.ExtClient, 0)
+		}
+
+		userExtclientMap[extclient.OwnerID] = append(userExtclientMap[extclient.OwnerID], extclient)
+	}
+
+	for _, userExtclients := range userExtclientMap {
+		if len(userExtclients) > 1 {
+			for _, extclient := range userExtclients[1:] {
+				_ = logic.DeleteExtClient(extclient.Network, extclient.Network, false)
+			}
+		}
+	}
+}