projectdiscovery/nuclei · error
no credentials provided
Error message
no credentials provided
What it means
NewUploadWriter (internal/pdcp/writer.go:62) builds the ProjectDiscovery Cloud (PDCP) upload pipeline and requires non-nil *pdcpauth.PDCPCredentials; nil yields 'no credentials provided'. Callers (internal/runner/runner.go:524/1039, lib/sdk_private.go:90) get creds from PDCPCredHandler.GetCreds(); reaching this error means cloud upload was enabled while the credentials object is nil — i.e. authentication was skipped or produced no creds in the programmatic path.
Source
Thrown at internal/pdcp/writer.go:64
// server to enable web dashboard and more
type UploadWriter struct {
*output.StandardWriter
creds *pdcpauth.PDCPCredentials
uploadURL *url.URL
client *retryablehttp.Client
cancel context.CancelFunc
done chan struct{}
scanID string
scanName string
counter atomic.Int32
TeamID string
Logger *gologger.Logger
}
// NewUploadWriter creates a new upload writer
func NewUploadWriter(ctx context.Context, logger *gologger.Logger, creds *pdcpauth.PDCPCredentials) (*UploadWriter, error) {
if creds == nil {
return nil, fmt.Errorf("no credentials provided")
}
u := &UploadWriter{
creds: creds,
done: make(chan struct{}, 1),
TeamID: NoneTeamID,
Logger: logger,
}
var err error
reader, writer := io.Pipe()
// create standard writer
u.StandardWriter, err = output.NewWriter(
output.WithWriter(writer),
output.WithJson(true, true),
)
if err != nil {
return nil, errkit.Wrap(err, "could not create output writer")
}
tmp, err := urlutil.Parse(creds.Server)View on GitHub (pinned to 265b3a3dec)
Solutions
- Authenticate first (nuclei auth/PDCP login flow) so a credentials object exists
- SDK users: obtain creds via pdcpauth and pass a non-nil value to NewUploadWriter
- Persist the auth token in CI (secret/env) so runs find it
- Turn cloud upload off if it was enabled unintentionally
Example fix
// before
w, err := pdcp.NewUploadWriter(ctx, logger, nil)
// after
h := &pdcpauth.PDCPCredHandler{}
creds, err := h.GetCreds()
if err != nil { return err }
w, err := pdcp.NewUploadWriter(ctx, logger, creds) Defensive patterns
Strategy: type-guard
Validate before calling
h := &pdcpauth.PDCPCredHandler{}
creds, err := h.GetCreds()
if err != nil || creds == nil {
// skip cloud upload instead of constructing the writer
return nil
} Type guard
func hasPDCPCredentials(c *pdcpauth.PDCPCredentials) bool {
return c != nil
} Try / catch
w, err := pdcp.NewUploadWriter(ctx, logger, creds)
if err != nil {
if strings.Contains(err.Error(), "no credentials provided") {
// auth missing: run the nuclei auth flow, then retry once
return authenticateAndRetry()
}
return err
} Prevention
- Complete nuclei/PDCP authentication before enabling cloud upload
- Persist auth tokens in CI secrets so every run finds them
- Guard nil creds in SDK code before calling NewUploadWriter
When it happens
Trigger: Enabling cloud results upload without ever completing nuclei/PDCP authentication; SDK code calling NewUploadWriter with a nil creds value; auth token present but the credential handler returning (nil, nil) in unusual states.
Common situations: Fresh installs using upload flags without prior `nuclei -auth`; CI environments with no persisted credentials; SDK integrations that forget the auth step before enabling upload.
Related errors
- could not upload results got status code %v on %v
- authentication failed
- Invalid protocol type: {valueToMap}
- invalid workflow with no templates or tags
- prompt not found (read cap reached)
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/c00f63065e21cb64.
Report an issue: GitHub.