elmimeviewer_optionspgpmime.pas

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

PAS
232
字号
unit ElMimeViewer_OptionsPGPMime;

interface

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ElMimeViewer_DataCommon, comctrls, ExtCtrls, StdCtrls, Buttons, ImgList,
  SBPGPKeys, SBPGPConstants, SBPGPUtils;

type
  TFrame = TElMimePlugFrameOptions;

  TfraOptionsPGPMime = class(TFrame)
    pRight: TPanel;
    pClient: TPanel;
    pKeyInfo: TPanel;
    tvKeys: TTreeView;
    HeaderKeys: THeaderControl;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    btnAddKey: TBitBtn;
    btnRemoveKey: TBitBtn;
    btnSaveKey: TBitBtn;
    Bevel: TBevel;
    btnClear: TBitBtn;
    ImageList: TImageList;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    procedure tvKeysChange(Sender: TObject; Node: TTreeNode);
    procedure btnAddKeyClick(Sender: TObject);
    procedure btnRemoveKeyClick(Sender: TObject);
    procedure btnSaveKeyClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
  private
    procedure RepaintKeyring;
  public
    constructor Create(AOwner: TComponent; RootNode: TTreeNode; Nodes: TTreeNodesA); override;
    destructor Destroy; override;
    function GetCaption: string; override;
  end;

var
  Keyring : TElPGPKeyring;

implementation

{$R *.DFM}

constructor TfraOptionsPGPMime.Create(AOwner: TComponent; RootNode: TTreeNode;
  Nodes: TTreeNodesA);
begin
  inherited;

  fNode := TTreeNodeInfoOptions.Create(Nodes, tiOptions);
  fNode.ImageIndex := 58;
  fNode.SelectedIndex := 58;
  fNode.PlugFrame := Self;
  Nodes.AddNode(fNode, RootNode, 'PGP/MIME', nil, naAddChild);

  Keyring := TElPGPKeyring.Create(nil);

  // loading default keyring
  Keyring.Load('EldoS MIMEBlackbox Demo.asc', '');
  RepaintKeyring;
end;

destructor TfraOptionsPGPMime.Destroy;
begin
  if fNode <> nil then
  begin
    fNode.PlugFrame := nil;
  end;
  Keyring.Free;
  inherited;
end;

function TfraOptionsPGPMime.GetCaption: string;
begin
  Result := 'PGP/MIME Options';
end;

procedure TfraOptionsPGPMime.RepaintKeyring;
var
  I, J, K: integer;
  S: string;
  Node, SubNode, SigNode: TTreeNode;
begin
  tvKeys.Items.BeginUpdate;
  try
    tvKeys.Items.Clear;
    for I := 0 to Keyring.PublicCount - 1 do
    begin
      if Keyring.PublicKeys[I].UserIDCount > 0 then
        S := Keyring.PublicKeys[I].UserIDs[0].Name
      else
        S := '<unnamed key>';
      Node := tvKeys.Items.AddChild(nil, S);
     Node.Data := Keyring.PublicKeys[I];
      if Keyring.PublicKeys[I].PublicKeyAlgorithm in [SB_PGP_ALGORITHM_PK_DSA,
        SB_PGP_ALGORITHM_PK_ELGAMAL] then
        Node.ImageIndex := 0
      else
        Node.ImageIndex := 1;
      Node.SelectedIndex := Node.ImageIndex;

      for J := 0 to Keyring.PublicKeys[I].UserIDCount - 1 do
      begin
        SubNode := tvKeys.Items.AddChild(Node, Keyring.PublicKeys[I].UserIDs[J].Name);
        SubNode.Data := Keyring.PublicKeys[I].UserIDs[J];
        SubNode.ImageIndex := 2;
        SubNode.SelectedIndex := 2;
        for K := 0 to Keyring.PublicKeys[I].UserIDs[J].SignatureCount - 1 do
        begin
          SigNode := tvKeys.Items.AddChild(SubNode, 'signature');
          SigNode.Data := Keyring.PublicKeys[I].UserIDs[J].Signatures[K];
          SigNode.ImageIndex := 3;
          SigNode.SelectedIndex := 3;
        end;
      end;

      for J := 0 to Keyring.PublicKeys[I].SubkeyCount - 1 do
      begin
        SubNode := tvKeys.Items.AddChild(Node, 'Subkey');
        SubNode.Data := Keyring.PublicKeys[I].Subkeys[J];
        SubNode.ImageIndex := Node.ImageIndex;
        SubNode.SelectedIndex := Node.ImageIndex;
        for K := 0 to Keyring.PublicKeys[I].Subkeys[J].SignatureCount - 1 do
        begin
          SigNode := tvKeys.Items.AddChild(SubNode, 'signature');
          SigNode.Data := Keyring.PublicKeys[I].Subkeys[J].Signatures[K];
          SigNode.ImageIndex := 3;
          SigNode.SelectedIndex := 3;
        end;
      end;
    end;
  finally
    tvKeys.Items.EndUpdate;
  end;
end;

procedure TfraOptionsPGPMime.tvKeysChange(Sender: TObject;
  Node: TTreeNode);
begin
  if Assigned(Node) and Assigned(Node.Data) then
  begin
    if (TObject(Node.Data) is TElPGPPublicKey) or
      (TObject(Node.Data) is TElPGPPublicSubkey) then
    begin
      Label1.Caption := 'Key ID: ' + KeyID2Str(TElPGPCustomPublicKey(Node.Data).KeyID, false);
      Label2.Caption := 'Key FP: ' + KeyFP2Str(TElPGPCustomPublicKey(Node.Data).KeyFP);
      Label3.Caption := 'Algorithm: ' + PKAlg2Str(TElPGPCustomPublicKey(Node.Data).PublicKeyAlgorithm) +
        ' (' + IntToStr(TElPGPCustomPublicKey(Node.Data).BitsInKey) + ' bits)';
    end
    else if TObject(Node.Data) is TElPGPSignature then
    begin
      Label1.Caption := 'Signing Key ID: ' + KeyID2Str(TElPGPSignature(Node.Data).SignerKeyID, false);
      Label2.Caption := '';
      Label3.Caption := '';
    end
    else
    begin
      Label1.Caption := '';
      Label2.Caption := '';
      Label3.Caption := '';
    end;
  end
  else
  begin
    Label1.Caption := '';
    Label2.Caption := '';
    Label3.Caption := '';
  end;
end;

procedure TfraOptionsPGPMime.btnAddKeyClick(Sender: TObject);
var
  TempKeyring : TElPGPKeyring;
begin
  if OpenDialog.Execute then
  begin
    TempKeyring := TElPGPKeyring.Create(nil);
    try
      TempKeyring.Load(OpenDialog.Filename, '', true);
      TempKeyring.ExportTo(Keyring);
    finally
      TempKeyring.Free;
    end;
    RepaintKeyring;
  end;
end;

procedure TfraOptionsPGPMime.btnRemoveKeyClick(Sender: TObject);
begin
  if MessageDlg('Are you sure you wish to remove this key from keyring?', mtConfirmation,
    [mbYes, mbNo], 0) <> mrYes then Exit;
  if Assigned(tvKeys.Selected) and Assigned(tvKeys.Selected.Data) and
    (TObject(tvKeys.Selected.Data) is TElPGPPublicKey) then
  begin
    if Assigned(TElPGPPublicKey(tvKeys.Selected.Data).SecretKey) then
      Keyring.RemoveSecretkey(TElPGPPublicKey(tvKeys.Selected.Data).SecretKey)
    else
      Keyring.RemovePublickey(TElPGPPublicKey(tvKeys.Selected.Data));
    RepaintKeyring;
  end;
end;

procedure TfraOptionsPGPMime.btnSaveKeyClick(Sender: TObject);
begin
  if Assigned(tvKeys.Selected) and Assigned(tvKeys.Selected.Data) and
    (TObject(tvKeys.Selected.Data) is TElPGPPublicKey) then
  begin
    if not SaveDialog.Execute then Exit;
    if Assigned(TElPGPPublicKey(tvKeys.Selected.Data).SecretKey) then
      TElPGPPublicKey(tvKeys.Selected.Data).SecretKey.SaveToFile(SaveDialog.Filename)
    else
      TElPGPPublicKey(tvKeys.Selected.Data).SaveToFile(SaveDialog.Filename);
    MessageDlg('Key successfully saved', mtInformation, [mbOk], 0);
  end;
end;

procedure TfraOptionsPGPMime.btnClearClick(Sender: TObject);
begin
  Keyring.Clear;
  RepaintKeyring;
end;

initialization
  TfraOptionsPGPMime.RegisterClass(TfraOptionsPGPMime);

end.

⌨️ 快捷键说明

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