Skip to content

Commit 51dd1f4

Browse files
committed
Obfuscate sensitive data in complexType struct
1 parent c440378 commit 51dd1f4

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

internal/test/main.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ type complexType struct {
1414
} `json:"data"`
1515
Metadata map[string]struct {
1616
ID int `json:"id,omitempty"`
17-
Value string `json:"value,omitempty"`
17+
Value string `json:"value,omitempty" structviewer:"obfuscate"`
1818
} `json:"metadata,omitempty"`
1919
Random map[int]string `json:"random,omitempty"`
20+
Test string `json:"test" structviewer:"obfuscate"`
2021
}
2122

2223
var complexStruct = complexType{
@@ -29,14 +30,15 @@ var complexStruct = complexType{
2930
},
3031
Metadata: map[string]struct {
3132
ID int `json:"id,omitempty"`
32-
Value string `json:"value,omitempty"`
33+
Value string `json:"value,omitempty" structviewer:"obfuscate"`
3334
}{
3435
"key_99": {ID: 99, Value: "key99"},
3536
},
3637
Random: map[int]string{
3738
1: "one",
3839
2: "two",
3940
},
41+
Test: "test",
4042
}
4143

4244
func main() {

parser.go

+50-2
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,6 @@ func parseEnvs(config interface{}, prefix, configField string) []*EnvVar {
294294

295295
return envs
296296
}
297-
298297
func obfuscateTags(config interface{}) (interface{}, error) {
299298
val := reflect.ValueOf(config)
300299
if val.Kind() == reflect.Ptr {
@@ -328,10 +327,59 @@ func obfuscateTags(config interface{}) (interface{}, error) {
328327

329328
fieldValue.Set(reflect.ValueOf(newStruct).Elem())
330329
}
331-
} else {
330+
} else if fieldValue.Kind() == reflect.Map {
332331
if strings.EqualFold(svTag, "obfuscate") {
333332
zeroValue := reflect.Zero(fieldValue.Type())
334333
fieldValue.Set(zeroValue)
334+
} else {
335+
newMap := reflect.MakeMap(fieldValue.Type())
336+
keys := fieldValue.MapKeys()
337+
338+
for _, key := range keys {
339+
mapValue := fieldValue.MapIndex(key)
340+
if !mapValue.IsValid() {
341+
continue
342+
}
343+
344+
var newValue reflect.Value
345+
346+
switch mapValue.Kind() {
347+
case reflect.Ptr, reflect.Interface:
348+
elemValue := mapValue.Elem()
349+
if elemValue.Kind() == reflect.Struct {
350+
newStruct, err := obfuscateTags(elemValue.Addr().Interface())
351+
if err != nil {
352+
return nil, err
353+
}
354+
newValue = reflect.ValueOf(newStruct).Elem()
355+
} else {
356+
newValue = mapValue
357+
}
358+
case reflect.Struct:
359+
ptrToStruct := reflect.New(mapValue.Type())
360+
ptrToStruct.Elem().Set(mapValue)
361+
newStruct, err := obfuscateTags(ptrToStruct.Interface())
362+
if err != nil {
363+
return nil, err
364+
}
365+
newValue = reflect.ValueOf(newStruct).Elem()
366+
default:
367+
newValue = mapValue
368+
}
369+
370+
newMap.SetMapIndex(key, newValue)
371+
}
372+
373+
fieldValue.Set(newMap)
374+
}
375+
} else {
376+
if strings.EqualFold(svTag, "obfuscate") {
377+
if fieldValue.Kind() == reflect.String {
378+
fieldValue.SetString("*REDACTED*")
379+
} else {
380+
zeroValue := reflect.Zero(fieldValue.Type())
381+
fieldValue.Set(zeroValue)
382+
}
335383
}
336384
}
337385
}

parser_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ func TestObfuscateTags(t *testing.T) {
360360
Exported string `json:"exported" structviewer:"obfuscate"`
361361
Test int `json:"test"`
362362
}{
363-
Exported: "",
363+
Exported: "*REDACTED*",
364364
Test: 10,
365365
},
366366
wantErr: false,
@@ -395,7 +395,7 @@ func TestObfuscateTags(t *testing.T) {
395395
InnerField string `json:"inner_field" structviewer:"obfuscate"`
396396
NotObf string `json:"not_obf"`
397397
}{
398-
InnerField: "",
398+
InnerField: "*REDACTED*",
399399
NotObf: "not obfuscated",
400400
},
401401
},
@@ -427,12 +427,12 @@ func TestObfuscateTags(t *testing.T) {
427427
NotObf string `json:"not_obf"`
428428
} `json:"inner"`
429429
}{
430-
Exported: "",
430+
Exported: "*REDACTED*",
431431
Inner: struct {
432432
InnerField string `json:"inner_field" structviewer:"obfuscate"`
433433
NotObf string `json:"not_obf"`
434434
}{
435-
InnerField: "",
435+
InnerField: "*REDACTED*",
436436
NotObf: "not obfuscated",
437437
},
438438
},

0 commit comments

Comments
 (0)