Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/protocols/file/request_test.go
2070 views
1
package file
2
3
import (
4
"archive/zip"
5
"bytes"
6
"compress/gzip"
7
"context"
8
"os"
9
"path/filepath"
10
"testing"
11
12
"github.com/stretchr/testify/require"
13
14
"github.com/projectdiscovery/nuclei/v3/pkg/model"
15
"github.com/projectdiscovery/nuclei/v3/pkg/model/types/severity"
16
"github.com/projectdiscovery/nuclei/v3/pkg/operators"
17
"github.com/projectdiscovery/nuclei/v3/pkg/operators/extractors"
18
"github.com/projectdiscovery/nuclei/v3/pkg/operators/matchers"
19
"github.com/projectdiscovery/nuclei/v3/pkg/output"
20
"github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/contextargs"
21
"github.com/projectdiscovery/nuclei/v3/pkg/testutils"
22
permissionutil "github.com/projectdiscovery/utils/permission"
23
)
24
25
func zipFile(t *testing.T, fileName string, data []byte) []byte {
26
var b bytes.Buffer
27
w := zip.NewWriter(&b)
28
w1, err := w.Create(fileName)
29
require.NoError(t, err)
30
_, err = w1.Write(data)
31
require.NoError(t, err)
32
err = w.Close()
33
require.NoError(t, err)
34
return b.Bytes()
35
}
36
37
func gzipFile(t *testing.T, data []byte) []byte {
38
var b bytes.Buffer
39
w := gzip.NewWriter(&b)
40
_, err := w.Write(data)
41
require.NoError(t, err)
42
err = w.Close()
43
require.NoError(t, err)
44
return b.Bytes()
45
}
46
47
func TestFileExecuteWithResults(t *testing.T) {
48
var testCaseBase = []byte("TEST\r\n1.1.1.1\r\n")
49
const testCaseBaseFilename = "config.yaml"
50
var testCases = []struct {
51
fileName string
52
data []byte
53
}{
54
{
55
fileName: testCaseBaseFilename,
56
data: testCaseBase,
57
},
58
{
59
fileName: testCaseBaseFilename + ".gz",
60
data: gzipFile(t, testCaseBase),
61
},
62
{
63
fileName: "config.yaml.zip",
64
data: zipFile(t, testCaseBaseFilename, testCaseBase),
65
},
66
}
67
68
for _, tt := range testCases {
69
options := testutils.DefaultOptions
70
71
testutils.Init(options)
72
templateID := "testing-file"
73
executerOpts := testutils.NewMockExecuterOptions(options, &testutils.TemplateInfo{
74
ID: templateID,
75
Info: model.Info{SeverityHolder: severity.Holder{Severity: severity.Low}, Name: "test"},
76
})
77
78
request := &Request{
79
ID: templateID,
80
MaxSize: "1Gb",
81
NoRecursive: false,
82
Extensions: []string{"all"},
83
DenyList: []string{".go"},
84
Archive: true,
85
Operators: operators.Operators{
86
Matchers: []*matchers.Matcher{{
87
Name: "test",
88
Part: "raw",
89
Type: matchers.MatcherTypeHolder{MatcherType: matchers.WordsMatcher},
90
Words: []string{"1.1.1.1"},
91
}},
92
Extractors: []*extractors.Extractor{{
93
Part: "raw",
94
Type: extractors.ExtractorTypeHolder{ExtractorType: extractors.RegexExtractor},
95
Regex: []string{"[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+"},
96
}},
97
},
98
options: executerOpts,
99
}
100
err := request.Compile(executerOpts)
101
require.Nil(t, err, "could not compile file request")
102
103
tempDir, err := os.MkdirTemp("", "test-*")
104
require.Nil(t, err, "could not create temporary directory")
105
defer func() {
106
_ = os.RemoveAll(tempDir)
107
}()
108
109
files := map[string][]byte{
110
tt.fileName: tt.data,
111
}
112
for k, v := range files {
113
err = os.WriteFile(filepath.Join(tempDir, k), v, permissionutil.TempFilePermission)
114
require.Nil(t, err, "could not write temporary file")
115
}
116
117
var finalEvent *output.InternalWrappedEvent
118
t.Run("valid", func(t *testing.T) {
119
metadata := make(output.InternalEvent)
120
previous := make(output.InternalEvent)
121
ctxArgs := contextargs.NewWithInput(context.Background(), tempDir)
122
err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) {
123
finalEvent = event
124
})
125
require.Nil(t, err, "could not execute file request")
126
})
127
require.NotNil(t, finalEvent, "could not get event output from request")
128
require.Equal(t, 1, len(finalEvent.Results), "could not get correct number of results")
129
require.Equal(t, "test", finalEvent.Results[0].MatcherName, "could not get correct matcher name of results")
130
require.Equal(t, 1, len(finalEvent.Results[0].ExtractedResults), "could not get correct number of extracted results")
131
require.Equal(t, "1.1.1.1", finalEvent.Results[0].ExtractedResults[0], "could not get correct extracted results")
132
finalEvent = nil
133
}
134
}
135
136