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