⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.pas

📁 著名的SecureBlackBox控件完整源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, SBPGP, SBPGPKeys, SBUtils, SBPGPUtils,
  SBPGPStreams, SBPGPConstants,
  PassphraseRequestForm, SignaturesForm, ImgList;

type
  TfrmForm = class(TForm)
    pgpReader: TElPGPReader;
    pgpWriter: TElPGPWriter;
    pgpPubKeyring: TElPGPKeyring;
    pgpSecKeyring: TElPGPKeyring;
    pHints: TPanel;
    lbStage: TLabel;
    lbStageComment: TLabel;
    PageControl: TPageControl;
    tsFileSelect: TTabSheet;
    tsProgress: TTabSheet;
    lbPrompt: TLabel;
    edFile: TEdit;
    btnBrowseFile: TButton;
    lbFileSelectComment: TLabel;
    btnBack: TButton;
    btnNext: TButton;
    btnCancel: TButton;
    lbProcessingFile: TLabel;
    pbProgress: TProgressBar;
    tsEncOps: TTabSheet;
    lbEncryptionAlg: TLabel;
    lbProtLevel: TLabel;
    cbEncryptionAlg: TComboBox;
    cbProtLevel: TComboBox;
    cbUseConvEnc: TCheckBox;
    cbCompress: TCheckBox;
    cbSign: TCheckBox;
    cbTextInput: TCheckBox;
    cbUseNewFeatures: TCheckBox;
    tsFinish: TTabSheet;
    cbEncrypt: TCheckBox;
    lbFinished: TLabel;
    lbErrorComment: TLabel;
    btnSignatures: TButton;
    tsKeyringSelect: TTabSheet;
    lbPubKeyring: TLabel;
    edPubKeyring: TEdit;
    btnBrowsePub: TButton;
    lbSecKeyring: TLabel;
    edSecKeyring: TEdit;
    btnBrowseSec: TButton;
    tsUserSelect: TTabSheet;
    lbPassphrase: TLabel;
    edPassphrase: TEdit;
    lbPassphraseConfirmation: TLabel;
    edPassphraseConf: TEdit;
    tsOperationSelect: TTabSheet;
    lbIWantTo: TLabel;
    rbProtect: TRadioButton;
    rbUnprotect: TRadioButton;
    pgpKeyring: TElPGPKeyring;
    DlgOpen: TOpenDialog;
    DlgSave: TSaveDialog;
    imgKeys: TImageList;
    cbHashAlgorithm: TComboBox;
    lbHashAlgorithm: TLabel;
    tvKeys: TTreeView;
    lSelectKeys: TLabel;
    procedure btnCancelClick(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure btnBackClick(Sender: TObject);
    procedure cbEncryptClick(Sender: TObject);
    procedure cbSignClick(Sender: TObject);
    procedure btnBrowseFileClick(Sender: TObject);
    procedure pgpWriterKeyPassphrase(Sender: TObject;
      Key: TElPGPCustomSecretKey; var Passphrase: String;
      var Cancel: Boolean);
    procedure pgpWriterProgress(Sender: TObject; Processed, Total: Int64;
      var Cancel: Boolean);
    procedure btnBrowsePubClick(Sender: TObject);
    procedure btnBrowseSecClick(Sender: TObject);
    procedure pgpReaderKeyPassphrase(Sender: TObject;
      Key: TElPGPCustomSecretKey; var Passphrase: String;
      var Cancel: Boolean);
    procedure pgpReaderPassphrase(Sender: TObject; var Passphrase: String;
      var Cancel: Boolean);
    procedure pgpReaderProgress(Sender: TObject; Processed, Total: Int64;
      var Cancel: Boolean);
    procedure pgpReaderCreateOutputStream(Sender: TObject;
      const Filename: String; TimeStamp: TDateTime; var Stream: TStream;
      var FreeOnExit: Boolean);
    procedure pgpReaderSignatures(Sender: TObject;
      Signatures: array of TElPGPSignature;
      Validities: array of TSBPGPSignatureValidity);
    procedure btnSignaturesClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    State: Integer;
    Source: string;

    sigs: array of TElPGPSignature;
    vals: array of TSBPGPSignatureValidity;

    procedure Back();
    procedure Next();

    function GetPrevState(State: Integer): Integer;
    procedure ChangeState(nextState: Integer);

    procedure EnableButtons(Back, Next: Boolean);
    procedure SetCaption(const Stage, Comment: string);

    procedure KeysToList(PublicKeys: Boolean);
    function RequestKeyPassphrase(Key: TElPGPCustomSecretKey; var Cancel: Boolean): string;

    procedure ProtectFile(const SourceFile, DestFile: string);
    procedure DecryptFile(const SourceFile: string);
  public
    { Public declarations }
  end;

var
  frmForm: TfrmForm;

const
  STATE_SELECT_OPERATION		= 0;
  STATE_PROTECT_SELECT_KEYRING		= 1;
  STATE_PROTECT_SELECT_SOURCE		= 2;
  STATE_PROTECT_SELECT_OPERATION	= 3;
  STATE_PROTECT_SELECT_RECIPIENTS	= 4;
  STATE_PROTECT_SELECT_SIGNERS		= 5;
  STATE_PROTECT_SELECT_DESTINATION	= 6;
  STATE_PROTECT_PROGRESS		= 7;
  STATE_PROTECT_FINISH			= 8;
  STATE_DECRYPT_SELECT_KEYRING		= 11;
  STATE_DECRYPT_SELECT_SOURCE		= 12;
  STATE_DECRYPT_PROGRESS		= 13;
  STATE_DECRYPT_FINISH			= 14;
  STATE_FINISH				= 255;
  STATE_INVALID				= -1;

implementation

{$R *.dfm}

procedure TfrmForm.btnCancelClick(Sender: TObject);
begin
  Close();
end;

procedure TfrmForm.btnNextClick(Sender: TObject);
begin
  Next();
end;

procedure TfrmForm.btnBackClick(Sender: TObject);
begin
  Back();
end;

procedure TfrmForm.Back();
begin
  ChangeState(GetPrevState(state));
end;

procedure TfrmForm.Next();
var
  i, k: Integer;
begin
  case state of
    STATE_SELECT_OPERATION:
      if (rbProtect.Checked) then
        ChangeState(STATE_PROTECT_SELECT_KEYRING)
      else
        ChangeState(STATE_DECRYPT_SELECT_KEYRING);

    STATE_PROTECT_SELECT_KEYRING,
    STATE_DECRYPT_SELECT_KEYRING:
      if (not FileExists(edPubKeyring.Text)) then
        MessageDlg('Keyring file "' + edPubKeyring.Text + '" not found', mtError, [mbOK], 0)
      else if (not FileExists(edSecKeyring.Text)) then
        MessageDlg('Keyring file "' + edSecKeyring.Text + '" not found', mtError, [mbOK], 0)
      else
      begin
        try
          pgpKeyring.Load(edPubKeyring.Text, edSecKeyring.Text, true);
        except
	  on E: Exception do
          begin
            MessageDlg('Failed to load keyring: ' + E.Message, mtError, [mbOK], 0);
            Exit;
          end;
        end;

        if (state = STATE_PROTECT_SELECT_KEYRING) then
          ChangeState(STATE_PROTECT_SELECT_SOURCE)
        else
          ChangeState(STATE_DECRYPT_SELECT_SOURCE);
      end;

    STATE_PROTECT_SELECT_SOURCE:
      if (not FileExists(edFile.Text)) then
        MessageDlg('Source file "' + edFile.Text + '" not found', mtError, [mbOK], 0)
      else
      begin
        Source := edFile.Text;
        ChangeState(STATE_PROTECT_SELECT_OPERATION);
      end;

    STATE_PROTECT_SELECT_OPERATION:
      if (not (cbEncrypt.Checked or cbSign.Checked)) then
        MessageDlg('Please select protection operation', mtError, [mbOK], 0)
      else
      begin
        if (cbEncrypt.Checked) then
          ChangeState(STATE_PROTECT_SELECT_RECIPIENTS)
        else
          ChangeState(STATE_PROTECT_SELECT_SIGNERS);
      end;

    STATE_PROTECT_SELECT_RECIPIENTS:
    begin
      k := 0;
      for i := 0 to tvKeys.Items.Count - 1 do
      begin
        SBPGPKeys.TElPGPCustomPublicKey(tvKeys.Items[i].Data).Enabled := tvKeys.Items[i].Selected;
        if tvKeys.Items[i].Selected then Inc(k);
      end;

      if ((k = 0) and (not cbUseConvEnc.Checked)) then
        MessageDlg('At least one recipient key must be selected', mtError, [mbOK], 0)
      else
      begin
        if (cbSign.Checked) then
          ChangeState(STATE_PROTECT_SELECT_SIGNERS)
        else
          ChangeState(STATE_PROTECT_SELECT_DESTINATION);
      end;
    end;

    STATE_PROTECT_SELECT_SIGNERS:
    begin
      k := 0;
      for i := 0 to tvKeys.Items.Count - 1 do
      begin
        SBPGPKeys.TElPGPCustomSecretKey(tvKeys.Items[i].Data).Enabled := tvKeys.Items[i].Selected;
        if tvKeys.Items[i].Selected then Inc(k);
      end; 

      if (k = 0) then
        MessageDlg('At least one signer''s key must be selected', mtError, [mbOK], 0)
      else
        ChangeState(STATE_PROTECT_SELECT_DESTINATION);
    end;

    STATE_PROTECT_SELECT_DESTINATION:
      ChangeState(STATE_PROTECT_PROGRESS);

    STATE_DECRYPT_SELECT_SOURCE:
      if (not FileExists(edFile.Text)) then
        MessageDlg('Source file "' + edFile.Text + '" not found', mtError, [mbOK], 0)
      else
      begin
        Source := edFile.Text;
        ChangeState(STATE_DECRYPT_PROGRESS);
      end;
  end;
end;

function TfrmForm.RequestKeyPassphrase(Key: TElPGPCustomSecretKey; var Cancel: Boolean): string;
var
  UserName: string;
begin
  Cancel := False;
  Result := '';
  with TfrmPassphraseRequest.Create(Self) do
    try
      if (key <> nil) then
      begin
        if (key is SBPGPKeys.TElPGPSecretKey) then
        begin
          if (SBPGPKeys.TElPGPSecretKey(key).PublicKey.UserIDCount > 0) then
            UserName := SBPGPKeys.TElPGPSecretKey(key).PublicKey.UserIDs[0].Name
          else
            UserName := '<no name>';
        end
        else
          UserName := 'Subkey';

        lbPrompt.Caption := 'Passphrase is needed for secret key:';
        lbKeyID.Caption := UserName + ' (ID=0x' + KeyID2Str(key.KeyID(), true) + ')';
      end
      else
      begin
        lbPrompt.Caption := 'Passphrase is needed to decrypt the message';
        lbKeyID.Caption := '';
      end;

      if ShowModal = mrOK then
        Result := edPassphrase.Text
      else
        Cancel := True;
    finally
      Free;
    end;
end;

procedure TfrmForm.EnableButtons(Back, Next: Boolean);
begin
  btnBack.Enabled := Back;
  btnNext.Enabled := Next;
end;

procedure TfrmForm.SetCaption(const Stage, Comment: string);
begin
  lbStage.Caption := Stage;
  lbStageComment.Caption := Comment;
end;

function TfrmForm.GetPrevState(State: Integer): Integer;
begin
  case state of
    STATE_SELECT_OPERATION:
      Result := STATE_INVALID;

    STATE_PROTECT_SELECT_KEYRING:
      Result := STATE_SELECT_OPERATION;

    STATE_PROTECT_SELECT_SOURCE:
      Result := STATE_PROTECT_SELECT_KEYRING;

    STATE_PROTECT_SELECT_OPERATION:
      Result := STATE_PROTECT_SELECT_SOURCE;

    STATE_PROTECT_SELECT_DESTINATION:
      if (cbSign.Checked) then
        Result := STATE_PROTECT_SELECT_SIGNERS
      else
        Result := STATE_PROTECT_SELECT_RECIPIENTS;

    STATE_PROTECT_SELECT_RECIPIENTS:
      Result := STATE_PROTECT_SELECT_OPERATION;

    STATE_PROTECT_SELECT_SIGNERS:
      if (cbEncrypt.Checked) then
        Result := STATE_PROTECT_SELECT_RECIPIENTS
      else
        Result := STATE_PROTECT_SELECT_OPERATION;

    STATE_DECRYPT_SELECT_KEYRING:
      Result := STATE_SELECT_OPERATION;

    STATE_DECRYPT_SELECT_SOURCE:
      Result := STATE_DECRYPT_SELECT_KEYRING;

  else
    Result := STATE_INVALID;
  end;
end;

procedure TfrmForm.ChangeState(nextState: Integer);
begin
  case nextState of
   STATE_SELECT_OPERATION:
   begin
     SetCaption('Preparatory stage', 'Choose desired operation');
     EnableButtons(false, true);
     PageControl.ActivePage := tsOperationSelect;
   end;

   STATE_PROTECT_SELECT_KEYRING:
   begin
     SetCaption('Step 1 of 6', 'Select keyring files');
     EnableButtons(true, true);
     PageControl.ActivePage := tsKeyringSelect;
   end;

   STATE_PROTECT_SELECT_SOURCE:
   begin
     SetCaption('Step 2 of 6', 'Select file to protect');
     lbFileSelectComment.Caption := '';
     EnableButtons(true, true);
     PageControl.ActivePage := tsFileSelect;
   end;

   STATE_PROTECT_SELECT_OPERATION:
   begin
     SetCaption('Step 3 of 6', 'Select protection options');
     EnableButtons(true, true);
     cbEncryptionAlg.Text := 'CAST5';
     cbProtLevel.Text := 'Low';

     if (pgpKeyring.SecretCount = 0) then
     begin
       cbSign.Checked := false;
       cbSign.Enabled := false;
     end
     else
       cbSign.Enabled := true;

     if (pgpKeyring.PublicCount = 0) then
     begin
       cbEncrypt.Checked := false;
       cbEncrypt.Enabled := false;
     end
     else
       cbEncrypt.Enabled := true;

     PageControl.ActivePage := tsEncOps;
    end;

    STATE_PROTECT_SELECT_RECIPIENTS:
    begin
      SetCaption('Step 4 of 6', 'Select recipients');
      EnableButtons(true, true);
      KeysToList(true);
      edPassphrase.Visible := cbUseConvEnc.Checked;
      edPassphraseConf.Visible := cbUseConvEnc.Checked;
      lbPassphrase.Visible := cbUseConvEnc.Checked;
      lbPassphraseConfirmation.Visible := cbUseConvEnc.Checked;
      PageControl.ActivePage := tsUserSelect;
    end;

    STATE_PROTECT_SELECT_SIGNERS:
    begin
      SetCaption('Step 4 of 6', 'Select signers');
      EnableButtons(true, true);
      KeysToList(false);
      edPassphrase.Visible := false;
      edPassphraseConf.Visible := false;
      lbPassphrase.Visible := false;
      lbPassphraseConfirmation.Visible := false;
      PageControl.ActivePage := tsUserSelect;
    end;

    STATE_PROTECT_SELECT_DESTINATION:
    begin
      SetCaption('Step 5 of 6', 'Select destination file');
      lbFileSelectComment.Caption := '';
      edFile.Text := Source + '.pgp';
      EnableButtons(true, true);
      PageControl.ActivePage := tsFileSelect;
    end;

    STATE_PROTECT_PROGRESS:

⌨️ 快捷键说明

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