Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/input/formats/swagger/swagger.go
2070 views
1
package swagger
2
3
import (
4
"io"
5
"path"
6
7
"github.com/getkin/kin-openapi/openapi2"
8
"github.com/getkin/kin-openapi/openapi2conv"
9
"github.com/getkin/kin-openapi/openapi3"
10
"github.com/invopop/yaml"
11
"github.com/pkg/errors"
12
"github.com/projectdiscovery/nuclei/v3/pkg/input/formats"
13
"github.com/projectdiscovery/nuclei/v3/pkg/input/formats/openapi"
14
15
"github.com/projectdiscovery/nuclei/v3/pkg/utils/json"
16
)
17
18
// SwaggerFormat is a Swagger Schema File parser
19
type SwaggerFormat struct {
20
opts formats.InputFormatOptions
21
}
22
23
// New creates a new Swagger format parser
24
func New() *SwaggerFormat {
25
return &SwaggerFormat{}
26
}
27
28
var _ formats.Format = &SwaggerFormat{}
29
30
// Name returns the name of the format
31
func (j *SwaggerFormat) Name() string {
32
return "swagger"
33
}
34
35
func (j *SwaggerFormat) SetOptions(options formats.InputFormatOptions) {
36
j.opts = options
37
}
38
39
// Parse parses the input and calls the provided callback
40
// function for each RawRequest it discovers.
41
func (j *SwaggerFormat) Parse(input io.Reader, resultsCb formats.ParseReqRespCallback, filePath string) error {
42
schemav2 := &openapi2.T{}
43
ext := path.Ext(filePath)
44
var err error
45
if ext == ".yaml" || ext == ".yml" {
46
var data []byte
47
data, err = io.ReadAll(input)
48
if err != nil {
49
return errors.Wrap(err, "could not read data file")
50
}
51
err = yaml.Unmarshal(data, schemav2)
52
} else {
53
err = json.NewDecoder(input).Decode(schemav2)
54
}
55
if err != nil {
56
return errors.Wrap(err, "could not decode openapi 2.0 schema")
57
}
58
schema, err := openapi2conv.ToV3(schemav2)
59
if err != nil {
60
return errors.Wrap(err, "could not convert openapi 2.0 schema to 3.0")
61
}
62
loader := openapi3.NewLoader()
63
err = loader.ResolveRefsIn(schema, nil)
64
if err != nil {
65
return errors.Wrap(err, "could not resolve openapi schema references")
66
}
67
return openapi.GenerateRequestsFromSchema(schema, j.opts, resultsCb)
68
}
69
70