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

  1. Authenticate first (nuclei auth/PDCP login flow) so a credentials object exists
  2. SDK users: obtain creds via pdcpauth and pass a non-nil value to NewUploadWriter
  3. Persist the auth token in CI (secret/env) so runs find it
  4. 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

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


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/c00f63065e21cb64. Report an issue: GitHub.