clrecip.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 970 行 · 第 1/2 页

C
970
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	CLrecip.c - Glue code to allow clients to access
	            recipient dialog in PGPsdkUI

	$Id: CLrecip.c,v 1.26 2002/10/31 04:13:35 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

#include "PGPclx.h"
#include "pgpUserInterface.h"
extern HINSTANCE g_hInst;

#define SDKUITEST 0


/*
old RECIPIENTDIALOGSTRUCT for reference

typedef struct _recipientdialogstruct
{
	DWORD			Version;
	HWND			hwndParent;
	char *			szTitle;
	PGPContextRef	Context;
	PGPKeySetRef 	OriginalKeySetRef;
	PGPKeySetRef 	SelectedKeySetRef;
	char **			szRecipientArray;
	DWORD			dwNumRecipients;
	DWORD			dwOptions;
	DWORD			dwFlags;
	DWORD			dwDisableFlags;
} RECIPIENTDIALOGSTRUCT, *PRECIPIENTDIALOGSTRUCT;
*/

BOOL DefaultKeyCheck(HWND hwnd,
				PGPKeyDBObjRef DefaultKey,
				PGPKeyDBRef SelectedKeyDB)
{
    PGPKeyDBObjRef key;
	PGPError err;

	// We don't even know their default key!
	if(!PGPKeyDBObjRefIsValid(DefaultKey))
		return FALSE;

	err=PGPclGetDefaultPrivateKey(SelectedKeyDB,&key);

	if(IsPGPError(err))
		return FALSE;

	return TRUE;
}

BOOL RSACheck(HWND hwnd,
			   PGPKeyDBRef SelectedKeyDB)
{
	PGPKeySetRef SelectedKeySet;
    PGPKeyIterRef iter;
    PGPKeyDBObjRef key;
	PGPBoolean FoundRSAKey;
	PGPInt32 algorithm;

  	PGPNewKeySet( SelectedKeyDB, &SelectedKeySet );
	PGPNewKeyIterFromKeySet (SelectedKeySet, &iter);

	FoundRSAKey=FALSE;

    while (IsntPGPError(PGPKeyIterNextKeyDBObj(
							iter,
							kPGPKeyDBObjType_Key,
							&key)))
    {
		PGPGetKeyDBObjNumericProperty( key, 
			kPGPKeyProperty_AlgorithmID, &algorithm );
		if(algorithm == kPGPPublicKeyAlgorithm_RSA)
			FoundRSAKey=TRUE;
	}

	PGPFreeKeyIter(iter);
	PGPFreeKeySet(SelectedKeySet);

	return FoundRSAKey;

	return FALSE;
}
/*
BOOL CorpCheck(HWND hwnd,
			   PGPKeyDBRef MainKeyDB,
			   PGPKeyDBRef SelectedKeyDB,
			   PGPKeyDBObjRef CorpKey)
{
    PGPKeyDBObjRef userID;
	PGPKeySetRef SelectedKeySet;
    PGPKeyIterRef iter;
    PGPKeyDBObjRef key;
	char UserIDStr[kPGPMaxUserIDSize+1];
	int len;
	PGPBoolean SignedByCorp;
	PGPError err;
  	PGPKeyDBObjRef sig;
	PGPKeyDBObjRef certifierKey;

	PGPNewKeySet( SelectedKeyDB, &SelectedKeySet );
	PGPNewKeyIterFromKeySet (SelectedKeySet, &iter);

    while (IsntPGPError(PGPKeyIterNextKeyDBObj(
								iter,
								kPGPKeyDBObjType_Key,
								&key)))
    {
		SignedByCorp=FALSE;

        while (IsntPGPError(PGPKeyIterNextKeyDBObj(
								iter,
								kPGPKeyDBObjType_UserID,
								&userID)))
        {
			while(IsntPGPError(PGPKeyIterNextKeyDBObj(
								iter,
								kPGPKeyDBObjType_Signature,
								&sig)))
			{
				err = PGPGetSigCertifierKey(
					sig, MainKeyDB, &certifierKey);

				if(IsntPGPError(err))
				{
					if(certifierKey == CorpKey)
						SignedByCorp=TRUE;
				}
			}
		}

		if(!SignedByCorp)
		{
			UINT msgrst;
			char StrRes[500];

			err = PGPGetPrimaryUserIDName (key,
					UserIDStr, kPGPMaxUserIDSize, &len); 

			LoadString (g_hInst, IDS_KEYNOTSIGNEDBYCORP,
											StrRes, sizeof(StrRes));

			msgrst=MessageBox(hwnd,StrRes,UserIDStr,
				MB_YESNO|MB_ICONEXCLAMATION|MB_SETFOREGROUND);

			if(msgrst==IDNO)
			{
				PGPFreeKeyIter(iter);
				PGPFreeKeySet(SelectedKeySet);

				return FALSE;
			}
		}
	}

	PGPFreeKeyIter(iter);
	PGPFreeKeySet(SelectedKeySet);

	return TRUE;
}
*/
BOOL InvalidCheck(HWND hwnd,
			   PGPKeyDBRef MainKeyDB,
			   PGPKeyDBRef SelectedKeyDB)
{
	PGPKeySetRef SelectedKeySet;
    PGPKeyIterRef iter;
    PGPKeyDBObjRef key;
	PGPBoolean bAllValid;
	PGPBoolean bAxiomatic;
	DWORD Validity;

	bAllValid=TRUE;

	PGPNewKeySet( SelectedKeyDB, &SelectedKeySet );
	PGPNewKeyIterFromKeySet (SelectedKeySet, &iter);

    while (IsntPGPError(PGPKeyIterNextKeyDBObj(
								iter,
								kPGPKeyDBObjType_Key,
								&key)))
    {
		PGPGetKeyDBObjNumericProperty(key,
			kPGPKeyProperty_Validity,
			&Validity);
	    PGPGetKeyDBObjBooleanProperty (key, 
			kPGPKeyProperty_IsAxiomatic, 
			&bAxiomatic);

		if(bAxiomatic)
		{
			// Implicit Trust
		}
		else switch(Validity)
		{
			case kPGPValidity_Marginal :
			{
				// Marginal Key
				break;
			}
			case kPGPValidity_Complete :
			{
				// Valid Key;
				break;
			}
			default :
			{
				// Invalid Key
				bAllValid=FALSE;
				break;
			}
		}  
	}

	PGPFreeKeyIter(iter);
	PGPFreeKeySet(SelectedKeySet);

	return bAllValid;
}

typedef struct
{
	// Admins Prefs
	PGPBoolean allowConvEncrypt;
	PGPBoolean WarnNotCorpSigned;
	PGPBoolean haveOutgoingADK;
	PGPBoolean enforceOutgoingADK;
	PGPBoolean enforceRemoteADKClass;
	PGPBoolean allowInvalidEncrypt;
//	PGPKeyDBObjRef corpKey;
	PGPKeyDBObjRef outgoingADK;

	// Client Prefs
	PGPBoolean bWarnOnADK;
	PGPBoolean showMarginalValidity;
	PGPBoolean marginalIsInvalid;
	PGPBoolean encryptToSelf;
	PGPBoolean synchUnknown;
	PGPKeyDBObjRef defaultKey;

	// KeyServer (Client) Prefs
	PGPKeyServerEntry *ksEntries;
	PGPUInt32 numKSEntries;
	PGPKeyServerSpec *serverList;
	PCLIENTSERVERSTRUCT	pcss;
	PGPBoolean bKeyserversInited;
} APREF;

void NoDefaultKey(HWND hwnd)
{
	PGPclMessageBox(hwnd,IDS_CAPTIONALERT,IDS_NOVALIDDEFAULTKEY,
		MB_OK|MB_ICONEXCLAMATION);
}

void NoOutADKKey(HWND hwnd)
{
	PGPclMessageBox(hwnd,IDS_CAPTIONERROR,IDS_NOOUTADK,
		MB_OK|MB_ICONSTOP);
}


void EncryptingToInvalidKeys(HWND hwnd)
{
	PGPclMessageBox(hwnd,IDS_CAPTIONERROR,IDS_ENCRYPTINVALID,
		MB_OK|MB_ICONSTOP);
}

/*
void NoCorpKey(HWND hwnd)
{
	PGPclMessageBox(hwnd,IDS_CAPTIONERROR,IDS_NOCORPSIGNKEY,
		MB_OK|MB_ICONSTOP);
}
*/
PGPError GrabRecipClientPrefs(HWND hwndParent,
							  PGPContextRef context,
							  PGPKeyDBRef keydb,
							  APREF *apref)
{
	PGPError		err;
	PGPPrefRef		prefRef;

	err=CLInitKeyServerPrefs(
		kPGPclAllServers,NULL,
		hwndParent,
		context,
		keydb,
		"",
		&(apref->pcss),
		&(apref->ksEntries),
		&(apref->serverList),
		&(apref->numKSEntries));

	if(IsntPGPError(err))
	{
		apref->bKeyserversInited=TRUE;
	}

	err = PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	if (IsntPGPError (err))
	{
		PGPGetPrefBoolean(prefRef, kPGPPrefWarnOnADK,
				&(apref->bWarnOnADK));
		PGPGetPrefBoolean(prefRef, kPGPPrefDisplayMarginalValidity,
				&(apref->showMarginalValidity));
		PGPGetPrefBoolean(prefRef, kPGPPrefMarginalIsInvalid,
				&(apref->marginalIsInvalid));
		PGPGetPrefBoolean(prefRef, kPGPPrefEncryptToSelf,
				&(apref->encryptToSelf));
		PGPGetPrefBoolean(prefRef, kPGPPrefKeyServerSyncUnknownKeys,
				&(apref->synchUnknown));

		if(IsntPGPError(err))
		{

			err=PGPclGetDefaultPrivateKey(keydb,&(apref->defaultKey));

			if(IsPGPError(err))
			{
				// Warning message here
				apref->defaultKey=NULL;
				err=kPGPError_NoErr;
			}
		}
	}

	return err;
}

PGPError GrabRecipAdminPrefs(HWND hwndParent,
							 PGPContextRef context,
							 PGPKeyDBRef keydb,
							 APREF *apref)
{
	PGPKeyID	*adKeyID;
	PGPSize		adKeyIDSize;
//	PGPKeyID	*corpKeyID;
//	PGPSize		corpKeyIDSize;
	PGPError	err;
	PGPPrefRef	prefRef;

	err = PGPclPeekClientLibPrefRefs(&prefRef,NULL);
	if (IsPGPError (err))
		return err;

	// Allow Conventional
	PGPGetPrefBoolean(prefRef,
		kPGPPrefAllowConventionalEncryption,
		&(apref->allowConvEncrypt));

	// Warn if recipient not signed by corp key
/*	PGPGetPrefBoolean(prefRef,
		kPGPPrefWarnNotCertByCorp,
		&(apref->WarnNotCorpSigned));*/

	// Use an outgoing ADK
	PGPGetPrefBoolean(prefRef,
		kPGPPrefUseOutgoingADK,
		&(apref->haveOutgoingADK));

	// Enforce this outgoing ADK
	PGPGetPrefBoolean(prefRef,
		kPGPPrefEnforceOutgoingADK,
		&(apref->enforceOutgoingADK));

	// Enforce remote ADKs
	PGPGetPrefBoolean(prefRef,
		kPGPPrefEnforceRemoteADKClass,
		&(apref->enforceRemoteADKClass));

	// Allow encryption to invalid keys
	PGPGetPrefBoolean(prefRef,
		kPGPPrefAllowEncryptInvalidKeys,
		&(apref->allowInvalidEncrypt));

	// Get corp key ref
/*	PGPGetPrefData(prefRef,
		kPGPPrefCorpKeyID,
		&corpKeyIDSize,
		&corpKeyID);*/

	// Get outgoing adk key
	PGPGetPrefData(prefRef,
		kPGPPrefOutgoingADKID,
		&adKeyIDSize, &adKeyID );

	if((apref->haveOutgoingADK)&&(IsntPGPError(err)))
	{
		err=PGPFindKeyByKeyID(
			keydb,
			adKeyID,
			&(apref->outgoingADK));

		if(IsPGPError(err))
		{
			// Warning message here
			apref->outgoingADK=NULL;
			err=kPGPError_NoErr;
		}
	}

	if(adKeyID)
		PGPFreeData(adKeyID);
/*
	if((apref->WarnNotCorpSigned)&&(IsntPGPError(err)))
	{
		err=PGPFindKeyByKeyID(
			keydb,
			corpKeyID,
			&(apref->corpKey));

		if(IsPGPError(err))
		{
			// Warning message here
			apref->corpKey=NULL;
			err=kPGPError_NoErr;
		}
	}

	if(corpKeyID)
		PGPFreeData(corpKeyID);*/

	return err;
}

UINT PGPclExport PGPclRecipientDialog(PPGPclRecipientDialogStruct prds)
{
	PGPOptionListRef			rdoptionList;
	PGPOptionListRef			ksupoptionList;
	PGPOptionListRef			optionList;
	PGPUInt32					conventionalEncrypt,
								textOutput,
								wipeOriginal,
								fyeo,
								sda,
								inputIsText;
	PGPBoolean					haveFileOptions;
	PGPclGroupFile				*pGroup;
	PGPKeyDBRef					foundKeys;
	PGPUInt32					numKeys;
	APREF						apref;
	PGPUInt32					arrEnforcement;
	PGPError					err;
	char						StrRes1[100],StrRes2[300],StrRes3[100];
	DWORD						dwDisableFlags;

	dwDisableFlags=prds->dwDisableFlags;

	memset(&apref,0x00,sizeof(APREF));
	apref.allowConvEncrypt = TRUE;

	pGroup=NULL;
	err=kPGPError_NoErr;
	foundKeys=NULL;
	rdoptionList = kInvalidPGPOptionListRef;
	optionList = kInvalidPGPOptionListRef;
	ksupoptionList = kInvalidPGPOptionListRef;
	haveFileOptions=FALSE;
	arrEnforcement = kPGPARREnforcement_Warn;
	inputIsText=textOutput=conventionalEncrypt=wipeOriginal=fyeo=sda=0;

	// Create Null Option List for recipient dialog
	err = PGPBuildOptionList( prds->context, &rdoptionList,
		PGPOLastOption( prds->context ) );

// ******************BUSINESS SECURITY***********************
	if(PGPlnEnterprise())
	{
		if(IsntPGPError(err))
		{
			err=GrabRecipAdminPrefs(prds->hwndParent,
						prds->context,
						prds->keydbOriginal,
						&apref);
		}

		if(IsntPGPError(err))
		{
			arrEnforcement = kPGPARREnforcement_Warn;

⌨️ 快捷键说明

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