pgpdialogs.pas

来自「用DELPHI实现的 PGP 加密算法」· PAS 代码 · 共 989 行 · 第 1/3 页

PAS
989
字号
{$J+,Z4}
unit PGPDialogs;

{------------------------------------------------------------------------------}
{                                                                              }
{                 This unit is partly based on Steve Heller's                  }
{         SPGP sources available from http://www.oz.net/~srheller/spgp/        }
{                                                                              }
{                Portions created by Michael in der Wiesche are                }
{              Copyright (C) 2001-2003 by Michael in der Wiesche               }
{                                                                              }
{------------------------------------------------------------------------------}

interface

uses
  Windows,
  Classes,
  SysUtils,
  KeyPropTypes,
  pgpBase,
  pgpErrors,
  pgpPubTypes,
  pgpUtilities,
  pgpOptionList,
  pgpMemoryMgr,
  pgpKeyServer,
  pgpGroups,
  pgpKeys,
  pgpTLS,
  pgpUI,
  pgpCL,
  KeyFuncs,
  PrefFuncs;

type
  TSignOption = (soEnc, soClear, soDetached);

{ "public" functions }
function PreferencesDialog(PrefsPage, WinHandle: Integer): Integer;
function SelectKeysDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
			  SingleKey: Longbool; PropertyFlags, FilterFlags, WinHandle: Integer): Integer;
function SendKeyToServerDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
			       KeyPropFlags, WinHandle: Integer): Integer;
function GetKeyFromServerDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
				KeyPropFlags, WinHandle: Integer): Integer;
function KeyImportDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
			 FromFile: Longbool; IgnoreKnownFlag: Integer; KeyPropFlags, WinHandle: Integer): Integer;
function KeyExportDialog(Prompt: String; const KeyIDs: TStrings; var KeyData: String; var KeyPropsList: TKeyPropsList;
			 ToFile, ExportCompatible, ExportPrivate: Longbool; KeyPropFlags, WinHandle: Integer): Integer;
function KeyRevokeDialog(const KeyHexID, PassPrompt: String; WinHandle: Integer): Integer;
function KeyPassChangeDialog(const KeyHexID, OldPrompt, NewPrompt: String;
			     MinPassLength, MinPassQuality, WinHandle: Integer): Integer;

{ "private" functions }
function SelectAddKeysToKeyRing(Context: pPGPContext; tlsContext: pPGPtlsContext;
				KeysToAdd: pPGPKeySet; KeySetMain: pPGPKeySet;
				var KeyPropsList: TKeyPropsList;
				const Prompt: String; SingleKey: Longbool;
				KeyPropFlags, WinHandle: Integer): PGPError;
function RecipientsDialog(Context: pPGPContext; AllKeys: pPGPKeySet;
			  AlwaysDisplayDialog: PGPBoolean; var Armor, EyesOnly, MIME, Textmode: PGPUInt32;
			  const DefaultKey: String; var RecipientKeys: Pointer;
			  const Prompt: String; WinHandle: Integer): PGPError;
function KeyServerDialog(Context: pPGPContext; tlsContext: pPGPtlsContext;
			 KeySetMain: pPGPKeySet; const KeyData: String;
			 var KeysFound: Pointer; WinHandle: Integer): PGPError;
function CollectRandomDataDialog(Context: pPGPContext; NeededEntropyBits: PGPUInt32; WinHandle: Integer): PGPError;
function ConvEncPassphraseDialog(Context: pPGPContext; var Passphrase: PChar;
				 const Prompt: String; WinHandle: Integer): PGPError;
function ConvDecPassphraseDialog(Context: pPGPContext; var Passphrase: PChar;
				 const Prompt: String; WinHandle: Integer): PGPError;
function KeyPassphraseDialog(Context: pPGPContext; KeySet: pPGPKeySet; var Passphrase: PChar;
			     const Prompt: String; WinHandle: Integer): PGPError;
function SigningPassphraseDialog(Context: pPGPContext; KeySetMain: pPGPKeySet;
				 var SigningKey: pPGPKey; var SignKeyPass: PChar;
				 const DefaultKeyID: String; FindMatchingKey: Longbool; SignOption: TSignOption;
				 var Armor, MIME, RipeMD: PGPUInt32; const Prompt: String; WinHandle: Integer): PGPError;
function DecryptionPassphraseDialog(Context: pPGPContext; RecipientKeys: pPGPKeySet;
				    KeyIDCount: PGPUInt32; const KeyIDList: pPGPKeyID7;
				    var DecryptionKey: pPGPKey; var DecryptKeyPass: PChar;
				    FindMatchingKey: Longbool; const Prompt: String; WinHandle: Integer): PGPError;
function ConfirmationPassphraseDialog(Context: pPGPContext; var Passphrase: PChar;
				      MinPassLength, MinPassQuality: Integer;
				      ShowPassphraseQuality: Longbool;
				      const Prompt: String; WinHandle: Integer): PGPError;

function KeyDlgInit(var Context: pPGPContext; var tlsContext: pPGPtlsContext; var KeySetMain: pPGPKeySet): Integer;
procedure KeyDlgFree(Context: pPGPContext; tlsContext: pPGPtlsContext; KeySetMain: pPGPKeySet);

implementation

function KeyDlgInit(var Context: pPGPContext; var tlsContext: pPGPtlsContext; var KeySetMain: pPGPKeySet): Integer;
begin
  tlsContext:=nil;
  Result:=KeyRings.InitKeyRings(Context, KeySetMain);
  if Result<>0 then Exit;
  Result:=PGPNewTLSContext(Context, tlsContext);
  if Result<>0 then begin
    PGPFreeContext(Context);
    Context:=nil;
    Exit;
  end;
  Result:=PGPclInitLibrary(Context, 0);
  if Result<>0 then begin
    PGPFreeTLSContext(tlsContext);
    PGPFreeContext(Context);
    tlsContext:=nil;
    Context:=nil;
  end;
end;

procedure KeyDlgFree(Context: pPGPContext; tlsContext: pPGPtlsContext; KeySetMain: pPGPKeySet);
begin
  PGPclCloseLibrary; 
  PGPFreeTLSContext(tlsContext);
  KeyRings.FreeKeyRings;
end;

function PreferencesDialog(PrefsPage, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  tlsContext	 : pPGPtlsContext;
  KeySetMain	 : pPGPKeySet;
begin
  Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
  if Result<>0 then Exit;
  try
    Result:=PGPclPreferences(Context, WinHandle, PrefsPage, KeySetMain);
    ProcessMessages;
  finally
    KeyDlgFree(Context, tlsContext, KeySetMain);
  end;
end;

function SelectKeysDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
			  SingleKey: Longbool; PropertyFlags, FilterFlags, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  tlsContext	 : pPGPtlsContext;
  KeySetMain	 : pPGPKeySet;
  KeyFilter	 : pPGPFilter;
  KeySetFiltered : pPGPKeySet;
  KeySetSelected : pPGPKeySet;
  KeyCount	 : PGPUInt32;
begin
  KeyFilter:=nil;
  KeySetFiltered:=nil;
  KeySetSelected:=nil;
  Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
  if Result<>0 then Exit;
  try
    if FilterFlags<>KeyFilterFlag_AllKeys then begin
      Result:=GetKeyFilter(Context, FilterFlags, KeyFilter);
      if Result<>0 then Exit;
      try
	Result:=PGPFilterKeySet(KeySetMain, KeyFilter, KeySetFiltered);
	if Result<>0 then Exit;
      finally
	PGPFreeFilter(KeyFilter);
      end;
    end
    else KeySetFiltered:=KeySetMain;
    try
      Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeySetFiltered,
			      KeySetMain, (ord(SingleKey) and 1)*PGPCL_SINGLESELECTION, KeySetSelected);
      ProcessMessages;
      if Result<>0 then Exit;
    finally
      if KeySetFiltered<>KeySetMain then PGPFreeKeySet(KeySetFiltered);
    end;
    try
      Result:=PGPCountKeys(KeySetSelected, KeyCount);
      if Result<>0 then Exit;
      if KeyCount<>0 then begin
	Result:=GetKeySetProps(Context, KeySetSelected, KeyPropsList, PropertyFlags,
			       KeyFilterFlag_AllKeys, UserID_Ordering);
	if Result>0 then Result:=0;
      end;
    finally
      PGPFreeKeySet(KeySetSelected);
    end;
  finally
    KeyDlgFree(Context, tlsContext, KeySetMain);
  end;
end;

function InitKeyServer(Context: pPGPContext; var ServerThreadStorage: pPGPKeyServerThreadStorage;
		       var KeyServerSpecList: pPGPKeyServerSpec; var KeyServerCount: PGPUInt32): PGPError;
var
  KeyServerEntry : pPGPKeyServerSpec;
  KeyServerList	 : TStringList;
  KeyServerIndex : Integer;
begin
  ServerThreadStorage:=nil;
  KeyServerSpecList:=nil;
  KeyServerCount:=0;
  KeyServerList:=nil;
  Result:=PGPKeyServerInit;
  if Result<>0 then Exit;
  Result:=PGPKeyServerCreateThreadStorage(ServerThreadStorage);
  if Result<>0 then Exit;
  try
    Result:=GetServerList(KeyServerList);
    if (Result=0) and (KeyServerList<>nil) then with KeyServerList do begin
      KeyServerSpecList:=AllocMem(SizeOf(TPGPKeyServerSpec)*Count);
      if KeyServerSpecList<>nil then begin
	KeyServerEntry:=KeyServerSpecList;
	for KeyServerIndex:=0 to pred(Count) do begin
	  Result:=PGPNewKeyServer(Context, kPGPKeyServerClass_PGP, KeyServerEntry.Server,
				  PGPONetURL(Context, PChar(Strings[KeyServerIndex])), PGPOLastOption(Context));
	  if Result<>0 then Exit;
	  inc(KeyServerCount);
	  inc(KeyServerEntry);
	end;
      end
      else Result:=kPGPError_OutOfMemory;
    end;
  finally
    KeyServerList.Free;
  end;
end;

procedure FreeKeyServer(ServerThreadStorage: pPGPKeyServerThreadStorage;
			KeyServerSpecList: pPGPKeyServerSpec; KeyServerCount: PGPUInt32);
var
  KeyServerEntry : pPGPKeyServerSpec;
begin
  KeyServerEntry:=KeyServerSpecList;
  try
    for KeyServerCount:=KeyServerCount downto 1 do begin
      PGPFreeKeyServer(KeyServerEntry.Server);
      inc(KeyServerEntry);
    end;
  finally
    if KeyServerSpecList<>nil then FreeMem(KeyServerSpecList);
    PGPKeyServerDisposeThreadStorage(ServerThreadStorage);
    PGPKeyServerCleanup;
  end;
end;

function SendKeyToServerDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
			       KeyPropFlags, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  tlsContext	 : pPGPtlsContext;
  KeySetMain	 : pPGPKeySet;
  KeySetToSend	 : pPGPKeySet;
  ThreadStorage	 : pPGPKeyServerThreadStorage;
  KeyServerSpecs : pPGPKeyServerSpec;
  KeyServerCount : PGPUInt32;
  KeySetFailed	 : pPGPKeySet;
begin
  KeySetToSend:=nil;
  KeySetFailed:=nil;
  Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
  if Result<>0 then Exit;
  try
    Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeySetMain, KeySetMain, 0, KeySetToSend);
    ProcessMessages;
    if Result<>0 then Exit;
    try
      Result:=InitKeyServer(Context, ThreadStorage, KeyServerSpecs, KeyServerCount);
      if Result<>0 then Exit;
      Result:=PGPSendToKeyServerDialog(Context, KeyServerSpecs^, tlsContext, KeySetToSend, KeySetFailed,
				       PGPOUIParentWindowHandle(Context, WinHandle), PGPOLastOption(Context));
      Sleep(100); // trying to prevent a strange cancel crash
      ProcessMessages;
      if (KeySetFailed<>nil) and (KeySetToSend<>nil) then PGPRemoveKeys(KeySetFailed, KeySetToSend);
      GetKeySetProps(Context, KeySetToSend, KeyPropsList, KeyPropFlags, KeyFilterFlag_AllKeys, UserID_Ordering);
    finally
      PGPFreeKeySet(KeySetFailed);
      PGPFreeKeySet(KeySetToSend);
      FreeKeyServer(ThreadStorage, KeyServerSpecs, KeyServerCount);
    end;
  finally
    KeyDlgFree(Context, tlsContext, KeySetMain);
  end;
end;

function GetKeyFromServerDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
				KeyPropFlags, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  tlsContext	 : pPGPtlsContext;
  KeySetMain	 : pPGPKeySet;
  KeyFilter	 : pPGPFilter;
  ThreadStorage	 : pPGPKeyServerThreadStorage;
  KeyServerSpecs : pPGPKeyServerSpec;
  KeyServerCount : PGPUInt32;
  OptionList	 : pPGPOptionList;
  KeysFound	 : Pointer;
begin
  KeyFilter:=nil;
  OptionList:=nil;
  KeysFound:=nil;
  Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
  if Result<>0 then Exit;
  try
    Result:=GetKeyFilterByAnyID(Context, KeyData, true, KeyFilter);
    if Result<>0 then Exit;
    try
      Result:=InitKeyServer(Context, ThreadStorage, KeyServerSpecs, KeyServerCount);
      if Result<>0 then Exit;
      Result:=PGPBuildOptionList(Context, OptionList,
	[
	  PGPOKeyServerSearchFilter(Context, KeyFilter),
	  PGPOUIParentWindowHandle(Context, WinHandle)
	]);
      try
	Result:=PGPSearchKeyServerDialog(Context, KeyServerCount, KeyServerSpecs, tlsContext, PGPFalse,
					 KeysFound, OptionList, PGPOLastOption(Context));
	Sleep(100); // trying to prevent a strange cancel crash
	ProcessMessages;
      finally
	PGPFreeOptionList(OptionList);
      end;
      if Result<>0 then Exit;
      if PGP7X then begin
	try
	  Result:=SelectAddKeysToKeyRing(Context, tlsContext, PGPPeekKeyDBRootKeySet(pPGPKeyDB(KeysFound)),
					 KeySetMain, KeyPropsList, Prompt, false, KeyPropFlags, WinHandle);
	finally
	  PGPFreeKeyDB(pPGPKeyDB(KeysFound));
	end;
      end
      else begin
	try
	  Result:=SelectAddKeysToKeyRing(Context, tlsContext, pPGPKeySet(KeysFound),
					 KeySetMain, KeyPropsList, Prompt, false, KeyPropFlags, WinHandle);

⌨️ 快捷键说明

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