From 2829fd30bb51a2cf9dae9068230bc9dc3ea8e496 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 7 Nov 2025 12:01:46 +0100 Subject: [PATCH 1/7] fix(sdk): configure tmpDir for SDK Closes #6595. --- lib/sdk.go | 7 +++++++ lib/sdk_private.go | 32 +++++++++++++++++++------------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/lib/sdk.go b/lib/sdk.go index 3ed252178f..a8530f29af 100644 --- a/lib/sdk.go +++ b/lib/sdk.go @@ -5,6 +5,7 @@ import ( "bytes" "context" "io" + "os" "sync" "github.com/projectdiscovery/gologger" @@ -92,6 +93,9 @@ type NucleiEngine struct { // Logger instance for the engine Logger *gologger.Logger + + // General purpose temporary directory + tmpDir string } // LoadAllTemplates loads all nuclei template based on given options @@ -231,6 +235,9 @@ func (e *NucleiEngine) closeInternal() { if e.httpxClient != nil { _ = e.httpxClient.Close() } + if e.tmpDir != "" { + _ = os.RemoveAll(e.tmpDir) + } } // Close all resources used by nuclei engine diff --git a/lib/sdk_private.go b/lib/sdk_private.go index d80a0fd068..9a2ba9b110 100644 --- a/lib/sdk_private.go +++ b/lib/sdk_private.go @@ -3,6 +3,7 @@ package nuclei import ( "context" "fmt" + "os" "strings" "sync" "time" @@ -170,20 +171,25 @@ func (e *NucleiEngine) init(ctx context.Context) error { e.catalog = disk.NewCatalog(config.DefaultConfig.TemplatesDirectory) } + if tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*"); err == nil { + e.tmpDir = tmpDir + } + e.executerOpts = &protocols.ExecutorOptions{ - Output: e.customWriter, - Options: e.opts, - Progress: e.customProgress, - Catalog: e.catalog, - IssuesClient: e.rc, - RateLimiter: e.rateLimiter, - Interactsh: e.interactshClient, - Colorizer: aurora.NewAurora(true), - ResumeCfg: types.NewResumeCfg(), - Browser: e.browserInstance, - Parser: e.parser, - InputHelper: input.NewHelper(), - Logger: e.opts.Logger, + Output: e.customWriter, + Options: e.opts, + Progress: e.customProgress, + Catalog: e.catalog, + IssuesClient: e.rc, + RateLimiter: e.rateLimiter, + Interactsh: e.interactshClient, + Colorizer: aurora.NewAurora(true), + ResumeCfg: types.NewResumeCfg(), + Browser: e.browserInstance, + Parser: e.parser, + InputHelper: input.NewHelper(), + TemporaryDirectory: e.tmpDir, + Logger: e.opts.Logger, } if e.opts.ShouldUseHostError() && e.hostErrCache != nil { e.executerOpts.HostErrorsCache = e.hostErrCache From 7b0c6fb782c27c636e066a71fe57920a5838e9a2 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 7 Nov 2025 12:14:45 +0100 Subject: [PATCH 2/7] docs(sdk): update comment to more accurately reflect purpose --- lib/sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sdk.go b/lib/sdk.go index a8530f29af..99523c79a0 100644 --- a/lib/sdk.go +++ b/lib/sdk.go @@ -94,7 +94,7 @@ type NucleiEngine struct { // Logger instance for the engine Logger *gologger.Logger - // General purpose temporary directory + // Temporary directory for SDK-managed template files tmpDir string } From 96bfb2bac1261777f4d5e2ed5a779c4b78b632b8 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Mon, 10 Nov 2025 07:31:18 +0100 Subject: [PATCH 3/7] feat(sdk): add tmpDir configuration option for SDK users --- lib/config.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/config.go b/lib/config.go index cdc56ce063..057fdef060 100644 --- a/lib/config.go +++ b/lib/config.go @@ -559,3 +559,14 @@ func WithOptions(opts *pkgtypes.Options) NucleiSDKOptions { return nil } } + +// WithTemporaryDirectory allows setting a parent directory for SDK-managed temporary files. +// A temporary directory will be created inside the provided directory and cleaned up on engine close. +// If not set, a temporary directory will be automatically created in the system temp location. +// The parent directory will be created if it doesn't exist. +func WithTemporaryDirectory(parentDir string) NucleiSDKOptions { + return func(e *NucleiEngine) error { + e.tmpDir = parentDir + return nil + } +} From efcc8e95c3f5c6fd0185a578d73a30741c18222a Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Mon, 10 Nov 2025 07:54:54 +0100 Subject: [PATCH 4/7] fix(sdk): init default engine tmpDir when unconfigured --- lib/sdk_private.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/sdk_private.go b/lib/sdk_private.go index 9a2ba9b110..2c40fbf620 100644 --- a/lib/sdk_private.go +++ b/lib/sdk_private.go @@ -171,8 +171,12 @@ func (e *NucleiEngine) init(ctx context.Context) error { e.catalog = disk.NewCatalog(config.DefaultConfig.TemplatesDirectory) } - if tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*"); err == nil { - e.tmpDir = tmpDir + if e.tmpDir == "" { + if tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*"); err != nil { + return err + } else { + e.tmpDir = tmpDir + } } e.executerOpts = &protocols.ExecutorOptions{ From 87d62d3a8ff87a7e30fc023ee66f565fef3e8be4 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Mon, 10 Nov 2025 08:18:14 +0100 Subject: [PATCH 5/7] style(sdk): remove unnecessary else block --- lib/sdk_private.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/sdk_private.go b/lib/sdk_private.go index 2c40fbf620..ba394f024c 100644 --- a/lib/sdk_private.go +++ b/lib/sdk_private.go @@ -172,11 +172,11 @@ func (e *NucleiEngine) init(ctx context.Context) error { } if e.tmpDir == "" { - if tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*"); err != nil { + tmpDir, err := os.MkdirTemp("", "nuclei-tmp-*") + if err != nil { return err - } else { - e.tmpDir = tmpDir } + e.tmpDir = tmpDir } e.executerOpts = &protocols.ExecutorOptions{ From 3eff4146e120d1bfcd2983a0abe7335bf535d6fb Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Mon, 10 Nov 2025 10:41:56 +0100 Subject: [PATCH 6/7] feat(sdk): create parent & tmp dir in WithTemporaryDirectory --- lib/config.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/config.go b/lib/config.go index 057fdef060..bc8e09f3e6 100644 --- a/lib/config.go +++ b/lib/config.go @@ -3,6 +3,7 @@ package nuclei import ( "context" "errors" + "os" "time" "github.com/projectdiscovery/goflags" @@ -566,7 +567,14 @@ func WithOptions(opts *pkgtypes.Options) NucleiSDKOptions { // The parent directory will be created if it doesn't exist. func WithTemporaryDirectory(parentDir string) NucleiSDKOptions { return func(e *NucleiEngine) error { - e.tmpDir = parentDir + if err := os.MkdirAll(parentDir, 0755); err != nil { + return err + } + tmpDir, err := os.MkdirTemp(parentDir, "nuclei-tmp-*") + if err != nil { + return err + } + e.tmpDir = tmpDir return nil } } From 8b8a3a11b6537397fb135384f633e51e03ef789f Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Tue, 18 Nov 2025 17:31:01 +0100 Subject: [PATCH 7/7] refactor(sdk): don't create parentDir when configuring tmpDir --- lib/config.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/config.go b/lib/config.go index bc8e09f3e6..f624ef42e7 100644 --- a/lib/config.go +++ b/lib/config.go @@ -564,12 +564,9 @@ func WithOptions(opts *pkgtypes.Options) NucleiSDKOptions { // WithTemporaryDirectory allows setting a parent directory for SDK-managed temporary files. // A temporary directory will be created inside the provided directory and cleaned up on engine close. // If not set, a temporary directory will be automatically created in the system temp location. -// The parent directory will be created if it doesn't exist. +// The parent directory is assumed to exist. func WithTemporaryDirectory(parentDir string) NucleiSDKOptions { return func(e *NucleiEngine) error { - if err := os.MkdirAll(parentDir, 0755); err != nil { - return err - } tmpDir, err := os.MkdirTemp(parentDir, "nuclei-tmp-*") if err != nil { return err