Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/protocols/common/generators/load.go
2072 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
elements := strings.Split(pt, "\n")
21
//golint:gomnd // this is not a magic number
22
if len(elements) >= 2 {
23
loadedPayloads[name] = elements
24
} else {
25
file, err := generator.options.LoadHelperFile(pt, templatePath, generator.catalog)
26
if err != nil {
27
return nil, errors.Wrap(err, "could not load payload file")
28
}
29
payloads, err := generator.loadPayloadsFromFile(file)
30
if err != nil {
31
return nil, errors.Wrap(err, "could not load payloads")
32
}
33
loadedPayloads[name] = payloads
34
}
35
case interface{}:
36
loadedPayloads[name] = cast.ToStringSlice(pt)
37
}
38
}
39
return loadedPayloads, nil
40
}
41
42
// loadPayloadsFromFile loads a file to a string slice
43
func (generator *PayloadGenerator) loadPayloadsFromFile(file io.ReadCloser) ([]string, error) {
44
var lines []string
45
defer func() {
46
_ = file.Close()
47
}()
48
49
scanner := bufio.NewScanner(file)
50
for scanner.Scan() {
51
text := scanner.Text()
52
if text == "" {
53
continue
54
}
55
lines = append(lines, text)
56
}
57
if err := scanner.Err(); err != nil && !errors.Is(err, pkgTypes.ErrNoMoreRequests) {
58
return lines, scanner.Err()
59
}
60
return lines, nil
61
}
62
63