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 + -
显示快捷键?