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