From 2fcdd865c8af6f46ca4333730fba9c65324d29c6 Mon Sep 17 00:00:00 2001 From: Aceix Date: Mon, 24 Feb 2025 05:22:18 +0000 Subject: [PATCH] fix: unlnk deleted networks and tags from enrollment keys (#3328) --- controllers/network.go | 1 + logic/enrollmentkey.go | 58 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/controllers/network.go b/controllers/network.go index ea8c3cfd..c4d6c4d7 100644 --- a/controllers/network.go +++ b/controllers/network.go @@ -464,6 +464,7 @@ func deleteNetwork(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, errtype)) return } + go logic.UnlinkNetworkAndTagsFromEnrollmentKeys(network, true) go logic.DeleteNetworkRoles(network) go logic.DeleteDefaultNetworkPolicies(models.NetworkID(network)) //delete network from allocated ip map diff --git a/logic/enrollmentkey.go b/logic/enrollmentkey.go index 25cf0d6d..42eaf755 100644 --- a/logic/enrollmentkey.go +++ b/logic/enrollmentkey.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "strings" "sync" "time" @@ -120,7 +121,6 @@ func UpdateEnrollmentKey(keyId string, relayId uuid.UUID, groups []models.TagID) } // GetAllEnrollmentKeys - fetches all enrollment keys from DB -// TODO drop double pointer func GetAllEnrollmentKeys() ([]models.EnrollmentKey, error) { currentKeys, err := getEnrollmentKeysMap() if err != nil { @@ -335,3 +335,59 @@ func RemoveTagFromEnrollmentKeys(deletedTagID models.TagID) { } } + +func UnlinkNetworkAndTagsFromEnrollmentKeys(network string, delete bool) error { + keys, err := GetAllEnrollmentKeys() + if err != nil { + return fmt.Errorf("failed to retrieve keys: %w", err) + } + + var errs []error + for _, key := range keys { + newNetworks := []string{} + newTags := []models.TagID{} + update := false + + // Check and update networks + for _, net := range key.Networks { + if net == network { + update = true + continue + } + newNetworks = append(newNetworks, net) + } + + // Check and update tags + for _, tag := range key.Groups { + tagParts := strings.Split(tag.String(), ".") + if len(tagParts) == 0 { + continue + } + tagNetwork := tagParts[0] + if tagNetwork == network { + update = true + continue + } + newTags = append(newTags, tag) + } + + if update && len(newNetworks) == 0 && delete { + if err := DeleteEnrollmentKey(key.Value, true); err != nil { + errs = append(errs, fmt.Errorf("failed to delete key %s: %w", key.Value, err)) + } + continue + } + if update { + key.Networks = newNetworks + key.Groups = newTags + if err := upsertEnrollmentKey(&key); err != nil { + errs = append(errs, fmt.Errorf("failed to update key %s: %w", key.Value, err)) + } + } + } + + if len(errs) > 0 { + return fmt.Errorf("errors unlinking network/tags from keys: %v", errs) + } + return nil +}