Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

SFTP Auth Failure Reason (AuthenticatePwPk)

See more SFTP Examples

This example demonstrates how to determine the failure reason for the case where both a password and private key are required for authentication. If authentication fails, was it because of an invalid private key, or an invalid password?

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.SshKey,
  Chilkat.JsonObject,
  Chilkat.SFtp;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  key: TSshKey;
  sftp: TSFtp;
  json: TJsonObject;

begin
  success := False;

  //  This example assumes the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  Load a private key to be used for SSH authentication.
  key := TSshKey.Create;
  key.Password := 'key_password';

  success := key.FromOpenSshPrivateKey(key.LoadText('qa_data/my_private_key_file'));
  if (success = False) then
    begin
      WriteLn(key.LastErrorText);
      Exit;
    end;

  sftp := TSFtp.Create;

  success := sftp.Connect('sftp.example.com',22);
  if (success = False) then
    begin
      WriteLn(sftp.LastErrorText);
      Exit;
    end;

  //  Authenticate using both a password and private key.
  success := sftp.AuthenticatePwPk('myLogin','myPassword',key);
  if (success = True) then
    begin
      WriteLn('Authentication is successful!');
      Exit;
    end;

  //  If we get here, it means the authentication failed.
  //  Examine the last JSON data..

  json := TJsonObject.Create;
  sftp.GetLastJsonData(json);

  json.EmitCompact := False;

  //  This is the JSON if the key is correct, but the password is incorrect:

  //  {
  //    "public_key_type": "rsa",
  //    "partialAuthResult": "publickey success. continue to authenticate with password...",
  //    "authResult": "failed",
  //    "authFailReason": "Password is incorrect"
  //  }

  //  This is the JSON if the key is incorrect.  We won't know if the password is also incorrect until
  //  the key is made correct so that authentication proceeds to check the password.

  //  {
  //    "public_key_type": "rsa",
  //    "authResult": "failed",
  //    "authFailReason": "Key is incorrect"
  //  }

  //  To get the authResult anbd authFailReason:
  WriteLn('authResult: ' + json.StringOf('authResult'));
  WriteLn('authFailReason: ' + json.StringOf('authFailReason'));


  key.Free;
  sftp.Free;
  json.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.