Browse Source

Merge pull request #3637 from gravitl/NM-100

v1.1.0 Release Fixes
Vishal Dalwadi 4 days ago
parent
commit
0eb7792c71
7 changed files with 50 additions and 10 deletions
  1. 1 1
      controllers/ext_client.go
  2. 1 1
      controllers/network.go
  3. 4 1
      controllers/node.go
  4. 10 2
      logic/auth.go
  5. 4 4
      logic/extpeers.go
  6. 1 1
      logic/gateway.go
  7. 29 0
      migrate/migrate.go

+ 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())
 	}
 	}

+ 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() {
@@ -797,3 +798,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)
+			}
+		}
+	}
+}