clserver.c

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

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

	CLserver.c -	handle those types of communication with keyserver
					which are not handled by SDKuiLib

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

// project header files
#include "PGPclx.h"
#include "pgpKeyServer.h"
#include "pgpRemotePrefs.h"
#include "pgpNetPrefs.h"
#include "pgpNetHostUtils.h"
#include "SpaceEdit.h"
#include "UTF8Edit.h"

#include <process.h>

// constant definitions
#define	MAX_AV			10

#define LEDTIMER		111L
#define LEDTIMERPERIOD	100L

#define NUMLEDS			10
#define LEDSPACING		2

#define MAXPROGRESSTEXT	68

#define RECONSTRUCTIONMAX			5
#define RECONSTRUCTIONTHRESHOLD		3

// keyserver operations
#define SENDGROUPS					0x01
#define GETGROUPS					0x02
#define SENDKEY						0x03
#define	DISABLEKEY					0x04
#define DELETEKEY					0x05

// CA operations
#define UPDATEREVOCATIONS			0x11
#define REQUESTCERTIFICATE			0x12
#define RETRIEVECERTIFICATE			0x13

// LDAP operations
#define SENDRECONSTRUCTIONBLOB		0x21
#define RETRIEVERECONSTRUCTIONBLOB	0x22
#define SENDPREFS					0x23
#define GETPREFS					0x24

// flags
#define USEFULLERRORTEXT			0x0001
#define TLSCONFIRMONLYIFINVALID		0x0002


// external globals
extern HINSTANCE	g_hInst;

// typedefs
typedef struct {
	PGPContextRef			context;
	PGPtlsContextRef		tlsContext;
	PGPPrefRef				prefref;
	PGPPrefRef				prefrefNet;
	HWND					hwnd;
	VOID*					lpThread;
	BOOL					bOpInProgress;
	BOOL					bCancel;
	BOOL					bThreadFree;
	INT						iStatusValue;
	INT						iStatusDirection;
	UINT					uOperation;
	UINT					uFlags;
	PGPError				err;
	PGPKeyDBObjRef			keyIn;
	PGPKeySetRef			keysetIn;
	PGPKeyDBRef				keydbOut;
	PGPKeyDBRef				keydbMain;
	PGPKeyServerKeySpace	space;
	PGPKeyServerEntry		ksentry;
	PGPKeyServerRef			server;
	PGPGroupSetRef			groupset;
	PGPAttributeValue*		pAVlist;
	PGPUInt32				numAVs;
	LPSTR					pszPassPhrase;
	PGPByte*				pPasskey;
	PGPSize					sizePasskey;
	LPSTR					pszUserID;
	LPSTR					pszUserPass;
	PGPReconPrompts			reconPrompts;
	PGPReconPasses			reconPasses;
} SERVERTHREADSTRUCT, *PSERVERTHREADSTRUCT;

// local globals
static DWORD aReconstructIds[] = {			// Help IDs
	IDC_HIDETYPING,		IDH_PGPCLRECONSTRUCT_HIDEANSWER,
	IDC_PROMPT1,		IDH_PGPCLRECONSTRUCT_PROMPT,
	IDC_PROMPT2,		IDH_PGPCLRECONSTRUCT_PROMPT,
	IDC_PROMPT3,		IDH_PGPCLRECONSTRUCT_PROMPT,
	IDC_PROMPT4,		IDH_PGPCLRECONSTRUCT_PROMPT,
	IDC_PROMPT5,		IDH_PGPCLRECONSTRUCT_PROMPT,
	IDC_ANSWER1,		IDH_PGPCLRECONSTRUCT_ANSWER,
	IDC_ANSWER2,		IDH_PGPCLRECONSTRUCT_ANSWER,
	IDC_ANSWER3,		IDH_PGPCLRECONSTRUCT_ANSWER,
	IDC_ANSWER4,		IDH_PGPCLRECONSTRUCT_ANSWER,
	IDC_ANSWER5,		IDH_PGPCLRECONSTRUCT_ANSWER,
    0,0
};

static DWORD aLDAPloginIds[] = {			// Help IDs
	IDC_USERID,			IDH_PGPCLRECONSTRUCT_USERID,
	IDC_PASSWORD,		IDH_PGPCLRECONSTRUCT_PASSWORD,
	0,0
};

//	___________________________________________________
//
//	update keyserver entry info in prefs

PGPError PGPclExport
PGPclSyncKeyserverPrefs (
		PGPContextRef		context,
		PGPKeyServerEntry*	keyserver)
{
	PGPKeyServerEntry*	keyserverList		= NULL;
	PGPPrefRef			prefRef				= kInvalidPGPPrefRef;
	PGPUInt32			keyserverCount;
	PGPError			err;

	// load keyserverprefs
	err = PGPclPeekClientLibPrefRefs (&prefRef, NULL);
	if (IsntPGPError (err))
	{
		err = PGPGetKeyServerPrefs (prefRef,
				&keyserverList, &keyserverCount);

		if (IsntPGPError (err))
		{
			PGPUInt32	index;

			for (index = 0; index < keyserverCount; index++) 
			{
				if (KeyServersAreEqual (keyserverList[index], *keyserver))
				{
					keyserverList[index].authAlg = keyserver->authAlg;
					lstrcpy (keyserverList[index].authKeyIDString,
							keyserver->authKeyIDString);

					err = PGPSetKeyServerPrefs (prefRef,
							keyserverList, keyserverCount);

					if (IsntPGPError (err))
						err = PGPclFlushClientLibPrefs (prefRef, NULL);

					break;
				}
			}

		}
	}

	if (keyserverList)
		PGPFreeKeyServerList(keyserverList);

	return err;
}


//	___________________________________________________
//
//  Dialog Message procedure

static BOOL CALLBACK
sReconstructionDlgProc (
		HWND	hwnd,
		UINT	uMsg,
		WPARAM	wParam,
		LPARAM	lParam)
{

	PSERVERTHREADSTRUCT		psts;

	switch(uMsg) {

	case WM_INITDIALOG:
		psts = (PSERVERTHREADSTRUCT)lParam;
		SetWindowLong (hwnd, GWL_USERDATA, lParam);

		// use the spaceedit control
		SEInit (psts->context, GetDlgItem (hwnd, IDC_ANSWER1),
				TRUE, NULL, NULL);
		SEInit (psts->context, GetDlgItem (hwnd, IDC_ANSWER2),
				TRUE, NULL, NULL);
		SEInit (psts->context, GetDlgItem (hwnd, IDC_ANSWER3),
				TRUE, NULL, NULL);
		SEInit (psts->context, GetDlgItem (hwnd, IDC_ANSWER4),
				TRUE, NULL, NULL);
		SEInit (psts->context, GetDlgItem (hwnd, IDC_ANSWER5),
				TRUE, NULL, NULL);

		// and the UTF8Edit control
		UTF8EditInit (GetDlgItem (hwnd, IDC_PROMPT1));
		UTF8EditInit (GetDlgItem (hwnd, IDC_PROMPT2));
		UTF8EditInit (GetDlgItem (hwnd, IDC_PROMPT3));
		UTF8EditInit (GetDlgItem (hwnd, IDC_PROMPT4));
		UTF8EditInit (GetDlgItem (hwnd, IDC_PROMPT5));

		CheckDlgButton (hwnd, IDC_HIDETYPING, BST_CHECKED);

		if (psts->uOperation == SENDRECONSTRUCTIONBLOB)
		{
			LoadString (g_hInst, IDS_DEFAULTRECONPROMPT1,
					&psts->reconPrompts[0][0], kPGPRecon_MaxPromptLen);
			LoadString (g_hInst, IDS_DEFAULTRECONPROMPT2,
					&psts->reconPrompts[1][0], kPGPRecon_MaxPromptLen);
			LoadString (g_hInst, IDS_DEFAULTRECONPROMPT3,
					&psts->reconPrompts[2][0], kPGPRecon_MaxPromptLen);
			LoadString (g_hInst, IDS_DEFAULTRECONPROMPT4,
					&psts->reconPrompts[3][0], kPGPRecon_MaxPromptLen);
			LoadString (g_hInst, IDS_DEFAULTRECONPROMPT5,
					&psts->reconPrompts[4][0], kPGPRecon_MaxPromptLen);
		}

		UTF8EditSetText (GetDlgItem (hwnd, IDC_PROMPT1), 
				&psts->reconPrompts[0][0]);
		UTF8EditSetText (GetDlgItem (hwnd, IDC_PROMPT2), 
				&psts->reconPrompts[1][0]);
		UTF8EditSetText (GetDlgItem (hwnd, IDC_PROMPT3), 
				&psts->reconPrompts[2][0]);
		UTF8EditSetText (GetDlgItem (hwnd, IDC_PROMPT4), 
				&psts->reconPrompts[3][0]);
		UTF8EditSetText (GetDlgItem (hwnd, IDC_PROMPT5), 
				&psts->reconPrompts[4][0]);

		if (psts->uOperation == RETRIEVERECONSTRUCTIONBLOB)
		{
			SendMessage (UTF8EditGetHandle (GetDlgItem (hwnd, IDC_PROMPT1)), 
					EM_SETREADONLY, TRUE, 0);
			SendMessage (UTF8EditGetHandle (GetDlgItem (hwnd, IDC_PROMPT2)), 
					EM_SETREADONLY, TRUE, 0);
			SendMessage (UTF8EditGetHandle (GetDlgItem (hwnd, IDC_PROMPT3)), 
					EM_SETREADONLY, TRUE, 0);
			SendMessage (UTF8EditGetHandle (GetDlgItem (hwnd, IDC_PROMPT4)), 
					EM_SETREADONLY, TRUE, 0);
			SendMessage (UTF8EditGetHandle (GetDlgItem (hwnd, IDC_PROMPT5)), 
					EM_SETREADONLY, TRUE, 0);

			ShowWindow (GetDlgItem (hwnd, IDC_SENDTEXT1), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_SENDTEXT2), SW_HIDE);
			SetFocus (GetDlgItem (hwnd, IDC_ANSWER1));

			return FALSE;
		}
		else
		{
			ShowWindow (GetDlgItem (hwnd, IDC_RETRIEVETEXT1), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_RETRIEVETEXT2), SW_HIDE);
			return TRUE;
		}

	case WM_DESTROY:
		SEWipeEditBox (GetDlgItem (hwnd, IDC_ANSWER1));
		SEWipeEditBox (GetDlgItem (hwnd, IDC_ANSWER2));
		SEWipeEditBox (GetDlgItem (hwnd, IDC_ANSWER3));
		SEWipeEditBox (GetDlgItem (hwnd, IDC_ANSWER4));
		SEWipeEditBox (GetDlgItem (hwnd, IDC_ANSWER5));

		SEDestroy (GetDlgItem (hwnd, IDC_ANSWER1));
		SEDestroy (GetDlgItem (hwnd, IDC_ANSWER2));
		SEDestroy (GetDlgItem (hwnd, IDC_ANSWER3));
		SEDestroy (GetDlgItem (hwnd, IDC_ANSWER4));
		SEDestroy (GetDlgItem (hwnd, IDC_ANSWER5));

		UTF8EditDestroy (GetDlgItem (hwnd, IDC_PROMPT1));
		UTF8EditDestroy (GetDlgItem (hwnd, IDC_PROMPT2));
		UTF8EditDestroy (GetDlgItem (hwnd, IDC_PROMPT3));
		UTF8EditDestroy (GetDlgItem (hwnd, IDC_PROMPT4));
		UTF8EditDestroy (GetDlgItem (hwnd, IDC_PROMPT5));
		break;

	case WM_HELP :
	case WM_CONTEXTMENU :
		return PGPclHtmlHelp (hwnd, uMsg, wParam, lParam,
				(char*)kPGPclHelpFile, aReconstructIds);

	case WM_COMMAND:

		switch(LOWORD (wParam)) {
		case IDOK:
		{
			INT		iNumAnswers		= 0;
			INT		i;

			psts = (PSERVERTHREADSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);

			// first collect prompts
			UTF8EditGetText (GetDlgItem (hwnd, IDC_PROMPT1),
					&psts->reconPrompts[0][0], kPGPRecon_MaxPromptLen);
			UTF8EditGetText (GetDlgItem (hwnd, IDC_PROMPT2),
					&psts->reconPrompts[1][0], kPGPRecon_MaxPromptLen);
			UTF8EditGetText (GetDlgItem (hwnd, IDC_PROMPT3),
					&psts->reconPrompts[2][0], kPGPRecon_MaxPromptLen);
			UTF8EditGetText (GetDlgItem (hwnd, IDC_PROMPT4),
					&psts->reconPrompts[3][0], kPGPRecon_MaxPromptLen);
			UTF8EditGetText (GetDlgItem (hwnd, IDC_PROMPT5),
					&psts->reconPrompts[4][0], kPGPRecon_MaxPromptLen);

			// now get passphrases
			i = SEGetTextLength (GetDlgItem (hwnd, IDC_ANSWER1));
			if ((i == 0) && (psts->uOperation == SENDRECONSTRUCTIONBLOB))
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_NEEDRECONANSWER, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER1));
				break;
			}
			else if (i >= kPGPRecon_MaxPassLen)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_RECONANSWERTOOLONG, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER1));
				break;
			}
			else if (i > 0)
			{
				SEGetText (GetDlgItem (hwnd, IDC_ANSWER1),
						&psts->reconPasses[0][0],
						kPGPRecon_MaxPassLen +1);
				iNumAnswers++;
			}

			i = SEGetTextLength (GetDlgItem (hwnd, IDC_ANSWER2));
			if ((i == 0) && (psts->uOperation == SENDRECONSTRUCTIONBLOB))
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_NEEDRECONANSWER, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER2));
				break;
			}
			else if (i >= kPGPRecon_MaxPassLen)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_RECONANSWERTOOLONG, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER2));
				break;
			}
			else if (i > 0)
			{
				SEGetText (GetDlgItem (hwnd, IDC_ANSWER2),
						&psts->reconPasses[1][0],
						kPGPRecon_MaxPassLen +1);
				iNumAnswers++;
			}

			i = SEGetTextLength (GetDlgItem (hwnd, IDC_ANSWER3));
			if ((i == 0) && (psts->uOperation == SENDRECONSTRUCTIONBLOB))
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_NEEDRECONANSWER, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER3));
				break;
			}
			else if (i >= kPGPRecon_MaxPassLen)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_RECONANSWERTOOLONG, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER3));
				break;
			}
			else if (i > 0)
			{
				SEGetText (GetDlgItem (hwnd, IDC_ANSWER3),
						&psts->reconPasses[2][0],
						kPGPRecon_MaxPassLen +1);
				iNumAnswers++;
			}

			i = SEGetTextLength (GetDlgItem (hwnd, IDC_ANSWER4));
			if ((i == 0) && (psts->uOperation == SENDRECONSTRUCTIONBLOB))
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_NEEDRECONANSWER, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER4));
				break;
			}
			else if (i >= kPGPRecon_MaxPassLen)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_RECONANSWERTOOLONG, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER4));
				break;
			}
			else if (i > 0)
			{
				SEGetText (GetDlgItem (hwnd, IDC_ANSWER4),
						&psts->reconPasses[3][0],
						kPGPRecon_MaxPassLen +1);
				iNumAnswers++;
			}

			i = SEGetTextLength (GetDlgItem (hwnd, IDC_ANSWER5));
			if ((i == 0) && (psts->uOperation == SENDRECONSTRUCTIONBLOB))
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_NEEDRECONANSWER, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER5));
				break;
			}
			else if (i >= kPGPRecon_MaxPassLen)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
						IDS_RECONANSWERTOOLONG, MB_OK|MB_ICONEXCLAMATION);
				SetFocus (GetDlgItem (hwnd, IDC_ANSWER5));
				break;
			}
			else if (i > 0)
			{
				SEGetText (GetDlgItem (hwnd, IDC_ANSWER5),
						&psts->reconPasses[4][0],
						kPGPRecon_MaxPassLen +1);
				iNumAnswers++;
			}

			if (iNumAnswers < RECONSTRUCTIONTHRESHOLD)
			{
				CHAR	sz1[128];
				CHAR	sz2[256];

				LoadString (g_hInst, IDS_BELOWRECONTHRESH, sz1, sizeof(sz1));
				wsprintf (sz2, sz1, RECONSTRUCTIONTHRESHOLD);
				LoadString (g_hInst, IDS_CAPTIONALERT, sz1, sizeof(sz1));

				MessageBox (hwnd, sz2, sz1, MB_OK|MB_ICONEXCLAMATION);
			}
			else
				EndDialog (hwnd, 1);

			return TRUE;
		}

		case IDCANCEL:
			EndDialog (hwnd, 0);
			return TRUE;

		case IDC_HIDETYPING:
		{
			BOOL	bHideTyping;

			if (IsDlgButtonChecked (hwnd, IDC_HIDETYPING) == BST_CHECKED)
				bHideTyping = TRUE;
			else
				bHideTyping = FALSE;

			SEChangeHideTyping (
					GetDlgItem (hwnd, IDC_ANSWER1), bHideTyping);
			SEChangeHideTyping (
					GetDlgItem (hwnd, IDC_ANSWER2), bHideTyping);
			SEChangeHideTyping (
					GetDlgItem (hwnd, IDC_ANSWER3), bHideTyping);
			SEChangeHideTyping (
					GetDlgItem (hwnd, IDC_ANSWER4), bHideTyping);
			SEChangeHideTyping (
					GetDlgItem (hwnd, IDC_ANSWER5), bHideTyping);
			break;
		}

		case IDC_MOREINFO :
		{
			INT		iHelpID;

			psts = (PSERVERTHREADSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);

			if (psts->uOperation == SENDRECONSTRUCTIONBLOB)
				iHelpID = IDH_PGPCLRECONSTRUCT_MOREINFOSEND;
			else
				iHelpID = IDH_PGPCLRECONSTRUCT_MOREINFOGET;

			PGPclHtmlHelp (hwnd, kPGPclHelpMoreInformation, 0, 0,
					(char*)kPGPclHelpFile, (DWORD*)iHelpID);
			break;
		}
		}
		return TRUE;
	}
	return FALSE;
}


//	___________________________________________________
//

⌨️ 快捷键说明

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