mainform.pas

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

PAS
214
字号
unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ComCtrls, SBSSHForwarding, SBSSHKeyStorage, SBSSHConstants, StdCtrls,
  ImgList, SBUtils;

type
  TfrmMain = class(TForm)
    pConnProps: TPanel;
    pClient: TPanel;
    pLog: TPanel;
    lvLog: TListView;
    splitterLogConns: TSplitter;
    lvConnections: TListView;
    pSSHSettings: TPanel;
    pForwardingSettings: TPanel;
    lblHost: TLabel;
    lblPort: TLabel;
    editHost: TEdit;
    editPort: TEdit;
    lblUsername: TLabel;
    editUsername: TEdit;
    lblPassword: TLabel;
    editPassword: TEdit;
    lblForwardedPort: TLabel;
    editForwardedPort: TEdit;
    lblDestHostAndPort: TLabel;
    editDestHost: TEdit;
    editDestPort: TEdit;
    btnStart: TButton;
    Forwarding: TElSSHRemotePortForwarding;
    imgConns: TImageList;
    imgLog: TImageList;
    procedure btnStartClick(Sender: TObject);
    procedure ForwardingAuthenticationFailed(Sender: TObject;
      AuthenticationType: Integer);
    procedure ForwardingAuthenticationSuccess(Sender: TObject);
    procedure ForwardingError(Sender: TObject; ErrorCode: Integer);
    procedure ForwardingKeyValidate(Sender: TObject; ServerKey: TElSSHKey;
      var Validate: Boolean);
    procedure ForwardingConnectionOpen(Sender: TObject;
      Conn: TElSSHForwardedConnection);
    procedure ForwardingConnectionClose(Sender: TObject;
      Conn: TElSSHForwardedConnection);
    procedure ForwardingConnectionChange(Sender: TObject;
      Conn: TElSSHForwardedConnection);
    procedure ForwardingOpen(Sender: TObject);
    procedure ForwardingClose(Sender: TObject);
  private
    procedure Log(const S : string; Error : boolean);
    procedure RefreshConnection(Conn: TElSSHForwardedConnection; Item : TListItem);
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

procedure TfrmMain.Log(const S : string; Error : boolean);
var
  Item : TListItem;
begin
  Item := lvLog.Items.Add;
  Item.Caption := TimeToStr(Now);
  Item.SubItems.Add(S);
  if Error then
    Item.ImageIndex := 1
  else
    Item.ImageIndex := 0;
end;

procedure TfrmMain.RefreshConnection(Conn: TElSSHForwardedConnection; Item : TListItem);
var
  S : string;
begin
  lvConnections.Items.BeginUpdate;
  try
    Item.SubItems.Clear;
    if Conn.Socket <> nil then
      Item.Caption := Conn.Socket.Address
    else
      Item.Caption := 'N/A';
    Item.SubItems.Add(IntToStr(Conn.ReceivedFromSocket));
    Item.SubItems.Add(IntToStr(Conn.SentToSocket));
    Item.SubItems.Add(IntToStr(Conn.ReceivedFromChannel));
    Item.SubItems.Add(IntToStr(Conn.SentToChannel));
    case Conn.SocketState of
      fssEstablishing: S := 'Establishing';
      fssActive: S := 'Active';
      fssClosing: S := 'Closing';
      fssClosed: S := 'Closed';
    end;
    Item.SubItems.Add(S);
    case Conn.ChannelState of
      fcsEstablishing: S := 'Establishing';
      fcsActive: S := 'Active';
      fcsClosing: S := 'Closing';
      fcsClosed: S := 'Closed';
    end;
    if (Conn.ChannelState = fcsActive) and (Conn.SocketState = fssActive) then
      Item.ImageIndex := 1
    else if (Conn.ChannelState = fcsEstablishing) or (Conn.SocketState = fssEstablishing) then
      Item.ImageIndex := 0
    else
      Item.ImageIndex := 2;
  finally
    lvConnections.Items.EndUpdate;
  end;
end;

procedure TfrmMain.btnStartClick(Sender: TObject);
var
  I : integer;
begin
  if not Forwarding.Active then
  begin
    Forwarding.Address := editHost.Text;
    Forwarding.Port := StrToIntDef(editPort.Text, 22);
    Forwarding.ForwardedPort := StrToIntDef(editForwardedPort.Text, 5001);
    Forwarding.DestHost := editDestHost.Text;
    Forwarding.DestPort := StrToIntDef(editDestPort.Text, 5001);
    Forwarding.Username := editUsername.Text;
    Forwarding.Password := editPassword.Text;
    Forwarding.Open;
  end
  else
  begin
    Forwarding.Close();
  end;
end;

procedure TfrmMain.ForwardingAuthenticationFailed(Sender: TObject;
  AuthenticationType: Integer);
begin
  Log('Authentication type ' + IntToStr(AuthenticationType) + ' failed', true);
end;

procedure TfrmMain.ForwardingAuthenticationSuccess(Sender: TObject);
begin
  Log('Authentication succeeded', false);
end;

procedure TfrmMain.ForwardingError(Sender: TObject; ErrorCode: Integer);
begin
  Log('SSH protocol error ' + IntToStr(ErrorCode), true);
end;

procedure TfrmMain.ForwardingKeyValidate(Sender: TObject;
  ServerKey: TElSSHKey; var Validate: Boolean);
begin
  Log('Server key received', false);
  Validate := true;
end;

procedure TfrmMain.ForwardingConnectionOpen(Sender: TObject;
  Conn: TElSSHForwardedConnection);
var
  Item : TListItem;
begin
  Log('New secure channel opened', false);
  Item := lvConnections.Items.Add();
  Item.Data := Conn;
  RefreshConnection(Conn, Item);
end;

procedure TfrmMain.ForwardingConnectionClose(Sender: TObject;
  Conn: TElSSHForwardedConnection);
var
  Item: TListItem;
begin
  Log('Secure channel closed', false);
  Item := lvConnections.FindData(0, Conn, true, false);
  lvConnections.Items.Delete(Item.Index);
end;

procedure TfrmMain.ForwardingConnectionChange(Sender: TObject;
  Conn: TElSSHForwardedConnection);
var
  Item : TListItem;
begin
  Item := lvConnections.FindData(0, Conn, true, false);
  RefreshConnection(Conn, Item);
end;

procedure TfrmMain.ForwardingOpen(Sender: TObject);
begin
  Log('SSH connection established', false);
end;

procedure TfrmMain.ForwardingClose(Sender: TObject);
begin
  Log('SSH connection closed', false);
end;

initialization

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

end.

⌨️ 快捷键说明

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