📄 mainform.pas
字号:
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 + -