Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/catalog/aws/catalog_test.go
2070 views
1
package aws
2
3
import (
4
"io"
5
"reflect"
6
"slices"
7
"strings"
8
"testing"
9
10
"github.com/pkg/errors"
11
)
12
13
func TestCatalog_GetTemplatePath(t *testing.T) {
14
type args struct {
15
target string
16
}
17
tests := []struct {
18
name string
19
args args
20
want []string
21
wantErr bool
22
}{
23
{
24
"get all ssl files",
25
args{
26
target: "ssl",
27
},
28
[]string{
29
"ssl/deprecated-tls.yaml",
30
"ssl/detect-ssl-issuer.yaml",
31
"ssl/expired-ssl.yaml",
32
"ssl/mismatched-ssl.yaml",
33
},
34
false,
35
},
36
{
37
"get all ssl files with wildcard",
38
args{
39
target: "ssl*",
40
},
41
[]string{
42
"ssl/deprecated-tls.yaml",
43
"ssl/detect-ssl-issuer.yaml",
44
"ssl/expired-ssl.yaml",
45
"ssl/mismatched-ssl.yaml",
46
},
47
false,
48
},
49
{
50
"non-matching target",
51
args{
52
target: "I-DONT-EXIST",
53
},
54
[]string{},
55
false,
56
},
57
}
58
for _, tt := range tests {
59
t.Run(tt.name, func(t *testing.T) {
60
c, _ := NewCatalog("bucket", withMockS3Service())
61
got, err := c.GetTemplatePath(tt.args.target)
62
if (err != nil) != tt.wantErr {
63
t.Errorf("GetTemplatePath() error = %v, wantErr %v", err, tt.wantErr)
64
return
65
}
66
if len(tt.want) > 0 && !reflect.DeepEqual(got, tt.want) {
67
t.Errorf("GetTemplatePath() got = %v, want %v", got, tt.want)
68
}
69
70
if len(tt.want) == 0 && len(got) > 0 {
71
t.Errorf("GetTemplatePath() got = %v, want %v", got, tt.want)
72
}
73
})
74
}
75
}
76
77
func TestCatalog_GetTemplatesPath(t *testing.T) {
78
tmp := newMockS3Service()
79
keys, _ := tmp.getAllKeys()
80
81
type args struct {
82
definitions []string
83
}
84
tests := []struct {
85
name string
86
args args
87
want []string
88
wantErr bool
89
}{
90
{
91
"without definitions",
92
args{
93
definitions: nil,
94
},
95
keys,
96
false,
97
},
98
{
99
"with definitions",
100
args{
101
definitions: []string{"ssl/deprecated-tls.yaml"},
102
},
103
keys,
104
false,
105
},
106
}
107
for _, tt := range tests {
108
t.Run(tt.name, func(t *testing.T) {
109
c, _ := NewCatalog("bucket", withMockS3Service())
110
got, got1 := c.GetTemplatesPath(tt.args.definitions)
111
112
if got1 != nil {
113
val, exists := got1["aws"]
114
if exists && !tt.wantErr {
115
t.Errorf("GetTemplatesPath() error = %v, wantErr %v", val, tt.wantErr)
116
}
117
118
if !exists && len(got1) > 0 {
119
t.Errorf("GetTemplatesPath() should only return one key 'aws': %v", got1)
120
}
121
122
if !exists && tt.wantErr {
123
t.Errorf("GetTemplatesPath() error = %v, wantErr %v", val, tt.wantErr)
124
}
125
}
126
if !reflect.DeepEqual(got, tt.want) {
127
t.Errorf("GetTemplatesPath() got = %v, want %v", got, tt.want)
128
}
129
})
130
}
131
}
132
133
func TestCatalog_OpenFile(t *testing.T) {
134
tests := []struct {
135
name string
136
filename string
137
wantErr bool
138
}{
139
{
140
"valid key",
141
"ssl/deprecated-tls.yaml",
142
false,
143
},
144
{
145
"nonexistent key",
146
"something/that-doesnt-exist.yaml",
147
true,
148
},
149
{
150
"path to folder",
151
"cves/2023",
152
true,
153
},
154
}
155
for _, tt := range tests {
156
t.Run(tt.name, func(t *testing.T) {
157
c, _ := NewCatalog("bucket", withMockS3Service())
158
got, err := c.OpenFile(tt.filename)
159
if (err != nil) != tt.wantErr {
160
t.Errorf("OpenFile() error = %v, wantErr %v", err, tt.wantErr)
161
return
162
}
163
if err == nil && got == nil {
164
t.Error("OpenFile() didn't return error but io.ReadCloser is nil")
165
}
166
})
167
}
168
}
169
170
func TestCatalog_ResolvePath(t *testing.T) {
171
type args struct {
172
templateName string
173
second string
174
}
175
tests := []struct {
176
name string
177
args args
178
want string
179
wantErr bool
180
}{
181
{
182
"absolute path",
183
args{
184
"ssl/deprecated-tls.yaml",
185
"",
186
},
187
"ssl/deprecated-tls.yaml",
188
false,
189
},
190
{
191
"relative path with second param",
192
args{
193
"deprecated-tls.yaml",
194
"ssl/",
195
},
196
"ssl/deprecated-tls.yaml",
197
false,
198
},
199
{
200
"relative path and no second param",
201
args{
202
"cves/2023",
203
"",
204
},
205
"",
206
true,
207
},
208
}
209
for _, tt := range tests {
210
t.Run(tt.name, func(t *testing.T) {
211
c, _ := NewCatalog("bucket", withMockS3Service())
212
got, err := c.ResolvePath(tt.args.templateName, tt.args.second)
213
if (err != nil) != tt.wantErr {
214
t.Errorf("ResolvePath() error = %v, wantErr %v", err, tt.wantErr)
215
return
216
}
217
if got != tt.want {
218
t.Errorf("ResolvePath() got = %v, want %v", got, tt.want)
219
}
220
})
221
}
222
}
223
224
func withMockS3Service() func(*Catalog) error {
225
return func(c *Catalog) error {
226
c.svc = newMockS3Service()
227
return nil
228
}
229
}
230
231
type mocks3svc struct {
232
keys []string
233
}
234
235
func newMockS3Service() mocks3svc {
236
return mocks3svc{
237
keys: []string{
238
"ssl/deprecated-tls.yaml",
239
"ssl/detect-ssl-issuer.yaml",
240
"ssl/expired-ssl.yaml",
241
"ssl/mismatched-ssl.yaml",
242
"cves/2023/CVE-2023-0669.yaml",
243
"cves/2023/CVE-2023-23488.yaml",
244
"cves/2023/CVE-2023-23489.yaml",
245
},
246
}
247
}
248
249
func (m mocks3svc) getAllKeys() ([]string, error) {
250
return m.keys, nil
251
}
252
253
func (m mocks3svc) downloadKey(name string) (io.ReadCloser, error) {
254
found := slices.Contains(m.keys, name)
255
if !found {
256
return nil, errors.New("key not found")
257
}
258
259
sample := `
260
id: git-config
261
262
info:
263
name: Git Config File
264
author: Ice3man
265
severity: medium
266
description: Searches for the pattern /.git/config on passed URLs.
267
268
requests:
269
- method: GET
270
path:
271
- "{{BaseURL}}/.git/config"
272
matchers:
273
- type: word
274
words:
275
- "[core]"
276
`
277
278
return io.NopCloser(strings.NewReader(sample)), nil
279
}
280
281
func (m mocks3svc) setBucket(bucket string) {}
282
283