49 lines
798 B
Go
49 lines
798 B
Go
package audit
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
)
|
|
|
|
func SanitizeResponse(raw []byte, maskedCard string) []byte {
|
|
if len(raw) == 0 {
|
|
return nil
|
|
}
|
|
|
|
var value any
|
|
if err := json.Unmarshal(raw, &value); err != nil {
|
|
return nil
|
|
}
|
|
|
|
if maskedCard == "" {
|
|
maskedCard = "[redacted]"
|
|
}
|
|
|
|
redactCardFields(value, maskedCard)
|
|
|
|
sanitized, err := json.Marshal(value)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
return sanitized
|
|
}
|
|
|
|
func redactCardFields(value any, maskedCard string) {
|
|
switch current := value.(type) {
|
|
case map[string]any:
|
|
for key, child := range current {
|
|
if strings.EqualFold(key, "card") {
|
|
current[key] = maskedCard
|
|
continue
|
|
}
|
|
|
|
redactCardFields(child, maskedCard)
|
|
}
|
|
case []any:
|
|
for _, child := range current {
|
|
redactCardFields(child, maskedCard)
|
|
}
|
|
}
|
|
}
|