Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/protocols/common/generators/load.go
2843 views
1
package generators
2
3
import (
4
"bufio"
5
"io"
6
"strings"
7
8
"github.com/pkg/errors"
9
pkgTypes "github.com/projectdiscovery/nuclei/v3/pkg/types"
10
"github.com/spf13/cast"
11
)
12
13
// loadPayloads loads the input payloads from a map to a data map
14
func (generator *PayloadGenerator) loadPayloads(payloads map[string]interface{}, templatePath string) (map[string][]string, error) {
15
loadedPayloads := make(map[string][]string)
16
17
for name, payload := range payloads {
18
switch pt := payload.(type) {
19
case string:
20
// Fast path: if no newline, treat as file path
21
if !strings.ContainsRune(pt, '\n') {
22
file, err := generator.options.LoadHelperFile(pt, templatePath, generator.catalog)
23
if err != nil {
24
return nil, errors.Wrap(err, "could not load payload file")
25
}
26
payloads, err := generator.loadPayloadsFromFile(file)
27
if err != nil {
28
return nil, errors.Wrap(err, "could not load payloads")
29
}
30
loadedPayloads[name] = payloads
31
break
32
}
33
// Multiline inline payloads
34
elements := strings.Split(pt, "\n")
35
//golint:gomnd // this is not a magic number
36
if len(elements) >= 2 {
37
loadedPayloads[name] = elements
38
} else {
39
file, err := generator.options.LoadHelperFile(pt, templatePath, generator.catalog)
40
if err != nil {
41
return nil, errors.Wrap(err, "could not load payload file")
42
}
43
payloads, err := generator.loadPayloadsFromFile(file)
44
if err != nil {
45
return nil, errors.Wrap(err, "could not load payloads")
46
}
47
loadedPayloads[name] = payloads
48
}
49
case interface{}:
50
loadedPayloads[name] = cast.ToStringSlice(pt)
51
}
52
}
53
return loadedPayloads, nil
54
}
55
56
// loadPayloadsFromFile loads a file to a string slice
57
func (generator *PayloadGenerator) loadPayloadsFromFile(file io.ReadCloser) ([]string, error) {
58
var lines []string
59
defer func() {
60
_ = file.Close()
61
}()
62
63
scanner := bufio.NewScanner(file)
64
for scanner.Scan() {
65
text := scanner.Text()
66
if text == "" {
67
continue
68
}
69
lines = append(lines, text)
70
}
71
if err := scanner.Err(); err != nil && !errors.Is(err, pkgTypes.ErrNoMoreRequests) {
72
return lines, scanner.Err()
73
}
74
return lines, nil
75
}
76
77