Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/operators/extractors/compile.go
2070 views
1
package extractors
2
3
import (
4
"fmt"
5
"regexp"
6
"strings"
7
8
"github.com/Knetic/govaluate"
9
"github.com/itchyny/gojq"
10
"github.com/projectdiscovery/nuclei/v3/pkg/operators/common/dsl"
11
)
12
13
// CompileExtractors performs the initial setup operation on an extractor
14
func (e *Extractor) CompileExtractors() error {
15
// Set up the extractor type
16
computedType, err := toExtractorTypes(e.GetType().String())
17
if err != nil {
18
return fmt.Errorf("unknown extractor type specified: %s", e.Type)
19
}
20
e.extractorType = computedType
21
// Compile the regexes
22
for _, regex := range e.Regex {
23
compiled, err := regexp.Compile(regex)
24
if err != nil {
25
return fmt.Errorf("could not compile regex: %s", regex)
26
}
27
e.regexCompiled = append(e.regexCompiled, compiled)
28
}
29
for i, kval := range e.KVal {
30
e.KVal[i] = strings.ToLower(kval)
31
}
32
33
for _, query := range e.JSON {
34
query, err := gojq.Parse(query)
35
if err != nil {
36
return fmt.Errorf("could not parse json: %s", query)
37
}
38
compiled, err := gojq.Compile(query)
39
if err != nil {
40
return fmt.Errorf("could not compile json: %s", query)
41
}
42
e.jsonCompiled = append(e.jsonCompiled, compiled)
43
}
44
45
for _, dslExp := range e.DSL {
46
compiled, err := govaluate.NewEvaluableExpressionWithFunctions(dslExp, dsl.HelperFunctions)
47
if err != nil {
48
return &dsl.CompilationError{DslSignature: dslExp, WrappedError: err}
49
}
50
e.dslCompiled = append(e.dslCompiled, compiled)
51
}
52
53
if e.CaseInsensitive {
54
if e.GetType() != KValExtractor {
55
return fmt.Errorf("case-insensitive flag is supported only for 'kval' extractors (not '%s')", e.Type)
56
}
57
for i := range e.KVal {
58
e.KVal[i] = strings.ToLower(e.KVal[i])
59
}
60
}
61
62
return nil
63
}
64
65