mainform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 2,311 行 · 第 1/5 页

PAS
2,311
字号
  begin
    Application.ProcessMessages;
    SetResults( PGPDecrypt(edInputFile.Text, edOutputFile.Text) );
  end;
end;

function TfrmMain.PGPEncrypt(const InputFileName, OutputFileName: string): string;
var
  Msg: TElMessage;
  Stream: TFileStream;
  PGPMime: TElMessagePartHandlerPGPMime;
  Res: Integer;
begin
  Result := '';
  Msg := TElMessage.Create(cXMailerDemoFieldValue);
  Stream := TFileStream.Create(InputFileName, fmOpenRead or fmShareExclusive);
  try
    Res := Msg.ParseMessage(Stream, '', '',
{$IFDEF DELPHI_NET}
                   mpoStoreStream + mpoLoadData + mpoCalcDataSize,
{$ELSE}
                   [mpoStoreStream, mpoLoadData, mpoCalcDataSize],
{$ENDIF}
                   False, False, True);
  except
    on E: Exception do
    begin
      Result := E.Message;
      Res := EL_ERROR;
    end;
  end;

  Stream.Free;

  if (Res <> EL_OK) and (Res <> EL_WARNING) then
  begin
    if Result <> '' then
      Result := 'Message: "' + Result + '"'
    else
      if (Res = EL_HANDLERR_ERROR) and Assigned(Msg.MainPart.MessagePartHandler) then
        Result := 'Message: "' + Msg.MainPart.MessagePartHandler.ErrorText + '"';

    Result := Format('Error parsing mime message "%s".'#13#10'ElMime error code: %d'#13#10'%s',
                     [InputFileName, Res, Result]);
    Msg.Free;
    Exit;
  end;

  PGPMime := TElMessagePartHandlerPGPMime.Create(nil);
  Msg.MainPart.MessagePartHandler := PGPMime;

  PGPMime.EncryptingKeys := FPublicRing;
//  PGPMime.OnKeyPassphrase := PGPMIMEKeyPassphrase;
  PGPMime.Encrypt := True;

  Stream := TFileStream.Create(OutputFileName, fmCreate or fmShareExclusive);
  Stream.Size := 0;
  try
    Res := Msg.AssembleMessage(Stream,
      // Charset of message:
        'utf-8',
      // HeaderEncoding
        heBase64, //  variants:  he8bit  | heQuotedPrintable  | heBase64
      // BodyEncoding
        'base64', //  variants:   '8bit' | 'quoted-printable' |  'base64'
      // AttachEncoding
        'base64'  //  variants:   '8bit' | 'quoted-printable' |  'base64'
      );
  except
    on E: Exception do
    begin
      Result := E.Message;
      Res := EL_ERROR;
    end;
  end;

  if (Res = EL_OK) or (Res = EL_WARNING) then
    Result := 'Message encrypted and assembled OK'
  else
  begin
    if Result <> '' then
      Result := 'Message: "' + Result + '"'
    else
      if Res = EL_HANDLERR_ERROR then
        Result := 'Message: "' + PGPMime.ErrorText + '"';

    Result := Format('Failed to assemble a message.'#13#10'ElMime error code: %d'#13#10'%s', [Res, Result]);
  end;

  Stream.Free;
  Msg.Free;
end;

procedure TfrmMain.PGPEncryptNext;
var
  NextPage: Integer;
begin
  NextPage := -1;
  case CurrentPage of
    PAGE_SELECT_ACTION:
    begin
      NextPage := PAGE_SELECT_FILES;
    end;

    PAGE_SELECT_FILES:
    begin
      if (edInputFile.Text = '') or (edOutputFile.Text = '') then
        MessageDlg(sSelectInputOutputFiles, mtError, [mbOk], 0)
      else
        NextPage := PAGE_SELECT_KEYS;
    end;

    PAGE_SELECT_KEYS:
    begin
     if FPublicRing.PublicCount = 0 then
       MessageDlg('No public key selected. Please select one.', mtError, [mbOk], 0)
     else
       NextPage := PAGE_CHECK_DATA;
    end;

    PAGE_CHECK_DATA:
    begin
      NextPage := PAGE_PROCESS;
    end;
  else
    NextPage := PAGE_DEFAULT;
  end;

  if NextPage >= 0 then
    SetPage(NextPage);

  if NextPage = PAGE_PROCESS then
  begin
    Application.ProcessMessages;
    SetResults( PGPEncrypt(edInputFile.Text, edOutputFile.Text) );
  end;
end;

procedure TfrmMain.PGPMIMEKeyPassphrase(Sender: TObject;
  Key: TElPGPCustomSecretKey; var Passphrase: string; var Cancel: boolean);
begin
  Passphrase := '';
  Cancel := not InputQuery('Password request',
         'Please enter password for key ' + KeyID2Str(Key.KeyID), Passphrase);
end;

function TfrmMain.PGPSign(const InputFileName, OutputFileName: string): string;
var
  Msg: TElMessage;
  Stream: TFileStream;
  PGPMime: TElMessagePartHandlerPGPMime;
  Res: Integer;
begin
  Result := '';
  Msg := TElMessage.Create(cXMailerDemoFieldValue);
  Stream := TFileStream.Create(InputFileName, fmOpenRead or fmShareExclusive);
  try
    Res := Msg.ParseMessage(Stream, '', '',
{$IFDEF DELPHI_NET}
                   mpoStoreStream + mpoLoadData + mpoCalcDataSize,
{$ELSE}
                   [mpoStoreStream, mpoLoadData, mpoCalcDataSize],
{$ENDIF}
                   False, False, True);
  except
    on E: Exception do
    begin
      Result := E.Message;
      Res := EL_ERROR;
    end;
  end;

  Stream.Free;

  if (Res <> EL_OK) and (Res <> EL_WARNING) then
  begin
    if Result <> '' then
      Result := 'Message: "' + Result + '"'
    else
      if (Res = EL_HANDLERR_ERROR) and Assigned(Msg.MainPart.MessagePartHandler) then
        Result := 'Message: "' + Msg.MainPart.MessagePartHandler.ErrorText + '"';

    Result := Format('Error parsing mime message "%s".'#13#10'ElMime error code: %d'#13#10'%s',
                     [InputFileName, Res, Result]);
    Msg.Free;
    Exit;
  end;

  PGPMime := TElMessagePartHandlerPGPMime.Create(nil);
  Msg.MainPart.MessagePartHandler := PGPMime;

  PGPMime.SigningKeys := FSecretRing;
  PGPMime.OnKeyPassphrase := PGPMIMEKeyPassphrase;
  PGPMime.Sign := True;

  Stream := TFileStream.Create(OutputFileName, fmCreate or fmShareExclusive);
  Stream.Size := 0;
  try
    Res := Msg.AssembleMessage(Stream,
      // Charset of message:
        'utf-8',
      // HeaderEncoding
        heBase64, //  variants:  he8bit  | heQuotedPrintable  | heBase64
      // BodyEncoding
        'base64', //  variants:   '8bit' | 'quoted-printable' |  'base64'
      // AttachEncoding
        'base64'  //  variants:   '8bit' | 'quoted-printable' |  'base64'
      );
  except
    on E: Exception do
    begin
      Result := E.Message;
      Res := EL_ERROR;
    end;
  end;

  if (Res = EL_OK) or (Res = EL_WARNING) then
    Result := 'Message signed and assembled OK'
  else
  begin
    if Result <> '' then
      Result := 'Message: "' + Result + '"'
    else
      if Res = EL_HANDLERR_ERROR then
        Result := 'Message: "' + PGPMime.ErrorText + '"';

    Result := Format('Failed to assemble a message.'#13#10'ElMime error code: %d'#13#10'%s', [Res, Result]);
  end;

  Stream.Free;
  Msg.Free;
end;

procedure TfrmMain.PGPSignNext;
var
  NextPage: Integer;
begin
  NextPage := -1;
  case CurrentPage of
    PAGE_SELECT_ACTION:
    begin
      NextPage := PAGE_SELECT_FILES;
    end;

    PAGE_SELECT_FILES:
    begin
      if (edInputFile.Text = '') or (edOutputFile.Text = '') then
        MessageDlg(sSelectInputOutputFiles, mtError, [mbOk], 0)
      else
        NextPage := PAGE_SELECT_KEYS;
    end;

    PAGE_SELECT_KEYS:
    begin
     if FSecretRing.SecretCount = 0 then
       MessageDlg('No secret key selected. Please select one.', mtError, [mbOk], 0)
     else
       NextPage := PAGE_CHECK_DATA;
    end;

    PAGE_CHECK_DATA:
    begin
      NextPage := PAGE_PROCESS;
    end;
  else
    NextPage := PAGE_DEFAULT;
  end;

  if NextPage >= 0 then
    SetPage(NextPage);

  if NextPage = PAGE_PROCESS then
  begin
    Application.ProcessMessages;
    SetResults( PGPSign(edInputFile.Text, edOutputFile.Text) );
  end;
end;

function TfrmMain.PGPVerify(const InputFileName: string): string;
var
  Msg: TElMessage;
  Stream: TFileStream;
  Res: Integer;
begin
  Result := '';
  Msg := TElMessage.Create(cXMailerDemoFieldValue);
  Stream := TFileStream.Create(InputFileName, fmOpenRead or fmShareExclusive);
  try
    Res := Msg.ParseMessage(Stream, '', '',
{$IFDEF DELPHI_NET}
                   mpoStoreStream + mpoLoadData + mpoCalcDataSize,
{$ELSE}
                   [mpoStoreStream, mpoLoadData, mpoCalcDataSize],
{$ENDIF}
                   False, False, False);
  except
    on E: Exception do
    begin
      Result := E.Message;
      Res := EL_ERROR;
    end;
  end;

  if (Res = EL_OK) or (Res = EL_WARNING) then
  begin
    if not Assigned(Msg.MainPart) or
       not Assigned(Msg.MainPart.MessagePartHandler) or
       Msg.MainPart.IsActivatedMessagePartHandler then
    begin
      Result := 'Mesage not encoded. No action done.';
      Stream.Free;
      Msg.Free;
      Exit;
    end;

    if Msg.MainPart.MessagePartHandler.IsError then
    begin
      Result := Msg.MainPart.MessagePartHandler.ErrorText;
      Res := EL_ERROR;
    end
    else
    begin
      if Msg.MainPart.MessagePartHandler is TElMessagePartHandlerPGPMime then
      begin
        with TElMessagePartHandlerPGPMime(Msg.MainPart.MessagePartHandler) do
        begin
          VerifyingKeys := FKeyring;
//          OnKeyPassphrase := PGPMIMEKeyPassphrase;
        end;

        try
          Res := Msg.MainPart.MessagePartHandler.Decode(True);
        except
          on E: Exception do
          begin
            Result := E.Message;
            Res := EL_ERROR;
          end;
        end;
      end
      else
      begin
        Result := 'Unknown message handler.';
        Res := EL_ERROR;
      end;
    end;
  end;

  Stream.Free;

  if (Res <> EL_OK) and (Res <> EL_WARNING) then
  begin
    if Result <> '' then
      Result := 'Message: "' + Result + '"'
    else
      if (Res = EL_HANDLERR_ERROR) and Assigned(Msg.MainPart.MessagePartHandler) then
        Result := 'Message: "' + Msg.MainPart.MessagePartHandler.ErrorText + '"';

    Result := Format('Error parsing mime message "%s".'#13#10'ElMime error code: %d'#13#10'%s',
                     [InputFileName, Res, Result]);
  end
  else
  begin
    if (Res = EL_WARNING) and Assigned(Msg.MainPart.MessagePartHandler) and
       (Msg.MainPart.MessagePartHandler.ErrorText <> '') then
      Result := 'Message: "' + Msg.MainPart.MessagePartHandler.ErrorText + '"'
    else
      Result := 'Message verified OK';
      
    if Assigned(Msg.MainPart.MessagePartHandler) and
       (Msg.MainPart.MessagePartHandler is TElMessagePartHandlerPGPMime) then
    begin
      Result := Result + #13#10#13#10'Signature verified with:'#13#10;
      Result := Result + WriteKeyringInfo(TElMessagePartHandlerPGPMime(Msg.MainPart.MessagePartHandler).VerifyingKeys);
    end;
  end;

  Msg.Free;
end;

procedure TfrmMain.PGPVerifyNext;
var
  NextPage: Integer;
begin
  NextPage := -1;
  case CurrentPage of
    PAGE_SELECT_ACTION:
    begin
      NextPage := PAGE_SELECT_FILES;
    end;

    PAGE_SELECT_FILES:
    begin
      if edInputFile.Text = '' then
        MessageDlg(sSelectInputFiles, mtError, [mbOk], 0)
      else
        NextPage := PAGE_SELECT_KEYS;
    end;

    PAGE_SELECT_KEYS:
    begin
      NextPage := PAGE_CHECK_DATA;
    end;

    PAGE_CHECK_DATA:
    begin
      NextPage := PAGE_PROCESS;
    end;
  else
    NextPage := PAGE_DEFAULT;
  end;

  if NextPage >= 0 then
    SetPage(NextPage);

  if NextPage = PAGE_PROCESS then
  begin
    Application.ProcessMessages;
    SetResults( PGPVerify(edInputFile.Text) );
  end;
end;

procedure TfrmMain.sbInputFileClick(Sender: TObject);
begin
  OpenDlg.Title := 'Select input file';
  OpenDlg.Filter := 'Message files (*.eml)|*.eml|All files (*.*)|*.*';
  OpenDlg.FileName := edInputFile.Text;
  if OpenDlg.Execute then
    edInputFile.Text := OpenDlg.FileName;
end;

procedure TfrmMain.sbKeyringClick(Sender: TObject);
var
  F: TFileStream;
begin
  OpenDlg.Title := 'Select input file';
  OpenDlg.Filter := 'PGP Keyring files (*.asc, *.pkr, *.skr, *.gpg, *.pgp)|*.asc;*.pkr;*.skr;*.gpg;*.pgp';
  OpenDlg.FileName := edKeyring.Text;
  if OpenDlg.Execute then
  begin
    F := TFileStream.Create(OpenDlg.Filename, fmOpenRead);
    try
      try
        if Action = ACTION_PGPMIME_ENCRYPT then
          FPublicRing.Load(F, nil, True)
        else if Action = ACTION_PGPMIME_SIGN then
          FSecretRing.Load(F, nil, True);
      finally
        F.Free;
      end;
    except
      edKeyring.Text := '';
      Exit;
    end;

    edKeyring.Text := OpenDlg.Filename;
  end;
end;

procedure TfrmMain.sbOutputFileClick(Sender: TObject);
begin
  SaveDlg.Title := 'Select output file';
  SaveDlg.Filter := 'Message files (*.eml)|*.eml|All files (*.*)|*.*';

⌨️ 快捷键说明

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