Files
kopia/internal/scrubber/scrub_sensitive.go
Jarek Kowalski 09415e0c7d chore(ci): upgraded to go 1.22 (#3746)
Upgrades go to 1.22 and switches to new-style for loops

---------

Co-authored-by: Julio López <1953782+julio-lopez@users.noreply.github.com>
2024-04-08 09:52:47 -07:00

56 lines
1.2 KiB
Go

// Package scrubber contains helpers that remove sensitive information from Go structs before it's presented to users.
package scrubber
import (
"reflect"
"strings"
)
// ScrubSensitiveData returns a copy of a given value with sensitive fields scrubbed.
// Fields are marked as sensitive with truct field tag `kopia:"sensitive"`.
func ScrubSensitiveData(v reflect.Value) reflect.Value {
switch v.Kind() {
case reflect.Ptr:
return ScrubSensitiveData(v.Elem()).Addr()
case reflect.Struct:
res := reflect.New(v.Type()).Elem()
for i := range v.NumField() {
fv := v.Field(i)
sf := v.Type().Field(i)
if sf.Tag.Get("kopia") == "sensitive" {
if sf.Type.Kind() == reflect.String {
res.Field(i).SetString(strings.Repeat("*", fv.Len()))
}
} else if sf.IsExported() {
switch fv.Kind() {
case reflect.Pointer:
if !fv.IsNil() {
fv = ScrubSensitiveData(fv.Elem()).Addr()
}
case reflect.Struct:
fv = ScrubSensitiveData(fv)
case reflect.Interface:
if !fv.IsNil() {
fv = ScrubSensitiveData(fv.Elem())
}
default: // Set the field as-is.
}
res.Field(i).Set(fv)
}
}
return res
default:
panic("Unsupported type: " + v.String())
}
}