📄 clavlist.c
字号:
/*____________________________________________________________________________
Copyright (C) 1998 Network Associates, Inc.
All rights reserved.
CLavlist.c - get AVlist either from prefs or from dialog
$Id: CLavlist.c,v 1.17 1999/05/13 22:54:21 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "pgpclx.h"
#include "pgpkmx.h"
#include "pgpClientLib.h"
// compiler definitions
#define PGP_VERISIGN_NAMES 0 // <- 1 forces VeriSign requests to use
// F,M,L names instead of CommonName
// constant definitions
#define MAX_AV 20
#define INITIAL_ATTRIBUTE_COLUMNWIDTH 120
#define SCROLLBAR_WIDTH 16
#define OFFSET_FIRST 2
#define OFFSET_OTHER 6
// external globals
extern HINSTANCE g_hInst;
extern CHAR g_szHelpFile[MAX_PATH];
// typedefs
typedef struct {
PGPContextRef context;
PGPKeyServerClass serverclass;
PGPAttributeValue* selectedpair;
PGPAttributeValue* pAVListStart;
PGPAttributeValue* pAVListEnd;
} AVLISTSTRUCT, *PAVLISTSTRUCT;
// local globals
static DWORD aAVlistIds[] = { // Help IDs
IDC_CATYPE, IDH_PGPCLAV_CATYPE,
IDC_AVLIST, IDH_PGPCLAV_AVLIST,
IDC_NEWAV, IDH_PGPCLAV_ADDAV,
IDC_EDITAV, IDH_PGPCLAV_EDITAV,
IDC_REMOVEAV, IDH_PGPCLAV_REMOVEAV,
0,0
};
static DWORD aAVeditIds[] = { // Help IDs
IDC_ATTRIBUTELIST, IDH_PGPCLAV_ATTRIBUTE,
IDC_VALUE, IDH_PGPCLAV_VALUE,
0,0
};
// ___________________________________________________
//
// fill the AV list with CommonName and Email attributes
static PGPError
sAppendClassAVPairs (
PGPContextRef context,
HWND hwnd,
PGPKeyServerClass serverclass,
PGPAttributeValue** ppAVcur)
{
PGPError err = kPGPError_NoErr;
LPSTR pszPhrase = NULL;
CHAR sz[256];
PGPSize size;
switch (serverclass) {
case kPGPKeyServerClass_NetToolsCA :
return err;
case kPGPKeyServerClass_Verisign :
// add challenge attribute
PGPclMessageBox (hwnd, IDS_CAPTION, IDS_CHALLENGEWARNING,
MB_OK|MB_ICONEXCLAMATION);
LoadString (g_hInst, IDS_CHALLENGEPROMPT, sz, sizeof(sz));
err = KMGetConfirmationPhrase (context, hwnd, sz,
kInvalidPGPKeySetRef, 1, 0, &pszPhrase);
if (IsntPGPError (err))
{
size = lstrlen (pszPhrase);
(*ppAVcur)->value.pointervalue = PGPNewData (
PGPGetContextMemoryMgr (context), size+1,
kPGPMemoryMgrFlags_Clear);
if ((*ppAVcur)->value.pointervalue)
{
(*ppAVcur)->attribute = kPGPAVAttribute_Challenge;
(*ppAVcur)->size = size;
pgpCopyMemory (
pszPhrase, (*ppAVcur)->value.pointervalue, size);
++(*ppAVcur);
}
}
if (pszPhrase)
KMFreePhrase (pszPhrase);
return err;
case kPGPKeyServerClass_Entrust :
return err;
default :
return err;
}
}
// ___________________________________________________
//
// fill the AV list with attributes common for all requests
static PGPError
sCreateCommonAVPairs (
PGPContextRef context,
PGPKeyServerClass serverclass,
PGPUserIDRef userid,
PGPAttributeValue** ppAVcur)
{
PGPError err = kPGPError_NoErr;
PGPByte* pName;
PGPSize size;
// first compute those attributes based on the userid
if (PGPUserIDRefIsValid (userid))
{
// get the "common name" attribute from the userid
err = PGPGetUserIDStringBuffer (
userid, kPGPUserIDPropCommonName, 0, NULL, &size);
if (size > 0)
{
pName = PGPNewData (PGPGetContextMemoryMgr (context),
size+1, kPGPMemoryMgrFlags_Clear);
if (pName)
{
err = PGPGetUserIDStringBuffer (
userid, kPGPUserIDPropCommonName, size,
pName, &size);
if (IsntPGPError (err))
{
#if PGP_VERISIGN_NAMES
if (serverclass == kPGPKeyServerClass_Verisign)
{
CHAR* pFirstName;
CHAR* pMiddleName;
CHAR* pLastName;
PGPParseCommonName (PGPGetContextMemoryMgr (context),
pName, &pFirstName, &pMiddleName, &pLastName);
if (pFirstName)
{
(*ppAVcur)->attribute =
kPGPAVAttribute_MailFirstName;
(*ppAVcur)->size = lstrlen (pFirstName);
(*ppAVcur)->value.pointervalue = pFirstName;
++(*ppAVcur);
}
if (pMiddleName)
{
// note: middlename is really middle initial
(*ppAVcur)->attribute =
kPGPAVAttribute_MailMiddleName;
(*ppAVcur)->size = 1;
(*ppAVcur)->value.pointervalue = pMiddleName;
pMiddleName[1] = '\0';
++(*ppAVcur);
}
if (pLastName)
{
(*ppAVcur)->attribute =
kPGPAVAttribute_MailLastName;
(*ppAVcur)->size = lstrlen (pLastName);
(*ppAVcur)->value.pointervalue = pLastName;
++(*ppAVcur);
}
PGPFreeData (pName);
}
else
#endif //PGP_VERISIGN_NAMES
{
(*ppAVcur)->attribute = kPGPAVAttribute_CommonName;
(*ppAVcur)->size = size;
(*ppAVcur)->value.pointervalue = pName;
++(*ppAVcur);
}
}
}
else
err = kPGPError_OutOfMemory;
}
else
err = kPGPError_InvalidProperty;
CKERR;
// get the "email" attribute from the userid
err = PGPGetUserIDStringBuffer (
userid, kPGPUserIDPropEmailAddress, 0, NULL, &size);
if (size > 0)
{
(*ppAVcur)->value.pointervalue = PGPNewData (
PGPGetContextMemoryMgr (context), size+1,
kPGPMemoryMgrFlags_Clear);
if ((*ppAVcur)->value.pointervalue)
{
err = PGPGetUserIDStringBuffer (
userid, kPGPUserIDPropEmailAddress, size,
(*ppAVcur)->value.pointervalue, &size);
if (IsntPGPError (err))
{
(*ppAVcur)->attribute = kPGPAVAttribute_Email;
(*ppAVcur)->size = size;
++(*ppAVcur);
}
}
else
err = kPGPError_OutOfMemory;
}
else
err = kPGPError_InvalidProperty;
CKERR;
}
done:
return err;
}
// ___________________________________________________
//
// fill the AV list with default attributes for the specified server class
static PGPError
sCreateDefaultAVPairs (
PGPContextRef context,
PGPKeyServerClass serverclass,
PGPAttributeValue** ppAVcur)
{
PGPError err = kPGPError_NoErr;
CHAR vs_certtype[] = "end-user";
PGPSize size;
// add class-specific attributes
switch (serverclass) {
case kPGPKeyServerClass_NetToolsCA :
break;
case kPGPKeyServerClass_Verisign :
size = lstrlen (vs_certtype);
(*ppAVcur)->value.pointervalue = PGPNewData (
PGPGetContextMemoryMgr (context), size+1,
kPGPMemoryMgrFlags_Clear);
if ((*ppAVcur)->value.pointervalue)
{
(*ppAVcur)->attribute = kPGPAVAttribute_CertType;
(*ppAVcur)->size = size;
pgpCopyMemory (
vs_certtype, (*ppAVcur)->value.pointervalue, size);
++(*ppAVcur);
}
(*ppAVcur)->attribute = kPGPAVAttribute_OrganizationName;
(*ppAVcur)->size = 0;
(*ppAVcur)->value.pointervalue = NULL;
++(*ppAVcur);
(*ppAVcur)->attribute = kPGPAVAttribute_OrganizationalUnitName;
(*ppAVcur)->size = 0;
(*ppAVcur)->value.pointervalue = NULL;
++(*ppAVcur);
break;
case kPGPKeyServerClass_Entrust :
break;
default :
break;
}
return err;
}
// ___________________________________________________
//
// get the display string for the attribute of an AV pair
PGPError PGPclExport
PGPclGetAVListAttributeString (
PGPAVAttribute attr,
LPSTR psz,
UINT uLen)
{
UINT uids = 0;
switch (attr) {
case kPGPAVAttribute_CommonName :
uids = IDS_AVCOMMONNAME;
break;
case kPGPAVAttribute_Email :
uids = IDS_AVEMAIL;
break;
case kPGPAVAttribute_OrganizationName :
uids = IDS_AVORGNAME;
break;
case kPGPAVAttribute_OrganizationalUnitName :
uids = IDS_AVORGUNITNAME;
break;
case kPGPAVAttribute_Country :
uids = IDS_AVCOUNTRY;
break;
case kPGPAVAttribute_Locality :
uids = IDS_AVLOCALITY;
break;
case kPGPAVAttribute_State :
uids = IDS_AVSTATE;
break;
case kPGPAVAttribute_StreetAddress :
uids = IDS_AVSTREET;
break;
case kPGPAVAttribute_PostalCode :
uids = IDS_AVPOSTAL;
break;
case kPGPAVAttribute_POBOX :
uids = IDS_AVPOBOX;
break;
case kPGPAVAttribute_TelephoneNumber :
uids = IDS_AVTELEPHONE;
break;
case kPGPAVAttribute_Initials :
uids = IDS_AVINITIALS;
break;
case kPGPAVAttribute_DNSName :
uids = IDS_AVDNSNAME;
break;
case kPGPAVAttribute_IPAddress :
uids = IDS_AVIPADDRESS;
break;
// Verisign-specific
case kPGPAVAttribute_MailFirstName :
uids = IDS_AVFIRSTNAME;
break;
case kPGPAVAttribute_MailMiddleName :
uids = IDS_AVMIDDLENAME;
break;
case kPGPAVAttribute_MailLastName :
uids = IDS_AVLASTNAME;
break;
case kPGPAVAttribute_CertType :
uids = IDS_AVCERTTYPE;
break;
}
psz[0] = '\0';
if (uids)
{
LoadString (g_hInst, uids, psz, uLen);
return kPGPError_NoErr;
}
else
return kPGPError_ItemNotFound;
}
// ___________________________________________________
//
// get the display string for the value of an AV pair
static VOID
sGetValueString (
PGPAttributeValue* pAV,
LPSTR psz,
UINT uLen)
{
PGPSize size;
if (pAV->value.pointervalue)
{
size = min(pAV->size +1, uLen);
lstrcpyn (psz, pAV->value.pointervalue, size);
psz[size] = '\0';
}
else
psz[0] = '\0';
}
// ___________________________________________________
//
// insert the attribute into the list
static VOID
sInsertAttribute (
HWND hwnd,
PAVLISTSTRUCT pavls,
PGPAVAttribute attr)
{
PGPAttributeValue* pAV;
CHAR sz[128];
INT index;
if (pavls)
{
for (pAV=pavls->pAVListStart; pAV<pavls->pAVListEnd; pAV++)
{
if (pAV->attribute == attr)
return;
}
}
PGPclGetAVListAttributeString (attr, sz, sizeof(sz));
index = SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST,
CB_ADDSTRING, 0, (LPARAM)sz);
SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST,
CB_SETITEMDATA, (WPARAM)index, (LPARAM)attr);
}
// ___________________________________________________
//
// Initialize the AV list listview control
static BOOL
sInitAVPairDialog (
HWND hwnd,
PAVLISTSTRUCT pavls)
{
BOOL bReturn = TRUE;
PGPAVAttribute attr = 0;
CHAR sz[256];
switch (pavls->serverclass) {
case kPGPKeyServerClass_Invalid :
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CommonName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailFirstName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailMiddleName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailLastName);
break;
case kPGPKeyServerClass_Verisign :
#if PGP_VERISIGN_NAMES
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailFirstName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailMiddleName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailLastName);
#else
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CommonName);
#endif //PGP_VERISIGN_NAMES
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CertType);
break;
default :
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CommonName);
break;
}
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Email);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_OrganizationName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_OrganizationalUnitName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Country);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Locality);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_State);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_StreetAddress);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_PostalCode);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_POBOX);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_TelephoneNumber);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Initials);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_DNSName);
sInsertAttribute (hwnd, pavls, kPGPAVAttribute_IPAddress);
if (pavls->selectedpair == NULL)
{
LoadString (g_hInst, IDS_NEWATTRIBUTETITLE, sz, sizeof(sz));
SetWindowText (hwnd, sz);
if (!SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST, CB_GETCOUNT, 0, 0))
{
PGPclMessageBox (hwnd, IDS_CAPTION, IDS_NOMOREATTRIBUTES,
MB_OK|MB_ICONEXCLAMATION);
bReturn = FALSE;
}
else
{
SendDlgItemMessage (
hwnd, IDC_ATTRIBUTELIST, CB_SETCURSEL, 0, 0);
attr = SendDlgItemMessage (
hwnd, IDC_ATTRIBUTELIST, CB_GETITEMDATA, 0, 0);
}
SetFocus (GetDlgItem (hwnd, IDC_ATTRIBUTELIST));
}
else
{
INT index;
attr = pavls->selectedpair->attribute;
sInsertAttribute (hwnd, NULL, attr);
PGPclGetAVListAttributeString (attr, sz, sizeof(sz));
index = SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST,
CB_FINDSTRINGEXACT, 0, (LPARAM)sz);
SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST, CB_SETCURSEL, index, 0);
sGetValueString (pavls->selectedpair, sz, sizeof(sz));
SetDlgItemText (hwnd, IDC_VALUE, sz);
SendDlgItemMessage (hwnd, IDC_VALUE, EM_SETSEL, 0, -1);
SetFocus (GetDlgItem (hwnd, IDC_VALUE));
}
if (attr == kPGPAVAttribute_MailMiddleName)
SendDlgItemMessage (
hwnd, IDC_VALUE, EM_SETLIMITTEXT, 1, 0);
else
SendDlgItemMessage (
hwnd, IDC_VALUE, EM_SETLIMITTEXT, 0, 0);
return bReturn;
}
// ___________________________________________________
//
// New AV pair dialog procedure
static BOOL CALLBACK
sAVPairDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PAVLISTSTRUCT pavls;
PGPSize size;
INT index;
switch (uMsg) {
case WM_INITDIALOG :
SetWindowLong (hwnd, GWL_USERDATA, lParam);
pavls = (PAVLISTSTRUCT)lParam;
if (!sInitAVPairDialog (hwnd, pavls))
EndDialog (hwnd, 0);
return FALSE;
case WM_HELP:
WinHelp (((LPHELPINFO) lParam)->hItemHandle, g_szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aAVeditIds);
break;
case WM_CONTEXTMENU:
WinHelp ((HWND) wParam, g_szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aAVeditIds);
break;
case WM_COMMAND :
pavls = (PAVLISTSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
switch (LOWORD(wParam)) {
case IDC_ATTRIBUTELIST :
if (HIWORD (wParam) == CBN_SELCHANGE)
{
PGPAVAttribute attr;
SetDlgItemText (hwnd, IDC_VALUE, "");
SetFocus (GetDlgItem (hwnd, IDC_VALUE));
index = SendDlgItemMessage (
hwnd, IDC_ATTRIBUTELIST, CB_GETCURSEL, 0, 0);
attr = SendDlgItemMessage (
hwnd, IDC_ATTRIBUTELIST, CB_GETITEMDATA, index, 0);
if (attr == kPGPAVAttribute_MailMiddleName)
SendDlgItemMessage (
hwnd, IDC_VALUE, EM_SETLIMITTEXT, 1, 0);
else
SendDlgItemMessage (
hwnd, IDC_VALUE, EM_SETLIMITTEXT, 0, 0);
}
break;
case IDCANCEL :
EndDialog (hwnd, 0);
break;
case IDOK :
size = GetWindowTextLength (GetDlgItem (hwnd, IDC_VALUE));
if (size == 0)
{
PGPclMessageBox (hwnd, IDS_CAPTION, IDS_MUSTENTERVALUE,
MB_OK|MB_ICONSTOP);
break;
}
if (pavls->selectedpair)
{
if (pavls->selectedpair->value.pointervalue)
PGPFreeData (pavls->selectedpair->value.pointervalue);
}
else
{
pavls->selectedpair = pavls->pAVListEnd;
index = SendDlgItemMessage (
hwnd, IDC_ATTRIBUTELIST, CB_GETCURSEL, 0, 0);
pavls->selectedpair->attribute = SendDlgItemMessage (
hwnd, IDC_ATTRIBUTELIST, CB_GETITEMDATA, index, 0);
(pavls->pAVListEnd)++;
}
pavls->selectedpair->value.pointervalue = PGPNewData (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -