@@ -3,6 +3,7 @@ package snowflake
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "math/rand"
6
7
"testing"
7
8
8
9
"github.com/brianvoe/gofakeit/v7"
@@ -11,9 +12,67 @@ import (
11
12
"github.com/trufflesecurity/trufflehog/v3/pkg/engine/ahocorasick"
12
13
)
13
14
15
+ // GoFakeIt Password generator does not guarantee inclusion of characters.
16
+ // Using a custom Password gennerator with guaranteed inclusions (atleast) of lower, upper and numeric characters
17
+ func generatePassword (lower , upper , numeric bool , length int ) string {
18
+ if length < 1 {
19
+ return ""
20
+ }
21
+
22
+ var password []rune
23
+ var required []rune
24
+ var allowed []rune
25
+
26
+ lowerChars := []rune ("abcdefghijklmnopqrstuvwxyz" )
27
+ upperChars := []rune ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" )
28
+ numberChars := []rune ("0123456789" )
29
+
30
+ // Ensure inclusion from each requested category
31
+ if lower {
32
+ ch := lowerChars [rand .Intn (len (lowerChars ))]
33
+ required = append (required , ch )
34
+ allowed = append (allowed , lowerChars ... )
35
+ }
36
+ if upper {
37
+ ch := upperChars [rand .Intn (len (upperChars ))]
38
+ required = append (required , ch )
39
+ allowed = append (allowed , upperChars ... )
40
+ }
41
+ if numeric {
42
+ ch := numberChars [rand .Intn (len (numberChars ))]
43
+ required = append (required , ch )
44
+ allowed = append (allowed , numberChars ... )
45
+ }
46
+
47
+ if len (allowed ) == 0 {
48
+ return "" // No character sets enabled
49
+ }
50
+
51
+ // Fill the rest of the password
52
+ for i := 0 ; i < length - len (required ); i ++ {
53
+ ch := allowed [rand .Intn (len (allowed ))]
54
+ password = append (password , ch )
55
+ }
56
+
57
+ // Combine required and random characters, then shuffle
58
+ password = append (password , required ... )
59
+ rand .Shuffle (len (password ), func (i , j int ) {
60
+ password [i ], password [j ] = password [j ], password [i ]
61
+ })
62
+
63
+ return string (password )
64
+ }
65
+
14
66
func TestSnowflake_Pattern (t * testing.T ) {
15
- username := gofakeit .Username ()
16
- password := gofakeit .Password (true , true , true , false , false , 10 )
67
+
68
+ validAccount := "tuacoip-zt74995"
69
+ validPrivateLinkAccount := "tuacoip-zt74995.privatelink"
70
+ validSingleCharacterAccount := "tuacoip-z"
71
+ validUsername := gofakeit .Username ()
72
+ invalidUsername := "[email protected] " // special characters not allowed
73
+
74
+ validPassword := generatePassword (true , true , true , 10 )
75
+ invalidPassword := "!12" // invalid length
17
76
18
77
d := Scanner {}
19
78
ahoCorasickCore := ahocorasick .NewAhoCorasickCore ([]detectors.Detector {d })
@@ -24,26 +83,30 @@ func TestSnowflake_Pattern(t *testing.T) {
24
83
}{
25
84
{
26
85
name : "Snowflake Credentials" ,
27
- input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , "tuacoip-zt74995" , username , password ),
86
+ input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , validAccount , validUsername , validPassword ),
28
87
want : [][]string {
29
- [] string { "tuacoip-zt74995" , username , password },
88
+ { validAccount , validUsername , validPassword },
30
89
},
31
90
},
32
91
{
33
92
name : "Private Snowflake Credentials" ,
34
- input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , "tuacoip-zt74995.privatelink" , username , password ),
93
+ input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , validPrivateLinkAccount , validUsername , validPassword ),
35
94
want : [][]string {
36
- [] string { "tuacoip-zt74995.privatelink" , username , password },
95
+ { validPrivateLinkAccount , validUsername , validPassword },
37
96
},
38
97
},
39
-
40
98
{
41
99
name : "Snowflake Credentials - Single Character account" ,
42
- input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , "tuacoip-z" , username , password ),
100
+ input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , validSingleCharacterAccount , validUsername , validPassword ),
43
101
want : [][]string {
44
- [] string { "tuacoip-z" , username , password },
102
+ { validSingleCharacterAccount , validUsername , validPassword },
45
103
},
46
104
},
105
+ {
106
+ name : "Snowflake Credentials - Invalid Username & Password" ,
107
+ input : fmt .Sprintf ("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE" , validAccount , invalidUsername , invalidPassword ),
108
+ want : [][]string {},
109
+ },
47
110
}
48
111
49
112
for _ , test := range tests {
0 commit comments