mainform.cpp

来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 281 行

CPP
281
字号
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
{
  SetLicenseKey((AnsiString)
  "ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76" + 
  "FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C" + 
  "F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47" + 
  "5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9" + 
  "F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A" + 
  "8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43" + 
  "DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8" + 
  "BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F");
}
//---------------------------------------------------------------------------
void TfrmMain::Connect(void)
{
    if (SSHClient->Active)
    {
        MessageDlg("Already connected", mtInformation, TMsgDlgButtons()<<mbOK, 0);
        return;
    }

    if (frmConnectionProperties->ShowModal() == mrOk)
    {
        reTerminal->Clear();
        Application->ProcessMessages();

        SSHClient->Host = frmConnectionProperties->edHost->Text;
        SSHClient->Port = StrToIntDef(frmConnectionProperties->edPort->Text, 22);
        SSHClient->Username = frmConnectionProperties->edUsername->Text;
        SSHClient->Password = frmConnectionProperties->edPassword->Text;
        SSHClient->SoftwareName = "ElIdSSHClient demo application";

        SSHClient->Versions = Sbsshcommon::TSSHVersions();
        if (frmConnectionProperties->cbSSHv1->Checked)
            SSHClient->Versions = SSHClient->Versions << sbSSH1;

        if (frmConnectionProperties->cbSSHv2->Checked)
            SSHClient->Versions = SSHClient->Versions << sbSSH2;

        KeyStorage->Clear();
        TElSSHKey* Key = new TElSSHKey;
        if ((frmConnectionProperties->edPrivateKey->Text != "") && FileExists(frmConnectionProperties->edPrivateKey->Text) &&
           (Key->LoadPrivateKey(frmConnectionProperties->edPrivateKey->Text,"") == 0))
        {
            KeyStorage->Add(Key);
            SSHClient->AuthenticationTypes = SSHClient->AuthenticationTypes | SSH_AUTH_TYPE_PUBLICKEY;
        }
        else
            SSHClient->AuthenticationTypes = SSHClient->AuthenticationTypes & (~SSH_AUTH_TYPE_PUBLICKEY);

        delete Key;

        AnsiString s;
        s.sprintf("Connecting to %s:%u", SSHClient->Host, SSHClient->Port);
        Log(s);

        try
        {
            SSHClient->Connect();
        }
        catch(Exception &e)
        {
            Log((AnsiString)"SSH connection failed with message [" + e.Message + "]", true);
            return;
        }
        Log("SSH connection established");
    }
}
//---------------------------------------------------------------------------
void TfrmMain::Disconnect(void)
{
    if (!SSHClient->Active)
        return;

    Log("Disconnecting");
    SSHClient->Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Exit1Click(TObject *Sender)
{
    Disconnect();
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::actConnectExecute(TObject *Sender)
{
    Connect();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::actDisconnectExecute(TObject *Sender)
{
    Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
    FSSHClient = new TElIdSSHClient(this);
    FKeyStorage = new TElSSHMemoryKeyStorage(this);
    FShellSSHTunnel = new TElShellSSHTunnel(this);

    SSHClient->KeyStorage = KeyStorage;

    SSHClient->OnAuthenticationFailed = SSHClientAuthenticationFailed;
    SSHClient->OnAuthenticationSuccess = SSHClientAuthenticationSuccess;
    SSHClient->OnAuthenticationKeyboard = SSHClientAuthenticationKeyboard;
    SSHClient->OnCloseConnection = SSHClientCloseConnection;
    SSHClient->OnOpenConnection = SSHClientOpenConnection;
    SSHClient->OnBanner = SSHClientBanner;
    SSHClient->OnError = SSHClientError;
    SSHClient->OnKeyValidate = SSHKeyValidate;

    ShellSSHTunnel->TunnelList = FSSHClient->TunnelList;
    ShellSSHTunnel->OnOpen = ShellSSHTunnelOpen;
    ShellSSHTunnel->OnError = ShellSSHTunnelError;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
    Disconnect();

    ShellSSHTunnel->TunnelList = NULL;
    SSHClient->KeyStorage = NULL;
    delete FShellSSHTunnel;
    delete FKeyStorage;
    delete FSSHClient;
}
//---------------------------------------------------------------------------
void TfrmMain::Log(const AnsiString S, bool Error)
{
    TListItem* Item = lvLog->Items->Add();
    Item->Caption = TimeToStr(TDateTime::CurrentDateTime());
    Item->SubItems->Add(S);
    if (Error)
      Item->ImageIndex = 11;
    else
      Item->ImageIndex = 10;

    Item->MakeVisible(false);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientAuthenticationSuccess(TObject* Sender)
{
    Log("Authentication succeeded");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientAuthenticationFailed(TObject* Sender, int AuthType)
{
    AnsiString s;
    s.sprintf("Authentication attempt failed, AuthType = 0x%.2x", AuthType);
    Log(s, true);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientAuthenticationKeyboard(TObject* Sender, TStringList* Prompts, TBits* Echo, TStringList* Responses)
{
    Log("AuthenticationKeyboard request");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientBanner(TObject* Sender, const AnsiString Text, const AnsiString Language)
{
    Log((AnsiString)"Banner Text: " + Text);
    Log((AnsiString)"Banner Language: " + Language);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientCloseConnection(TObject* Sender)
{
    Log((AnsiString)"Connection closed. " + SSHClient->ServerCloseReason);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientError(TObject* Sender, int ErrorCode)
{
    AnsiString s;
    s.sprintf("SSH Client Error: %u", ErrorCode);
    Log(s, true);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHClientOpenConnection(TObject* Sender)
{
    Log("Connection opened.");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHKeyValidate(TObject* Sender, TElSSHKey* ServerKey, bool &Validate)
{
    AnsiString AlgLine;
    if (ServerKey->Algorithm == ALGORITHM_RSA)
        AlgLine = "RSA";
    else if (ServerKey->Algorithm == ALGORITHM_DSS)
        AlgLine = "DSS";
    else
        AlgLine = "unknown";

    AnsiString s;
    s.sprintf("Server key received (%s). Fingerprint is %s", AlgLine, BeautifyBinaryString(DigestToStr(ServerKey->FingerprintMD5, false), ':'));
    Log(s);
    Validate = true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::actAboutExecute(TObject *Sender)
{
    frmAbout->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ShellSSHTunnelOpen(TObject* Sender, TElSSHTunnelConnection* TunnelConnection)
{
    Log("Tunnel connection opened.");
    FSSHTunnelConnection = TunnelConnection;
    SSHTunnelConnection->OnData = SSHTunnelConnectionData;
    SSHTunnelConnection->OnExtendedData = SSHTunnelConnectionData;
    SSHTunnelConnection->OnError = SSHTunnelConnectionError;
    SSHTunnelConnection->OnClose = SSHTunnelConnectionClose;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ShellSSHTunnelError(TObject* Sender, int ErrorCode, void* Data)
{
    AnsiString s;
    s.sprintf("Shell Tunnel Error: %u", ErrorCode);
    Log(s, true);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHTunnelConnectionClose(TObject* Sender, TSSHCloseType CloseType)
{
    AnsiString t;
    bool Error = false;
    switch(CloseType)
    {
        case ctReturn:
            t = "Return";
            break;
        case ctSignal:
            t = "Signal";
            break;
        case ctError:
            t = "Error";
            Error = true;
            break;
        default:
            t = "Unknown";
    }
    AnsiString s;
    s.sprintf("Tunnel connection closed. Type: %s", t);
    Log(s, Error);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHTunnelConnectionData(TObject* Sender, void* Buffer, int Size)
{
    char* Buf = new char[Size+1];
    memset(Buf,0,Size+1);
    Move(Buffer, Buf, Size);
    reTerminal->SelLength = 0;
    reTerminal->SelStart = reTerminal->Text.Length() + 1;
    reTerminal->SelText = AnsiString(Buf);
    delete[] Buf;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SSHTunnelConnectionError(TObject* Sender, int ErrorCode)
{
    AnsiString s;
    s.sprintf("SSH Tunnel Connection Error: %u", ErrorCode);
    Log(s, true);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::reTerminalKeyPress(TObject *Sender, char &Key)
{
    if (FSSHTunnelConnection)
        FSSHTunnelConnection->SendData(&Key, 1);
    Key = 0;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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