📄 pgpdialogs.cpp
字号:
if( IsntPGPError( err ) )
{
if( numSearchOptions == 0 )
{
pgpDebugMsg( "No key server subjects found" );
err = kPGPError_BadParams;
}
else
{
pgpAssert( PGPFilterRefIsValid( filter ) );
mFilter = filter;
if( numSearchOptions == 1 && keyDescription[0] != 0 )
strcpy( mKeyDescription, keyDescription );
}
}
else
{
if( PGPFilterRefIsValid( filter ) )
PGPFreeFilter( filter );
}
}
return( err );
}
CPGPSendToKeyServerDialogOptions::CPGPSendToKeyServerDialogOptions(void)
{
mKeysToSend = kInvalidPGPKeySetRef;
mFailedKeys = NULL;
}
CPGPSendToKeyServerDialogOptions::~CPGPSendToKeyServerDialogOptions(void)
{
}
CPGPPassphraseDialogOptions::CPGPPassphraseDialogOptions(void)
{
mPassphrasePtr = NULL;
mDialogOptions = kInvalidPGPOptionListRef;
mMinPassphraseLength = 0;
mMinPassphraseQuality = 0;
mDialogTimeout = 0;
}
CPGPPassphraseDialogOptions::~CPGPPassphraseDialogOptions(void)
{
}
PGPError
CPGPPassphraseDialogOptions::GatherOptions(
PGPContextRef context,
PGPOptionListRef optionList)
{
PGPError err = kPGPError_NoErr;
PGPValidateContext( context );
PGPValidateParam( pgpOptionListIsValid( optionList ) );
err = CPGPDialogOptions::GatherOptions( context, optionList );
if( IsntPGPError( err ) )
{
err = pgpFindOptionArgs( optionList,
kPGPOptionType_OutputPassphrase, TRUE,
"%p", &mPassphrasePtr );
}
if( IsntPGPError( err ) )
{
PGPOption optionData;
err = pgpSearchOptionSingle( optionList,
kPGPOptionType_DialogOptions, &optionData );
if( IsntPGPError( err ) &&
optionData.type == kPGPOptionType_DialogOptions &&
PGPOptionListRefIsValid( optionData.subOptions ) )
{
mDialogOptions = optionData.subOptions;
}
}
if( IsntPGPError( err ) )
{
err = pgpFindOptionArgs( optionList,
kPGPOptionType_MinPassphraseLength, FALSE,
"%d", &mMinPassphraseLength );
}
if( IsntPGPError( err ) )
{
err = pgpFindOptionArgs( optionList,
kPGPOptionType_MinPassphraseQuality, FALSE,
"%d", &mMinPassphraseQuality );
}
if( IsntPGPError( err ) )
{
err = pgpFindOptionArgs( optionList,
kPGPOptionType_DialogTimeout, FALSE,
"%d", &mDialogTimeout );
}
return( err );
}
CPGPConfirmationPassphraseDialogOptions::
CPGPConfirmationPassphraseDialogOptions(void)
{
mShowPassphraseQuality = TRUE;
}
CPGPConfirmationPassphraseDialogOptions::
~CPGPConfirmationPassphraseDialogOptions(void)
{
}
PGPError
CPGPConfirmationPassphraseDialogOptions::GatherOptions(
PGPContextRef context,
PGPOptionListRef optionList)
{
PGPError err;
PGPValidateContext( context );
PGPValidateParam( pgpOptionListIsValid( optionList ) );
err = CPGPPassphraseDialogOptions::GatherOptions( context, optionList );
if( IsntPGPError( err ) )
{
PGPBoolean haveOption;
PGPUInt32 showPassphraseQuality;
err = pgpFindOptionArgs( optionList,
kPGPOptionType_ShowPassphraseQuality, FALSE,
"%b%d", &haveOption, &showPassphraseQuality );
if( haveOption )
{
mShowPassphraseQuality = ( showPassphraseQuality != 0 );
}
}
return( err );
}
CPGPKeyPassphraseDialogOptions::CPGPKeyPassphraseDialogOptions(void)
{
mVerifyPassphrase = TRUE;
mDefaultKey = kInvalidPGPKeyDBObjRef;
mCache = FALSE;
mCacheGlobal = TRUE;
mCacheTimeout = 0;
}
CPGPKeyPassphraseDialogOptions::~CPGPKeyPassphraseDialogOptions(void)
{
}
PGPError
CPGPKeyPassphraseDialogOptions::GatherOptions(
PGPContextRef context,
PGPOptionListRef optionList)
{
PGPError err;
PGPBoolean haveOption;
PGPValidateContext( context );
PGPValidateParam( pgpOptionListIsValid( optionList ) );
err = CPGPPassphraseDialogOptions::GatherOptions( context, optionList );
if( IsntPGPError( err ) )
{
PGPUInt32 verifyPassphrase;
err = pgpFindOptionArgs( optionList,
kPGPOptionType_VerifyPassphrase, FALSE,
"%b%d", &haveOption, &verifyPassphrase );
if( haveOption )
{
mVerifyPassphrase = ( verifyPassphrase != 0 );
}
}
if( IsntPGPError( err ) )
{
err = pgpFindOptionArgs( optionList,
kPGPOptionType_CachePassphrase, FALSE,
"%b%d%b", &haveOption, &mCacheTimeout, &mCacheGlobal );
if( haveOption )
{
mCache = TRUE;
}
}
return( err );
}
CPGPKeySetPassphraseDialogOptions::CPGPKeySetPassphraseDialogOptions(void)
{
mFindMatchingKey = TRUE;
mKeySet = kInvalidPGPKeySetRef;
mPassphraseKeyPtr = NULL;
}
CPGPKeySetPassphraseDialogOptions::~CPGPKeySetPassphraseDialogOptions(void)
{
}
PGPError
CPGPKeySetPassphraseDialogOptions::GatherOptions(
PGPContextRef context,
PGPOptionListRef optionList)
{
PGPError err;
PGPValidateContext( context );
PGPValidateParam( pgpOptionListIsValid( optionList ) );
err = CPGPKeyPassphraseDialogOptions::GatherOptions(context, optionList);
if( IsntPGPError( err ) )
{
PGPBoolean haveOption;
PGPUInt32 findMatchingKey;
err = pgpFindOptionArgs( optionList,
kPGPOptionType_FindMatchingKey, FALSE,
"%b%d", &haveOption, &findMatchingKey );
if( haveOption )
{
mFindMatchingKey = ( findMatchingKey != 0 );
}
}
return( err );
}
CPGPSigningPassphraseDialogOptions::CPGPSigningPassphraseDialogOptions(void)
{
}
CPGPSigningPassphraseDialogOptions::~CPGPSigningPassphraseDialogOptions(void)
{
}
CPGPDecryptionPassphraseDialogOptions::
CPGPDecryptionPassphraseDialogOptions(void)
{
mMissingKeyIDList = NULL;
mMissingKeyIDCount = 0;
}
CPGPDecryptionPassphraseDialogOptions::
~CPGPDecryptionPassphraseDialogOptions(void)
{
if( IsntNull( mMissingKeyIDList ) )
PGPFreeData( mMissingKeyIDList );
}
PGPError
CPGPDecryptionPassphraseDialogOptions::RemoveFoundKeys(PGPKeySetRef keySet)
{
PGPInt32 keyIDIndex;
PGPError err = kPGPError_NoErr;
PGPKeyDBRef keyDB = PGPPeekKeySetKeyDB( keySet );
for( keyIDIndex = mMissingKeyIDCount - 1; keyIDIndex >= 0; keyIDIndex-- )
{
PGPKeyDBObjRef keyObj;
if( IsntPGPError( PGPFindKeyByKeyID( keyDB,
&mMissingKeyIDList[keyIDIndex], &keyObj ) ) &&
PGPKeySetIsMember( keyObj, keySet ) )
{
PGPUInt32 keysToMove;
keysToMove = mMissingKeyIDCount - keyIDIndex - 1;
if( keysToMove != 0 )
{
pgpCopyMemory( &mMissingKeyIDList[keyIDIndex + 1],
&mMissingKeyIDList[keyIDIndex],
keysToMove * sizeof( mMissingKeyIDList[0] ) );
}
--mMissingKeyIDCount;
}
}
return( err );
}
PGPError
CPGPDecryptionPassphraseDialogOptions::GatherMissingKeys()
{
PGPError err = kPGPError_NoErr;
if( IsntNull( mMissingKeyIDList ) )
{
PGPFreeData( mMissingKeyIDList );
mMissingKeyIDList = NULL;
mMissingKeyIDCount = 0;
}
if( IsntNull( mKeyIDList ) && mKeyIDCount != 0 )
{
PGPSize dataSize = mKeyIDCount * sizeof( mKeyIDList[0] );
/* Assume all keys are missing. Make a copy of the key ID list */
mMissingKeyIDList = (PGPKeyID *) PGPNewData(
PGPPeekContextMemoryMgr( mContext ),
dataSize, kPGPMemoryMgrFlags_Clear );
if( IsntNull( mMissingKeyIDList ) )
{
pgpCopyMemory( mKeyIDList, mMissingKeyIDList, dataSize );
mMissingKeyIDCount = mKeyIDCount;
err = RemoveFoundKeys( mKeySet );
if( IsntPGPError( err ) &&
IsntNull( mNewKeys ) &&
PGPKeyDBRefIsValid( *mNewKeys ) )
{
PGPKeySetRef keySet;
err = PGPNewKeySet( *mNewKeys, &keySet );
if( IsntPGPError( err ) )
{
err = RemoveFoundKeys( keySet );
PGPFreeKeySet( keySet );
}
}
if( IsPGPError( err ) || mMissingKeyIDCount == 0 )
{
PGPFreeData( mMissingKeyIDList );
mMissingKeyIDList = NULL;
mMissingKeyIDCount = 0;
}
}
else
{
err = kPGPError_OutOfMemory;
}
}
return( err );
}
PGPError
CPGPDecryptionPassphraseDialogOptions::SearchForMissingKeys(
void *hwndParent,
PGPBoolean *foundNewKeys)
{
PGPError err = kPGPError_NoErr;
(void) hwndParent;
pgpAssert( IsntNull( foundNewKeys ) );
*foundNewKeys = FALSE;
if( IsntNull( mServerList ) &&
IsntNull( mMissingKeyIDList ) &&
IsntNull( mNewKeys ) )
{
pgpAssert( ! PGPKeyDBRefIsValid( *mNewKeys ) );
err = PGPNewKeyDB( mContext, mNewKeys );
if( IsntPGPError( err ) )
{
PGPUInt32 serverIndex;
PGPUInt32 numNewKeys = 0;
for( serverIndex = 0; serverIndex < mServerCount; serverIndex++ )
{
if( IsntNull( mMissingKeyIDList ) )
{
PGPKeyServerProtocol serverProtocol;
const PGPKeyServerSpec *serverSpec;
serverSpec = &mServerList[serverIndex];
err = PGPGetKeyServerProtocol( serverSpec->server,
&serverProtocol );
if( IsntPGPError( err ) &&
serverProtocol != kPGPKeyServerProtocol_HTTP &&
serverProtocol != kPGPKeyServerProtocol_HTTPS )
{
PGPFilterRef filter = kInvalidPGPFilterRef;
PGPUInt32 keyIndex;
for( keyIndex = 0; keyIndex < mMissingKeyIDCount;
keyIndex++ )
{
PGPFilterRef curFilter;
err = PGPNewKeyDBObjDataFilter( mContext,
kPGPSubKeyProperty_KeyID,
&mMissingKeyIDList[keyIndex],
sizeof( mMissingKeyIDList[keyIndex] ),
kPGPMatchCriterion_Equal,
&curFilter );
if( IsntPGPError( err ) )
{
if( PGPFilterRefIsValid( filter ) )
{
PGPFilterRef newFilter;
err = PGPUnionFilters( curFilter, filter,
&newFilter );
if( IsntPGPError( err ) )
{
filter = newFilter;
}
}
else
{
filter = curFilter;
}
}
if( IsPGPError( err ) )
break;
}
if( IsntPGPError( err ) )
{
PGPKeyDBRef foundKeys = kInvalidPGPKeyDBRef;
err = PGPSearchKeyServerDialog( mContext, 1,
serverSpec, mTLSContext, TRUE, &foundKeys,
PGPOUIKeyServerSearchFilter( mContext,
filter ),
#if PGP_WIN32
PGPOUIParentWindowHandle( mContext,
(HWND) hwndParent),
#endif
PGPOLastOption( mContext ) );
if( IsntPGPError( err ) &&
PGPKeyDBRefIsValid( foundKeys ) )
{
PGPKeySetRef foundKeySet;
err = PGPNewKeySet( foundKeys, &foundKeySet );
if( IsntPGPError( err ) )
{
err = PGPCopyKeys( foundKeySet, *mNewKeys, NULL );
if( IsntPGPError( err ) )
{
err = GatherMissingKeys();
}
PGPFreeKeySet( foundKeySet );
}
PGPFreeKeyDB( foundKeys );
}
}
if( PGPFilterRefIsValid( filter ) )
PGPFreeFilter( filter );
}
}
if( IsPGPError( err ) )
break;
}
(void) PGPCountKeysInKeyDB( *mNewKeys, &numNewKeys );
if( numNewKeys != 0 )
{
*foundNewKeys = TRUE;
}
else
{
PGPFreeKeyDB( *mNewKeys );
*mNewKeys = kInvalidPGPKeyDBRef;
}
}
}
return( err );
}
CPGPOptionsDialogOptions::CPGPOptionsDialogOptions(void)
{
}
CPGPOptionsDialogOptions::~CPGPOptionsDialogOptions(void)
{
}
static const PGPOptionType sPassphraseOptionSet[] =
{
kCommonAllowedPassphraseOptions
};
static PGPError
pgpPassphraseDialog(
PGPContextRef context,
PGPOptionListRef optionList)
{
PGPError err;
pgpAssert( pgpContextIsValid( context ) );
pgpAssert( pgpOptionListIsValid( optionList ) );
err = pgpGetOptionListError( optionList );
if( IsntPGPError( err ) )
{
err = pgpCheckOptionsInSet( optionList, sPassphraseOptionSet,
elemsof( sPassphraseOptionSet ) );
if( IsntPGPError( err ) )
{
CPGPPassphraseDialogOptions options;
err = options.GatherOptions( context, optionList );
if( IsntPGPError( err ) )
{
err = pgpPassphraseDialogPlatform( context, &options );
}
}
}
return( err );
}
PGPError
PGPPassphraseDialog(
PGPContextRef context,
PGPOptionListRef firstOption,
...)
{
PGPError err = kPGPError_NoErr;
va_list args;
pgpAssert( pgpContextIsValid( context ) );
if( pgpContextIsValid( context ) )
{
PGPOptionListRef optionList;
va_start( args, firstOption );
optionList = pgpBuildOptionListArgs(context, FALSE, firstOption, args);
va_end( args );
err = pgpPassphraseDialog( context, optionList );
PGPFreeOptionList( optionList );
}
else
{
va_start( args, firstOption );
pgpFreeVarArgOptionList( firstOption, args );
va_end( args );
err = kPGPError_BadParams;
}
return( err );
}
PGPError
PGPConventionalDecryptionPassphraseDialog(
PGPContextRef context,
PGPOptionListRef firstOption,
...)
{
PGPError err = kPGPError_NoErr;
va_list args;
pgpAssert( pgpContextIsValid( context ) );
if( pgpContextIsValid( context ) )
{
PGPOptionListRef optionList;
va_start( args, firstOption );
optionList = pgpBuildOptionListArgs(context, FALSE, firstOption, args);
va_end( args );
err = pgpPassphraseDialog( context, optionList );
PGPFreeOptionList( optionList );
}
else
{
va_start( args, firstOption );
pgpFreeVarArgOptionList( firstOption, args );
va_end( args );
err = kPGPError_BadParams;
}
return( err );
}
static const PGPOptionType sOptionsOptionSet[] =
{
kCommonAllowedOptions,
kPGPOptionType_DialogPrompt,
kPGPOptionType_Checkbox,
kPGPOptionType_PopupList
};
static PGPError
pgpOptionsDialog(
PGPContextRef context,
PGPOptionListRef optionList)
{
PGPError err;
pgpAssert( pgpContextIsValid( context ) );
pgpAssert( pgpOptionListIsValid( optionList ) );
err = pgpGetOptionListError( optionList );
if( IsntPGPError( err ) )
{
err = pgpCheckOptionsInSet( optionList, sOptionsOptionSet,
elemsof( sOptionsOptionSet ) );
if( IsntPGPError( err ) )
{
CPGPOptionsDialogOptions options;
err = options.GatherOptions( context, optionList );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -