Path: blob/dev/pkg/operators/extractors/compile.go
2851 views
package extractors12import (3"fmt"4"regexp"5"strings"67"github.com/Knetic/govaluate"8"github.com/itchyny/gojq"9"github.com/projectdiscovery/nuclei/v3/pkg/operators/cache"10"github.com/projectdiscovery/nuclei/v3/pkg/operators/common/dsl"11)1213// CompileExtractors performs the initial setup operation on an extractor14func (e *Extractor) CompileExtractors() error {15// Set up the extractor type16computedType, err := toExtractorTypes(e.GetType().String())17if err != nil {18return fmt.Errorf("unknown extractor type specified: %s", e.Type)19}20e.extractorType = computedType21// Compile the regexes22for _, regex := range e.Regex {23if cached, err := cache.Regex().GetIFPresent(regex); err == nil && cached != nil {24e.regexCompiled = append(e.regexCompiled, cached)25continue26}27compiled, err := regexp.Compile(regex)28if err != nil {29return fmt.Errorf("could not compile regex: %s", regex)30}31_ = cache.Regex().Set(regex, compiled)32e.regexCompiled = append(e.regexCompiled, compiled)33}34for i, kval := range e.KVal {35e.KVal[i] = strings.ToLower(kval)36}3738for _, query := range e.JSON {39query, err := gojq.Parse(query)40if err != nil {41return fmt.Errorf("could not parse json: %s", query)42}43compiled, err := gojq.Compile(query)44if err != nil {45return fmt.Errorf("could not compile json: %s", query)46}47e.jsonCompiled = append(e.jsonCompiled, compiled)48}4950for _, dslExp := range e.DSL {51if cached, err := cache.DSL().GetIFPresent(dslExp); err == nil && cached != nil {52e.dslCompiled = append(e.dslCompiled, cached)53continue54}55compiled, err := govaluate.NewEvaluableExpressionWithFunctions(dslExp, dsl.HelperFunctions)56if err != nil {57return &dsl.CompilationError{DslSignature: dslExp, WrappedError: err}58}59_ = cache.DSL().Set(dslExp, compiled)60e.dslCompiled = append(e.dslCompiled, compiled)61}6263if e.CaseInsensitive {64if e.GetType() != KValExtractor {65return fmt.Errorf("case-insensitive flag is supported only for 'kval' extractors (not '%s')", e.Type)66}67for i := range e.KVal {68e.KVal[i] = strings.ToLower(e.KVal[i])69}70}7172return nil73}747576