Path: blob/dev/pkg/input/formats/swagger/swagger.go
2070 views
package swagger12import (3"io"4"path"56"github.com/getkin/kin-openapi/openapi2"7"github.com/getkin/kin-openapi/openapi2conv"8"github.com/getkin/kin-openapi/openapi3"9"github.com/invopop/yaml"10"github.com/pkg/errors"11"github.com/projectdiscovery/nuclei/v3/pkg/input/formats"12"github.com/projectdiscovery/nuclei/v3/pkg/input/formats/openapi"1314"github.com/projectdiscovery/nuclei/v3/pkg/utils/json"15)1617// SwaggerFormat is a Swagger Schema File parser18type SwaggerFormat struct {19opts formats.InputFormatOptions20}2122// New creates a new Swagger format parser23func New() *SwaggerFormat {24return &SwaggerFormat{}25}2627var _ formats.Format = &SwaggerFormat{}2829// Name returns the name of the format30func (j *SwaggerFormat) Name() string {31return "swagger"32}3334func (j *SwaggerFormat) SetOptions(options formats.InputFormatOptions) {35j.opts = options36}3738// Parse parses the input and calls the provided callback39// function for each RawRequest it discovers.40func (j *SwaggerFormat) Parse(input io.Reader, resultsCb formats.ParseReqRespCallback, filePath string) error {41schemav2 := &openapi2.T{}42ext := path.Ext(filePath)43var err error44if ext == ".yaml" || ext == ".yml" {45var data []byte46data, err = io.ReadAll(input)47if err != nil {48return errors.Wrap(err, "could not read data file")49}50err = yaml.Unmarshal(data, schemav2)51} else {52err = json.NewDecoder(input).Decode(schemav2)53}54if err != nil {55return errors.Wrap(err, "could not decode openapi 2.0 schema")56}57schema, err := openapi2conv.ToV3(schemav2)58if err != nil {59return errors.Wrap(err, "could not convert openapi 2.0 schema to 3.0")60}61loader := openapi3.NewLoader()62err = loader.ResolveRefsIn(schema, nil)63if err != nil {64return errors.Wrap(err, "could not resolve openapi schema references")65}66return openapi.GenerateRequestsFromSchema(schema, j.opts, resultsCb)67}686970