pentaho/pentaho-kettle · error · FTPException

JobFTPPUT.SocksProxy.IncompleteCredentials

JobFTPPUT.SocksProxy.IncompleteCredentials

Error message

JobFTPPUT.SocksProxy.IncompleteCredentials

What it means

The entry throws FTPException 'SocksProxy.IncompleteCredentials' (message key JobFTPPUT.SocksProxy.IncompleteCredentials, interpolated with host and entry name) when SOCKS proxy credentials are half-specified: a username without a password, or a password without a username. Both must be provided together, or neither.

Solutions

  1. Provide both SOCKS proxy username and password in the job entry settings.
  2. If the password uses a variable, ensure it resolves to a non-empty value at runtime.
  3. Remove both username and password if the proxy requires no authentication.
  4. Confirm the entry name referenced in the error to locate the offending job entry in the job.

Example fix

// before
socksProxyUsername = "ftpuser";
socksProxyPassword = ""; // password missing -> exception

// after
socksProxyUsername = "ftpuser";
socksProxyPassword = "s3cret"; // or clear username too for anonymous proxy
Defensive patterns

Strategy: validation

Validate before calling

boolean hasUser = !Utils.isEmpty(entry.getSocksProxyUsername()); boolean hasPass = !Utils.isEmpty(entry.getSocksProxyPassword()); if ( hasUser ^ hasPass ) { throw new IllegalArgumentException("SOCKS proxy username and password must both be set or both be empty"); }

Try / catch

try { result = runFtpPut(); } catch (FTPException e) { if ( e.getMessage().contains("IncompleteCredentials") ) { failJob("SOCKS proxy credentials incomplete"); } else { throw e; } }

Prevention

When it happens

Trigger: Executing the FTP Put entry with socksProxyUsername non-empty and socksProxyPassword empty (or vice versa) while a SOCKS proxy host is configured.

Common situations: Password stored as a variable that doesn't resolve; credentials pasted only partially; password cleared after a security policy change; variable-only password empty in the execution environment.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/2820c2e4add16204. Report an issue: GitHub.

Appendix: source

Thrown at plugins/put-a-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftpput/JobEntryFTPPUT.java:845

    if ( log.isDetailed() ) {
      logDetailed( BaseMessages.getString( PKG, "JobFTPPUT.Log.SetEncoding", controlEncoding ) );
    }

    // If socks proxy server was provided
    if ( !Utils.isEmpty( socksProxyHost ) ) {
      // if a port was provided
      if ( !Utils.isEmpty( socksProxyPort ) ) {
        FTPClient.initSOCKS( environmentSubstitute( socksProxyPort ), environmentSubstitute( socksProxyHost ) );
      } else { // looks like we have a host and no port
        throw new FTPException( BaseMessages.getString(
          PKG, "JobFTPPUT.SocksProxy.PortMissingException", environmentSubstitute( socksProxyHost ) ) );
      }
      // now if we have authentication information
      if ( !Utils.isEmpty( socksProxyUsername )
        && Utils.isEmpty( socksProxyPassword ) || Utils.isEmpty( socksProxyUsername )
        && !Utils.isEmpty( socksProxyPassword ) ) {
        // we have a username without a password or vice versa
        throw new FTPException( BaseMessages.getString(
          PKG, "JobFTPPUT.SocksProxy.IncompleteCredentials", environmentSubstitute( socksProxyHost ),
          getName() ) );
      }
    }

    return ftpClient;
  }

  // package-local visibility for testing purposes
  FTPClient createFtpClient() {
    return new PDIFTPClient( log );
  }

  @Override
  public boolean evaluates() {
    return true;
  }

View on GitHub (pinned to f3058517a1)