From 5c48ffc1659a382c1cfa7a913fccc3d61763c88d Mon Sep 17 00:00:00 2001 From: jano3 <jano@bob.co.za> Date: Fri, 5 Jul 2024 13:29:36 +0200 Subject: [PATCH] Fix group formatted audit events not showing all the items --- audit/audit.go | 102 ++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/audit/audit.go b/audit/audit.go index 4cad86f..0b0b353 100644 --- a/audit/audit.go +++ b/audit/audit.go @@ -248,45 +248,11 @@ func CheckToFormatForAuditEvent(changes map[string]any, original any, new any, f doGroupSlice := doGroupSliceForAuditEvent(originalStructField) - originalFormattedObject := checkToFormatForAuditEvent(originalFieldValue, index) - newFormattedObject := checkToFormatForAuditEvent(newFieldValue, index) - if originalFormattedObject != nil || - newFormattedObject != nil { - if _, present := changes[objectKey]; present { - if doGroupSlice { - // The object has already been added to the changes - group the new change with the previous - existingChanges, ok := changes[objectKey].(FieldChange) - if !ok { - return true - } - - if originalFormattedObject != nil { - existingChanges.From = appendNewChangeToExistingChanges(existingChanges.From, *originalFormattedObject) - } - - if newFormattedObject != nil { - existingChanges.To = appendNewChangeToExistingChanges(existingChanges.To, *newFormattedObject) - } - changes[objectKey] = existingChanges - } - - return true - } - - if doGroupSlice { - fieldChange := FieldChange{} - if originalFormattedObject != nil { - fieldChange.From = []string{*originalFormattedObject} - } else { - fieldChange.From = []string{} - } - if newFormattedObject != nil { - fieldChange.To = []string{*newFormattedObject} - } else { - fieldChange.To = []string{} - } - changes[objectKey] = fieldChange - } else { + if !doGroupSlice { + originalFormattedObject := checkToFormatForAuditEvent(originalFieldValue, index) + newFormattedObject := checkToFormatForAuditEvent(newFieldValue, index) + if originalFormattedObject != nil || + newFormattedObject != nil { if index > -1 { objectKey = fmt.Sprintf("%s[%d]", field, index) } @@ -295,9 +261,31 @@ func CheckToFormatForAuditEvent(changes map[string]any, original any, new any, f From: originalFormattedObject, To: newFormattedObject, } + + return true } + } else { + originalFormattedObject := checkToFormatForGroupedAuditEvent(originalFieldValue) + newFormattedObject := checkToFormatForGroupedAuditEvent(newFieldValue) + if originalFormattedObject != nil || + newFormattedObject != nil { + if _, present := changes[objectKey]; !present { + fieldChange := FieldChange{} + if originalFormattedObject != nil { + fieldChange.From = originalFormattedObject + } else { + fieldChange.From = []*string{} + } + if newFormattedObject != nil { + fieldChange.To = newFormattedObject + } else { + fieldChange.To = []*string{} + } + changes[objectKey] = fieldChange + } - return true + return true + } } return false @@ -359,6 +347,40 @@ func checkToExecuteAuditFormatter(fieldValue reflect.Value) *string { return nil } +func checkToFormatForGroupedAuditEvent(fieldValue reflect.Value) []*string { + if fieldValue.Kind() == reflect.Ptr { + if fieldValue.IsNil() { + return nil + } + fieldValue = fieldValue.Elem() + } + + var formattedField []*string + if fieldValue.Kind() == reflect.Struct { + formattedField = []*string{checkToExecuteAuditFormatter(fieldValue)} + } else if fieldValue.Kind() == reflect.Slice { + for i := 0; i < fieldValue.Len(); i++ { + sliceFieldValue := fieldValue.Index(i) + if sliceFieldValue.Kind() == reflect.Ptr { + if sliceFieldValue.IsNil() { + continue + } + sliceFieldValue = sliceFieldValue.Elem() + } + + if sliceFieldValue.Kind() != reflect.Struct { + // Not a slice of structs - ignore the format flag + return nil + } + + formattedField = append(formattedField, checkToExecuteAuditFormatter(sliceFieldValue)) + } + + } + + return formattedField +} + func checkToFormatForAuditEvent(fieldValue reflect.Value, index int) *string { if fieldValue.Kind() == reflect.Ptr { if fieldValue.IsNil() { -- GitLab