⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkmsgprc.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*____________________________________________________________________________
	Copyright (C) 1998 Network Associates, Inc.
	All rights reserved.
	
	PKMsgPrc - main message processing and associated routines
	

	$Id: PKMsgPrc.c,v 1.182 1999/05/03 22:17:00 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"	/* or pgpConfig.h in the CDK */

// project header files
#include "pgpkeysx.h"
#include "search.h"
#include "PGPpk.h"
#include "pgpImage.h"

// pgp header files
#include "pgpKeyserverPrefs.h" 
#include "pgpSDKPrefs.h"

// system header files
#include <zmouse.h>

// constant defitions
#define RELOADDELAY		 200L		//delay to allow clearing of window
#define RELOADTIMERID	1112L		//

#define WRITELOCKTRIES	3			//num times to try keyring when locked
#define WRITELOCKDELAY	1500L		//ms delay when keyring is writelocked

#define LEDTIMER		111L
#define LEDTIMERPERIOD	100L

#define NUMLEDS 10
#define LEDWIDTH 6
#define LEDSPACING 2
#define TOTALLEDWIDTH (NUMLEDS*(LEDWIDTH+LEDSPACING+1))

#define LOCK_PANE			0
#define STATUS_MSG_PANE		1
#define PROGRESS_PANE		2

#define TLS_NOSEARCHYET			0
#define TLS_NOTAUTHENTICATED	1
#define TLS_AUTHENTICATED		2

#define LOCKWIDTH			18

#define STATUSBARHEIGHT		20
#define SEARCHCONTROLHEIGHT	100

#define GRABBARHEIGHT		2

#define MINSEARCHWINDOWHEIGHT	260
#define MINSEARCHWINDOWWIDTH	460

// External globals
extern HINSTANCE		g_hInst;
extern HWND				g_hWndMain;
extern CHAR				g_szHelpFile[MAX_PATH];
extern UINT				g_uReloadPrefsMessage;
extern UINT				g_uReloadKeyringMessage;
extern UINT				g_uReloadKeyserverPrefsMessage;
extern UINT				g_uPurgePassphraseCacheMessage;
extern UINT				g_uMouseWheelMessage;
extern PGPContextRef	g_Context;
extern PGPtlsContextRef	g_TLSContext;
extern PGPBoolean		g_bExpertMode;
extern PGPBoolean		g_bKeyGenEnabled;
extern PGPBoolean		g_bMarginalAsInvalid;
extern BOOL				g_bReadOnly;
extern BOOL				g_bShowGroups;
extern INT				g_iGroupsPercent;
extern INT				g_iToolHeight;

// Local globals
static BOOL			bKeyHasBeenGenerated = FALSE;
static BOOL			bMakeBackups = FALSE;
static BOOL			bIgnoreReloads = FALSE;
static HWND			hwndOpenSearch = NULL;
static BOOL			bFirstKeyringLoad = TRUE;
static ULONG		ulColumns = 0;
static HIMAGELIST	himlLocks = NULL;


//	____________________________________
//
//  Look for secret keys

static BOOL 
sPKCheckForSecretKeys (PGPKeySetRef KeySet) 
{
	PGPKeyListRef	KeyList;
	PGPKeyIterRef	KeyIter;
	PGPKeyRef		Key;
	PGPBoolean		bSecret;
	BOOL			bSecretKeys;

	PGPOrderKeySet (KeySet, kPGPAnyOrdering, &KeyList);
	PGPNewKeyIter (KeyList, &KeyIter);

	bSecretKeys = FALSE;
	PGPKeyIterNext (KeyIter, &Key);

	while (Key && !bSecretKeys) {
		PGPGetKeyBoolean (Key, kPGPKeyPropIsSecret, &bSecret);
		if (bSecret) {
			bSecretKeys = TRUE;
		}
		PGPKeyIterNext (KeyIter, &Key);
	}

	PGPFreeKeyIter (KeyIter);
	PGPFreeKeyList (KeyList);

	return bSecretKeys;
}

//	____________________________________
//
//  Process files in command line

static VOID 
sProcessFileList (LPSTR			pszList, 
				 BOOL			bCommandLine, 
				 BOOL			bAllowSelect,
				 PGPKeySetRef	keysetMain) 
{
	PGPFileSpecRef	fileref;
	PGPKeySetRef	keysetToAdd;
	LPSTR			p, p2;
	INT				iNumKeys;
	CHAR			cTerm;
	
	p = pszList;

	// skip over path of program 
	if (bCommandLine) {
		while (*p && (*p == ' ')) p++;
		if (*p) {
			if (*p == '"') {
				p++;
				cTerm = '"';
			}
			else cTerm = ' ';
		}
		while (*p && (*p != cTerm)) p++;
		if (*p && (cTerm == '"')) p++;
	}

	// parse file names
	// Unfortunately, the OS hands me names in the command line in all 
	// sorts of forms: space delimited; quoted and space delimited; space
	// delimiter after the program path but then NULL terminated.
	// And this is just NT ...
	while (p && *p) {
		while (*p && (*p == ' ')) p++;
		if (*p) {
			if (*p == '"') {
				p++;
				cTerm = '"';
			}
			else cTerm = ' ';

			p2 = strchr (p, cTerm);
			if (p2) {
				if (*(p2+2) == ':') *p2 = '\0';
			}

			PGPNewFileSpecFromFullPath (g_Context, p, &fileref);
			if (fileref) {
				PGPImportKeySet (g_Context, &keysetToAdd, 
								PGPOInputFile (g_Context, fileref),
								PGPOLastOption (g_Context));
				if (keysetToAdd) {
					PGPCountKeys (keysetToAdd, &iNumKeys);
					if (iNumKeys > 0) {
						if (bAllowSelect) {
							PGPclQueryAddKeys (g_Context, g_TLSContext,
								g_hWndMain, keysetToAdd, keysetMain);
						}
						else {
							PGPAddKeys (keysetToAdd, keysetMain);
							PKCommitKeyRingChanges (keysetMain, TRUE);
						}
					}
					PGPFreeKeySet (keysetToAdd);
				}
				PGPFreeFileSpec (fileref);
			}
			if (p2) *p2 = ' ';
		}
		while (*p && (*p != cTerm)) p++;
		if (*p && (cTerm == '"')) p++;
	}
}

//	____________________________________
//
//  Import keys from WM_COPYDATA struct

static BOOL 
sImportData (PGPKEYSSTRUCT* ppks, PCOPYDATASTRUCT pcds) 
{
	PGPKeySetRef	keyset		= kInvalidPGPKeySetRef;
	BOOL			bPrompt;
	PGPError		err;


	bPrompt = pcds->dwData & PGPPK_SELECTIVEIMPORT;

	switch (pcds->dwData & PGPPK_IMPORTKEYMASK) {
	case PGPPK_IMPORTKEYBUFFER :
		err = PGPImportKeySet (g_Context, &keyset, 
				PGPOInputBuffer (g_Context, pcds->lpData, pcds->cbData),
				PGPOLastOption (g_Context));
		if (IsntPGPError (err) && PGPKeySetRefIsValid (keyset)) {
			if (bPrompt) {
				PGPclQueryAddKeys (g_Context, g_TLSContext, 
								g_hWndMain, keyset, ppks->KeySetMain);
			}
			else {
				err = PGPAddKeys (keyset, ppks->KeySetMain);
				PKCommitKeyRingChanges (ppks->KeySetMain, TRUE);
				PGPkmReLoadKeySet (ppks->hKM, TRUE);
			}
		}
		if (PGPKeySetRefIsValid (keyset)) 
			PGPFreeKeySet (keyset);
		return (IsntPGPError (err));

	case PGPPK_IMPORTKEYFILELIST :
		sProcessFileList (pcds->lpData, FALSE, bPrompt, ppks->KeySetMain);
		return TRUE;

	case PGPPK_IMPORTKEYCOMMANDLINE :
		sProcessFileList (pcds->lpData, TRUE, bPrompt, ppks->KeySetMain);
		return TRUE;
	}

	return FALSE;
}

//	____________________________________
//
//  import keys from admin prefs file

static PGPError 
sImportPrefsKeys (PGPKeySetRef keysetMain)
{
	PGPError		err			= kPGPError_UnknownError;

#if PGP_BUSINESS_SECURITY
	PGPKeySetRef	keysetNew;
	PGPPrefRef		prefref;
	LPSTR			psz;

	err = PGPclOpenAdminPrefs (
				PGPGetContextMemoryMgr (g_Context),
				&prefref, 
				PGPclIsAdminInstall());

	if (IsntPGPError (err)) {
		err = PGPGetPrefStringAlloc (prefref, kPGPPrefDefaultKeys, &psz);
		if (IsntPGPError (err) && psz) {
			if (psz[0]) {
				err = PGPImportKeySet (g_Context, &keysetNew, 
						PGPOInputBuffer (g_Context, psz, lstrlen(psz)+1),
						PGPOLastOption (g_Context));

				if (IsntPGPError (err)) {
					PGPAddKeys (keysetNew, keysetMain);
					err = PKCommitKeyRingChanges (keysetMain, TRUE);
					PGPFreeKeySet (keysetNew);
				}
			}
			PGPDisposePrefData (prefref, psz);
		}
		PGPclCloseAdminPrefs (prefref, FALSE);
	}

#endif //PGP_BUSINESS_SECURITY

	return err;
}

//	____________________________________
//
//  Reload keyrings

static BOOL 
sReloadKeyrings (
		PGPKEYSSTRUCT*	ppks) 
{
	BOOL				bMutable			= TRUE;
	PGPKeyRingOpenFlags	flags				= kPGPKeyRingOpenFlags_Mutable;
	INT					iLockTries			= 0;

	PGPError			pgpError;
	HCURSOR				hCursorOld;

	hCursorOld = SetCursor (LoadCursor (NULL, IDC_WAIT));
	PGPsdkLoadDefaultPrefs (g_Context);
	pgpError = PGPOpenDefaultKeyRings (g_Context, flags, 
										&(ppks->KeySetMain));
	SetCursor (hCursorOld);

	while (!PGPKeySetRefIsValid (ppks->KeySetMain) || 
		   PGPkmLoadKeySet (ppks->hKM, ppks->KeySetMain, ppks->KeySetMain)) 
	{
		switch (pgpError) {

		case kPGPError_FilePermissions :
			bMutable = FALSE;
			break;

		case kPGPError_FileLocked :
			iLockTries++;
			if (iLockTries < WRITELOCKTRIES) {
				Sleep (WRITELOCKDELAY);
			}
			else {
				PKMessageBox (g_hWndMain, IDS_CAPTION, IDS_LOCKEDKEYRING,
					MB_OK|MB_ICONSTOP);
				if (!PKPGPPreferences (ppks, g_hWndMain, PGPCL_KEYRINGPREFS)) 
				{
					SendMessage (g_hWndMain, WM_CLOSE, 0, 0);
					return FALSE;
				}
			}
			break;

		case kPGPError_CantOpenFile :
		case kPGPError_FileNotFound :
			if (!PKPGPPreferences (ppks, g_hWndMain, PGPCL_KEYRINGPREFS)) 
			{
				SendMessage (g_hWndMain, WM_CLOSE, 0, 0);
				return FALSE;
			}
			break;

		default :
			PKMessageBox (g_hWndMain, IDS_CAPTION, IDS_CORRUPTKEYRING, 
				MB_OK|MB_ICONSTOP);
			if (!PKPGPPreferences (ppks, g_hWndMain, PGPCL_KEYRINGPREFS)) 
			{
				SendMessage (g_hWndMain, WM_CLOSE, 0, 0);
				return FALSE;
			}
			break;
		}
		hCursorOld = SetCursor (LoadCursor (NULL, IDC_WAIT));
		flags = 0;
		if (bMutable) flags |= kPGPKeyRingOpenFlags_Mutable;
		pgpError = PGPOpenDefaultKeyRings (g_Context, flags, 
											&(ppks->KeySetMain));

		SetCursor (hCursorOld);
	}

	PGPPropagateTrust (ppks->KeySetMain);
	g_bReadOnly = !bMutable;

	if (g_bReadOnly) 
	{
		ppks->kmConfig.ulOptionFlags |= KMF_READONLY;
		PKReadOnlyWarning (ppks->hWndMain);
	}
	else 
		ppks->kmConfig.ulOptionFlags &= ~KMF_READONLY;

	// pass readonly flag to keymanager
	ppks->kmConfig.ulMask = PGPKM_OPTIONS;
	PGPkmConfigure (ppks->hKM, &(ppks->kmConfig));

	// reload the groups file
	ppks->gmConfig.keysetMain = ppks->KeySetMain;
	PGPgmConfigure (ppks->hGM, &(ppks->gmConfig));
	PGPgmLoadGroups (ppks->hGM);

	return TRUE;
}

//	____________________________________
//
//  Draw the owner-drawn part of the status bar

static VOID
sDrawStatus (
		LPDRAWITEMSTRUCT lpdis, 
		PGPKEYSSTRUCT* ppks) 
{
	HBRUSH	hBrushLit, hBrushUnlit, hBrushOld;
	HPEN	hPen, hPenOld;
	INT		i;
	INT		itop, ibot, ileft, iright;

	if(lpdis->itemID == PROGRESS_PANE)
	{
		if (ppks->iStatusValue < -1) return;

		// draw 3D shadow
		itop = lpdis->rcItem.top+3;
		ibot = lpdis->rcItem.bottom-5;

		ileft = lpdis->rcItem.left + 4;
		for (i=0; i<NUMLEDS; i++) {
			iright = ileft + LEDWIDTH;

			MoveToEx (lpdis->hDC, ileft, ibot, NULL);
			LineTo (lpdis->hDC, iright, ibot);
			LineTo (lpdis->hDC, iright, itop);

			ileft += LEDWIDTH + LEDSPACING;
		}

		hPen = CreatePen (PS_SOLID, 0, RGB (128, 128, 128));
		hPenOld = SelectObject (lpdis->hDC, hPen);
		hBrushLit = CreateSolidBrush (RGB (0, 255, 0));
		hBrushUnlit = CreateSolidBrush (RGB (0, 128, 0));

		ileft = lpdis->rcItem.left + 4;

		// draw "Knight Rider" LEDs
		if (ppks->iStatusDirection) {
			hBrushOld = SelectObject (lpdis->hDC, hBrushUnlit);
			for (i=0; i<NUMLEDS; i++) {
				iright = ileft + LEDWIDTH;
		
				if (i == ppks->iStatusValue) {
					SelectObject (lpdis->hDC, hBrushLit);
					Rectangle (lpdis->hDC, ileft, itop, iright, ibot);
					SelectObject (lpdis->hDC, hBrushUnlit);
				}
				else  {
					Rectangle (lpdis->hDC, ileft, itop, iright, ibot);
				}
		
				ileft += LEDWIDTH + LEDSPACING;
			}
		}

		// draw "progress bar" LEDs
		else { 
			if (ppks->iStatusValue >= 0) 
				hBrushOld = SelectObject (lpdis->hDC, hBrushLit);
			else
				hBrushOld = SelectObject (lpdis->hDC, hBrushUnlit);

			for (i=0; i<NUMLEDS; i++) {
				iright = ileft + LEDWIDTH;
		
				if (i > ppks->iStatusValue) {
					SelectObject (lpdis->hDC, hBrushUnlit);
				}
				Rectangle (lpdis->hDC, ileft, itop, iright, ibot);
		
				ileft += LEDWIDTH + LEDSPACING;
			}
		}

		SelectObject (lpdis->hDC, hBrushOld);
		SelectObject (lpdis->hDC, hPenOld);
		DeleteObject (hPen);
		DeleteObject (hBrushLit);
		DeleteObject (hBrushUnlit);
	}
	else if(lpdis->itemID == LOCK_PANE)
	{
		BOOL bSecure = (BOOL) lpdis->itemData;

		if (bSecure) {
			bSecure = TRUE;
		}

		ImageList_Draw (himlLocks, (bSecure ? IDX_CLOSEDLOCK:IDX_OPENLOCK),
			lpdis->hDC, 1, 3, ILD_TRANSPARENT);

	}
}


//	____________________________________
//
//  display downloaded key count in status bar

static INT
sDisplayKSKeyResult (
		PGPKeySetRef	keyset, 
		HWND			hwnd, 
		PGPError		err) 
{
	CHAR sz1[256];
	CHAR sz2[256];
	INT	 iCount;

	if (keyset)
		(void)PGPCountKeys (keyset, &iCount);
	else 
		iCount = 0;

	if (err == kPGPError_ServerPartialSearchResults)
		LoadString (g_hInst, IDS_KSTOOMANYKEYCOUNT, sz1, sizeof(sz1));
	else 
		LoadString (g_hInst, IDS_KSKEYCOUNT, sz1, sizeof(sz1));
	wsprintf (sz2, sz1, iCount);
	SendMessage (hwnd, SB_SETTEXT, STATUS_MSG_PANE, (LPARAM)sz2);
	
	return iCount;
}

//	____________________________________
//
//  get number of wheel scroll lines and pass to treelist controls

static VOID
sUpdateWheelScrollLines (PGPKEYSSTRUCT* ppks)
{
	UINT uLines;

	if (!SystemParametersInfo (SPI_GETWHEELSCROLLLINES, 0, &uLines, 0)) 
	{
		HWND hwnd = NULL;
		UINT umsg = 0;

		umsg = RegisterWindowMessage (MSH_SCROLL_LINES);
		hwnd = FindWindow (MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);

⌨️ 快捷键说明

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