From 99d8955ab3b5e24552d1f2b621744d07013f58ac Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Tue, 9 Mar 2021 19:00:45 +0100 Subject: Refactor & add case normalization logic to putAttributes --- write.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'write.go') diff --git a/write.go b/write.go index e4c7de1..482f971 100644 --- a/write.go +++ b/write.go @@ -19,7 +19,31 @@ func (server *Server) putAttributes(dn string, attrs Entry) error { return err } - for k, valuesNC := range attrs { + // Normalize attribute names: if we have several times the same attr + // but with different cases, put that in the same attr + normalized := make(Entry) + for k, values := range attrs { + found := false + for k2 := range normalized { + if strings.EqualFold(k, k2) { + normalized[k2] = append(normalized[k2], values...) + found = true + break + } + } + if !found { + normalized[k] = values + } + } + + // Retreieve previously existing attributes, which we will use to delete + // entries with the wrong case + previous_pairs, _, err := server.kv.List(prefix + "/attribute=", &server.readOpts) + if err != nil { + return err + } + + for k, valuesNC := range normalized { path := prefix + "/attribute=" + k // Trim spaces and remove empty values @@ -31,6 +55,16 @@ func (server *Server) putAttributes(dn string, attrs Entry) error { } } + // If previously existing pairs with the wrong case exist, delete them + for _, prev_pair := range previous_pairs { + if strings.EqualFold(prev_pair.Key, path) && prev_pair.Key != path { + _, err := server.kv.Delete(prev_pair.Key, nil) + if err != nil { + return err + } + } + } + // If we have zero values, delete associated k/v pair // Otherwise, write new values if len(values) == 0 { -- cgit v1.2.3