clsend.c

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

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

	CLsend.c - send key shares routines

	$Id: CLsend.c,v 1.13 2002/10/29 18:30:41 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"	/* or pgpConfig.h in the CDK */

// project header files
#include "PGPclx.h"

// pgp header files
#include "PGPskep.h"
#include "pgpShareFile.h"
#include "pgpFileSpec.h"

// system header files
#include <commdlg.h>
#include <process.h>

// typedefs
typedef struct {
	PGPContextRef		context;
	PGPtlsContextRef	tlsContext;
	PGPKeyDBRef			keydb;
	HWND				hwnd;
	HWND				hwndParent;
	LPSTR				pszPhrase;
	PGPByte*			pPasskey;
	PGPSize				sizePasskey;
	CHAR				szName[kPGPMaxUserIDSize];
	UINT				uNumShares;
	LPSTR				pszRemoteHost;
	PGPKeySetRef		keysetDecryption;
	PGPUInt32			iKeyIDCount;
	PGPKeyID*			keyidsDecryption;
	PGPKeyDBRef			keydbToAdd;
	PGPKeyDBObjRef		keyAuthenticating;
	PGPShareRef			shares;
	PGPskepRef			skep;
	BOOL				bConventional;
	BOOL				bThreadRunning;
	BOOL				bFinished;
} SENDSHARESSTRUCT, *PSENDSHARESSTRUCT;

// external global variables
extern HINSTANCE	g_hInst;

// local globals
static DWORD aIds[] = {			// Help IDs
	IDC_SENDSHARES,		IDH_PGPCLSEND_SENDSHARES,	// must be first in list
	IDC_SHAREFILE,		IDH_PGPCLSEND_SHAREFILE,
	IDC_NUMSHARES,		IDH_PGPCLSEND_NUMSHARESINFILE,
	IDC_REMOTECOMPUTER,	IDH_PGPCLSEND_REMOTECOMPUTER,
	IDC_NETSTATUS,		IDH_PGPCLSEND_NETWORKSTATUS,
	IDC_AUTHENTICATION,	IDH_PGPCLSEND_NETWORKAUTHENTICATION,
    0,0
};


//	___________________________________________________
//
//  SKEP event handler

static PGPError
sHandlerSKEP (
		PGPskepRef		skep,
		PGPskepEvent*	event,
		PGPUserValue	userValue)
{
	BOOL				bCancel		= FALSE;
	PSENDSHARESSTRUCT	psss;
	UINT				uID;
	CHAR				sz[kPGPMaxUserIDSize];
	UINT				u;

	psss = (PSENDSHARESSTRUCT)userValue;

	uID = 0;

	switch (event->type) {
	case kPGPskepEvent_ConnectEvent :
		uID = IDS_STATUSCONNECTED;
		break;

	case kPGPskepEvent_PassphraseEvent :
	{
		UINT			uLen;
		CHAR			szPrompt[64];
		PGPError		err;
		PGPMemoryMgrRef	mgr;

		// free phrase if this is a retry
		if (psss->pszPhrase)
		{
			PGPclFreePhrase (psss->pszPhrase);
			psss->pszPhrase = NULL;
		}

		if (psss->pPasskey)
		{
			PGPclFreePasskey (psss->pPasskey, psss->sizePasskey);
			psss->pPasskey = NULL;
		}

		LoadString (g_hInst, IDS_SENDAUTHPROMPT, szPrompt, sizeof(szPrompt));
		err = PGPclGetKeyPhrase (psss->context, psss->tlsContext,
				psss->hwndParent, szPrompt, psss->keydb,
				psss->keyAuthenticating, &(psss->pszPhrase),
				&(psss->pPasskey), &(psss->sizePasskey));

		if (IsPGPError (err))
			return err;

		mgr = PGPPeekContextMemoryMgr(psss->context);

		if (psss->pszPhrase)
		{
			uLen = lstrlen (psss->pszPhrase);
			event->data.ppd.passphrase = PGPNewSecureData(mgr, uLen + 1, 0);

			if (event->data.ppd.passphrase != NULL)
				pgpCopyMemory(psss->pszPhrase, event->data.ppd.passphrase,
					uLen + 1);
			else
				return kPGPError_OutOfMemory;
		}
		else
		{
			event->data.ppd.passkey = PGPNewSecureData(mgr, 
										psss->sizePasskey, 0);

			if (event->data.ppd.passkey != NULL)
			{
				event->data.ppd.passkeySize = psss->sizePasskey;
				pgpCopyMemory(psss->pPasskey, event->data.ppd.passkey,
					psss->sizePasskey);
			}
			else
				return kPGPError_OutOfMemory;
		}
		break;
	}

	case kPGPskepEvent_AuthenticateEvent :
		if (IsntPGPError (PGPclConfirmRemoteAuthentication (
					psss->context,
					psss->hwnd,
					psss->pszRemoteHost,
					event->data.ad.remoteKey,
					event->data.ad.tlsCipher,
					psss->keydb,
					kPGPclAuthReconstituting)))
		{
			uID = IDS_STATUSAUTHENTICATED;
			if (IsntPGPError (PGPclGetPrimaryUserIDNameUTF8 (
					event->data.ad.remoteKey, sz, sizeof(sz), &u)))
			{
				SetDlgItemText (psss->hwnd, IDC_AUTHENTICATION, sz);
			}
		}
		else
			bCancel = TRUE;
		break;

	case kPGPskepEvent_ProgressEvent :
		uID = IDS_STATUSSENDING;
		break;

	case kPGPskepEvent_CloseEvent :
		uID = IDS_STATUSCLOSING;
		break;
	}

	if (uID != 0)
	{
		LoadString (g_hInst, uID, sz, sizeof(sz));
		SetDlgItemText (psss->hwnd, IDC_NETSTATUS, sz);
	}

	if (bCancel)
		return kPGPError_UserAbort;
	else
		return kPGPError_NoErr;
}


//	___________________________________________________
//
// thread for actually sending the shares

static DWORD
sSendSharesThreadRoutine (LPVOID lpvoid)
{
	PSENDSHARESSTRUCT	psss		= (PSENDSHARESSTRUCT)lpvoid;
	PGPError			err;

	err = PGPskepSetEventHandler (psss->skep,
					(PGPskepEventHandler)sHandlerSKEP, (PGPUserValue)psss);

	if (IsntPGPError (err))
	{
		err = PGPskepSendShares (psss->skep,
				psss->keyAuthenticating,
				psss->pszPhrase,
				psss->shares,
				psss->pszRemoteHost);
	}

	SendMessage (psss->hwnd, WM_APP, 0, (LPARAM)err);

	psss->bThreadRunning = FALSE;
	return 0;
}


//	___________________________________________________
//
// Sign key dialog message procedure

static BOOL CALLBACK
sSendKeySharesDlgProc (
				HWND hDlg,
				UINT uMsg,
				WPARAM wParam,
				LPARAM lParam)
{
	PSENDSHARESSTRUCT	psss;
	CHAR				sz[64];
	INT					i;
	PGPError			err;

	switch (uMsg) {

	case WM_INITDIALOG :
		SetWindowLong (hDlg, GWL_USERDATA, lParam);
		psss = (PSENDSHARESSTRUCT)lParam;

		psss->hwnd = hDlg;
		SetDlgItemText (hDlg, IDC_SHAREFILE, psss->szName);
		SetDlgItemInt (hDlg, IDC_NUMSHARES, psss->uNumShares, FALSE);

		LoadString (g_hInst, IDS_STATUSNOTCONNECTED, sz, sizeof(sz));
		SetDlgItemText (hDlg, IDC_NETSTATUS, sz);

		EnableWindow (GetDlgItem (hDlg, IDC_SENDSHARES), FALSE);
		return TRUE;

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

	case WM_APP :
		psss = (PSENDSHARESSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
		err = (PGPError)lParam;
		if (IsPGPError (err))
		{
			SetDlgItemText (hDlg, IDC_AUTHENTICATION, "");
			LoadString (g_hInst, IDS_STATUSNOTCONNECTED, sz, sizeof(sz));
			SetDlgItemText (hDlg, IDC_NETSTATUS, sz);
			PGPclErrorBox (hDlg, err);

			EnableWindow (GetDlgItem (hDlg, IDC_SENDSHARES), TRUE);
		}
		else
		{
			LoadString (g_hInst, IDS_STATUSFINISHED, sz, sizeof(sz));
			SetDlgItemText (hDlg, IDC_NETSTATUS, sz);
			PGPclMessageBox (hDlg, IDS_CAPTIONINFO, 
					IDS_SENDSUCCESS, MB_OK|MB_ICONINFORMATION);

			LoadString (g_hInst, IDS_DONEBUTTON, sz, sizeof(sz));
			SetDlgItemText (hDlg, IDC_SENDSHARES, sz);
			EnableWindow (GetDlgItem (hDlg, IDCANCEL), FALSE);
			EnableWindow (GetDlgItem (hDlg, IDC_SENDSHARES), TRUE);
			SetFocus (GetDlgItem (hDlg, IDC_SENDSHARES));
			aIds[1] = IDH_PGPCLSEND_DONE;	// change help ID for this button
			psss->bFinished = TRUE;
		}

		PGPFreeSKEP (psss->skep);
		break;

	case WM_COMMAND :
		switch (LOWORD(wParam)) {
		case IDCANCEL :
			psss = (PSENDSHARESSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
			if (psss->bThreadRunning)
				PGPskepCancel (psss->skep);
			else
				EndDialog (hDlg, 0);
			break;

		case IDC_SENDSHARES :
			psss = (PSENDSHARESSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);

			if (psss->bFinished)
			{
				EndDialog (hDlg, 0);
				break;
			}

			EnableWindow (GetDlgItem (hDlg, IDC_SENDSHARES), FALSE);
			if (psss->pszRemoteHost)
				clFree (psss->pszRemoteHost);

			i = GetWindowTextLength (GetDlgItem (hDlg, IDC_REMOTECOMPUTER))+1;
			psss->pszRemoteHost = clAlloc (i);
			GetDlgItemText (hDlg, IDC_REMOTECOMPUTER, psss->pszRemoteHost, i);

			LoadString (g_hInst, IDS_STATUSCONNECTING, sz, sizeof(sz));
			SetDlgItemText (hDlg, IDC_NETSTATUS, sz);

			psss->bThreadRunning = TRUE;
			PGPNewSKEP (psss->context, psss->tlsContext, &psss->skep);
			_beginthread (sSendSharesThreadRoutine, 0, (void*)psss);
			break;

		case IDC_REMOTECOMPUTER :
			if (HIWORD (wParam) == EN_CHANGE) {
				if (GetWindowTextLength ((HWND)lParam) > 0)

⌨️ 快捷键说明

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