mimemakerform.pas

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

PAS
897
字号
        pgpmime.Encrypt := true;
        pgpmime.EncryptingKeys := FPublicRing;
      end;
    end;
    {$ENDIF}

    msg.From.AddAddress('e-mail: '+editFrom.Text, editFrom.Text);

    {$IFNDEF _RepackTest}
    if editTo.Text <> '' then
      msg.To_.AddAddress('', editTo.Text);
    if editCc.Text <> '' then
      msg.Cc.AddAddress('', editCc.Text);
    msg.SetSubject(editSubject.Text);
    msg.SetDate(Now);
    msg.MessageID := msg.GenerateMessageID;
    {$ENDIF}

    // assemble:
    sm := TAnsiStringStream.Create;

    res := msg.AssembleMessage(sm,
      // 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'
    );

    if (res = EL_OK) or (res = EL_WARNING) then
    begin
      sm.SaveToFile(SaveDialog.FileName);
      MessageDlg('Message assembled OK', mtInformation, [mbOk], 0);
    end
    else
    begin
      if res = EL_HANDLERR_ERROR then
      begin
        {$IFDEF _SMIME_}
        if Assigned(smime) then
          s := 'Message: "' + smime.ErrorText + '"';
        {$ENDIF}
        {$IFDEF _PGP_}
        if Assigned(pgpmime) then
          s := 'Message: "' + pgpmime.ErrorText + '"';
        {$ENDIF}
      end;
      MessageDlg('Failed to assemble a message, error "'+IntToStr(res)+'"'#13#10 + s,
        mtError, [mbOk], 0);
    end;

  //finally
    msg.Free;
    sm.Free;
  //end;

end;

procedure TMakerForm.spHCanResize(Sender: TObject; var NewSize: Integer;
  var Accept: Boolean);
begin
  if NewSize = spH.MinSize then // fix splitter bug when resizing to down
    Accept := False;
end;

procedure TMakerForm.btnAddAttachClick(Sender: TObject);
var
  i: integer;
begin
  if OpenDialog.Execute then
  begin
    i := listFileNames.Items.IndexOf(OpenDialog.FileName);
    if i >= 0 then
    begin
      listFileNames.ItemIndex := i;
      exit;
    end;
    {$IFDEF VCL_6_USED}
    listFileNames.AddItem(OpenDialog.FileName, nil);
    {$ELSE}
    listFileNames.Items.Add(OpenDialog.FileName);
    {$ENDIF}
    listFileNames.ItemIndex := listFileNames.Items.Count -1;
    btnRemoveAttach.Enabled := True;
  end;
end;

procedure TMakerForm.btnRemoveAttachClick(Sender: TObject);
var
  i: integer;
begin

  if listFileNames.ItemIndex>=0 then
  begin
    i := listFileNames.ItemIndex;
    {$IFDEF VCL_6_USED}
    listFileNames.DeleteSelected;
    {$ELSE}
    if i <> -1 then
      listFileNames.Items.Delete(i);
    {$ENDIF}
    btnRemoveAttach.Enabled := listFileNames.Items.Count > 0;
    if btnRemoveAttach.Enabled then
    begin
      if i < listFileNames.Items.Count-1 then
        listFileNames.ItemIndex := i
      else
        listFileNames.ItemIndex := listFileNames.Items.Count-1;
    end;
  end;
end;

procedure TMakerForm.btnCryptLoadClick(Sender: TObject);
{$IFDEF _SMIME_}
var
  ws: WideString;
  sPswd: AnsiString;
  sFrom: string;
  Cert : TElX509Certificate;
  Item: TListItem;
  Index : integer;

  function ConvertUTF8String(const Source: AnsiString): WideString;
  {$IFDEF DELPHI_NET}
  begin
    Result := System.Text.Encoding.UTF8.GetString(TBytes(Source));
  end;
  {$ELSE}
  var
    sDest: AnsiString;
    Conv: TPlConverter;
  begin
    sDest := '';
    if Length(Source) > 0 then
    begin
      Conv := TPlConverter.Create('utf-8', 'utf-16');
      Conv.Convert(Source, sDest, []);
      Result := AnsiStringToByteWideString(sDest);
      Conv.Free;
    end
    else
      Result := '';
  end;
  {$ENDIF}

  function GetOIDValue(NTS : TElRelativeDistinguishedName; S: BufferType): AnsiString;
  var SL : {$IFDEF DELPHI_NET}ArrayList{$ELSE}TStringList{$ENDIF};
  begin
    SL := {$IFDEF DELPHI_NET}ArrayList{$ELSE}TStringList{$ENDIF}.Create;
    try
      NTS.GetValuesByOID(S, SL);
      if SL.Count >= 1 then
        Result := AnsiString(BufferType(SL[0]))
      else
        SetLength(Result, 0);
    finally
      SL.Free;
    end;
  end;
{$ENDIF}
begin
  {$IFDEF _SMIME_}
  if ODC.Execute then
  begin
    ws:= InputBox('Certificate Password',
        'Please enter password if it is needed', #0 );
    if ws = #0 then
      sPswd := ''
    else
      sPswd := ws;
    if AddToStorageCertificateFromFile( FEnryptCertStorage,
        // FileName:
          ODC.FileName,
       // Password:
          sPswd
    ) then
    begin
      Cert := FEnryptCertStorage.Certificates[FEnryptCertStorage.Count-1];
      sFrom := // == certificate e-mail:
      ConvertUTF8String(
        GetOIDValue(
          Cert.SubjectRDN,
          SB_CERT_OID_EMAIL)
      );
      if sFrom = '' then
      begin
        Index := Cert.Extensions.SubjectAlternativeName.Content.FindNameByType(gnRFC822Name);
        if Index <> -1 then
          sFrom := Cert.Extensions.SubjectAlternativeName.Content.Names[Index].RFC822Name
        else
          MessageDlg('Warning: Certificate does not contain e-mail address.', mtWarning,
            [mbOk], 0);
      end;
      //if (sFrom <> '') and Cert.PrivateKeyExists then
      //  editFrom.Text := sFrom;
      Item := lvCryptCerts.Items.Add;
      if sFrom = '' then
        sFrom := Cert.SubjectName.CommonName;
      if sFrom = '' then
        sFrom := '<untitled>';
      Item.Caption := sFrom;
      Item.Data := Cert;
    end
    else
      MessageDlg('Error: Error loading certificate: "' + ODC.FileName + '"',
        mtError, [mbOk], 0);
  end;
  {$ENDIF}
end;

procedure TMakerForm.cbSecurityChange(Sender: TObject);
begin
  pSMIME.Visible := cbSecurity.ItemIndex = 1;
  pPGPMIME.Visible := cbSecurity.ItemIndex = 2;
end;

procedure TMakerForm.btnSelectPubClick(Sender: TObject);
{$IFDEF _PGP_}
var
  F : TFileStream;
{$ENDIF}
begin
  {$IFDEF _PGP_}
  if OpenDialogKeyring.Execute then
  begin
    F := TFileStream.Create(OpenDialogKeyring.Filename, fmOpenRead);
    try
      try
        FPublicRing.Load(F, nil, true);
      finally
        F.Free;
      end;
    except
      editPublicKeyring.Text := '';
      Exit;
    end;
    editPublicKeyring.Text := OpenDialogKeyring.Filename;
  end;
  {$ENDIF}
end;

procedure TMakerForm.btnSelectSecClick(Sender: TObject);
{$IFDEF _PGP_}
var
  F : TFileStream;
{$ENDIF}
begin
  {$IFDEF _PGP_}
  if OpenDialogKeyring.Execute then
  begin
    F := TFileStream.Create(OpenDialogKeyring.Filename, fmOpenRead);
    try
      try
        FSecretRing.Load(F, nil, true);
      finally
        F.Free;
      end;
    except
      editSecretKeyring.Text := '';
      Exit;
    end;
    editSecretKeyring.Text := OpenDialogKeyring.Filename;
  end;
  {$ENDIF}
end;

procedure TMakerForm.btnCryptRemoveClick(Sender: TObject);
{$IFDEF _SMIME_}
var
  Index : integer;
{$ENDIF}
begin
  {$IFDEF _SMIME_}
  if (lvCryptCerts.Selected <> nil) and (lvCryptCerts.Selected.Data <> nil) then
  begin
    if MessageDlg('The selected certificated will be removed from list. Do you want to proceed?',
      mtWarning, [mbYes, mbNo], 0) = mrYes then
    begin
      Index := FEnryptCertStorage.IndexOf(lvCryptCerts.Selected.Data);
      if Index < 0 then
        MessageDlg('Internal error', mtError, [mbOk], 0)
      else
        FEnryptCertStorage.Remove(Index);
      Index := lvCryptCerts.Items.IndexOf(lvCryptCerts.Selected);
      if Index < 0 then
        MessageDlg('Internal error', mtError, [mbOk], 0)
      else
        lvCryptCerts.Items.Delete(Index);
    end;
  end;
  {$ENDIF}
end;

{$IFDEF _PGP_}
procedure TMakerForm.PGPMIMEKeyPassphrase(Sender: TObject; Key : TElPGPCustomSecretKey;
  var Passphrase: string; var Cancel: boolean);
begin
  Passphrase := InputBox('Password request',
    'Please enter password for key ' + KeyID2Str(Key.KeyID), '');
end;
{$ENDIF}

procedure TMakerForm.btnSignRemoveClick(Sender: TObject);
{$IFDEF _SMIME_}
var
  Index : integer;
{$ENDIF}
begin
  {$IFDEF _SMIME_}
  if (lvSignCerts.Selected <> nil) and (lvSignCerts.Selected.Data <> nil) then
  begin
    if MessageDlg('The selected certificated will be removed from list. Do you want to proceed?',
      mtWarning, [mbYes, mbNo], 0) = mrYes then
    begin
      Index := FSignCertStorage.IndexOf(lvSignCerts.Selected.Data);
      if Index < 0 then
        MessageDlg('Internal error', mtError, [mbOk], 0)
      else
        FSignCertStorage.Remove(Index);
      Index := lvSignCerts.Items.IndexOf(lvSignCerts.Selected);
      if Index < 0 then
        MessageDlg('Internal error', mtError, [mbOk], 0)
      else
        lvSignCerts.Items.Delete(Index);
    end;
  end;
  {$ENDIF}
end;

procedure TMakerForm.btnSignLoadClick(Sender: TObject);
{$IFDEF _SMIME_}
var
  ws: WideString;
  sPswd: AnsiString;
  sFrom: string;
  Cert : TElX509Certificate;
  Item: TListItem;
  Index: integer;

  function ConvertUTF8String(const Source: AnsiString): WideString;
  {$IFDEF DELPHI_NET}
  begin
    Result := System.Text.Encoding.UTF8.GetString(TBytes(Source));
  end;
  {$ELSE}
  var
    sDest: AnsiString;
    Conv: TPlConverter;
  begin
    sDest := '';
    if Length(Source) > 0 then
    begin
      Conv := TPlConverter.Create('utf-8', 'utf-16');
      Conv.Convert(Source, sDest, []);
      Result := AnsiStringToByteWideString(sDest);
      Conv.Free;
    end
    else
      Result := '';
  end;
  {$ENDIF}

  function GetOIDValue(NTS : TElRelativeDistinguishedName; S: BufferType): AnsiString;
  var SL : {$IFDEF DELPHI_NET}ArrayList{$ELSE}TStringList{$ENDIF};
  begin
    SL := {$IFDEF DELPHI_NET}ArrayList{$ELSE}TStringList{$ENDIF}.Create;
    try
      NTS.GetValuesByOID(S, SL);
      if SL.Count >= 1 then
        Result := AnsiString(BufferType(SL[0]))
      else
        SetLength(Result, 0);
    finally
      SL.Free;
    end;
  end;
{$ENDIF}
begin
  {$IFDEF _SMIME_}
  if ODC.Execute then
  begin
    ws:= InputBox('Certificate Password',
        'Please enter password if it is needed', #0 );
    if ws = #0 then
      sPswd := ''
    else
      sPswd := ws;
    if AddToStorageCertificateFromFile( FSignCertStorage,
        // FileName:
          ODC.FileName,
       // Password:
          sPswd
    ) then
    begin
      Cert := FSignCertStorage.Certificates[FSignCertStorage.Count-1];
      sFrom := // == certificate e-mail:
      ConvertUTF8String(
        GetOIDValue(
          Cert.SubjectRDN,
          SB_CERT_OID_EMAIL)
      );
      if sFrom = '' then
      begin
        Index := Cert.Extensions.SubjectAlternativeName.Content.FindNameByType(gnRFC822Name);
        if Index <> -1 then
          sFrom := Cert.Extensions.SubjectAlternativeName.Content.Names[Index].RFC822Name
        else
          MessageDlg('Warning: Certificate does not contain e-mail address.', mtWarning,
            [mbOk], 0);
      end;
      if (sFrom <> '') and Cert.PrivateKeyExists and (editFrom.Text <> '') then
      begin
        MessageDlg('Warning: Certificate e-mail address doesn''t correspond to From field.', mtWarning, [mbOk], 0);
      end
      else
      if (sFrom <> '') and Cert.PrivateKeyExists and (editFrom.Text = '') then
        editFrom.Text := sFrom;
      Item := lvSignCerts.Items.Add;
      if sFrom = '' then
        sFrom := Cert.SubjectName.CommonName;
      if sFrom = '' then
        sFrom := '<untitled>';
      Item.Caption := sFrom;
      Item.Data := Cert;
    end
    else
      MessageDlg('Error: Error loading certificate: "' + ODC.FileName + '"',
        mtError, [mbOk], 0);
  end;
  {$ENDIF}
end;


initialization
SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' + 
  'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' + 
  'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' + 
  '5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' + 
  'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' + 
  '8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' + 
  'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' + 
  'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');

end.

⌨️ 快捷键说明

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