Skip to content

Commit

Permalink
fix(cli): Ensure scrubber checks all fields recursively for sensitive…
Browse files Browse the repository at this point in the history
… tags (#3589)

* Fix ScrubSensitiveData to scrub recursively
* Extend test with additional cases
  • Loading branch information
redgoat650 committed Jan 26, 2024
1 parent 1329e10 commit 1d6f852
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 4 deletions.
17 changes: 17 additions & 0 deletions internal/scrubber/scrub_sensitive.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,23 @@ func ScrubSensitiveData(v reflect.Value) reflect.Value {
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)
}
}
Expand Down
32 changes: 28 additions & 4 deletions internal/scrubber/scrub_sensitive_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ import (
type S struct {
SomePassword1 string `kopia:"sensitive"`
NonPassword string
Inner *Q
InnerPtr *Q
InnerIf interface{}
InnerStruct Q
NilPtr *Q
NilIf interface{}
}

type Q struct {
Expand All @@ -24,19 +28,39 @@ func TestScrubber(t *testing.T) {
input := &S{
SomePassword1: "foo",
NonPassword: "bar",
Inner: &Q{
InnerPtr: &Q{
SomePassword1: "foo",
NonPassword: "bar",
},
InnerStruct: Q{
SomePassword1: "foo",
NonPassword: "bar",
},
InnerIf: Q{
SomePassword1: "foo",
NonPassword: "bar",
},
NilPtr: nil,
NilIf: nil,
}

want := &S{
SomePassword1: "***",
NonPassword: "bar",
Inner: &Q{
SomePassword1: "foo",
InnerPtr: &Q{
SomePassword1: "***",
NonPassword: "bar",
},
InnerStruct: Q{
SomePassword1: "***",
NonPassword: "bar",
},
InnerIf: Q{
SomePassword1: "***",
NonPassword: "bar",
},
NilPtr: nil,
NilIf: nil,
}

output := scrubber.ScrubSensitiveData(reflect.ValueOf(input)).Interface()
Expand Down

0 comments on commit 1d6f852

Please sign in to comment.