mainform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 294 行

PAS
294
字号
unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  SBSSHCommon, SBSimpleSSH, SBSSHConstants, SBSSHKeyStorage, StdCtrls, ScktComp, Buttons,
  SBUtils;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    GroupBox2: TGroupBox;
    Label3: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Label4: TLabel;
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Label5: TLabel;
    Edit5: TEdit;
    Button2: TButton;
    ClientSocket1: TClientSocket;
    Edit6: TEdit;
    Label6: TLabel;
    SpeedButton1: TSpeedButton;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    procedure HandleClientSend(Sender : TObject; Buffer : pointer; Size : integer);
    procedure HandleClientReceive(Sender : TObject; Buffer : pointer; MaxSize : integer;
      out Written : integer);
    procedure HandleClientCloseConnection(Sender : TObject);
    procedure HandleClientDebugData(Sender : TObject; Buffer : pointer;
      Size : integer);
    procedure HandleClientError(Sender : TObject; Error : integer);
    procedure HandleClientAuthenticationSuccess(Sender : TObject);
    procedure HandleClientAuthenticationFailed(Sender : TObject; AuthType : integer);
    procedure HandleClientAuthenticationKeyboard(Sender: TObject;
     Prompts : TStringList; Echo : TBits; Responses : TStringList);

    procedure HandleKeyValidate(Sender: TObject; ServerKey: TElSSHKey; var Validate: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Client : TElSimpleSSHClient;
  Connected : boolean = false;
  KeyStorage : TElSSHMemoryKeyStorage;

implementation

uses PromptForm;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Client := TElSimpleSSHClient.Create(Self);
  Client.OnSend := HandleClientSend;
  Client.OnReceive := HandleClientReceive;
  Client.OnCloseConnection := HandleClientCloseConnection;
  Client.OnError := HandleClientError;
  Client.OnAuthenticationSuccess := HandleClientAuthenticationSuccess;
  Client.OnAuthenticationFailed := HandleClientAuthenticationFailed;
  Client.OnAuthenticationKeyboard := HandleClientAuthenticationKeyboard;
  Client.OnKeyValidate := HandleKeyValidate;

  (*
  Connection.OnError := HandleConnectionError;
  Connection.OnClose := HandleConnectionClose;
  *)

  KeyStorage := TElSSHMemoryKeyStorage.Create(Self);
  Client.KeyStorage := KeyStorage;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Client.Free;
  KeyStorage.Free;
end;

////////////////////////////////////////////////////////////////////////////////
// Handlers

procedure TForm1.HandleClientSend(Sender : TObject; Buffer : pointer; Size : integer);
begin
  ClientSocket1.Socket.SendBuf(Buffer^, Size);
end;

procedure TForm1.HandleClientReceive(Sender : TObject; Buffer : pointer; MaxSize : integer;
  out Written : integer);
begin
  Written := ClientSocket1.Socket.ReceiveBuf(Buffer^, MaxSize);
  if Written < 0 then
    Written := 0;
end;

procedure TForm1.HandleClientCloseConnection(Sender : TObject);
begin
  Memo2.Lines.Add('Connection closed. ' + Client.ServerCloseReason);
  ClientSocket1.Close;  
end;

procedure TForm1.HandleClientDebugData(Sender : TObject; Buffer : pointer;
  Size : integer);
var
  S : string;
begin
  SetLength(S, Size);
  Move(Buffer^, S[1], Size);
  Memo2.Lines.Add('Debug: ' + S);
end;

procedure TForm1.HandleClientError(Sender : TObject; Error : integer);
begin
  Memo2.Lines.Add('Error: ' + IntToStr(Error));
end;

procedure TForm1.HandleClientAuthenticationSuccess(Sender : TObject);
begin
  Memo2.Lines.Add('Authentication succeeded');
end;

procedure TForm1.HandleClientAuthenticationFailed(Sender : TObject; AuthType : integer);
begin
  Memo2.Lines.Add('Authentication attempt failed, AuthType=' + IntToStr(AuthType));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Key : TElSSHKey;
begin
  if not Connected then
  begin
    Client.Versions := [];
    if CheckBox1.Checked then
      Client.Versions := Client.Versions + [sbSSH1];
    if CheckBox2.Checked then
      Client.Versions := Client.Versions + [sbSSH2];
    Client.UserName := Edit3.Text;
    Client.Password := Edit4.Text;

    KeyStorage.Clear;
    Key := TElSSHKey.Create;
    if (Edit6.Text <> '') and (Key.LoadPrivateKey(Edit6.Text) = 0) then
    begin
      KeyStorage.Add(Key);
      Client.AuthenticationTypes := Client.AuthenticationTypes or SSH_AUTH_TYPE_PUBLICKEY;
    end
    else
      Client.AuthenticationTypes := Client.AuthenticationTypes and not SSH_AUTH_TYPE_PUBLICKEY;
    Key.Free;    

    ClientSocket1.Host := Edit1.Text;
    ClientSocket1.Port := StrToInt(Edit2.Text);
    ClientSocket1.Open;
    
    Button1.Caption := 'Disconnect';
  end
  else
  begin
    if Client.Active then
      Client.Close;
    Button1.Caption := 'Connect';      
  end;
  Connected := not Connected;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo2.Lines.Add('Client socket connected');
  Client.Open;
  if Client.Active then
  begin
    Memo2.Lines.Add('Connection started');
    Memo2.Lines.Add('Server: ' + Client.ServerSoftwareName);
    case Client.Version of
      sbSSH1 : Memo2.Lines.Add('Version: SSHv1');
      sbSSH2 : Memo2.Lines.Add('Version: SSHv2');
    end;
    Memo2.Lines.Add('PublicKey algorithm: ' + IntToStr(Client.PublicKeyAlgorithm));
    Memo2.Lines.Add('Kex algorithm: ' + IntToStr(Client.KexAlgorithm));
    Memo2.Lines.Add('Block algorithm: ' + IntToStr(Client.EncryptionAlgorithmServerToClient));
    Memo2.Lines.Add('Compression algorithm: ' + IntToStr(Client.CompressionAlgorithmServerToClient));
    Memo2.Lines.Add('MAC algorithm: ' + IntToStr(Client.MacAlgorithmServerToClient));
  end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  S, ES : string;
  BufSize : integer;
  StdErrSize : integer;
begin
  if not Client.Active then
  begin
    Exit;
  end;

  SetLength(S, 1024);
  SetLength(ES, 1024);
  BufSize := 1024;
  StdErrSize := 1024;
  Client.ReceiveData(@S[1], BufSize, @ES[1], StdErrSize);
  SetLength(S, BufSize);
  SetLength(ES, StdErrSize);

  if Bufsize > 0 then
    Memo1.Lines.Text := Memo1.Lines.Text + S;

  if StdErrSize > 0 then
    Memo2.Text := Memo2.Text + ES;
end;

procedure TForm1.Button2Click(Sender: TObject);
var s : string;
begin
  s := Edit5.Text + {#13}#10;
  Client.SendData(PChar(S), Length(s));
  Edit5.Text := '';
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Edit6.Text := OpenDialog1.Filename;
end;

procedure TForm1.HandleKeyValidate(Sender: TObject; ServerKey: TElSSHKey;
  var Validate: Boolean);
var
  AlgLine: string;
begin
  if ServerKey.Algorithm = ALGORITHM_RSA then
    AlgLine := 'RSA'
  else if ServerKey.Algorithm = ALGORITHM_DSS then
    AlgLine := 'DSS'
  else
    AlgLine := 'unknown';

  Memo2.Lines.Add(Format('Server key received (%s). Fingerprint is %s',
               [AlgLine, BeautifyBinaryString(DigestToStr(ServerKey.FingerprintMD5), ':')]));
  Validate := True;
end;


procedure TForm1.HandleClientAuthenticationKeyboard(Sender: TObject;
  Prompts: TStringList; Echo: TBits; Responses: TStringList);
var i : integer;
    S : string;
begin
  Responses.Clear;
  for i := 0 to Prompts.Count - 1 do
  begin
    if TfrmPrompt.Prompt(Prompts[i], Echo[i], S) then
      Responses.Add(S)
    else
      Responses.Add('');
  end;
end;

initialization

SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' + 
  'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' + 
  'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' + 
  '5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' + 
  'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' + 
  '8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' + 
  'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' + 
  'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?