diff --git a/.github/workflows/publish-docs.yaml b/.github/workflows/publish-docs.yaml index fde9b869..71c80554 100644 --- a/.github/workflows/publish-docs.yaml +++ b/.github/workflows/publish-docs.yaml @@ -1,9 +1,9 @@ name: ⏰ Publish Docs on: - pull_request: - paths: - - '**.go' + push: + branches: + - dev workflow_dispatch: jobs: @@ -14,7 +14,6 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 - ref: ${{ github.head_ref }} - name: "Set up Go" uses: actions/setup-go@v3 diff --git a/Dockerfile b/Dockerfile index 25e4591e..72361a99 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,16 @@ -FROM golang:1.20.1-alpine as build-env +# Build +FROM golang:1.20.1-alpine AS build-env RUN apk add build-base -RUN go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest +WORKDIR /app +COPY . /app +WORKDIR /app/v2 +RUN go mod download +RUN go build ./cmd/nuclei +# Release FROM alpine:3.17.2 -RUN apk add --no-cache bind-tools ca-certificates chromium -COPY --from=build-env /go/bin/nuclei /usr/local/bin/nuclei -ENTRYPOINT ["nuclei"] +RUN apk -U upgrade --no-cache \ + && apk add --no-cache bind-tools chromium ca-certificates +COPY --from=build-env /app/v2/nuclei /usr/local/bin/ + +ENTRYPOINT ["nuclei"] \ No newline at end of file diff --git a/README.md b/README.md index f2da76f5..2fe74397 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,7 @@ OPTIMIZATIONS: -retries int number of times to retry a failed request (default 1) -ldp, -leave-default-ports leave default HTTP/HTTPS ports (eg. host:80,host:443) -mhe, -max-host-error int max errors for a host before skipping from scan (default 30) + -te, -track-error string[] adds given error to max-host-error watchlist (standard, file) -nmhe, -no-mhe disable skipping host from scan based on errors -project use a project folder to avoid sending same request multiple times -project-path string set a specific project path (default "/tmp") diff --git a/README_CN.md b/README_CN.md index 0764c88e..7ab8ced0 100644 --- a/README_CN.md +++ b/README_CN.md @@ -189,6 +189,7 @@ Nuclei是一款注重于可配置性、可扩展性和易用性的基于模板 -retries int 重试次数(默认:1) -ldp, -leave-default-ports 指定HTTP/HTTPS默认端口(例如:host:80,host:443) -mhe, -max-host-error int 某主机扫描失败次数,跳过该主机(默认:30) + -te, -track-error string[] 将给定错误添加到最大主机错误监视列表(标准、文件) -nmhe, -no-mhe disable skipping host from scan based on errors -project 使用项目文件夹避免多次发送同一请求 -project-path string 设置特定的项目文件夹 diff --git a/README_ID.md b/README_ID.md index ca4d6a7f..b3022cc9 100644 --- a/README_ID.md +++ b/README_ID.md @@ -188,6 +188,7 @@ OPTIMIZATIONS: -retries int number of times to retry a failed request (default 1) -ldp, -leave-default-ports leave default HTTP/HTTPS ports (eg. host:80,host:443 -mhe, -max-host-error int max errors for a host before skipping from scan (default 30) + -te, -track-error string[] adds given error to max-host-error watchlist (standard, file) -nmhe, -no-mhe disable skipping host from scan based on errors -project use a project folder to avoid sending same request multiple times -project-path string set a specific project path diff --git a/README_KR.md b/README_KR.md index 4daa7099..343d87ac 100644 --- a/README_KR.md +++ b/README_KR.md @@ -178,6 +178,7 @@ OPTIMIZATIONS: -retries int 실패한 요청을 재시도하는 횟수 (기본 1) -ldp, -leave-default-ports leave default HTTP/HTTPS ports (eg. host:80,host:443 -mhe, -max-host-error int 스캔을 건너뛰기 전에 호스트에 대한 최대 오류 수 (기본 30) + -te, -track-error string[] 주어진 오류를 max-host-error 감시 목록(표준, 파일)에 추가 -nmhe, -no-mhe disable skipping host from scan based on errors -project 프로젝트 폴더를 사용하여 동일한 요청을 여러 번 보내지 않음 -project-path string 특정 프로젝트 경로 설정 diff --git a/SYNTAX-REFERENCE.md b/SYNTAX-REFERENCE.md index 4d34cd47..87e38bef 100755 --- a/SYNTAX-REFERENCE.md +++ b/SYNTAX-REFERENCE.md @@ -262,19 +262,6 @@ WHOIS contains the WHOIS request to make in the template.
-workflows []workflows.WorkflowTemplate - -
-
- -Workflows is a list of workflows to execute for a template. - -
- -
- -
- self-contained bool
@@ -464,7 +451,7 @@ description: Subversion ALM for the enterprise before 8.8.2 allows reflected XSS
-reference stringslice.StringSlice +reference stringslice.RawStringSlice
@@ -579,16 +566,10 @@ Appears in: - model.Info.tags -- model.Info.reference - - model.Classification.cve-id - model.Classification.cwe-id -- workflows.WorkflowTemplate.tags - -- workflows.Matcher.name - ```yaml @@ -598,10 +579,6 @@ Appears in: cve,cve2019,grafana,auth-bypass,dos ``` ```yaml -- https://github.com/strapi/strapi -- https://github.com/getgrav/grav -``` -```yaml CVE-2020-14420 ``` ```yaml @@ -612,6 +589,23 @@ CWE-22 +## stringslice.RawStringSlice + +Appears in: + + +- model.Info.reference + + +```yaml +- https://github.com/strapi/strapi +- https://github.com/getgrav/grav +``` + + + + + ## severity.Holder Holder holds a Severity type. Required for un/marshalling purposes @@ -821,58 +815,6 @@ Part Definitions:
-matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- -
- path []string
@@ -1436,774 +1378,6 @@ DigestAuthPassword specifies the password for digest authentication -## matchers.Matcher -Matcher is used to match a part in the output from a protocol. - -Appears in: - - -- http.Request.matchers - -- dns.Request.matchers - -- file.Request.matchers - -- network.Request.matchers - -- headless.Request.matchers - -- ssl.Request.matchers - -- websocket.Request.matchers - -- whois.Request.matchers - - - - - -
- -
- -type MatcherTypeHolder - -
-
- -Type is the type of the matcher. - -
- -
- -
- -condition string - -
-
- -Condition is the optional condition between two matcher variables. By default, -the condition is assumed to be OR. - - -Valid values: - - - - and - - - or -
- -
- -
- -part string - -
-
- -Part is the part of the request response to match data from. - -Each protocol exposes a lot of different parts which are well -documented in docs for each request type. - - - -Examples: - - -```yaml -part: body -``` - -```yaml -part: raw -``` - - -
- -
- -
- -negative bool - -
-
- -Negative specifies if the match should be reversed -It will only match if the condition is not true. - -
- -
- -
- -name string - -
-
- -Name of the matcher. Name should be lowercase and must not contain -spaces or underscores (_). - - - -Examples: - - -```yaml -name: cookie-matcher -``` - - -
- -
- -
- -status []int - -
-
- -Status are the acceptable status codes for the response. - - - -Examples: - - -```yaml -status: - - 200 - - 302 -``` - - -
- -
- -
- -size []int - -
-
- -Size is the acceptable size for the response - - - -Examples: - - -```yaml -size: - - 3029 - - 2042 -``` - - -
- -
- -
- -words []string - -
-
- -Words contains word patterns required to be present in the response part. - - - -Examples: - - -```yaml -# Match for Outlook mail protection domain -words: - - mail.protection.outlook.com -``` - -```yaml -# Match for application/json in response headers -words: - - application/json -``` - - -
- -
- -
- -regex []string - -
-
- -Regex contains Regular Expression patterns required to be present in the response part. - - - -Examples: - - -```yaml -# Match for Linkerd Service via Regex -regex: - - (?mi)^Via\\s*?:.*?linkerd.*$ -``` - -```yaml -# Match for Open Redirect via Location header -regex: - - (?m)^(?:Location\\s*?:\\s*?)(?:https?://|//)?(?:[a-zA-Z0-9\\-_\\.@]*)example\\.com.*$ -``` - - -
- -
- -
- -binary []string - -
-
- -Binary are the binary patterns required to be present in the response part. - - - -Examples: - - -```yaml -# Match for Springboot Heapdump Actuator "JAVA PROFILE", "HPROF", "Gunzip magic byte" -binary: - - 4a4156412050524f46494c45 - - 4850524f46 - - 1f8b080000000000 -``` - -```yaml -# Match for 7zip files -binary: - - 377ABCAF271C -``` - - -
- -
- -
- -dsl []string - -
-
- -DSL are the dsl expressions that will be evaluated as part of nuclei matching rules. -A list of these helper functions are available [here](https://nuclei.projectdiscovery.io/templating-guide/helper-functions/). - - - -Examples: - - -```yaml -# DSL Matcher for package.json file -dsl: - - contains(body, 'packages') && contains(tolower(all_headers), 'application/octet-stream') && status_code == 200 -``` - -```yaml -# DSL Matcher for missing strict transport security header -dsl: - - '!contains(tolower(all_headers), ''''strict-transport-security'''')' -``` - - -
- -
- -
- -encoding string - -
-
- -Encoding specifies the encoding for the words field if any. - - -Valid values: - - - - hex -
- -
- -
- -case-insensitive bool - -
-
- -CaseInsensitive enables case-insensitive matches. Default is false. - - -Valid values: - - - - false - - - true -
- -
- -
- -match-all bool - -
-
- -MatchAll enables matching for all matcher values. Default is false. - - -Valid values: - - - - false - - - true -
- -
- - - - - -## MatcherTypeHolder -MatcherTypeHolder is used to hold internal type of the matcher - -Appears in: - - -- matchers.Matcher.type - - - - - -
- -
- - MatcherType - -
-
- - - - -Enum Values: - - - - word - - - regex - - - binary - - - status - - - size - - - dsl -
- -
- - - - - -## extractors.Extractor -Extractor is used to extract part of response using a regex. - -Appears in: - - -- http.Request.extractors - -- dns.Request.extractors - -- file.Request.extractors - -- network.Request.extractors - -- headless.Request.extractors - -- ssl.Request.extractors - -- websocket.Request.extractors - -- whois.Request.extractors - - - - - -
- -
- -name string - -
-
- -Name of the extractor. Name should be lowercase and must not contain -spaces or underscores (_). - - - -Examples: - - -```yaml -name: cookie-extractor -``` - - -
- -
- -
- -type ExtractorTypeHolder - -
-
- -Type is the type of the extractor. - -
- -
- -
- -regex []string - -
-
- -Regex contains the regular expression patterns to extract from a part. - -Go regex engine does not support lookaheads or lookbehinds, so as a result -they are also not supported in nuclei. - - - -Examples: - - -```yaml -# Braintree Access Token Regex -regex: - - access_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32} -``` - -```yaml -# Wordpress Author Extraction regex -regex: - - Author:(?:[A-Za-z0-9 -\_="]+)? - -group int - -
-
- -Group specifies a numbered group to extract from the regex. - - - -Examples: - - -```yaml -# Example Regex Group -group: 1 -``` - - -
- -
- -
- -kval []string - -
-
- -description: | - kval contains the key-value pairs present in the HTTP response header. - kval extractor can be used to extract HTTP response header and cookie key-value pairs. - kval extractor inputs are case-insensitive, and does not support dash (-) in input which can replaced with underscores (_) - For example, Content-Type should be replaced with content_type - - A list of supported parts is available in docs for request types. - examples: - - name: Extract Server Header From HTTP Response - value: > - []string{"server"} - - name: Extracting value of PHPSESSID Cookie - value: > - []string{"phpsessid"} - - name: Extracting value of Content-Type Cookie - value: > - []string{"content_type"} - -
- -
- -
- -json []string - -
-
- -JSON allows using jq-style syntax to extract items from json response - - - -Examples: - - -```yaml -json: - - .[] | .id -``` - -```yaml -json: - - .batters | .batter | .[] | .id -``` - - -
- -
- -
- -xpath []string - -
-
- -XPath allows using xpath expressions to extract items from html response - - - -Examples: - - -```yaml -xpath: - - /html/body/div/p[2]/a -``` - - -
- -
- -
- -attribute string - -
-
- -Attribute is an optional attribute to extract from response XPath. - - - -Examples: - - -```yaml -attribute: href -``` - - -
- -
- -
- -dsl []string - -
-
- -Extracts using DSL expressions. - -
- -
- -
- -part string - -
-
- -Part is the part of the request response to extract data from. - -Each protocol exposes a lot of different parts which are well -documented in docs for each request type. - - - -Examples: - - -```yaml -part: body -``` - -```yaml -part: raw -``` - - -
- -
- -
- -internal bool - -
-
- -Internal, when set to true will allow using the value extracted -in the next request for some protocols (like HTTP). - -
- -
- -
- -case-insensitive bool - -
-
- -CaseInsensitive enables case-insensitive extractions. Default is false. - - -Valid values: - - - - false - - - true -
- -
- - - - - -## ExtractorTypeHolder -ExtractorTypeHolder is used to hold internal type of the extractor - -Appears in: - - -- extractors.Extractor.type - - - - - -
- -
- - ExtractorType - -
-
- - - - -Enum Values: - - - - regex - - - kval - - - xpath - - - json - - - dsl -
- -
- - - - - ## generators.AttackTypeHolder AttackTypeHolder is used to hold internal type of the protocol @@ -2555,58 +1729,6 @@ Part Definitions:
-matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- -
- id string
@@ -2868,58 +1990,6 @@ Part Definitions:
-matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- -
- extensions []string
@@ -3203,58 +2273,6 @@ read-all: false
-
- -matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- @@ -3541,58 +2559,6 @@ StopAtFirstMatch stops the execution of the requests and template as soon as a m
-
- -matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- @@ -3820,58 +2786,6 @@ Part Definitions:
-matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- -
- address string
@@ -3955,17 +2869,14 @@ Client Cipher Suites - auto if not specified.
-Tls Scan Mode - auto if not specified +description: | + Tls Scan Mode - auto if not specified + values: + - "ctls" + - "ztls" + - "auto" + - "openssl" # reverts to "auto" is openssl is not installed - -Valid values: - - - - ctls - - - ztls - - - auto

@@ -3998,58 +2909,6 @@ Part Definitions:
-matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
- -
- -
- address string
@@ -4205,58 +3064,6 @@ Appears in: -
- -
- -matchers []matchers.Matcher - -
-
- -Matchers contains the detection mechanism for the request to identify -whether the request was successful by doing pattern matching -on request/responses. - -Multiple matchers can be combined with `matcher-condition` flag -which accepts either `and` or `or` as argument. - -
- -
- -
- -extractors []extractors.Extractor - -
-
- -Extractors contains the extraction mechanism for the request to identify -and extract parts of the response. - -
- -
- -
- -matchers-condition string - -
-
- -MatchersCondition is the condition between the matchers. Default is OR. - - -Valid values: - - - - and - - - or -
-
@@ -4293,159 +3100,6 @@ description: | -## workflows.WorkflowTemplate - -Appears in: - - -- Template.workflows - -- workflows.WorkflowTemplate.subtemplates - -- workflows.Matcher.subtemplates - - - - - -
- -
- -template string - -
-
- -Template is a single template or directory to execute as part of workflow. - - - -Examples: - - -```yaml -# A single template -template: dns/worksites-detection.yaml -``` - -```yaml -# A template directory -template: misconfigurations/aem -``` - - -
- -
- -
- -tags stringslice.StringSlice - -
-
- -Tags to run templates based on. - -
- -
- -
- -matchers []workflows.Matcher - -
-
- -Matchers perform name based matching to run subtemplates for a workflow. - -
- -
- -
- -subtemplates []workflows.WorkflowTemplate - -
-
- -Subtemplates are run if the `template` field Template matches. - -
- -
- - - - - -## workflows.Matcher - -Appears in: - - -- workflows.WorkflowTemplate.matchers - - - - - -
- -
- -name stringslice.StringSlice - -
-
- -Name is the name of the items to match. - -
- -
- -
- -condition string - -
-
- -Condition is the optional condition between names. By default, -the condition is assumed to be OR. - - -Valid values: - - - - and - - - or -
- -
- -
- -subtemplates []workflows.WorkflowTemplate - -
-
- -Subtemplates are run if the name of matcher matches. - -
- -
- - - - - ## http.SignatureTypeHolder SignatureTypeHolder is used to hold internal type of the signature diff --git a/integration_tests/http/default-matcher-condition.yaml b/integration_tests/http/default-matcher-condition.yaml new file mode 100644 index 00000000..b08acfc6 --- /dev/null +++ b/integration_tests/http/default-matcher-condition.yaml @@ -0,0 +1,22 @@ +id: default-matcher-condition + +info: + name: default-matcher-condition + author: pdteam + severity: info + +requests: + - raw: + - | + GET /?action=curltest&url={{interactsh-url}} HTTP/1.1 + Host: {{Hostname}} + + matchers: + - type: word + part: interactsh_protocol + words: + - "http" + + - type: status + status: + - 200 diff --git a/nuclei-jsonschema.json b/nuclei-jsonschema.json index 1ea1b229..97bcd7b8 100644 --- a/nuclei-jsonschema.json +++ b/nuclei-jsonschema.json @@ -61,7 +61,8 @@ ] }, "reference": { - "$ref": "#/definitions/stringslice.StringSlice", + "$schema": "http://json-schema.org/draft-04/schema#", + "$ref": "#/definitions/stringslice.RawStringSlice", "title": "references for the template", "description": "Links relevant to the template" }, @@ -110,6 +111,16 @@ "title": "severity of the template", "description": "Seriousness of the implications of the template" }, + "stringslice.RawStringSlice": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array" + } + ] + }, "stringslice.StringSlice": { "oneOf": [ { diff --git a/sonar-project.properties b/sonar-project.properties deleted file mode 100644 index 5605f4d4..00000000 --- a/sonar-project.properties +++ /dev/null @@ -1,17 +0,0 @@ -sonar.projectKey=projectdiscovery_nuclei -sonar.organization=projectdiscovery - -# This is the name and version displayed in the SonarCloud UI. -#sonar.projectName=dnsx -#sonar.projectVersion=1.0 - -# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. -sonar.sources=v2/ -sonar.tests=v2/ -sonar.test.inclusions=**/*_test.go -sonar.exclusions=v2/pkg/protocols/common/helpers/deserialization/testdata/*.java -sonar.go.coverage.reportPaths=v2/cov.out -sonar.externalIssuesReportPaths=v2/report.json - -# Encoding of the source code. Default is default system encoding -#sonar.sourceEncoding=UTF-8 \ No newline at end of file diff --git a/v2/.goreleaser.yml b/v2/.goreleaser.yml index 0e59a522..c580d43c 100644 --- a/v2/.goreleaser.yml +++ b/v2/.goreleaser.yml @@ -2,14 +2,7 @@ before: hooks: - go mod tidy -# release options (https://goreleaser.com/customization/release/) - -release: - draft: true - prerelease: auto - builds: - - main: cmd/nuclei/main.go binary: nuclei id: nuclei-cli @@ -60,7 +53,7 @@ announce: enabled: true channel: '#release' username: GoReleaser - message_template: '**New Release: {{ .ProjectName }} {{.Tag}}** is published! Check it out at {{ .ReleaseURL }}' + message_template: 'New Release: {{ .ProjectName }} {{.Tag}} is published! Check it out at {{ .ReleaseURL }}' discord: enabled: true diff --git a/v2/cmd/integration-test/code.go b/v2/cmd/integration-test/code.go index dc2ce1c3..c6dd5f4f 100644 --- a/v2/cmd/integration-test/code.go +++ b/v2/cmd/integration-test/code.go @@ -65,11 +65,14 @@ func (h *goIntegrationTest) Execute(templatePath string) error { // executeNucleiAsCode contains an example func executeNucleiAsCode(templatePath, templateURL string) ([]string, error) { - cache := hosterrorscache.New(30, hosterrorscache.DefaultMaxHostsCount) + cache := hosterrorscache.New(30, hosterrorscache.DefaultMaxHostsCount, nil) defer cache.Close() mockProgress := &testutils.MockProgressClient{} - reportingClient, _ := reporting.New(&reporting.Options{}, "") + reportingClient, err := reporting.New(&reporting.Options{}, "") + if err != nil { + return nil, err + } defer reportingClient.Close() outputWriter := testutils.NewMockOutputWriter() diff --git a/v2/cmd/integration-test/http.go b/v2/cmd/integration-test/http.go index bd4dee05..2d339af4 100644 --- a/v2/cmd/integration-test/http.go +++ b/v2/cmd/integration-test/http.go @@ -8,7 +8,6 @@ import ( "net/http/httptest" "net/http/httputil" "os" - "path/filepath" "reflect" "strconv" "strings" @@ -26,6 +25,7 @@ import ( ) var httpTestcases = map[string]testutils.TestCase{ + // TODO: excluded due to parsing errors with console // "http/raw-unsafe-request.yaml": &httpRawUnsafeRequest{}, "http/get-headers.yaml": &httpGetHeaders{}, "http/get-query-string.yaml": &httpGetQueryString{}, @@ -71,6 +71,7 @@ var httpTestcases = map[string]testutils.TestCase{ "http/get-without-scheme.yaml": &httpGetWithoutScheme{}, "http/cl-body-without-header.yaml": &httpCLBodyWithoutHeader{}, "http/cl-body-with-header.yaml": &httpCLBodyWithHeader{}, + "http/default-matcher-condition.yaml": &httpDefaultMatcherCondition{}, } type httpInteractshRequest struct{} @@ -97,6 +98,52 @@ func (h *httpInteractshRequest) Execute(filePath string) error { return expectResultsCount(results, 1) } +type httpDefaultMatcherCondition struct{} + +// Execute executes a test case and returns an error if occurred +func (d *httpDefaultMatcherCondition) Execute(filePath string) error { + // to simulate matcher-condition `or` + // - template should be run twice and vulnerable server should send response that fits for that specific run + router := httprouter.New() + var routerErr error + // Server endpoint where only interactsh matcher is successful and status code is not 200 + router.GET("/interactsh/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + value := r.URL.Query().Get("url") + if value != "" { + if _, err := retryablehttp.DefaultClient().Get("https://" + value); err != nil { + routerErr = err + } + } + w.WriteHeader(http.StatusNotFound) + }) + // Server endpoint where url is not probed but sends a 200 status code + router.GET("/status/", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + w.WriteHeader(http.StatusOK) + }) + ts := httptest.NewServer(router) + defer ts.Close() + + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL+"/status", debug) + if err != nil { + return err + } + if err := expectResultsCount(results, 1); err != nil { + return err + } + + results, err = testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL+"/interactsh", debug) + if err != nil { + return err + } + if routerErr != nil { + return errorutil.NewWithErr(routerErr).Msgf("failed to send http request to interactsh server") + } + if err := expectResultsCount(results, 1); err != nil { + return err + } + return nil +} + type httpInteractshStopAtFirstMatchRequest struct{} // Execute executes a test case and returns an error if occurred @@ -833,13 +880,16 @@ func (h *httpRequestSelfContainedFileInput) Execute(filePath string) error { defer server.Close() // create temp file - FileLoc := filepath.Join(os.TempDir(), "httpselfcontained.yaml") - err := os.WriteFile(FileLoc, []byte("one\ntwo\n"), 0600) + FileLoc, err := os.CreateTemp("", "self-contained-payload-*.txt") if err != nil { - return errorutil.NewWithErr(err).Msgf("failed to create temporary file").WithTag(filePath) + return errorutil.NewWithErr(err).Msgf("failed to create temp file") } + if _, err := FileLoc.Write([]byte("one\ntwo\n")); err != nil { + return errorutil.NewWithErr(err).Msgf("failed to write payload to temp file") + } + defer FileLoc.Close() - results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "", debug, "-V", "test="+FileLoc) + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "", debug, "-V", "test="+FileLoc.Name()) if err != nil { return err } diff --git a/v2/cmd/integration-test/integration-test.go b/v2/cmd/integration-test/integration-test.go index 3d6be800..c08deb51 100644 --- a/v2/cmd/integration-test/integration-test.go +++ b/v2/cmd/integration-test/integration-test.go @@ -9,6 +9,7 @@ import ( "github.com/logrusorgru/aurora" "github.com/projectdiscovery/nuclei/v2/pkg/testutils" + sliceutil "github.com/projectdiscovery/utils/slice" ) var ( @@ -62,7 +63,9 @@ func main() { os.Exit(1) } - failedTestTemplatePaths := runTests(toMap(toSlice(customTests))) + customTestsList := normalizeSplit(customTests) + + failedTestTemplatePaths := runTests(customTestsList) if len(failedTestTemplatePaths) > 0 { if githubAction { @@ -87,8 +90,8 @@ func debugTests() { } } -func runTests(customTemplatePaths map[string]struct{}) map[string]struct{} { - failedTestTemplatePaths := map[string]struct{}{} +func runTests(customTemplatePaths []string) []string { + var failedTestTemplatePaths []string for proto, testCases := range protocolTests { if len(customTemplatePaths) == 0 { @@ -96,9 +99,9 @@ func runTests(customTemplatePaths map[string]struct{}) map[string]struct{} { } for templatePath, testCase := range testCases { - if len(customTemplatePaths) == 0 || contains(customTemplatePaths, templatePath) { + if len(customTemplatePaths) == 0 || sliceutil.Contains(customTemplatePaths, templatePath) { if failedTemplatePath, err := execute(testCase, templatePath); err != nil { - failedTestTemplatePaths[failedTemplatePath] = struct{}{} + failedTestTemplatePaths = append(failedTestTemplatePaths, failedTemplatePath) } } } @@ -124,25 +127,6 @@ func expectResultsCount(results []string, expectedNumber int) error { return nil } -func toSlice(value string) []string { - if strings.TrimSpace(value) == "" { - return []string{} - } - - return strings.Split(value, ",") -} - -func toMap(slice []string) map[string]struct{} { - result := make(map[string]struct{}, len(slice)) - for _, value := range slice { - if _, ok := result[value]; !ok { - result[value] = struct{}{} - } - } - return result -} - -func contains(input map[string]struct{}, value string) bool { - _, ok := input[value] - return ok +func normalizeSplit(str string) []string { + return strings.Split(strings.TrimSpace(str), ",") } diff --git a/v2/cmd/integration-test/template-dir.go b/v2/cmd/integration-test/template-dir.go index 025fbb29..8b318ad8 100644 --- a/v2/cmd/integration-test/template-dir.go +++ b/v2/cmd/integration-test/template-dir.go @@ -4,13 +4,9 @@ import ( "os" "github.com/projectdiscovery/nuclei/v2/pkg/testutils" + errorutil "github.com/projectdiscovery/utils/errors" ) -func getTemplatesDir() string { - temp := os.TempDir() - return temp -} - var templatesDirTestCases = map[string]testutils.TestCase{ "dns/cname-fingerprint.yaml": &templateDirWithTargetTest{}, } @@ -19,9 +15,13 @@ type templateDirWithTargetTest struct{} // Execute executes a test case and returns an error if occurred func (h *templateDirWithTargetTest) Execute(filePath string) error { - defer os.RemoveAll(getTemplatesDir()) + tempdir, err := os.MkdirTemp("", "nuclei-update-dir-*") + if err != nil { + return errorutil.NewWithErr(err).Msgf("failed to create temp dir") + } + defer os.RemoveAll(tempdir) - results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "8x8exch02.8x8.com", debug, "-ud", getTemplatesDir()) + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "8x8exch02.8x8.com", debug, "-ud", tempdir) if err != nil { return err } diff --git a/v2/cmd/nuclei/main.go b/v2/cmd/nuclei/main.go index 91efbe37..0e16d197 100644 --- a/v2/cmd/nuclei/main.go +++ b/v2/cmd/nuclei/main.go @@ -23,6 +23,7 @@ import ( "github.com/projectdiscovery/nuclei/v2/pkg/protocols/http" templateTypes "github.com/projectdiscovery/nuclei/v2/pkg/templates/types" "github.com/projectdiscovery/nuclei/v2/pkg/types" + "github.com/projectdiscovery/nuclei/v2/pkg/types/scanstrategy" "github.com/projectdiscovery/nuclei/v2/pkg/utils/monitor" errorutil "github.com/projectdiscovery/utils/errors" fileutil "github.com/projectdiscovery/utils/file" @@ -243,21 +244,21 @@ on extensive configurability, massive extensibility and ease of use.`) flagSet.IntVarP(&options.HeadlessBulkSize, "headless-bulk-size", "hbs", 10, "maximum number of headless hosts to be analyzed in parallel per template"), flagSet.IntVarP(&options.HeadlessTemplateThreads, "headless-concurrency", "headc", 10, "maximum number of headless templates to be executed in parallel"), ) - flagSet.CreateGroup("optimization", "Optimizations", flagSet.IntVar(&options.Timeout, "timeout", 10, "time to wait in seconds before timeout"), flagSet.IntVar(&options.Retries, "retries", 1, "number of times to retry a failed request"), flagSet.BoolVarP(&options.LeaveDefaultPorts, "leave-default-ports", "ldp", false, "leave default HTTP/HTTPS ports (eg. host:80,host:443)"), flagSet.IntVarP(&options.MaxHostError, "max-host-error", "mhe", 30, "max errors for a host before skipping from scan"), + flagSet.StringSliceVarP(&options.TrackError, "track-error", "te", nil, "adds given error to max-host-error watchlist (standard, file)", goflags.FileStringSliceOptions), flagSet.BoolVarP(&options.NoHostErrors, "no-mhe", "nmhe", false, "disable skipping host from scan based on errors"), flagSet.BoolVar(&options.Project, "project", false, "use a project folder to avoid sending same request multiple times"), flagSet.StringVar(&options.ProjectPath, "project-path", os.TempDir(), "set a specific project path"), flagSet.BoolVarP(&options.StopAtFirstMatch, "stop-at-first-match", "spm", false, "stop processing HTTP requests after the first match (may break template/workflow logic)"), flagSet.BoolVar(&options.Stream, "stream", false, "stream mode - start elaborating without sorting the input"), flagSet.EnumVarP(&options.ScanStrategy, "scan-strategy", "ss", goflags.EnumVariable(0), "strategy to use while scanning(auto/host-spray/template-spray)", goflags.AllowdTypes{ - "auto": goflags.EnumVariable(0), - "host-spray": goflags.EnumVariable(1), - "template-spray": goflags.EnumVariable(2), + scanstrategy.Auto.String(): goflags.EnumVariable(0), + scanstrategy.HostSpray.String(): goflags.EnumVariable(1), + scanstrategy.TemplateSpray.String(): goflags.EnumVariable(2), }), flagSet.DurationVarP(&options.InputReadTimeout, "input-read-timeout", "irt", time.Duration(3*time.Minute), "timeout on input read"), flagSet.BoolVarP(&options.DisableHTTPProbe, "no-httpx", "nh", false, "disable httpx probing for non-url input"), @@ -334,7 +335,7 @@ on extensive configurability, massive extensibility and ease of use.`) _ = flagSet.Parse() gologger.DefaultLogger.SetTimestamp(options.Timestamp, levels.LevelDebug) - + if options.LeaveDefaultPorts { http.LeaveDefaultPorts = true } diff --git a/v2/cmd/sign-templates/main.go b/v2/cmd/sign-templates/main.go index 3c1e800c..964d5ce3 100644 --- a/v2/cmd/sign-templates/main.go +++ b/v2/cmd/sign-templates/main.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" "github.com/projectdiscovery/goflags" + "github.com/projectdiscovery/nuclei/v2/pkg/templates/extensions" "github.com/projectdiscovery/nuclei/v2/pkg/templates/signer" stringsutil "github.com/projectdiscovery/utils/strings" ) @@ -90,7 +91,7 @@ func processItem(sign *signer.Signer, item string) error { func processFile(sign *signer.Signer, filePath string) error { ext := filepath.Ext(filePath) - if !stringsutil.EqualFoldAny(ext, ".yaml") { + if !stringsutil.EqualFoldAny(ext, extensions.YAML) { return nil } err := signTemplate(sign, filePath) diff --git a/v2/examples/simple.go b/v2/examples/simple.go index c23b0d3b..129561fa 100644 --- a/v2/examples/simple.go +++ b/v2/examples/simple.go @@ -31,7 +31,7 @@ import ( ) func main() { - cache := hosterrorscache.New(30, hosterrorscache.DefaultMaxHostsCount) + cache := hosterrorscache.New(30, hosterrorscache.DefaultMaxHostsCount, nil) defer cache.Close() mockProgress := &testutils.MockProgressClient{} diff --git a/v2/go.mod b/v2/go.mod index 90510aed..086f4301 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -11,7 +11,7 @@ require ( github.com/blang/semver v3.5.1+incompatible github.com/bluele/gcache v0.0.2 github.com/corpix/uarand v0.2.0 - github.com/go-playground/validator/v10 v10.11.1 + github.com/go-playground/validator/v10 v10.11.2 github.com/go-rod/rod v0.112.4 github.com/gobwas/ws v1.1.0 github.com/google/go-github v17.0.0+incompatible @@ -20,18 +20,18 @@ require ( github.com/julienschmidt/httprouter v1.3.0 github.com/karlseguin/ccache v2.0.3+incompatible github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/miekg/dns v1.1.50 + github.com/miekg/dns v1.1.52 github.com/olekukonko/tablewriter v0.0.5 github.com/pkg/errors v0.9.1 github.com/projectdiscovery/clistats v0.0.12 - github.com/projectdiscovery/fastdialer v0.0.22 - github.com/projectdiscovery/hmap v0.0.8 - github.com/projectdiscovery/interactsh v1.0.6-0.20220827132222-460cc6270053 + github.com/projectdiscovery/fastdialer v0.0.24 + github.com/projectdiscovery/hmap v0.0.10 + github.com/projectdiscovery/interactsh v1.1.0 github.com/projectdiscovery/rawhttp v0.1.9 github.com/projectdiscovery/retryabledns v1.0.21 - github.com/projectdiscovery/retryablehttp-go v1.0.12-0.20230220094538-f406add578ab + github.com/projectdiscovery/retryablehttp-go v1.0.13 github.com/projectdiscovery/stringsutil v0.0.2 - github.com/projectdiscovery/yamldoc-go v1.0.3-0.20211126104922-00d2c6bb43b6 + github.com/projectdiscovery/yamldoc-go v1.0.4 github.com/remeh/sizedwaitgroup v1.0.0 github.com/rs/xid v1.4.0 github.com/segmentio/ksuid v1.0.4 @@ -43,9 +43,9 @@ require ( github.com/valyala/fasttemplate v1.2.2 github.com/weppos/publicsuffix-go v0.20.0 github.com/xanzy/go-gitlab v0.80.2 - go.uber.org/multierr v1.9.0 - golang.org/x/net v0.7.0 - golang.org/x/oauth2 v0.4.0 + go.uber.org/multierr v1.10.0 + golang.org/x/net v0.8.0 + golang.org/x/oauth2 v0.6.0 golang.org/x/text v0.8.0 gopkg.in/yaml.v2 v2.4.0 moul.io/http2curl v1.0.0 @@ -54,7 +54,7 @@ require ( require ( github.com/DataDog/gostackparse v0.6.0 github.com/antchfx/xmlquery v1.3.15 - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/aws/aws-sdk-go-v2 v1.17.5 github.com/aws/aws-sdk-go-v2/config v1.18.15 github.com/aws/aws-sdk-go-v2/credentials v1.13.15 @@ -71,7 +71,7 @@ require ( github.com/mholt/archiver v3.1.1+incompatible github.com/mitchellh/go-homedir v1.1.0 github.com/projectdiscovery/fasttemplate v0.0.2 - github.com/projectdiscovery/goflags v0.1.7 + github.com/projectdiscovery/goflags v0.1.8 github.com/projectdiscovery/gologger v1.1.8 github.com/projectdiscovery/httpx v1.2.7 github.com/projectdiscovery/mapcidr v1.1.0 @@ -79,9 +79,9 @@ require ( github.com/projectdiscovery/ratelimit v0.0.6 github.com/projectdiscovery/rdap v0.9.1-0.20221108103045-9865884d1917 github.com/projectdiscovery/sarif v0.0.1 - github.com/projectdiscovery/tlsx v1.0.5 + github.com/projectdiscovery/tlsx v1.0.6 github.com/projectdiscovery/uncover v1.0.2 - github.com/projectdiscovery/utils v0.0.13 + github.com/projectdiscovery/utils v0.0.16 github.com/projectdiscovery/wappalyzergo v0.0.81 github.com/stretchr/testify v1.8.2 gopkg.in/src-d/go-git.v4 v4.13.1 @@ -94,28 +94,23 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.24 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.23 // indirect - github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.3.1 // indirect github.com/bits-and-blooms/bloom/v3 v3.3.1 // indirect github.com/cloudflare/cfssl v1.6.4-0.20221208165709-c5e40da60306 // indirect github.com/cloudflare/circl v1.1.0 // indirect - github.com/dlclark/regexp2 v1.4.0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/dlclark/regexp2 v1.8.1 // indirect github.com/google/certificate-transparency-go v1.1.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/karlseguin/expect v1.0.8 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mackerelio/go-osstat v0.2.3 // indirect github.com/pjbgf/sha1cd v0.2.3 // indirect - github.com/projectdiscovery/asnmap v1.0.1 // indirect + github.com/projectdiscovery/asnmap v1.0.2 // indirect github.com/projectdiscovery/cdncheck v0.0.4-0.20220413175814-b47bc2d578b1 // indirect github.com/projectdiscovery/freeport v0.0.4 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect github.com/skeema/knownhosts v1.1.0 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect github.com/tidwall/btree v1.6.0 // indirect github.com/tidwall/buntdb v1.2.10 // indirect github.com/tidwall/gjson v1.14.4 // indirect @@ -130,10 +125,9 @@ require ( require ( git.mills.io/prologic/smtpd v0.0.0-20210710122116-a525b76c287a // indirect - github.com/DataDog/zstd v1.5.2 // indirect github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809 // indirect github.com/Mzack9999/ldapserver v1.0.2-0.20211229000134-b44a0d6ad0dd // indirect - github.com/PuerkitoBio/goquery v1.8.0 // indirect + github.com/PuerkitoBio/goquery v1.8.1 // indirect github.com/akrylysov/pogreb v0.10.1 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect @@ -141,26 +135,20 @@ require ( github.com/antchfx/xpath v1.2.3 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/c4milo/unpackit v0.1.0 // indirect - github.com/caddyserver/certmagic v0.16.3 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/caddyserver/certmagic v0.17.2 // indirect github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230207164304-7d1e4ba7ffd0 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect github.com/dsnet/compress v0.0.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect github.com/goburrow/cache v0.1.4 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect @@ -172,10 +160,8 @@ require ( github.com/hdm/jarm-go v0.0.7 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect github.com/itchyny/timefmt-go v0.1.5 // indirect - github.com/klauspost/cpuid/v2 v2.1.0 // indirect + github.com/klauspost/cpuid/v2 v2.1.1 // indirect github.com/klauspost/pgzip v1.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/libdns/libdns v0.2.1 // indirect github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3 // indirect @@ -183,15 +169,14 @@ require ( github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mholt/acmez v1.0.4 // indirect - github.com/microcosm-cc/bluemonday v1.0.22 // indirect + github.com/microcosm-cc/bluemonday v1.0.23 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/projectdiscovery/blackrock v0.0.0-20221025011524-9e4efe804fb4 // indirect github.com/projectdiscovery/networkpolicy v0.0.4 - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect @@ -207,16 +192,16 @@ require ( github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 // indirect github.com/zmap/zcrypto v0.0.0-20230205235340-d51ce4775101 // indirect go.etcd.io/bbolt v1.3.7 // indirect - go.uber.org/zap v1.23.0 // indirect + go.uber.org/zap v1.24.0 // indirect goftp.io/server/v2 v2.0.0 // indirect - golang.org/x/crypto v0.6.0 - golang.org/x/exp v0.0.0-20230206171751-46f607a40771 - golang.org/x/mod v0.8.0 // indirect - golang.org/x/sys v0.5.0 // indirect + golang.org/x/crypto v0.7.0 + golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 + golang.org/x/mod v0.9.0 // indirect + golang.org/x/sys v0.6.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.7.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.29.1 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect gopkg.in/corvus-ch/zbase32.v1 v1.0.0 // indirect ) diff --git a/v2/go.sum b/v2/go.sum index 99e74ada..b3f4e830 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -1,15 +1,7 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= git.mills.io/prologic/smtpd v0.0.0-20210710122116-a525b76c287a h1:3i+FJ7IpSZHL+VAjtpQeZCRhrpP0odl5XfoLBY4fxJ8= git.mills.io/prologic/smtpd v0.0.0-20210710122116-a525b76c287a/go.mod h1:C7hXLmFmPYPjIDGfQl1clsmQ5TMEQfmzWTrJk475bUs= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/gostackparse v0.6.0 h1:egCGQviIabPwsyoWpGvIBGrEnNWez35aEO7OJ1vBI4o= github.com/DataDog/gostackparse v0.6.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= @@ -21,13 +13,11 @@ github.com/Mzack9999/ldapserver v1.0.2-0.20211229000134-b44a0d6ad0dd/go.mod h1:A github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 h1:ra2OtmuW0AE5csawV4YXMNGNQQXvLRps3z2Z59OPO+I= github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= github.com/PuerkitoBio/goquery v1.6.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= -github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= +github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= +github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/RumbleDiscovery/rumble-tools v0.0.0-20201105153123-f2adbb3244d2/go.mod h1:jD2+mU+E2SZUuAOHZvZj4xP4frlOo+N/YrXDvASFhkE= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w= github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= @@ -60,11 +50,11 @@ github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v1.17.5 h1:TzCUW1Nq4H8Xscph5M/skINUitxM5UBAyvm2s7XBzL4= github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= @@ -107,11 +97,8 @@ github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.3.1 h1:y+qrlmq3XsWi+xZqSaueaE8ry8Y127iMxlMfqcK8p0g= github.com/bits-and-blooms/bitset v1.3.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bloom/v3 v3.3.1 h1:K2+A19bXT8gJR5mU7y+1yW6hsKfNCjcP2uNfLFKncjQ= @@ -125,69 +112,35 @@ github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67 github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/c4milo/unpackit v0.1.0 h1:91pWJ6B3svZ4LOE+p3rnyucRK5fZwBdF/yQ/pcZO31I= github.com/c4milo/unpackit v0.1.0/go.mod h1:pvXCMYlSV8zwGFWMaT+PWYkAB/cvDjN2mv9r7ZRSxEo= -github.com/caddyserver/certmagic v0.16.3 h1:1ZbiU7y5X0MnDjBTXywUbPMs/ScHbgCeeCy/LPh4IZk= -github.com/caddyserver/certmagic v0.16.3/go.mod h1:pSS2aZcdKlrTZrb2DKuRafckx20o5Fz1EdDKEB8KOQM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/caddyserver/certmagic v0.17.2 h1:o30seC1T/dBqBCNNGNHWwj2i5/I/FMjBbTAhjADP3nE= +github.com/caddyserver/certmagic v0.17.2/go.mod h1:ouWUuC490GOLJzkyN35eXfV8bSbwMwSf4bdhkIxtdQE= github.com/cloudflare/cfssl v1.6.4-0.20221208165709-c5e40da60306 h1:4ifuHhCvT09M+E/lX56KvQsFKSfOd077aYS1sNXa6UY= github.com/cloudflare/cfssl v1.6.4-0.20221208165709-c5e40da60306/go.mod h1:4TQEp/C5L83FVh5G/2edJy2rQ/rqw7r1ze2D2rgrzTs= github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230207164304-7d1e4ba7ffd0 h1:m2/PDCdtaaNbs1EujshCCTIiwp2WA8WDokNgtcHaLMA= -github.com/cockroachdb/pebble v0.0.0-20230207164304-7d1e4ba7ffd0/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/corpix/uarand v0.2.0 h1:U98xXwud/AVuCpkpgfPF7J5TQgr7R5tqT8VZP5KWbzE= github.com/corpix/uarand v0.2.0/go.mod h1:/3Z1QIqWkDIhf6XWn/08/uMHoQ8JUoTIKc2iPchBOmM= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= -github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= -github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.8.1 h1:6Lcdwya6GjPUNsBct8Lg/yRPwMhABj269AAzdGSiR+0= +github.com/dlclark/regexp2 v1.8.1/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -196,18 +149,9 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= @@ -218,71 +162,44 @@ github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6 github.com/go-git/go-git/v5 v5.5.2 h1:v8lgZa5k9ylUw+OR/roJHTxR4QItsNFI5nKtAXFuynw= github.com/go-git/go-git/v5 v5.5.2/go.mod h1:BE5hUJ5yaV2YMxhmaP4l6RBQ08kMxKSPD4BlxtH7OjI= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= +github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= github.com/go-rod/rod v0.112.4 h1:Ck002nM6rCORdVFtD778WxiadS5oJsmqytjXTG5bqiQ= github.com/go-rod/rod v0.112.4/go.mod h1:ElViL9ABbcshNQw93+11FrYRH92RRhMKleuILo6+5V0= github.com/goburrow/cache v0.1.4 h1:As4KzO3hgmzPlnaMniZU9+VmoNYseUhuELbxy9mRBfw= github.com/goburrow/cache v0.1.4/go.mod h1:cDFesZDnIlrHoNlMYqqMpCRawuXulgx+y7mXU8HZ+/c= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/certificate-transparency-go v1.1.4 h1:hCyXHDbtqlr/lMXU0D4WgbalXL0Zk4dSWWMbPV8VrqY= github.com/google/certificate-transparency-go v1.1.4/go.mod h1:D6lvbfwckhNrbM9WVl1EVeMOyzC19mpIjMOI4nxBHtQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -296,16 +213,13 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uilive v0.0.4 h1:hUEBpQDj8D8jXgtCdBu7sWsy5sbW/5GhuO8KBwJ2jyY= github.com/gosuri/uilive v0.0.4/go.mod h1:V/epo5LjjlDE5RJUcqx8dbw+zc93y5Ya3yg8tfZ74VI= github.com/gosuri/uiprogress v0.0.1 h1:0kpv/XY/qTmFWl/SkaJykZXrBBzwwadmW8fRb7RJSxw= @@ -319,14 +233,12 @@ github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxC github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf h1:umfGUaWdFP2s6457fz1+xXYIWDxdGc7HdkLS9aJ1skk= github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf/go.mod h1:V99KdStnMHZsvVOwIvhfcUzYgYkRZeQWUtumtL+SKxA= github.com/hdm/jarm-go v0.0.7 h1:Eq0geenHrBSYuKrdVhrBdMMzOmA+CAMLzN2WrF3eL6A= @@ -334,19 +246,10 @@ github.com/hdm/jarm-go v0.0.7/go.mod h1:kinGoS0+Sdn1Rr54OtanET5E5n7AlD6T6CrJAKDj github.com/hooklift/assert v0.1.0 h1:UZzFxx5dSb9aBtvMHTtnPuvFnBvcEhHTPb9+0+jpEjs= github.com/hooklift/assert v0.1.0/go.mod h1:pfexfvIHnKCdjh6CkkIZv5ic6dQ6aU2jhKghBlXuwwY= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/itchyny/gojq v0.12.11 h1:YhLueoHhHiN4mkfM+3AyJV6EPcCxKZsOnYf+aVSwaQw= github.com/itchyny/gojq v0.12.11/go.mod h1:o3FT8Gkbg/geT4pLI0tF3hvip5F3Y/uskjRz9OYa38g= github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE= @@ -364,41 +267,28 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karlseguin/ccache v2.0.3+incompatible h1:j68C9tWOROiOLWTS/kCGg9IcJG+ACqn5+0+t8Oh83UU= github.com/karlseguin/ccache v2.0.3+incompatible/go.mod h1:CM9tNPzT6EdRh14+jiW8mEF9mkNZuuE51qmgGYUB93w= github.com/karlseguin/ccache/v2 v2.0.8 h1:lT38cE//uyf6KcFok0rlgXtGFBWxkI6h/qg4tbFyDnA= github.com/karlseguin/expect v1.0.8 h1:Bb0H6IgBWQpadY25UDNkYPDB9ITqK1xnSoZfAq362fw= github.com/karlseguin/expect v1.0.8/go.mod h1:lXdI8iGiQhmzpnnmU/EGA60vqKs8NbRNFnhhrJGoD5g= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/jwt v0.1.8 h1:u71baOsYD22HWeSOg32tCHbczPjdCk7V4MMeJqTtmGk= github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= +github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -406,18 +296,14 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= @@ -430,20 +316,17 @@ github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3 h1:wIONC+HMNRqmWBjuM github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3/go.mod h1:37YR9jabpiIxsb8X9VCIx8qFOjTDIIrIHHODa8C4gz0= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mackerelio/go-osstat v0.2.3 h1:jAMXD5erlDE39kdX2CU7YwCGRcxIO33u/p8+Fhe5dJw= +github.com/mackerelio/go-osstat v0.2.3/go.mod h1:DQbPOnsss9JHIXgBStc/dnhhir3gbd3YH+Dbdi7ptMA= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= @@ -451,40 +334,27 @@ github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mholt/acmez v1.0.4 h1:N3cE4Pek+dSolbsofIkAYz6H1d3pE+2G0os7QHslf80= github.com/mholt/acmez v1.0.4/go.mod h1:qFGLZ4u+ehWINeJZjzPlsnjJBCPAADWTcIqE/7DAYQY= github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/microcosm-cc/bluemonday v1.0.22 h1:p2tT7RNzRdCi0qmwxG+HbqD6ILkmwter1ZwVZn1oTxA= -github.com/microcosm-cc/bluemonday v1.0.22/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.52 h1:Bmlc/qsNNULOe6bpXcUTsuOajd0DzRHwup6D9k1An0c= +github.com/miekg/dns v1.1.52/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/minio/minio-go/v6 v6.0.46/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.2 h1:Cj0yZY6T1Zx1R7AhTbyGSALm44/Mmq+BAPc4B/p/d3M= @@ -494,23 +364,17 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pjbgf/sha1cd v0.2.3 h1:uKQP/7QOzNtKYH7UTohZLcjF5/55EnTw0jO/Ru4jZwI= github.com/pjbgf/sha1cd v0.2.3/go.mod h1:HOK9QrgzdHpbc2Kzip0Q1yi3M2MFGPADtR6HjG65m5M= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -518,32 +382,32 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/projectdiscovery/asnmap v1.0.1 h1:mRFrFulfI5ZjYx0uyWcWKyCPRExDXInmBKpZlwxwRgE= -github.com/projectdiscovery/asnmap v1.0.1/go.mod h1:qEowdtLF9JQqQ4/tHTt1HGAY0RnanLfU9DcAvrLic0o= +github.com/projectdiscovery/asnmap v1.0.2 h1:2+8tqzJeFVpJS7u27YH7kMK7edDAr7OsmSxs92aWFNc= +github.com/projectdiscovery/asnmap v1.0.2/go.mod h1:64YfriVxyRQvqc+1iPMHMf+i/of2jr+Qx7geCIm4ZsU= github.com/projectdiscovery/blackrock v0.0.0-20221025011524-9e4efe804fb4 h1:EsrQ/zkotVodSJLOch3pV/UYt1vQcwyIs5HX0sm1ljE= github.com/projectdiscovery/blackrock v0.0.0-20221025011524-9e4efe804fb4/go.mod h1:5tNGQP9kOfW+X5+40pZP8aqPYLHs45nJkFaSHLxdeH8= github.com/projectdiscovery/cdncheck v0.0.4-0.20220413175814-b47bc2d578b1 h1:QtTPPx0uu42AsQJiXT86/wqdHS7/iVcgz1VM38tjv20= github.com/projectdiscovery/cdncheck v0.0.4-0.20220413175814-b47bc2d578b1/go.mod h1:EevMeCG1ogBoUJYaa0Mv9R1VUboDm/DiynId7DboKy0= github.com/projectdiscovery/clistats v0.0.12 h1:KLYJxpiwEFidduU4PbcwEcCQ2L7c5wrf7DI5IN5fZ+8= github.com/projectdiscovery/clistats v0.0.12/go.mod h1:9luKJj+7Hjq3+a7g129sKWRYx4SbTdkUWZQxabn3H5Y= -github.com/projectdiscovery/fastdialer v0.0.22 h1:uiTgIfGcZAGrPzmCI8kZJtaJRWdiB6uUz5iTbUBNu4w= -github.com/projectdiscovery/fastdialer v0.0.22/go.mod h1:voh0atf8ulFu99jRVCXIpEwgClD2aHBT6R3RH6zojmU= +github.com/projectdiscovery/fastdialer v0.0.24 h1:yEyYALCmDQpPYWttZ4uo9AJseqt4mYWcyx3s9WYzqW8= +github.com/projectdiscovery/fastdialer v0.0.24/go.mod h1:X7zZy3BGdGoprR6CftHKeJyV86a3OjSAlJcNU7FL26E= github.com/projectdiscovery/fasttemplate v0.0.2 h1:h2cISk5xDhlJEinlBQS6RRx0vOlOirB2y3Yu4PJzpiA= github.com/projectdiscovery/fasttemplate v0.0.2/go.mod h1:XYWWVMxnItd+r0GbjA1GCsUopMw1/XusuQxdyAIHMCw= github.com/projectdiscovery/fileutil v0.0.3 h1:GSsoey4p8ZHIRxWF2VXh4mhLr+wfEkpJwvF0Dxpn/gg= github.com/projectdiscovery/fileutil v0.0.3/go.mod h1:GLejWd3YerG3RNYD/Hk2pJlytlYRgHdkWfWUAdCH2YQ= github.com/projectdiscovery/freeport v0.0.4 h1:H4VrK/7hUcC1zbg46zv9iSMBACBDpUqcHkV+FUyXISw= github.com/projectdiscovery/freeport v0.0.4/go.mod h1:PY0bxSJ34HVy67LHIeF3uIutiCSDwOqKD8ruBkdiCwE= -github.com/projectdiscovery/goflags v0.1.7 h1:KvMs1KnXMWRhJiJj6K+cWurTWpbDYYlo+1cyGvf1YCc= -github.com/projectdiscovery/goflags v0.1.7/go.mod h1:yILgA7gbrHuTpIvMfikbivzoxkyxBD1Y5/PRHiGTIFk= +github.com/projectdiscovery/goflags v0.1.8 h1:Urhm2Isq2BdRt8h4h062lHKYXO65RHRjGTDSkUwex/g= +github.com/projectdiscovery/goflags v0.1.8/go.mod h1:Yxi9tclgwGczzDU65ntrwaIql5cXeTvW5j2WxFuF+Jk= github.com/projectdiscovery/gologger v1.1.8 h1:CFlCzGlqAhPqWIrAXBt1OVh5jkMs1qgoR/z4xhdzLNE= github.com/projectdiscovery/gologger v1.1.8/go.mod h1:bNyVaC1U/NpJtFkJltcesn01NR3K8Hg6RsLVce6yvrw= -github.com/projectdiscovery/hmap v0.0.8 h1:4Jn3H0gHeibJAvJuyVIZMszzALOurd8PKmgRrXfuhLc= -github.com/projectdiscovery/hmap v0.0.8/go.mod h1:6V6eZru59wNZVtJB/NeiGUaZxBIR8vD97Ok2o9mXsyk= +github.com/projectdiscovery/hmap v0.0.10 h1:O6ALGW3BK+FmknLXW7ENwQevLs+faRJuoRbDtakZZus= +github.com/projectdiscovery/hmap v0.0.10/go.mod h1:xdtyejCgl5LJW7yz7nf/ut32tWuV/l7FjUzItiCtJIg= github.com/projectdiscovery/httpx v1.2.7 h1:rDB+uKpWE/e6nuLDM341ZNzaaMgwcEcc+A9Q5R6RL3s= github.com/projectdiscovery/httpx v1.2.7/go.mod h1:QW8mKw6PzMBb62T5fT9w75hhVBcjoyyVTDJhefZcX50= -github.com/projectdiscovery/interactsh v1.0.6-0.20220827132222-460cc6270053 h1:8Dr2q8BWxNgG5EO/YTyNyL83xzmYSDwysx4pMZzZx7I= -github.com/projectdiscovery/interactsh v1.0.6-0.20220827132222-460cc6270053/go.mod h1:7lLz3Rt+Lxt8xhK0EUYkgxoa9RXRL3honxHeAu+ivuk= +github.com/projectdiscovery/interactsh v1.1.0 h1:WXCwvInO2LgOURRr08rr601S5ruzMpoPIVXFRNZpwAE= +github.com/projectdiscovery/interactsh v1.1.0/go.mod h1:49THEmeKNQIU1uV/NxxXEY9u8uNtJ4LMw0A8bxZSKuM= github.com/projectdiscovery/iputil v0.0.2 h1:f6IGnZF4RImJLysPSPG3D84jyTH34q3lihCFeP+eZzI= github.com/projectdiscovery/iputil v0.0.2/go.mod h1:J3Pcz1q51pi4/JL871mQztg0KOzyWDPxnPLOYJm2pVQ= github.com/projectdiscovery/mapcidr v1.1.0 h1:Yeb+CGVsRYvHmZ9YSHb9iy4tzY9YuOm3oTFX/xzGhVU= @@ -560,51 +424,34 @@ github.com/projectdiscovery/rdap v0.9.1-0.20221108103045-9865884d1917 h1:m03X4gB github.com/projectdiscovery/rdap v0.9.1-0.20221108103045-9865884d1917/go.mod h1:JxXtZC9e195awe7EynrcnBJmFoad/BNDzW9mzFkK8Sg= github.com/projectdiscovery/retryabledns v1.0.21 h1:vOpPQR1q8Z824uoA8JXCI/RyvDAssPeD68Onz9hP/ds= github.com/projectdiscovery/retryabledns v1.0.21/go.mod h1:6oTPKMRlKZ7lIIEzTH723K6RvNRjmm6fe9br4Dom3UI= -github.com/projectdiscovery/retryablehttp-go v1.0.12-0.20230220094538-f406add578ab h1:OYcKjr6Oi71cpr4LmH0C3ufPKcmk1I4IchkTnpE76oA= -github.com/projectdiscovery/retryablehttp-go v1.0.12-0.20230220094538-f406add578ab/go.mod h1:dnJK347etdVKz7ljhemUhBK6EpDnVf0U1O8dGj7MM+0= +github.com/projectdiscovery/retryablehttp-go v1.0.13 h1:gKxd/J08Dxc8a/LFvTz9+JUedEvivH3PoDnQQEHAY4M= +github.com/projectdiscovery/retryablehttp-go v1.0.13/go.mod h1:L5HwtGSvc0E3dNVtVqPACWOmr21Bbop2ZhpbCPYEeYU= github.com/projectdiscovery/sarif v0.0.1 h1:C2Tyj0SGOKbCLgHrx83vaE6YkzXEVrMXYRGLkKCr/us= github.com/projectdiscovery/sarif v0.0.1/go.mod h1:cEYlDu8amcPf6b9dSakcz2nNnJsoz4aR6peERwV+wuQ= github.com/projectdiscovery/stringsutil v0.0.2 h1:uzmw3IVLJSMW1kEg8eCStG/cGbYYZAja8BH3LqqJXMA= github.com/projectdiscovery/stringsutil v0.0.2/go.mod h1:EJ3w6bC5fBYjVou6ryzodQq37D5c6qbAYQpGmAy+DC0= -github.com/projectdiscovery/tlsx v1.0.5 h1:ZDMcwqjwXB0x2XBzvdra7HYiN8yLGBhHc5qE2mjJchM= -github.com/projectdiscovery/tlsx v1.0.5/go.mod h1:4/jsS5OIawsJ11sWWLpBHJV3vTZltB8otwxfi56hROM= +github.com/projectdiscovery/tlsx v1.0.6 h1:omMbtedk4BjXtauPpB9Y+FQml9cVthOnIxOMKHIrxm8= +github.com/projectdiscovery/tlsx v1.0.6/go.mod h1:9PTwYVVbaLYpNIwZIvgVxJzctbiemM/pgukkOb3/4wY= github.com/projectdiscovery/uncover v1.0.2 h1:mRFzflYyvwKkHd3XKufMlDRrb6p1mjFZTSHoNAUpFwo= github.com/projectdiscovery/uncover v1.0.2/go.mod h1:lz4QYfArSA6jJkXyB71kN2/Pc7IW7nJB8c95n7xtwqY= -github.com/projectdiscovery/utils v0.0.13 h1:Bvguo7avXN+Zs9tHL+8+Qld65nwIE8Kr9qddErDDqmw= -github.com/projectdiscovery/utils v0.0.13/go.mod h1:2CyxZXcx62NUiGJZZam23CpphqXy3kaomE9uvgHgkEo= +github.com/projectdiscovery/utils v0.0.16 h1:7vmi3haCyM3vk0yXSLjoid4p2/7bo042rcmG4Dtk+Sk= +github.com/projectdiscovery/utils v0.0.16/go.mod h1:Cu216AlQ7rAYa8aDBqB2OgNfu5p24Uj+tG9RxV8Wbfs= github.com/projectdiscovery/wappalyzergo v0.0.81 h1:i7WYrH+O2EoHbY1g/WnrxO4YF/0OkA/G1bw6z8WKcjA= github.com/projectdiscovery/wappalyzergo v0.0.81/go.mod h1:HvYuW0Be4JCjVds/+XAEaMSqRG9yrI97UmZq0TPk6A0= -github.com/projectdiscovery/yamldoc-go v1.0.3-0.20211126104922-00d2c6bb43b6 h1:DvWRQpw7Ib2CRL3ogYm/BWM+X0UGPfz1n9Ix9YKgFM8= -github.com/projectdiscovery/yamldoc-go v1.0.3-0.20211126104922-00d2c6bb43b6/go.mod h1:8OfZj8p/axkUM/TJoS/O9LDjj/S8u17rxRbqluE9CU4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/projectdiscovery/yamldoc-go v1.0.4 h1:eZoESapnMw6WAHiVgRwNqvbJEfNHEH148uthhFbG5jE= +github.com/projectdiscovery/yamldoc-go v1.0.4/go.mod h1:8PIPRcUD55UbtQdcfFR1hpIGRWG0P7alClXNGt1TBik= github.com/remeh/sizedwaitgroup v1.0.0 h1:VNGGFwNo/R5+MJBf6yrsr110p0m4/OX4S3DCy7Kyl5E= github.com/remeh/sizedwaitgroup v1.0.0/go.mod h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -613,7 +460,6 @@ github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil/v3 v3.22.12 h1:oG0ns6poeUSxf78JtOsfygNWuEHYYz8hnnNg7P04TJs= github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -629,14 +475,8 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -648,7 +488,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -695,10 +534,6 @@ github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -706,15 +541,11 @@ github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulule/deepcopier v0.0.0-20200430083143-45decc6639b6 h1:TtyC78WMafNW8QFfv3TeP3yWNDG+uxNkk9vOrnDu6JA= github.com/ulule/deepcopier v0.0.0-20200430083143-45decc6639b6/go.mod h1:h8272+G2omSmi30fBXiZDMkmHuOgonplfKIKjQWzlfs= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/weppos/publicsuffix-go v0.12.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= github.com/weppos/publicsuffix-go v0.15.1-0.20220724114530-e087fba66a37/go.mod h1:5ZC/Uv3fIEUE0eP6o9+Yg4+5+W8V0/BieMi05feGXVA= github.com/weppos/publicsuffix-go v0.20.0 h1:59ypvSUbW3Dunc6zVm+v+MmXf2Q6cGiNDkxgRIzEnaA= @@ -727,13 +558,8 @@ github.com/xanzy/go-gitlab v0.80.2/go.mod h1:DlByVTSXhPsJMYL6+cm8e8fTJjeBmhrXdC/ github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ= @@ -746,11 +572,6 @@ github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE= github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg= github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak= github.com/ysmood/leakless v0.8.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= @@ -769,78 +590,53 @@ go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0 go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= goftp.io/server/v2 v2.0.0 h1:FF8JKXXKDxAeO1uXEZz7G+IZwCDhl19dpVIlDtp3QAg= goftp.io/server/v2 v2.0.0/go.mod h1:7+H/EIq7tXdfo1Muu5p+l3oQ6rYkDZ8lY7IM5d5kVdQ= -golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 h1:LGJsf5LRplCck6jUCH3dBL2dmycNruWNF5xugkSlfXw= +golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200528225125-3c3fba18258b/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -849,40 +645,28 @@ golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -890,20 +674,16 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -916,8 +696,9 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -926,75 +707,40 @@ golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1007,14 +753,8 @@ gopkg.in/corvus-ch/zbase32.v1 v1.0.0 h1:K4u1NprbDNvKPczKfHLbwdOWHTZ0zfv2ow71H1nR gopkg.in/corvus-ch/zbase32.v1 v1.0.0/go.mod h1:T3oKkPOm4AV/bNXCNFUxRmlE9RUyBz/DSo0nK9U+c0Y= gopkg.in/djherbis/times.v1 v1.3.0 h1:uxMS4iMtH6Pwsxog094W0FYldiNnfY/xba00vq6C2+o= gopkg.in/djherbis/times.v1 v1.3.0/go.mod h1:AQlg6unIsrsCEdQYhTzERy542dz6SFdQFZFv6mUY0P8= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= @@ -1032,15 +772,11 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= moul.io/http2curl v1.0.0 h1:6XwpyZOYsgZJrU8exnG87ncVkU1FVCcTRpwzOkTDUi8= moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= diff --git a/v2/internal/runner/cloud.go b/v2/internal/runner/cloud.go index 54c5fc6d..ce40b30c 100644 --- a/v2/internal/runner/cloud.go +++ b/v2/internal/runner/cloud.go @@ -15,6 +15,7 @@ import ( "github.com/projectdiscovery/gologger" "github.com/projectdiscovery/nuclei/v2/internal/runner/nucleicloud" "github.com/projectdiscovery/nuclei/v2/pkg/output" + "github.com/projectdiscovery/nuclei/v2/pkg/templates/extensions" ) // Get all the scan lists for a user/apikey. @@ -266,7 +267,7 @@ func (r *Runner) addTemplate(location string) error { if err != nil { return err } - if d.IsDir() || !strings.EqualFold(filepath.Ext(path), ".yaml") { + if d.IsDir() || !strings.EqualFold(filepath.Ext(path), extensions.YAML) { return nil } base := filepath.Base(path) @@ -337,7 +338,7 @@ func (r *Runner) removeTemplate(item string) error { var err error if ID, parseErr := strconv.ParseInt(item, 10, 64); parseErr == nil { err = r.cloudClient.RemoveTemplate(ID, "") - } else if strings.EqualFold(path.Ext(item), ".yaml") { + } else if strings.EqualFold(path.Ext(item), extensions.YAML) { err = r.cloudClient.RemoveTemplate(0, item) } else { return r.removeTemplatePrefix(item) diff --git a/v2/internal/runner/options.go b/v2/internal/runner/options.go index cf7e1f3a..c1603a47 100644 --- a/v2/internal/runner/options.go +++ b/v2/internal/runner/options.go @@ -22,7 +22,6 @@ import ( "github.com/projectdiscovery/nuclei/v2/pkg/types" "github.com/projectdiscovery/stringsutil" fileutil "github.com/projectdiscovery/utils/file" - logutil "github.com/projectdiscovery/utils/log" ) func ConfigureOptions() error { @@ -251,7 +250,7 @@ func configureOutput(options *types.Options) { } // disable standard logger (ref: https://github.com/golang/go/issues/19895) - logutil.DisableDefaultLogger() + // logutil.DisableDefaultLogger() } // loadResolvers loads resolvers from both user provided flag and file diff --git a/v2/internal/runner/runner.go b/v2/internal/runner/runner.go index 22f207b2..e330d60b 100644 --- a/v2/internal/runner/runner.go +++ b/v2/internal/runner/runner.go @@ -411,7 +411,7 @@ func (r *Runner) RunEnumeration() error { } if r.options.ShouldUseHostError() { - cache := hosterrorscache.New(r.options.MaxHostError, hosterrorscache.DefaultMaxHostsCount) + cache := hosterrorscache.New(r.options.MaxHostError, hosterrorscache.DefaultMaxHostsCount, r.options.TrackError) cache.SetVerbose(r.options.Verbose) r.hostErrors = cache executerOpts.HostErrorsCache = cache @@ -792,8 +792,10 @@ func (r *Runner) countNewTemplates() int { return count } +// isTemplate is a callback function used by goflags to decide if given file should be read +// if it is not a nuclei-template file only then file is read func isTemplate(filename string) bool { - return stringsutil.EqualFoldAny(filepath.Ext(filename), templates.TemplateExtension) + return stringsutil.EqualFoldAny(filepath.Ext(filename), config.GetSupportTemplateFileExtensions()...) } // SaveResumeConfig to file diff --git a/v2/pkg/catalog/config/template.go b/v2/pkg/catalog/config/template.go new file mode 100644 index 00000000..b36bd777 --- /dev/null +++ b/v2/pkg/catalog/config/template.go @@ -0,0 +1,35 @@ +package config + +import ( + "path/filepath" + "strings" + + "github.com/projectdiscovery/nuclei/v2/pkg/templates/extensions" +) + +// TemplateFormat +type TemplateFormat uint8 + +const ( + YAML TemplateFormat = iota + JSON + Unknown +) + +// GetTemplateFormatFromExt returns template format +func GetTemplateFormatFromExt(filePath string) TemplateFormat { + fileExt := strings.ToLower(filepath.Ext(filePath)) + switch fileExt { + case extensions.JSON: + return JSON + case extensions.YAML: + return YAML + default: + return Unknown + } +} + +// GetSupportedTemplateFileExtensions returns all supported template file extensions +func GetSupportTemplateFileExtensions() []string { + return []string{extensions.YAML, extensions.JSON} +} diff --git a/v2/pkg/catalog/disk/find.go b/v2/pkg/catalog/disk/find.go index 9c1dff46..8dee267a 100644 --- a/v2/pkg/catalog/disk/find.go +++ b/v2/pkg/catalog/disk/find.go @@ -7,6 +7,8 @@ import ( "strings" "github.com/pkg/errors" + "github.com/projectdiscovery/nuclei/v2/pkg/catalog/config" + stringsutil "github.com/projectdiscovery/utils/strings" ) // GetTemplatesPath returns a list of absolute paths for the provided template list. @@ -17,7 +19,12 @@ func (c *DiskCatalog) GetTemplatesPath(definitions []string) ([]string, map[stri erred := make(map[string]error) for _, t := range definitions { - if strings.HasPrefix(t, "http") && (strings.HasSuffix(t, ".yaml") || strings.HasSuffix(t, ".yml")) { + if stringsutil.ContainsAny(t, knownConfigFiles...) { + // TODO: this is a temporary fix to avoid treating these files as templates + // this should be replaced with more appropriate and robust logic + continue + } + if strings.HasPrefix(t, "http") && stringsutil.ContainsAny(t, config.GetSupportTemplateFileExtensions()...) { if _, ok := processed[t]; !ok { processed[t] = true allTemplates = append(allTemplates, t) @@ -35,7 +42,17 @@ func (c *DiskCatalog) GetTemplatesPath(definitions []string) ([]string, map[stri } } } - return allTemplates, erred + // purge all falsepositivies + filteredTemplates := []string{} + for _, v := range allTemplates { + // TODO: this is a temporary fix to avoid treating these files as templates + // this should be replaced with more appropriate and robust logic + if !stringsutil.ContainsAny(v, knownConfigFiles...) { + filteredTemplates = append(filteredTemplates, v) + } + } + + return filteredTemplates, erred } // GetTemplatePath parses the specified input template path and returns a compiled @@ -43,7 +60,6 @@ func (c *DiskCatalog) GetTemplatesPath(definitions []string) ([]string, map[stri // or folders provided as in. func (c *DiskCatalog) GetTemplatePath(target string) ([]string, error) { processed := make(map[string]struct{}) - absPath, err := c.convertPathToAbsolute(target) if err != nil { return nil, errors.Wrapf(err, "could not find template file") @@ -142,7 +158,7 @@ func (c *DiskCatalog) findDirectoryMatches(absPath string, processed map[string] if err != nil { return nil } - if !d.IsDir() && strings.HasSuffix(path, ".yaml") { + if !d.IsDir() && config.GetTemplateFormatFromExt(path) != config.Unknown { if _, ok := processed[path]; !ok { results = append(results, path) processed[path] = struct{}{} diff --git a/v2/pkg/catalog/disk/known-files.go b/v2/pkg/catalog/disk/known-files.go new file mode 100644 index 00000000..6660363a --- /dev/null +++ b/v2/pkg/catalog/disk/known-files.go @@ -0,0 +1,3 @@ +package disk + +var knownConfigFiles = []string{"cves.json", "contributors.json", "TEMPLATES-STATS.json"} diff --git a/v2/pkg/catalog/loader/remote_loader.go b/v2/pkg/catalog/loader/remote_loader.go index 531417ae..2c786168 100644 --- a/v2/pkg/catalog/loader/remote_loader.go +++ b/v2/pkg/catalog/loader/remote_loader.go @@ -8,8 +8,10 @@ import ( "github.com/pkg/errors" + "github.com/projectdiscovery/nuclei/v2/pkg/templates/extensions" "github.com/projectdiscovery/nuclei/v2/pkg/utils" "github.com/projectdiscovery/retryablehttp-go" + stringsutil "github.com/projectdiscovery/utils/strings" ) type ContentType string @@ -65,7 +67,7 @@ func getRemoteContent(URL string, remoteTemplateDomainList []string, remoteConte } return } - if strings.HasPrefix(URL, "http") && (strings.HasSuffix(URL, ".yaml") || strings.HasSuffix(URL, ".yml")) { + if strings.HasPrefix(URL, "http") && stringsutil.HasSuffixAny(URL, extensions.YAML, extensions.YML) { remoteContentChannel <- RemoteContent{ Content: []string{URL}, Type: contentType, diff --git a/v2/pkg/core/execute_options.go b/v2/pkg/core/execute_options.go index e9d87c88..97bff350 100644 --- a/v2/pkg/core/execute_options.go +++ b/v2/pkg/core/execute_options.go @@ -10,6 +10,7 @@ import ( "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/contextargs" "github.com/projectdiscovery/nuclei/v2/pkg/templates" "github.com/projectdiscovery/nuclei/v2/pkg/templates/types" + "github.com/projectdiscovery/nuclei/v2/pkg/types/scanstrategy" stringsutil "github.com/projectdiscovery/utils/strings" ) @@ -40,10 +41,10 @@ func (e *Engine) ExecuteScanWithOpts(templatesList []*templates.Template, target finalTemplates = templatesList } - if stringsutil.EqualFoldAny(e.options.ScanStrategy, "auto", "") { + if stringsutil.EqualFoldAny(e.options.ScanStrategy, scanstrategy.Auto.String(), "") { // TODO: this is only a placeholder, auto scan strategy should choose scan strategy // based on no of hosts , templates , stream and other optimization parameters - e.options.ScanStrategy = "template-spray" + e.options.ScanStrategy = scanstrategy.TemplateSpray.String() } filtered := []*templates.Template{} @@ -60,11 +61,11 @@ func (e *Engine) ExecuteScanWithOpts(templatesList []*templates.Template, target // Execute All SelfContained in parallel e.executeAllSelfContained(selfContained, results, selfcontainedWg) - var strategyResult *atomic.Bool + strategyResult := &atomic.Bool{} switch e.options.ScanStrategy { - case "template-spray": + case scanstrategy.TemplateSpray.String(): strategyResult = e.executeTemplateSpray(filtered, target) - case "host-spray": + case scanstrategy.TemplateSpray.String(): strategyResult = e.executeHostSpray(filtered, target) } diff --git a/v2/pkg/output/output.go b/v2/pkg/output/output.go index 36723886..4dd1faa4 100644 --- a/v2/pkg/output/output.go +++ b/v2/pkg/output/output.go @@ -66,12 +66,31 @@ type InternalEvent map[string]interface{} // InternalWrappedEvent is a wrapped event with operators result added to it. type InternalWrappedEvent struct { + // Mutex is internal field which is implicitly used + // to synchronize callback(event) and interactsh polling updates + // Refer protocols/http.Request.ExecuteWithResults for more details + sync.RWMutex + InternalEvent InternalEvent Results []*ResultEvent OperatorsResult *operators.Result UsesInteractsh bool } +func (iwe *InternalWrappedEvent) HasOperatorResult() bool { + iwe.RLock() + defer iwe.RUnlock() + + return iwe.OperatorsResult != nil +} + +func (iwe *InternalWrappedEvent) SetOperatorResult(operatorResult *operators.Result) { + iwe.Lock() + defer iwe.Unlock() + + iwe.OperatorsResult = operatorResult +} + // ResultEvent is a wrapped result event for a single nuclei output. type ResultEvent struct { // Template is the relative filename for the template diff --git a/v2/pkg/parsers/parser.go b/v2/pkg/parsers/parser.go index 6c8c6cc1..23c886e7 100644 --- a/v2/pkg/parsers/parser.go +++ b/v2/pkg/parsers/parser.go @@ -1,11 +1,13 @@ package parsers import ( + "encoding/json" "fmt" "regexp" "strings" "github.com/projectdiscovery/nuclei/v2/pkg/catalog" + "github.com/projectdiscovery/nuclei/v2/pkg/catalog/config" "github.com/projectdiscovery/nuclei/v2/pkg/catalog/loader/filter" "github.com/projectdiscovery/nuclei/v2/pkg/templates" "github.com/projectdiscovery/nuclei/v2/pkg/templates/cache" @@ -130,10 +132,17 @@ func ParseTemplate(templatePath string, catalog catalog.Catalog) (*templates.Tem template.Verified, _ = signer.Verify(signer.DefaultVerifier, data) } - if NoStrictSyntax { - err = yaml.Unmarshal(data, template) - } else { - err = yaml.UnmarshalStrict(data, template) + switch config.GetTemplateFormatFromExt(templatePath) { + case config.JSON: + err = json.Unmarshal(data, template) + case config.YAML: + if NoStrictSyntax { + err = yaml.Unmarshal(data, template) + } else { + err = yaml.UnmarshalStrict(data, template) + } + default: + err = fmt.Errorf("failed to identify template format expected JSON or YAML but got %v", templatePath) } if err != nil { stats.Increment(SyntaxErrorStats) diff --git a/v2/pkg/protocols/common/executer/executer.go b/v2/pkg/protocols/common/executer/executer.go index 6ea8d37f..ff5836b3 100644 --- a/v2/pkg/protocols/common/executer/executer.go +++ b/v2/pkg/protocols/common/executer/executer.go @@ -93,7 +93,7 @@ func (e *Executer) Execute(input *contextargs.Context) (bool, error) { // If no results were found, and also interactsh is not being used // in that case we can skip it, otherwise we've to show failure in // case of matcher-status flag. - if event.OperatorsResult == nil && !event.UsesInteractsh { + if !event.HasOperatorResult() && !event.UsesInteractsh { if err := e.options.Output.WriteFailure(event.InternalEvent); err != nil { gologger.Warning().Msgf("Could not write failure event to output: %s\n", err) } diff --git a/v2/pkg/protocols/common/helpers/writer/writer.go b/v2/pkg/protocols/common/helpers/writer/writer.go index c81b7d3d..641a69f3 100644 --- a/v2/pkg/protocols/common/helpers/writer/writer.go +++ b/v2/pkg/protocols/common/helpers/writer/writer.go @@ -12,7 +12,7 @@ func WriteResult(data *output.InternalWrappedEvent, output output.Writer, progre // Handle the case where no result found for the template. // In this case, we just show misc information about the failed // match for the template. - if data.OperatorsResult == nil { + if !data.HasOperatorResult() { return false } var matched bool diff --git a/v2/pkg/protocols/common/hosterrorscache/hosterrorscache.go b/v2/pkg/protocols/common/hosterrorscache/hosterrorscache.go index d7e6610a..53d77b49 100644 --- a/v2/pkg/protocols/common/hosterrorscache/hosterrorscache.go +++ b/v2/pkg/protocols/common/hosterrorscache/hosterrorscache.go @@ -30,6 +30,7 @@ type Cache struct { MaxHostError int verbose bool failedTargets gcache.Cache + TrackError []string } type cacheItem struct { @@ -40,11 +41,11 @@ type cacheItem struct { const DefaultMaxHostsCount = 10000 // New returns a new host max errors cache -func New(maxHostError, maxHostsCount int) *Cache { +func New(maxHostError, maxHostsCount int, trackError []string) *Cache { gc := gcache.New(maxHostsCount). ARC(). Build() - return &Cache{failedTargets: gc, MaxHostError: maxHostError} + return &Cache{failedTargets: gc, MaxHostError: maxHostError, TrackError: trackError} } // SetVerbose sets the cache to log at verbose level @@ -128,6 +129,14 @@ var reCheckError = regexp.MustCompile(`(no address found for host|Client\.Timeou // checkError checks if an error represents a type that should be // added to the host skipping table. func (c *Cache) checkError(err error) bool { + if err == nil { + return false + } errString := err.Error() + for _, msg := range c.TrackError { + if strings.Contains(errString, msg) { + return true + } + } return reCheckError.MatchString(errString) } diff --git a/v2/pkg/protocols/common/hosterrorscache/hosterrorscache_test.go b/v2/pkg/protocols/common/hosterrorscache/hosterrorscache_test.go index 15debcdf..a4730366 100644 --- a/v2/pkg/protocols/common/hosterrorscache/hosterrorscache_test.go +++ b/v2/pkg/protocols/common/hosterrorscache/hosterrorscache_test.go @@ -10,7 +10,7 @@ import ( ) func TestCacheCheck(t *testing.T) { - cache := New(3, DefaultMaxHostsCount) + cache := New(3, DefaultMaxHostsCount, nil) for i := 0; i < 100; i++ { cache.MarkFailed("test", fmt.Errorf("could not resolve host")) @@ -28,6 +28,24 @@ func TestCacheCheck(t *testing.T) { require.Equal(t, true, value, "could not get checked value") } +func TestTrackErrors(t *testing.T) { + cache := New(3, DefaultMaxHostsCount, []string{"custom error"}) + + for i := 0; i < 100; i++ { + cache.MarkFailed("custom", fmt.Errorf("got: nested: custom error")) + got := cache.Check("custom") + if i < 2 { + // till 3 the host is not flagged to skip + require.False(t, got) + } else { + // above 3 it must remain flagged to skip + require.True(t, got) + } + } + value := cache.Check("custom") + require.Equal(t, true, value, "could not get checked value") +} + func TestCacheItemDo(t *testing.T) { var ( count int @@ -51,7 +69,7 @@ func TestCacheItemDo(t *testing.T) { } func TestCacheMarkFailed(t *testing.T) { - cache := New(3, DefaultMaxHostsCount) + cache := New(3, DefaultMaxHostsCount, nil) tests := []struct { host string @@ -76,7 +94,7 @@ func TestCacheMarkFailed(t *testing.T) { } func TestCacheMarkFailedConcurrent(t *testing.T) { - cache := New(3, DefaultMaxHostsCount) + cache := New(3, DefaultMaxHostsCount, nil) tests := []struct { host string diff --git a/v2/pkg/protocols/common/interactsh/interactsh.go b/v2/pkg/protocols/common/interactsh/interactsh.go index d4923276..d20d5c29 100644 --- a/v2/pkg/protocols/common/interactsh/interactsh.go +++ b/v2/pkg/protocols/common/interactsh/interactsh.go @@ -171,7 +171,7 @@ func (c *Client) firstTimeInitializeClient() error { c.hostname = interactDomain c.dataMutex.Unlock() - interactsh.StartPolling(c.pollDuration, func(interaction *server.Interaction) { + err = interactsh.StartPolling(c.pollDuration, func(interaction *server.Interaction) { item := c.requests.Get(interaction.UniqueID) if item == nil { // If we don't have any request for this ID, add it to temporary @@ -199,6 +199,10 @@ func (c *Client) firstTimeInitializeClient() error { _ = c.processInteractionForRequest(interaction, request) }) + + if err != nil { + return errors.Wrap(err, "could not perform instactsh polling") + } return nil } @@ -218,8 +222,9 @@ func (c *Client) processInteractionForRequest(interaction *server.Interaction, d if data.Event.OperatorsResult != nil { data.Event.OperatorsResult.Merge(result) } else { - data.Event.OperatorsResult = result + data.Event.SetOperatorResult(result) } + data.Event.Results = data.MakeResultFunc(data.Event) for _, event := range data.Event.Results { event.Interaction = interaction @@ -258,7 +263,7 @@ func (c *Client) Close() bool { time.Sleep(c.cooldownDuration) } if c.interactsh != nil { - c.interactsh.StopPolling() + _ = c.interactsh.StopPolling() c.interactsh.Close() } @@ -347,6 +352,9 @@ type RequestData struct { // RequestEvent is the event for a network request sent by nuclei. func (c *Client) RequestEvent(interactshURLs []string, data *RequestData) { + data.Event.Lock() + defer data.Event.Unlock() + for _, interactshURL := range interactshURLs { id := strings.TrimRight(strings.TrimSuffix(interactshURL, c.hostname), ".") diff --git a/v2/pkg/protocols/http/request.go b/v2/pkg/protocols/http/request.go index 18cddd76..d000ffc8 100644 --- a/v2/pkg/protocols/http/request.go +++ b/v2/pkg/protocols/http/request.go @@ -393,9 +393,13 @@ func (request *Request) ExecuteWithResults(input *contextargs.Context, dynamicVa MatchFunc: request.Match, ExtractFunc: request.Extract, }) - } else { - callback(event) } + // Note: This is a race condition prone zone i.e when request has interactsh_matchers + // Interactsh.RequestEvent tries to access/update output.InternalWrappedEvent depending on logic + // to avoid conflicts with `callback` mutex is used here and in Interactsh.RequestEvent + // Note: this only happens if requests > 1 and interactsh matcher is used + // TODO: interactsh logic in nuclei needs to be refactored to avoid such situations + callback(event) }, generator.currentIndex) // If a variable is unresolved, skip all further requests diff --git a/v2/pkg/templates/compile_test.go b/v2/pkg/templates/compile_test.go index 70691980..91d3720e 100644 --- a/v2/pkg/templates/compile_test.go +++ b/v2/pkg/templates/compile_test.go @@ -4,15 +4,18 @@ import ( "context" "fmt" "log" + netHttp "net/http" + "net/http/httptest" + "os" "testing" "time" + "github.com/julienschmidt/httprouter" "github.com/projectdiscovery/nuclei/v2/pkg/catalog/disk" "github.com/projectdiscovery/nuclei/v2/pkg/model" "github.com/projectdiscovery/nuclei/v2/pkg/model/types/severity" "github.com/projectdiscovery/nuclei/v2/pkg/model/types/stringslice" "github.com/projectdiscovery/nuclei/v2/pkg/operators" - "github.com/projectdiscovery/nuclei/v2/pkg/operators/extractors" "github.com/projectdiscovery/nuclei/v2/pkg/operators/matchers" "github.com/projectdiscovery/nuclei/v2/pkg/parsers" "github.com/projectdiscovery/nuclei/v2/pkg/progress" @@ -20,7 +23,6 @@ import ( "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/generators" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/variables" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/http" - "github.com/projectdiscovery/nuclei/v2/pkg/protocols/ssl" "github.com/projectdiscovery/nuclei/v2/pkg/templates" "github.com/projectdiscovery/nuclei/v2/pkg/testutils" "github.com/projectdiscovery/nuclei/v2/pkg/workflows" @@ -54,42 +56,53 @@ func setup() { } func Test_ParseFromURL(t *testing.T) { - filePath := "https://api.nuclei.sh/api/v1/templates/raw/ssl/tls-version.yaml" - expectedTemplate := &templates.Template{ - ID: "tls-version", + router := httprouter.New() + router.GET("/match-1.yaml", func(w netHttp.ResponseWriter, r *netHttp.Request, _ httprouter.Params) { + b, err := os.ReadFile("tests/match-1.yaml") + if err != nil { + w.Write([]byte(err.Error())) // nolint: errcheck + } + w.Write(b) // nolint: errcheck + }) + ts := httptest.NewServer(router) + defer ts.Close() + var expectedTemplate = &templates.Template{ + ID: "basic-get", Info: model.Info{ + Name: "Basic GET Request", Authors: stringslice.StringSlice{Value: []string{"pdteam"}}, SeverityHolder: severity.Holder{Severity: severity.Info}, - Name: "TLS Version", - Tags: stringslice.StringSlice{Value: []string{"ssl"}}, }, - RequestsSSL: []*ssl.Request{ - { - Address: "{{Host}}:{{Port}}", - Operators: operators.Operators{ - Extractors: []*extractors.Extractor{ - { - Type: extractors.ExtractorTypeHolder{ExtractorType: extractors.JSONExtractor}, - JSON: []string{".tls_version"}, - }, + RequestsHTTP: []*http.Request{{ + Operators: operators.Operators{ + Matchers: []*matchers.Matcher{{ + Type: matchers.MatcherTypeHolder{ + MatcherType: matchers.WordsMatcher, }, - }, - }}, + Words: []string{"This is test matcher text"}, + }}, + }, + Path: []string{"{{BaseURL}}"}, + AttackType: generators.AttackTypeHolder{}, + Method: http.HTTPMethodTypeHolder{ + MethodType: http.HTTPGet, + }, + }}, TotalRequests: 1, Executer: nil, - Path: "https://api.nuclei.sh/api/v1/templates/raw/ssl/tls-version.yaml", + Path: ts.URL + "/match-1.yaml", } setup() - got, err := templates.Parse(filePath, nil, executerOpts) + got, err := templates.Parse(ts.URL+"/match-1.yaml", nil, executerOpts) require.Nilf(t, err, "could not parse template (%s)", fmt.Sprint(err)) + require.Nil(t, err, "could not parse template") require.Equal(t, expectedTemplate.ID, got.ID) require.Equal(t, expectedTemplate.Info, got.Info) require.Equal(t, expectedTemplate.TotalRequests, got.TotalRequests) require.Equal(t, expectedTemplate.Path, got.Path) - require.Equal(t, expectedTemplate.RequestsSSL[0].Address, got.RequestsSSL[0].Address) - require.Equal(t, expectedTemplate.RequestsSSL[0].Extractors[0].Type, got.RequestsSSL[0].Extractors[0].Type) - require.Equal(t, expectedTemplate.RequestsSSL[0].Extractors[0].JSON, got.RequestsSSL[0].Extractors[0].JSON) - require.Equal(t, len(expectedTemplate.RequestsSSL), len(got.RequestsSSL)) + require.Equal(t, expectedTemplate.RequestsHTTP[0].Path, got.RequestsHTTP[0].Path) + require.Equal(t, expectedTemplate.RequestsHTTP[0].Operators.Matchers[0].Words, got.RequestsHTTP[0].Operators.Matchers[0].Words) + require.Equal(t, len(expectedTemplate.RequestsHTTP), len(got.RequestsHTTP)) } func Test_ParseFromFile(t *testing.T) { diff --git a/v2/pkg/templates/extensions/extensions.go b/v2/pkg/templates/extensions/extensions.go new file mode 100644 index 00000000..f4522b52 --- /dev/null +++ b/v2/pkg/templates/extensions/extensions.go @@ -0,0 +1,7 @@ +package extensions + +const ( + JSON = ".json" + YAML = ".yaml" + YML = ".yml" +) diff --git a/v2/pkg/templates/templates.go b/v2/pkg/templates/templates.go index 54e5f487..84f67f9b 100644 --- a/v2/pkg/templates/templates.go +++ b/v2/pkg/templates/templates.go @@ -22,11 +22,6 @@ import ( "gopkg.in/yaml.v2" ) -const ( - // TemplateExtension defines the template default file extension - TemplateExtension = ".yaml" -) - // Template is a YAML input file which defines all the requests and // other metadata for a template. type Template struct { diff --git a/v2/pkg/templates/templates_doc.go b/v2/pkg/templates/templates_doc.go index 441e5b7b..f79e9f13 100644 --- a/v2/pkg/templates/templates_doc.go +++ b/v2/pkg/templates/templates_doc.go @@ -12,13 +12,10 @@ var ( TemplateDoc encoder.Doc MODELInfoDoc encoder.Doc STRINGSLICEStringSliceDoc encoder.Doc + STRINGSLICERawStringSliceDoc encoder.Doc SEVERITYHolderDoc encoder.Doc MODELClassificationDoc encoder.Doc HTTPRequestDoc encoder.Doc - MATCHERSMatcherDoc encoder.Doc - MatcherTypeHolderDoc encoder.Doc - EXTRACTORSExtractorDoc encoder.Doc - ExtractorTypeHolderDoc encoder.Doc GENERATORSAttackTypeHolderDoc encoder.Doc HTTPMethodTypeHolderDoc encoder.Doc FUZZRuleDoc encoder.Doc @@ -37,8 +34,6 @@ var ( WEBSOCKETRequestDoc encoder.Doc WEBSOCKETInputDoc encoder.Doc WHOISRequestDoc encoder.Doc - WORKFLOWSWorkflowTemplateDoc encoder.Doc - WORKFLOWSMatcherDoc encoder.Doc HTTPSignatureTypeHolderDoc encoder.Doc VARIABLESVariableDoc encoder.Doc ) @@ -47,7 +42,7 @@ func init() { TemplateDoc.Type = "Template" TemplateDoc.Comments[encoder.LineComment] = " Template is a YAML input file which defines all the requests and" TemplateDoc.Description = "Template is a YAML input file which defines all the requests and\n other metadata for a template." - TemplateDoc.Fields = make([]encoder.Doc, 15) + TemplateDoc.Fields = make([]encoder.Doc, 14) TemplateDoc.Fields[0].Name = "id" TemplateDoc.Fields[0].Type = "string" TemplateDoc.Fields[0].Note = "" @@ -110,34 +105,29 @@ func init() { TemplateDoc.Fields[9].Note = "" TemplateDoc.Fields[9].Description = "WHOIS contains the WHOIS request to make in the template." TemplateDoc.Fields[9].Comments[encoder.LineComment] = "WHOIS contains the WHOIS request to make in the template." - TemplateDoc.Fields[10].Name = "workflows" - TemplateDoc.Fields[10].Type = "[]workflows.WorkflowTemplate" + TemplateDoc.Fields[10].Name = "self-contained" + TemplateDoc.Fields[10].Type = "bool" TemplateDoc.Fields[10].Note = "" - TemplateDoc.Fields[10].Description = "Workflows is a list of workflows to execute for a template." - TemplateDoc.Fields[10].Comments[encoder.LineComment] = "Workflows is a list of workflows to execute for a template." - TemplateDoc.Fields[11].Name = "self-contained" + TemplateDoc.Fields[10].Description = "Self Contained marks Requests for the template as self-contained" + TemplateDoc.Fields[10].Comments[encoder.LineComment] = "Self Contained marks Requests for the template as self-contained" + TemplateDoc.Fields[11].Name = "stop-at-first-match" TemplateDoc.Fields[11].Type = "bool" TemplateDoc.Fields[11].Note = "" - TemplateDoc.Fields[11].Description = "Self Contained marks Requests for the template as self-contained" - TemplateDoc.Fields[11].Comments[encoder.LineComment] = "Self Contained marks Requests for the template as self-contained" - TemplateDoc.Fields[12].Name = "stop-at-first-match" - TemplateDoc.Fields[12].Type = "bool" + TemplateDoc.Fields[11].Description = "Stop execution once first match is found" + TemplateDoc.Fields[11].Comments[encoder.LineComment] = "Stop execution once first match is found" + TemplateDoc.Fields[12].Name = "signature" + TemplateDoc.Fields[12].Type = "http.SignatureTypeHolder" TemplateDoc.Fields[12].Note = "" - TemplateDoc.Fields[12].Description = "Stop execution once first match is found" - TemplateDoc.Fields[12].Comments[encoder.LineComment] = "Stop execution once first match is found" - TemplateDoc.Fields[13].Name = "signature" - TemplateDoc.Fields[13].Type = "http.SignatureTypeHolder" - TemplateDoc.Fields[13].Note = "" - TemplateDoc.Fields[13].Description = "Signature is the request signature method" - TemplateDoc.Fields[13].Comments[encoder.LineComment] = "Signature is the request signature method" - TemplateDoc.Fields[13].Values = []string{ + TemplateDoc.Fields[12].Description = "Signature is the request signature method" + TemplateDoc.Fields[12].Comments[encoder.LineComment] = "Signature is the request signature method" + TemplateDoc.Fields[12].Values = []string{ "AWS", } - TemplateDoc.Fields[14].Name = "variables" - TemplateDoc.Fields[14].Type = "variables.Variable" - TemplateDoc.Fields[14].Note = "" - TemplateDoc.Fields[14].Description = "Variables contains any variables for the current request." - TemplateDoc.Fields[14].Comments[encoder.LineComment] = "Variables contains any variables for the current request." + TemplateDoc.Fields[13].Name = "variables" + TemplateDoc.Fields[13].Type = "variables.Variable" + TemplateDoc.Fields[13].Note = "" + TemplateDoc.Fields[13].Description = "Variables contains any variables for the current request." + TemplateDoc.Fields[13].Comments[encoder.LineComment] = "Variables contains any variables for the current request." MODELInfoDoc.Type = "model.Info" MODELInfoDoc.Comments[encoder.LineComment] = " Info contains metadata information about a template" @@ -184,7 +174,7 @@ func init() { MODELInfoDoc.Fields[3].AddExample("", "Subversion ALM for the enterprise before 8.8.2 allows reflected XSS at multiple locations") MODELInfoDoc.Fields[4].Name = "reference" - MODELInfoDoc.Fields[4].Type = "stringslice.StringSlice" + MODELInfoDoc.Fields[4].Type = "stringslice.RawStringSlice" MODELInfoDoc.Fields[4].Note = "" MODELInfoDoc.Fields[4].Description = "References for the template.\n\nThis should contain links relevant to the template." MODELInfoDoc.Fields[4].Comments[encoder.LineComment] = "References for the template." @@ -223,8 +213,6 @@ func init() { STRINGSLICEStringSliceDoc.AddExample("Example tags", "cve,cve2019,grafana,auth-bypass,dos") - STRINGSLICEStringSliceDoc.AddExample("", []string{"https://github.com/strapi/strapi", "https://github.com/getgrav/grav"}) - STRINGSLICEStringSliceDoc.AddExample("", "CVE-2020-14420") STRINGSLICEStringSliceDoc.AddExample("", "CWE-22") @@ -237,10 +225,6 @@ func init() { TypeName: "model.Info", FieldName: "tags", }, - { - TypeName: "model.Info", - FieldName: "reference", - }, { TypeName: "model.Classification", FieldName: "cve-id", @@ -249,17 +233,22 @@ func init() { TypeName: "model.Classification", FieldName: "cwe-id", }, - { - TypeName: "workflows.WorkflowTemplate", - FieldName: "tags", - }, - { - TypeName: "workflows.Matcher", - FieldName: "name", - }, } STRINGSLICEStringSliceDoc.Fields = make([]encoder.Doc, 0) + STRINGSLICERawStringSliceDoc.Type = "stringslice.RawStringSlice" + STRINGSLICERawStringSliceDoc.Comments[encoder.LineComment] = "" + STRINGSLICERawStringSliceDoc.Description = "" + + STRINGSLICERawStringSliceDoc.AddExample("", []string{"https://github.com/strapi/strapi", "https://github.com/getgrav/grav"}) + STRINGSLICERawStringSliceDoc.AppearsIn = []encoder.Appearance{ + { + TypeName: "model.Info", + FieldName: "reference", + }, + } + STRINGSLICERawStringSliceDoc.Fields = make([]encoder.Doc, 0) + SEVERITYHolderDoc.Type = "severity.Holder" SEVERITYHolderDoc.Comments[encoder.LineComment] = " Holder holds a Severity type. Required for un/marshalling purposes" SEVERITYHolderDoc.Description = "Holder holds a Severity type. Required for un/marshalling purposes" @@ -401,524 +390,185 @@ func init() { Value: "HTTP response headers in name:value format", }, } - HTTPRequestDoc.Fields = make([]encoder.Doc, 33) - HTTPRequestDoc.Fields[0].Name = "matchers" - HTTPRequestDoc.Fields[0].Type = "[]matchers.Matcher" + HTTPRequestDoc.Fields = make([]encoder.Doc, 30) + HTTPRequestDoc.Fields[0].Name = "path" + HTTPRequestDoc.Fields[0].Type = "[]string" HTTPRequestDoc.Fields[0].Note = "" - HTTPRequestDoc.Fields[0].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - HTTPRequestDoc.Fields[0].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - HTTPRequestDoc.Fields[1].Name = "extractors" - HTTPRequestDoc.Fields[1].Type = "[]extractors.Extractor" + HTTPRequestDoc.Fields[0].Description = "Path contains the path/s for the HTTP requests. It supports variables\nas placeholders." + HTTPRequestDoc.Fields[0].Comments[encoder.LineComment] = "Path contains the path/s for the HTTP requests. It supports variables" + + HTTPRequestDoc.Fields[0].AddExample("Some example path values", []string{"{{BaseURL}}", "{{BaseURL}}/+CSCOU+/../+CSCOE+/files/file_list.json?path=/sessions"}) + HTTPRequestDoc.Fields[1].Name = "raw" + HTTPRequestDoc.Fields[1].Type = "[]string" HTTPRequestDoc.Fields[1].Note = "" - HTTPRequestDoc.Fields[1].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - HTTPRequestDoc.Fields[1].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - HTTPRequestDoc.Fields[2].Name = "matchers-condition" + HTTPRequestDoc.Fields[1].Description = "Raw contains HTTP Requests in Raw format." + HTTPRequestDoc.Fields[1].Comments[encoder.LineComment] = "Raw contains HTTP Requests in Raw format." + + HTTPRequestDoc.Fields[1].AddExample("Some example raw requests", []string{"GET /etc/passwd HTTP/1.1\nHost:\nContent-Length: 4", "POST /.%0d./.%0d./.%0d./.%0d./bin/sh HTTP/1.1\nHost: {{Hostname}}\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0\nContent-Length: 1\nConnection: close\n\necho\necho\ncat /etc/passwd 2>&1"}) + HTTPRequestDoc.Fields[2].Name = "id" HTTPRequestDoc.Fields[2].Type = "string" HTTPRequestDoc.Fields[2].Note = "" - HTTPRequestDoc.Fields[2].Description = "MatchersCondition is the condition between the matchers. Default is OR." - HTTPRequestDoc.Fields[2].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - HTTPRequestDoc.Fields[2].Values = []string{ - "and", - "or", - } - HTTPRequestDoc.Fields[3].Name = "path" - HTTPRequestDoc.Fields[3].Type = "[]string" + HTTPRequestDoc.Fields[2].Description = "ID is the optional id of the request" + HTTPRequestDoc.Fields[2].Comments[encoder.LineComment] = " ID is the optional id of the request" + HTTPRequestDoc.Fields[3].Name = "name" + HTTPRequestDoc.Fields[3].Type = "string" HTTPRequestDoc.Fields[3].Note = "" - HTTPRequestDoc.Fields[3].Description = "Path contains the path/s for the HTTP requests. It supports variables\nas placeholders." - HTTPRequestDoc.Fields[3].Comments[encoder.LineComment] = "Path contains the path/s for the HTTP requests. It supports variables" - - HTTPRequestDoc.Fields[3].AddExample("Some example path values", []string{"{{BaseURL}}", "{{BaseURL}}/+CSCOU+/../+CSCOE+/files/file_list.json?path=/sessions"}) - HTTPRequestDoc.Fields[4].Name = "raw" - HTTPRequestDoc.Fields[4].Type = "[]string" + HTTPRequestDoc.Fields[3].Description = "Name is the optional name of the request.\n\nIf a name is specified, all the named request in a template can be matched upon\nin a combined manner allowing multi-request based matchers." + HTTPRequestDoc.Fields[3].Comments[encoder.LineComment] = "Name is the optional name of the request." + HTTPRequestDoc.Fields[4].Name = "attack" + HTTPRequestDoc.Fields[4].Type = "generators.AttackTypeHolder" HTTPRequestDoc.Fields[4].Note = "" - HTTPRequestDoc.Fields[4].Description = "Raw contains HTTP Requests in Raw format." - HTTPRequestDoc.Fields[4].Comments[encoder.LineComment] = "Raw contains HTTP Requests in Raw format." - - HTTPRequestDoc.Fields[4].AddExample("Some example raw requests", []string{"GET /etc/passwd HTTP/1.1\nHost:\nContent-Length: 4", "POST /.%0d./.%0d./.%0d./.%0d./bin/sh HTTP/1.1\nHost: {{Hostname}}\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0\nContent-Length: 1\nConnection: close\n\necho\necho\ncat /etc/passwd 2>&1"}) - HTTPRequestDoc.Fields[5].Name = "id" - HTTPRequestDoc.Fields[5].Type = "string" - HTTPRequestDoc.Fields[5].Note = "" - HTTPRequestDoc.Fields[5].Description = "ID is the optional id of the request" - HTTPRequestDoc.Fields[5].Comments[encoder.LineComment] = " ID is the optional id of the request" - HTTPRequestDoc.Fields[6].Name = "name" - HTTPRequestDoc.Fields[6].Type = "string" - HTTPRequestDoc.Fields[6].Note = "" - HTTPRequestDoc.Fields[6].Description = "Name is the optional name of the request.\n\nIf a name is specified, all the named request in a template can be matched upon\nin a combined manner allowing multi-request based matchers." - HTTPRequestDoc.Fields[6].Comments[encoder.LineComment] = "Name is the optional name of the request." - HTTPRequestDoc.Fields[7].Name = "attack" - HTTPRequestDoc.Fields[7].Type = "generators.AttackTypeHolder" - HTTPRequestDoc.Fields[7].Note = "" - HTTPRequestDoc.Fields[7].Description = "Attack is the type of payload combinations to perform.\n\nbatteringram is inserts the same payload into all defined payload positions at once, pitchfork combines multiple payload sets and clusterbomb generates\npermutations and combinations for all payloads." - HTTPRequestDoc.Fields[7].Comments[encoder.LineComment] = "Attack is the type of payload combinations to perform." - HTTPRequestDoc.Fields[7].Values = []string{ + HTTPRequestDoc.Fields[4].Description = "Attack is the type of payload combinations to perform.\n\nbatteringram is inserts the same payload into all defined payload positions at once, pitchfork combines multiple payload sets and clusterbomb generates\npermutations and combinations for all payloads." + HTTPRequestDoc.Fields[4].Comments[encoder.LineComment] = "Attack is the type of payload combinations to perform." + HTTPRequestDoc.Fields[4].Values = []string{ "batteringram", "pitchfork", "clusterbomb", } - HTTPRequestDoc.Fields[8].Name = "method" - HTTPRequestDoc.Fields[8].Type = "HTTPMethodTypeHolder" + HTTPRequestDoc.Fields[5].Name = "method" + HTTPRequestDoc.Fields[5].Type = "HTTPMethodTypeHolder" + HTTPRequestDoc.Fields[5].Note = "" + HTTPRequestDoc.Fields[5].Description = "Method is the HTTP Request Method." + HTTPRequestDoc.Fields[5].Comments[encoder.LineComment] = "Method is the HTTP Request Method." + HTTPRequestDoc.Fields[6].Name = "body" + HTTPRequestDoc.Fields[6].Type = "string" + HTTPRequestDoc.Fields[6].Note = "" + HTTPRequestDoc.Fields[6].Description = "Body is an optional parameter which contains HTTP Request body." + HTTPRequestDoc.Fields[6].Comments[encoder.LineComment] = "Body is an optional parameter which contains HTTP Request body." + + HTTPRequestDoc.Fields[6].AddExample("Same Body for a Login POST request", "username=test&password=test") + HTTPRequestDoc.Fields[7].Name = "payloads" + HTTPRequestDoc.Fields[7].Type = "map[string]interface{}" + HTTPRequestDoc.Fields[7].Note = "" + HTTPRequestDoc.Fields[7].Description = "Payloads contains any payloads for the current request.\n\nPayloads support both key-values combinations where a list\nof payloads is provided, or optionally a single file can also\nbe provided as payload which will be read on run-time." + HTTPRequestDoc.Fields[7].Comments[encoder.LineComment] = "Payloads contains any payloads for the current request." + HTTPRequestDoc.Fields[8].Name = "headers" + HTTPRequestDoc.Fields[8].Type = "map[string]string" HTTPRequestDoc.Fields[8].Note = "" - HTTPRequestDoc.Fields[8].Description = "Method is the HTTP Request Method." - HTTPRequestDoc.Fields[8].Comments[encoder.LineComment] = "Method is the HTTP Request Method." - HTTPRequestDoc.Fields[9].Name = "body" - HTTPRequestDoc.Fields[9].Type = "string" + HTTPRequestDoc.Fields[8].Description = "Headers contains HTTP Headers to send with the request." + HTTPRequestDoc.Fields[8].Comments[encoder.LineComment] = "Headers contains HTTP Headers to send with the request." + + HTTPRequestDoc.Fields[8].AddExample("", map[string]string{"Content-Type": "application/x-www-form-urlencoded", "Content-Length": "1", "Any-Header": "Any-Value"}) + HTTPRequestDoc.Fields[9].Name = "race_count" + HTTPRequestDoc.Fields[9].Type = "int" HTTPRequestDoc.Fields[9].Note = "" - HTTPRequestDoc.Fields[9].Description = "Body is an optional parameter which contains HTTP Request body." - HTTPRequestDoc.Fields[9].Comments[encoder.LineComment] = "Body is an optional parameter which contains HTTP Request body." + HTTPRequestDoc.Fields[9].Description = "RaceCount is the number of times to send a request in Race Condition Attack." + HTTPRequestDoc.Fields[9].Comments[encoder.LineComment] = "RaceCount is the number of times to send a request in Race Condition Attack." - HTTPRequestDoc.Fields[9].AddExample("Same Body for a Login POST request", "username=test&password=test") - HTTPRequestDoc.Fields[10].Name = "payloads" - HTTPRequestDoc.Fields[10].Type = "map[string]interface{}" + HTTPRequestDoc.Fields[9].AddExample("Send a request 5 times", 5) + HTTPRequestDoc.Fields[10].Name = "max-redirects" + HTTPRequestDoc.Fields[10].Type = "int" HTTPRequestDoc.Fields[10].Note = "" - HTTPRequestDoc.Fields[10].Description = "Payloads contains any payloads for the current request.\n\nPayloads support both key-values combinations where a list\nof payloads is provided, or optionally a single file can also\nbe provided as payload which will be read on run-time." - HTTPRequestDoc.Fields[10].Comments[encoder.LineComment] = "Payloads contains any payloads for the current request." - HTTPRequestDoc.Fields[11].Name = "headers" - HTTPRequestDoc.Fields[11].Type = "map[string]string" - HTTPRequestDoc.Fields[11].Note = "" - HTTPRequestDoc.Fields[11].Description = "Headers contains HTTP Headers to send with the request." - HTTPRequestDoc.Fields[11].Comments[encoder.LineComment] = "Headers contains HTTP Headers to send with the request." + HTTPRequestDoc.Fields[10].Description = "MaxRedirects is the maximum number of redirects that should be followed." + HTTPRequestDoc.Fields[10].Comments[encoder.LineComment] = "MaxRedirects is the maximum number of redirects that should be followed." - HTTPRequestDoc.Fields[11].AddExample("", map[string]string{"Content-Type": "application/x-www-form-urlencoded", "Content-Length": "1", "Any-Header": "Any-Value"}) - HTTPRequestDoc.Fields[12].Name = "race_count" + HTTPRequestDoc.Fields[10].AddExample("Follow up to 5 redirects", 5) + HTTPRequestDoc.Fields[11].Name = "pipeline-concurrent-connections" + HTTPRequestDoc.Fields[11].Type = "int" + HTTPRequestDoc.Fields[11].Note = "" + HTTPRequestDoc.Fields[11].Description = "PipelineConcurrentConnections is number of connections to create during pipelining." + HTTPRequestDoc.Fields[11].Comments[encoder.LineComment] = "PipelineConcurrentConnections is number of connections to create during pipelining." + + HTTPRequestDoc.Fields[11].AddExample("Create 40 concurrent connections", 40) + HTTPRequestDoc.Fields[12].Name = "pipeline-requests-per-connection" HTTPRequestDoc.Fields[12].Type = "int" HTTPRequestDoc.Fields[12].Note = "" - HTTPRequestDoc.Fields[12].Description = "RaceCount is the number of times to send a request in Race Condition Attack." - HTTPRequestDoc.Fields[12].Comments[encoder.LineComment] = "RaceCount is the number of times to send a request in Race Condition Attack." + HTTPRequestDoc.Fields[12].Description = "PipelineRequestsPerConnection is number of requests to send per connection when pipelining." + HTTPRequestDoc.Fields[12].Comments[encoder.LineComment] = "PipelineRequestsPerConnection is number of requests to send per connection when pipelining." - HTTPRequestDoc.Fields[12].AddExample("Send a request 5 times", 5) - HTTPRequestDoc.Fields[13].Name = "max-redirects" + HTTPRequestDoc.Fields[12].AddExample("Send 100 requests per pipeline connection", 100) + HTTPRequestDoc.Fields[13].Name = "threads" HTTPRequestDoc.Fields[13].Type = "int" HTTPRequestDoc.Fields[13].Note = "" - HTTPRequestDoc.Fields[13].Description = "MaxRedirects is the maximum number of redirects that should be followed." - HTTPRequestDoc.Fields[13].Comments[encoder.LineComment] = "MaxRedirects is the maximum number of redirects that should be followed." + HTTPRequestDoc.Fields[13].Description = "Threads specifies number of threads to use sending requests. This enables Connection Pooling.\n\nConnection: Close attribute must not be used in request while using threads flag, otherwise\npooling will fail and engine will continue to close connections after requests." + HTTPRequestDoc.Fields[13].Comments[encoder.LineComment] = "Threads specifies number of threads to use sending requests. This enables Connection Pooling." - HTTPRequestDoc.Fields[13].AddExample("Follow up to 5 redirects", 5) - HTTPRequestDoc.Fields[14].Name = "pipeline-concurrent-connections" + HTTPRequestDoc.Fields[13].AddExample("Send requests using 10 concurrent threads", 10) + HTTPRequestDoc.Fields[14].Name = "max-size" HTTPRequestDoc.Fields[14].Type = "int" HTTPRequestDoc.Fields[14].Note = "" - HTTPRequestDoc.Fields[14].Description = "PipelineConcurrentConnections is number of connections to create during pipelining." - HTTPRequestDoc.Fields[14].Comments[encoder.LineComment] = "PipelineConcurrentConnections is number of connections to create during pipelining." + HTTPRequestDoc.Fields[14].Description = "MaxSize is the maximum size of http response body to read in bytes." + HTTPRequestDoc.Fields[14].Comments[encoder.LineComment] = "MaxSize is the maximum size of http response body to read in bytes." - HTTPRequestDoc.Fields[14].AddExample("Create 40 concurrent connections", 40) - HTTPRequestDoc.Fields[15].Name = "pipeline-requests-per-connection" - HTTPRequestDoc.Fields[15].Type = "int" + HTTPRequestDoc.Fields[14].AddExample("Read max 2048 bytes of the response", 2048) + HTTPRequestDoc.Fields[15].Name = "fuzzing" + HTTPRequestDoc.Fields[15].Type = "[]fuzz.Rule" HTTPRequestDoc.Fields[15].Note = "" - HTTPRequestDoc.Fields[15].Description = "PipelineRequestsPerConnection is number of requests to send per connection when pipelining." - HTTPRequestDoc.Fields[15].Comments[encoder.LineComment] = "PipelineRequestsPerConnection is number of requests to send per connection when pipelining." - - HTTPRequestDoc.Fields[15].AddExample("Send 100 requests per pipeline connection", 100) - HTTPRequestDoc.Fields[16].Name = "threads" - HTTPRequestDoc.Fields[16].Type = "int" + HTTPRequestDoc.Fields[15].Description = "Fuzzing describes schema to fuzz http requests" + HTTPRequestDoc.Fields[15].Comments[encoder.LineComment] = " Fuzzing describes schema to fuzz http requests" + HTTPRequestDoc.Fields[16].Name = "signature" + HTTPRequestDoc.Fields[16].Type = "SignatureTypeHolder" HTTPRequestDoc.Fields[16].Note = "" - HTTPRequestDoc.Fields[16].Description = "Threads specifies number of threads to use sending requests. This enables Connection Pooling.\n\nConnection: Close attribute must not be used in request while using threads flag, otherwise\npooling will fail and engine will continue to close connections after requests." - HTTPRequestDoc.Fields[16].Comments[encoder.LineComment] = "Threads specifies number of threads to use sending requests. This enables Connection Pooling." - - HTTPRequestDoc.Fields[16].AddExample("Send requests using 10 concurrent threads", 10) - HTTPRequestDoc.Fields[17].Name = "max-size" - HTTPRequestDoc.Fields[17].Type = "int" - HTTPRequestDoc.Fields[17].Note = "" - HTTPRequestDoc.Fields[17].Description = "MaxSize is the maximum size of http response body to read in bytes." - HTTPRequestDoc.Fields[17].Comments[encoder.LineComment] = "MaxSize is the maximum size of http response body to read in bytes." - - HTTPRequestDoc.Fields[17].AddExample("Read max 2048 bytes of the response", 2048) - HTTPRequestDoc.Fields[18].Name = "fuzzing" - HTTPRequestDoc.Fields[18].Type = "[]fuzz.Rule" - HTTPRequestDoc.Fields[18].Note = "" - HTTPRequestDoc.Fields[18].Description = "Fuzzing describes schema to fuzz http requests" - HTTPRequestDoc.Fields[18].Comments[encoder.LineComment] = " Fuzzing describes schema to fuzz http requests" - HTTPRequestDoc.Fields[19].Name = "signature" - HTTPRequestDoc.Fields[19].Type = "SignatureTypeHolder" - HTTPRequestDoc.Fields[19].Note = "" - HTTPRequestDoc.Fields[19].Description = "Signature is the request signature method" - HTTPRequestDoc.Fields[19].Comments[encoder.LineComment] = "Signature is the request signature method" - HTTPRequestDoc.Fields[19].Values = []string{ + HTTPRequestDoc.Fields[16].Description = "Signature is the request signature method" + HTTPRequestDoc.Fields[16].Comments[encoder.LineComment] = "Signature is the request signature method" + HTTPRequestDoc.Fields[16].Values = []string{ "AWS", } - HTTPRequestDoc.Fields[20].Name = "cookie-reuse" + HTTPRequestDoc.Fields[17].Name = "cookie-reuse" + HTTPRequestDoc.Fields[17].Type = "bool" + HTTPRequestDoc.Fields[17].Note = "" + HTTPRequestDoc.Fields[17].Description = "CookieReuse is an optional setting that enables cookie reuse for\nall requests defined in raw section." + HTTPRequestDoc.Fields[17].Comments[encoder.LineComment] = "CookieReuse is an optional setting that enables cookie reuse for" + HTTPRequestDoc.Fields[18].Name = "read-all" + HTTPRequestDoc.Fields[18].Type = "bool" + HTTPRequestDoc.Fields[18].Note = "" + HTTPRequestDoc.Fields[18].Description = "Enables force reading of the entire raw unsafe request body ignoring\nany specified content length headers." + HTTPRequestDoc.Fields[18].Comments[encoder.LineComment] = "Enables force reading of the entire raw unsafe request body ignoring" + HTTPRequestDoc.Fields[19].Name = "redirects" + HTTPRequestDoc.Fields[19].Type = "bool" + HTTPRequestDoc.Fields[19].Note = "" + HTTPRequestDoc.Fields[19].Description = "Redirects specifies whether redirects should be followed by the HTTP Client.\n\nThis can be used in conjunction with `max-redirects` to control the HTTP request redirects." + HTTPRequestDoc.Fields[19].Comments[encoder.LineComment] = "Redirects specifies whether redirects should be followed by the HTTP Client." + HTTPRequestDoc.Fields[20].Name = "host-redirects" HTTPRequestDoc.Fields[20].Type = "bool" HTTPRequestDoc.Fields[20].Note = "" - HTTPRequestDoc.Fields[20].Description = "CookieReuse is an optional setting that enables cookie reuse for\nall requests defined in raw section." - HTTPRequestDoc.Fields[20].Comments[encoder.LineComment] = "CookieReuse is an optional setting that enables cookie reuse for" - HTTPRequestDoc.Fields[21].Name = "read-all" + HTTPRequestDoc.Fields[20].Description = "Redirects specifies whether only redirects to the same host should be followed by the HTTP Client.\n\nThis can be used in conjunction with `max-redirects` to control the HTTP request redirects." + HTTPRequestDoc.Fields[20].Comments[encoder.LineComment] = "Redirects specifies whether only redirects to the same host should be followed by the HTTP Client." + HTTPRequestDoc.Fields[21].Name = "pipeline" HTTPRequestDoc.Fields[21].Type = "bool" HTTPRequestDoc.Fields[21].Note = "" - HTTPRequestDoc.Fields[21].Description = "Enables force reading of the entire raw unsafe request body ignoring\nany specified content length headers." - HTTPRequestDoc.Fields[21].Comments[encoder.LineComment] = "Enables force reading of the entire raw unsafe request body ignoring" - HTTPRequestDoc.Fields[22].Name = "redirects" + HTTPRequestDoc.Fields[21].Description = "Pipeline defines if the attack should be performed with HTTP 1.1 Pipelining\n\nAll requests must be idempotent (GET/POST). This can be used for race conditions/billions requests." + HTTPRequestDoc.Fields[21].Comments[encoder.LineComment] = "Pipeline defines if the attack should be performed with HTTP 1.1 Pipelining" + HTTPRequestDoc.Fields[22].Name = "unsafe" HTTPRequestDoc.Fields[22].Type = "bool" HTTPRequestDoc.Fields[22].Note = "" - HTTPRequestDoc.Fields[22].Description = "Redirects specifies whether redirects should be followed by the HTTP Client.\n\nThis can be used in conjunction with `max-redirects` to control the HTTP request redirects." - HTTPRequestDoc.Fields[22].Comments[encoder.LineComment] = "Redirects specifies whether redirects should be followed by the HTTP Client." - HTTPRequestDoc.Fields[23].Name = "host-redirects" + HTTPRequestDoc.Fields[22].Description = "Unsafe specifies whether to use rawhttp engine for sending Non RFC-Compliant requests.\n\nThis uses the [rawhttp](https://github.com/projectdiscovery/rawhttp) engine to achieve complete\ncontrol over the request, with no normalization performed by the client." + HTTPRequestDoc.Fields[22].Comments[encoder.LineComment] = "Unsafe specifies whether to use rawhttp engine for sending Non RFC-Compliant requests." + HTTPRequestDoc.Fields[23].Name = "race" HTTPRequestDoc.Fields[23].Type = "bool" HTTPRequestDoc.Fields[23].Note = "" - HTTPRequestDoc.Fields[23].Description = "Redirects specifies whether only redirects to the same host should be followed by the HTTP Client.\n\nThis can be used in conjunction with `max-redirects` to control the HTTP request redirects." - HTTPRequestDoc.Fields[23].Comments[encoder.LineComment] = "Redirects specifies whether only redirects to the same host should be followed by the HTTP Client." - HTTPRequestDoc.Fields[24].Name = "pipeline" + HTTPRequestDoc.Fields[23].Description = "Race determines if all the request have to be attempted at the same time (Race Condition)\n\nThe actual number of requests that will be sent is determined by the `race_count` field." + HTTPRequestDoc.Fields[23].Comments[encoder.LineComment] = "Race determines if all the request have to be attempted at the same time (Race Condition)" + HTTPRequestDoc.Fields[24].Name = "req-condition" HTTPRequestDoc.Fields[24].Type = "bool" HTTPRequestDoc.Fields[24].Note = "" - HTTPRequestDoc.Fields[24].Description = "Pipeline defines if the attack should be performed with HTTP 1.1 Pipelining\n\nAll requests must be idempotent (GET/POST). This can be used for race conditions/billions requests." - HTTPRequestDoc.Fields[24].Comments[encoder.LineComment] = "Pipeline defines if the attack should be performed with HTTP 1.1 Pipelining" - HTTPRequestDoc.Fields[25].Name = "unsafe" + HTTPRequestDoc.Fields[24].Description = "ReqCondition automatically assigns numbers to requests and preserves their history.\n\nThis allows matching on them later for multi-request conditions." + HTTPRequestDoc.Fields[24].Comments[encoder.LineComment] = "ReqCondition automatically assigns numbers to requests and preserves their history." + HTTPRequestDoc.Fields[25].Name = "stop-at-first-match" HTTPRequestDoc.Fields[25].Type = "bool" HTTPRequestDoc.Fields[25].Note = "" - HTTPRequestDoc.Fields[25].Description = "Unsafe specifies whether to use rawhttp engine for sending Non RFC-Compliant requests.\n\nThis uses the [rawhttp](https://github.com/projectdiscovery/rawhttp) engine to achieve complete\ncontrol over the request, with no normalization performed by the client." - HTTPRequestDoc.Fields[25].Comments[encoder.LineComment] = "Unsafe specifies whether to use rawhttp engine for sending Non RFC-Compliant requests." - HTTPRequestDoc.Fields[26].Name = "race" + HTTPRequestDoc.Fields[25].Description = "StopAtFirstMatch stops the execution of the requests and template as soon as a match is found." + HTTPRequestDoc.Fields[25].Comments[encoder.LineComment] = "StopAtFirstMatch stops the execution of the requests and template as soon as a match is found." + HTTPRequestDoc.Fields[26].Name = "skip-variables-check" HTTPRequestDoc.Fields[26].Type = "bool" HTTPRequestDoc.Fields[26].Note = "" - HTTPRequestDoc.Fields[26].Description = "Race determines if all the request have to be attempted at the same time (Race Condition)\n\nThe actual number of requests that will be sent is determined by the `race_count` field." - HTTPRequestDoc.Fields[26].Comments[encoder.LineComment] = "Race determines if all the request have to be attempted at the same time (Race Condition)" - HTTPRequestDoc.Fields[27].Name = "req-condition" + HTTPRequestDoc.Fields[26].Description = "SkipVariablesCheck skips the check for unresolved variables in request" + HTTPRequestDoc.Fields[26].Comments[encoder.LineComment] = "SkipVariablesCheck skips the check for unresolved variables in request" + HTTPRequestDoc.Fields[27].Name = "iterate-all" HTTPRequestDoc.Fields[27].Type = "bool" HTTPRequestDoc.Fields[27].Note = "" - HTTPRequestDoc.Fields[27].Description = "ReqCondition automatically assigns numbers to requests and preserves their history.\n\nThis allows matching on them later for multi-request conditions." - HTTPRequestDoc.Fields[27].Comments[encoder.LineComment] = "ReqCondition automatically assigns numbers to requests and preserves their history." - HTTPRequestDoc.Fields[28].Name = "stop-at-first-match" - HTTPRequestDoc.Fields[28].Type = "bool" + HTTPRequestDoc.Fields[27].Description = "IterateAll iterates all the values extracted from internal extractors" + HTTPRequestDoc.Fields[27].Comments[encoder.LineComment] = "IterateAll iterates all the values extracted from internal extractors" + HTTPRequestDoc.Fields[28].Name = "digest-username" + HTTPRequestDoc.Fields[28].Type = "string" HTTPRequestDoc.Fields[28].Note = "" - HTTPRequestDoc.Fields[28].Description = "StopAtFirstMatch stops the execution of the requests and template as soon as a match is found." - HTTPRequestDoc.Fields[28].Comments[encoder.LineComment] = "StopAtFirstMatch stops the execution of the requests and template as soon as a match is found." - HTTPRequestDoc.Fields[29].Name = "skip-variables-check" - HTTPRequestDoc.Fields[29].Type = "bool" + HTTPRequestDoc.Fields[28].Description = "DigestAuthUsername specifies the username for digest authentication" + HTTPRequestDoc.Fields[28].Comments[encoder.LineComment] = "DigestAuthUsername specifies the username for digest authentication" + HTTPRequestDoc.Fields[29].Name = "digest-password" + HTTPRequestDoc.Fields[29].Type = "string" HTTPRequestDoc.Fields[29].Note = "" - HTTPRequestDoc.Fields[29].Description = "SkipVariablesCheck skips the check for unresolved variables in request" - HTTPRequestDoc.Fields[29].Comments[encoder.LineComment] = "SkipVariablesCheck skips the check for unresolved variables in request" - HTTPRequestDoc.Fields[30].Name = "iterate-all" - HTTPRequestDoc.Fields[30].Type = "bool" - HTTPRequestDoc.Fields[30].Note = "" - HTTPRequestDoc.Fields[30].Description = "IterateAll iterates all the values extracted from internal extractors" - HTTPRequestDoc.Fields[30].Comments[encoder.LineComment] = "IterateAll iterates all the values extracted from internal extractors" - HTTPRequestDoc.Fields[31].Name = "digest-username" - HTTPRequestDoc.Fields[31].Type = "string" - HTTPRequestDoc.Fields[31].Note = "" - HTTPRequestDoc.Fields[31].Description = "DigestAuthUsername specifies the username for digest authentication" - HTTPRequestDoc.Fields[31].Comments[encoder.LineComment] = "DigestAuthUsername specifies the username for digest authentication" - HTTPRequestDoc.Fields[32].Name = "digest-password" - HTTPRequestDoc.Fields[32].Type = "string" - HTTPRequestDoc.Fields[32].Note = "" - HTTPRequestDoc.Fields[32].Description = "DigestAuthPassword specifies the password for digest authentication" - HTTPRequestDoc.Fields[32].Comments[encoder.LineComment] = "DigestAuthPassword specifies the password for digest authentication" - - MATCHERSMatcherDoc.Type = "matchers.Matcher" - MATCHERSMatcherDoc.Comments[encoder.LineComment] = " Matcher is used to match a part in the output from a protocol." - MATCHERSMatcherDoc.Description = "Matcher is used to match a part in the output from a protocol." - MATCHERSMatcherDoc.AppearsIn = []encoder.Appearance{ - { - TypeName: "http.Request", - FieldName: "matchers", - }, - { - TypeName: "dns.Request", - FieldName: "matchers", - }, - { - TypeName: "file.Request", - FieldName: "matchers", - }, - { - TypeName: "network.Request", - FieldName: "matchers", - }, - { - TypeName: "headless.Request", - FieldName: "matchers", - }, - { - TypeName: "ssl.Request", - FieldName: "matchers", - }, - { - TypeName: "websocket.Request", - FieldName: "matchers", - }, - { - TypeName: "whois.Request", - FieldName: "matchers", - }, - } - MATCHERSMatcherDoc.Fields = make([]encoder.Doc, 14) - MATCHERSMatcherDoc.Fields[0].Name = "type" - MATCHERSMatcherDoc.Fields[0].Type = "MatcherTypeHolder" - MATCHERSMatcherDoc.Fields[0].Note = "" - MATCHERSMatcherDoc.Fields[0].Description = "Type is the type of the matcher." - MATCHERSMatcherDoc.Fields[0].Comments[encoder.LineComment] = "Type is the type of the matcher." - MATCHERSMatcherDoc.Fields[1].Name = "condition" - MATCHERSMatcherDoc.Fields[1].Type = "string" - MATCHERSMatcherDoc.Fields[1].Note = "" - MATCHERSMatcherDoc.Fields[1].Description = "Condition is the optional condition between two matcher variables. By default,\nthe condition is assumed to be OR." - MATCHERSMatcherDoc.Fields[1].Comments[encoder.LineComment] = "Condition is the optional condition between two matcher variables. By default," - MATCHERSMatcherDoc.Fields[1].Values = []string{ - "and", - "or", - } - MATCHERSMatcherDoc.Fields[2].Name = "part" - MATCHERSMatcherDoc.Fields[2].Type = "string" - MATCHERSMatcherDoc.Fields[2].Note = "" - MATCHERSMatcherDoc.Fields[2].Description = "Part is the part of the request response to match data from.\n\nEach protocol exposes a lot of different parts which are well\ndocumented in docs for each request type." - MATCHERSMatcherDoc.Fields[2].Comments[encoder.LineComment] = "Part is the part of the request response to match data from." - - MATCHERSMatcherDoc.Fields[2].AddExample("", "body") - - MATCHERSMatcherDoc.Fields[2].AddExample("", "raw") - MATCHERSMatcherDoc.Fields[3].Name = "negative" - MATCHERSMatcherDoc.Fields[3].Type = "bool" - MATCHERSMatcherDoc.Fields[3].Note = "" - MATCHERSMatcherDoc.Fields[3].Description = "Negative specifies if the match should be reversed\nIt will only match if the condition is not true." - MATCHERSMatcherDoc.Fields[3].Comments[encoder.LineComment] = "Negative specifies if the match should be reversed" - MATCHERSMatcherDoc.Fields[4].Name = "name" - MATCHERSMatcherDoc.Fields[4].Type = "string" - MATCHERSMatcherDoc.Fields[4].Note = "" - MATCHERSMatcherDoc.Fields[4].Description = "Name of the matcher. Name should be lowercase and must not contain\nspaces or underscores (_)." - MATCHERSMatcherDoc.Fields[4].Comments[encoder.LineComment] = "Name of the matcher. Name should be lowercase and must not contain" - - MATCHERSMatcherDoc.Fields[4].AddExample("", "cookie-matcher") - MATCHERSMatcherDoc.Fields[5].Name = "status" - MATCHERSMatcherDoc.Fields[5].Type = "[]int" - MATCHERSMatcherDoc.Fields[5].Note = "" - MATCHERSMatcherDoc.Fields[5].Description = "Status are the acceptable status codes for the response." - MATCHERSMatcherDoc.Fields[5].Comments[encoder.LineComment] = "Status are the acceptable status codes for the response." - - MATCHERSMatcherDoc.Fields[5].AddExample("", []int{200, 302}) - MATCHERSMatcherDoc.Fields[6].Name = "size" - MATCHERSMatcherDoc.Fields[6].Type = "[]int" - MATCHERSMatcherDoc.Fields[6].Note = "" - MATCHERSMatcherDoc.Fields[6].Description = "Size is the acceptable size for the response" - MATCHERSMatcherDoc.Fields[6].Comments[encoder.LineComment] = "Size is the acceptable size for the response" - - MATCHERSMatcherDoc.Fields[6].AddExample("", []int{3029, 2042}) - MATCHERSMatcherDoc.Fields[7].Name = "words" - MATCHERSMatcherDoc.Fields[7].Type = "[]string" - MATCHERSMatcherDoc.Fields[7].Note = "" - MATCHERSMatcherDoc.Fields[7].Description = "Words contains word patterns required to be present in the response part." - MATCHERSMatcherDoc.Fields[7].Comments[encoder.LineComment] = "Words contains word patterns required to be present in the response part." - - MATCHERSMatcherDoc.Fields[7].AddExample("Match for Outlook mail protection domain", []string{"mail.protection.outlook.com"}) - - MATCHERSMatcherDoc.Fields[7].AddExample("Match for application/json in response headers", []string{"application/json"}) - MATCHERSMatcherDoc.Fields[8].Name = "regex" - MATCHERSMatcherDoc.Fields[8].Type = "[]string" - MATCHERSMatcherDoc.Fields[8].Note = "" - MATCHERSMatcherDoc.Fields[8].Description = "Regex contains Regular Expression patterns required to be present in the response part." - MATCHERSMatcherDoc.Fields[8].Comments[encoder.LineComment] = "Regex contains Regular Expression patterns required to be present in the response part." - - MATCHERSMatcherDoc.Fields[8].AddExample("Match for Linkerd Service via Regex", []string{`(?mi)^Via\\s*?:.*?linkerd.*$`}) - - MATCHERSMatcherDoc.Fields[8].AddExample("Match for Open Redirect via Location header", []string{`(?m)^(?:Location\\s*?:\\s*?)(?:https?://|//)?(?:[a-zA-Z0-9\\-_\\.@]*)example\\.com.*$`}) - MATCHERSMatcherDoc.Fields[9].Name = "binary" - MATCHERSMatcherDoc.Fields[9].Type = "[]string" - MATCHERSMatcherDoc.Fields[9].Note = "" - MATCHERSMatcherDoc.Fields[9].Description = "Binary are the binary patterns required to be present in the response part." - MATCHERSMatcherDoc.Fields[9].Comments[encoder.LineComment] = "Binary are the binary patterns required to be present in the response part." - - MATCHERSMatcherDoc.Fields[9].AddExample("Match for Springboot Heapdump Actuator \"JAVA PROFILE\", \"HPROF\", \"Gunzip magic byte\"", []string{"4a4156412050524f46494c45", "4850524f46", "1f8b080000000000"}) - - MATCHERSMatcherDoc.Fields[9].AddExample("Match for 7zip files", []string{"377ABCAF271C"}) - MATCHERSMatcherDoc.Fields[10].Name = "dsl" - MATCHERSMatcherDoc.Fields[10].Type = "[]string" - MATCHERSMatcherDoc.Fields[10].Note = "" - MATCHERSMatcherDoc.Fields[10].Description = "DSL are the dsl expressions that will be evaluated as part of nuclei matching rules.\nA list of these helper functions are available [here](https://nuclei.projectdiscovery.io/templating-guide/helper-functions/)." - MATCHERSMatcherDoc.Fields[10].Comments[encoder.LineComment] = "DSL are the dsl expressions that will be evaluated as part of nuclei matching rules." - - MATCHERSMatcherDoc.Fields[10].AddExample("DSL Matcher for package.json file", []string{"contains(body, 'packages') && contains(tolower(all_headers), 'application/octet-stream') && status_code == 200"}) - - MATCHERSMatcherDoc.Fields[10].AddExample("DSL Matcher for missing strict transport security header", []string{"!contains(tolower(all_headers), ''strict-transport-security'')"}) - MATCHERSMatcherDoc.Fields[11].Name = "encoding" - MATCHERSMatcherDoc.Fields[11].Type = "string" - MATCHERSMatcherDoc.Fields[11].Note = "" - MATCHERSMatcherDoc.Fields[11].Description = "Encoding specifies the encoding for the words field if any." - MATCHERSMatcherDoc.Fields[11].Comments[encoder.LineComment] = "Encoding specifies the encoding for the words field if any." - MATCHERSMatcherDoc.Fields[11].Values = []string{ - "hex", - } - MATCHERSMatcherDoc.Fields[12].Name = "case-insensitive" - MATCHERSMatcherDoc.Fields[12].Type = "bool" - MATCHERSMatcherDoc.Fields[12].Note = "" - MATCHERSMatcherDoc.Fields[12].Description = "CaseInsensitive enables case-insensitive matches. Default is false." - MATCHERSMatcherDoc.Fields[12].Comments[encoder.LineComment] = "CaseInsensitive enables case-insensitive matches. Default is false." - MATCHERSMatcherDoc.Fields[12].Values = []string{ - "false", - "true", - } - MATCHERSMatcherDoc.Fields[13].Name = "match-all" - MATCHERSMatcherDoc.Fields[13].Type = "bool" - MATCHERSMatcherDoc.Fields[13].Note = "" - MATCHERSMatcherDoc.Fields[13].Description = "MatchAll enables matching for all matcher values. Default is false." - MATCHERSMatcherDoc.Fields[13].Comments[encoder.LineComment] = "MatchAll enables matching for all matcher values. Default is false." - MATCHERSMatcherDoc.Fields[13].Values = []string{ - "false", - "true", - } - - MatcherTypeHolderDoc.Type = "MatcherTypeHolder" - MatcherTypeHolderDoc.Comments[encoder.LineComment] = " MatcherTypeHolder is used to hold internal type of the matcher" - MatcherTypeHolderDoc.Description = "MatcherTypeHolder is used to hold internal type of the matcher" - MatcherTypeHolderDoc.AppearsIn = []encoder.Appearance{ - { - TypeName: "matchers.Matcher", - FieldName: "type", - }, - } - MatcherTypeHolderDoc.Fields = make([]encoder.Doc, 1) - MatcherTypeHolderDoc.Fields[0].Name = "" - MatcherTypeHolderDoc.Fields[0].Type = "MatcherType" - MatcherTypeHolderDoc.Fields[0].Note = "" - MatcherTypeHolderDoc.Fields[0].Description = "" - MatcherTypeHolderDoc.Fields[0].Comments[encoder.LineComment] = "" - MatcherTypeHolderDoc.Fields[0].EnumFields = []string{ - "word", - "regex", - "binary", - "status", - "size", - "dsl", - } - - EXTRACTORSExtractorDoc.Type = "extractors.Extractor" - EXTRACTORSExtractorDoc.Comments[encoder.LineComment] = " Extractor is used to extract part of response using a regex." - EXTRACTORSExtractorDoc.Description = "Extractor is used to extract part of response using a regex." - EXTRACTORSExtractorDoc.AppearsIn = []encoder.Appearance{ - { - TypeName: "http.Request", - FieldName: "extractors", - }, - { - TypeName: "dns.Request", - FieldName: "extractors", - }, - { - TypeName: "file.Request", - FieldName: "extractors", - }, - { - TypeName: "network.Request", - FieldName: "extractors", - }, - { - TypeName: "headless.Request", - FieldName: "extractors", - }, - { - TypeName: "ssl.Request", - FieldName: "extractors", - }, - { - TypeName: "websocket.Request", - FieldName: "extractors", - }, - { - TypeName: "whois.Request", - FieldName: "extractors", - }, - } - EXTRACTORSExtractorDoc.Fields = make([]encoder.Doc, 12) - EXTRACTORSExtractorDoc.Fields[0].Name = "name" - EXTRACTORSExtractorDoc.Fields[0].Type = "string" - EXTRACTORSExtractorDoc.Fields[0].Note = "" - EXTRACTORSExtractorDoc.Fields[0].Description = "Name of the extractor. Name should be lowercase and must not contain\nspaces or underscores (_)." - EXTRACTORSExtractorDoc.Fields[0].Comments[encoder.LineComment] = "Name of the extractor. Name should be lowercase and must not contain" - - EXTRACTORSExtractorDoc.Fields[0].AddExample("", "cookie-extractor") - EXTRACTORSExtractorDoc.Fields[1].Name = "type" - EXTRACTORSExtractorDoc.Fields[1].Type = "ExtractorTypeHolder" - EXTRACTORSExtractorDoc.Fields[1].Note = "" - EXTRACTORSExtractorDoc.Fields[1].Description = "Type is the type of the extractor." - EXTRACTORSExtractorDoc.Fields[1].Comments[encoder.LineComment] = "Type is the type of the extractor." - EXTRACTORSExtractorDoc.Fields[2].Name = "regex" - EXTRACTORSExtractorDoc.Fields[2].Type = "[]string" - EXTRACTORSExtractorDoc.Fields[2].Note = "" - EXTRACTORSExtractorDoc.Fields[2].Description = "Regex contains the regular expression patterns to extract from a part.\n\nGo regex engine does not support lookaheads or lookbehinds, so as a result\nthey are also not supported in nuclei." - EXTRACTORSExtractorDoc.Fields[2].Comments[encoder.LineComment] = "Regex contains the regular expression patterns to extract from a part." - - EXTRACTORSExtractorDoc.Fields[2].AddExample("Braintree Access Token Regex", []string{"access_token\\$production\\$[0-9a-z]{16}\\$[0-9a-f]{32}"}) - - EXTRACTORSExtractorDoc.Fields[2].AddExample("Wordpress Author Extraction regex", []string{"Author:(?:[A-Za-z0-9 -\\_=\"]+)?([A-Za-z0-9]+)<\\/span>"}) - EXTRACTORSExtractorDoc.Fields[3].Name = "group" - EXTRACTORSExtractorDoc.Fields[3].Type = "int" - EXTRACTORSExtractorDoc.Fields[3].Note = "" - EXTRACTORSExtractorDoc.Fields[3].Description = "Group specifies a numbered group to extract from the regex." - EXTRACTORSExtractorDoc.Fields[3].Comments[encoder.LineComment] = "Group specifies a numbered group to extract from the regex." - - EXTRACTORSExtractorDoc.Fields[3].AddExample("Example Regex Group", 1) - EXTRACTORSExtractorDoc.Fields[4].Name = "kval" - EXTRACTORSExtractorDoc.Fields[4].Type = "[]string" - EXTRACTORSExtractorDoc.Fields[4].Note = "" - EXTRACTORSExtractorDoc.Fields[4].Description = "description: |\n kval contains the key-value pairs present in the HTTP response header.\n kval extractor can be used to extract HTTP response header and cookie key-value pairs.\n kval extractor inputs are case-insensitive, and does not support dash (-) in input which can replaced with underscores (_)\n For example, Content-Type should be replaced with content_type\n\n A list of supported parts is available in docs for request types.\n examples:\n - name: Extract Server Header From HTTP Response\n value: >\n []string{\"server\"}\n - name: Extracting value of PHPSESSID Cookie\n value: >\n []string{\"phpsessid\"}\n - name: Extracting value of Content-Type Cookie\n value: >\n []string{\"content_type\"}" - EXTRACTORSExtractorDoc.Fields[4].Comments[encoder.LineComment] = " description: |" - EXTRACTORSExtractorDoc.Fields[5].Name = "json" - EXTRACTORSExtractorDoc.Fields[5].Type = "[]string" - EXTRACTORSExtractorDoc.Fields[5].Note = "" - EXTRACTORSExtractorDoc.Fields[5].Description = "JSON allows using jq-style syntax to extract items from json response" - EXTRACTORSExtractorDoc.Fields[5].Comments[encoder.LineComment] = "JSON allows using jq-style syntax to extract items from json response" - - EXTRACTORSExtractorDoc.Fields[5].AddExample("", []string{".[] | .id"}) - - EXTRACTORSExtractorDoc.Fields[5].AddExample("", []string{".batters | .batter | .[] | .id"}) - EXTRACTORSExtractorDoc.Fields[6].Name = "xpath" - EXTRACTORSExtractorDoc.Fields[6].Type = "[]string" - EXTRACTORSExtractorDoc.Fields[6].Note = "" - EXTRACTORSExtractorDoc.Fields[6].Description = "XPath allows using xpath expressions to extract items from html response" - EXTRACTORSExtractorDoc.Fields[6].Comments[encoder.LineComment] = "XPath allows using xpath expressions to extract items from html response" - - EXTRACTORSExtractorDoc.Fields[6].AddExample("", []string{"/html/body/div/p[2]/a"}) - EXTRACTORSExtractorDoc.Fields[7].Name = "attribute" - EXTRACTORSExtractorDoc.Fields[7].Type = "string" - EXTRACTORSExtractorDoc.Fields[7].Note = "" - EXTRACTORSExtractorDoc.Fields[7].Description = "Attribute is an optional attribute to extract from response XPath." - EXTRACTORSExtractorDoc.Fields[7].Comments[encoder.LineComment] = "Attribute is an optional attribute to extract from response XPath." - - EXTRACTORSExtractorDoc.Fields[7].AddExample("", "href") - EXTRACTORSExtractorDoc.Fields[8].Name = "dsl" - EXTRACTORSExtractorDoc.Fields[8].Type = "[]string" - EXTRACTORSExtractorDoc.Fields[8].Note = "" - EXTRACTORSExtractorDoc.Fields[8].Description = "Extracts using DSL expressions." - EXTRACTORSExtractorDoc.Fields[8].Comments[encoder.LineComment] = "Extracts using DSL expressions." - EXTRACTORSExtractorDoc.Fields[9].Name = "part" - EXTRACTORSExtractorDoc.Fields[9].Type = "string" - EXTRACTORSExtractorDoc.Fields[9].Note = "" - EXTRACTORSExtractorDoc.Fields[9].Description = "Part is the part of the request response to extract data from.\n\nEach protocol exposes a lot of different parts which are well\ndocumented in docs for each request type." - EXTRACTORSExtractorDoc.Fields[9].Comments[encoder.LineComment] = "Part is the part of the request response to extract data from." - - EXTRACTORSExtractorDoc.Fields[9].AddExample("", "body") - - EXTRACTORSExtractorDoc.Fields[9].AddExample("", "raw") - EXTRACTORSExtractorDoc.Fields[10].Name = "internal" - EXTRACTORSExtractorDoc.Fields[10].Type = "bool" - EXTRACTORSExtractorDoc.Fields[10].Note = "" - EXTRACTORSExtractorDoc.Fields[10].Description = "Internal, when set to true will allow using the value extracted\nin the next request for some protocols (like HTTP)." - EXTRACTORSExtractorDoc.Fields[10].Comments[encoder.LineComment] = "Internal, when set to true will allow using the value extracted" - EXTRACTORSExtractorDoc.Fields[11].Name = "case-insensitive" - EXTRACTORSExtractorDoc.Fields[11].Type = "bool" - EXTRACTORSExtractorDoc.Fields[11].Note = "" - EXTRACTORSExtractorDoc.Fields[11].Description = "CaseInsensitive enables case-insensitive extractions. Default is false." - EXTRACTORSExtractorDoc.Fields[11].Comments[encoder.LineComment] = "CaseInsensitive enables case-insensitive extractions. Default is false." - EXTRACTORSExtractorDoc.Fields[11].Values = []string{ - "false", - "true", - } - - ExtractorTypeHolderDoc.Type = "ExtractorTypeHolder" - ExtractorTypeHolderDoc.Comments[encoder.LineComment] = " ExtractorTypeHolder is used to hold internal type of the extractor" - ExtractorTypeHolderDoc.Description = "ExtractorTypeHolder is used to hold internal type of the extractor" - ExtractorTypeHolderDoc.AppearsIn = []encoder.Appearance{ - { - TypeName: "extractors.Extractor", - FieldName: "type", - }, - } - ExtractorTypeHolderDoc.Fields = make([]encoder.Doc, 1) - ExtractorTypeHolderDoc.Fields[0].Name = "" - ExtractorTypeHolderDoc.Fields[0].Type = "ExtractorType" - ExtractorTypeHolderDoc.Fields[0].Note = "" - ExtractorTypeHolderDoc.Fields[0].Description = "" - ExtractorTypeHolderDoc.Fields[0].Comments[encoder.LineComment] = "" - ExtractorTypeHolderDoc.Fields[0].EnumFields = []string{ - "regex", - "kval", - "xpath", - "json", - "dsl", - } + HTTPRequestDoc.Fields[29].Description = "DigestAuthPassword specifies the password for digest authentication" + HTTPRequestDoc.Fields[29].Comments[encoder.LineComment] = "DigestAuthPassword specifies the password for digest authentication" GENERATORSAttackTypeHolderDoc.Type = "generators.AttackTypeHolder" GENERATORSAttackTypeHolderDoc.Comments[encoder.LineComment] = " AttackTypeHolder is used to hold internal type of the protocol" @@ -1129,49 +779,30 @@ func init() { Value: "Trace contains trace data for DNS request if enabled", }, } - DNSRequestDoc.Fields = make([]encoder.Doc, 12) - DNSRequestDoc.Fields[0].Name = "matchers" - DNSRequestDoc.Fields[0].Type = "[]matchers.Matcher" + DNSRequestDoc.Fields = make([]encoder.Doc, 9) + DNSRequestDoc.Fields[0].Name = "id" + DNSRequestDoc.Fields[0].Type = "string" DNSRequestDoc.Fields[0].Note = "" - DNSRequestDoc.Fields[0].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - DNSRequestDoc.Fields[0].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - DNSRequestDoc.Fields[1].Name = "extractors" - DNSRequestDoc.Fields[1].Type = "[]extractors.Extractor" + DNSRequestDoc.Fields[0].Description = "ID is the optional id of the request" + DNSRequestDoc.Fields[0].Comments[encoder.LineComment] = " ID is the optional id of the request" + DNSRequestDoc.Fields[1].Name = "name" + DNSRequestDoc.Fields[1].Type = "string" DNSRequestDoc.Fields[1].Note = "" - DNSRequestDoc.Fields[1].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - DNSRequestDoc.Fields[1].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - DNSRequestDoc.Fields[2].Name = "matchers-condition" - DNSRequestDoc.Fields[2].Type = "string" + DNSRequestDoc.Fields[1].Description = "Name is the Hostname to make DNS request for.\n\nGenerally, it is set to {{FQDN}} which is the domain we get from input." + DNSRequestDoc.Fields[1].Comments[encoder.LineComment] = "Name is the Hostname to make DNS request for." + + DNSRequestDoc.Fields[1].AddExample("", "{{FQDN}}") + DNSRequestDoc.Fields[2].Name = "type" + DNSRequestDoc.Fields[2].Type = "DNSRequestTypeHolder" DNSRequestDoc.Fields[2].Note = "" - DNSRequestDoc.Fields[2].Description = "MatchersCondition is the condition between the matchers. Default is OR." - DNSRequestDoc.Fields[2].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - DNSRequestDoc.Fields[2].Values = []string{ - "and", - "or", - } - DNSRequestDoc.Fields[3].Name = "id" + DNSRequestDoc.Fields[2].Description = "RequestType is the type of DNS request to make." + DNSRequestDoc.Fields[2].Comments[encoder.LineComment] = "RequestType is the type of DNS request to make." + DNSRequestDoc.Fields[3].Name = "class" DNSRequestDoc.Fields[3].Type = "string" DNSRequestDoc.Fields[3].Note = "" - DNSRequestDoc.Fields[3].Description = "ID is the optional id of the request" - DNSRequestDoc.Fields[3].Comments[encoder.LineComment] = " ID is the optional id of the request" - DNSRequestDoc.Fields[4].Name = "name" - DNSRequestDoc.Fields[4].Type = "string" - DNSRequestDoc.Fields[4].Note = "" - DNSRequestDoc.Fields[4].Description = "Name is the Hostname to make DNS request for.\n\nGenerally, it is set to {{FQDN}} which is the domain we get from input." - DNSRequestDoc.Fields[4].Comments[encoder.LineComment] = "Name is the Hostname to make DNS request for." - - DNSRequestDoc.Fields[4].AddExample("", "{{FQDN}}") - DNSRequestDoc.Fields[5].Name = "type" - DNSRequestDoc.Fields[5].Type = "DNSRequestTypeHolder" - DNSRequestDoc.Fields[5].Note = "" - DNSRequestDoc.Fields[5].Description = "RequestType is the type of DNS request to make." - DNSRequestDoc.Fields[5].Comments[encoder.LineComment] = "RequestType is the type of DNS request to make." - DNSRequestDoc.Fields[6].Name = "class" - DNSRequestDoc.Fields[6].Type = "string" - DNSRequestDoc.Fields[6].Note = "" - DNSRequestDoc.Fields[6].Description = "Class is the class of the DNS request.\n\nUsually it's enough to just leave it as INET." - DNSRequestDoc.Fields[6].Comments[encoder.LineComment] = "Class is the class of the DNS request." - DNSRequestDoc.Fields[6].Values = []string{ + DNSRequestDoc.Fields[3].Description = "Class is the class of the DNS request.\n\nUsually it's enough to just leave it as INET." + DNSRequestDoc.Fields[3].Comments[encoder.LineComment] = "Class is the class of the DNS request." + DNSRequestDoc.Fields[3].Values = []string{ "inet", "csnet", "chaos", @@ -1179,35 +810,35 @@ func init() { "none", "any", } - DNSRequestDoc.Fields[7].Name = "retries" - DNSRequestDoc.Fields[7].Type = "int" + DNSRequestDoc.Fields[4].Name = "retries" + DNSRequestDoc.Fields[4].Type = "int" + DNSRequestDoc.Fields[4].Note = "" + DNSRequestDoc.Fields[4].Description = "Retries is the number of retries for the DNS request" + DNSRequestDoc.Fields[4].Comments[encoder.LineComment] = "Retries is the number of retries for the DNS request" + + DNSRequestDoc.Fields[4].AddExample("Use a retry of 3 to 5 generally", 5) + DNSRequestDoc.Fields[5].Name = "trace" + DNSRequestDoc.Fields[5].Type = "bool" + DNSRequestDoc.Fields[5].Note = "" + DNSRequestDoc.Fields[5].Description = "Trace performs a trace operation for the target." + DNSRequestDoc.Fields[5].Comments[encoder.LineComment] = "Trace performs a trace operation for the target." + DNSRequestDoc.Fields[6].Name = "trace-max-recursion" + DNSRequestDoc.Fields[6].Type = "int" + DNSRequestDoc.Fields[6].Note = "" + DNSRequestDoc.Fields[6].Description = "TraceMaxRecursion is the number of max recursion allowed for trace operations" + DNSRequestDoc.Fields[6].Comments[encoder.LineComment] = "TraceMaxRecursion is the number of max recursion allowed for trace operations" + + DNSRequestDoc.Fields[6].AddExample("Use a retry of 100 to 150 generally", 100) + DNSRequestDoc.Fields[7].Name = "recursion" + DNSRequestDoc.Fields[7].Type = "dns.bool" DNSRequestDoc.Fields[7].Note = "" - DNSRequestDoc.Fields[7].Description = "Retries is the number of retries for the DNS request" - DNSRequestDoc.Fields[7].Comments[encoder.LineComment] = "Retries is the number of retries for the DNS request" - - DNSRequestDoc.Fields[7].AddExample("Use a retry of 3 to 5 generally", 5) - DNSRequestDoc.Fields[8].Name = "trace" - DNSRequestDoc.Fields[8].Type = "bool" + DNSRequestDoc.Fields[7].Description = "Recursion determines if resolver should recurse all records to get fresh results." + DNSRequestDoc.Fields[7].Comments[encoder.LineComment] = "Recursion determines if resolver should recurse all records to get fresh results." + DNSRequestDoc.Fields[8].Name = "resolvers" + DNSRequestDoc.Fields[8].Type = "[]string" DNSRequestDoc.Fields[8].Note = "" - DNSRequestDoc.Fields[8].Description = "Trace performs a trace operation for the target." - DNSRequestDoc.Fields[8].Comments[encoder.LineComment] = "Trace performs a trace operation for the target." - DNSRequestDoc.Fields[9].Name = "trace-max-recursion" - DNSRequestDoc.Fields[9].Type = "int" - DNSRequestDoc.Fields[9].Note = "" - DNSRequestDoc.Fields[9].Description = "TraceMaxRecursion is the number of max recursion allowed for trace operations" - DNSRequestDoc.Fields[9].Comments[encoder.LineComment] = "TraceMaxRecursion is the number of max recursion allowed for trace operations" - - DNSRequestDoc.Fields[9].AddExample("Use a retry of 100 to 150 generally", 100) - DNSRequestDoc.Fields[10].Name = "recursion" - DNSRequestDoc.Fields[10].Type = "dns.bool" - DNSRequestDoc.Fields[10].Note = "" - DNSRequestDoc.Fields[10].Description = "Recursion determines if resolver should recurse all records to get fresh results." - DNSRequestDoc.Fields[10].Comments[encoder.LineComment] = "Recursion determines if resolver should recurse all records to get fresh results." - DNSRequestDoc.Fields[11].Name = "resolvers" - DNSRequestDoc.Fields[11].Type = "[]string" - DNSRequestDoc.Fields[11].Note = "" - DNSRequestDoc.Fields[11].Description = "Resolvers to use for the dns requests" - DNSRequestDoc.Fields[11].Comments[encoder.LineComment] = " Resolvers to use for the dns requests" + DNSRequestDoc.Fields[8].Description = "Resolvers to use for the dns requests" + DNSRequestDoc.Fields[8].Comments[encoder.LineComment] = " Resolvers to use for the dns requests" DNSRequestTypeHolderDoc.Type = "DNSRequestTypeHolder" DNSRequestTypeHolderDoc.Comments[encoder.LineComment] = " DNSRequestTypeHolder is used to hold internal type of the DNS type" @@ -1279,57 +910,38 @@ func init() { Value: "Raw contains the raw file contents", }, } - FILERequestDoc.Fields = make([]encoder.Doc, 8) - FILERequestDoc.Fields[0].Name = "matchers" - FILERequestDoc.Fields[0].Type = "[]matchers.Matcher" + FILERequestDoc.Fields = make([]encoder.Doc, 5) + FILERequestDoc.Fields[0].Name = "extensions" + FILERequestDoc.Fields[0].Type = "[]string" FILERequestDoc.Fields[0].Note = "" - FILERequestDoc.Fields[0].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - FILERequestDoc.Fields[0].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - FILERequestDoc.Fields[1].Name = "extractors" - FILERequestDoc.Fields[1].Type = "[]extractors.Extractor" + FILERequestDoc.Fields[0].Description = "Extensions is the list of extensions or mime types to perform matching on." + FILERequestDoc.Fields[0].Comments[encoder.LineComment] = "Extensions is the list of extensions or mime types to perform matching on." + + FILERequestDoc.Fields[0].AddExample("", []string{".txt", ".go", ".json"}) + FILERequestDoc.Fields[1].Name = "denylist" + FILERequestDoc.Fields[1].Type = "[]string" FILERequestDoc.Fields[1].Note = "" - FILERequestDoc.Fields[1].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - FILERequestDoc.Fields[1].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - FILERequestDoc.Fields[2].Name = "matchers-condition" + FILERequestDoc.Fields[1].Description = "DenyList is the list of file, directories, mime types or extensions to deny during matching.\n\nBy default, it contains some non-interesting extensions that are hardcoded\nin nuclei." + FILERequestDoc.Fields[1].Comments[encoder.LineComment] = "DenyList is the list of file, directories, mime types or extensions to deny during matching." + + FILERequestDoc.Fields[1].AddExample("", []string{".avi", ".mov", ".mp3"}) + FILERequestDoc.Fields[2].Name = "id" FILERequestDoc.Fields[2].Type = "string" FILERequestDoc.Fields[2].Note = "" - FILERequestDoc.Fields[2].Description = "MatchersCondition is the condition between the matchers. Default is OR." - FILERequestDoc.Fields[2].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - FILERequestDoc.Fields[2].Values = []string{ - "and", - "or", - } - FILERequestDoc.Fields[3].Name = "extensions" - FILERequestDoc.Fields[3].Type = "[]string" + FILERequestDoc.Fields[2].Description = "ID is the optional id of the request" + FILERequestDoc.Fields[2].Comments[encoder.LineComment] = " ID is the optional id of the request" + FILERequestDoc.Fields[3].Name = "max-size" + FILERequestDoc.Fields[3].Type = "string" FILERequestDoc.Fields[3].Note = "" - FILERequestDoc.Fields[3].Description = "Extensions is the list of extensions or mime types to perform matching on." - FILERequestDoc.Fields[3].Comments[encoder.LineComment] = "Extensions is the list of extensions or mime types to perform matching on." + FILERequestDoc.Fields[3].Description = "MaxSize is the maximum size of the file to run request on.\n\nBy default, nuclei will process 1 GB of content and not go more than that.\nIt can be set to much lower or higher depending on use.\nIf set to \"no\" then all content will be processed" + FILERequestDoc.Fields[3].Comments[encoder.LineComment] = "MaxSize is the maximum size of the file to run request on." - FILERequestDoc.Fields[3].AddExample("", []string{".txt", ".go", ".json"}) - FILERequestDoc.Fields[4].Name = "denylist" - FILERequestDoc.Fields[4].Type = "[]string" + FILERequestDoc.Fields[3].AddExample("", "5Mb") + FILERequestDoc.Fields[4].Name = "no-recursive" + FILERequestDoc.Fields[4].Type = "bool" FILERequestDoc.Fields[4].Note = "" - FILERequestDoc.Fields[4].Description = "DenyList is the list of file, directories, mime types or extensions to deny during matching.\n\nBy default, it contains some non-interesting extensions that are hardcoded\nin nuclei." - FILERequestDoc.Fields[4].Comments[encoder.LineComment] = "DenyList is the list of file, directories, mime types or extensions to deny during matching." - - FILERequestDoc.Fields[4].AddExample("", []string{".avi", ".mov", ".mp3"}) - FILERequestDoc.Fields[5].Name = "id" - FILERequestDoc.Fields[5].Type = "string" - FILERequestDoc.Fields[5].Note = "" - FILERequestDoc.Fields[5].Description = "ID is the optional id of the request" - FILERequestDoc.Fields[5].Comments[encoder.LineComment] = " ID is the optional id of the request" - FILERequestDoc.Fields[6].Name = "max-size" - FILERequestDoc.Fields[6].Type = "string" - FILERequestDoc.Fields[6].Note = "" - FILERequestDoc.Fields[6].Description = "MaxSize is the maximum size of the file to run request on.\n\nBy default, nuclei will process 1 GB of content and not go more than that.\nIt can be set to much lower or higher depending on use.\nIf set to \"no\" then all content will be processed" - FILERequestDoc.Fields[6].Comments[encoder.LineComment] = "MaxSize is the maximum size of the file to run request on." - - FILERequestDoc.Fields[6].AddExample("", "5Mb") - FILERequestDoc.Fields[7].Name = "no-recursive" - FILERequestDoc.Fields[7].Type = "bool" - FILERequestDoc.Fields[7].Note = "" - FILERequestDoc.Fields[7].Description = "NoRecursive specifies whether to not do recursive checks if folders are provided." - FILERequestDoc.Fields[7].Comments[encoder.LineComment] = "NoRecursive specifies whether to not do recursive checks if folders are provided." + FILERequestDoc.Fields[4].Description = "NoRecursive specifies whether to not do recursive checks if folders are provided." + FILERequestDoc.Fields[4].Comments[encoder.LineComment] = "NoRecursive specifies whether to not do recursive checks if folders are provided." NETWORKRequestDoc.Type = "network.Request" NETWORKRequestDoc.Comments[encoder.LineComment] = " Request contains a Network protocol request to be made from a template" @@ -1380,7 +992,7 @@ func init() { Value: "Full Network protocol data", }, } - NETWORKRequestDoc.Fields = make([]encoder.Doc, 10) + NETWORKRequestDoc.Fields = make([]encoder.Doc, 7) NETWORKRequestDoc.Fields[0].Name = "id" NETWORKRequestDoc.Fields[0].Type = "string" NETWORKRequestDoc.Fields[0].Note = "" @@ -1422,25 +1034,6 @@ func init() { NETWORKRequestDoc.Fields[6].Comments[encoder.LineComment] = "ReadAll determines if the data stream should be read till the end regardless of the size" NETWORKRequestDoc.Fields[6].AddExample("", false) - NETWORKRequestDoc.Fields[7].Name = "matchers" - NETWORKRequestDoc.Fields[7].Type = "[]matchers.Matcher" - NETWORKRequestDoc.Fields[7].Note = "" - NETWORKRequestDoc.Fields[7].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - NETWORKRequestDoc.Fields[7].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - NETWORKRequestDoc.Fields[8].Name = "extractors" - NETWORKRequestDoc.Fields[8].Type = "[]extractors.Extractor" - NETWORKRequestDoc.Fields[8].Note = "" - NETWORKRequestDoc.Fields[8].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - NETWORKRequestDoc.Fields[8].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - NETWORKRequestDoc.Fields[9].Name = "matchers-condition" - NETWORKRequestDoc.Fields[9].Type = "string" - NETWORKRequestDoc.Fields[9].Note = "" - NETWORKRequestDoc.Fields[9].Description = "MatchersCondition is the condition between the matchers. Default is OR." - NETWORKRequestDoc.Fields[9].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - NETWORKRequestDoc.Fields[9].Values = []string{ - "and", - "or", - } NETWORKInputDoc.Type = "network.Input" NETWORKInputDoc.Comments[encoder.LineComment] = "" @@ -1548,7 +1141,7 @@ func init() { Value: "Headless response received from client (default)", }, } - HEADLESSRequestDoc.Fields = make([]encoder.Doc, 10) + HEADLESSRequestDoc.Fields = make([]encoder.Doc, 7) HEADLESSRequestDoc.Fields[0].Name = "id" HEADLESSRequestDoc.Fields[0].Type = "string" HEADLESSRequestDoc.Fields[0].Note = "" @@ -1584,25 +1177,6 @@ func init() { HEADLESSRequestDoc.Fields[6].Note = "" HEADLESSRequestDoc.Fields[6].Description = "StopAtFirstMatch stops the execution of the requests and template as soon as a match is found." HEADLESSRequestDoc.Fields[6].Comments[encoder.LineComment] = "StopAtFirstMatch stops the execution of the requests and template as soon as a match is found." - HEADLESSRequestDoc.Fields[7].Name = "matchers" - HEADLESSRequestDoc.Fields[7].Type = "[]matchers.Matcher" - HEADLESSRequestDoc.Fields[7].Note = "" - HEADLESSRequestDoc.Fields[7].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - HEADLESSRequestDoc.Fields[7].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - HEADLESSRequestDoc.Fields[8].Name = "extractors" - HEADLESSRequestDoc.Fields[8].Type = "[]extractors.Extractor" - HEADLESSRequestDoc.Fields[8].Note = "" - HEADLESSRequestDoc.Fields[8].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - HEADLESSRequestDoc.Fields[8].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - HEADLESSRequestDoc.Fields[9].Name = "matchers-condition" - HEADLESSRequestDoc.Fields[9].Type = "string" - HEADLESSRequestDoc.Fields[9].Note = "" - HEADLESSRequestDoc.Fields[9].Description = "MatchersCondition is the condition between the matchers. Default is OR." - HEADLESSRequestDoc.Fields[9].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - HEADLESSRequestDoc.Fields[9].Values = []string{ - "and", - "or", - } ENGINEActionDoc.Type = "engine.Action" ENGINEActionDoc.Comments[encoder.LineComment] = " Action is an action taken by the browser to reach a navigation" @@ -1728,70 +1302,46 @@ func init() { Value: "Matched is the input which was matched upon", }, } - SSLRequestDoc.Fields = make([]encoder.Doc, 8) - SSLRequestDoc.Fields[0].Name = "matchers" - SSLRequestDoc.Fields[0].Type = "[]matchers.Matcher" + SSLRequestDoc.Fields = make([]encoder.Doc, 5) + SSLRequestDoc.Fields[0].Name = "address" + SSLRequestDoc.Fields[0].Type = "string" SSLRequestDoc.Fields[0].Note = "" - SSLRequestDoc.Fields[0].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - SSLRequestDoc.Fields[0].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - SSLRequestDoc.Fields[1].Name = "extractors" - SSLRequestDoc.Fields[1].Type = "[]extractors.Extractor" + SSLRequestDoc.Fields[0].Description = "Address contains address for the request" + SSLRequestDoc.Fields[0].Comments[encoder.LineComment] = "Address contains address for the request" + SSLRequestDoc.Fields[1].Name = "min_version" + SSLRequestDoc.Fields[1].Type = "string" SSLRequestDoc.Fields[1].Note = "" - SSLRequestDoc.Fields[1].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - SSLRequestDoc.Fields[1].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - SSLRequestDoc.Fields[2].Name = "matchers-condition" + SSLRequestDoc.Fields[1].Description = "Minimum tls version - auto if not specified." + SSLRequestDoc.Fields[1].Comments[encoder.LineComment] = "Minimum tls version - auto if not specified." + SSLRequestDoc.Fields[1].Values = []string{ + "sslv3", + "tls10", + "tls11", + "tls12", + "tls13", + } + SSLRequestDoc.Fields[2].Name = "max_version" SSLRequestDoc.Fields[2].Type = "string" SSLRequestDoc.Fields[2].Note = "" - SSLRequestDoc.Fields[2].Description = "MatchersCondition is the condition between the matchers. Default is OR." - SSLRequestDoc.Fields[2].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." + SSLRequestDoc.Fields[2].Description = "Max tls version - auto if not specified." + SSLRequestDoc.Fields[2].Comments[encoder.LineComment] = "Max tls version - auto if not specified." SSLRequestDoc.Fields[2].Values = []string{ - "and", - "or", + "sslv3", + "tls10", + "tls11", + "tls12", + "tls13", } - SSLRequestDoc.Fields[3].Name = "address" - SSLRequestDoc.Fields[3].Type = "string" + SSLRequestDoc.Fields[3].Name = "cipher_suites" + SSLRequestDoc.Fields[3].Type = "[]string" SSLRequestDoc.Fields[3].Note = "" - SSLRequestDoc.Fields[3].Description = "Address contains address for the request" - SSLRequestDoc.Fields[3].Comments[encoder.LineComment] = "Address contains address for the request" - SSLRequestDoc.Fields[4].Name = "min_version" + SSLRequestDoc.Fields[3].Description = "Client Cipher Suites - auto if not specified." + SSLRequestDoc.Fields[3].Comments[encoder.LineComment] = "Client Cipher Suites - auto if not specified." + SSLRequestDoc.Fields[4].Name = "scan_mode" SSLRequestDoc.Fields[4].Type = "string" SSLRequestDoc.Fields[4].Note = "" - SSLRequestDoc.Fields[4].Description = "Minimum tls version - auto if not specified." - SSLRequestDoc.Fields[4].Comments[encoder.LineComment] = "Minimum tls version - auto if not specified." - SSLRequestDoc.Fields[4].Values = []string{ - "sslv3", - "tls10", - "tls11", - "tls12", - "tls13", - } - SSLRequestDoc.Fields[5].Name = "max_version" - SSLRequestDoc.Fields[5].Type = "string" - SSLRequestDoc.Fields[5].Note = "" - SSLRequestDoc.Fields[5].Description = "Max tls version - auto if not specified." - SSLRequestDoc.Fields[5].Comments[encoder.LineComment] = "Max tls version - auto if not specified." - SSLRequestDoc.Fields[5].Values = []string{ - "sslv3", - "tls10", - "tls11", - "tls12", - "tls13", - } - SSLRequestDoc.Fields[6].Name = "cipher_suites" - SSLRequestDoc.Fields[6].Type = "[]string" - SSLRequestDoc.Fields[6].Note = "" - SSLRequestDoc.Fields[6].Description = "Client Cipher Suites - auto if not specified." - SSLRequestDoc.Fields[6].Comments[encoder.LineComment] = "Client Cipher Suites - auto if not specified." - SSLRequestDoc.Fields[7].Name = "scan_mode" - SSLRequestDoc.Fields[7].Type = "string" - SSLRequestDoc.Fields[7].Note = "" - SSLRequestDoc.Fields[7].Description = "Tls Scan Mode - auto if not specified" - SSLRequestDoc.Fields[7].Comments[encoder.LineComment] = "Tls Scan Mode - auto if not specified" - SSLRequestDoc.Fields[7].Values = []string{ - "ctls", - "ztls", - "auto", - } + SSLRequestDoc.Fields[4].Description = "description: |\n Tls Scan Mode - auto if not specified\n values:\n - \"ctls\"\n - \"ztls\"\n - \"auto\"\n - \"openssl\" # reverts to \"auto\" is openssl is not installed" + SSLRequestDoc.Fields[4].Comments[encoder.LineComment] = " description: |" WEBSOCKETRequestDoc.Type = "websocket.Request" WEBSOCKETRequestDoc.Comments[encoder.LineComment] = " Request is a request for the Websocket protocol" @@ -1828,51 +1378,32 @@ func init() { Value: "Matched is the input which was matched upon", }, } - WEBSOCKETRequestDoc.Fields = make([]encoder.Doc, 8) - WEBSOCKETRequestDoc.Fields[0].Name = "matchers" - WEBSOCKETRequestDoc.Fields[0].Type = "[]matchers.Matcher" + WEBSOCKETRequestDoc.Fields = make([]encoder.Doc, 5) + WEBSOCKETRequestDoc.Fields[0].Name = "address" + WEBSOCKETRequestDoc.Fields[0].Type = "string" WEBSOCKETRequestDoc.Fields[0].Note = "" - WEBSOCKETRequestDoc.Fields[0].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - WEBSOCKETRequestDoc.Fields[0].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - WEBSOCKETRequestDoc.Fields[1].Name = "extractors" - WEBSOCKETRequestDoc.Fields[1].Type = "[]extractors.Extractor" + WEBSOCKETRequestDoc.Fields[0].Description = "Address contains address for the request" + WEBSOCKETRequestDoc.Fields[0].Comments[encoder.LineComment] = "Address contains address for the request" + WEBSOCKETRequestDoc.Fields[1].Name = "inputs" + WEBSOCKETRequestDoc.Fields[1].Type = "[]websocket.Input" WEBSOCKETRequestDoc.Fields[1].Note = "" - WEBSOCKETRequestDoc.Fields[1].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - WEBSOCKETRequestDoc.Fields[1].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - WEBSOCKETRequestDoc.Fields[2].Name = "matchers-condition" - WEBSOCKETRequestDoc.Fields[2].Type = "string" + WEBSOCKETRequestDoc.Fields[1].Description = "Inputs contains inputs for the websocket protocol" + WEBSOCKETRequestDoc.Fields[1].Comments[encoder.LineComment] = "Inputs contains inputs for the websocket protocol" + WEBSOCKETRequestDoc.Fields[2].Name = "headers" + WEBSOCKETRequestDoc.Fields[2].Type = "map[string]string" WEBSOCKETRequestDoc.Fields[2].Note = "" - WEBSOCKETRequestDoc.Fields[2].Description = "MatchersCondition is the condition between the matchers. Default is OR." - WEBSOCKETRequestDoc.Fields[2].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - WEBSOCKETRequestDoc.Fields[2].Values = []string{ - "and", - "or", - } - WEBSOCKETRequestDoc.Fields[3].Name = "address" - WEBSOCKETRequestDoc.Fields[3].Type = "string" + WEBSOCKETRequestDoc.Fields[2].Description = "Headers contains headers for the request." + WEBSOCKETRequestDoc.Fields[2].Comments[encoder.LineComment] = "Headers contains headers for the request." + WEBSOCKETRequestDoc.Fields[3].Name = "attack" + WEBSOCKETRequestDoc.Fields[3].Type = "generators.AttackTypeHolder" WEBSOCKETRequestDoc.Fields[3].Note = "" - WEBSOCKETRequestDoc.Fields[3].Description = "Address contains address for the request" - WEBSOCKETRequestDoc.Fields[3].Comments[encoder.LineComment] = "Address contains address for the request" - WEBSOCKETRequestDoc.Fields[4].Name = "inputs" - WEBSOCKETRequestDoc.Fields[4].Type = "[]websocket.Input" + WEBSOCKETRequestDoc.Fields[3].Description = "Attack is the type of payload combinations to perform.\n\nSniper is each payload once, pitchfork combines multiple payload sets and clusterbomb generates\npermutations and combinations for all payloads." + WEBSOCKETRequestDoc.Fields[3].Comments[encoder.LineComment] = "Attack is the type of payload combinations to perform." + WEBSOCKETRequestDoc.Fields[4].Name = "payloads" + WEBSOCKETRequestDoc.Fields[4].Type = "map[string]interface{}" WEBSOCKETRequestDoc.Fields[4].Note = "" - WEBSOCKETRequestDoc.Fields[4].Description = "Inputs contains inputs for the websocket protocol" - WEBSOCKETRequestDoc.Fields[4].Comments[encoder.LineComment] = "Inputs contains inputs for the websocket protocol" - WEBSOCKETRequestDoc.Fields[5].Name = "headers" - WEBSOCKETRequestDoc.Fields[5].Type = "map[string]string" - WEBSOCKETRequestDoc.Fields[5].Note = "" - WEBSOCKETRequestDoc.Fields[5].Description = "Headers contains headers for the request." - WEBSOCKETRequestDoc.Fields[5].Comments[encoder.LineComment] = "Headers contains headers for the request." - WEBSOCKETRequestDoc.Fields[6].Name = "attack" - WEBSOCKETRequestDoc.Fields[6].Type = "generators.AttackTypeHolder" - WEBSOCKETRequestDoc.Fields[6].Note = "" - WEBSOCKETRequestDoc.Fields[6].Description = "Attack is the type of payload combinations to perform.\n\nSniper is each payload once, pitchfork combines multiple payload sets and clusterbomb generates\npermutations and combinations for all payloads." - WEBSOCKETRequestDoc.Fields[6].Comments[encoder.LineComment] = "Attack is the type of payload combinations to perform." - WEBSOCKETRequestDoc.Fields[7].Name = "payloads" - WEBSOCKETRequestDoc.Fields[7].Type = "map[string]interface{}" - WEBSOCKETRequestDoc.Fields[7].Note = "" - WEBSOCKETRequestDoc.Fields[7].Description = "Payloads contains any payloads for the current request.\n\nPayloads support both key-values combinations where a list\nof payloads is provided, or optionally a single file can also\nbe provided as payload which will be read on run-time." - WEBSOCKETRequestDoc.Fields[7].Comments[encoder.LineComment] = "Payloads contains any payloads for the current request." + WEBSOCKETRequestDoc.Fields[4].Description = "Payloads contains any payloads for the current request.\n\nPayloads support both key-values combinations where a list\nof payloads is provided, or optionally a single file can also\nbe provided as payload which will be read on run-time." + WEBSOCKETRequestDoc.Fields[4].Comments[encoder.LineComment] = "Payloads contains any payloads for the current request." WEBSOCKETInputDoc.Type = "websocket.Input" WEBSOCKETInputDoc.Comments[encoder.LineComment] = "" @@ -1910,109 +1441,17 @@ func init() { FieldName: "whois", }, } - WHOISRequestDoc.Fields = make([]encoder.Doc, 5) - WHOISRequestDoc.Fields[0].Name = "matchers" - WHOISRequestDoc.Fields[0].Type = "[]matchers.Matcher" + WHOISRequestDoc.Fields = make([]encoder.Doc, 2) + WHOISRequestDoc.Fields[0].Name = "query" + WHOISRequestDoc.Fields[0].Type = "string" WHOISRequestDoc.Fields[0].Note = "" - WHOISRequestDoc.Fields[0].Description = "Matchers contains the detection mechanism for the request to identify\nwhether the request was successful by doing pattern matching\non request/responses.\n\nMultiple matchers can be combined with `matcher-condition` flag\nwhich accepts either `and` or `or` as argument." - WHOISRequestDoc.Fields[0].Comments[encoder.LineComment] = "Matchers contains the detection mechanism for the request to identify" - WHOISRequestDoc.Fields[1].Name = "extractors" - WHOISRequestDoc.Fields[1].Type = "[]extractors.Extractor" + WHOISRequestDoc.Fields[0].Description = "Query contains query for the request" + WHOISRequestDoc.Fields[0].Comments[encoder.LineComment] = "Query contains query for the request" + WHOISRequestDoc.Fields[1].Name = "server" + WHOISRequestDoc.Fields[1].Type = "string" WHOISRequestDoc.Fields[1].Note = "" - WHOISRequestDoc.Fields[1].Description = "Extractors contains the extraction mechanism for the request to identify\nand extract parts of the response." - WHOISRequestDoc.Fields[1].Comments[encoder.LineComment] = "Extractors contains the extraction mechanism for the request to identify" - WHOISRequestDoc.Fields[2].Name = "matchers-condition" - WHOISRequestDoc.Fields[2].Type = "string" - WHOISRequestDoc.Fields[2].Note = "" - WHOISRequestDoc.Fields[2].Description = "MatchersCondition is the condition between the matchers. Default is OR." - WHOISRequestDoc.Fields[2].Comments[encoder.LineComment] = "MatchersCondition is the condition between the matchers. Default is OR." - WHOISRequestDoc.Fields[2].Values = []string{ - "and", - "or", - } - WHOISRequestDoc.Fields[3].Name = "query" - WHOISRequestDoc.Fields[3].Type = "string" - WHOISRequestDoc.Fields[3].Note = "" - WHOISRequestDoc.Fields[3].Description = "Query contains query for the request" - WHOISRequestDoc.Fields[3].Comments[encoder.LineComment] = "Query contains query for the request" - WHOISRequestDoc.Fields[4].Name = "server" - WHOISRequestDoc.Fields[4].Type = "string" - WHOISRequestDoc.Fields[4].Note = "" - WHOISRequestDoc.Fields[4].Description = "description: |\n Optional WHOIS server URL.\n\n If present, specifies the WHOIS server to execute the Request on.\n Otherwise, nil enables bootstrapping" - WHOISRequestDoc.Fields[4].Comments[encoder.LineComment] = " description: |" - - WORKFLOWSWorkflowTemplateDoc.Type = "workflows.WorkflowTemplate" - WORKFLOWSWorkflowTemplateDoc.Comments[encoder.LineComment] = "" - WORKFLOWSWorkflowTemplateDoc.Description = "" - WORKFLOWSWorkflowTemplateDoc.AppearsIn = []encoder.Appearance{ - { - TypeName: "Template", - FieldName: "workflows", - }, - { - TypeName: "workflows.WorkflowTemplate", - FieldName: "subtemplates", - }, - { - TypeName: "workflows.Matcher", - FieldName: "subtemplates", - }, - } - WORKFLOWSWorkflowTemplateDoc.Fields = make([]encoder.Doc, 4) - WORKFLOWSWorkflowTemplateDoc.Fields[0].Name = "template" - WORKFLOWSWorkflowTemplateDoc.Fields[0].Type = "string" - WORKFLOWSWorkflowTemplateDoc.Fields[0].Note = "" - WORKFLOWSWorkflowTemplateDoc.Fields[0].Description = "Template is a single template or directory to execute as part of workflow." - WORKFLOWSWorkflowTemplateDoc.Fields[0].Comments[encoder.LineComment] = "Template is a single template or directory to execute as part of workflow." - - WORKFLOWSWorkflowTemplateDoc.Fields[0].AddExample("A single template", "dns/worksites-detection.yaml") - - WORKFLOWSWorkflowTemplateDoc.Fields[0].AddExample("A template directory", "misconfigurations/aem") - WORKFLOWSWorkflowTemplateDoc.Fields[1].Name = "tags" - WORKFLOWSWorkflowTemplateDoc.Fields[1].Type = "stringslice.StringSlice" - WORKFLOWSWorkflowTemplateDoc.Fields[1].Note = "" - WORKFLOWSWorkflowTemplateDoc.Fields[1].Description = "Tags to run templates based on." - WORKFLOWSWorkflowTemplateDoc.Fields[1].Comments[encoder.LineComment] = "Tags to run templates based on." - WORKFLOWSWorkflowTemplateDoc.Fields[2].Name = "matchers" - WORKFLOWSWorkflowTemplateDoc.Fields[2].Type = "[]workflows.Matcher" - WORKFLOWSWorkflowTemplateDoc.Fields[2].Note = "" - WORKFLOWSWorkflowTemplateDoc.Fields[2].Description = "Matchers perform name based matching to run subtemplates for a workflow." - WORKFLOWSWorkflowTemplateDoc.Fields[2].Comments[encoder.LineComment] = "Matchers perform name based matching to run subtemplates for a workflow." - WORKFLOWSWorkflowTemplateDoc.Fields[3].Name = "subtemplates" - WORKFLOWSWorkflowTemplateDoc.Fields[3].Type = "[]workflows.WorkflowTemplate" - WORKFLOWSWorkflowTemplateDoc.Fields[3].Note = "" - WORKFLOWSWorkflowTemplateDoc.Fields[3].Description = "Subtemplates are run if the `template` field Template matches." - WORKFLOWSWorkflowTemplateDoc.Fields[3].Comments[encoder.LineComment] = "Subtemplates are run if the `template` field Template matches." - - WORKFLOWSMatcherDoc.Type = "workflows.Matcher" - WORKFLOWSMatcherDoc.Comments[encoder.LineComment] = "" - WORKFLOWSMatcherDoc.Description = "" - WORKFLOWSMatcherDoc.AppearsIn = []encoder.Appearance{ - { - TypeName: "workflows.WorkflowTemplate", - FieldName: "matchers", - }, - } - WORKFLOWSMatcherDoc.Fields = make([]encoder.Doc, 3) - WORKFLOWSMatcherDoc.Fields[0].Name = "name" - WORKFLOWSMatcherDoc.Fields[0].Type = "stringslice.StringSlice" - WORKFLOWSMatcherDoc.Fields[0].Note = "" - WORKFLOWSMatcherDoc.Fields[0].Description = "Name is the name of the items to match." - WORKFLOWSMatcherDoc.Fields[0].Comments[encoder.LineComment] = "Name is the name of the items to match." - WORKFLOWSMatcherDoc.Fields[1].Name = "condition" - WORKFLOWSMatcherDoc.Fields[1].Type = "string" - WORKFLOWSMatcherDoc.Fields[1].Note = "" - WORKFLOWSMatcherDoc.Fields[1].Description = "Condition is the optional condition between names. By default,\nthe condition is assumed to be OR." - WORKFLOWSMatcherDoc.Fields[1].Comments[encoder.LineComment] = "Condition is the optional condition between names. By default," - WORKFLOWSMatcherDoc.Fields[1].Values = []string{ - "and", - "or", - } - WORKFLOWSMatcherDoc.Fields[2].Name = "subtemplates" - WORKFLOWSMatcherDoc.Fields[2].Type = "[]workflows.WorkflowTemplate" - WORKFLOWSMatcherDoc.Fields[2].Note = "" - WORKFLOWSMatcherDoc.Fields[2].Description = "Subtemplates are run if the name of matcher matches." - WORKFLOWSMatcherDoc.Fields[2].Comments[encoder.LineComment] = "Subtemplates are run if the name of matcher matches." + WHOISRequestDoc.Fields[1].Description = "description: |\n Optional WHOIS server URL.\n\n If present, specifies the WHOIS server to execute the Request on.\n Otherwise, nil enables bootstrapping" + WHOISRequestDoc.Fields[1].Comments[encoder.LineComment] = " description: |" HTTPSignatureTypeHolderDoc.Type = "http.SignatureTypeHolder" HTTPSignatureTypeHolderDoc.Comments[encoder.LineComment] = " SignatureTypeHolder is used to hold internal type of the signature" @@ -2046,13 +1485,10 @@ func GetTemplateDoc() *encoder.FileDoc { &TemplateDoc, &MODELInfoDoc, &STRINGSLICEStringSliceDoc, + &STRINGSLICERawStringSliceDoc, &SEVERITYHolderDoc, &MODELClassificationDoc, &HTTPRequestDoc, - &MATCHERSMatcherDoc, - &MatcherTypeHolderDoc, - &EXTRACTORSExtractorDoc, - &ExtractorTypeHolderDoc, &GENERATORSAttackTypeHolderDoc, &HTTPMethodTypeHolderDoc, &FUZZRuleDoc, @@ -2071,8 +1507,6 @@ func GetTemplateDoc() *encoder.FileDoc { &WEBSOCKETRequestDoc, &WEBSOCKETInputDoc, &WHOISRequestDoc, - &WORKFLOWSWorkflowTemplateDoc, - &WORKFLOWSMatcherDoc, &HTTPSignatureTypeHolderDoc, &VARIABLESVariableDoc, }, diff --git a/v2/pkg/testutils/integration.go b/v2/pkg/testutils/integration.go index 5968e44b..bf973dfa 100644 --- a/v2/pkg/testutils/integration.go +++ b/v2/pkg/testutils/integration.go @@ -50,6 +50,8 @@ func RunNucleiBareArgsAndGetResults(debug bool, extra ...string) ([]string, erro extra = append(extra, ExtraDebugArgs...) cmd.Args = append(cmd.Args, extra...) cmd.Args = append(cmd.Args, "-duc") // disable auto updates + cmd.Args = append(cmd.Args, "-interactions-poll-duration", "1") + cmd.Args = append(cmd.Args, "-interactions-cooldown-period", "10") if debug { cmd.Args = append(cmd.Args, "-debug") cmd.Stderr = os.Stderr @@ -98,6 +100,7 @@ func RunNucleiBinaryAndGetLoadedTemplates(nucleiBinary string, debug bool, args return matches[0][1], nil } func RunNucleiBinaryAndGetCombinedOutput(debug bool, args []string) (string, error) { + args = append(args, "-interactions-cooldown-period", "10", "-interactions-poll-duration", "1") cmd := exec.Command("./nuclei", args...) if debug { cmd.Args = append(cmd.Args, "-debug") diff --git a/v2/pkg/types/scanstrategy/scan_strategy.go b/v2/pkg/types/scanstrategy/scan_strategy.go new file mode 100644 index 00000000..c8c89311 --- /dev/null +++ b/v2/pkg/types/scanstrategy/scan_strategy.go @@ -0,0 +1,28 @@ +package scanstrategy + +import ( + mapsutil "github.com/projectdiscovery/utils/maps" +) + +// ScanStrategy supported +type ScanStrategy uint8 + +const ( + Auto ScanStrategy = iota + HostSpray + TemplateSpray +) + +var strategies mapsutil.Map[ScanStrategy, string] + +func init() { + strategies = make(mapsutil.Map[ScanStrategy, string]) + strategies[Auto] = "auto" + strategies[HostSpray] = "host-spray" + strategies[TemplateSpray] = "template-spray" +} + +// String representation of the scan strategy +func (s ScanStrategy) String() string { + return strategies[s] +} diff --git a/v2/pkg/types/types.go b/v2/pkg/types/types.go index 40f69d4a..3a989d02 100644 --- a/v2/pkg/types/types.go +++ b/v2/pkg/types/types.go @@ -139,6 +139,8 @@ type Options struct { MetricsPort int // MaxHostError is the maximum number of errors allowed for a host MaxHostError int + // TrackError contains additional error messages that count towards the maximum number of errors allowed for a host + TrackError goflags.StringSlice // NoHostErrors disables host skipping after maximum number of errors NoHostErrors bool // BulkSize is the of targets analyzed in parallel for each template diff --git a/v2/pkg/utils/utils.go b/v2/pkg/utils/utils.go index ba04589a..9b6e42c1 100644 --- a/v2/pkg/utils/utils.go +++ b/v2/pkg/utils/utils.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/projectdiscovery/nuclei/v2/pkg/catalog" + "github.com/projectdiscovery/nuclei/v2/pkg/catalog/config" "github.com/projectdiscovery/nuclei/v2/pkg/utils/yaml" "github.com/projectdiscovery/retryablehttp-go" fileutil "github.com/projectdiscovery/utils/file" @@ -58,7 +59,7 @@ func ReadFromPathOrURL(templatePath string, catalog catalog.Catalog) (data []byt } // pre-process directives only for local files - if fileutil.FileExists(templatePath) { + if fileutil.FileExists(templatePath) && config.GetTemplateFormatFromExt(templatePath) == config.YAML { data, err = yaml.PreProcess(data) if err != nil { return nil, err diff --git a/v2/pkg/utils/yaml/preprocess.go b/v2/pkg/utils/yaml/preprocess.go index 6dd0e121..c918f07b 100644 --- a/v2/pkg/utils/yaml/preprocess.go +++ b/v2/pkg/utils/yaml/preprocess.go @@ -7,6 +7,7 @@ import ( "regexp" "strings" + "github.com/projectdiscovery/nuclei/v2/pkg/templates/extensions" fileutil "github.com/projectdiscovery/utils/file" stringsutil "github.com/projectdiscovery/utils/strings" ) @@ -52,7 +53,7 @@ func PreProcess(data []byte) ([]byte, error) { return nil, err } // if it's yaml, tries to preprocess that too recursively - if stringsutil.HasSuffixAny(includeFileName, ".yaml") { + if stringsutil.HasSuffixAny(includeFileName, extensions.YAML) { if subIncludedFileContent, err := PreProcess(includeFileContent); err == nil { includeFileContent = subIncludedFileContent } else {