File tree Expand file tree Collapse file tree 3 files changed +111
-0
lines changed Expand file tree Collapse file tree 3 files changed +111
-0
lines changed Original file line number Diff line number Diff line change @@ -167,6 +167,7 @@ func adminConfigYaml() ([]byte, error) {
167167 }
168168
169169 yamlUtils .DefaultConfigMask ().Yaml (document )
170+ yamlUtils .TraverseNode (document )
170171
171172 doc , err := yaml .Marshal (document )
172173 if err != nil {
Original file line number Diff line number Diff line change 1+ // Package yaml contains utilities to work with YAML nodes
2+ package yaml
3+
4+ import (
5+ "strings"
6+
7+ "gopkg.in/yaml.v3"
8+ )
9+
10+ var secretKeyList = []string {"secret" , "key" , "token" , "password" }
11+
12+ // TraverseNode traverses node and mask sensitive keys.
13+ func TraverseNode (node * yaml.Node ) {
14+ switch node .Kind {
15+ case yaml .DocumentNode :
16+ if len (node .Content ) < 1 {
17+ return
18+ }
19+
20+ TraverseNode (node .Content [0 ])
21+
22+ case yaml .MappingNode :
23+ for i := 0 ; i < len (node .Content ); i += 2 {
24+ if node .Content [i + 1 ].Kind == yaml .ScalarNode {
25+ if containsSecret (strings .ToLower (node .Content [i ].Value )) {
26+ node .Content [i + 1 ].Value = maskValue
27+ node .Content [i + 1 ].Tag = "!!str"
28+ }
29+
30+ continue
31+ }
32+
33+ TraverseNode (node .Content [i + 1 ])
34+ }
35+ }
36+ }
37+
38+ func containsSecret (key string ) bool {
39+ for _ , secret := range secretKeyList {
40+ if strings .Contains (key , secret ) {
41+ return true
42+ }
43+ }
44+
45+ return false
46+ }
Original file line number Diff line number Diff line change 1+ package yaml
2+
3+ import (
4+ "testing"
5+
6+ "github.com/stretchr/testify/require"
7+ "gopkg.in/yaml.v3"
8+ )
9+
10+ const customYamlStr = `
11+ global:
12+ debug: false
13+ retrieval:
14+ spec:
15+ logicalDump:
16+ options:
17+ source:
18+ type: local # local, remote, rds, etc..
19+ connection:
20+ dbname: test_22
21+ host: 172.17.0.78
22+ port: 5455
23+ username: tony
24+ password: mypass
25+ databases: test1
26+ envs:
27+ AWS_SECRET_ACCESS_KEY: john
28+ PGBACKREST_REPO1_S3_KEY_SECRET: mysecretkey
29+ TEST_ENV: one
30+ `
31+
32+ func TestTraverseNode (t * testing.T ) {
33+ r := require .New (t )
34+ node := & yaml.Node {}
35+
36+ err := yaml .Unmarshal ([]byte (customYamlStr ), node )
37+ r .NoError (err )
38+ TraverseNode (node )
39+
40+ sensitive , found := FindNodeAtPathString (node , "retrieval.spec.logicalDump.options.envs.AWS_SECRET_ACCESS_KEY" )
41+ r .NotNil (sensitive )
42+ r .True (found )
43+ r .Equal (maskValue , sensitive .Value )
44+
45+ sensitive2 , found := FindNodeAtPathString (node , "retrieval.spec.logicalDump.options.envs.PGBACKREST_REPO1_S3_KEY_SECRET" )
46+ r .NotNil (sensitive2 )
47+ r .True (found )
48+ r .Equal (maskValue , sensitive2 .Value )
49+
50+ nonSensitive , found := FindNodeAtPathString (node , "retrieval.spec.logicalDump.options.envs.TEST_ENV" )
51+ r .NotNil (nonSensitive )
52+ r .True (found )
53+ r .Equal ("one" , nonSensitive .Value )
54+
55+ password , found := FindNodeAtPathString (node , "retrieval.spec.logicalDump.options.source.connection.password" )
56+ r .NotNil (password )
57+ r .True (found )
58+ r .Equal (maskValue , password .Value )
59+
60+ host , found := FindNodeAtPathString (node , "retrieval.spec.logicalDump.options.source.connection.host" )
61+ r .NotNil (host )
62+ r .True (found )
63+ r .Equal ("172.17.0.78" , host .Value )
64+ }
You can’t perform that action at this time.
0 commit comments