deprecating rlm

dev
Mzack9999 2024-04-03 19:28:39 +02:00
parent 3c62b56fd9
commit 620287f76b
6 changed files with 38 additions and 15 deletions

View File

@ -15,6 +15,7 @@ import (
"github.com/projectdiscovery/utils/auth/pdcp" "github.com/projectdiscovery/utils/auth/pdcp"
"github.com/projectdiscovery/utils/env" "github.com/projectdiscovery/utils/env"
_ "github.com/projectdiscovery/utils/pprof" _ "github.com/projectdiscovery/utils/pprof"
stringsutil "github.com/projectdiscovery/utils/strings"
"github.com/projectdiscovery/goflags" "github.com/projectdiscovery/goflags"
"github.com/projectdiscovery/gologger" "github.com/projectdiscovery/gologger"
@ -329,7 +330,8 @@ on extensive configurability, massive extensibility and ease of use.`)
flagSet.CreateGroup("rate-limit", "Rate-Limit", flagSet.CreateGroup("rate-limit", "Rate-Limit",
flagSet.IntVarP(&options.RateLimit, "rate-limit", "rl", 150, "maximum number of requests to send per second"), flagSet.IntVarP(&options.RateLimit, "rate-limit", "rl", 150, "maximum number of requests to send per second"),
flagSet.IntVarP(&options.RateLimitMinute, "rate-limit-minute", "rlm", 0, "maximum number of requests to send per minute"), flagSet.DurationVarP(&options.RateLimitDuration, "rate-limit-duration", "rld", time.Second, "maximum number of requests to send per second"),
flagSet.IntVarP(&options.RateLimitMinute, "rate-limit-minute", "rlm", 0, "maximum number of requests to send per minute (DEPRECATED)"),
flagSet.IntVarP(&options.BulkSize, "bulk-size", "bs", 25, "maximum number of hosts to be analyzed in parallel per template"), flagSet.IntVarP(&options.BulkSize, "bulk-size", "bs", 25, "maximum number of hosts to be analyzed in parallel per template"),
flagSet.IntVarP(&options.TemplateThreads, "concurrency", "c", 25, "maximum number of templates to be executed in parallel"), flagSet.IntVarP(&options.TemplateThreads, "concurrency", "c", 25, "maximum number of templates to be executed in parallel"),
flagSet.IntVarP(&options.HeadlessBulkSize, "headless-bulk-size", "hbs", 10, "maximum number of headless hosts to be analyzed in parallel per template"), flagSet.IntVarP(&options.HeadlessBulkSize, "headless-bulk-size", "hbs", 10, "maximum number of headless hosts to be analyzed in parallel per template"),
@ -597,10 +599,10 @@ Note: Make sure you have backup of your custom nuclei-templates before proceedin
gologger.Fatal().Msgf("could not read response: %s", err) gologger.Fatal().Msgf("could not read response: %s", err)
} }
resp = strings.TrimSpace(resp) resp = strings.TrimSpace(resp)
if strings.EqualFold(resp, "y") || strings.EqualFold(resp, "yes") { if stringsutil.EqualFoldAny(resp, "y", "yes") {
break break
} }
if strings.EqualFold(resp, "n") || strings.EqualFold(resp, "no") || resp == "" { if stringsutil.EqualFoldAny(resp, "n", "no", "") {
fmt.Println("Exiting...") fmt.Println("Exiting...")
os.Exit(0) os.Exit(0)
} }

View File

@ -314,11 +314,17 @@ func New(options *types.Options) (*Runner, error) {
} }
if options.RateLimitMinute > 0 { if options.RateLimitMinute > 0 {
runner.rateLimiter = ratelimit.New(context.Background(), uint(options.RateLimitMinute), time.Minute) gologger.Warning().Msgf("rate limit per minute is deprecated - use rate-limit-duration")
} else if options.RateLimit > 0 { options.RateLimit = options.RateLimitMinute
runner.rateLimiter = ratelimit.New(context.Background(), uint(options.RateLimit), time.Second) options.RateLimitDuration = time.Minute
} else { }
if options.RateLimit > 0 && options.RateLimitDuration == 0 {
options.RateLimitDuration = time.Second
}
if options.RateLimit == 0 && options.RateLimitDuration == 0 {
runner.rateLimiter = ratelimit.NewUnlimited(context.Background()) runner.rateLimiter = ratelimit.NewUnlimited(context.Background())
} else {
runner.rateLimiter = ratelimit.New(context.Background(), uint(options.RateLimit), options.RateLimitDuration)
} }
if tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*"); err == nil { if tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*"); err == nil {

View File

@ -42,11 +42,16 @@ func createEphemeralObjects(base *NucleiEngine, opts *types.Options) (*unsafeOpt
Parser: base.parser, Parser: base.parser,
} }
if opts.RateLimitMinute > 0 { if opts.RateLimitMinute > 0 {
u.executerOpts.RateLimiter = ratelimit.New(context.Background(), uint(opts.RateLimitMinute), time.Minute) opts.RateLimit = opts.RateLimitMinute
} else if opts.RateLimit > 0 { opts.RateLimitDuration = time.Minute
u.executerOpts.RateLimiter = ratelimit.New(context.Background(), uint(opts.RateLimit), time.Second) }
} else { if opts.RateLimit > 0 && opts.RateLimitDuration == 0 {
opts.RateLimitDuration = time.Second
}
if opts.RateLimit == 0 && opts.RateLimitDuration == 0 {
u.executerOpts.RateLimiter = ratelimit.NewUnlimited(context.Background()) u.executerOpts.RateLimiter = ratelimit.NewUnlimited(context.Background())
} else {
u.executerOpts.RateLimiter = ratelimit.New(context.Background(), uint(opts.RateLimit), opts.RateLimitDuration)
} }
u.engine = core.New(opts) u.engine = core.New(opts)
u.engine.SetExecuterOptions(u.executerOpts) u.engine.SetExecuterOptions(u.executerOpts)

View File

@ -192,11 +192,16 @@ func (e *NucleiEngine) init() error {
if e.executerOpts.RateLimiter == nil { if e.executerOpts.RateLimiter == nil {
if e.opts.RateLimitMinute > 0 { if e.opts.RateLimitMinute > 0 {
e.executerOpts.RateLimiter = ratelimit.New(context.Background(), uint(e.opts.RateLimitMinute), time.Minute) e.opts.RateLimit = e.opts.RateLimitMinute
} else if e.opts.RateLimit > 0 { e.opts.RateLimitDuration = time.Minute
e.executerOpts.RateLimiter = ratelimit.New(context.Background(), uint(e.opts.RateLimit), time.Second) }
} else { if e.opts.RateLimit > 0 && e.opts.RateLimitDuration == 0 {
e.opts.RateLimitDuration = time.Second
}
if e.opts.RateLimit == 0 && e.opts.RateLimitDuration == 0 {
e.executerOpts.RateLimiter = ratelimit.NewUnlimited(context.Background()) e.executerOpts.RateLimiter = ratelimit.NewUnlimited(context.Background())
} else {
e.executerOpts.RateLimiter = ratelimit.New(context.Background(), uint(e.opts.RateLimit), e.opts.RateLimitDuration)
} }
} }

View File

@ -54,6 +54,7 @@ var DefaultOptions = &types.Options{
Timeout: 5, Timeout: 5,
Retries: 1, Retries: 1,
RateLimit: 150, RateLimit: 150,
RateLimitDuration: time.Second,
ProjectPath: "", ProjectPath: "",
Severities: severity.Severities{}, Severities: severity.Severities{},
Targets: []string{}, Targets: []string{},

View File

@ -132,7 +132,10 @@ type Options struct {
Retries int Retries int
// Rate-Limit is the maximum number of requests per specified target // Rate-Limit is the maximum number of requests per specified target
RateLimit int RateLimit int
// Rate Limit Duration interval between burst resets
RateLimitDuration time.Duration
// Rate-Limit is the maximum number of requests per minute for specified target // Rate-Limit is the maximum number of requests per minute for specified target
// Deprecated: Use RateLimitDuration - automatically set Rate Limit Duration to 60 seconds
RateLimitMinute int RateLimitMinute int
// PageTimeout is the maximum time to wait for a page in seconds // PageTimeout is the maximum time to wait for a page in seconds
PageTimeout int PageTimeout int
@ -410,6 +413,7 @@ func (options *Options) HasClientCertificates() bool {
func DefaultOptions() *Options { func DefaultOptions() *Options {
return &Options{ return &Options{
RateLimit: 150, RateLimit: 150,
RateLimitDuration: time.Second,
BulkSize: 25, BulkSize: 25,
TemplateThreads: 25, TemplateThreads: 25,
HeadlessBulkSize: 10, HeadlessBulkSize: 10,